@lifeaitools/rdc-skills 0.24.38 → 0.24.41

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 (196) hide show
  1. package/.claude/settings.json +15 -15
  2. package/.claude-plugin/marketplace.json +21 -21
  3. package/.claude-plugin/plugin.json +1371 -1371
  4. package/.github/workflows/publish.yml +34 -34
  5. package/.github/workflows/self-test.yml +58 -58
  6. package/CHANGELOG.md +310 -310
  7. package/LICENSE +21 -21
  8. package/MANIFEST.md +221 -221
  9. package/README.md +376 -375
  10. package/README.sandbox.md +3 -3
  11. package/RELEASE.md +42 -0
  12. package/assets/watcher/viewer.html +164 -164
  13. package/bin/rdc-skills-mcp.mjs +316 -316
  14. package/commands/build.md +183 -183
  15. package/commands/collab.md +180 -180
  16. package/commands/deploy.md +152 -152
  17. package/commands/design.md +31 -31
  18. package/commands/edit.md +28 -28
  19. package/commands/fixit.md +124 -124
  20. package/commands/handoff.md +173 -173
  21. package/commands/help.md +95 -95
  22. package/commands/overnight.md +220 -220
  23. package/commands/plan.md +158 -158
  24. package/commands/preplan.md +131 -131
  25. package/commands/prototype.md +145 -145
  26. package/commands/release.md +49 -49
  27. package/commands/report.md +99 -99
  28. package/commands/review.md +120 -120
  29. package/commands/self-test.md +113 -113
  30. package/commands/status.md +86 -86
  31. package/commands/watch.md +98 -98
  32. package/commands/workitems.md +137 -137
  33. package/git-sha.json +1 -1
  34. package/guides/agent-bootstrap.md +295 -295
  35. package/guides/agents/backend.md +104 -104
  36. package/guides/agents/content.md +94 -94
  37. package/guides/agents/cs2.md +56 -56
  38. package/guides/agents/data.md +87 -87
  39. package/guides/agents/design.md +77 -77
  40. package/guides/agents/frontend.md +92 -92
  41. package/guides/agents/infrastructure.md +81 -81
  42. package/guides/agents/setup.md +281 -281
  43. package/guides/agents/verify.md +151 -151
  44. package/guides/agents/viz.md +106 -106
  45. package/guides/backend.md +146 -146
  46. package/guides/content.md +147 -147
  47. package/guides/cs2.md +190 -190
  48. package/guides/data.md +123 -123
  49. package/guides/design.md +116 -116
  50. package/guides/engineering-behavior.md +43 -43
  51. package/guides/escalation-protocol.md +125 -125
  52. package/guides/frontend.md +151 -151
  53. package/guides/history-md-spec.md +297 -297
  54. package/guides/infrastructure.md +179 -179
  55. package/guides/lessons-learned-spec.md +151 -145
  56. package/guides/output-contract.md +108 -108
  57. package/guides/publish-md-spec.md +289 -289
  58. package/guides/rdc-skills-startup.md +30 -30
  59. package/guides/verify.md +11 -11
  60. package/hooks/check-cwd.js +31 -31
  61. package/hooks/check-rdc-environment.js +164 -164
  62. package/hooks/check-services.js +6 -6
  63. package/hooks/check-stale-work-items.js +19 -19
  64. package/hooks/foreground-process-gate.js +128 -128
  65. package/hooks/gate-watchdog-selfcheck.js +257 -257
  66. package/hooks/hook-logger.js +25 -25
  67. package/hooks/lib/run-evidence-gate.mjs +241 -241
  68. package/hooks/no-stop-open-epics.js +127 -127
  69. package/hooks/post-tool-batch-gate.js +203 -203
  70. package/hooks/post-work-check.js +21 -21
  71. package/hooks/postcompact-log.js +13 -13
  72. package/hooks/precompact-log.js +13 -13
  73. package/hooks/rate-limit-retry.js +46 -46
  74. package/hooks/rdc-invocation-marker.js +157 -157
  75. package/hooks/rdc-output-contract-gate.js +94 -94
  76. package/hooks/require-work-item-on-commit.js +294 -294
  77. package/hooks/restart-brief.js +19 -19
  78. package/hooks/run-hidden-hook.ps1 +47 -47
  79. package/hooks/task-completed-gate.js +274 -274
  80. package/hooks/work-item-exit-gate.js +944 -944
  81. package/lib/catalog.mjs +236 -236
  82. package/lib/cloud-rewrite.mjs +155 -155
  83. package/package.json +57 -56
  84. package/rules/work-items-rpc.md +520 -520
  85. package/scaffold/templates/HISTORY.md.template +39 -39
  86. package/scaffold/templates/PUBLISH.md.template +21 -21
  87. package/scaffold/templates/brochure-studio-default.html +70 -70
  88. package/scripts/acceptance.mjs +502 -502
  89. package/scripts/fixtures/guides/bad-guide.md +15 -15
  90. package/scripts/fixtures/guides-clean/good-guide.md +16 -16
  91. package/scripts/install-rdc-skills.js +1289 -1289
  92. package/scripts/install.ps1 +202 -202
  93. package/scripts/install.sh +132 -132
  94. package/scripts/lib/assertions.mjs +287 -287
  95. package/scripts/lib/manifest-schema.mjs +754 -754
  96. package/scripts/lib/runner.mjs +465 -465
  97. package/scripts/lib/sandbox.mjs +435 -435
  98. package/scripts/prepack.mjs +32 -32
  99. package/scripts/rdc-brochure.mjs +482 -464
  100. package/scripts/rdc-design-cli.mjs +134 -134
  101. package/scripts/rebuild-mcp.mjs +107 -107
  102. package/scripts/self-test.mjs +1460 -1460
  103. package/scripts/stamp-git-sha.mjs +29 -29
  104. package/scripts/test-guide-validator.mjs +196 -196
  105. package/scripts/test-rdc-hooks.mjs +145 -145
  106. package/scripts/uninstall.ps1 +77 -77
  107. package/scripts/uninstall.sh +69 -69
  108. package/scripts/update.ps1 +43 -43
  109. package/scripts/update.sh +43 -43
  110. package/scripts/validate-place-histories.js +461 -461
  111. package/scripts/validate-publish-manifests.js +424 -424
  112. package/scripts/watch-init.mjs +100 -100
  113. package/skills/brochure/SKILL.md +107 -107
  114. package/skills/build/SKILL.md +563 -563
  115. package/skills/channel-formatter/SKILL.md +533 -533
  116. package/skills/co-develop/SKILL.md +196 -196
  117. package/skills/collab/SKILL.md +239 -239
  118. package/skills/convert/SKILL.md +140 -140
  119. package/skills/deploy/SKILL.md +541 -541
  120. package/skills/design/SKILL.md +211 -211
  121. package/skills/design/reference/ownership.md +16 -16
  122. package/skills/design/reference/rampa.md +92 -92
  123. package/skills/design/reference/studio-model.md +153 -153
  124. package/skills/edit/SKILL.md +98 -98
  125. package/skills/fixit/SKILL.md +165 -165
  126. package/skills/fs-mcp/SKILL.md +148 -148
  127. package/skills/handoff/SKILL.md +236 -200
  128. package/skills/help/SKILL.md +143 -143
  129. package/skills/housekeeping/SKILL.md +219 -160
  130. package/skills/lifeai-brochure-author/SKILL.md +340 -340
  131. package/skills/overnight/SKILL.md +251 -251
  132. package/skills/plan/SKILL.md +345 -345
  133. package/skills/preplan/SKILL.md +90 -90
  134. package/skills/prototype/SKILL.md +150 -150
  135. package/skills/rdc-brochurify/SKILL.md +245 -245
  136. package/skills/rdc-extract-verifier-rules/SKILL.md +191 -191
  137. package/skills/release/SKILL.md +140 -140
  138. package/skills/report/SKILL.md +100 -100
  139. package/skills/review/SKILL.md +152 -152
  140. package/skills/rpms-filemap/SKILL.cloud.md +111 -111
  141. package/skills/rpms-filemap/SKILL.md +111 -111
  142. package/skills/self-test/SKILL.md +132 -132
  143. package/skills/status/SKILL.md +99 -99
  144. package/skills/terminal-config/SKILL.md +62 -62
  145. package/skills/tests/MATRIX.md +54 -54
  146. package/skills/tests/README.md +47 -47
  147. package/skills/tests/rdc-brochure.test.json +34 -34
  148. package/skills/tests/rdc-build.test.json +36 -36
  149. package/skills/tests/rdc-channel-formatter.test.json +45 -45
  150. package/skills/tests/rdc-co-develop.test.json +29 -29
  151. package/skills/tests/rdc-collab.test.json +29 -29
  152. package/skills/tests/rdc-convert.test.json +35 -35
  153. package/skills/tests/rdc-deploy.test.json +30 -30
  154. package/skills/tests/rdc-design.test.json +27 -27
  155. package/skills/tests/rdc-edit.test.json +29 -29
  156. package/skills/tests/rdc-fixit.test.json +36 -36
  157. package/skills/tests/rdc-fs-mcp.test.json +36 -36
  158. package/skills/tests/rdc-handoff.test.json +28 -28
  159. package/skills/tests/rdc-help.test.json +29 -29
  160. package/skills/tests/rdc-housekeeping.test.json +32 -28
  161. package/skills/tests/rdc-lifeai-brochure-author.test.json +35 -35
  162. package/skills/tests/rdc-overnight.test.json +37 -37
  163. package/skills/tests/rdc-plan.test.json +27 -27
  164. package/skills/tests/rdc-preplan.test.json +31 -31
  165. package/skills/tests/rdc-prototype.test.json +28 -28
  166. package/skills/tests/rdc-rdc-brochurify.test.json +23 -23
  167. package/skills/tests/rdc-rdc-extract-verifier-rules.test.json +34 -34
  168. package/skills/tests/rdc-release.test.json +29 -29
  169. package/skills/tests/rdc-report.test.json +28 -28
  170. package/skills/tests/rdc-review.test.json +29 -29
  171. package/skills/tests/rdc-rpms-filemap.test.json +28 -28
  172. package/skills/tests/rdc-self-test.test.json +24 -24
  173. package/skills/tests/rdc-status.test.json +29 -29
  174. package/skills/tests/rdc-terminal-config.test.json +29 -29
  175. package/skills/tests/rdc-watch.test.json +24 -24
  176. package/skills/tests/rdc-workitems.test.json +27 -27
  177. package/skills/watch/SKILL.md +97 -97
  178. package/skills/workitems/SKILL.md +151 -151
  179. package/tests/acceptance.test.mjs +59 -59
  180. package/tests/channel-formatter.contract.test.mjs +251 -251
  181. package/tests/curl-surface.test.mjs +289 -289
  182. package/tests/harness-gates.test.mjs +325 -325
  183. package/tests/help-surface.test.mjs +61 -61
  184. package/tests/housekeeping-lessons-triage.test.mjs +49 -0
  185. package/tests/install-rdc-skills.test.mjs +49 -49
  186. package/tests/lessons-pipeline-contract.test.mjs +26 -0
  187. package/tests/manifest-contract-fields.test.mjs +78 -78
  188. package/tests/mcp.test.mjs +271 -271
  189. package/tests/rdc-brochure.test.mjs +125 -0
  190. package/tests/release-contract.test.mjs +16 -0
  191. package/tests/require-work-item-on-commit.test.mjs +162 -162
  192. package/tests/run-evidence-gate.test.mjs +82 -82
  193. package/tests/skill-test-matrix.test.mjs +66 -66
  194. package/tests/validate-skills.js +27 -27
  195. package/tests/work-item-exit-gate-l2.test.mjs +368 -368
  196. package/tests/work-item-exit-gate-l3.test.mjs +197 -197
