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.
@@ -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: `# OpenSddRag — Propose
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: `# OpenSddRag — Spec
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: `# OpenSddRag — Design
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: `# OpenSddRag — Tasks
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: `# OpenSddRag — Apply
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: `# OpenSddRag — Verify
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: `# OpenSddRag — Sync
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: `# OpenSddRag — Archive
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: `# OpenSddRag — Explore
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: `# OpenSddRag — Continue
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: `# OpenSddRag — Status
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: `# OpenSddRag — Flow
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: `# OpenSddRag — Search
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