@lifeaitools/rdc-skills 0.24.38 → 0.24.39
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/.claude/settings.json +15 -15
- package/.claude-plugin/marketplace.json +21 -21
- package/.claude-plugin/plugin.json +1371 -1371
- package/.github/workflows/publish.yml +34 -34
- package/.github/workflows/self-test.yml +58 -58
- package/CHANGELOG.md +310 -310
- package/LICENSE +21 -21
- package/MANIFEST.md +221 -221
- package/README.md +377 -377
- package/README.sandbox.md +3 -3
- package/assets/watcher/viewer.html +164 -164
- package/bin/rdc-skills-mcp.mjs +316 -316
- package/commands/build.md +183 -183
- package/commands/collab.md +180 -180
- package/commands/deploy.md +152 -152
- package/commands/design.md +31 -31
- package/commands/edit.md +28 -28
- package/commands/fixit.md +124 -124
- package/commands/handoff.md +173 -173
- package/commands/help.md +95 -95
- package/commands/overnight.md +220 -220
- package/commands/plan.md +158 -158
- package/commands/preplan.md +131 -131
- package/commands/prototype.md +145 -145
- package/commands/release.md +49 -49
- package/commands/report.md +99 -99
- package/commands/review.md +120 -120
- package/commands/self-test.md +113 -113
- package/commands/status.md +86 -86
- package/commands/watch.md +98 -98
- package/commands/workitems.md +137 -137
- package/git-sha.json +1 -1
- package/guides/agent-bootstrap.md +295 -295
- package/guides/agents/backend.md +104 -104
- package/guides/agents/content.md +94 -94
- package/guides/agents/cs2.md +56 -56
- package/guides/agents/data.md +87 -87
- package/guides/agents/design.md +77 -77
- package/guides/agents/frontend.md +92 -92
- package/guides/agents/infrastructure.md +81 -81
- package/guides/agents/setup.md +281 -281
- package/guides/agents/verify.md +151 -151
- package/guides/agents/viz.md +106 -106
- package/guides/backend.md +146 -146
- package/guides/content.md +147 -147
- package/guides/cs2.md +190 -190
- package/guides/data.md +123 -123
- package/guides/design.md +116 -116
- package/guides/engineering-behavior.md +43 -43
- package/guides/escalation-protocol.md +125 -125
- package/guides/frontend.md +151 -151
- package/guides/history-md-spec.md +297 -297
- package/guides/infrastructure.md +179 -179
- package/guides/lessons-learned-spec.md +153 -153
- package/guides/output-contract.md +108 -108
- package/guides/publish-md-spec.md +289 -289
- package/guides/rdc-skills-startup.md +30 -30
- package/guides/verify.md +11 -11
- package/hooks/check-cwd.js +31 -31
- package/hooks/check-rdc-environment.js +164 -164
- package/hooks/check-services.js +6 -6
- package/hooks/check-stale-work-items.js +19 -19
- package/hooks/foreground-process-gate.js +128 -128
- package/hooks/gate-watchdog-selfcheck.js +257 -257
- package/hooks/hook-logger.js +25 -25
- package/hooks/lib/run-evidence-gate.mjs +241 -241
- package/hooks/no-stop-open-epics.js +127 -127
- package/hooks/post-tool-batch-gate.js +203 -203
- package/hooks/post-work-check.js +21 -21
- package/hooks/postcompact-log.js +13 -13
- package/hooks/precompact-log.js +13 -13
- package/hooks/rate-limit-retry.js +46 -46
- package/hooks/rdc-invocation-marker.js +157 -157
- package/hooks/rdc-output-contract-gate.js +94 -94
- package/hooks/require-work-item-on-commit.js +294 -294
- package/hooks/restart-brief.js +19 -19
- package/hooks/run-hidden-hook.ps1 +47 -47
- package/hooks/task-completed-gate.js +274 -274
- package/hooks/work-item-exit-gate.js +944 -944
- package/lib/catalog.mjs +236 -236
- package/lib/cloud-rewrite.mjs +155 -155
- package/package.json +56 -56
- package/rules/work-items-rpc.md +520 -520
- package/scaffold/templates/HISTORY.md.template +39 -39
- package/scaffold/templates/PUBLISH.md.template +21 -21
- package/scaffold/templates/brochure-studio-default.html +70 -70
- package/scripts/acceptance.mjs +502 -502
- package/scripts/fixtures/guides/bad-guide.md +15 -15
- package/scripts/fixtures/guides-clean/good-guide.md +16 -16
- package/scripts/install-rdc-skills.js +1289 -1289
- package/scripts/install.ps1 +202 -202
- package/scripts/install.sh +132 -132
- package/scripts/lib/assertions.mjs +287 -287
- package/scripts/lib/manifest-schema.mjs +754 -754
- package/scripts/lib/runner.mjs +465 -465
- package/scripts/lib/sandbox.mjs +435 -435
- package/scripts/prepack.mjs +32 -32
- package/scripts/rdc-brochure.mjs +464 -464
- package/scripts/rdc-design-cli.mjs +134 -134
- package/scripts/rebuild-mcp.mjs +107 -107
- package/scripts/self-test.mjs +1460 -1460
- package/scripts/stamp-git-sha.mjs +29 -29
- package/scripts/test-guide-validator.mjs +196 -196
- package/scripts/test-rdc-hooks.mjs +145 -145
- package/scripts/uninstall.ps1 +77 -77
- package/scripts/uninstall.sh +69 -69
- package/scripts/update.ps1 +43 -43
- package/scripts/update.sh +43 -43
- package/scripts/validate-place-histories.js +461 -461
- package/scripts/validate-publish-manifests.js +424 -424
- package/scripts/watch-init.mjs +100 -100
- package/skills/brochure/SKILL.md +107 -107
- package/skills/build/SKILL.md +563 -563
- package/skills/channel-formatter/SKILL.md +533 -533
- package/skills/co-develop/SKILL.md +196 -196
- package/skills/collab/SKILL.md +239 -239
- package/skills/convert/SKILL.md +140 -140
- package/skills/deploy/SKILL.md +541 -541
- package/skills/design/SKILL.md +211 -211
- package/skills/design/reference/ownership.md +16 -16
- package/skills/design/reference/rampa.md +92 -92
- package/skills/design/reference/studio-model.md +153 -153
- package/skills/edit/SKILL.md +98 -98
- package/skills/fixit/SKILL.md +165 -165
- package/skills/fs-mcp/SKILL.md +148 -148
- package/skills/handoff/SKILL.md +236 -200
- package/skills/help/SKILL.md +143 -143
- package/skills/housekeeping/SKILL.md +189 -189
- package/skills/lifeai-brochure-author/SKILL.md +340 -340
- package/skills/overnight/SKILL.md +251 -251
- package/skills/plan/SKILL.md +345 -345
- package/skills/preplan/SKILL.md +90 -90
- package/skills/prototype/SKILL.md +150 -150
- package/skills/rdc-brochurify/SKILL.md +245 -245
- package/skills/rdc-extract-verifier-rules/SKILL.md +191 -191
- package/skills/release/SKILL.md +140 -140
- package/skills/report/SKILL.md +100 -100
- package/skills/review/SKILL.md +152 -152
- package/skills/rpms-filemap/SKILL.cloud.md +111 -111
- package/skills/rpms-filemap/SKILL.md +111 -111
- package/skills/self-test/SKILL.md +132 -132
- package/skills/status/SKILL.md +99 -99
- package/skills/terminal-config/SKILL.md +62 -62
- package/skills/tests/MATRIX.md +54 -54
- package/skills/tests/README.md +47 -47
- package/skills/tests/rdc-brochure.test.json +34 -34
- package/skills/tests/rdc-build.test.json +36 -36
- package/skills/tests/rdc-channel-formatter.test.json +45 -45
- package/skills/tests/rdc-co-develop.test.json +29 -29
- package/skills/tests/rdc-collab.test.json +29 -29
- package/skills/tests/rdc-convert.test.json +35 -35
- package/skills/tests/rdc-deploy.test.json +30 -30
- package/skills/tests/rdc-design.test.json +27 -27
- package/skills/tests/rdc-edit.test.json +29 -29
- package/skills/tests/rdc-fixit.test.json +36 -36
- package/skills/tests/rdc-fs-mcp.test.json +36 -36
- package/skills/tests/rdc-handoff.test.json +28 -28
- package/skills/tests/rdc-help.test.json +29 -29
- package/skills/tests/rdc-housekeeping.test.json +31 -31
- package/skills/tests/rdc-lifeai-brochure-author.test.json +35 -35
- package/skills/tests/rdc-overnight.test.json +37 -37
- package/skills/tests/rdc-plan.test.json +27 -27
- package/skills/tests/rdc-preplan.test.json +31 -31
- package/skills/tests/rdc-prototype.test.json +28 -28
- package/skills/tests/rdc-rdc-brochurify.test.json +23 -23
- package/skills/tests/rdc-rdc-extract-verifier-rules.test.json +34 -34
- package/skills/tests/rdc-release.test.json +29 -29
- package/skills/tests/rdc-report.test.json +28 -28
- package/skills/tests/rdc-review.test.json +29 -29
- package/skills/tests/rdc-rpms-filemap.test.json +28 -28
- package/skills/tests/rdc-self-test.test.json +24 -24
- package/skills/tests/rdc-status.test.json +29 -29
- package/skills/tests/rdc-terminal-config.test.json +29 -29
- package/skills/tests/rdc-watch.test.json +24 -24
- package/skills/tests/rdc-workitems.test.json +27 -27
- package/skills/watch/SKILL.md +97 -97
- package/skills/workitems/SKILL.md +151 -151
- package/tests/acceptance.test.mjs +59 -59
- package/tests/channel-formatter.contract.test.mjs +251 -251
- package/tests/curl-surface.test.mjs +289 -289
- package/tests/harness-gates.test.mjs +325 -325
- package/tests/help-surface.test.mjs +61 -61
- package/tests/install-rdc-skills.test.mjs +49 -49
- package/tests/manifest-contract-fields.test.mjs +78 -78
- package/tests/mcp.test.mjs +271 -271
- package/tests/require-work-item-on-commit.test.mjs +162 -162
- package/tests/run-evidence-gate.test.mjs +82 -82
- package/tests/skill-test-matrix.test.mjs +66 -66
- package/tests/validate-skills.js +27 -27
- package/tests/work-item-exit-gate-l2.test.mjs +368 -368
- package/tests/work-item-exit-gate-l3.test.mjs +197 -197
package/lib/cloud-rewrite.mjs
CHANGED
|
@@ -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,56 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "@lifeaitools/rdc-skills",
|
|
3
|
-
"version": "0.24.
|
|
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.39",
|
|
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
|
+
}
|