opensddrag 0.1.0 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +236 -0
- package/package.json +1 -1
- package/src/commands/init.js +61 -46
- package/src/commands/status.js +7 -10
- package/src/config.js +53 -0
- package/src/templates/commands/index.js +190 -2
- package/src/templates/commands/opencode.js +139 -26
- package/src/templates/skill-md.js +180 -0
- package/src/templates/skills/index.js +208 -13
|
@@ -1,3 +1,183 @@
|
|
|
1
|
+
export function getHarnessSkill({ slug, serverUrl }) {
|
|
2
|
+
// SKILL.md for the `opensddrag-harness` skill — installed into
|
|
3
|
+
// .claude/skills/opensddrag-harness/ and .agents/skills/opensddrag-harness/
|
|
4
|
+
// by `opensddrag init`. Drives the /opsr:harness slash command behaviorally
|
|
5
|
+
// for both Claude Code and OpenCode, using only the standard MCP tools
|
|
6
|
+
// (add_rule, list_rules, get_harness_checklist). No direct DB access, no
|
|
7
|
+
// local file writes for rule storage — rules are persisted via the MCP
|
|
8
|
+
// server's `project_rules` table.
|
|
9
|
+
return `---
|
|
10
|
+
name: opensddrag-harness
|
|
11
|
+
description: Manage persistent project rules — add, list, and disable behavioral constraints
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
# OpenSddRag — Harness
|
|
15
|
+
|
|
16
|
+
This project is connected to the OpenSddRag Harness (${serverUrl}).
|
|
17
|
+
The Harness layer manages **project rules**: persistent, per-project behavioral
|
|
18
|
+
constraints that are automatically injected into every agent session.
|
|
19
|
+
|
|
20
|
+
## Project slug: \`${slug}\`
|
|
21
|
+
|
|
22
|
+
Always pass \`project_slug: "${slug}"\` to scope rule operations to this project.
|
|
23
|
+
|
|
24
|
+
## When to use
|
|
25
|
+
|
|
26
|
+
- Before starting any new feature, ask: "Are there harness rules I should be aware of?"
|
|
27
|
+
\`get_working_context(project_slug="${slug}")\` will return any \`trigger="always"\` rules
|
|
28
|
+
automatically — read them first.
|
|
29
|
+
- Use \`/opsr:harness\` (Claude Code) or invoke this skill (OpenCode) to:
|
|
30
|
+
- **add** a new rule (architecture, naming, forbidden, doc-sync, verification)
|
|
31
|
+
- **list** all rules for the project, grouped by trigger
|
|
32
|
+
- **disable** a rule (soft-delete — re-enable by re-adding with the same name)
|
|
33
|
+
|
|
34
|
+
## Available operations
|
|
35
|
+
|
|
36
|
+
### add — create or update a project rule
|
|
37
|
+
|
|
38
|
+
Call the \`add_rule\` MCP tool. Required arguments:
|
|
39
|
+
|
|
40
|
+
\`\`\`
|
|
41
|
+
add_rule(
|
|
42
|
+
name: "<kebab-case-name>",
|
|
43
|
+
trigger: "always" | "on_apply" | "on_verify" | "on_archive" | "on_spec",
|
|
44
|
+
category: "architecture" | "naming" | "forbidden" | "doc-sync" | "verification",
|
|
45
|
+
severity: "error" | "warning" | "info", // default: "warning"
|
|
46
|
+
instruction: "<free-text rule the agent must follow>",
|
|
47
|
+
project_slug:"${slug}",
|
|
48
|
+
enabled: true, // default: true (set false to soft-delete)
|
|
49
|
+
metadata: { ... } // optional, free-form JSON
|
|
50
|
+
)
|
|
51
|
+
\`\`\`
|
|
52
|
+
|
|
53
|
+
When the user provides a rule in natural language, infer the fields:
|
|
54
|
+
- "always update X when applying" → trigger=\`on_apply\`, category=\`doc-sync\`, severity=\`warning\`
|
|
55
|
+
- "never do Y" → trigger=\`always\`, category=\`forbidden\`, severity=\`error\`
|
|
56
|
+
- "use Z pattern in this project" → trigger=\`always\`, category=\`architecture\`, severity=\`warning\`
|
|
57
|
+
|
|
58
|
+
**Example 1 — architecture rule (always):**
|
|
59
|
+
\`\`\`
|
|
60
|
+
add_rule(
|
|
61
|
+
name: "repo-pattern-required",
|
|
62
|
+
trigger: "always",
|
|
63
|
+
category: "architecture",
|
|
64
|
+
severity: "error",
|
|
65
|
+
instruction: "All data access must go through a repository class. Do not call the ORM or DB driver directly from route handlers or service classes.",
|
|
66
|
+
project_slug:"${slug}"
|
|
67
|
+
)
|
|
68
|
+
\`\`\`
|
|
69
|
+
|
|
70
|
+
**Example 2 — doc-sync rule (on_apply):**
|
|
71
|
+
\`\`\`
|
|
72
|
+
add_rule(
|
|
73
|
+
name: "update-changelog-on-apply",
|
|
74
|
+
trigger: "on_apply",
|
|
75
|
+
category: "doc-sync",
|
|
76
|
+
severity: "warning",
|
|
77
|
+
instruction: "When applying a task that ships a user-visible change, add a one-line entry to CHANGELOG.md under the unreleased section before marking the task complete.",
|
|
78
|
+
project_slug:"${slug}"
|
|
79
|
+
)
|
|
80
|
+
\`\`\`
|
|
81
|
+
|
|
82
|
+
Confirm with the user after adding:
|
|
83
|
+
"Rule '<name>' added. It will be [injected at every session start | checked during /opsr:apply | ...]."
|
|
84
|
+
|
|
85
|
+
### list — show all rules for this project
|
|
86
|
+
|
|
87
|
+
Call the \`list_rules\` MCP tool:
|
|
88
|
+
|
|
89
|
+
\`\`\`
|
|
90
|
+
list_rules(project_slug="${slug}", enabled_only=true)
|
|
91
|
+
\`\`\`
|
|
92
|
+
|
|
93
|
+
Group the results by \`trigger\` in the output:
|
|
94
|
+
|
|
95
|
+
\`\`\`
|
|
96
|
+
### Always (loaded at session start)
|
|
97
|
+
- [architecture:error] repo-pattern-required — All data access must go through...
|
|
98
|
+
|
|
99
|
+
### On Apply (checked during /opsr:apply)
|
|
100
|
+
- [doc-sync:warning] update-changelog-on-apply — When applying a task...
|
|
101
|
+
|
|
102
|
+
### On Verify (checked during /opsr:verify)
|
|
103
|
+
- (none)
|
|
104
|
+
|
|
105
|
+
### On Archive (checked during /opsr:archive)
|
|
106
|
+
- (none)
|
|
107
|
+
|
|
108
|
+
### On Spec (checked during /opsr:spec)
|
|
109
|
+
- (none)
|
|
110
|
+
\`\`\`
|
|
111
|
+
|
|
112
|
+
If the result list is empty, respond:
|
|
113
|
+
"No harness rules defined for this project. Run \`/opsr:harness add\` to create the first rule."
|
|
114
|
+
|
|
115
|
+
### disable — soft-delete a rule
|
|
116
|
+
|
|
117
|
+
Call the \`add_rule\` MCP tool with the same \`name\` and \`enabled=false\`:
|
|
118
|
+
|
|
119
|
+
\`\`\`
|
|
120
|
+
add_rule(name: "<rule-name>", enabled: false, project_slug: "${slug}")
|
|
121
|
+
\`\`\`
|
|
122
|
+
|
|
123
|
+
This is a soft-delete: the rule is preserved in the database with \`enabled=false\`
|
|
124
|
+
and will no longer appear in \`list_rules\` (default \`enabled_only=true\`) or in
|
|
125
|
+
\`get_working_context\` injection. To re-enable, call \`add_rule\` with the same
|
|
126
|
+
name and \`enabled=true\`.
|
|
127
|
+
|
|
128
|
+
Confirm with the user:
|
|
129
|
+
"Rule '<name>' disabled. It will no longer appear in checklists or session context."
|
|
130
|
+
|
|
131
|
+
## Phase-gate checklist — get_harness_checklist
|
|
132
|
+
|
|
133
|
+
When the user runs \`/opsr:apply\`, \`/opsr:verify\`, \`/opsr:archive\`, or
|
|
134
|
+
\`/opsr:spec\`, the corresponding slash command will call:
|
|
135
|
+
|
|
136
|
+
\`\`\`
|
|
137
|
+
get_harness_checklist(trigger="on_apply"|"on_verify"|"on_archive"|"on_spec", project_slug="${slug}")
|
|
138
|
+
\`\`\`
|
|
139
|
+
|
|
140
|
+
…to fetch rules that must be satisfied at that phase gate. The response is an
|
|
141
|
+
array of {name, category, severity, instruction} objects ordered by severity
|
|
142
|
+
(error first) then name. Rules with \`severity="error"\` MUST be completed before
|
|
143
|
+
the phase is declared done; \`severity="warning"\` rules SHOULD be addressed.
|
|
144
|
+
|
|
145
|
+
You do not need to call this directly — the slash commands invoke it. But you
|
|
146
|
+
can use it from this skill if the user asks "what rules apply to apply?".
|
|
147
|
+
|
|
148
|
+
## Memory of rule operations
|
|
149
|
+
|
|
150
|
+
Every add / disable operation should be recorded in episodic memory:
|
|
151
|
+
|
|
152
|
+
\`\`\`
|
|
153
|
+
record_trace(action="add_rule"|"disable_rule", result_summary="Added/disabled rule: <name>", project_slug="${slug}")
|
|
154
|
+
\`\`\`
|
|
155
|
+
|
|
156
|
+
## MCP tools used
|
|
157
|
+
|
|
158
|
+
| Tool | Purpose |
|
|
159
|
+
|------|---------|
|
|
160
|
+
| \`add_rule\` | Upsert a rule (create, update, or soft-delete) |
|
|
161
|
+
| \`list_rules\` | List rules with optional filters |
|
|
162
|
+
| \`get_harness_checklist\` | Fetch phase-gate rules for apply/verify/archive/spec |
|
|
163
|
+
| \`get_working_context\` | Already returns trigger="always" rules automatically |
|
|
164
|
+
| \`record_trace\` | Log harness operations to episodic memory |
|
|
165
|
+
|
|
166
|
+
## Important rules for this skill
|
|
167
|
+
|
|
168
|
+
- **Never write rule data to local files** — all rules live in the \`project_rules\` table.
|
|
169
|
+
- **Never translate or modify the user's rule instruction** — store it verbatim.
|
|
170
|
+
- **Always confirm with the user before calling \`add_rule\`** for new rules, especially when inferring fields from natural language.
|
|
171
|
+
- **Soft-delete is the only way to "remove" a rule** — re-adding with the same name restores it.
|
|
172
|
+
`;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
export function getOpenCodeHarnessSkill({ slug, serverUrl }) {
|
|
176
|
+
const full = getHarnessSkill({ slug, serverUrl });
|
|
177
|
+
// OpenCode auto-discovers tools from opencode.json — the table is noise.
|
|
178
|
+
return full.replace(/\n## MCP tools used\n[\s\S]*?(?=\n## |\n$)/, '\n');
|
|
179
|
+
}
|
|
180
|
+
|
|
1
181
|
export function renderSkillMd({ slug, serverUrl }) {
|
|
2
182
|
return `# OpenSddRag — SDD + Harness
|
|
3
183
|
|
|
@@ -1,12 +1,207 @@
|
|
|
1
|
+
export function getOpenCodeSkills(slug, _serverUrl) {
|
|
2
|
+
const note = `> **project_slug for every call:** \`${slug}\`\n\n`;
|
|
3
|
+
|
|
4
|
+
const fm = (name, description) => `---\nname: ${name}\ndescription: ${description}\n---\n\n`;
|
|
5
|
+
|
|
6
|
+
return [
|
|
7
|
+
{
|
|
8
|
+
name: "opensddrag-propose",
|
|
9
|
+
content: `${fm("opensddrag-propose", "Create a named change proposal — entry point for every feature or bugfix")}# OpenSddRag — Propose
|
|
10
|
+
${note}Creates a named **change** with a proposal artifact: Why, What Changes, Capabilities, Impact.
|
|
11
|
+
Entry point for every new feature or bugfix. No code is written here.
|
|
12
|
+
After this, /opsr:spec and /opsr:design become available.
|
|
13
|
+
|
|
14
|
+
**Run:** \`/opsr:propose <change-name or description>\`
|
|
15
|
+
|
|
16
|
+
**Creates:** \`<change-name>-proposal\` artifact in database.
|
|
17
|
+
**Unlocks:** /opsr:spec, /opsr:design
|
|
18
|
+
`,
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
name: "opensddrag-spec",
|
|
22
|
+
content: `${fm("opensddrag-spec", "Write capability specs with SHALL/MUST requirements and WHEN/THEN scenarios")}# OpenSddRag — Spec
|
|
23
|
+
${note}Creates spec artifacts for each capability listed in the proposal.
|
|
24
|
+
Uses SHALL/MUST language. Each requirement MUST have Scenarios with WHEN/THEN format.
|
|
25
|
+
|
|
26
|
+
**New capability** → full spec (Purpose + Requirements + Scenarios)
|
|
27
|
+
**Modified capability** → delta spec (ADDED / MODIFIED / REMOVED / RENAMED sections)
|
|
28
|
+
|
|
29
|
+
**Run:** \`/opsr:spec <change-name>\`
|
|
30
|
+
|
|
31
|
+
**Requires:** proposal artifact in database.
|
|
32
|
+
**Creates:** \`<change-name>-<capability>-spec\` artifact(s) in database.
|
|
33
|
+
**Unlocks:** /opsr:design (when all capabilities have specs)
|
|
34
|
+
`,
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
name: "opensddrag-design",
|
|
38
|
+
content: `${fm("opensddrag-design", "Document technical decisions, architecture, and trade-offs for a change")}# OpenSddRag — Design
|
|
39
|
+
${note}Creates a design document: Context, Goals, Decisions (with alternatives), Architecture, Risks, Migration.
|
|
40
|
+
Must read proposal and all specs from the database as context.
|
|
41
|
+
|
|
42
|
+
**Run:** \`/opsr:design <change-name>\`
|
|
43
|
+
|
|
44
|
+
**Requires:** proposal + specs in database.
|
|
45
|
+
**Creates:** \`<change-name>-design\` artifact in database.
|
|
46
|
+
**Unlocks:** /opsr:tasks
|
|
47
|
+
`,
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
name: "opensddrag-tasks",
|
|
51
|
+
content: `${fm("opensddrag-tasks", "Break a design into atomic, verifiable implementation tasks")}# OpenSddRag — Tasks
|
|
52
|
+
${note}Decomposes specs + design into atomic task artifacts, each < 4 hours.
|
|
53
|
+
Each task has: Goal, Acceptance criteria (referencing REQ-NNN), Dependencies.
|
|
54
|
+
Tasks are individual database artifacts — NOT a single markdown file.
|
|
55
|
+
|
|
56
|
+
**Run:** \`/opsr:tasks <change-name>\`
|
|
57
|
+
|
|
58
|
+
**Requires:** proposal + specs + design in database.
|
|
59
|
+
**Creates:** \`<change-name>-task-<N>\` artifacts in database.
|
|
60
|
+
**Unlocks:** /opsr:apply
|
|
61
|
+
`,
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
name: "opensddrag-apply",
|
|
65
|
+
content: `${fm("opensddrag-apply", "Implement the next pending task against spec acceptance criteria")}# OpenSddRag — Apply
|
|
66
|
+
${note}Implements tasks one at a time, reading ALL planning artifacts (proposal + specs + design) as context.
|
|
67
|
+
Marks tasks active → archived in the database after implementation.
|
|
68
|
+
Must validate each task against spec acceptance criteria before marking done.
|
|
69
|
+
|
|
70
|
+
**Run:** \`/opsr:apply <change-name>\`
|
|
71
|
+
|
|
72
|
+
**Requires:** all planning artifacts + pending tasks in database.
|
|
73
|
+
**Updates:** task status in database (draft → active → archived).
|
|
74
|
+
**After all tasks:** run /opsr:verify then /opsr:archive.
|
|
75
|
+
`,
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
name: "opensddrag-verify",
|
|
79
|
+
content: `${fm("opensddrag-verify", "Validate implementation against spec requirements and design decisions")}# OpenSddRag — Verify
|
|
80
|
+
${note}Read-only validation of the implementation against spec requirements and design decisions.
|
|
81
|
+
Produces a report with CRITICAL / WARNING / SUGGESTION severity levels.
|
|
82
|
+
|
|
83
|
+
Checks:
|
|
84
|
+
- **Completeness**: all tasks done, all REQ-NNN implemented
|
|
85
|
+
- **Correctness**: all spec scenarios covered
|
|
86
|
+
- **Coherence**: implementation follows design decisions
|
|
87
|
+
|
|
88
|
+
**Run:** \`/opsr:verify <change-name>\`
|
|
89
|
+
|
|
90
|
+
**Requires:** all artifacts in database + implementation in codebase.
|
|
91
|
+
**Output:** verification report (no artifacts modified).
|
|
92
|
+
`,
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
name: "opensddrag-sync",
|
|
96
|
+
content: `${fm("opensddrag-sync", "Merge delta specs back into main capability specs")}# OpenSddRag — Sync
|
|
97
|
+
${note}Merges delta specs (ADDED/MODIFIED/REMOVED/RENAMED) into main specs stored in the database.
|
|
98
|
+
Called automatically during /opsr:archive when delta specs exist.
|
|
99
|
+
|
|
100
|
+
Delta operations:
|
|
101
|
+
- **ADDED** → append new requirement to main spec
|
|
102
|
+
- **MODIFIED** → apply partial updates (not wholesale replace)
|
|
103
|
+
- **REMOVED** → delete requirement + add Reason/Migration note
|
|
104
|
+
- **RENAMED** → rename requirement heading
|
|
105
|
+
|
|
106
|
+
**Run:** \`/opsr:sync <change-name>\`
|
|
107
|
+
|
|
108
|
+
**Requires:** delta specs + main specs in database.
|
|
109
|
+
**Updates:** main spec artifacts in database.
|
|
110
|
+
`,
|
|
111
|
+
},
|
|
112
|
+
{
|
|
113
|
+
name: "opensddrag-archive",
|
|
114
|
+
content: `${fm("opensddrag-archive", "Finalize a completed change by archiving all its artifacts")}# OpenSddRag — Archive
|
|
115
|
+
${note}Finalizes a completed change: validates, syncs delta specs, archives all artifacts.
|
|
116
|
+
|
|
117
|
+
Steps:
|
|
118
|
+
1. Validate artifact and task completion (warns if incomplete)
|
|
119
|
+
2. Sync delta specs to main specs (if any)
|
|
120
|
+
3. Mark all change artifacts as archived in database
|
|
121
|
+
|
|
122
|
+
**Run:** \`/opsr:archive <change-name>\`
|
|
123
|
+
|
|
124
|
+
**Requires:** all tasks completed (or user confirmation to archive anyway).
|
|
125
|
+
**Updates:** all change artifacts to status=archived in database.
|
|
126
|
+
`,
|
|
127
|
+
},
|
|
128
|
+
{
|
|
129
|
+
name: "opensddrag-explore",
|
|
130
|
+
content: `${fm("opensddrag-explore", "Investigate a problem or idea without writing any code")}# OpenSddRag — Explore
|
|
131
|
+
${note}Thinking mode — investigates ideas WITHOUT implementing any code.
|
|
132
|
+
Reads existing specs and codebase for context. Can create artifacts to capture insights.
|
|
133
|
+
|
|
134
|
+
Rules:
|
|
135
|
+
- NEVER write application code
|
|
136
|
+
- NEVER create implementation files
|
|
137
|
+
- MAY create/update OpenSddRag artifacts to capture decisions
|
|
138
|
+
|
|
139
|
+
Use when: thinking through options, investigating feasibility, comparing approaches.
|
|
140
|
+
Transition: when ready → /opsr:propose <name>
|
|
141
|
+
|
|
142
|
+
**Run:** \`/opsr:explore <topic or question>\`
|
|
143
|
+
`,
|
|
144
|
+
},
|
|
145
|
+
{
|
|
146
|
+
name: "opensddrag-continue",
|
|
147
|
+
content: `${fm("opensddrag-continue", "Create the next single artifact in the SDD dependency chain")}# OpenSddRag — Continue
|
|
148
|
+
${note}Creates the NEXT SINGLE artifact in the dependency chain and stops.
|
|
149
|
+
Unlike /opsr:flow, creates one artifact per invocation.
|
|
150
|
+
|
|
151
|
+
Dependency order: proposal → specs → design → tasks
|
|
152
|
+
|
|
153
|
+
Use when: stepping through the SDD flow one artifact at a time.
|
|
154
|
+
|
|
155
|
+
**Run:** \`/opsr:continue <change-name>\`
|
|
156
|
+
`,
|
|
157
|
+
},
|
|
158
|
+
{
|
|
159
|
+
name: "opensddrag-status",
|
|
160
|
+
content: `${fm("opensddrag-status", "Show current state of all in-progress changes")}# OpenSddRag — Status
|
|
161
|
+
${note}Shows current state of all in-progress changes: artifact completion, task progress, recent activity.
|
|
162
|
+
|
|
163
|
+
Reads from MCP server — no local files.
|
|
164
|
+
|
|
165
|
+
**Run:** \`/opsr:status\` or \`/opsr:status <change-name>\`
|
|
166
|
+
`,
|
|
167
|
+
},
|
|
168
|
+
{
|
|
169
|
+
name: "opensddrag-flow",
|
|
170
|
+
content: `${fm("opensddrag-flow", "Run the complete SDD flow end-to-end in one session")}# OpenSddRag — Flow
|
|
171
|
+
${note}Runs the complete SDD flow end-to-end: propose → spec → design → tasks → apply → archive.
|
|
172
|
+
ALL artifacts saved to database via MCP — no local files created.
|
|
173
|
+
|
|
174
|
+
Use when: implementing a feature from scratch in a single session.
|
|
175
|
+
|
|
176
|
+
**Run:** \`/opsr:flow <feature description>\`
|
|
177
|
+
`,
|
|
178
|
+
},
|
|
179
|
+
{
|
|
180
|
+
name: "opensddrag-search",
|
|
181
|
+
content: `${fm("opensddrag-search", "Semantic search over specs, tasks, and past agent actions")}# OpenSddRag — Search
|
|
182
|
+
${note}Semantic search over the SDD knowledge base using pgvector similarity.
|
|
183
|
+
Always run this BEFORE starting new work to find existing specs and decisions.
|
|
184
|
+
|
|
185
|
+
Searches: this project first, then all projects if no results.
|
|
186
|
+
Also recalls past agent actions (episodic memory).
|
|
187
|
+
|
|
188
|
+
**Run:** \`/opsr:search <natural language query>\`
|
|
189
|
+
`,
|
|
190
|
+
},
|
|
191
|
+
];
|
|
192
|
+
}
|
|
193
|
+
|
|
1
194
|
export function getSkills(slug, serverUrl) {
|
|
2
195
|
const note = `> **MCP server:** \`opensddrag\` (${serverUrl}) | **project_slug:** \`${slug}\`
|
|
3
196
|
> **Available tools:** \`create_artifact\`, \`read_artifact\`, \`list_artifacts\`, \`update_artifact\`, \`validate_artifact\`, \`link_artifacts\`, \`get_relationships\`, \`search_semantic\`, \`recall_episodes\`, \`get_working_context\`, \`update_working_context\`, \`record_trace\`
|
|
4
197
|
> If these tools are not in your active tool list, the \`opensddrag\` MCP server is not connected — STOP and inform the user.\n\n`;
|
|
5
198
|
|
|
199
|
+
const fm = (name, description) => `---\nname: ${name}\ndescription: ${description}\n---\n\n`;
|
|
200
|
+
|
|
6
201
|
return [
|
|
7
202
|
{
|
|
8
203
|
name: "opensddrag-propose",
|
|
9
|
-
content:
|
|
204
|
+
content: `${fm("opensddrag-propose", "Create a named change proposal — entry point for every feature or bugfix")}# OpenSddRag — Propose
|
|
10
205
|
${note}Creates a named **change** with a proposal artifact: Why, What Changes, Capabilities, Impact.
|
|
11
206
|
Entry point for every new feature or bugfix. No code is written here.
|
|
12
207
|
After this, /opsr:spec and /opsr:design become available.
|
|
@@ -19,7 +214,7 @@ After this, /opsr:spec and /opsr:design become available.
|
|
|
19
214
|
},
|
|
20
215
|
{
|
|
21
216
|
name: "opensddrag-spec",
|
|
22
|
-
content:
|
|
217
|
+
content: `${fm("opensddrag-spec", "Write capability specs with SHALL/MUST requirements and WHEN/THEN scenarios")}# OpenSddRag — Spec
|
|
23
218
|
${note}Creates spec artifacts for each capability listed in the proposal.
|
|
24
219
|
Uses SHALL/MUST language. Each requirement MUST have Scenarios with WHEN/THEN format.
|
|
25
220
|
|
|
@@ -35,7 +230,7 @@ Uses SHALL/MUST language. Each requirement MUST have Scenarios with WHEN/THEN fo
|
|
|
35
230
|
},
|
|
36
231
|
{
|
|
37
232
|
name: "opensddrag-design",
|
|
38
|
-
content:
|
|
233
|
+
content: `${fm("opensddrag-design", "Document technical decisions, architecture, and trade-offs for a change")}# OpenSddRag — Design
|
|
39
234
|
${note}Creates a design document: Context, Goals, Decisions (with alternatives), Architecture, Risks, Migration.
|
|
40
235
|
Must read proposal and all specs from the database as context.
|
|
41
236
|
|
|
@@ -48,7 +243,7 @@ Must read proposal and all specs from the database as context.
|
|
|
48
243
|
},
|
|
49
244
|
{
|
|
50
245
|
name: "opensddrag-tasks",
|
|
51
|
-
content:
|
|
246
|
+
content: `${fm("opensddrag-tasks", "Break a design into atomic, verifiable implementation tasks")}# OpenSddRag — Tasks
|
|
52
247
|
${note}Decomposes specs + design into atomic task artifacts, each < 4 hours.
|
|
53
248
|
Each task has: Goal, Acceptance criteria (referencing REQ-NNN), Dependencies.
|
|
54
249
|
Tasks are individual database artifacts — NOT a single markdown file.
|
|
@@ -62,7 +257,7 @@ Tasks are individual database artifacts — NOT a single markdown file.
|
|
|
62
257
|
},
|
|
63
258
|
{
|
|
64
259
|
name: "opensddrag-apply",
|
|
65
|
-
content:
|
|
260
|
+
content: `${fm("opensddrag-apply", "Implement the next pending task against spec acceptance criteria")}# OpenSddRag — Apply
|
|
66
261
|
${note}Implements tasks one at a time, reading ALL planning artifacts (proposal + specs + design) as context.
|
|
67
262
|
Marks tasks active → archived in the database after implementation.
|
|
68
263
|
Must validate each task against spec acceptance criteria before marking done.
|
|
@@ -76,7 +271,7 @@ Must validate each task against spec acceptance criteria before marking done.
|
|
|
76
271
|
},
|
|
77
272
|
{
|
|
78
273
|
name: "opensddrag-verify",
|
|
79
|
-
content:
|
|
274
|
+
content: `${fm("opensddrag-verify", "Validate implementation against spec requirements and design decisions")}# OpenSddRag — Verify
|
|
80
275
|
${note}Read-only validation of the implementation against spec requirements and design decisions.
|
|
81
276
|
Produces a report with CRITICAL / WARNING / SUGGESTION severity levels.
|
|
82
277
|
|
|
@@ -93,7 +288,7 @@ Checks:
|
|
|
93
288
|
},
|
|
94
289
|
{
|
|
95
290
|
name: "opensddrag-sync",
|
|
96
|
-
content:
|
|
291
|
+
content: `${fm("opensddrag-sync", "Merge delta specs back into main capability specs")}# OpenSddRag — Sync
|
|
97
292
|
${note}Merges delta specs (ADDED/MODIFIED/REMOVED/RENAMED) into main specs stored in the database.
|
|
98
293
|
Called automatically during /opsr:archive when delta specs exist.
|
|
99
294
|
|
|
@@ -111,7 +306,7 @@ Delta operations:
|
|
|
111
306
|
},
|
|
112
307
|
{
|
|
113
308
|
name: "opensddrag-archive",
|
|
114
|
-
content:
|
|
309
|
+
content: `${fm("opensddrag-archive", "Finalize a completed change by archiving all its artifacts")}# OpenSddRag — Archive
|
|
115
310
|
${note}Finalizes a completed change: validates, syncs delta specs, archives all artifacts.
|
|
116
311
|
|
|
117
312
|
Steps:
|
|
@@ -127,7 +322,7 @@ Steps:
|
|
|
127
322
|
},
|
|
128
323
|
{
|
|
129
324
|
name: "opensddrag-explore",
|
|
130
|
-
content:
|
|
325
|
+
content: `${fm("opensddrag-explore", "Investigate a problem or idea without writing any code")}# OpenSddRag — Explore
|
|
131
326
|
${note}Thinking mode — investigates ideas WITHOUT implementing any code.
|
|
132
327
|
Reads existing specs and codebase for context. Can create artifacts to capture insights.
|
|
133
328
|
|
|
@@ -144,7 +339,7 @@ Transition: when ready → /opsr:propose <name>
|
|
|
144
339
|
},
|
|
145
340
|
{
|
|
146
341
|
name: "opensddrag-continue",
|
|
147
|
-
content:
|
|
342
|
+
content: `${fm("opensddrag-continue", "Create the next single artifact in the SDD dependency chain")}# OpenSddRag — Continue
|
|
148
343
|
${note}Creates the NEXT SINGLE artifact in the dependency chain and stops.
|
|
149
344
|
Unlike /opsr:flow, creates one artifact per invocation.
|
|
150
345
|
|
|
@@ -157,7 +352,7 @@ Use when: stepping through the SDD flow one artifact at a time.
|
|
|
157
352
|
},
|
|
158
353
|
{
|
|
159
354
|
name: "opensddrag-status",
|
|
160
|
-
content:
|
|
355
|
+
content: `${fm("opensddrag-status", "Show current state of all in-progress changes")}# OpenSddRag — Status
|
|
161
356
|
${note}Shows current state of all in-progress changes: artifact completion, task progress, recent activity.
|
|
162
357
|
|
|
163
358
|
Reads from MCP server — no local files.
|
|
@@ -167,7 +362,7 @@ Reads from MCP server — no local files.
|
|
|
167
362
|
},
|
|
168
363
|
{
|
|
169
364
|
name: "opensddrag-flow",
|
|
170
|
-
content:
|
|
365
|
+
content: `${fm("opensddrag-flow", "Run the complete SDD flow end-to-end in one session")}# OpenSddRag — Flow
|
|
171
366
|
${note}Runs the complete SDD flow end-to-end: propose → spec → design → tasks → apply → archive.
|
|
172
367
|
ALL artifacts saved to database via MCP — no local files created.
|
|
173
368
|
|
|
@@ -178,7 +373,7 @@ Use when: implementing a feature from scratch in a single session.
|
|
|
178
373
|
},
|
|
179
374
|
{
|
|
180
375
|
name: "opensddrag-search",
|
|
181
|
-
content:
|
|
376
|
+
content: `${fm("opensddrag-search", "Semantic search over specs, tasks, and past agent actions")}# OpenSddRag — Search
|
|
182
377
|
${note}Semantic search over the SDD knowledge base using pgvector similarity.
|
|
183
378
|
Always run this BEFORE starting new work to find existing specs and decisions.
|
|
184
379
|
|