@lifeaitools/rdc-skills 0.9.33 → 0.9.34

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.
Files changed (49) hide show
  1. package/.claude-plugin/plugin.json +2 -1
  2. package/.github/workflows/self-test.yml +34 -34
  3. package/commands/build.md +181 -181
  4. package/commands/collab.md +180 -180
  5. package/commands/deploy.md +152 -152
  6. package/commands/fixit.md +105 -105
  7. package/commands/handoff.md +173 -173
  8. package/commands/overnight.md +220 -220
  9. package/commands/plan.md +158 -158
  10. package/commands/preplan.md +131 -131
  11. package/commands/prototype.md +145 -145
  12. package/commands/report.md +99 -99
  13. package/commands/review.md +120 -120
  14. package/commands/status.md +86 -86
  15. package/commands/workitems.md +127 -127
  16. package/guides/agent-bootstrap.md +206 -202
  17. package/guides/agents/backend.md +102 -102
  18. package/guides/agents/content.md +94 -94
  19. package/guides/agents/cs2.md +56 -56
  20. package/guides/agents/data.md +86 -86
  21. package/guides/agents/design.md +77 -77
  22. package/guides/agents/frontend.md +91 -91
  23. package/guides/agents/infrastructure.md +81 -81
  24. package/guides/agents/setup.md +280 -278
  25. package/guides/agents/verify.md +119 -119
  26. package/guides/agents/viz.md +106 -106
  27. package/guides/engineering-behavior.md +43 -0
  28. package/package.json +2 -2
  29. package/scripts/install-rdc-skills.js +22 -0
  30. package/scripts/self-test.mjs +1337 -1323
  31. package/skills/build/SKILL.md +359 -355
  32. package/skills/collab/SKILL.md +217 -217
  33. package/skills/deploy/SKILL.md +198 -198
  34. package/skills/design/SKILL.md +211 -211
  35. package/skills/fixit/SKILL.md +136 -132
  36. package/skills/fs-mcp/SKILL.md +131 -0
  37. package/skills/handoff/SKILL.md +200 -200
  38. package/skills/help/SKILL.md +104 -104
  39. package/skills/overnight/SKILL.md +224 -224
  40. package/skills/plan/SKILL.md +252 -252
  41. package/skills/preplan/SKILL.md +86 -86
  42. package/skills/prototype/SKILL.md +150 -150
  43. package/skills/release/SKILL.md +342 -342
  44. package/skills/report/SKILL.md +100 -100
  45. package/skills/review/SKILL.md +122 -121
  46. package/skills/self-test/SKILL.md +126 -126
  47. package/skills/status/SKILL.md +99 -99
  48. package/skills/watch/SKILL.md +91 -91
  49. package/skills/workitems/SKILL.md +151 -151
