@lifeaitools/rdc-skills 0.24.13 → 0.24.15

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.13",
3
+ "version": "0.24.15",
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",
@@ -382,7 +382,7 @@
382
382
  "follows": [],
383
383
  "leads_to": [],
384
384
  "sandbox_aware": false,
385
- "output_contract": null,
385
+ "output_contract": "guides/output-contract.md",
386
386
  "enabled_default": true,
387
387
  "codeflow_required": false
388
388
  },
@@ -1005,7 +1005,7 @@
1005
1005
  ],
1006
1006
  "follows": [],
1007
1007
  "leads_to": [],
1008
- "sandbox_aware": false,
1008
+ "sandbox_aware": true,
1009
1009
  "output_contract": "guides/output-contract.md",
1010
1010
  "enabled_default": true,
1011
1011
  "codeflow_required": false
@@ -1135,7 +1135,7 @@
1135
1135
  ],
1136
1136
  "follows": [],
1137
1137
  "leads_to": [],
1138
- "sandbox_aware": false,
1138
+ "sandbox_aware": true,
1139
1139
  "output_contract": "guides/output-contract.md",
1140
1140
  "enabled_default": true,
1141
1141
  "codeflow_required": false
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": "855a6b20f3ed897365cb835a6e7ad4a92b793d7a"
2
+ "sha": "3209f3b253eef2c9089150bcfa912853f6860dc0"
3
3
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lifeaitools/rdc-skills",
3
- "version": "0.24.13",
3
+ "version": "0.24.15",
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 && node tests/install-rdc-skills.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",
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",
@@ -6,6 +6,7 @@ description: "Usage `rdc:co-develop <ask|reply|inbox|start|resume|status>` — p
6
6
  > **⚠️ OUTPUT CONTRACT (READ FIRST):** `guides/output-contract.md`
7
7
  > Checklist-only output. No tool-call narration. No raw MCP/JSON/log dumps.
8
8
  > One checklist upfront, updated in place, shown again at end with a 1-line verdict.
9
+ > **Sandbox contract:** This skill honors `RDC_TEST=1` per `guides/agent-bootstrap.md` § RDC_TEST Sandbox Contract. Under the flag, do not create/send/reply to live co-development turns; report the intended clauth command and mark the external relay action as skipped.
9
10
 
10
11
  # rdc:co-develop — Peer-Aware Co-Development
11
12
 
@@ -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,44 @@
1
+ #!/usr/bin/env node
2
+ import assert from 'node:assert/strict';
3
+ import { existsSync, 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
+ const manifest = JSON.parse(readFileSync(join(root, '.claude-plugin', 'plugin.json'), 'utf8'));
10
+
11
+ function skillPath(name) {
12
+ const direct = join(root, 'skills', name, 'SKILL.md');
13
+ if (existsSync(direct)) return direct;
14
+ const prefixed = join(root, 'skills', `rdc-${name}`, 'SKILL.md');
15
+ if (existsSync(prefixed)) return prefixed;
16
+ return direct;
17
+ }
18
+
19
+ for (const [name, meta] of Object.entries(manifest.skills_meta)) {
20
+ const file = skillPath(name);
21
+ assert.equal(existsSync(file), true, `${name} must have a SKILL.md`);
22
+ const body = readFileSync(file, 'utf8');
23
+
24
+ const hasOutputContract = body.includes('guides/output-contract.md') || body.includes('OUTPUT CONTRACT');
25
+ assert.equal(
26
+ Boolean(meta.output_contract),
27
+ hasOutputContract,
28
+ `${name} manifest output_contract must match SKILL.md banner`,
29
+ );
30
+
31
+ if (body.includes('RDC_TEST=1')) {
32
+ assert.equal(meta.sandbox_aware, true, `${name} mentions RDC_TEST=1 and must be sandbox_aware`);
33
+ }
34
+
35
+ if (meta.sandbox_aware) {
36
+ assert.match(
37
+ body,
38
+ /Sandbox contract|RDC_TEST=1/,
39
+ `${name} is sandbox_aware and must explain the sandbox contract in SKILL.md`,
40
+ );
41
+ }
42
+ }
43
+
44
+ console.log('manifest contract field tests — PASS');