chore(AI): Init OpenSpec skills, wire into AGENTS.md - #1000
Conversation
Adds openspec/config.yaml plus the propose/explore/apply/update/ sync/archive skills and opsx slash commands, then registers the new skills in the AGENTS.md skill routing table so agents load them automatically. Assisted-by: Sisyphus:claude-sonnet-5 claude
📝 WalkthroughWalkthroughAdds OpenSpec command and skill specifications for the complete change lifecycle, including exploration, planning, implementation, verification, synchronization, onboarding, and single or bulk archival, plus configuration and routing updates. ChangesOpenSpec workflow lifecycle
Estimated code review effort: 3 (Moderate) | ~25 minutes Suggested reviewers: 🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✨ Finishing Touches📝 Generate docstrings
🧪 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 |
There was a problem hiding this comment.
Actionable comments posted: 11
🤖 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 @.agents/commands/opsx/apply.md:
- Around line 92-123: Fix all MD040 fenced-block warnings by adding the text
language tag to every affected output fence: add it to the three fences in
.agents/commands/opsx/apply.md lines 92-123 and
.agents/skills/openspec-apply-change/SKILL.md lines 96-127, the fence in
.agents/commands/opsx/sync.md lines 121-123 and
.agents/skills/openspec-sync-specs/SKILL.md lines 125-127, and all four fences
in .agents/commands/opsx/archive.md lines 94-152.
- Around line 67-74: Resolve task artifacts through the active schema/artifact
graph instead of hard-coding tasks.md: in .agents/commands/opsx/apply.md lines
67-74, update the artifact path returned by the apply instructions; in
.agents/skills/openspec-apply-change/SKILL.md lines 71-78, use the
schema-resolved task artifact for completion checks and edits; and in
.agents/commands/opsx/archive.md lines 40-49, count incomplete tasks from the
schema-resolved artifact path. Anchor changes to the apply workflow,
openspec-apply-change instructions, and archive task-counting logic.
In @.agents/commands/opsx/archive.md:
- Around line 62-66: Update the “Sync now” flow in the archive command so it
archives only after the delegated openspec-sync-specs task reports success.
Capture and validate the Task result, stop before archiving when delegation
fails or sync is incomplete, and report the failure to the user; preserve the
existing archive behavior for already-synced changes and explicit “Archive
without syncing” choices.
In @.agents/commands/opsx/explore.md:
- Line 60: Label the unlabeled Markdown fences in
.agents/commands/opsx/explore.md lines 60-60 (ASCII diagram),
.agents/skills/openspec-explore/SKILL.md lines 57-57 (all reported example
fences), and .agents/skills/openspec-archive-change/SKILL.md lines 100-100
(output example) with the appropriate language or fence identifier.
- Line 15: Propagate the selected store ID through every affected OpenSpec
command: update .agents/commands/opsx/explore.md:15-15,
.agents/commands/opsx/propose.md:20-20, .agents/commands/opsx/update.md:11-11,
and .agents/skills/openspec-explore/SKILL.md:19-19 so list, status,
instructions, and new change calls use --store <id> consistently. In
.agents/skills/openspec-archive-change/SKILL.md:15-15, also make delta-vs-main
spec comparisons resolve paths relative to the selected store instead of the
current-directory openspec/specs path.
In @.agents/commands/opsx/propose.md:
- Around line 66-70: Update the artifact creation workflow in propose.md to
resolve glob-based resolvedOutputPath values before writing. When the target is
a pattern or has no concrete existing output path, select or create the concrete
capability/spec path and defer appropriately to the /opsx:continue flow; only
create the artifact after a concrete target is available.
In @.agents/commands/opsx/sync.md:
- Around line 46-53: Update the sync and archive workflows in
.agents/commands/opsx/sync.md (lines 46-53),
.agents/skills/openspec-sync-specs/SKILL.md (lines 50-57), and
.agents/commands/opsx/archive.md (lines 53-60) to derive both delta and main
spec paths from the resolved actionContext/status output, including the new-file
case; remove the hard-coded openspec/specs/<capability>/spec.md assumption while
preserving the existing read/write behavior.
In @.agents/commands/opsx/update.md:
- Around line 64-67: Update the next-step guidance in the opsx instructions to
reference only routed commands: replace the unavailable /opsx:continue
suggestion for missing artifacts with the supported command that performs the
equivalent follow-up, and verify any other references such as /opsx:new use
shipped routing entries. Keep the existing /opsx:apply and /opsx:archive
guidance unchanged.
In @.agents/skills/openspec-apply-change/SKILL.md:
- Around line 51-54: Use one registered continuation workflow for blocked
OpenSpec changes. In .agents/skills/openspec-apply-change/SKILL.md lines 51-54,
replace the unregistered openspec-continue-change reference; in
.agents/commands/opsx/apply.md lines 47-50, add /opsx:continue or point to an
existing registered command; and in
.agents/skills/openspec-update-change/SKILL.md lines 68-71, remove or replace
the unregistered /opsx:continue guidance.
In @.agents/skills/openspec-archive-change/SKILL.md:
- Around line 98-108: Update the “Output On Success” template in the archive
workflow documentation so the final artifact and task status lines reflect
whether either is incomplete. Preserve the existing complete-state wording, and
add a clear warning/status variant when incomplete artifacts or tasks were
allowed to proceed.
- Line 70: Update the sync-and-archive flow in the openspec archive skill so
archiving occurs only after the synchronization subtask reports success. Capture
and evaluate the Task result for the sync choice; on failure, stop the workflow
and report the failure without proceeding to archive, while preserving the
existing archive behavior after successful synchronization.
🪄 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 Plus
Run ID: 518642b4-0b69-4579-80e1-df59258669b8
📒 Files selected for processing (15)
.agents/commands/opsx/apply.md.agents/commands/opsx/archive.md.agents/commands/opsx/explore.md.agents/commands/opsx/propose.md.agents/commands/opsx/sync.md.agents/commands/opsx/update.md.agents/skills/openspec-apply-change/SKILL.md.agents/skills/openspec-archive-change/SKILL.md.agents/skills/openspec-explore/SKILL.md.agents/skills/openspec-propose/SKILL.md.agents/skills/openspec-sync-specs/SKILL.md.agents/skills/openspec-update-change/SKILL.md.github/AI_POLICY.mdAGENTS.mdopenspec/config.yaml
| 6. **Implement tasks (loop until done or blocked)** | ||
|
|
||
| For each pending task: | ||
| - Show which task is being worked on | ||
| - Make the code changes required | ||
| - Keep changes minimal and focused | ||
| - Mark task complete in the tasks file: `- [ ]` → `- [x]` | ||
| - Continue to next task |
There was a problem hiding this comment.
🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
set -euo pipefail
echo "== tracked files =="
git ls-files .agents/commands/opsx .agents/skills/openspec-apply-change | sed -n '1,200p'
echo
echo "== relevant file excerpts =="
for f in .agents/commands/opsx/apply.md .agents/skills/openspec-apply-change/SKILL.md .agents/commands/opsx/archive.md; do
if [ -f "$f" ]; then
echo "--- $f ($(wc -l < "$f") lines) ---"
sed -n '1,140p' "$f" | cat -n
else
echo "MISSING: $f"
fi
done
echo
echo "== schema/task references =="
rg -n "active schema|schema-resolved|schema artifact|artifact graph|artifact|tasks\.md|tasks file|task artifacts|incomplete tasks|apply instructions|open.*spec|openspec" .agents -S || trueRepository: antonbabenko/pre-commit-terraform
Length of output: 50391
Resolve task artifacts through the active schema.
These files resolve context via openspec status/instructions --json, but then hard-code tasks.md for task completion checks/edits. Use the task artifact returned by the active schema/artifact graph:
.agents/commands/opsx/apply.md#L67-L74: update the artifact path returned by apply instructions..agents/skills/openspec-apply-change/SKILL.md#L71-L78: use the schema-resolved task artifact instead of assuming a tasks file..agents/commands/opsx/archive.md#L40-L49: count incomplete tasks from the schema artifact graph/path, nottasks.md.
📍 Affects 3 files
.agents/commands/opsx/apply.md#L67-L74(this comment).agents/skills/openspec-apply-change/SKILL.md#L71-L78.agents/commands/opsx/archive.md#L40-L49
🤖 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 @.agents/commands/opsx/apply.md around lines 67 - 74, Resolve task artifacts
through the active schema/artifact graph instead of hard-coding tasks.md: in
.agents/commands/opsx/apply.md lines 67-74, update the artifact path returned by
the apply instructions; in .agents/skills/openspec-apply-change/SKILL.md lines
71-78, use the schema-resolved task artifact for completion checks and edits;
and in .agents/commands/opsx/archive.md lines 40-49, count incomplete tasks from
the schema-resolved artifact path. Anchor changes to the apply workflow,
openspec-apply-change instructions, and archive task-counting logic.
| ``` | ||
| ## Implementing: <change-name> (schema: <schema-name>) | ||
|
|
||
| Working on task 3/7: <task description> | ||
| [...implementation happening...] | ||
| ✓ Task complete | ||
|
|
||
| Working on task 4/7: <task description> | ||
| [...implementation happening...] | ||
| ✓ Task complete | ||
| ``` | ||
|
|
||
| **Output On Completion** | ||
|
|
||
| ``` | ||
| ## Implementation Complete | ||
|
|
||
| **Change:** <change-name> | ||
| **Schema:** <schema-name> | ||
| **Progress:** 7/7 tasks complete ✓ | ||
|
|
||
| ### Completed This Session | ||
| - [x] Task 1 | ||
| - [x] Task 2 | ||
| ... | ||
|
|
||
| All tasks complete! You can archive this change with `/opsx:archive`. | ||
| ``` | ||
|
|
||
| **Output On Pause (Issue Encountered)** | ||
|
|
||
| ``` |
There was a problem hiding this comment.
📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win
Fix all MD040 fenced-block warnings.
.agents/commands/opsx/apply.md#L92-L123: addtextto the three output fences..agents/skills/openspec-apply-change/SKILL.md#L96-L127: addtextto the three output fences..agents/commands/opsx/sync.md#L121-L123: addtext..agents/skills/openspec-sync-specs/SKILL.md#L125-L127: addtext..agents/commands/opsx/archive.md#L94-L152: addtextto all four output fences.
🧰 Tools
🪛 markdownlint-cli2 (0.23.0)
[warning] 92-92: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
[warning] 106-106: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
[warning] 123-123: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
📍 Affects 5 files
.agents/commands/opsx/apply.md#L92-L123(this comment).agents/skills/openspec-apply-change/SKILL.md#L96-L127.agents/commands/opsx/sync.md#L121-L123.agents/skills/openspec-sync-specs/SKILL.md#L125-L127.agents/commands/opsx/archive.md#L94-L152
🤖 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 @.agents/commands/opsx/apply.md around lines 92 - 123, Fix all MD040
fenced-block warnings by adding the text language tag to every affected output
fence: add it to the three fences in .agents/commands/opsx/apply.md lines 92-123
and .agents/skills/openspec-apply-change/SKILL.md lines 96-127, the fence in
.agents/commands/opsx/sync.md lines 121-123 and
.agents/skills/openspec-sync-specs/SKILL.md lines 125-127, and all four fences
in .agents/commands/opsx/archive.md lines 94-152.
Source: Linters/SAST tools
| **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.
🗄️ Data Integrity & Integration | 🟠 Major | 🏗️ Heavy lift
Do not archive after an unverified sync.
When the user chooses “Sync now,” the command delegates the sync and then unconditionally proceeds to archive. If delegation fails or partially completes, the delta specs are moved into the archive unsynchronized. Gate archiving on a successful sync result and report failures instead.
🤖 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 @.agents/commands/opsx/archive.md around lines 62 - 66, Update the “Sync now”
flow in the archive command so it archives only after the delegated
openspec-sync-specs task reports success. Capture and validate the Task result,
stop before archiving when delegation fails or sync is incomplete, and report
the failure to the user; preserve the existing archive behavior for
already-synced changes and explicit “Archive without syncing” choices.
|
|
||
| **This is a stance, not a workflow.** There are no fixed steps, no required sequence, no mandatory outputs. You're a thinking partner helping the user explore. | ||
|
|
||
| **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 | 🏗️ Heavy lift
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
set -euo pipefail
echo "Files:"
fd -a '^(explore|propose|update|SKILL)\.(md|ts|js|py|mmd|json)$' .agents 2>/dev/null || find .agents -type f | rg '/explore\.md|/propose\.md|/update\.md|SKILL\.md$' || true
echo
echo "Relevant snippets:"
for f in \
".agents/commands/opsx/explore.md" \
".agents/commands/opsx/propose.md" \
".agents/commands/opsx/update.md" \
".agents/skills/openspec-explore/SKILL.md" \
".agents/skills/openspec-archive-change/SKILL.md"
do
if [ -f "$f" ]; then
echo "===== $f ====="
cat -n "$f"
else
echo "MISSING: $f"
fi
done
echo
echo "Search for operational command templates in files:"
rg -n "list |status |new change|instructions|show |validate|archive|doctor|context|openspec (store |)" .agents -g '*.md' -g 'SKILL.md'Repository: antonbabenko/pre-commit-terraform
Length of output: 50391
🏁 Script executed:
#!/bin/bash
set -euo pipefail
echo "Store-selection lines in affected files:"
python3 - <<'PY'
from pathlib import Path
files = [
Path(".agents/commands/opsx/explore.md"),
Path(".agents/commands/opsx/propose.md"),
Path(".agents/commands/opsx/update.md"),
Path(".agents/skills/openspec-explore/SKILL.md"),
Path(".agents/skills/openspec-archive-change/SKILL.md"),
]
for p in files:
text = p.read_text() if p.exists() else ""
for i, line in enumerate(text.splitlines(), 1):
if "store selection" in line.lower() or "openspec " in line and ("--store" in line or "$STORE" in line or "store" in line):
print(f"{p}:{i}: {line}")
PY
echo
echo "Command invocations without --store in target files:"
python3 - <<'PY'
import re, sys
from pathlib import Path
target = [
".agents/commands/opsx/explore.md",
".agents/commands/opsx/propose.md",
".agents/commands/opsx/update.md",
".agents/skills/openspec-explore/SKILL.md",
".agents/skills/openspec-archive-change/SKILL.md",
]
for path in target:
p = Path(path)
if not p.exists():
continue
text = p.read_text()
has_store_header = re.search(r'(?i)\*\*Store selection\*\*.*?\b--store\s+<id>\b', text) is not None
print(f"PATH={path} store_header={has_store_header}")
for i, line in enumerate(text.splitlines(), 1):
if re.search(r'`?openspec\s+', line) or re.search(r'`?/\??openspec\s+', line):
print(f" {i}: {line.strip()} | has_flag={bool(re.search(r'--store\s+', line))}")
PY
echo
echo "Archive skill path references:"
python3 - <<'PY'
from pathlib import Path
for path in [".agents/skills/openspec-archive-change/SKILL.md", ".agents/commands/opsx/archive.md"]:
p=Path(path)
if not p.exists(): continue
for i,line in enumerate(p.read_text().splitlines(), 1):
if path==".agents/skills/openspec-archive-change/SKILL.md" and "main spec" in line.lower():
print(f"{path}:{i}: {line.strip()}")
if path==".agents/commands/opsx/archive.md" and "main spec" in line.lower():
print(f"{path}:{i}: {line.strip()}")
PYRepository: antonbabenko/pre-commit-terraform
Length of output: 3566
🏁 Script executed:
#!/bin/bash
set -euo pipefail
echo "Command invocations without --store in target files:"
python3 - <<'PY'
import re, sys
from pathlib import Path
target = [
".agents/commands/opsx/explore.md",
".agents/commands/opsx/propose.md",
".agents/commands/opsx/update.md",
".agents/skills/openspec-explore/SKILL.md",
".agents/skills/openspec-archive-change/SKILL.md",
]
for path in target:
p = Path(path)
if not p.exists():
continue
text = p.read_text()
has_store_header = re.search(r'(?i)\*\*Store selection\*\*.*?\b--store\s+<id>\b', text) is not None
print(f"PATH={path} store_header={has_store_header}")
for i, line in enumerate(text.splitlines(), 1):
if re.search(r'`?openspec\s+', line) or re.search(r'`?/\??openspec\s+', line):
has_flag = bool(re.search(r'--store\s+', line))
print(f" {i}: {line.strip()!r} has_flag={has_flag}")
PY
echo
echo "Main-spec path references:"
python3 - <<'PY'
from pathlib import Path
for path in [".agents/skills/openspec-archive-change/SKILL.md", ".agents/commands/opsx/archive.md"]:
p = Path(path)
if not p.exists():
continue
for i, line in enumerate(p.read_text().splitlines(), 1):
if "main spec" in line.lower() or re.search(r'`?openspec/specs/', line):
print(f"{path}:{i}: {line.strip()}")
PYRepository: antonbabenko/pre-commit-terraform
Length of output: 5232
🏁 Script executed:
#!/bin/bash
set -euo pipefail
python3 - <<'PY'
import re
from pathlib import Path
for path in [".agents/skills/openspec-archive-change/SKILL.md", ".agents/commands/opsx/archive.md"]:
p = Path(path)
if not p.exists():
continue
print(f"FILE={path}")
for i, line in enumerate(p.read_text().splitlines(), 1):
if "main spec" in line.lower() or re.search(r'`?openspec/specs/', line):
print(f"{i}: {line.strip()}")
PY
echo
echo "Context for openspec-archive-change delta sync instructions:"
sed -n '55,72p' .agents/skills/openspec-archive-change/SKILL.md
echo
echo "Context for opsx archive delta sync instructions:"
sed -n '50,70p' .agents/commands/opsx/archive.mdRepository: antonbabenko/pre-commit-terraform
Length of output: 2703
Propagate the selected store through every OpenSpec call.
The workflow headers require --store <id> for store target selection, but the operational command templates still call list, status, instructions, and new change without the flag. For archive-change workflows, the delta-vs-main spec comparison should also use paths relative to the selected store rather than the current-directory openspec/specs/... path.
🧰 Tools
🪛 LanguageTool
[style] ~15-~15: It’s more common nowadays to write this noun as one word.
Context: ...r explore. Store selection: If the user names a store (a store is a standalone OpenSp...
(RECOMMENDED_COMPOUNDS)
📍 Affects 5 files
.agents/commands/opsx/explore.md#L15-L15(this comment).agents/commands/opsx/propose.md#L20-L20.agents/commands/opsx/update.md#L11-L11.agents/skills/openspec-explore/SKILL.md#L19-L19.agents/skills/openspec-archive-change/SKILL.md#L15-L15
🤖 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 @.agents/commands/opsx/explore.md at line 15, Propagate the selected store ID
through every affected OpenSpec command: update
.agents/commands/opsx/explore.md:15-15, .agents/commands/opsx/propose.md:20-20,
.agents/commands/opsx/update.md:11-11, and
.agents/skills/openspec-explore/SKILL.md:19-19 so list, status, instructions,
and new change calls use --store <id> consistently. In
.agents/skills/openspec-archive-change/SKILL.md:15-15, also make delta-vs-main
spec comparisons resolve paths relative to the selected store instead of the
current-directory openspec/specs path.
| - Recommend a path (if asked) | ||
|
|
||
| **Visualize** | ||
| ``` |
There was a problem hiding this comment.
📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win
Fix the repeated Markdown fence lint failures.
The same unlabeled-fence issue appears in all three files:
.agents/commands/opsx/explore.md#L60-L60: label the ASCII diagram fence..agents/skills/openspec-explore/SKILL.md#L57-L57: label all reported example fences..agents/skills/openspec-archive-change/SKILL.md#L100-L100: label the output example fence.
🧰 Tools
🪛 markdownlint-cli2 (0.23.0)
[warning] 60-60: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
📍 Affects 3 files
.agents/commands/opsx/explore.md#L60-L60(this comment).agents/skills/openspec-explore/SKILL.md#L57-L57.agents/skills/openspec-archive-change/SKILL.md#L100-L100
🤖 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 @.agents/commands/opsx/explore.md at line 60, Label the unlabeled Markdown
fences in .agents/commands/opsx/explore.md lines 60-60 (ASCII diagram),
.agents/skills/openspec-explore/SKILL.md lines 57-57 (all reported example
fences), and .agents/skills/openspec-archive-change/SKILL.md lines 100-100
(output example) with the appropriate language or fence identifier.
Source: Linters/SAST tools
| 4. **For each delta spec, apply changes to main specs** | ||
|
|
||
| For each repo-local capability delta spec path returned by the CLI: | ||
|
|
||
| a. **Read the delta spec** to understand the intended changes | ||
|
|
||
| b. **Read the main spec** at `openspec/specs/<capability>/spec.md` (may not exist yet) | ||
|
|
There was a problem hiding this comment.
🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
set -euo pipefail
echo "== locate affected files =="
for f in \
".agents/commands/opsx/sync.md" \
".agents/skills/openspec-sync-specs/SKILL.md" \
".agents/commands/opsx/archive.md"
do
if [ -f "$f" ]; then
echo "-- $f --"
wc -l "$f"
sed -n '1,140p' "$f"
else
echo "MISSING $f"
fi
done
echo
echo "== search for CLI/store context docs/resolution paths =="
rg -n "artifactPaths\.specs|existingOutputPaths|open|openspec/specs|main spec|resolve|store|store-aware|active|context" .agents . -g '*.{md,mdx,ts,tsx,js,jsx,yml,yaml,json}' | head -n 240Repository: antonbabenko/pre-commit-terraform
Length of output: 50391
🏁 Script executed:
#!/bin/bash
set -euo pipefail
echo "== repo files related to openspec/specs and artifactPaths =="
git ls-files | grep -E '(^|/)(opsx|openspec|artifact|cli|store|command|skill)' | head -n 200
echo
echo "== occurrences =="
rg -n "artifactPaths|artifactPaths\.specs|existingOutputPaths|openspec/specs|capabilities.*delta|delta spec|main spec|sync state" -g '!node_modules' -g '!dist' -g '!build' | head -n 240Repository: antonbabenko/pre-commit-terraform
Length of output: 806
🏁 Script executed:
#!/bin/bash
set -euo pipefail
echo "== all occurrences of hard-coded main paths and store-related markers in agent docs =="
rg -n "openspec/specs/|spec\.md|existingOutputPaths|resolvedOutputPath|planningHome|changeRoot|store" .agents/commands .agents/skills -g '*.md' | head -n 240
echo
echo "== diff stats for affected files =="
git diff --stat -- .agents/commands/opsx/sync.md .agents/skills/openspec-sync-specs/SKILL.md .agents/commands/opsx/archive.md || true
echo
echo "== targeted diff snippets if available =="
git diff -- .agents/commands/opsx/sync.md .agents/skills/openspec-sync-specs/SKILL.md .agents/commands/opsx/archive.md | sed -n '1,260p'Repository: antonbabenko/pre-commit-terraform
Length of output: 14740
🌐 Web query:
openspec CLI artifactPaths specs existingOutputPaths resolvedOutputPath
💡 Result:
In the OpenSpec CLI and associated agent workflows, the terms artifactPaths, existingOutputPaths, and resolvedOutputPath refer to the structural metadata used to track and manage the lifecycle of artifacts [1][2][3]. These properties are primarily found within the JSON output of OpenSpec commands (such as openspec status or openspec instructions when the --json flag is used) [3][4][5]. They provide the necessary context for agents or developers to understand where artifacts are located, how they are defined, and what files currently exist on the filesystem [3][6][7]. ArtifactPathSummary Structure The system uses an ArtifactPathSummary interface to organize these paths [1][2]: outputPath: The path pattern or file name defined for the artifact in the schema (e.g., "proposal.md" or "specs//*.md") [1][2][4]. resolvedOutputPath: The absolute path (or glob pattern) resolved under the change directory, indicating where the artifact should be created or updated [1][2][6]. existingOutputPaths: An array of concrete file paths that currently exist on the disk for that specific artifact [1][2][7]. This field allows the system to determine if an artifact has been generated or if manual changes have been made to existing files [7]. Workflow Usage When an agent or tool interacts with an OpenSpec project: 1. It accesses the artifactPaths object, which maps artifact IDs to their respective ArtifactPathSummary [1][3][5]. 2. It checks existingOutputPaths to identify which files have already been generated, which informs the agent whether to create a new file, update an existing one, or read existing context [6][7][8]. 3. It uses resolvedOutputPath to know exactly where to write or verify the final output [6]. The resolveArtifactOutputs function in the OpenSpec codebase handles the logic for populating existingOutputPaths by scanning the filesystem for files matching the outputPath pattern and ensuring they are returned as absolute, canonicalized paths [7].
Citations:
- 1: https://github.com/Fission-AI/OpenSpec/blob/main/src/core/artifact-graph/instruction-loader.ts
- 2: https://github.com/Fission-AI/OpenSpec/blob/546224e0/src/core/artifact-graph/instruction-loader.ts
- 3: https://lzw.me/docs/openspec/en/agent-contract.html
- 4: https://github.com/Fission-AI/OpenSpec/blob/HEAD/docs/cli.md
- 5: https://rasen.io/docs/reference/agents/
- 6: https://github.com/Fission-AI/OpenSpec/blob/546224e0/src/commands/workflow/instructions.ts
- 7: https://github.com/Fission-AI/OpenSpec/blob/546224e0/src/core/artifact-graph/outputs.ts
- 8: https://tool.lu/en_US/skill/g1exEEz
Make main spec paths come from the resolved action context.
The sync/archive docs resolve delta specs from artifactPaths.specs.existingOutputPaths, but then hard-code main specs as openspec/specs/<capability>/spec.md. Store openspec roots vary by CLI context; read/write the corresponding delta/main paths from the active actionContext/status output, including the new-file case.
📍 Affects 3 files
.agents/commands/opsx/sync.md#L46-L53(this comment).agents/skills/openspec-sync-specs/SKILL.md#L50-L57.agents/commands/opsx/archive.md#L53-L60
🤖 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 @.agents/commands/opsx/sync.md around lines 46 - 53, Update the sync and
archive workflows in .agents/commands/opsx/sync.md (lines 46-53),
.agents/skills/openspec-sync-specs/SKILL.md (lines 50-57), and
.agents/commands/opsx/archive.md (lines 53-60) to derive both delta and main
spec paths from the resolved actionContext/status output, including the new-file
case; remove the hard-coded openspec/specs/<capability>/spec.md assumption while
preserving the existing read/write behavior.
| 6. **Point to the next step (guidance only - NEVER act on it)** | ||
| - Artifacts still missing -> suggest `/opsx:continue` to create them. | ||
| - Change already implemented (tasks checked off / already applied) -> the code may no longer match the revised plan; suggest `/opsx:apply` to carry the delta into code. | ||
| - Everything done and implemented -> suggest `/opsx:archive`. |
There was a problem hiding this comment.
🎯 Functional Correctness | 🟠 Major | ⚡ Quick win
Do not point users to slash commands that are not shipped or routed.
The supplied routing defines propose, explore, apply, update, sync, and archive; it does not define /opsx:continue or /opsx:new. Replace these references with available commands or add and route the missing commands.
Also applies to: 82-82
🤖 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 @.agents/commands/opsx/update.md around lines 64 - 67, Update the next-step
guidance in the opsx instructions to reference only routed commands: replace the
unavailable /opsx:continue suggestion for missing artifacts with the supported
command that performs the equivalent follow-up, and verify any other references
such as /opsx:new use shipped routing entries. Keep the existing /opsx:apply and
/opsx:archive guidance unchanged.
| **Handle states:** | ||
| - If `state: "blocked"` (missing artifacts): show message, suggest using openspec-continue-change | ||
| - If `state: "all_done"`: congratulate, suggest archive | ||
| - Otherwise: proceed to implementation |
There was a problem hiding this comment.
🎯 Functional Correctness | 🟠 Major | ⚡ Quick win
Use one valid continuation workflow.
.agents/skills/openspec-apply-change/SKILL.md#L51-L54: replaceopenspec-continue-changewith a registered route..agents/commands/opsx/apply.md#L47-L50: add/opsx:continueor point to an existing command..agents/skills/openspec-update-change/SKILL.md#L68-L71: remove or replace the unregistered/opsx:continueguidance.
📍 Affects 3 files
.agents/skills/openspec-apply-change/SKILL.md#L51-L54(this comment).agents/commands/opsx/apply.md#L47-L50.agents/skills/openspec-update-change/SKILL.md#L68-L71
🤖 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 @.agents/skills/openspec-apply-change/SKILL.md around lines 51 - 54, Use one
registered continuation workflow for blocked OpenSpec changes. In
.agents/skills/openspec-apply-change/SKILL.md lines 51-54, replace the
unregistered openspec-continue-change reference; in
.agents/commands/opsx/apply.md lines 47-50, add /opsx:continue or point to an
existing registered command; and in
.agents/skills/openspec-update-change/SKILL.md lines 68-71, remove or replace
the unregistered /opsx:continue guidance.
| - 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.
🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win
Do not archive after an unsuccessful sync.
When the user requests synchronization, the skill starts a sync subtask and then unconditionally proceeds to archive. Require a successful sync result before moving the change; otherwise stop and report the failure so delta specs are not archived as if synchronized.
🤖 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 @.agents/skills/openspec-archive-change/SKILL.md at line 70, Update the
sync-and-archive flow in the openspec archive skill so archiving occurs only
after the synchronization subtask reports success. Capture and evaluate the Task
result for the sync choice; on failure, stop the workflow and report the failure
without proceeding to archive, while preserving the existing archive behavior
after successful synchronization.
| **Output On Success** | ||
|
|
||
| ``` | ||
| ## Archive Complete | ||
| **Change:** <change-name> | ||
| **Schema:** <schema-name> | ||
| **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 archives accurately.
Earlier steps allow the user to proceed with incomplete artifacts or tasks, but the success template always says “All artifacts complete. All tasks complete.” Make those lines conditional and include the warning state.
🧰 Tools
🪛 markdownlint-cli2 (0.23.0)
[warning] 100-100: 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 @.agents/skills/openspec-archive-change/SKILL.md around lines 98 - 108,
Update the “Output On Success” template in the archive workflow documentation so
the final artifact and task status lines reflect whether either is incomplete.
Preserve the existing complete-state wording, and add a clear warning/status
variant when incomplete artifacts or tasks were allowed to proceed.
There was a problem hiding this comment.
Actionable comments posted: 12
🤖 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 @.agents/commands/opsx/bulk-archive.md:
- Line 4: Update the allowed-tools declarations in
.agents/commands/opsx/bulk-archive.md at line 4 and
.agents/skills/openspec-bulk-archive-change/SKILL.md at line 4 to permit the
interactive prompt and filesystem move operations required by the bulk-archive
workflow, or revise the workflow to use only commands permitted by the existing
Bash(openspec:*) allowlist.
- Around line 54-57: Add language identifiers to every fenced code example in
both duplicated workflow documents: label shell command fences as bash and
transcript or output fences as text. Update all listed fence ranges in
.agents/commands/opsx/bulk-archive.md and
.agents/skills/openspec-bulk-archive-change/SKILL.md consistently.
- Around line 129-130: Update the archive move steps to check whether the target
path already exists before moving, and produce an explicit per-change failure
instead of allowing mv to nest the source. Apply this collision-safe behavior in
.agents/commands/opsx/bulk-archive.md lines 129-130 and
.agents/skills/openspec-bulk-archive-change/SKILL.md lines 133-134, preserving
successful moves to non-existing archive targets.
- Around line 71-79: Make chronological conflict ordering deterministic in the
resolution guidance: in .agents/commands/opsx/bulk-archive.md at lines 71-79,
require collecting each change’s stable creation timestamp and recording it with
the resolution, using that timestamp to order older changes first and an
explicit deterministic tie-breaker for equal timestamps; apply the same
timestamp source and tie-breaking rule in
.agents/skills/openspec-bulk-archive-change/SKILL.md at lines 75-83.
In @.agents/commands/opsx/continue.md:
- Around line 1-4: Expand the allowed-tools front matter for
.agents/commands/opsx/continue.md, .agents/commands/opsx/onboard.md,
.agents/skills/openspec-continue-change/SKILL.md, and
.agents/skills/openspec-onboard/SKILL.md to include AskUserQuestion,
repository/code inspection tools such as git log and file searches, artifact
read/write operations, and onboarding code modification tools, while retaining
Bash(openspec:*).
- Around line 17-19: Thread the selected store ID through all OpenSpec commands:
update `.agents/commands/opsx/continue.md` lines 17-19 and
`.agents/skills/openspec-continue-change/SKILL.md` lines 21-23 so `openspec list
--json` receives `--store`; update `.agents/commands/opsx/onboard.md` lines
174-180 and `.agents/skills/openspec-onboard/SKILL.md` lines 178-180 so
`openspec new change "<derived-name>"` receives `--store`, and ensure subsequent
lifecycle commands retain the same store ID.
In @.agents/commands/opsx/new.md:
- Around line 36-52: Propagate the selected store ID through all affected CLI
examples so store-backed operations consistently target the requested planning
root. Update .agents/commands/opsx/new.md lines 36-52 for new change, status,
and instructions; .agents/commands/opsx/ff.md lines 26-75 and
.agents/skills/openspec-ff-change/SKILL.md lines 30-79 for creation, status,
instructions, and final status; .agents/skills/openspec-new-change/SKILL.md
lines 40-58 for creation, status, and instructions; and
.agents/commands/opsx/verify.md lines 11-43 plus
.agents/skills/openspec-verify-change/SKILL.md lines 15-46 for list, status, and
instructions, using the selected --store value in every command.
In @.agents/commands/opsx/onboard.md:
- Line 37: Label every unlabeled Markdown fence in
.agents/commands/opsx/onboard.md at lines 37-37 with an appropriate language
identifier, and apply the same correction to all unlabeled fences in
.agents/skills/openspec-onboard/SKILL.md at lines 41-41. Preserve the fenced
content while ensuring each fence has the correct language tag.
- Around line 404-433: The onboarding archive flow must run verification before
archiving. In .agents/commands/opsx/onboard.md lines 404-433 and
.agents/skills/openspec-onboard/SKILL.md lines 408-437, add a required
/opsx:verify <name> step after implementation completion and before openspec
archive, and proceed only when verification reports no critical issues.
- Around line 268-385: Require the onboarding flow to read existing artifacts
before generating dependent ones: in .agents/commands/opsx/onboard.md lines
268-385, read the proposal before drafting specs, read the specs before drafting
design, and read both specs and design before generating tasks; apply the same
guidance in .agents/skills/openspec-onboard/SKILL.md lines 272-385, preserving
the existing artifact path resolution and save steps.
In @.agents/commands/opsx/verify.md:
- Around line 113-126: Update the verification report fenced examples to use the
markdown language identifier, changing the opening fence to markdown in
.agents/commands/opsx/verify.md lines 113-126 and
.agents/skills/openspec-verify-change/SKILL.md lines 117-126. No other content
changes are needed.
- Around line 13-25: The change-selection policy in the `/opsx:verify`
instructions conflicts between the input guidance and Step 1. Update the
instructions and the corresponding `openspec-verify-change` skill to infer a
change only when conversation context identifies exactly one unambiguous change;
otherwise run `openspec list --json` and use `AskUserQuestion` for selection,
without auto-selecting.
🪄 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 Plus
Run ID: f3ca92bc-ceb6-457a-8942-3b9c567ceb51
📒 Files selected for processing (12)
.agents/commands/opsx/bulk-archive.md.agents/commands/opsx/continue.md.agents/commands/opsx/ff.md.agents/commands/opsx/new.md.agents/commands/opsx/onboard.md.agents/commands/opsx/verify.md.agents/skills/openspec-bulk-archive-change/SKILL.md.agents/skills/openspec-continue-change/SKILL.md.agents/skills/openspec-ff-change/SKILL.md.agents/skills/openspec-new-change/SKILL.md.agents/skills/openspec-onboard/SKILL.md.agents/skills/openspec-verify-change/SKILL.md
| --- | ||
| name: "OPSX: Bulk Archive" | ||
| description: Archive multiple completed changes at once | ||
| allowed-tools: Bash(openspec:*) |
There was a problem hiding this comment.
🎯 Functional Correctness | 🟠 Major | ⚡ Quick win
Align the tool allowlist with the workflow’s required operations.
Both definitions require interactive prompts and filesystem moves, but allow only Bash(openspec:*). Add the missing tools or use commands permitted by the allowlist.
.agents/commands/opsx/bulk-archive.md#L4-L4: update the command’sallowed-tools..agents/skills/openspec-bulk-archive-change/SKILL.md#L4-L4: update the skill’sallowed-tools.
📍 Affects 2 files
.agents/commands/opsx/bulk-archive.md#L4-L4(this comment).agents/skills/openspec-bulk-archive-change/SKILL.md#L4-L4
🤖 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 @.agents/commands/opsx/bulk-archive.md at line 4, Update the allowed-tools
declarations in .agents/commands/opsx/bulk-archive.md at line 4 and
.agents/skills/openspec-bulk-archive-change/SKILL.md at line 4 to permit the
interactive prompt and filesystem move operations required by the bulk-archive
workflow, or revise the workflow to use only commands permitted by the existing
Bash(openspec:*) allowlist.
| ``` | ||
| auth -> [change-a, change-b] <- CONFLICT (2+ changes) | ||
| api -> [change-c] <- OK (only 1 change) | ||
| ``` |
There was a problem hiding this comment.
📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win
Add language identifiers to all fenced examples.
The same MD040 warnings appear in both duplicated workflow documents.
.agents/commands/opsx/bulk-archive.md#L54-L57,85-L92,95-L98,101-L104,142-L156,159-L162,167-L179,182-L183,199-L209,213-L224,228-L231: label shell fences asbashand transcript/output fences astext..agents/skills/openspec-bulk-archive-change/SKILL.md#L58-L61,89-L96,99-L102,105-L108,146-L160,163-L166,171-L183,186-L187,203-L213,217-L228,232-L235: apply the same labels.
🧰 Tools
🪛 markdownlint-cli2 (0.23.0)
[warning] 54-54: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
📍 Affects 2 files
.agents/commands/opsx/bulk-archive.md#L54-L57(this comment).agents/skills/openspec-bulk-archive-change/SKILL.md#L58-L61
🤖 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 @.agents/commands/opsx/bulk-archive.md around lines 54 - 57, Add language
identifiers to every fenced code example in both duplicated workflow documents:
label shell command fences as bash and transcript or output fences as text.
Update all listed fence ranges in .agents/commands/opsx/bulk-archive.md and
.agents/skills/openspec-bulk-archive-change/SKILL.md consistently.
Source: Linters/SAST tools
| c. **Determine resolution**: | ||
| - If only one change is actually implemented -> sync that one's specs | ||
| - If both implemented -> apply in chronological order (older first, newer overwrites) | ||
| - If neither implemented -> skip spec sync, warn user | ||
|
|
||
| d. **Record resolution** for each conflict: | ||
| - Which change's specs to apply | ||
| - In what order (if both) | ||
| - Rationale (what was found in codebase) |
There was a problem hiding this comment.
🎯 Functional Correctness | 🟠 Major | ⚡ Quick win
Make chronological conflict ordering deterministic.
Both workflows require older changes to sync first without defining where creation timestamps come from.
.agents/commands/opsx/bulk-archive.md#L71-L79: collect and use a stable creation timestamp when recording each resolution..agents/skills/openspec-bulk-archive-change/SKILL.md#L75-L83: document the same timestamp source and tie-breaking rule.
📍 Affects 2 files
.agents/commands/opsx/bulk-archive.md#L71-L79(this comment).agents/skills/openspec-bulk-archive-change/SKILL.md#L75-L83
🤖 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 @.agents/commands/opsx/bulk-archive.md around lines 71 - 79, Make
chronological conflict ordering deterministic in the resolution guidance: in
.agents/commands/opsx/bulk-archive.md at lines 71-79, require collecting each
change’s stable creation timestamp and recording it with the resolution, using
that timestamp to order older changes first and an explicit deterministic
tie-breaker for equal timestamps; apply the same timestamp source and
tie-breaking rule in .agents/skills/openspec-bulk-archive-change/SKILL.md at
lines 75-83.
| mkdir -p "<planningHome.changesDir>/archive" | ||
| mv "<changeRoot>" "<planningHome.changesDir>/archive/YYYY-MM-DD-<name>" |
There was a problem hiding this comment.
🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win
Enforce archive-target collision handling consistently.
The documented mv operation can nest a change under an existing destination instead of producing the required per-change failure.
.agents/commands/opsx/bulk-archive.md#L129-L130: add an existence check and explicit failure path..agents/skills/openspec-bulk-archive-change/SKILL.md#L133-L134: apply the same collision-safe move behavior.
📍 Affects 2 files
.agents/commands/opsx/bulk-archive.md#L129-L130(this comment).agents/skills/openspec-bulk-archive-change/SKILL.md#L133-L134
🤖 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 @.agents/commands/opsx/bulk-archive.md around lines 129 - 130, Update the
archive move steps to check whether the target path already exists before
moving, and produce an explicit per-change failure instead of allowing mv to
nest the source. Apply this collision-safe behavior in
.agents/commands/opsx/bulk-archive.md lines 129-130 and
.agents/skills/openspec-bulk-archive-change/SKILL.md lines 133-134, preserving
successful moves to non-existing archive targets.
| --- | ||
| name: "OPSX: Continue" | ||
| description: Continue working on a change - create the next artifact (Experimental) | ||
| allowed-tools: Bash(openspec:*) |
There was a problem hiding this comment.
🎯 Functional Correctness | 🟠 Major | ⚡ Quick win
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
set -euo pipefail
echo "== files =="
git ls-files | rg '(^|/)(continue|onboard)\.md$|openspec-continue-change/SKILL\.md|openspec-onboard/SKILL\.md' || true
echo "== relevant files =="
for f in \
".agents/commands/opsx/continue.md" \
".agents/commands/opsx/onboard.md" \
".agents/skills/openspec-continue-change/SKILL.md" \
".agents/skills/openspec-onboard/SKILL.md"
do
if [ -f "$f" ]; then
echo "--- $f"
wc -l "$f"
cat -n "$f"
else
echo "MISSING $f"
fi
done
echo "== surrounding context maybe =="
git ls-files .agents | sed -n '1,200p'Repository: antonbabenko/pre-commit-terraform
Length of output: 50391
Align allowed-tools with the documented operations. Each of these files uses only Bash(openspec:*), but the workflow also requires user change selection (AskUserQuestion), repository/code inspection (git log, file searches), artifact reads and writes, and onboarding code modifications. Update the allowlists to include the tool categories those documented steps need.
📍 Affects 4 files
.agents/commands/opsx/continue.md#L1-L4(this comment).agents/commands/opsx/onboard.md#L1-L4.agents/skills/openspec-continue-change/SKILL.md#L1-L4.agents/skills/openspec-onboard/SKILL.md#L1-L4
🤖 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 @.agents/commands/opsx/continue.md around lines 1 - 4, Expand the
allowed-tools front matter for .agents/commands/opsx/continue.md,
.agents/commands/opsx/onboard.md,
.agents/skills/openspec-continue-change/SKILL.md, and
.agents/skills/openspec-onboard/SKILL.md to include AskUserQuestion,
repository/code inspection tools such as git log and file searches, artifact
read/write operations, and onboarding code modification tools, while retaining
Bash(openspec:*).
|
|
||
| Display: | ||
|
|
||
| ``` |
There was a problem hiding this comment.
📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win
Label the Markdown fences. The same markdownlint defect appears in both onboarding documents.
.agents/commands/opsx/onboard.md#L37-L37: add language identifiers to all unlabeled fences in the command..agents/skills/openspec-onboard/SKILL.md#L41-L41: apply the same correction to the skill.
🧰 Tools
🪛 markdownlint-cli2 (0.23.0)
[warning] 37-37: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
📍 Affects 2 files
.agents/commands/opsx/onboard.md#L37-L37(this comment).agents/skills/openspec-onboard/SKILL.md#L41-L41
🤖 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 @.agents/commands/opsx/onboard.md at line 37, Label every unlabeled Markdown
fence in .agents/commands/opsx/onboard.md at lines 37-37 with an appropriate
language identifier, and apply the same correction to all unlabeled fences in
.agents/skills/openspec-onboard/SKILL.md at lines 41-41. Preserve the fenced
content while ensuring each fence has the correct language tag.
Source: Linters/SAST tools
| **DO:** Resolve where the spec file should be created: | ||
| ```bash | ||
| openspec instructions specs --change "<name>" --json | ||
| # Use resolvedOutputPath from the JSON. If it is a glob, choose the concrete file path using the schema instruction and the change's context. | ||
| ``` | ||
|
|
||
| Draft the spec content: | ||
|
|
||
| ``` | ||
| Here's the spec: | ||
|
|
||
| --- | ||
|
|
||
| ## ADDED Requirements | ||
|
|
||
| ### Requirement: <Name> | ||
|
|
||
| <Description of what the system should do> | ||
|
|
||
| #### Scenario: <Scenario name> | ||
|
|
||
| - **WHEN** <trigger condition> | ||
| - **THEN** <expected outcome> | ||
| - **AND** <additional outcome if needed> | ||
|
|
||
| --- | ||
|
|
||
| This format—WHEN/THEN/AND—makes requirements testable. You can literally read them as test cases. | ||
| ``` | ||
|
|
||
| Save to the concrete file path chosen from `resolvedOutputPath`. | ||
|
|
||
| --- | ||
|
|
||
| ## Phase 7: Design | ||
|
|
||
| **EXPLAIN:** | ||
| ``` | ||
| ## Design | ||
|
|
||
| The design captures **how** we'll build it—technical decisions, tradeoffs, approach. | ||
|
|
||
| For small changes, this might be brief. That's fine—not every change needs deep design discussion. | ||
| ``` | ||
|
|
||
| **DO:** Draft design.md: | ||
|
|
||
| ``` | ||
| Here's the design: | ||
|
|
||
| --- | ||
|
|
||
| ## Context | ||
|
|
||
| [Brief context about the current state] | ||
|
|
||
| ## Goals / Non-Goals | ||
|
|
||
| **Goals:** | ||
| - [What we're trying to achieve] | ||
|
|
||
| **Non-Goals:** | ||
| - [What's explicitly out of scope] | ||
|
|
||
| ## Decisions | ||
|
|
||
| ### Decision 1: [Key decision] | ||
|
|
||
| [Explanation of approach and rationale] | ||
|
|
||
| --- | ||
|
|
||
| For a small task, this captures the key decisions without over-engineering. | ||
| ``` | ||
|
|
||
| Save to the `resolvedOutputPath` from `openspec instructions design --change "<name>" --json`. | ||
|
|
||
| --- | ||
|
|
||
| ## Phase 8: Tasks | ||
|
|
||
| **EXPLAIN:** | ||
| ``` | ||
| ## Tasks | ||
|
|
||
| Finally, we break the work into implementation tasks—checkboxes that drive the apply phase. | ||
|
|
||
| These should be small, clear, and in logical order. | ||
| ``` | ||
|
|
||
| **DO:** Generate tasks based on specs and design: | ||
|
|
||
| ``` | ||
| Here are the implementation tasks: | ||
|
|
||
| --- | ||
|
|
||
| ## 1. [Category or file] | ||
|
|
||
| - [ ] 1.1 [Specific task] | ||
| - [ ] 1.2 [Specific task] | ||
|
|
||
| ## 2. Verify | ||
|
|
||
| - [ ] 2.1 [Verification step] | ||
|
|
||
| --- | ||
|
|
||
| Each checkbox becomes a unit of work in the apply phase. Ready to implement? | ||
| ``` | ||
|
|
||
| **PAUSE** - Wait for user to confirm they're ready to implement. | ||
|
|
||
| Save to the `resolvedOutputPath` from `openspec instructions tasks --change "<name>" --json`. | ||
|
|
||
| --- | ||
|
|
||
| ## Phase 9: Apply (Implementation) |
There was a problem hiding this comment.
🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
set -euo pipefail
echo "== candidate files =="
git ls-files | rg '(^|/)(onboard\.md|SKILL\.md)$' || true
echo "== onboarding outlines =="
for f in .agents/commands/opsx/onboard.md .agents/skills/openspec-onboard/SKILL.md; do
if [ -f "$f" ]; then
echo "--- $f ($(wc -l < "$f") lines) ---"
ast-grep outline "$f" || true
fi
done
echo "== relevant excerpts =="
for f in .agents/commands/opsx/onboard.md .agents/skills/openspec-onboard/SKILL.md; do
if [ -f "$f" ]; then
echo "--- $f lines 230-405 ---"
sed -n '230,405p' "$f" | nl -ba -v230
fi
done
echo "== broader artifact mentions in these files =="
for f in .agents/commands/opsx/onboard.md .agents/skills/openspec-onboard/SKILL.md; do
if [ -f "$f" ]; then
echo "--- $f mentions ---"
rg -n -i 'proposal|proposal\.md|resolution|resolve|artifact|read|design\.md|specs|tasks|phase 6|phase 7|phase 8' "$f" || true
fi
doneRepository: antonbabenko/pre-commit-terraform
Length of output: 1207
🏁 Script executed:
#!/bin/bash
set -euo pipefail
echo "== relevant excerpts with Python numbering =="
python3 - <<'PY'
from pathlib import Path
for p in ['.agents/commands/opsx/onboard.md', '.agents/skills/openspec-onboard/SKILL.md']:
path = Path(p)
print(f'--- {p} ({path.stat().st_size} bytes) ---')
text = path.read_text(encoding='utf-8').splitlines()
for i in range(229, min(len(text), 406)):
print(f'{i+1:5d}: {text[i]}')
PY
echo "== key terms across onboarding files =="
python3 - <<'PY'
from pathlib import Path
import re
pairs = {
'.agents/commands/opsx/onboard.md': [(268,385),(1,270)],
'.agents/skills/openspec-onboard/SKILL.md': [(272,385),(1,278)],
}
terms = ['proposal', 'proposal.md', 'resolution', 'reads', 'read', 'resolves', 'resolvedOutputPath']
for p, ranges in pairs:
print(f'--- {p} terms in all ranges ---')
text = Path(p).read_text(encoding='utf-8').splitlines()
for start,end in ranges:
found = []
for i,line in enumerate(text[start-1:end], start):
if any(term.lower() in line.lower() for term in terms):
found.append((i,line))
print(f'range {start}-{end}: {len(found)} matches')
for i,line in found[:50]:
print(f'{i}: {line}')
print()
print(f'--- {p} all mentions line ranges ---')
content = Path(p).read_text(encoding='utf-8')
pat = re.compile('|'.join(re.escape(t) for t in terms), re.I)
for i,line in enumerate(content.splitlines(), 1):
if pat.search(line):
print(f'{i}: {line}')
PY
echo "== inspect openspec instruction definitions for outputPath references =="
rg -n 'resolvedOutputPath|outputPath|instructions (specs|design|tasks)|new Change|proposal' .agents --glob '*.md' || trueRepository: antonbabenko/pre-commit-terraform
Length of output: 10114
🏁 Script executed:
#!/bin/bash
set -euo pipefail
python3 - <<'PY'
from pathlib import Path
import re
files = {
'.agents/commands/opsx/onboard.md': [(268,385),(1,270)],
'.agents/skills/openspec-onboard/SKILL.md': [(272,385),(1,278)],
}
terms = ['proposal', 'proposal.md', 'resolution', 'reads', 'read', 'resolves', 'resolvedOutputPath', 'artifact']
for p, ranges in files.items():
print(f'--- {p} terms in all ranges ---')
text = Path(p).read_text(encoding='utf-8').splitlines()
for start,end in ranges:
print(f'range {start}-{end}:')
for i,line in enumerate(text[start-1:end], start):
if any(term.lower() in line.lower() for term in terms):
print(f'{i}: {line}')
print(f'--- {p} all mentions ---')
content = Path(p).read_text(encoding='utf-8')
pat = re.compile('|'.join(re.escape(t) for t in terms), re.I)
for i,line in enumerate(content.splitlines(), 1):
if pat.search(line):
print(f'{i}: {line}')
print('--- targeted instruction instructions/docs mentions ---')
for p in files:
content = Path(p).read_text(encoding='utf-8').splitlines()
for i,line in enumerate(content,1):
if re.search(r'reads|read|reference|proposal|spec|design', line, re.I):
print(f'{p}:{i}: {line}')
PY
echo "== all docs mentioning openspec instruction outputs =="
rg -n 'instructions (proposal|specs|design|tasks)|resolvedOutputPath|proposal\.md|design\.md|tasks\.md' .agents --glob '*.md' | head -200 || trueRepository: antonbabenko/pre-commit-terraform
Length of output: 35851
Read artifacts before deriving dependent artifacts. The onboarding flow mentions proposal → specs → design → tasks, but each creation step only resolves and drafts content instead of requiring the prior artifacts read. Require proposal content before creating specs/content, specs before design, and specs/design before tasks.
🧰 Tools
🪛 markdownlint-cli2 (0.23.0)
[warning] 276-276: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
[warning] 305-305: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
[warning] 315-315: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
[warning] 350-350: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
[warning] 360-360: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
📍 Affects 2 files
.agents/commands/opsx/onboard.md#L268-L385(this comment).agents/skills/openspec-onboard/SKILL.md#L272-L385
🤖 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 @.agents/commands/opsx/onboard.md around lines 268 - 385, Require the
onboarding flow to read existing artifacts before generating dependent ones: in
.agents/commands/opsx/onboard.md lines 268-385, read the proposal before
drafting specs, read the specs before drafting design, and read both specs and
design before generating tasks; apply the same guidance in
.agents/skills/openspec-onboard/SKILL.md lines 272-385, preserving the existing
artifact path resolution and save steps.
| After all tasks: | ||
|
|
||
| ``` | ||
| ## Implementation Complete | ||
|
|
||
| All tasks done: | ||
| - [x] Task 1 | ||
| - [x] Task 2 | ||
| - [x] ... | ||
|
|
||
| The change is implemented! One more step—let's archive it. | ||
| ``` | ||
|
|
||
| --- | ||
|
|
||
| ## Phase 10: Archive | ||
|
|
||
| **EXPLAIN:** | ||
| ``` | ||
| ## Archiving | ||
|
|
||
| When a change is complete, we archive it. The archive path is derived from `planningHome.changesDir` and the date. | ||
|
|
||
| Archived changes become your project's decision history—you can always find them later to understand why something was built a certain way. | ||
| ``` | ||
|
|
||
| **DO:** | ||
| ```bash | ||
| openspec archive "<name>" | ||
| ``` |
There was a problem hiding this comment.
🎯 Functional Correctness | 🟠 Major
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
set -euo pipefail
echo "== locate files =="
git ls-files | rg '(^|/)(onboard\.md|SKILL\.md)$|openspec|opsx|verify' || true
echo
echo "== target snippets with context =="
for f in '.agents/commands/opsx/onboard.md' '.agents/skills/openspec-onboard/SKILL.md'; do
if [ -f "$f" ]; then
echo "--- $f lines 380-450 ---"
sed -n '380,450p' "$f" | nl -ba -v380
else
echo "--- missing $f ---"
fi
done
echo
echo "== search verification/archive flow references =="
rg -n "verification|verify|archive|openspec archive|opsx:verify|## Implementation Complete|Phase 10|Phase 9|All tasks done" .agents commands skills . 2>/dev/null | head -200Repository: antonbabenko/pre-commit-terraform
Length of output: 1348
🏁 Script executed:
#!/bin/bash
set -euo pipefail
echo "== target snippets with context =="
for f in '.agents/commands/opsx/onboard.md' '.agents/skills/openspec-onboard/SKILL.md'; do
if [ -f "$f" ]; then
echo "--- $f lines 380-450 ---"
sed -n '380,450p' "$f"
else
echo "--- missing $f ---"
fi
done
echo
echo "== related verify/archive files =="
for f in '.agents/commands/opsx/verify.md' '.agents/commands/opsx/archive.md' '.agents/skills/openspec-verify-change/SKILL.md' '.agents/skills/openspec-archive-change/SKILL.md'; do
if [ -f "$f" ]; then
echo "--- $f outline/summary ---"
wc -l "$f"
head -160 "$f"
else
echo "--- missing $f ---"
fi
done
echo
echo "== search verification/archive flow references in onboarding documents =="
rg -n "verification|verify|archive|openspec archive|opsx:verify|## Implementation Complete|Phase 10|Phase 9|All tasks done" .agents/commands/opsx/onboard.md .agents/skills/openspec-onboard/SKILL.md .agents/skills/openspec-verify-change/SKILL.md .agents/skills/openspec-archive-change/SKILL.md .agents/commands/opsx/verify.md .agents/commands/opsx/archive.md || trueRepository: antonbabenko/pre-commit-terraform
Length of output: 41380
Run verification before archive. The onboarding flows move from completed implementation directly to openspec archive even though /opsx:verify exists for the intended “Must fix before archive” checks. Require /opsx:verify <name> to have no critical issues before proceeding in both .agents/commands/opsx/onboard.md and .agents/skills/openspec-onboard/SKILL.md.
[low_effort_and_high_recommendation]
🧰 Tools
🪛 markdownlint-cli2 (0.23.0)
[warning] 406-406: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
[warning] 422-422: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
📍 Affects 2 files
.agents/commands/opsx/onboard.md#L404-L433(this comment).agents/skills/openspec-onboard/SKILL.md#L408-L437
🤖 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 @.agents/commands/opsx/onboard.md around lines 404 - 433, The onboarding
archive flow must run verification before archiving. In
.agents/commands/opsx/onboard.md lines 404-433 and
.agents/skills/openspec-onboard/SKILL.md lines 408-437, add a required
/opsx:verify <name> step after implementation completion and before openspec
archive, and proceed only when verification reports no critical issues.
| **Input**: Optionally specify a change name after `/opsx:verify` (e.g., `/opsx:verify add-auth`). If omitted, check if it can be inferred from conversation context. If vague or ambiguous you MUST prompt for available changes. | ||
|
|
||
| **Steps** | ||
|
|
||
| 1. **If no change name provided, prompt for selection** | ||
|
|
||
| Run `openspec list --json` to get available changes. Use the **AskUserQuestion tool** to let the user select. | ||
|
|
||
| Show changes that have implementation tasks (tasks artifact exists). | ||
| Include the schema used for each change if available. | ||
| Mark changes with incomplete tasks as "(In Progress)". | ||
|
|
||
| **IMPORTANT**: Do NOT guess or auto-select a change. Always let the user choose. |
There was a problem hiding this comment.
🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win
Reconcile change-selection behavior.
The input section allows inferring an unambiguous change from conversation context, but Step 1 says to prompt whenever no name is provided. Choose one policy and mirror it in .agents/skills/openspec-verify-change/SKILL.md; the safer rule is “infer only when exact, otherwise prompt.”
🤖 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 @.agents/commands/opsx/verify.md around lines 13 - 25, The change-selection
policy in the `/opsx:verify` instructions conflicts between the input guidance
and Step 1. Update the instructions and the corresponding
`openspec-verify-change` skill to infer a change only when conversation context
identifies exactly one unambiguous change; otherwise run `openspec list --json`
and use `AskUserQuestion` for selection, without auto-selecting.
| ``` | ||
| ## Verification Report: <change-name> | ||
|
|
||
| ### Summary | ||
| | Dimension | Status | | ||
| |--------------|------------------| | ||
| | Completeness | X/Y tasks, N reqs| | ||
| | Correctness | M/N reqs covered | | ||
| | Coherence | Followed/Issues | | ||
| ``` | ||
|
|
||
| **Issues by Priority**: | ||
|
|
||
| 1. **CRITICAL** (Must fix before archive): |
There was a problem hiding this comment.
📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win
Add a language identifier to the fenced example.
Use ```markdown for the verification report example to satisfy Markdown lint rule MD040.
.agents/commands/opsx/verify.md#L113-L126: change the opening fence to```markdown..agents/skills/openspec-verify-change/SKILL.md#L117-L126: make the same change.
🧰 Tools
🪛 markdownlint-cli2 (0.23.0)
[warning] 113-113: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
📍 Affects 2 files
.agents/commands/opsx/verify.md#L113-L126(this comment).agents/skills/openspec-verify-change/SKILL.md#L117-L126
🤖 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 @.agents/commands/opsx/verify.md around lines 113 - 126, Update the
verification report fenced examples to use the markdown language identifier,
changing the opening fence to markdown in .agents/commands/opsx/verify.md lines
113-126 and .agents/skills/openspec-verify-change/SKILL.md lines 117-126. No
other content changes are needed.
Source: Linters/SAST tools
There was a problem hiding this comment.
Pull request overview
Introduces OpenSpec scaffolding and a set of OpenSpec-oriented agent skills and /opsx:* command docs so contributors (and agents) can plan work via a spec-driven workflow before generating implementation code.
Changes:
- Add OpenSpec project configuration (
openspec/config.yaml) using thespec-drivenschema. - Add a suite of OpenSpec agent skills under
.agents/skills/and matching/opsx:*command definitions under.agents/commands/opsx/. - Update repo guidance (
AGENTS.md,.github/AI_POLICY.md) to route/load selected skills and recommend the OpenSpec workflow for AI-assisted contributions.
Reviewed changes
Copilot reviewed 27 out of 27 changed files in this pull request and generated 7 comments.
Show a summary per file
| File | Description |
|---|---|
| openspec/config.yaml | Initializes OpenSpec project config (spec-driven schema). |
| AGENTS.md | Registers a subset of OpenSpec skills for auto-loading via skill routing. |
| .github/AI_POLICY.md | Documents recommended OpenSpec-based workflow for AI-agent contributions. |
| .agents/skills/openspec-apply-change/SKILL.md | Skill instructions for implementing tasks from an OpenSpec change. |
| .agents/skills/openspec-archive-change/SKILL.md | Skill instructions for archiving a change. |
| .agents/skills/openspec-bulk-archive-change/SKILL.md | Skill instructions for batch-archiving changes. |
| .agents/skills/openspec-continue-change/SKILL.md | Skill instructions for creating the next artifact in an existing change. |
| .agents/skills/openspec-explore/SKILL.md | Skill instructions for exploration/requirements clarification mode. |
| .agents/skills/openspec-ff-change/SKILL.md | Skill instructions for fast-forward artifact creation. |
| .agents/skills/openspec-new-change/SKILL.md | Skill instructions for starting a new change step-by-step. |
| .agents/skills/openspec-onboard/SKILL.md | Skill instructions for guided onboarding/tutorial workflow. |
| .agents/skills/openspec-propose/SKILL.md | Skill instructions for proposing a change and generating artifacts. |
| .agents/skills/openspec-sync-specs/SKILL.md | Skill instructions for syncing delta specs back to main specs. |
| .agents/skills/openspec-update-change/SKILL.md | Skill instructions for revising existing planning artifacts. |
| .agents/skills/openspec-verify-change/SKILL.md | Skill instructions for verifying implementation vs artifacts. |
| .agents/commands/opsx/apply.md | Slash-command doc for applying/implementing a change. |
| .agents/commands/opsx/archive.md | Slash-command doc for archiving a change. |
| .agents/commands/opsx/bulk-archive.md | Slash-command doc for batch archiving. |
| .agents/commands/opsx/continue.md | Slash-command doc for continuing artifact creation. |
| .agents/commands/opsx/explore.md | Slash-command doc for explore mode. |
| .agents/commands/opsx/ff.md | Slash-command doc for fast-forward artifact generation. |
| .agents/commands/opsx/new.md | Slash-command doc for starting a new change. |
| .agents/commands/opsx/onboard.md | Slash-command doc for onboarding/tutorial workflow. |
| .agents/commands/opsx/propose.md | Slash-command doc for proposing a change and generating artifacts. |
| .agents/commands/opsx/sync.md | Slash-command doc for syncing delta specs. |
| .agents/commands/opsx/update.md | Slash-command doc for updating/reconciling artifacts. |
| .agents/commands/opsx/verify.md | Slash-command doc for verifying implementation vs artifacts. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| | Propose a new OpenSpec change (design, specs, tasks in one step) | `openspec-propose` | | ||
| | Think through an idea/problem before or during an OpenSpec change | `openspec-explore` | | ||
| | Implement tasks from an existing OpenSpec change | `openspec-apply-change` | | ||
| | Revise an OpenSpec change's planning artifacts after edits/new decisions | `openspec-update-change` | | ||
| | Sync delta specs from a change into main specs (without archiving) | `openspec-sync-specs` | | ||
| | Archive a completed OpenSpec change | `openspec-archive-change` | |
| name: openspec-onboard | ||
| description: Guided onboarding for OpenSpec - walk through a complete workflow cycle with narration and real codebase work. | ||
| allowed-tools: Bash(openspec:*) | ||
| license: MIT | ||
| compatibility: Requires openspec CLI. |
| --- | ||
| name: "OPSX: Onboard" | ||
| description: Guided onboarding - walk through a complete OpenSpec workflow cycle with narration | ||
| allowed-tools: Bash(openspec:*) | ||
| category: Workflow | ||
| tags: [workflow, onboarding, tutorial, learning] |
| 5. **Perform the archive** | ||
|
|
||
| Create an `archive` directory under `planningHome.changesDir` if it doesn't exist: | ||
| ```bash | ||
| mkdir -p "<planningHome.changesDir>/archive" | ||
| ``` | ||
|
|
||
| Generate target name using current date: `YYYY-MM-DD-<change-name>` | ||
|
|
||
| **Check if target already exists:** | ||
| - If yes: Fail with error, suggest renaming existing archive or using different date | ||
| - If no: Move `changeRoot` to the archive directory | ||
|
|
||
| ```bash | ||
| mv "<changeRoot>" "<planningHome.changesDir>/archive/YYYY-MM-DD-<name>" | ||
| ``` |
| 5. **Perform the archive** | ||
|
|
||
| Create an `archive` directory under `planningHome.changesDir` if it doesn't exist: | ||
| ```bash | ||
| mkdir -p "<planningHome.changesDir>/archive" | ||
| ``` | ||
|
|
||
| Generate target name using current date: `YYYY-MM-DD-<change-name>` | ||
|
|
||
| **Check if target already exists:** | ||
| - If yes: Fail with error, suggest renaming existing archive or using different date | ||
| - If no: Move `changeRoot` to the archive directory | ||
|
|
||
| ```bash | ||
| mv "<changeRoot>" "<planningHome.changesDir>/archive/YYYY-MM-DD-<name>" | ||
| ``` |
| b. **Perform the archive**: | ||
| ```bash | ||
| mkdir -p "<planningHome.changesDir>/archive" | ||
| mv "<changeRoot>" "<planningHome.changesDir>/archive/YYYY-MM-DD-<name>" | ||
| ``` |
| b. **Perform the archive**: | ||
| ```bash | ||
| mkdir -p "<planningHome.changesDir>/archive" | ||
| mv "<changeRoot>" "<planningHome.changesDir>/archive/YYYY-MM-DD-<name>" | ||
| ``` |
|
It's too much for this repo. Will use it locally w/o commiting |
.github/AI_POLICY.md, .gitignore and AGENTS.md's openspec-* additions now live in #1005 (split out per the review at #1002 (review)), so this branch no longer needs to wait on #1000 or carry them. Assisted-by: Sisyphus:claude-sonnet-5 opencode
Description of your changes
What
This section was generated by AI.
openspec/config.yaml(schema:spec-driven).agents/skills//opsx:*slash commands under.agents/commands/opsx/AGENTS.md's "Skill routing" table so agents load them automatically.github/AI_POLICY.mdrecommending contributors install OpenSpec and use its spec-driven workflow (/opsx:propose→/opsx:apply) before writing AI-assisted codeWhy
I was on the way to preparing one PR, and found out that there are no OpenSpec that I use for bigger tasks, so I split this out into a separate PR. Will see how it will go in the main one and then will deside do we need OpenSpec here or if it's overkill.
How can we test changes
This section was generated by AI.
openspec --versionandopenspec listin the repo root to confirm the CLI recognizes the initialized project (openspec/config.yaml,schema: spec-driven)/opsx:*are availableAGENTS.md→ "Skill routing" table and confirm allopenspec-*rows resolve to theirSKILL.mdfiles under.agents/skills/Assisted-by
Specific models used per commit are specified in the commit messages.