@@ -1,38 +1,38 @@
1
- > **⚠️ OUTPUT CONTRACT (READ FIRST):** `guides/output-contract.md`
2
- > Checklist-only output. No tool-call narration. No raw MCP/JSON/log dumps.
3
- > One checklist upfront, updated in place, shown again at end with a 1-line verdict.
4
-
5
-
6
- # rdc:verify — Verification Before Completion
7
-
8
- > Adapted from obra/superpowers `verification-before-completion`.
9
- > Stack-specific: uses `npx vitest run` + `npx tsc --noEmit`. NEVER `pnpm build` (crashes machine — 800MB/process).
10
-
11
- ## The Iron Law
12
-
13
- **NO COMPLETION CLAIMS WITHOUT FRESH VERIFICATION EVIDENCE.**
14
-
15
- You may not say "done", "complete", "working", "fixed", "passing", or imply success until you have:
16
-
17
- 1. **Identified** the exact commands that prove the claim
18
- 2. **Run** those commands fresh in the current state (not memory, not "earlier", not "should")
19
- 3. **Read** the full output
20
- 4. **Verified** the output matches the claim
21
- 5. Only THEN made the claim, quoting the evidence
22
-
23
- If you cannot run the commands, say so explicitly. Do not substitute reasoning for evidence.
24
-
25
- ## Red Flags — Stop and Verify
26
-
27
- If you're about to write any of these, STOP:
28
-
29
- - "should work" / "should pass" / "should be fine"
30
- - "probably" / "seems to" / "looks good"
31
- - "I think the tests pass"
32
- - "the types check out" (without running tsc)
33
- - "everything compiles" (without fresh output)
34
- - Expressing satisfaction or wrapping up before the gate ran
35
-
1
+ > **⚠️ OUTPUT CONTRACT (READ FIRST):** `guides/output-contract.md`
2
+ > Checklist-only output. No tool-call narration. No raw MCP/JSON/log dumps.
3
+ > One checklist upfront, updated in place, shown again at end with a 1-line verdict.
4
+
5
+
6
+ # rdc:verify — Verification Before Completion
7
+
8
+ > Adapted from obra/superpowers `verification-before-completion`.
9
+ > Stack-specific: uses `npx vitest run` + `npx tsc --noEmit`. NEVER `pnpm build` (crashes machine — 800MB/process).
10
+
11
+ ## The Iron Law
12
+
13
+ **NO COMPLETION CLAIMS WITHOUT FRESH VERIFICATION EVIDENCE.**
14
+
15
+ You may not say "done", "complete", "working", "fixed", "passing", or imply success until you have:
16
+
17
+ 1. **Identified** the exact commands that prove the claim
18
+ 2. **Run** those commands fresh in the current state (not memory, not "earlier", not "should")
19
+ 3. **Read** the full output
20
+ 4. **Verified** the output matches the claim
21
+ 5. Only THEN made the claim, quoting the evidence
22
+
23
+ If you cannot run the commands, say so explicitly. Do not substitute reasoning for evidence.
24
+
25
+ ## Red Flags — Stop and Verify
26
+
27
+ If you're about to write any of these, STOP:
28
+
29
+ - "should work" / "should pass" / "should be fine"
30
+ - "probably" / "seems to" / "looks good"
31
+ - "I think the tests pass"
32
+ - "the types check out" (without running tsc)
33
+ - "everything compiles" (without fresh output)
34
+ - Expressing satisfaction or wrapping up before the gate ran
35
+
36
36
  ## The Gate — Commands for This Stack
37
37
 
38
38
  Run these in order. All must pass. Capture output.
@@ -55,97 +55,97 @@ Required work item evidence:
55
55
  If this check fails, stop validation for that item and reopen it. Do not mark a work item `done` when the checklist itself is not decomposed enough to prove completion.
56
56
 
57
57
  ### 1. Per-package vitest (every package touched)
