feat(skills): publish workflow skills to skills.sh#1357
Conversation
📝 WalkthroughWalkthroughAdds skills.sh-compatible OpenSpec skill documents, a generator command, shared normalization logic, line-ending rules, onboarding documentation, and a parity test that compares committed skills with generated templates. ChangesSkills.sh generation and parity
Change implementation workflows
Archive and specification synchronization
Exploration and onboarding guidance
Change update and verification workflows
Estimated code review effort: 3 (Moderate) | ~25 minutes Possibly related issues
Possibly related PRs
Suggested reviewers: 🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
Commit the 12 OpenSpec workflow skills as static skills/<name>/SKILL.md so `npx skills add Fission-AI/OpenSpec` can install them (skills.sh reads static files from the repo; OpenSpec otherwise only generates skills at init time). Files are generated from the existing templates via `pnpm generate:skills`, not hand-copied, and skillssh-parity.test.ts fails CI if a template changes without regenerating. The volatile generatedBy frontmatter line is stripped so the committed copies stay byte-stable across releases. Closes Fission-AI#1258 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2c0ebb7 to
5115467
Compare
The skills.sh distribution files are generated LF-only and compared byte-for-byte by skillssh-parity.test.ts. Windows autocrlf checked them out as CRLF, failing the parity assertion. A scoped .gitattributes pins them to LF on checkout. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
There was a problem hiding this comment.
Actionable comments posted: 8
🧹 Nitpick comments (2)
skills/openspec-explore/SKILL.md (1)
56-56: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winAdd language identifiers to fenced blocks.
markdownlintreports MD040 for these fences. Use identifiers such astext,bash, ormarkdownconsistently for the displayed examples.Also applies to: 150-150, 173-173, 204-204, 221-221, 262-262
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@skills/openspec-explore/SKILL.md` at line 56, Add explicit language identifiers to every fenced code block in SKILL.md, including the blocks around the referenced examples. Use appropriate identifiers such as text, bash, or markdown consistently so all fences satisfy markdownlint MD040.Source: Linters/SAST tools
skills/openspec-onboard/SKILL.md (1)
40-40: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winAdd language identifiers to fenced blocks.
markdownlintreports MD040 for these fences. Add identifiers such astext,bash,powershell, ormarkdownto the examples.Also applies to: 85-85, 118-118, 139-139, 148-148, 169-169, 183-183, 193-193, 203-203, 213-213, 252-252, 263-263, 279-279, 308-308, 318-318, 353-353, 363-363, 391-391, 409-409, 425-425, 439-439, 449-449, 502-502, 518-518
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@skills/openspec-onboard/SKILL.md` at line 40, Add language identifiers to every fenced code block in SKILL.md, including the listed locations, choosing appropriate tags such as text, bash, powershell, or markdown based on each block’s contents. Preserve all example content while ensuring no unlabeled fences remain.Source: Linters/SAST tools
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@skills/openspec-apply-change/SKILL.md`:
- Line 14: Executable command examples omit the selected store flag, allowing
operations to target the wrong repository. Update the command examples in
skills/openspec-apply-change/SKILL.md:14,
skills/openspec-continue-change/SKILL.md:14,
skills/openspec-ff-change/SKILL.md:14, skills/openspec-new-change/SKILL.md:14,
and skills/openspec-propose/SKILL.md:23 to include --store <id> on every listed
command that reads or writes specs or changes, while leaving commands that do
not support the flag unchanged.
In `@skills/openspec-archive-change/SKILL.md`:
- Line 107: Update the final success summary in the archive workflow so it
reflects the actual completion status tracked by the logic in Lines 38–52.
Report incomplete artifacts or tasks when archiving unfinished work, while
preserving the existing “All artifacts complete. All tasks complete.” message
only when both are actually complete.
- Around line 65-69: Update the archive decision flow in the prompt options so
selecting “Cancel” immediately aborts the operation and does not archive the
change. Only proceed to archive after the user selects a sync or archive action,
while preserving the existing sync behavior for sync choices.
- Line 61: Make main-spec resolution store-aware in both instruction sites: in
skills/openspec-archive-change/SKILL.md:61, compare each delta spec with the
selected store’s resolved main-spec path instead of hardcoding openspec/specs;
in skills/openspec-sync-specs/SKILL.md:55, read and write the main spec using
the status/store context and its resolved path rather than the current
repository path.
- Line 99: Replace each remaining unlabeled Markdown code fence with an
appropriate language-identified fence: update
skills/openspec-archive-change/SKILL.md at 99-99;
skills/openspec-bulk-archive-change/SKILL.md at 57-57, 88-88, 98-98, 104-104,
145-145, 162-162, 170-170, 185-185, 202-202, 216-216, and 231-231; and
skills/openspec-sync-specs/SKILL.md at 90-90. Preserve the existing fenced
content and choose the identifier matching each block’s syntax.
In `@skills/openspec-explore/SKILL.md`:
- Around line 84-110: Propagate the selected store through every OpenSpec
workflow command by adding --store <selected store> to list and status in
skills/openspec-explore/SKILL.md lines 84-110, and to new change (177-180),
proposal instructions (246-250), specs instructions (271-275), design
instructions (344-347), task instructions (382-385), and archive (433-436) in
skills/openspec-onboard/SKILL.md; preserve each command’s existing arguments and
workflow.
In `@skills/openspec-update-change/SKILL.md`:
- Around line 20-22: Propagate the selected store ID through every documented
command sequence: update `skills/openspec-update-change/SKILL.md` ranges 20-22,
34-46, and 59-65 to include the store flag in `openspec list`, `openspec
status`, and `openspec instructions`; update
`skills/openspec-verify-change/SKILL.md` ranges 20-22, 30-37, and 39-45
similarly for `openspec list`, `openspec status`, and `openspec instructions
apply`. Preserve the existing command flow while ensuring each command targets
the selected OpenSpec store.
In `@skills/openspec-verify-change/SKILL.md`:
- Around line 116-125: Update the fenced code block in the Verification Report
template to declare the markdown language using a markdown-labeled fence, while
preserving the report example content unchanged.
---
Nitpick comments:
In `@skills/openspec-explore/SKILL.md`:
- Line 56: Add explicit language identifiers to every fenced code block in
SKILL.md, including the blocks around the referenced examples. Use appropriate
identifiers such as text, bash, or markdown consistently so all fences satisfy
markdownlint MD040.
In `@skills/openspec-onboard/SKILL.md`:
- Line 40: Add language identifiers to every fenced code block in SKILL.md,
including the listed locations, choosing appropriate tags such as text, bash,
powershell, or markdown based on each block’s contents. Preserve all example
content while ensuring no unlabeled fences remain.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro
Run ID: a7a2c8ea-0cb7-40c2-9029-77392cccece6
📒 Files selected for processing (18)
.gitattributespackage.jsonscripts/generate-skillssh.mjsscripts/skillssh-shared.mjsskills/README.mdskills/openspec-apply-change/SKILL.mdskills/openspec-archive-change/SKILL.mdskills/openspec-bulk-archive-change/SKILL.mdskills/openspec-continue-change/SKILL.mdskills/openspec-explore/SKILL.mdskills/openspec-ff-change/SKILL.mdskills/openspec-new-change/SKILL.mdskills/openspec-onboard/SKILL.mdskills/openspec-propose/SKILL.mdskills/openspec-sync-specs/SKILL.mdskills/openspec-update-change/SKILL.mdskills/openspec-verify-change/SKILL.mdtest/core/templates/skillssh-parity.test.ts
|
|
||
| Implement tasks from an OpenSpec change. | ||
|
|
||
| **Store selection:** If the user names a store (a store is a standalone OpenSpec repo registered on this machine) or the work lives in one, run `openspec store list --json` to discover registered store ids, then pass `--store <id>` on the commands that read or write specs and changes (`new change`, `status`, `instructions`, `list`, `show`, `validate`, `archive`, `doctor`, `context`). Other commands do not take the flag. Hints printed by commands already carry the flag; keep it on follow-ups. Without a store, commands act on the nearest local `openspec/` root. |
There was a problem hiding this comment.
🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
set -euo pipefail
# Map the relevant docs first
for f in \
skills/openspec-apply-change/SKILL.md \
skills/openspec-continue-change/SKILL.md \
skills/openspec-ff-change/SKILL.md \
skills/openspec-new-change/SKILL.md \
skills/openspec-propose/SKILL.md
do
echo "===== $f ====="
wc -l "$f"
sed -n '1,120p' "$f"
echo
done
# Search for store-selection guidance and actual command examples
rg -n --no-heading --context 2 --fixed-strings \
'openspec store list --json' \
skills/openspec-apply-change/SKILL.md \
skills/openspec-continue-change/SKILL.md \
skills/openspec-ff-change/SKILL.md \
skills/openspec-new-change/SKILL.md \
skills/openspec-propose/SKILL.md
rg -n --no-heading --context 2 --fixed-strings \
'--store <id>' \
skills/openspec-apply-change/SKILL.md \
skills/openspec-continue-change/SKILL.md \
skills/openspec-ff-change/SKILL.md \
skills/openspec-new-change/SKILL.md \
skills/openspec-propose/SKILL.md
# Look for the referenced command names in these docs
rg -n --no-heading --context 2 \
'(^|[^-])(new change|status|instructions|list|show|validate|archive|doctor|context)\b' \
skills/openspec-apply-change/SKILL.md \
skills/openspec-continue-change/SKILL.md \
skills/openspec-ff-change/SKILL.md \
skills/openspec-new-change/SKILL.md \
skills/openspec-propose/SKILL.mdRepository: Fission-AI/OpenSpec
Length of output: 30015
🏁 Script executed:
#!/bin/bash
set -euo pipefail
for f in \
skills/openspec-apply-change/SKILL.md \
skills/openspec-continue-change/SKILL.md \
skills/openspec-ff-change/SKILL.md \
skills/openspec-new-change/SKILL.md \
skills/openspec-propose/SKILL.md
do
echo "===== $f ====="
rg -n --no-heading --context 1 --fixed-strings -- '--store' "$f" || true
echo
echo "----- openspec commands -----"
rg -n --no-heading --context 1 'openspec ' "$f" || true
echo
doneRepository: Fission-AI/OpenSpec
Length of output: 9342
Add --store to the command examples
The store-selection note is correct, but the executable snippets still omit --store <id>, so these commands can run against the wrong repo/store instead of the selected one.
skills/openspec-apply-change/SKILL.md#L14-L14skills/openspec-continue-change/SKILL.md#L14-L14skills/openspec-ff-change/SKILL.md#L14-L14skills/openspec-new-change/SKILL.md#L14-L14skills/openspec-propose/SKILL.md#L23-L23
🧰 Tools
🪛 LanguageTool
[style] ~14-~14: It’s more common nowadays to write this noun as one word.
Context: ...ec change. Store selection: If the user names a store (a store is a standalone OpenSp...
(RECOMMENDED_COMPOUNDS)
📍 Affects 5 files
skills/openspec-apply-change/SKILL.md#L14-L14(this comment)skills/openspec-continue-change/SKILL.md#L14-L14skills/openspec-ff-change/SKILL.md#L14-L14skills/openspec-new-change/SKILL.md#L14-L14skills/openspec-propose/SKILL.md#L23-L23
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@skills/openspec-apply-change/SKILL.md` at line 14, Executable command
examples omit the selected store flag, allowing operations to target the wrong
repository. Update the command examples in
skills/openspec-apply-change/SKILL.md:14,
skills/openspec-continue-change/SKILL.md:14,
skills/openspec-ff-change/SKILL.md:14, skills/openspec-new-change/SKILL.md:14,
and skills/openspec-propose/SKILL.md:23 to include --store <id> on every listed
command that reads or writes specs or changes, while leaving commands that do
not support the flag unchanged.
| Use `artifactPaths.specs.existingOutputPaths` from status JSON to check for delta specs. If none exist, proceed without sync prompt. | ||
|
|
||
| **If delta specs exist:** | ||
| - Compare each delta spec with its corresponding main spec at `openspec/specs/<capability>/spec.md` |
There was a problem hiding this comment.
🗄️ Data Integrity & Integration | 🟠 Major | 🏗️ Heavy lift
Make main-spec resolution store-aware.
Both instructions hardcode the local openspec/specs path despite supporting named stores.
skills/openspec-archive-change/SKILL.md#L61-L61: compare against the selected store’s resolved main-spec path.skills/openspec-sync-specs/SKILL.md#L55-L55: read and write the main spec using status/store context rather than the current repository path.
📍 Affects 2 files
skills/openspec-archive-change/SKILL.md#L61-L61(this comment)skills/openspec-sync-specs/SKILL.md#L55-L55
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@skills/openspec-archive-change/SKILL.md` at line 61, Make main-spec
resolution store-aware in both instruction sites: in
skills/openspec-archive-change/SKILL.md:61, compare each delta spec with the
selected store’s resolved main-spec path instead of hardcoding openspec/specs;
in skills/openspec-sync-specs/SKILL.md:55, read and write the main spec using
the status/store context and its resolved path rather than the current
repository path.
| **Prompt options:** | ||
| - If changes needed: "Sync now (recommended)", "Archive without syncing" | ||
| - If already synced: "Archive now", "Sync anyway", "Cancel" | ||
|
|
||
| If user chooses sync, use Task tool (subagent_type: "general-purpose", prompt: "Use Skill tool to invoke openspec-sync-specs for change '<name>'. Delta spec analysis: <include the analyzed delta spec summary>"). Proceed to archive regardless of choice. |
There was a problem hiding this comment.
🎯 Functional Correctness | 🟠 Major | ⚡ Quick win
Do not archive after Cancel.
The prompt offers Cancel, but “Proceed to archive regardless of choice” would still move the change after the user cancels. Explicitly abort on Cancel and only continue after a sync/archive choice.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@skills/openspec-archive-change/SKILL.md` around lines 65 - 69, Update the
archive decision flow in the prompt options so selecting “Cancel” immediately
aborts the operation and does not archive the change. Only proceed to archive
after the user selects a sync or archive action, while preserving the existing
sync behavior for sync choices.
|
|
||
| **Output On Success** | ||
|
|
||
| ``` |
There was a problem hiding this comment.
📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
set -euo pipefail
printf '\n== File list ==\n'
git ls-files 'skills/*/SKILL.md'
printf '\n== Context around cited lines ==\n'
for spec in \
'skills/openspec-archive-change/SKILL.md:90,110' \
'skills/openspec-bulk-archive-change/SKILL.md:45,70' \
'skills/openspec-bulk-archive-change/SKILL.md:80,110' \
'skills/openspec-bulk-archive-change/SKILL.md:135,170' \
'skills/openspec-bulk-archive-change/SKILL.md:178,235' \
'skills/openspec-sync-specs/SKILL.md:80,100'
do
file=${spec%%:*}
range=${spec#*:}
echo
echo "---- $file ($range) ----"
sed -n "${range}p" "$file" | cat -n
done
printf '\n== Search for likely source/templates ==\n'
rg -n --hidden --glob '!**/.git/**' --glob '!**/node_modules/**' --glob '!**/dist/**' --glob '!**/build/**' \
'openspec-(archive-change|bulk-archive-change|sync-specs)|MD040|```markdown|```$|```[[:space:]]*$' \
skills . || trueRepository: Fission-AI/OpenSpec
Length of output: 50378
🏁 Script executed:
#!/bin/bash
set -euo pipefail
pwd
git ls-files 'skills/*/SKILL.md' | sed -n '1,20p'Repository: Fission-AI/OpenSpec
Length of output: 624
Add language identifiers to the remaining plain fences
skills/openspec-archive-change/SKILL.md#L99skills/openspec-bulk-archive-change/SKILL.md#L57,88,98,104,145,162,170,185,202,216,231
🧰 Tools
🪛 markdownlint-cli2 (0.23.0)
[warning] 99-99: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
📍 Affects 3 files
skills/openspec-archive-change/SKILL.md#L99-L99(this comment)skills/openspec-bulk-archive-change/SKILL.md#L57-L57skills/openspec-bulk-archive-change/SKILL.md#L88-L88skills/openspec-bulk-archive-change/SKILL.md#L98-L98skills/openspec-bulk-archive-change/SKILL.md#L104-L104skills/openspec-bulk-archive-change/SKILL.md#L145-L145skills/openspec-bulk-archive-change/SKILL.md#L162-L162skills/openspec-bulk-archive-change/SKILL.md#L170-L170skills/openspec-bulk-archive-change/SKILL.md#L185-L185skills/openspec-bulk-archive-change/SKILL.md#L202-L202skills/openspec-bulk-archive-change/SKILL.md#L216-L216skills/openspec-bulk-archive-change/SKILL.md#L231-L231skills/openspec-sync-specs/SKILL.md#L90-L90
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@skills/openspec-archive-change/SKILL.md` at line 99, Replace each remaining
unlabeled Markdown code fence with an appropriate language-identified fence:
update skills/openspec-archive-change/SKILL.md at 99-99;
skills/openspec-bulk-archive-change/SKILL.md at 57-57, 88-88, 98-98, 104-104,
145-145, 162-162, 170-170, 185-185, 202-202, 216-216, and 231-231; and
skills/openspec-sync-specs/SKILL.md at 90-90. Preserve the existing fenced
content and choose the identifier matching each block’s syntax.
Source: Linters/SAST tools
| **Archived to:** the archive path derived from `planningHome.changesDir`/YYYY-MM-DD-<name>/ | ||
| **Specs:** ✓ Synced to main specs (or "No delta specs" or "Sync skipped") | ||
|
|
||
| All artifacts complete. All tasks complete. |
There was a problem hiding this comment.
🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win
Report incomplete warnings accurately.
This success output always says “All artifacts complete. All tasks complete.” even when Lines 38–52 allow archiving incomplete work. Make the summary conditional on the actual status.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@skills/openspec-archive-change/SKILL.md` at line 107, Update the final
success summary in the archive workflow so it reflects the actual completion
status tracked by the logic in Lines 38–52. Report incomplete artifacts or tasks
when archiving unfinished work, while preserving the existing “All artifacts
complete. All tasks complete.” message only when both are actually complete.
| ### Check for context | ||
|
|
||
| At the start, quickly check what exists: | ||
| ```bash | ||
| openspec list --json | ||
| ``` | ||
|
|
||
| This tells you: | ||
| - If there are active changes | ||
| - Their names, schemas, and status | ||
| - What the user might be working on | ||
|
|
||
| ### When no change exists | ||
|
|
||
| Think freely. When insights crystallize, you might offer: | ||
|
|
||
| - "This feels solid enough to start a change. Want me to create a proposal?" | ||
| - Or keep exploring - no pressure to formalize | ||
|
|
||
| ### When a change exists | ||
|
|
||
| If the user mentions a change or you detect one is relevant: | ||
|
|
||
| 1. **Resolve and read existing artifacts for context** | ||
| - Run `openspec status --change "<name>" --json`. | ||
| - Use `changeRoot`, `artifactPaths`, and `actionContext` from the status JSON. | ||
| - Read existing files from `artifactPaths.<artifact>.existingOutputPaths`. |
There was a problem hiding this comment.
🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win
Propagate store selection through every workflow example.
The store-selection contract requires --store <id>, but the examples omit it for discovery, status, change creation, instructions, and archive operations. This can cause a multi-store workflow to read or modify the wrong OpenSpec root.
skills/openspec-explore/SKILL.md#L84-L110: add the selected store tolistandstatus.skills/openspec-onboard/SKILL.md#L177-L180: add it tonew change.skills/openspec-onboard/SKILL.md#L246-L250: add it to proposal instructions.skills/openspec-onboard/SKILL.md#L271-L275: add it to specs instructions.skills/openspec-onboard/SKILL.md#L344-L347: add it to design instructions.skills/openspec-onboard/SKILL.md#L382-L385: add it to task instructions.skills/openspec-onboard/SKILL.md#L433-L436: add it to archive.
📍 Affects 2 files
skills/openspec-explore/SKILL.md#L84-L110(this comment)skills/openspec-onboard/SKILL.md#L177-L180skills/openspec-onboard/SKILL.md#L246-L250skills/openspec-onboard/SKILL.md#L271-L275skills/openspec-onboard/SKILL.md#L344-L347skills/openspec-onboard/SKILL.md#L382-L385skills/openspec-onboard/SKILL.md#L433-L436
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@skills/openspec-explore/SKILL.md` around lines 84 - 110, Propagate the
selected store through every OpenSpec workflow command by adding --store
<selected store> to list and status in skills/openspec-explore/SKILL.md lines
84-110, and to new change (177-180), proposal instructions (246-250), specs
instructions (271-275), design instructions (344-347), task instructions
(382-385), and archive (433-436) in skills/openspec-onboard/SKILL.md; preserve
each command’s existing arguments and workflow.
| 1. **If no change name provided, prompt for selection** | ||
|
|
||
| Run `openspec list --json` to get available changes sorted by most recently modified. Then use the **AskUserQuestion tool** to let the user select which change to update. |
There was a problem hiding this comment.
🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win
Propagate the selected store ID through every command sequence.
The shared store-selection contract requires --store <id>, but the examples omit it. This can cause the workflow to list, inspect, or edit artifacts from the wrong OpenSpec root.
skills/openspec-update-change/SKILL.md#L20-L22: add the store flag toopenspec list --json.skills/openspec-update-change/SKILL.md#L34-L46: add it toopenspec status.skills/openspec-update-change/SKILL.md#L59-L65: add it toopenspec instructions.skills/openspec-verify-change/SKILL.md#L20-L22: add the store flag toopenspec list --json.skills/openspec-verify-change/SKILL.md#L30-L37: add it toopenspec status.skills/openspec-verify-change/SKILL.md#L39-L45: add it toopenspec instructions apply.
📍 Affects 2 files
skills/openspec-update-change/SKILL.md#L20-L22(this comment)skills/openspec-update-change/SKILL.md#L34-L46skills/openspec-update-change/SKILL.md#L59-L65skills/openspec-verify-change/SKILL.md#L20-L22skills/openspec-verify-change/SKILL.md#L30-L37skills/openspec-verify-change/SKILL.md#L39-L45
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@skills/openspec-update-change/SKILL.md` around lines 20 - 22, Propagate the
selected store ID through every documented command sequence: update
`skills/openspec-update-change/SKILL.md` ranges 20-22, 34-46, and 59-65 to
include the store flag in `openspec list`, `openspec status`, and `openspec
instructions`; update `skills/openspec-verify-change/SKILL.md` ranges 20-22,
30-37, and 39-45 similarly for `openspec list`, `openspec status`, and `openspec
instructions apply`. Preserve the existing command flow while ensuring each
command targets the selected OpenSpec store.
| ``` | ||
| ## Verification Report: <change-name> | ||
|
|
||
| ### Summary | ||
| | Dimension | Status | | ||
| |--------------|------------------| | ||
| | Completeness | X/Y tasks, N reqs| | ||
| | Correctness | M/N reqs covered | | ||
| | Coherence | Followed/Issues | | ||
| ``` |
There was a problem hiding this comment.
📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win
Specify the fenced block language.
The report template uses an unlabeled code fence, triggering Markdown lint. Use ```markdown for this sample.
🧰 Tools
🪛 markdownlint-cli2 (0.23.0)
[warning] 116-116: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@skills/openspec-verify-change/SKILL.md` around lines 116 - 125, Update the
fenced code block in the Verification Report template to declare the markdown
language using a markdown-labeled fence, while preserving the report example
content unchanged.
Source: Linters/SAST tools
What was missing: Multiple requests (#1258) to install OpenSpec skills via skills.sh, which reads static
SKILL.mdfiles from a repo — but OpenSpec generates its skills atopenspec inittime, so none existed in the tree.What it does: Commits the 12 workflow skills under
skills/sonpx skills add Fission-AI/OpenSpecworks. The files are generated from the existing skill templates (pnpm generate:skills), not hand-copied, and a parity test keeps them in sync. The volatilegeneratedByfrontmatter line is stripped so the committed copies stay byte-stable across releases (no per-release regen churn).Proof it works:
skillssh-parity.test.ts+ existing golden-hash tests (skill-templates-parity,skill-generation) pass — 34 tests.… is stale — run pnpm generate:skills.zsh-installer(oh-my-zsh) failures; 1859 others pass.Notes / scope:
openspecCLI and assume anopenspec/project, soopenspec initremains the fuller setup —skills/README.mdstates this.skills/is not in the npmfileslist, so it doesn't bloat the published package (skills.sh reads from GitHub, not npm).Closes #1258
🤖 Generated with Claude Code
Summary by CodeRabbit
New Features
Documentation
Chores