Skip to content

chore(AI): Init OpenSpec skills, wire into AGENTS.md - #1000

Closed
MaxymVlasov wants to merge 3 commits into
masterfrom
openspec
Closed

chore(AI): Init OpenSpec skills, wire into AGENTS.md#1000
MaxymVlasov wants to merge 3 commits into
masterfrom
openspec

Conversation

@MaxymVlasov

@MaxymVlasov MaxymVlasov commented Jul 23, 2026

Copy link
Copy Markdown
Collaborator

Description of your changes

What

This section was generated by AI.

  • Add OpenSpec CLI scaffolding: openspec/config.yaml (schema: spec-driven)
  • Add OpenSpec skills under .agents/skills/
  • Add matching /opsx:* slash commands under .agents/commands/opsx/
  • Register the new skills in AGENTS.md's "Skill routing" table so agents load them automatically
  • Add a "Recommended tooling" section to .github/AI_POLICY.md recommending contributors install OpenSpec and use its spec-driven workflow (/opsx:propose/opsx:apply) before writing AI-assisted code

Why

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.

  • Run openspec --version and openspec list in the repo root to confirm the CLI recognizes the initialized project (openspec/config.yaml, schema: spec-driven)
  • Open this repo in an AI coding agent that supports OpenSpec and confirm /opsx:* are available
  • Review AGENTS.md → "Skill routing" table and confirm all openspec-* rows resolve to their SKILL.md files under .agents/skills/

Assisted-by

Specific models used per commit are specified in the commit messages.

  • Assisted-by: Sisyphus:claude-sonnet-5 claude (869f6b6)

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
@coderabbitai

coderabbitai Bot commented Jul 23, 2026

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Walkthrough

Adds 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.

Changes

OpenSpec workflow lifecycle