@@ -1,155 +1,155 @@
1
- /**
2
- * lib/cloud-rewrite.mjs — transform a CLI SKILL.md body into a cloud
3
- * (claude.ai web) body.
4
- *
5
- * The CLI bodies assume a Claude Code session on Dave's Windows host: a local
6
- * clauth HTTP daemon at 127.0.0.1:52437, a local shell, PM2, git, pnpm, and
7
- * local node scripts. The claude.ai web client has NONE of those — it reaches
8
- * credentials through the clauth MCP and the filesystem through the File System
9
- * MCP, and it cannot run local processes at all.
10
- *
11
- * `toCloudBody(markdown)` applies rule-based rewrites:
12
- * 1. clauth daemon curl → "retrieve `<svc>` via the clauth MCP"
13
- * 2. local shell/Bash fs ops + local `fs` → File System MCP tools
14
- * 3. CLI-only mechanics (PM2 reload, git push, local node scripts, daemon
15
- * restart, pnpm) → annotated with a callout (NOT deleted — the cloud
16
- * caller needs to know to hand that step to a Claude Code session).
17
- *
18
- * The rewriter is intentionally rule-based and conservative: it annotates rather
19
- * than rips out, so no information is lost. A hand-tuned `SKILL.cloud.md` (handled
20
- * by the caller in catalog.mjs) bypasses this entirely.
21
- *
22
- * Contract: the cloud body for `deploy` MUST NOT contain `127.0.0.1:52437`.
23
- */
24
-
25
- const CLI_CALLOUT = '> ⚠ CLI-only step — hand this to a Claude Code session.';
26
-
27
- /**
28
- * Rule 1 — clauth daemon credential retrieval.
29
- * Matches `curl ... http://127.0.0.1:52437/v/<svc>` (and /get/<svc>), with or
30
- * without flags, optionally wrapped in $(...). Collapses to instruction text.
31
- */
32
- function rewriteClauthCurls(md) {
33
- let out = md;
34
-
35
- // `_VAR=$(curl ... 127.0.0.1:52437/v/<svc>)` → assignment-style instruction
36
- out = out.replace(
37
- /([A-Za-z_][A-Za-z0-9_]*)=\$\(\s*curl[^\n)]*?(?:127\.0\.0\.1|localhost):52437\/(?:v|get)\/([A-Za-z0-9._-]+)[^\n)]*\)/g,
38
- (_m, varName, svc) => `# ${varName}: retrieve \`${svc}\` via the clauth MCP (clauth_inject / clauth_get)`,
39
- );
40
-
41
- // bare `curl ... 127.0.0.1:52437/v/<svc>` → instruction
42
- out = out.replace(
43
- /curl[^\n]*?(?:127\.0\.0\.1|localhost):52437\/(?:v|get)\/([A-Za-z0-9._-]+)[^\n]*/g,
44
- (_m, svc) => `retrieve \`${svc}\` via the clauth MCP (clauth_inject / clauth_get)`,
45
- );
46
-
47
- // any remaining ping/list/other daemon references → MCP instruction
48
- out = out.replace(
49
- /curl[^\n]*?(?:127\.0\.0\.1|localhost):52437\/(?:ping|list-services|status|meta)[^\n]*/g,
50
- 'check clauth health via the clauth MCP (clauth_ping / clauth_status)',
51
- );
52
-
53
- // belt-and-suspenders: kill any stray bare daemon URL still standing
54
- out = out.replace(
55
- /https?:\/\/(?:127\.0\.0\.1|localhost):52437\/(?:v|get)\/([A-Za-z0-9._-]+)/g,
56
- (_m, svc) => `the clauth MCP value for \`${svc}\``,
57
- );
58
- out = out.replace(
59
- /https?:\/\/(?:127\.0\.0\.1|localhost):52437\S*/g,
60
- 'the clauth MCP',
61
- );
62
-
63
- return out;
64
- }
65
-
66
- /**
67
- * Rule 2 — local shell/Bash file ops and a local `fs` → File System MCP.
68
- * We add a one-line note rather than rewriting every cat/ls/grep, since the
69
- * shapes vary wildly; the note tells the cloud caller which tools to reach for.
70
- */
71
- function rewriteFsOps(md) {
72
- let out = md;
73
- // Direct references to a local `fs` module / node fs.
74
- out = out.replace(
75
- /\bnode:fs\b|\brequire\(['"]fs['"]\)\b|\bfrom ['"]fs['"]/g,
76
- 'the File System MCP (fs_read/fs_write/fs_glob/fs_grep)',
77
- );
78
- return out;
79
- }
80
-
81
- /**
82
- * Rule 3 — flag CLI-only mechanics with a callout. We annotate fenced code
83
- * blocks and bullet/numbered lines that contain a CLI-only verb. The callout
84
- * is inserted ABOVE the offending block/line; the content is preserved.
85
- */
86
- const CLI_ONLY_PATTERNS = [
87
- /\bpm2\s+(?:start|restart|reload|delete|stop|list|status)\b/i,
88
- /\bgit\s+push\b/i,
89
- /\bpnpm\b/i,
90
- /\bnpm\s+(?:install|run|publish|ci)\b/i,
91
- /\bnode\s+[A-Za-z0-9_./-]+\.(?:mjs|cjs|js)\b/i,
92
- /\brestart-clauth(?:\.bat)?\b/i,
93
- /\bclauth\s+(?:scrub|restart|serve|lock|unlock)\b/i,
94
- ];
95
-
96
- function isCliOnlyLine(line) {
97
- return CLI_ONLY_PATTERNS.some((re) => re.test(line));
98
- }
99
-
100
- /**
101
- * Walk the markdown line by line. Inside fenced ``` blocks, if ANY line trips a
102
- * CLI-only pattern, emit one callout immediately before the fence. Outside code
103
- * blocks, annotate individual list/prose lines that trip a pattern.
104
- */
105
- function annotateCliOnly(md) {
106
- const lines = md.split('\n');
107
- const out = [];
108
- let i = 0;
109
- while (i < lines.length) {
110
- const line = lines[i];
111
- const fenceMatch = line.match(/^(\s*)```/);
112
- if (fenceMatch) {
113
- // Collect the whole fenced block.
114
- const block = [line];
115
- let j = i + 1;
116
- for (; j < lines.length; j++) {
117
- block.push(lines[j]);
118
- if (/^\s*```/.test(lines[j])) {
119
- j++;
120
- break;
121
- }
122
- }
123
- const hasCliOnly = block.some(isCliOnlyLine);
124
- if (hasCliOnly) out.push(`${fenceMatch[1]}${CLI_CALLOUT}`);
125
- out.push(...block);
126
- i = j;
127
- continue;
128
- }
129
-
130
- // Non-fence line: annotate list/prose lines that trip a pattern, but never
131
- // double-annotate (skip if previous emitted line is already the callout).
132
- if (isCliOnlyLine(line) && out[out.length - 1] !== CLI_CALLOUT) {
133
- const indent = (line.match(/^(\s*)/) || ['', ''])[1];
134
- out.push(`${indent}${CLI_CALLOUT}`);
135
- }
136
- out.push(line);
137
- i++;
138
- }
139
- return out.join('\n');
140
- }
141
-
142
- /**
143
- * Transform a CLI SKILL.md body into the cloud body.
144
- * Order matters: rewrite clauth curls FIRST (they often live in code blocks that
145
- * the CLI-only annotator would otherwise also flag), then fs ops, then annotate
146
- * remaining CLI-only mechanics.
147
- */
148
- export function toCloudBody(markdown) {
149
- if (typeof markdown !== 'string' || !markdown) return markdown;
150
- let out = markdown;
151
- out = rewriteClauthCurls(out);
152
- out = rewriteFsOps(out);
153
- out = annotateCliOnly(out);
154
- return out;
155
- }
1
+ /**
2
+ * lib/cloud-rewrite.mjs — transform a CLI SKILL.md body into a cloud
3
+ * (claude.ai web) body.
4
+ *
5
+ * The CLI bodies assume a Claude Code session on Dave's Windows host: a local
6
+ * clauth HTTP daemon at 127.0.0.1:52437, a local shell, PM2, git, pnpm, and
7
+ * local node scripts. The claude.ai web client has NONE of those — it reaches
8
+ * credentials through the clauth MCP and the filesystem through the File System
9
+ * MCP, and it cannot run local processes at all.
10
+ *
11
+ * `toCloudBody(markdown)` applies rule-based rewrites:
12
+ * 1. clauth daemon curl → "retrieve `<svc>` via the clauth MCP"
13
+ * 2. local shell/Bash fs ops + local `fs` → File System MCP tools
14
+ * 3. CLI-only mechanics (PM2 reload, git push, local node scripts, daemon
15
+ * restart, pnpm) → annotated with a callout (NOT deleted — the cloud
16
+ * caller needs to know to hand that step to a Claude Code session).
17
+ *
18
+ * The rewriter is intentionally rule-based and conservative: it annotates rather
19
+ * than rips out, so no information is lost. A hand-tuned `SKILL.cloud.md` (handled
20
+ * by the caller in catalog.mjs) bypasses this entirely.
21
+ *
22
+ * Contract: the cloud body for `deploy` MUST NOT contain `127.0.0.1:52437`.
23
+ */
24
+
25
+ const CLI_CALLOUT = '> ⚠ CLI-only step — hand this to a Claude Code session.';
26
+
27
+ /**
28
+ * Rule 1 — clauth daemon credential retrieval.
29
+ * Matches `curl ... http://127.0.0.1:52437/v/<svc>` (and /get/<svc>), with or
30
+ * without flags, optionally wrapped in $(...). Collapses to instruction text.
31
+ */
32
+ function rewriteClauthCurls(md) {
33
+ let out = md;
34
+
35
+ // `_VAR=$(curl ... 127.0.0.1:52437/v/<svc>)` → assignment-style instruction
36
+ out = out.replace(
37
+ /([A-Za-z_][A-Za-z0-9_]*)=\$\(\s*curl[^\n)]*?(?:127\.0\.0\.1|localhost):52437\/(?:v|get)\/([A-Za-z0-9._-]+)[^\n)]*\)/g,
38
+ (_m, varName, svc) => `# ${varName}: retrieve \`${svc}\` via the clauth MCP (clauth_inject / clauth_get)`,
39
+ );
40
+
41
+ // bare `curl ... 127.0.0.1:52437/v/<svc>` → instruction
42
+ out = out.replace(
43
+ /curl[^\n]*?(?:127\.0\.0\.1|localhost):52437\/(?:v|get)\/([A-Za-z0-9._-]+)[^\n]*/g,
44
+ (_m, svc) => `retrieve \`${svc}\` via the clauth MCP (clauth_inject / clauth_get)`,
45
+ );
46
+
47
+ // any remaining ping/list/other daemon references → MCP instruction
48
+ out = out.replace(
49
+ /curl[^\n]*?(?:127\.0\.0\.1|localhost):52437\/(?:ping|list-services|status|meta)[^\n]*/g,
50
+ 'check clauth health via the clauth MCP (clauth_ping / clauth_status)',
51
+ );
52
+
53
+ // belt-and-suspenders: kill any stray bare daemon URL still standing
54
+ out = out.replace(
55
+ /https?:\/\/(?:127\.0\.0\.1|localhost):52437\/(?:v|get)\/([A-Za-z0-9._-]+)/g,
56
+ (_m, svc) => `the clauth MCP value for \`${svc}\``,
57
+ );
58
+ out = out.replace(
59
+ /https?:\/\/(?:127\.0\.0\.1|localhost):52437\S*/g,
60
+ 'the clauth MCP',
61
+ );
62
+
63
+ return out;
64
+ }
65
+
66
+ /**
67
+ * Rule 2 — local shell/Bash file ops and a local `fs` → File System MCP.
68
+ * We add a one-line note rather than rewriting every cat/ls/grep, since the
69
+ * shapes vary wildly; the note tells the cloud caller which tools to reach for.
70
+ */
71
+ function rewriteFsOps(md) {
72
+ let out = md;
73
+ // Direct references to a local `fs` module / node fs.
74
+ out = out.replace(
75
+ /\bnode:fs\b|\brequire\(['"]fs['"]\)\b|\bfrom ['"]fs['"]/g,
76
+ 'the File System MCP (fs_read/fs_write/fs_glob/fs_grep)',
77
+ );
78
+ return out;
79
+ }
80
+
81
+ /**
82
+ * Rule 3 — flag CLI-only mechanics with a callout. We annotate fenced code
83
+ * blocks and bullet/numbered lines that contain a CLI-only verb. The callout
84
+ * is inserted ABOVE the offending block/line; the content is preserved.
85
+ */
86
+ const CLI_ONLY_PATTERNS = [
87
+ /\bpm2\s+(?:start|restart|reload|delete|stop|list|status)\b/i,
88
+ /\bgit\s+push\b/i,
89
+ /\bpnpm\b/i,
90
+ /\bnpm\s+(?:install|run|publish|ci)\b/i,
91
+ /\bnode\s+[A-Za-z0-9_./-]+\.(?:mjs|cjs|js)\b/i,
92
+ /\brestart-clauth(?:\.bat)?\b/i,
93
+ /\bclauth\s+(?:scrub|restart|serve|lock|unlock)\b/i,
94
+ ];
95
+
96
+ function isCliOnlyLine(line) {
97
+ return CLI_ONLY_PATTERNS.some((re) => re.test(line));
98
+ }
99
+
100
+ /**
101
+ * Walk the markdown line by line. Inside fenced ``` blocks, if ANY line trips a
102
+ * CLI-only pattern, emit one callout immediately before the fence. Outside code
103
+ * blocks, annotate individual list/prose lines that trip a pattern.
104
+ */
105
+ function annotateCliOnly(md) {
106
+ const lines = md.split('\n');
107
+ const out = [];
108
+ let i = 0;
109
+ while (i < lines.length) {
110
+ const line = lines[i];
111
+ const fenceMatch = line.match(/^(\s*)```/);
112
+ if (fenceMatch) {
113
+ // Collect the whole fenced block.
114
+ const block = [line];
115
+ let j = i + 1;
116
+ for (; j < lines.length; j++) {
117
+ block.push(lines[j]);
118
+ if (/^\s*```/.test(lines[j])) {
119
+ j++;
120
+ break;
121
+ }
122
+ }
123
+ const hasCliOnly = block.some(isCliOnlyLine);
124
+ if (hasCliOnly) out.push(`${fenceMatch[1]}${CLI_CALLOUT}`);
125
+ out.push(...block);
126
+ i = j;
127
+ continue;
128
+ }
129
+
130
+ // Non-fence line: annotate list/prose lines that trip a pattern, but never
131
+ // double-annotate (skip if previous emitted line is already the callout).
132
+ if (isCliOnlyLine(line) && out[out.length - 1] !== CLI_CALLOUT) {
133
+ const indent = (line.match(/^(\s*)/) || ['', ''])[1];
134
+ out.push(`${indent}${CLI_CALLOUT}`);
135
+ }
136
+ out.push(line);
137
+ i++;
138
+ }
139
+ return out.join('\n');
140
+ }
141
+
142
+ /**
143
+ * Transform a CLI SKILL.md body into the cloud body.
144
+ * Order matters: rewrite clauth curls FIRST (they often live in code blocks that
145
+ * the CLI-only annotator would otherwise also flag), then fs ops, then annotate
146
+ * remaining CLI-only mechanics.
147
+ */
148
+ export function toCloudBody(markdown) {
149
+ if (typeof markdown !== 'string' || !markdown) return markdown;
150
+ let out = markdown;
151
+ out = rewriteClauthCurls(out);
152
+ out = rewriteFsOps(out);
153
+ out = annotateCliOnly(out);
154
+ return out;
155
+ }
package/package.json CHANGED
@@ -1,56 +1,57 @@
1
- {
2
- "name": "@lifeaitools/rdc-skills",
3
- "version": "0.24.38",
4
- "description": "RDC typed-agent dispatch skill suite for Claude Code - plan, build, review, overnight builds",
5
- "keywords": [
6
- "claude-code",
7
- "claude-code-plugin",
8
- "rdc",
9
- "skills",
10
- "ai-agents"
11
- ],
12
- "author": "LIFEAI",
13
- "license": "MIT",
14
- "repository": {
15
- "type": "git",
16
- "url": "https://github.com/LIFEAI/rdc-skills.git"
17
- },
18
- "claude": {
19
- "type": "plugin",
20
- "skills": "skills/",
21
- "guides": "guides/",
22
- "version": "0.10.0",
23
- "commands": "commands/"
24
- },
25
- "bin": {
26
- "rdc-skills-install": "scripts/install-rdc-skills.js",
27
- "rdc-skills-self-test": "scripts/self-test.mjs",
28
- "rdc-skills-mcp": "bin/rdc-skills-mcp.mjs"
29
- },
30
- "scripts": {
31
- "install-rdc-skills": "node scripts/install-rdc-skills.js",
32
- "uninstall:win": "powershell -ExecutionPolicy Bypass -File scripts/uninstall.ps1",
33
- "uninstall:unix": "bash scripts/uninstall.sh",
34
- "validate": "node tests/validate-skills.js",
35
- "rdc-design": "node scripts/rdc-design-cli.mjs",
36
- "test:hooks": "node scripts/test-rdc-hooks.mjs",
37
- "test:truth-gate": "node tests/run-evidence-gate.test.mjs && node tests/work-item-exit-gate-l2.test.mjs && node tests/work-item-exit-gate-l3.test.mjs && node tests/require-work-item-on-commit.test.mjs && node tests/harness-gates.test.mjs",
38
- "test:acceptance": "node tests/acceptance.test.mjs && node tests/install-rdc-skills.test.mjs && node tests/help-surface.test.mjs && node tests/manifest-contract-fields.test.mjs && node tests/skill-test-matrix.test.mjs && node tests/curl-surface.test.mjs",
39
- "acceptance": "node scripts/acceptance.mjs --changed",
40
- "test:mcp": "node tests/mcp.test.mjs",
41
- "test:mcp:remote": "node tests/mcp.test.mjs --remote",
42
- "test:curl-surface": "node tests/curl-surface.test.mjs",
43
- "test:curl-surface:remote": "node tests/curl-surface.test.mjs --remote",
44
- "test:channel-formatter": "node tests/channel-formatter.contract.test.mjs",
45
- "test:channel-formatter:remote": "node tests/channel-formatter.contract.test.mjs --remote",
46
- "mcp": "node bin/rdc-skills-mcp.mjs",
47
- "rebuild-mcp": "node scripts/rebuild-mcp.mjs",
48
- "prepack": "node scripts/prepack.mjs"
49
- },
50
- "dependencies": {
51
- "@modelcontextprotocol/sdk": "^1.29.0",
52
- "express": "^5.0.0",
53
- "yaml": "^2.9.0",
54
- "zod": "^3.25.76"
55
- }
56
- }
1
+ {
2
+ "name": "@lifeaitools/rdc-skills",
3
+ "version": "0.24.41",
4
+ "description": "RDC typed-agent dispatch skill suite for Claude Code - plan, build, review, overnight builds",
5
+ "keywords": [
6
+ "claude-code",
7
+ "claude-code-plugin",
8
+ "rdc",
9
+ "skills",
10
+ "ai-agents"
11
+ ],
12
+ "author": "LIFEAI",
13
+ "license": "MIT",
14
+ "repository": {
15
+ "type": "git",
16
+ "url": "https://github.com/LIFEAI/rdc-skills.git"
17
+ },
18
+ "claude": {
19
+ "type": "plugin",
20
+ "skills": "skills/",
21
+ "guides": "guides/",
22
+ "version": "0.10.0",
23
+ "commands": "commands/"
24
+ },
25
+ "bin": {
26
+ "rdc-skills-install": "scripts/install-rdc-skills.js",
27
+ "rdc-skills-self-test": "scripts/self-test.mjs",
28
+ "rdc-skills-mcp": "bin/rdc-skills-mcp.mjs"
29
+ },
30
+ "scripts": {
31
+ "install-rdc-skills": "node scripts/install-rdc-skills.js",
32
+ "uninstall:win": "powershell -ExecutionPolicy Bypass -File scripts/uninstall.ps1",
33
+ "uninstall:unix": "bash scripts/uninstall.sh",
34
+ "validate": "node tests/validate-skills.js",
35
+ "rdc-design": "node scripts/rdc-design-cli.mjs",
36
+ "test:hooks": "node scripts/test-rdc-hooks.mjs",
37
+ "test:truth-gate": "node tests/run-evidence-gate.test.mjs && node tests/work-item-exit-gate-l2.test.mjs && node tests/work-item-exit-gate-l3.test.mjs && node tests/require-work-item-on-commit.test.mjs && node tests/harness-gates.test.mjs",
38
+ "test:acceptance": "node tests/acceptance.test.mjs && node tests/install-rdc-skills.test.mjs && node tests/help-surface.test.mjs && node tests/manifest-contract-fields.test.mjs && node tests/skill-test-matrix.test.mjs && node tests/curl-surface.test.mjs",
39
+ "acceptance": "node scripts/acceptance.mjs --changed",
40
+ "test:mcp": "node tests/mcp.test.mjs",
41
+ "test:mcp:remote": "node tests/mcp.test.mjs --remote",
42
+ "test:curl-surface": "node tests/curl-surface.test.mjs",
43
+ "test:curl-surface:remote": "node tests/curl-surface.test.mjs --remote",
44
+ "test:channel-formatter": "node tests/channel-formatter.contract.test.mjs",
45
+ "test:channel-formatter:remote": "node tests/channel-formatter.contract.test.mjs --remote",
46
+ "test:brochure": "node tests/rdc-brochure.test.mjs",
47
+ "mcp": "node bin/rdc-skills-mcp.mjs",
48
+ "rebuild-mcp": "node scripts/rebuild-mcp.mjs",
49
+ "prepack": "node scripts/prepack.mjs"
50
+ },
51
+ "dependencies": {
52
+ "@modelcontextprotocol/sdk": "^1.29.0",
53
+ "express": "^5.0.0",
54
+ "yaml": "^2.9.0",
55
+ "zod": "^3.25.76"
56
+ }
57
+ }