@lifeaitools/rdc-skills 0.24.22 → 0.24.24
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-plugin/plugin.json +1 -1
- package/README.md +34 -23
- package/bin/rdc-skills-mcp.mjs +35 -5
- package/commands/help.md +3 -3
- package/git-sha.json +1 -1
- package/package.json +1 -1
- package/skills/help/SKILL.md +2 -2
- package/tests/curl-surface.test.mjs +27 -2
- package/tests/help-surface.test.mjs +7 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "rdc",
|
|
3
|
-
"version": "0.24.
|
|
3
|
+
"version": "0.24.24",
|
|
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
|
@@ -13,7 +13,10 @@ From any Claude Code session:
|
|
|
13
13
|
/plugin install rdc-skills
|
|
14
14
|
```
|
|
15
15
|
|
|
16
|
-
|
|
16
|
+
The full catalog is available through the MCP as 29 skills. Eighteen common
|
|
17
|
+
workflows also ship as `/rdc:*` command shorthands. Agent playbooks in
|
|
18
|
+
`guides/agents/` are dispatched internally by `rdc:build` and are not
|
|
19
|
+
user-invocable.
|
|
17
20
|
|
|
18
21
|
### Option B — Directory plugin (LIFEAI dev machines)
|
|
19
22
|
|
|
@@ -162,39 +165,47 @@ Throughout the skills, the following substitutions have been made to make them p
|
|
|
162
165
|
|
|
163
166
|
## Skills Overview
|
|
164
167
|
|
|
165
|
-
29 skills organized into
|
|
168
|
+
29 MCP skills organized into 8 manifest categories. Eighteen of these also have
|
|
169
|
+
`/rdc:*` command shorthands for Claude Code/plugin callers.
|
|
166
170
|
|
|
167
|
-
|
|
168
|
-
|
|
171
|
+
Use `rdc_skill_list` for the authoritative live catalog, including names,
|
|
172
|
+
visible slash forms, requirements, triggers, and usage.
|
|
173
|
+
|
|
174
|
+
### Planning
|
|
175
|
+
- rdc:preplan, rdc:plan, rdc:handoff
|
|
169
176
|
|
|
170
177
|
### Agent Guides (dispatched by rdc:build, not user-invocable)
|
|
171
178
|
Located in `guides/agents/` — plain markdown playbooks spawned as sub-agents:
|
|
172
179
|
- frontend, backend, data, design, infrastructure, content, cs2, viz, setup, verify
|
|
173
180
|
|
|
174
|
-
###
|
|
175
|
-
- rdc:
|
|
181
|
+
### Build
|
|
182
|
+
- rdc:build, rdc:design, rdc:prototype, rdc:overnight, rdc:review
|
|
176
183
|
|
|
177
|
-
###
|
|
178
|
-
- rdc:
|
|
179
|
-
- rdc:co-develop — peer-aware Claude/Codex co-development over clauth
|
|
180
|
-
- rdc:fs-mcp — File System MCP bridge guidance for live repo reads/writes
|
|
181
|
-
- rdc:terminal-config — Windows Terminal and hidden-launch policy audit
|
|
182
|
-
- rdc:watch — session-log viewer initialization for attended sessions
|
|
183
|
-
- 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
|
|
184
|
+
### Deploy
|
|
185
|
+
- rdc:deploy
|
|
184
186
|
|
|
185
|
-
###
|
|
186
|
-
- rdc:
|
|
187
|
+
### Release
|
|
188
|
+
- rdc:release
|
|
187
189
|
|
|
188
|
-
###
|
|
189
|
-
- rdc:
|
|
190
|
+
### Dev Loop
|
|
191
|
+
- rdc:fixit, rdc:collab, rdc:co-develop
|
|
192
|
+
|
|
193
|
+
### Reporting
|
|
194
|
+
- rdc:help, rdc:housekeeping, rdc:report, rdc:status, rdc:watch
|
|
195
|
+
|
|
196
|
+
### Tooling
|
|
197
|
+
- 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
|
|
190
198
|
- rdc:brochure — HTML/folder/zip/URL/Markdown to print-quality PDF
|
|
191
|
-
- rdc:brochurify —
|
|
192
|
-
- lifeai-brochure-author —
|
|
193
|
-
- rdc:
|
|
194
|
-
-
|
|
199
|
+
- rdc:brochurify — Brochurify orchestration for polished PDF jobs
|
|
200
|
+
- lifeai-brochure-author — JSX authoring contract for Brochurify inputs
|
|
201
|
+
- rdc:convert — Office/Markdown conversion via build-corpus
|
|
202
|
+
- rdc:fs-mcp — File System MCP bridge guidance for live repo reads/writes
|
|
203
|
+
- rdc:extract-verifier-rules — verifier-rule extraction from enhancement logs
|
|
204
|
+
- rdc:rpms-filemap — generated RPMS file-map guidance
|
|
205
|
+
- rdc:workitems — manual work item CRUD
|
|
195
206
|
|
|
196
|
-
###
|
|
197
|
-
- rdc:
|
|
207
|
+
### Infra
|
|
208
|
+
- rdc:self-test, rdc:terminal-config
|
|
198
209
|
|
|
199
210
|
## Channel Formatting and Content Packs
|
|
200
211
|
|
package/bin/rdc-skills-mcp.mjs
CHANGED
|
@@ -125,6 +125,36 @@ function textResult(text) {
|
|
|
125
125
|
return { content: [{ type: 'text', text }] };
|
|
126
126
|
}
|
|
127
127
|
|
|
128
|
+
function directMcpUsage(message) {
|
|
129
|
+
return {
|
|
130
|
+
jsonrpc: '2.0',
|
|
131
|
+
error: {
|
|
132
|
+
code: -32000,
|
|
133
|
+
message,
|
|
134
|
+
help: {
|
|
135
|
+
endpoint: '/mcp',
|
|
136
|
+
method: 'POST',
|
|
137
|
+
headers: {
|
|
138
|
+
'Content-Type': 'application/json',
|
|
139
|
+
Accept: 'application/json, text/event-stream',
|
|
140
|
+
},
|
|
141
|
+
tools: ['rdc_skill_list', 'rdc_skill_search', 'rdc_skill_get'],
|
|
142
|
+
response: 'Streamable HTTP returns Server-Sent Events. Parse the JSON-RPC envelope from each data: line; tool text is at result.content[0].text.',
|
|
143
|
+
curl: `curl -s -X POST https://rdc-skills.regendevcorp.com/mcp \\
|
|
144
|
+
-H 'Content-Type: application/json' \\
|
|
145
|
+
-H 'Accept: application/json, text/event-stream' \\
|
|
146
|
+
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"rdc_skill_list","arguments":{}}}'`,
|
|
147
|
+
},
|
|
148
|
+
},
|
|
149
|
+
id: null,
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
function acceptsStreamableHttp(req) {
|
|
154
|
+
const accept = String(req.headers.accept || '');
|
|
155
|
+
return accept.includes('application/json') && accept.includes('text/event-stream');
|
|
156
|
+
}
|
|
157
|
+
|
|
128
158
|
function buildMcpServer() {
|
|
129
159
|
const srv = new McpServer({ name: 'rdc-skills', version: pkgVersion() });
|
|
130
160
|
|
|
@@ -225,6 +255,10 @@ function startHttp() {
|
|
|
225
255
|
// POST /mcp — stateless StreamableHTTP transport, no Authorization required.
|
|
226
256
|
app.post('/mcp', async (req, res) => {
|
|
227
257
|
try {
|
|
258
|
+
if (!acceptsStreamableHttp(req)) {
|
|
259
|
+
res.status(406).json(directMcpUsage('MCP Streamable HTTP requires Accept: application/json, text/event-stream'));
|
|
260
|
+
return;
|
|
261
|
+
}
|
|
228
262
|
const transport = new StreamableHTTPServerTransport({ sessionIdGenerator: undefined });
|
|
229
263
|
const srv = buildMcpServer();
|
|
230
264
|
await srv.connect(transport);
|
|
@@ -246,11 +280,7 @@ function startHttp() {
|
|
|
246
280
|
});
|
|
247
281
|
|
|
248
282
|
app.get('/mcp', (_req, res) => {
|
|
249
|
-
res.status(405).json(
|
|
250
|
-
jsonrpc: '2.0',
|
|
251
|
-
error: { code: -32000, message: 'Use POST for MCP requests' },
|
|
252
|
-
id: null,
|
|
253
|
-
});
|
|
283
|
+
res.status(405).json(directMcpUsage('Use POST for MCP requests.'));
|
|
254
284
|
});
|
|
255
285
|
|
|
256
286
|
app.listen(PORT, () => {
|
package/commands/help.md
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: rdc:help
|
|
3
3
|
description: >-
|
|
4
|
-
Usage `rdc:help` or `rdc` — manifest-driven menu of all
|
|
4
|
+
Usage `rdc:help` or `rdc` — manifest-driven menu of all MCP skills with
|
|
5
5
|
argument syntax, requirements, decision hints, and direct MCP/curl access.
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
> **Output contract:** Checklist/table output only. No raw MCP/JSON/log dumps.
|
|
9
9
|
|
|
10
|
-
# rdc:help — Manifest-Driven
|
|
10
|
+
# rdc:help — Manifest-Driven Skill Reference
|
|
11
11
|
|
|
12
|
-
Print a concise
|
|
12
|
+
Print a concise skill reference from the plugin manifest, then stop. Do not
|
|
13
13
|
ask which command to run unless the user explicitly asks for a recommendation.
|
|
14
14
|
|
|
15
15
|
## Source Of Truth
|
package/git-sha.json
CHANGED
package/package.json
CHANGED
package/skills/help/SKILL.md
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: rdc:help
|
|
3
|
-
description: "Usage `rdc:help` — Show all
|
|
3
|
+
description: "Usage `rdc:help` — Show all MCP skills with usage, requirements, slash forms, and codeflow status. Reads `.claude-plugin/plugin.json` skills_meta (single source of truth). Call when unsure which skill to use or what args it takes."
|
|
4
4
|
---
|
|
5
5
|
|
|
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
|
|
|
9
|
-
# rdc:help —
|
|
9
|
+
# rdc:help — Skill Reference (manifest-driven)
|
|
10
10
|
|
|
11
11
|
> **⚠️ HARD OUTPUT RULE:** Read the plugin manifest, render the table, exit.
|
|
12
12
|
> No preamble. No follow-up question. No summary.
|
|
@@ -67,6 +67,16 @@ function curl(args, label) {
|
|
|
67
67
|
return { status: res.status, stdout, stderr };
|
|
68
68
|
}
|
|
69
69
|
|
|
70
|
+
function curlWithStatus(args, label) {
|
|
71
|
+
const res = curl([...args, '-w', '\n%{http_code}'], label);
|
|
72
|
+
const marker = res.stdout.match(/\n(\d{3})$/);
|
|
73
|
+
return {
|
|
74
|
+
...res,
|
|
75
|
+
httpStatus: marker ? Number(marker[1]) : null,
|
|
76
|
+
body: marker ? res.stdout.slice(0, marker.index) : res.stdout,
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
|
|
70
80
|
function postMcp(payload, label) {
|
|
71
81
|
return curl([
|
|
72
82
|
'-s',
|
|
@@ -191,7 +201,19 @@ async function main() {
|
|
|
191
201
|
check('rdc_skill_get returns tool text path', getText.length > 500, `length ${getText.length}`);
|
|
192
202
|
check('rdc_skill_get accepts visible rdc:build alias', /rdc:build/i.test(getText));
|
|
193
203
|
|
|
194
|
-
const
|
|
204
|
+
const getMcp = curlWithStatus([
|
|
205
|
+
'-s',
|
|
206
|
+
`${TARGET}/mcp`,
|
|
207
|
+
], 'get_mcp_help');
|
|
208
|
+
check('GET /mcp curl exits 0', getMcp.status === 0, getMcp.stderr);
|
|
209
|
+
check('GET /mcp returns 405', getMcp.httpStatus === 405, `status ${getMcp.httpStatus}`);
|
|
210
|
+
const getHelp = JSON.parse(getMcp.body);
|
|
211
|
+
check('GET /mcp explains POST method', getHelp.error?.help?.method === 'POST');
|
|
212
|
+
check('GET /mcp includes Streamable HTTP Accept header', getHelp.error?.help?.headers?.Accept === 'application/json, text/event-stream');
|
|
213
|
+
check('GET /mcp points to discovery tools', getHelp.error?.help?.tools?.includes('rdc_skill_list'));
|
|
214
|
+
check('GET /mcp explains result.content text path', /result\.content\[0\]\.text/.test(getHelp.error?.help?.response || ''));
|
|
215
|
+
|
|
216
|
+
const badAccept = curlWithStatus([
|
|
195
217
|
'-s',
|
|
196
218
|
'-X', 'POST',
|
|
197
219
|
`${TARGET}/mcp`,
|
|
@@ -199,7 +221,10 @@ async function main() {
|
|
|
199
221
|
'-d', JSON.stringify({ jsonrpc: '2.0', id: 5, method: 'tools/list' }),
|
|
200
222
|
], 'missing_accept_header');
|
|
201
223
|
check('missing Accept header still returns inspectable response', badAccept.status === 0, badAccept.stderr);
|
|
202
|
-
check('missing Accept header
|
|
224
|
+
check('missing Accept header returns 406', badAccept.httpStatus === 406, `status ${badAccept.httpStatus}`);
|
|
225
|
+
const badAcceptHelp = JSON.parse(badAccept.body);
|
|
226
|
+
check('missing Accept header names required header', badAcceptHelp.error?.help?.headers?.Accept === 'application/json, text/event-stream');
|
|
227
|
+
check('missing Accept header includes curl example', /curl -s -X POST/.test(badAcceptHelp.error?.help?.curl || ''));
|
|
203
228
|
} finally {
|
|
204
229
|
if (proc) proc.kill();
|
|
205
230
|
}
|
|
@@ -31,6 +31,13 @@ for (const [name, text] of Object.entries(docs)) {
|
|
|
31
31
|
assert.doesNotMatch(text, /https:\/\/rdc-skills\.dev\.regendevcorp\.com\/mcp/, `${name} must not point callers at dev MCP`);
|
|
32
32
|
}
|
|
33
33
|
|
|
34
|
+
assert.match(docs.readme, /29 MCP skills organized into 8 manifest categories/, 'README should use manifest category count');
|
|
35
|
+
assert.match(docs.readme, /Eighteen[\s\S]*\/rdc:\*` command shorthands/i, 'README should distinguish slash-command shorthands from full MCP skills');
|
|
36
|
+
assert.match(docs.readme, /Use `rdc_skill_list` for the authoritative live catalog/, 'README should point callers to live MCP catalog');
|
|
37
|
+
assert.doesNotMatch(docs.readme, /All user-invocable skills become available as slash commands/, 'README must not imply all MCP skills are slash commands');
|
|
38
|
+
assert.doesNotMatch(docs.readme, /29 skills organized into 6 categories/, 'README must not carry stale category count');
|
|
39
|
+
assert.match(docs.commandHelp, /menu of all MCP skills/, 'command help should refer to MCP skill catalog');
|
|
40
|
+
assert.match(docs.skillHelp, /Show all MCP skills/, 'skill help should refer to MCP skill catalog');
|
|
34
41
|
assert.match(docs.skillHelp, /manifest-driven/i, 'skill help should be manifest-driven');
|
|
35
42
|
assert.match(docs.commandHelp, /manifest-driven/i, 'command help should be manifest-driven');
|
|
36
43
|
assert.doesNotMatch(docs.commandHelp, /Print the full usage menu below verbatim/, 'command help must not use stale static menu wording');
|