58
-
59
- ```bash
60
- cd <repo-root>
61
- for pkg in <changed-packages>; do
62
- npx vitest run --dir packages/$pkg 2>&1 | tee /tmp/verify-$pkg.log
63
- done
64
- ```
65
-
66
- Or for a single package:
67
- ```bash
68
- npx vitest run --dir packages/<pkg>
69
- npx vitest run --dir apps/<app>
70
- ```
71
-
72
- **NEVER** run `pnpm build` or `pnpm test` at the repo root — spawns 5-7 node processes at 800MB each and crashes the machine.
73
-
74
- ### 2. Typecheck per package
75
-
76
- ```bash
77
- npx tsc --noEmit --project packages/<pkg>/tsconfig.json
78
- npx tsc --noEmit --project apps/<app>/tsconfig.json
79
- ```
80
-
81
- One package at a time. Read the full output — zero errors required.
82
-
83
- ### 3. Lint (if configured for the package)
84
-
85
- ```bash
86
- npx eslint <paths> --max-warnings=0
87
- ```
88
-
89
- ### 4. Smoke check exports (if package adds public API)
90
-
91
- ```bash
92
- node -e "const m = require('<pkg>'); console.log(Object.keys(m));"
93
- ```
94
-
95
- Or for ESM:
96
- ```bash
97
- node --input-type=module -e "import * as m from '<pkg>'; console.log(Object.keys(m));"
98
- ```
99
-
100
- ## Rationalization Prevention
101
-
102
- | You're tempted to think... | Reality |
103
- |---|---|
104
- | "Tests passed earlier, should still pass" | Run them now. Code changed. |
105
- | "TypeScript is strict, if it built it works" | You didn't build. Run tsc. |
106
- | "Small change, no need to retest" | Small changes are where regressions hide. |
107
- | "I'll note it as pending verification" | No. Verify now or mark incomplete. |
108
- | "The test file looks right" | Reading ≠ running. Run it. |
109
-
110
- ## Output Format — Required
111
-
112
- When reporting completion, use this structure:
113
-
114
- ```
115
- ## Verification Evidence
116
-
117
- ### vitest
118
- $ npx vitest run --dir packages/hail
119
- Test Files 12 passed (12)
120
- Tests 147 passed (147)
121
-
122
- ### tsc
123
- $ npx tsc --noEmit --project packages/hail/tsconfig.json
124
- (no output — clean)
125
-
58
+
59
+ ```bash
60
+ cd <repo-root>
61
+ for pkg in <changed-packages>; do
62
+ npx vitest run --dir packages/$pkg 2>&1 | tee /tmp/verify-$pkg.log
63
+ done
64
+ ```
65
+
66
+ Or for a single package:
67
+ ```bash
68
+ npx vitest run --dir packages/<pkg>
69
+ npx vitest run --dir apps/<app>
70
+ ```
71
+
72
+ **NEVER** run `pnpm build` or `pnpm test` at the repo root — spawns 5-7 node processes at 800MB each and crashes the machine.
73
+
74
+ ### 2. Typecheck per package
75
+
76
+ ```bash
77
+ npx tsc --noEmit --project packages/<pkg>/tsconfig.json
78
+ npx tsc --noEmit --project apps/<app>/tsconfig.json
79
+ ```
80
+
81
+ One package at a time. Read the full output — zero errors required.
82
+
83
+ ### 3. Lint (if configured for the package)
84
+
85
+ ```bash
86
+ npx eslint <paths> --max-warnings=0
87
+ ```
88
+
89
+ ### 4. Smoke check exports (if package adds public API)
90
+
91
+ ```bash
92
+ node -e "const m = require('<pkg>'); console.log(Object.keys(m));"
93
+ ```
94
+
95
+ Or for ESM:
96
+ ```bash
97
+ node --input-type=module -e "import * as m from '<pkg>'; console.log(Object.keys(m));"
98
+ ```
99
+
100
+ ## Rationalization Prevention
101
+
102
+ | You're tempted to think... | Reality |
103
+ |---|---|
104
+ | "Tests passed earlier, should still pass" | Run them now. Code changed. |
105
+ | "TypeScript is strict, if it built it works" | You didn't build. Run tsc. |
106
+ | "Small change, no need to retest" | Small changes are where regressions hide. |
107
+ | "I'll note it as pending verification" | No. Verify now or mark incomplete. |
108
+ | "The test file looks right" | Reading ≠ running. Run it. |
109
+
110
+ ## Output Format — Required
111
+
112
+ When reporting completion, use this structure:
113
+
114
+ ```
115
+ ## Verification Evidence
116
+
117
+ ### vitest
118
+ $ npx vitest run --dir packages/hail
119
+ Test Files 12 passed (12)
120
+ Tests 147 passed (147)
121
+
122
+ ### tsc
123
+ $ npx tsc --noEmit --project packages/hail/tsconfig.json
124
+ (no output — clean)
125
+
126
126
  ### Status
127
127
  Checklist quality: PASS