Layer / File(s) Summary
Planning and change creation
.agents/commands/opsx/{explore,propose,update,new,ff}.md, .agents/skills/openspec-{explore,propose,update-change,new-change,ff-change}/*, openspec/config.yaml, .github/AI_POLICY.md, AGENTS.md
Defines OpenSpec exploration, artifact creation, planning updates, change scaffolding, fast-forward generation, configuration, contributor guidance, and skill routing.
Application and verification
.agents/commands/opsx/{apply,verify}.md, .agents/skills/openspec-{apply-change,verify-change}/*
Defines status-driven task execution, context loading, task updates, pause handling, progress reporting, and completeness, correctness, and coherence verification.
Synchronization and archival
.agents/commands/opsx/{sync,archive}.md, .agents/skills/openspec-{sync-specs,archive-change}/*
Defines delta-spec merging, main-spec updates, synchronization assessment, completion checks, date-stamped archival, and archive reporting.
Bulk archival and conflict resolution
.agents/commands/opsx/bulk-archive.md, .agents/skills/openspec-bulk-archive-change/SKILL.md
Defines multi-change selection, capability conflict detection, implementation-based sync ordering, batch archiving, and partial outcome reporting.
Onboarding and continuation
.agents/commands/opsx/{onboard,continue}.md, .agents/skills/openspec-{onboard,continue-change}/*
Defines a guided end-to-end tutorial and artifact-by-artifact continuation flow from change creation through implementation and archive.

Estimated code review effort: 3 (Moderate) | ~25 minutes

Suggested reviewers: antonbabenko

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Title check ✅ Passed The title is concise and accurately reflects the main OpenSpec skill and AGENTS.md wiring changes.
Description check ✅ Passed The description is clearly related to the added OpenSpec scaffolding, skills, commands, and routing updates.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch openspec

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.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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

📥 Commits

Reviewing files that changed from the base of the PR and between 0f49790 and 869f6b6.

📒 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.md
  • AGENTS.md
  • openspec/config.yaml

Comment on lines +67 to +74
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

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🗄️ 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 || true

Repository: 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, not tasks.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.

Comment on lines +92 to +123
```
## 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)**

```

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Fix all MD040 fenced-block warnings.

  • .agents/commands/opsx/apply.md#L92-L123: add text to the three output fences.
  • .agents/skills/openspec-apply-change/SKILL.md#L96-L127: add text to the three output fences.
  • .agents/commands/opsx/sync.md#L121-L123: add text.
  • .agents/skills/openspec-sync-specs/SKILL.md#L125-L127: add text.
  • .agents/commands/opsx/archive.md#L94-L152: add text to 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

Comment on lines +62 to +66
**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.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🗄️ 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.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🗄️ 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()}")
PY

Repository: 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()}")
PY

Repository: 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.md

Repository: 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**
```

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📐 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

Comment on lines +46 to +53
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)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🗄️ 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 240

Repository: 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 240

Repository: 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:


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.

Comment on lines +64 to +67
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`.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 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.

Comment on lines +51 to +54
**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

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Use one valid continuation workflow.

  • .agents/skills/openspec-apply-change/SKILL.md#L51-L54: replace openspec-continue-change with a registered route.
  • .agents/commands/opsx/apply.md#L47-L50: add /opsx:continue or point to an existing command.
  • .agents/skills/openspec-update-change/SKILL.md#L68-L71: remove or replace the unregistered /opsx:continue guidance.
📍 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.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🗄️ 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.

Comment on lines +98 to +108
**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.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 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.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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

📥 Commits

Reviewing files that changed from the base of the PR and between 869f6b6 and 3707561.

📒 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:*)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 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’s allowed-tools.
  • .agents/skills/openspec-bulk-archive-change/SKILL.md#L4-L4: update the skill’s allowed-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.

Comment on lines +54 to +57
```
auth -> [change-a, change-b] <- CONFLICT (2+ changes)
api -> [change-c] <- OK (only 1 change)
```

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📐 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 as bash and transcript/output fences as text.
  • .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

Comment on lines +71 to +79
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)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 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.

Comment on lines +129 to +130
mkdir -p "<planningHome.changesDir>/archive"
mv "<changeRoot>" "<planningHome.changesDir>/archive/YYYY-MM-DD-<name>"

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🗄️ 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.

Comment on lines +1 to +4
---
name: "OPSX: Continue"
description: Continue working on a change - create the next artifact (Experimental)
allowed-tools: Bash(openspec:*)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 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:

```

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📐 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

Comment on lines +268 to +385
**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)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🗄️ 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
done

Repository: 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' || true

Repository: 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 || true

Repository: 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.

Comment on lines +404 to +433
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>"
```

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 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 -200

Repository: 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 || true

Repository: 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.

Comment on lines +13 to +25
**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.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 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.

Comment on lines +113 to +126
```
## 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):

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📐 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

@MaxymVlasov
MaxymVlasov marked this pull request as ready for review July 23, 2026 23:13
Copilot AI review requested due to automatic review settings July 23, 2026 23:13

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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 the spec-driven schema.
  • 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.

Comment thread AGENTS.md
Comment on lines +78 to +83
| 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` |
Comment on lines +2 to +6
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.
Comment on lines +1 to +6
---
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]
Comment on lines +72 to +87
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>"
```
Comment on lines +68 to +83
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>"
```
Comment on lines +131 to +135
b. **Perform the archive**:
```bash
mkdir -p "<planningHome.changesDir>/archive"
mv "<changeRoot>" "<planningHome.changesDir>/archive/YYYY-MM-DD-<name>"
```
Comment on lines +127 to +131
b. **Perform the archive**:
```bash
mkdir -p "<planningHome.changesDir>/archive"
mv "<changeRoot>" "<planningHome.changesDir>/archive/YYYY-MM-DD-<name>"
```
@MaxymVlasov

Copy link
Copy Markdown
Collaborator Author

It's too much for this repo. Will use it locally w/o commiting

MaxymVlasov added a commit that referenced this pull request Jul 28, 2026
.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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants