@lifeaitools/rdc-skills 0.24.12 → 0.24.14

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,6 +1,6 @@
1
1
  {
2
2
  "name": "rdc",
3
- "version": "0.24.12",
3
+ "version": "0.24.14",
4
4
  "description": "RDC typed-agent dispatch skill suite for Claude Code — plan, build, review, overnight unattended builds with work-item tracking and TDD enforcement.",
5
5
  "author": {
6
6
  "name": "LIFEAI",
package/README.md CHANGED
@@ -66,6 +66,61 @@ node scripts/install-rdc-skills.js --project-root /path/to/project --write-start
66
66
 
67
67
  This writes `.rdc/guides/rdc-skills-startup.md` and managed RDC sections in `CLAUDE.md` and `AGENTS.md`.
68
68
 
69
+ ### MCP endpoint and direct curl access
70
+
71
+ The shared MCP endpoint is:
72
+
73
+ ```text
74
+ https://rdc-skills.regendevcorp.com/mcp
75
+ ```
76
+
77
+ Health check:
78
+
79
+ ```bash
80
+ curl -s https://rdc-skills.regendevcorp.com/health
81
+ ```
82
+
83
+ Streamable HTTP MCP calls must use `POST` and include the SSE-compatible
84
+ `Accept` header:
85
+
86
+ ```bash
87
+ curl -s -X POST https://rdc-skills.regendevcorp.com/mcp \
88
+ -H 'Content-Type: application/json' \
89
+ -H 'Accept: application/json, text/event-stream' \
90
+ -d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"curl","version":"1"}}}'
91
+ ```
92
+
93
+ List tools:
94
+
95
+ ```bash
96
+ curl -s -X POST https://rdc-skills.regendevcorp.com/mcp \
97
+ -H 'Content-Type: application/json' \
98
+ -H 'Accept: application/json, text/event-stream' \
99
+ -d '{"jsonrpc":"2.0","id":2,"method":"tools/list"}'
100
+ ```
101
+
102
+ List skills:
103
+
104
+ ```bash
105
+ curl -s -X POST https://rdc-skills.regendevcorp.com/mcp \
106
+ -H 'Content-Type: application/json' \
107
+ -H 'Accept: application/json, text/event-stream' \
108
+ -d '{"jsonrpc":"2.0","id":3,"method":"tools/call","params":{"name":"rdc_skill_list","arguments":{}}}'
109
+ ```
110
+
111
+ Fetch a skill body for a specific caller surface:
112
+
113
+ ```bash
114
+ curl -s -X POST https://rdc-skills.regendevcorp.com/mcp \
115
+ -H 'Content-Type: application/json' \
116
+ -H 'Accept: application/json, text/event-stream' \
117
+ -d '{"jsonrpc":"2.0","id":4,"method":"tools/call","params":{"name":"rdc_skill_get","arguments":{"name":"build","variant":"cli"}}}'
118
+ ```
119
+
120
+ Use `variant:"cli"` for Claude Code/Codex/local terminal instructions. Use
121
+ `variant:"cloud"` for claude.ai web sessions where local daemon, shell, or
122
+ filesystem steps need cloud-safe wording.
123
+
69
124
  ### Legacy install scripts (deprecated since v0.6.0)
70
125
 
71
126
  `scripts/install.sh` and `scripts/install.ps1` copy files into `~/.claude/skills/user/`. These exist only for environments that cannot use the plugin system. Running them alongside the plugin creates duplicates. Do not use them if you have the plugin installed.
@@ -84,7 +139,7 @@ Throughout the skills, the following substitutions have been made to make them p
84
139
 
85
140
  ## Skills Overview
86
141
 
87
- 23 skills organized into 5 categories:
142
+ 29 skills organized into 6 categories:
88
143
 
89
144
  ### Orchestration Skills (workflow drivers)
90
145
  - rdc:build, rdc:plan, rdc:preplan, rdc:review, rdc:overnight, rdc:fixit, rdc:status, rdc:report
@@ -98,13 +153,25 @@ Located in `guides/agents/` — plain markdown playbooks spawned as sub-agents:
98
153
 
99
154
  ### Utility Skills
100
155
  - rdc:collab
156
+ - rdc:co-develop — peer-aware Claude/Codex co-development over clauth
157
+ - rdc:fs-mcp — File System MCP bridge guidance for live repo reads/writes
158
+ - rdc:terminal-config — Windows Terminal and hidden-launch policy audit
159
+ - rdc:watch — session-log viewer initialization for attended sessions
101
160
  - rdc:channel-formatter — channel-native formatting and content repurposing for LinkedIn, Twitter/X, Slack/Teams, email, decks, Word/PDF structure, web copy, and content packs
102
161
 
103
162
  ### Design Skills
104
163
  - rdc:design — RDC/Studio design, tokens, palettes, themes, and Rampa CLI-assisted color systems
105
164
 
165
+ ### Document and Brochure Skills
166
+ - rdc:convert — Office/Markdown conversion via build-corpus
167
+ - rdc:brochure — HTML/folder/zip/URL/Markdown to print-quality PDF
168
+ - rdc:brochurify — six-wave Brochurify orchestration contract
169
+ - lifeai-brochure-author — brochure JSX authoring contract for @lifeai/brochure-kit
170
+ - rdc:extract-verifier-rules — verifier-rule candidates from enhancement logs
171
+ - rpms-filemap — canonical RPMS file-map lookup
172
+
106
173
  ### Reference
107
- - rdc:help
174
+ - rdc:help, rdc:self-test
108
175
 
109
176
  ## Channel Formatting and Content Packs
110
177
 
@@ -203,6 +270,13 @@ skills/
203
270
  release/SKILL.md (atomic package/app release)
204
271
  self-test/SKILL.md (skill suite health check)
205
272
  watch/SKILL.md (session log watcher)
273
+ channel-formatter/SKILL.md (channel-native formatting and content packs)
274
+ convert/SKILL.md (Office/Markdown conversion)
275
+ brochure/SKILL.md (print-quality PDF rendering)
276
+ rdc-brochurify/SKILL.md (Brochurify orchestration)
277
+ lifeai-brochure-author/SKILL.md (brochure JSX authoring)
278
+ rdc-extract-verifier-rules/SKILL.md (verifier rule extraction)
279
+ rpms-filemap/SKILL.md (canonical RPMS file map)
206
280
 
207
281
  guides/agents/ (agent-only playbooks — dispatched by rdc:build, not user-invocable)
208
282
  frontend.md (React, UI, Tailwind)
@@ -224,18 +298,16 @@ scripts/
224
298
  ## Check installed version
225
299
 
226
300
  ```bash
227
- # See version in rdc:help skill
228
- head -4 ~/.claude/skills/user/rdc-help.md # if using manual install
301
+ # Published package
302
+ npm view @lifeaitools/rdc-skills version
229
303
 
230
- # Or check source directly
231
- python3 -c "import json; print(json.load(open('package.json'))['version'])"
304
+ # Installed global package
305
+ npm list -g @lifeaitools/rdc-skills --depth=0
232
306
 
233
- # Or invoke the skill
234
- /rdc:help
307
+ # Running MCP service
308
+ curl -s https://rdc-skills.regendevcorp.com/health
235
309
  ```
236
310
 
237
- Current version: **v0.9.36**
238
-
239
311
  ## Quick Start
240
312
 
241
313
  1. Copy this directory to your project
package/commands/help.md CHANGED
@@ -1,90 +1,72 @@
1
1
  ---
2
2
  name: rdc:help
3
3
  description: >-
4
- Usage `rdc:help` or `rdc` — selection menu of all rdc:* skills with their full argument syntax. Use when unsure which command to invoke or what args it takes.
4
+ Usage `rdc:help` or `rdc` — manifest-driven menu of all rdc:* skills with
5
+ argument syntax, requirements, decision hints, and direct MCP/curl access.
5
6
  ---
6
7
 
7
- > **⚠️ OUTPUT CONTRACT (READ FIRST):** `guides/output-contract.md`
8
- > Checklist-only output. No tool-call narration. No raw MCP/JSON/log dumps.
8
+ > **Output contract:** Checklist/table output only. No raw MCP/JSON/log dumps.
9
9
 
10
+ # rdc:help — Manifest-Driven Command Reference
10
11
 
11
- # rdc:help Command Reference
12
+ Print a concise command reference from the plugin manifest, then stop. Do not
13
+ ask which command to run unless the user explicitly asks for a recommendation.
12
14
 
13
- Print the full usage menu below verbatim, then ask the project lead which command to run.
15
+ ## Source Of Truth
14
16
 
15
- ## Workflow the RDC loop
17
+ Resolve the manifest in this order and use the first existing file:
16
18
 
17
- | Command | Usage |
18
- |---|---|
19
- | `rdc:preplan` | `rdc:preplan <topic> [--unattended]` — research, no code |
20
- | `rdc:plan` | `rdc:plan <topic> [--unattended]` — architecture + epic/tasks |
21
- | `rdc:build` | `rdc:build <epic-id\|topic> [--unattended]` — dispatch agents, commit, close items |
22
- | `rdc:review` | `rdc:review [--unattended]` — typecheck, tests, fix, commit |
23
- | `rdc:report` | `rdc:report [--unattended]` — write `.rdc/reports/YYYY-MM-DD.md` |
24
- | `rdc:overnight` | `rdc:overnight [epic-id\|label=X]` — chain preplan→plan→build→review→report |
25
- | `rdc:status` | `rdc:status` — read-only dashboard |
26
- | `rdc:fixit` | `rdc:fixit <description>` — bypass the loop, <5 files / <30 min |
19
+ 1. `{PLUGIN_ROOT}/.claude-plugin/plugin.json`
20
+ 2. `C:/Dev/rdc-skills/.claude-plugin/plugin.json`
21
+ 3. `~/.claude/plugins/cache/rdc-skills/rdc-skills/latest/.claude-plugin/plugin.json`
27
22
 
28
- ## Ops
23
+ Read `skills_meta` from the manifest. Group entries by `category` in this order:
24
+ `planning`, `build`, `deploy`, `release`, `dev-loop`, `reporting`, `tooling`,
25
+ `infra`.
29
26
 
30
- | Command | Usage |
31
- |---|---|
32
- | `rdc:deploy` | `rdc:deploy <slug> [build-id]` · `rdc:deploy new <slug>` · `rdc:deploy diagnose <slug>` · `rdc:deploy audit [--fix]` |
33
- | `rdc:release` | `rdc:release <repo> [version]` · `rdc:release <repo> --patch\|--minor\|--major` · `rdc:release <repo> --dry-run` |
27
+ For each row, show:
34
28
 
35
- ## Planning ↔ CLI bridge
29
+ ```text
30
+ {slash} — {usage} — needs: {requires or "(none)"} — cf: {yes|no}
31
+ ```
32
+
33
+ At the end, render a short decision tree from `skills_meta[].triggers`.
36
34
 
37
- | Command | Usage |
38
- |---|---|
39
- | `rdc:handoff` | `rdc:handoff <topic>` — finalize plan → work items for CLI |
40
- | `rdc:prototype` | `rdc:prototype <description>` — JSX mock for review |
41
- | `rdc:workitems` | `rdc:workitems <add\|update\|done\|list\|epics> [args]` |
42
- | `rdc:collab` | `rdc:collab --session <id>` — claude.ai bidirectional relay |
43
- | `rdc:design` | `rdc:design <command\|brief>` — RDC/Studio design, tokens, palettes, themes, Rampa CLI |
35
+ If the manifest is unreachable, say `manifest fallback used` and render the
36
+ static fallback table from `skills/help/SKILL.md`.
44
37
 
45
- ## Agent guides (dispatched by rdc:build, not user-invocable)
38
+ ## Direct MCP / curl Access
46
39
 
47
- These live under `guides/agents/` — they are role playbooks the build skill spawns as sub-agents. You do NOT invoke them directly.
40
+ Show this block after the command table so non-Claude callers have the same
41
+ entry point:
48
42
 
49
- - `guides/agents/frontend.md` — [agent-only — dispatched by rdc:build, not user-invocable]
50
- - `guides/agents/backend.md` — [agent-only — dispatched by rdc:build, not user-invocable]
51
- - `guides/agents/data.md` — [agent-only — dispatched by rdc:build, not user-invocable]
52
- - `guides/agents/design.md` — [agent-only — dispatched by rdc:build, not user-invocable]
53
- - `guides/agents/infrastructure.md` — [agent-only — dispatched by rdc:build, not user-invocable]
54
- - `guides/agents/content.md` [agent-only dispatched by rdc:build, not user-invocable]
55
- - `guides/agents/cs2.md` — [agent-only — dispatched by rdc:build, not user-invocable]
56
- - `guides/agents/viz.md` — [agent-only — dispatched by rdc:build, not user-invocable]
57
- - `guides/agents/setup.md` — [agent-only — dispatched by rdc:build, not user-invocable]
58
- - `guides/agents/verify.md` — [agent-only — dispatched by rdc:build, not user-invocable]
43
+ ```text
44
+ MCP endpoint: https://rdc-skills.regendevcorp.com/mcp
45
+ Health: curl -s https://rdc-skills.regendevcorp.com/health
46
+ Header: Accept: application/json, text/event-stream
47
+ Tools: rdc_skill_list, rdc_skill_search, rdc_skill_get
48
+ Variants: cli for Claude Code/Codex/local terminal; cloud for claude.ai
49
+ ```
59
50
 
60
- Each agent reads `.rdc/guides/agent-bootstrap.md` first, then its role guide.
51
+ Minimal curl examples:
61
52
 
62
- ## Decision tree
53
+ ```bash
54
+ curl -s -X POST https://rdc-skills.regendevcorp.com/mcp \
55
+ -H 'Content-Type: application/json' \
56
+ -H 'Accept: application/json, text/event-stream' \
57
+ -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"rdc_skill_list","arguments":{}}}'
63
58
 
64
- ```
65
- Project lead says → invoke
66
- ─────────────────────────────────────────────────
67
- "research this" / "how do others do" → rdc:preplan <topic>
68
- "plan this out" / "architect" → rdc:plan <topic>
69
- "build it" / "go" / "execute" → rdc:build <topic>
70
- "run overnight" / "while I sleep" → rdc:overnight
71
- "quick fix" / "hotfix" / "typo" → rdc:fixit <desc>
72
- "review" / "is it clean" → rdc:review
73
- "report" / "summarize" → rdc:report
74
- "status" / "where are we" → rdc:status
75
- "deploy" / "ship" → rdc:deploy <slug>
76
- "release" / "publish" → rdc:release <repo>
77
- "hand this off" / "give to agents" → rdc:handoff
78
- "show me what it looks like" → rdc:prototype
79
- "add to backlog" / "create a ticket" → rdc:workitems
80
- "design/tokens/palette/theme" → rdc:design <command>
81
- "what commands" / "what skills" → rdc:help
59
+ curl -s -X POST https://rdc-skills.regendevcorp.com/mcp \
60
+ -H 'Content-Type: application/json' \
61
+ -H 'Accept: application/json, text/event-stream' \
62
+ -d '{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"rdc_skill_get","arguments":{"name":"build","variant":"cli"}}}'
82
63
  ```
83
64
 
84
- ## Hard rules (apply everywhere)
65
+ ## Hard Rules
85
66
 
86
- - NEVER `pnpm build` crashes the machine. Typecheck with `npx tsc --noEmit`.
87
- - NEVER commit to `main` without explicit approval. Default branch is `develop`.
88
- - NEVER overlap agents on the same files.
89
- - ALWAYS update work items in real time via RPCs (see `.claude/rules/work-items-rpc.md`).
90
- - ALWAYS credentials via clauth daemon: `curl -s http://127.0.0.1:52437/get/<service>`.
67
+ - `cf: yes` skills must consult CodeFlow before acting.
68
+ - Never run `pnpm build` at monorepo root. Use scoped typecheck/tests.
69
+ - Never commit to `main` without explicit approval.
70
+ - Never overlap agents on the same files.
71
+ - Update work items in real time for skills that require work-items RPCs.
72
+ - Credentials come from clauth: `curl -s http://127.0.0.1:52437/v/<service>`.
package/git-sha.json CHANGED
@@ -1,3 +1,3 @@
1
1
  {
2
- "sha": "c95d7a8fedd016e9bb42eba86c106af7c976a3c5"
2
+ "sha": "090e6c4a0a643acca7ca0bfca384f43cc150dca9"
3
3
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lifeaitools/rdc-skills",
3
- "version": "0.24.12",
3
+ "version": "0.24.14",
4
4
  "description": "RDC typed-agent dispatch skill suite for Claude Code - plan, build, review, overnight builds",
5
5
  "keywords": [
6
6
  "claude-code",
@@ -35,7 +35,7 @@
35
35
  "rdc-design": "node scripts/rdc-design-cli.mjs",
36
36
  "test:hooks": "node scripts/test-rdc-hooks.mjs",
37
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",
38
+ "test:acceptance": "node tests/acceptance.test.mjs && node tests/install-rdc-skills.test.mjs && node tests/help-surface.test.mjs",
39
39
  "acceptance": "node scripts/acceptance.mjs --changed",
40
40
  "test:mcp": "node tests/mcp.test.mjs",
41
41
  "test:mcp:remote": "node tests/mcp.test.mjs --remote",
@@ -102,6 +102,48 @@ function run(cmd, options = {}) {
102
102
  return execSync(cmd, { encoding: 'utf8', stdio: 'pipe', ...options }).trim();
103
103
  }
104
104
 
105
+ function updateCodexMcpToml(toml, mcpUrl) {
106
+ const blockRe = /(^|\n)(\[mcp_servers\.rdc-skills\]\n)([\s\S]*?)(?=\n\[|\s*$)/;
107
+ const desiredLine = `url = '${mcpUrl}'`;
108
+ if (blockRe.test(toml)) {
109
+ return toml.replace(blockRe, (match, prefix, header, body) => {
110
+ if (/^url\s*=.*$/m.test(body)) {
111
+ return `${prefix}${header}${body.replace(/^url\s*=.*$/m, desiredLine)}`;
112
+ }
113
+ const trimmed = body.replace(/\s*$/, '');
114
+ return `${prefix}${header}${trimmed}${trimmed ? '\n' : ''}${desiredLine}\n`;
115
+ });
116
+ }
117
+ return toml.replace(/\s*$/, '\n') + `\n[mcp_servers.rdc-skills]\n${desiredLine}\n`;
118
+ }
119
+
120
+ function selfTestCodexMcpToml() {
121
+ const url = 'https://rdc-skills.regendevcorp.com/mcp';
122
+ const stale = "[mcp_servers.clauth]\nurl = 'https://clauth.regendevcorp.com/mcp'\n\n[mcp_servers.rdc-skills]\nurl = 'https://rdc-skills.dev.regendevcorp.com/mcp'\n\n[mcp_servers.web-research]\nurl = 'https://research.regendevcorp.com/mcp'\n";
123
+ const updated = updateCodexMcpToml(stale, url);
124
+ if (!updated.includes(`url = '${url}'`)) throw new Error('did not write production rdc-skills URL');
125
+ if (updated.includes('rdc-skills.dev.regendevcorp.com')) throw new Error('stale dev URL survived');
126
+ if (!updated.includes('[mcp_servers.clauth]') || !updated.includes('[mcp_servers.web-research]')) throw new Error('neighbor MCP blocks were damaged');
127
+
128
+ const missing = updateCodexMcpToml("[mcp_servers.clauth]\nurl = 'https://clauth.regendevcorp.com/mcp'\n", url);
129
+ if (!missing.includes('[mcp_servers.rdc-skills]')) throw new Error('missing block was not appended');
130
+
131
+ const noUrl = updateCodexMcpToml('[mcp_servers.rdc-skills]\nstartup_timeout_sec = 30\n', url);
132
+ if (!noUrl.includes("startup_timeout_sec = 30") || !noUrl.includes(`url = '${url}'`)) throw new Error('url-less block was not repaired');
133
+
134
+ console.log('install-rdc-skills codex MCP TOML self-test — PASS');
135
+ }
136
+
137
+ if (args.includes('--self-test-codex-mcp-toml')) {
138
+ try {
139
+ selfTestCodexMcpToml();
140
+ process.exit(0);
141
+ } catch (e) {
142
+ console.error(e.message || e);
143
+ process.exit(1);
144
+ }
145
+ }
146
+
105
147
  // ── Filesystem helpers ────────────────────────────────────────────────────────
106
148
  function copyDir(src, dst, ext) {
107
149
  if (!fs.existsSync(src)) { warn(`Source not found: ${src}`); return 0; }
@@ -624,14 +666,14 @@ function registerMcpEndpoints() {
624
666
  }
625
667
  } catch (e) { out.push(`claude WARN:${e.message}`); }
626
668
 
627
- // Codex — append [mcp_servers.rdc-skills] to ~/.codex/config.toml if absent.
669
+ // Codex — ensure [mcp_servers.rdc-skills] exists and points at the live shared endpoint.
628
670
  try {
629
671
  const codexToml = path.join(os.homedir(), '.codex', 'config.toml');
630
672
  if (fs.existsSync(codexToml)) {
631
673
  const toml = fs.readFileSync(codexToml, 'utf8');
632
- if (!/\[mcp_servers\.rdc-skills\]/.test(toml)) {
633
- const block = `\n[mcp_servers.rdc-skills]\nurl = '${MCP_URL}'\n`;
634
- fs.writeFileSync(codexToml, toml.replace(/\s*$/, '\n') + block);
674
+ const next = updateCodexMcpToml(toml, MCP_URL);
675
+ if (next !== toml) {
676
+ fs.writeFileSync(codexToml, next);
635
677
  out.push('codex(~/.codex/config.toml)');
636
678
  }
637
679
  }
@@ -21,7 +21,8 @@ description: "Usage `rdc:help` — Show all rdc:* skills with usage, requirement
21
21
  3. Group entries by `category` in this order: `planning, build, deploy, release, dev-loop, reporting, tooling, infra`.
22
22
  4. For each entry render one row: `{slash} — {usage} — needs: {requires.join(',')} — cf: {codeflow_required ? 'yes' : 'no'}`.
23
23
  5. Print a Decision Tree at the end that maps natural-language phrases to skills, derived from each entry's `triggers[]`.
24
- 6. Hard rules section at the bottom (see below verbatim).
24
+ 6. Print the Direct MCP / curl Access block so non-Claude callers have the same entry point.
25
+ 7. Hard rules section at the bottom (see below — verbatim).
25
26
 
26
27
  ## Required output format
27
28
 
@@ -86,6 +87,26 @@ RDC SKILLS — manifest: .claude-plugin/plugin.json @ v{version}
86
87
  "claude.ai relay" / "collab session" → /rdc:collab
87
88
  "palette" / "studio design" / "tokens" → /rdc:design
88
89
 
90
+ ## Direct MCP / curl Access
91
+
92
+ MCP endpoint: https://rdc-skills.regendevcorp.com/mcp
93
+ Health: curl -s https://rdc-skills.regendevcorp.com/health
94
+ Header: Accept: application/json, text/event-stream
95
+ Tools: rdc_skill_list, rdc_skill_search, rdc_skill_get
96
+ Variants: cli for Claude Code/Codex/local terminal; cloud for claude.ai
97
+
98
+ List skills:
99
+ curl -s -X POST https://rdc-skills.regendevcorp.com/mcp \
100
+ -H 'Content-Type: application/json' \
101
+ -H 'Accept: application/json, text/event-stream' \
102
+ -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"rdc_skill_list","arguments":{}}}'
103
+
104
+ Fetch a skill:
105
+ curl -s -X POST https://rdc-skills.regendevcorp.com/mcp \
106
+ -H 'Content-Type: application/json' \
107
+ -H 'Accept: application/json, text/event-stream' \
108
+ -d '{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"rdc_skill_get","arguments":{"name":"build","variant":"cli"}}}'
109
+
89
110
  ## Hard rules
90
111
 
91
112
  - `cf: yes` skills MUST consult CodeFlow before acting. Hooks fail-closed on unreachable CodeFlow for these.
@@ -0,0 +1,33 @@
1
+ #!/usr/bin/env node
2
+ import assert from 'node:assert/strict';
3
+ import { readFileSync } from 'node:fs';
4
+ import { dirname, join, resolve } from 'node:path';
5
+ import { fileURLToPath } from 'node:url';
6
+
7
+ const __dirname = dirname(fileURLToPath(import.meta.url));
8
+ const root = resolve(__dirname, '..');
9
+
10
+ const files = {
11
+ readme: join(root, 'README.md'),
12
+ skillHelp: join(root, 'skills', 'help', 'SKILL.md'),
13
+ commandHelp: join(root, 'commands', 'help.md'),
14
+ };
15
+
16
+ const docs = Object.fromEntries(
17
+ Object.entries(files).map(([key, file]) => [key, readFileSync(file, 'utf8')]),
18
+ );
19
+
20
+ for (const [name, text] of Object.entries(docs)) {
21
+ assert.match(text, /https:\/\/rdc-skills\.regendevcorp\.com\/mcp/, `${name} must expose production MCP endpoint`);
22
+ assert.match(text, /Accept: application\/json, text\/event-stream/, `${name} must show Streamable HTTP Accept header`);
23
+ assert.match(text, /rdc_skill_list/, `${name} must mention rdc_skill_list`);
24
+ assert.match(text, /rdc_skill_get/, `${name} must mention rdc_skill_get`);
25
+ assert.doesNotMatch(text, /https:\/\/rdc-skills\.dev\.regendevcorp\.com\/mcp/, `${name} must not point callers at dev MCP`);
26
+ }
27
+
28
+ assert.match(docs.skillHelp, /manifest-driven/i, 'skill help should be manifest-driven');
29
+ assert.match(docs.commandHelp, /manifest-driven/i, 'command help should be manifest-driven');
30
+ assert.doesNotMatch(docs.commandHelp, /Print the full usage menu below verbatim/, 'command help must not use stale static menu wording');
31
+ assert.doesNotMatch(docs.commandHelp, /get\/<service>/, 'command help must use current clauth /v/<service> wording');
32
+
33
+ console.log('help surface tests — PASS');
@@ -0,0 +1,21 @@
1
+ #!/usr/bin/env node
2
+ import assert from 'node:assert/strict';
3
+ import { spawnSync } from 'node:child_process';
4
+ import { dirname, join, resolve } from 'node:path';
5
+ import { fileURLToPath } from 'node:url';
6
+
7
+ const __dirname = dirname(fileURLToPath(import.meta.url));
8
+ const REPO_ROOT = resolve(__dirname, '..');
9
+ const script = join(REPO_ROOT, 'scripts', 'install-rdc-skills.js');
10
+
11
+ const syntax = spawnSync(process.execPath, ['--check', script], { encoding: 'utf8' });
12
+ assert.equal(syntax.status, 0, syntax.stderr);
13
+
14
+ const toml = spawnSync(process.execPath, [script, '--self-test-codex-mcp-toml'], {
15
+ cwd: REPO_ROOT,
16
+ encoding: 'utf8',
17
+ });
18
+ assert.equal(toml.status, 0, `${toml.stdout}\n${toml.stderr}`);
19
+ assert.match(toml.stdout, /PASS/);
20
+
21
+ console.log('install-rdc-skills tests — PASS');