128
128
  PASS — safe to mark tasks done.
129
129
  ```
130
130
 
131
131
  If any step fails: do NOT claim completion. Report the failure, fix it, re-run the entire gate.
132
-
133
- ## When to Invoke
134
-
135
- - **End of `/rdc:build`** — mandatory final phase before marking epic done
136
- - **During `/rdc:review`** — verification gate after fixes applied
137
- - **Before any "done" declaration** — if an agent or supervisor is about to say work is complete
138
- - **After merging waves** — when parallel agents finish and their work is combined
139
-
140
- ## Agent Delegation
141
-
142
- When dispatching a verification agent, give them:
143
- - Exact list of packages/apps to verify
132
+
133
+ ## When to Invoke
134
+
135
+ - **End of `/rdc:build`** — mandatory final phase before marking epic done
136
+ - **During `/rdc:review`** — verification gate after fixes applied
137
+ - **Before any "done" declaration** — if an agent or supervisor is about to say work is complete
138
+ - **After merging waves** — when parallel agents finish and their work is combined
139
+
140
+ ## Agent Delegation
141
+
142
+ When dispatching a verification agent, give them:
143
+ - Exact list of packages/apps to verify
144
144
  - Explicit ban on `pnpm build` / `pnpm test` / `pnpm -r`
145
145
  - Work item checklists and the matching plan doc so `decomp-*` quality can be verified first
146
146
  - Required output format (above)
147
147
  - Instruction: "If any command fails, STOP and report. Do not fix. Do not continue."
148
-
149
- ## The Bottom Line
150
-
151
- Evidence before claims. Fresh evidence, not remembered evidence. Full output, not selective reading. If you skip the gate, you are lying about the work being done.
148
+
149
+ ## The Bottom Line
150
+
151
+ Evidence before claims. Fresh evidence, not remembered evidence. Full output, not selective reading. If you skip the gate, you are lying about the work being done.
@@ -1,106 +1,106 @@
1
- > **⚠️ OUTPUT CONTRACT (READ FIRST):** `guides/output-contract.md`
2
- > Checklist-only output. No tool-call narration. No raw MCP/JSON/log dumps.
3
- > One checklist upfront, updated in place, shown again at end with a 1-line verdict.
4
-
5
- > If dispatching subagents or running as a subagent: read `{PROJECT_ROOT}/.rdc/guides/agent-bootstrap.md` first (fallback: `{PROJECT_ROOT}/.rdc/guides/agent-bootstrap.md`).
6
-
7
-
8
- # rdc:viz — Visualization Agent
9
-
10
- ## Mandatory First Steps
11
-
12
- Read BOTH guides before ANY code:
13
- ```
14
- {PROJECT_ROOT}/.rdc/guides/frontend.md (fallback: {PROJECT_ROOT}/.rdc/guides/frontend.md)
15
- {PROJECT_ROOT}/.rdc/guides/design.md (fallback: {PROJECT_ROOT}/.rdc/guides/design.md)
16
- ```
17
-
18
- ## Before Writing Any Code
19
-
20
- 1. **Check for existing prototypes:**
21
- ```sql
22
- SELECT name, component, source_path, status, notes
23
- FROM prototype_registry
24
- WHERE status IN ('prototype', 'converting')
25
- ORDER BY created_at DESC;
26
- ```
27
- Source path is usually `docs/source/`. **Read it first.**
28
-
29
- 2. **Check design decisions:**
30
- ```sql
31
- SELECT topic, summary FROM design_context
32
- WHERE topic ILIKE '%<viz-name>%';
33
- ```
34
-
35
- ## SVG Layout Patterns
36
-
37
- When building new SVG-based viz:
38
- - Define all layout constants at top (`W`, `H`, column x-centers, box dimensions)
39
- - Build path builders as pure functions
40
- - Separate data from rendering
41
- - Use `viewBox` for responsive scaling
42
- - Animate with appropriate motion libraries
43
-
44
- ```tsx
45
- const W = 980, H = 570;
46
- const COL_A = 80, COL_B = 240, COL_C = 435;
47
-
48
- function pathTo(x1: number, y1: number, x2: number, y2: number): string {
49
- const mx = (x1 + x2) / 2;
50
- return `M ${x1} ${y1} C ${mx} ${y1} ${mx} ${y2} ${x2} ${y2}`;
51
- }
52
- ```
53
-
54
- ## Viz Component Contract
55
-
56
- ```tsx
57
- "use client";
58
- import * as React from "react";
59
- import { cva, type VariantProps } from "class-variance-authority";
60
- import { cn } from "../lib/utils";
61
-
62
- // CVA variants required on every new viz component
63
- const myVizVariants = cva("relative w-full", {
64
- variants: {
65
- layout: { single: "", double: "flex flex-col", grid: "" },
66
- density: { compact: "", comfortable: "", spacious: "" },
67
- },
68
- defaultVariants: { layout: "single", density: "comfortable" },
69
- });
70
-
71
- interface MyVizProps
72
- extends React.HTMLAttributes<HTMLDivElement>,
73
- VariantProps<typeof myVizVariants> {}
74
-
75
- const MyViz = React.forwardRef<HTMLDivElement, MyVizProps>(
76
- ({ className, layout, density, ...props }, ref) => (
77
- <div ref={ref} className={cn(myVizVariants({ layout, density }), className)} {...props} />
78
- )
79
- );
80
- MyViz.displayName = "MyViz";
81
- export { MyViz, myVizVariants };
82
- ```
83
-
84
- Export from package's index after building.
85
-
86
- ## Registering New Viz Components
87
-
88
- After completing:
89
- ```sql
90
- INSERT INTO prototype_registry (name, component, source_path, notes, created_by)
91
- VALUES (
92
- 'MyViz v1.0',
93
- 'MyViz',
94
- 'packages/ui/src/components/my-viz.tsx',
95
- 'Production component. Props: <list key props>',
96
- 'agent'
97
- );
98
- ```
99
-
100
- ## Safety Rules
101
-
102
- - Branch: development branch — auto-commit
103
- - NEVER run `pnpm build`
104
- - Reduce motion: always wrap animations with appropriate hooks
105
- - NEVER overlap with other agents on the same component file
106
- - Write tests FIRST — red → implement → green
1
+ > **⚠️ OUTPUT CONTRACT (READ FIRST):** `guides/output-contract.md`
2
+ > Checklist-only output. No tool-call narration. No raw MCP/JSON/log dumps.
3
+ > One checklist upfront, updated in place, shown again at end with a 1-line verdict.
4
+
5
+ > If dispatching subagents or running as a subagent: read `{PROJECT_ROOT}/.rdc/guides/agent-bootstrap.md` first (fallback: `{PROJECT_ROOT}/.rdc/guides/agent-bootstrap.md`).
6
+
7
+
8
+ # rdc:viz — Visualization Agent
9
+
10
+ ## Mandatory First Steps
11
+
12
+ Read BOTH guides before ANY code:
13
+ ```
14
+ {PROJECT_ROOT}/.rdc/guides/frontend.md (fallback: {PROJECT_ROOT}/.rdc/guides/frontend.md)
15
+ {PROJECT_ROOT}/.rdc/guides/design.md (fallback: {PROJECT_ROOT}/.rdc/guides/design.md)
16
+ ```
17
+
18
+ ## Before Writing Any Code
19
+
20
+ 1. **Check for existing prototypes:**
21
+ ```sql
22
+ SELECT name, component, source_path, status, notes
23
+ FROM prototype_registry
24
+ WHERE status IN ('prototype', 'converting')
25
+ ORDER BY created_at DESC;
26
+ ```
27
+ Source path is usually `docs/source/`. **Read it first.**
28
+
29
+ 2. **Check design decisions:**
30
+ ```sql
31
+ SELECT topic, summary FROM design_context
32
+ WHERE topic ILIKE '%<viz-name>%';
33
+ ```
34
+
35
+ ## SVG Layout Patterns
36
+
37
+ When building new SVG-based viz:
38
+ - Define all layout constants at top (`W`, `H`, column x-centers, box dimensions)
39
+ - Build path builders as pure functions
40
+ - Separate data from rendering
41
+ - Use `viewBox` for responsive scaling
42
+ - Animate with appropriate motion libraries
43
+
44
+ ```tsx
45
+ const W = 980, H = 570;
46
+ const COL_A = 80, COL_B = 240, COL_C = 435;
47
+
48
+ function pathTo(x1: number, y1: number, x2: number, y2: number): string {
49
+ const mx = (x1 + x2) / 2;
50
+ return `M ${x1} ${y1} C ${mx} ${y1} ${mx} ${y2} ${x2} ${y2}`;
51
+ }
52
+ ```
53
+
54
+ ## Viz Component Contract
55
+
56
+ ```tsx
57
+ "use client";
58
+ import * as React from "react";
59
+ import { cva, type VariantProps } from "class-variance-authority";
60
+ import { cn } from "../lib/utils";
61
+
62
+ // CVA variants required on every new viz component
63
+ const myVizVariants = cva("relative w-full", {
64
+ variants: {
65
+ layout: { single: "", double: "flex flex-col", grid: "" },
66
+ density: { compact: "", comfortable: "", spacious: "" },
67
+ },
68
+ defaultVariants: { layout: "single", density: "comfortable" },
69
+ });
70
+
71
+ interface MyVizProps
72
+ extends React.HTMLAttributes<HTMLDivElement>,
73
+ VariantProps<typeof myVizVariants> {}
74
+
75
+ const MyViz = React.forwardRef<HTMLDivElement, MyVizProps>(
76
+ ({ className, layout, density, ...props }, ref) => (
77
+ <div ref={ref} className={cn(myVizVariants({ layout, density }), className)} {...props} />
78
+ )
79
+ );
80
+ MyViz.displayName = "MyViz";
81
+ export { MyViz, myVizVariants };
82
+ ```
83
+
84
+ Export from package's index after building.
85
+
86
+ ## Registering New Viz Components
87
+
88
+ After completing:
89
+ ```sql
90
+ INSERT INTO prototype_registry (name, component, source_path, notes, created_by)
91
+ VALUES (
92
+ 'MyViz v1.0',
93
+ 'MyViz',
94
+ 'packages/ui/src/components/my-viz.tsx',
95
+ 'Production component. Props: <list key props>',
96
+ 'agent'
97
+ );
98
+ ```
99
+
100
+ ## Safety Rules
101
+
102
+ - Branch: development branch — auto-commit
103
+ - NEVER run `pnpm build`
104
+ - Reduce motion: always wrap animations with appropriate hooks
105
+ - NEVER overlap with other agents on the same component file
106
+ - Write tests FIRST — red → implement → green
@@ -0,0 +1,43 @@
1
+ # Engineering Behavior
2
+
3
+ Use this with `agent-bootstrap.md` for implementation and review work. These
4
+ rules adapt general coding-agent hygiene into the RDC work-item contract.
5
+
6
+ ## Before Editing
7
+
8
+ - State material assumptions in the work-item report; ask or block when the
9
+ ambiguity changes architecture, data shape, security, or user-visible scope.
10
+ - Prefer the smallest change that satisfies the assigned checklist rows.
11
+ - Do not add features, abstractions, configurability, or fallback behavior that
12
+ is not required by the work item.
13
+ - If a simpler path exists than the apparent request, report the tradeoff before
14
+ widening the implementation.
15
+
16
+ ## While Editing
17
+
18
+ - Stay inside the assigned files, package, route, or work-item boundary.
19
+ - Match the local style and contracts already in the touched files.
20
+ - Do not reformat, rename, or refactor adjacent code unless the checklist row
21
+ explicitly requires it.
22
+ - Clean up only the unused imports, variables, files, or branches created by
23
+ your own change.
24
+ - If existing code looks dead or wrong but is outside scope, list it as a
25
+ blocker or follow-up. Do not remove it.
26
+
27
+ ## Verification
28
+
29
+ - Every completed row needs evidence: test output, route probe, SQL result,
30
+ screenshot artifact, type-check output, CLI transcript, or reviewer citation.
31
+ - Finding an existing file is not evidence. Verify the required behavior.
32
+ - Tick each `decomp-*` and `test-*` checklist item immediately after proving
33
+ that exact behavior. Do not batch ticks at the end.
34
+ - Record assumptions, deviations, uncertainty, blockers, files changed, and
35
+ verification in `submit_implementation_report()` before moving to `review`.
36
+
37
+ ## Escalation
38
+
39
+ - Stop and report `BLOCKED` when the fix requires files outside scope, a broader
40
+ architectural choice, a missing credential, or a second repeated failure.
41
+ - In unattended mode, choose the most conservative valid path only when the
42
+ acceptance criteria remain unchanged; otherwise escalate through the advisor
43
+ path required by the active skill.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lifeaitools/rdc-skills",
3
- "version": "0.9.33",
3
+ "version": "0.9.34",
4
4
  "description": "RDC typed-agent dispatch skill suite for Claude Code - plan, build, review, overnight builds",
5
5
  "keywords": [
6
6
  "claude-code",
@@ -19,7 +19,7 @@
19
19
  "type": "plugin",
20
20
  "skills": "skills/",
21
21
  "guides": "guides/",
22
- "version": "0.9.33",
22
+ "version": "0.9.34",
23
23
  "commands": "commands/"
24
24
  },
25
25
  "scripts": {
@@ -100,6 +100,22 @@ function copyDirRecursive(src, dst) {
100
100
  }
101
101
  }
102
102
 
103
+ function copyMissingProjectGuides(projectRoot) {
104
+ if (!projectRoot) return 0;
105
+ const src = path.join(repoRoot, 'guides');
106
+ const dst = path.join(projectRoot, '.rdc', 'guides');
107
+ if (!fs.existsSync(src) || !fs.existsSync(dst)) return 0;
108
+ let copied = 0;
109
+ for (const entry of fs.readdirSync(src, { withFileTypes: true })) {
110
+ if (!entry.isFile() || !entry.name.endsWith('.md')) continue;
111
+ const target = path.join(dst, entry.name);
112
+ if (fs.existsSync(target)) continue;
113
+ fs.copyFileSync(path.join(src, entry.name), target);
114
+ copied++;
115
+ }
116
+ return copied;
117
+ }
118
+
103
119
  function readJson(p, fallback = {}) {
104
120
  if (!fs.existsSync(p)) return fallback;
105
121
  try { return JSON.parse(fs.readFileSync(p, 'utf8')); } catch { return fallback; }
@@ -780,6 +796,12 @@ async function main() {
780
796
  } else {
781
797
  info('[2.7] Symlinks — no rdc skill links created (skills may already be linked)');
782
798
  }
799
+ const projectGuideCount = copyMissingProjectGuides(codexRoot);
800
+ if (projectGuideCount > 0) {
801
+ ok(`[2.8] Guides — ${projectGuideCount} missing guide(s) copied to ${path.join(codexRoot, '.rdc', 'guides')}`);
802
+ } else {
803
+ info('[2.8] Guides — project .rdc/guides already has base guide files or is absent');
804
+ }
783
805
  } else {
784
806
  info('[2.7] Symlinks — skipped (no codex root found)');
785
807
  }