@lifeaitools/rdc-skills 0.24.28 → 0.24.30

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.28",
3
+ "version": "0.24.30",
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/git-sha.json CHANGED
@@ -1,3 +1,3 @@
1
1
  {
2
- "sha": "5e9edbe4cc32b027c05dda21e0a9e2f07bba8e59"
2
+ "sha": "e247eb79f223c88807aab96c87a8fe37e5b67f15"
3
3
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lifeaitools/rdc-skills",
3
- "version": "0.24.28",
3
+ "version": "0.24.30",
4
4
  "description": "RDC typed-agent dispatch skill suite for Claude Code - plan, build, review, overnight builds",
5
5
  "keywords": [
6
6
  "claude-code",
@@ -4,7 +4,7 @@ Current coverage: 29 manifests for 29 skill directories.
4
4
 
5
5
  The manifest layer verifies each skill can be started from a realistic caller prompt in an isolated `RDC_TEST=1` sandbox. The acceptance harness records the engine stream, extracted tool calls, stdout/stderr artifacts, rendered assistant output, failures, lessons learned, and next build optimizations under `.rdc/reports/`.
6
6
 
7
- `rdc:channel-formatter` currently has the strongest content acceptance fixture: it asserts source-grounded social-pack output, forbidden-claim absence, and observable corpus or web-search tool routing. `rdc:help` asserts the public MCP/curl caller surface and structured `format:"json"` discovery path. `rdc:watch` adds a focus-safety negative check. The remaining manifests are basic behavioral smoke tests and should gain deeper acceptance assertions as each skill is touched.
7
+ `rdc:channel-formatter` currently has the strongest content acceptance fixture: it asserts source-grounded social-pack output, forbidden-claim absence, and observable corpus or web-search tool routing. `rdc:help` asserts the public MCP/curl caller surface and structured `format:"json"` discovery path. `rdc:self-test` validates the test-tier/evidence language. Planning/reporting skills (`rdc:preplan`, `rdc:plan`, `rdc:handoff`, `rdc:prototype`, `rdc:review`, `rdc:report`) now assert their required artifacts and safety boundaries. `rdc:release`, `rdc:deploy`, `rdc:terminal-config`, `rdc:status`, and `rdc:watch` add safety negative checks for publish/deploy/window/read-only behavior. The remaining manifests are basic behavioral smoke tests and should gain deeper acceptance assertions as each skill is touched.
8
8
 
9
9
  | Skill | Manifest | Fixture prompt class | Assertions | Acceptance depth |
10
10
  |---|---|---|---|---|
@@ -14,27 +14,27 @@ The manifest layer verifies each skill can be started from a realistic caller pr
14
14
  | `rdc:co-develop` | `rdc-co-develop.test.json` | Coordination status | `commits_made`, `exit_code`, `stdout_contains` | Basic manifest |
15
15
  | `rdc:collab` | `rdc-collab.test.json` | Claude session relay fixture | `commits_made`, `exit_code`, `stdout_contains` | Basic manifest |
16
16
  | `rdc:convert` | `rdc-convert.test.json` | Markdown-to-Word conversion fixture | `exit_code`, `stdout_contains` | Basic manifest |
17
- | `rdc:deploy` | `rdc-deploy.test.json` | Deployment diagnosis | `commits_made`, `exit_code`, `stdout_contains` | Basic manifest |
17
+ | `rdc:deploy` | `rdc-deploy.test.json` | Deployment diagnosis | `commits_made`, `exit_code`, `stdout_contains` | Read-only diagnose output and destructive deploy/DNS negative checks |
18
18
  | `rdc:design` | `rdc-design.test.json` | Studio palette audit | `exit_code`, `stdout_contains` | Basic manifest |
19
19
  | `rdc:fixit` | `rdc-fixit.test.json` | Tiny sandbox typo fix | `commits_made`, `exit_code`, `stdout_contains` | Basic manifest |
20
20
  | `rdc:fs-mcp` | `rdc-fs-mcp.test.json` | File-system bridge read fixture | `commits_made`, `exit_code`, `stdout_contains` | Basic manifest |
21
- | `rdc:handoff` | `rdc-handoff.test.json` | Stub work handoff | `exit_code`, `stdout_contains` | Basic manifest |
21
+ | `rdc:handoff` | `rdc-handoff.test.json` | Stub work handoff | `exit_code`, `stdout_contains` | Plan path, DoD, work-item handoff, and placeholder negative checks |
22
22
  | `rdc:help` | `rdc-help.test.json` | Help menu rendering | `commits_made`, `exit_code`, `stdout_contains` | MCP/curl output, structured JSON fetch, dev-endpoint negative checks |
23
23
  | `rdc:housekeeping` | `rdc-housekeeping.test.json` | Read-only housekeeping audit | `commits_made`, `exit_code`, `stdout_contains` | Basic manifest |
24
24
  | `lifeai-brochure-author` | `rdc-lifeai-brochure-author.test.json` | JSX compliance review fixture | `exit_code`, `stdout_contains` | Basic manifest |
25
25
  | `rdc:overnight` | `rdc-overnight.test.json` | Label-based overnight queue drain | `exit_code`, `stdout_contains` | Basic manifest |
26
- | `rdc:plan` | `rdc-plan.test.json` | Health-endpoint planning prompt | `exit_code`, `stdout_contains` | Basic manifest |
27
- | `rdc:preplan` | `rdc-preplan.test.json` | Rate-limiter research prompt | `commits_made`, `exit_code`, `stdout_contains` | Basic manifest |
28
- | `rdc:prototype` | `rdc-prototype.test.json` | Tiny component prototype prompt | `exit_code`, `stdout_contains` | Basic manifest |
26
+ | `rdc:plan` | `rdc-plan.test.json` | Health-endpoint planning prompt | `exit_code`, `stdout_contains` | Design-decision, decomposition-matrix, work-package, and coarse-check negative checks |
27
+ | `rdc:preplan` | `rdc-preplan.test.json` | Rate-limiter research prompt | `commits_made`, `exit_code`, `stdout_contains` | Research artifact, comparison, unknowns, recommendation, and research-tool routing checks |
28
+ | `rdc:prototype` | `rdc-prototype.test.json` | Tiny component prototype prompt | `exit_code`, `stdout_contains` | Local TSX prototype artifact, registry, test-mode, and production-write negative checks |
29
29
  | `rdc:brochurify` | `rdc-rdc-brochurify.test.json` | Read-only markdown Brochurify fixture | `exit_code`, `stdout_contains` | Sandbox output and no-follow-up negative checks |
30
30
  | `rdc:extract-verifier-rules` | `rdc-rdc-extract-verifier-rules.test.json` | Enhancement-log verifier fixture | `exit_code`, `stdout_contains` | Basic manifest |
31
- | `rdc:release` | `rdc-release.test.json` | Dry-run package release | `commits_made`, `exit_code`, `stdout_contains` | Basic manifest |
32
- | `rdc:report` | `rdc-report.test.json` | Unattended report generation | `exit_code`, `stdout_contains` | Basic manifest |
33
- | `rdc:review` | `rdc-review.test.json` | Unattended review gate | `exit_code`, `stdout_contains` | Basic manifest |
31
+ | `rdc:release` | `rdc-release.test.json` | Dry-run package release | `commits_made`, `exit_code`, `stdout_contains` | Dry-run release checklist and force/bypass negative checks |
32
+ | `rdc:report` | `rdc-report.test.json` | Unattended report generation | `exit_code`, `stdout_contains` | Report status block, counts, next recommendation, and dump/push negative checks |
33
+ | `rdc:review` | `rdc-review.test.json` | Unattended review gate | `exit_code`, `stdout_contains` | Code-review, verify, fresh-evidence, tsc, and forbidden-build negative checks |
34
34
  | `rdc:rpms-filemap` | `rdc-rpms-filemap.test.json` | Canonical location lookup | `commits_made`, `exit_code`, `stdout_contains` | Basic manifest |
35
- | `rdc:self-test` | `rdc-self-test.test.json` | Strict self-test prompt | `commits_made`, `exit_code`, `stdout_contains` | Basic manifest |
36
- | `rdc:status` | `rdc-status.test.json` | Read-only status snapshot | `commits_made`, `exit_code`, `stdout_contains` | Basic manifest |
37
- | `rdc:terminal-config` | `rdc-terminal-config.test.json` | Hidden-window launch policy audit | `commits_made`, `exit_code`, `stdout_contains` | Basic manifest |
35
+ | `rdc:self-test` | `rdc-self-test.test.json` | Strict self-test prompt | `commits_made`, `exit_code`, `stdout_contains` | Tier/evidence output checks and no-relaxed-linter negative check |
36
+ | `rdc:status` | `rdc-status.test.json` | Read-only status snapshot | `commits_made`, `exit_code`, `stdout_contains` | Read-only status output and raw-MCP/write negative checks |
37
+ | `rdc:terminal-config` | `rdc-terminal-config.test.json` | Hidden-window launch policy audit | `commits_made`, `exit_code`, `stdout_contains` | Hidden-window output and focus/collapse API negative checks |
38
38
  | `rdc:watch` | `rdc-watch.test.json` | Watcher initialization prompt | `exit_code`, `stdout_contains` | Test-mode no-open output, tool-call routing, and focus-event negative checks |
39
39
  | `rdc:workitems` | `rdc-workitems.test.json` | Work-item epic listing | `commits_made`, `exit_code`, `stdout_contains` | Basic manifest |
40
40
 
@@ -11,5 +11,20 @@
11
11
  "commits_made": { "min": 0 },
12
12
  "stdout_contains": ["Verdict"]
13
13
  },
14
+ "acceptance": {
15
+ "output_contains": [
16
+ "diagnose",
17
+ "read-only",
18
+ "Registry",
19
+ "health",
20
+ "Verdict"
21
+ ],
22
+ "output_not_contains": [
23
+ "Deploy triggered",
24
+ "Cloudflare cache purged",
25
+ "PR/admin-merge to main",
26
+ "DNS write"
27
+ ]
28
+ },
14
29
  "teardown": { "reset_branch": true }
15
30
  }
@@ -10,5 +10,19 @@
10
10
  "exit_code": 0,
11
11
  "stdout_contains": ["Verdict"]
12
12
  },
13
+ "acceptance": {
14
+ "output_contains": [
15
+ ".rdc/plans",
16
+ "acceptance criterion",
17
+ "DoD",
18
+ "work item",
19
+ "rdc:build"
20
+ ],
21
+ "output_not_contains": [
22
+ "git push",
23
+ "raw MCP",
24
+ "[specific acceptance criterion]"
25
+ ]
26
+ },
13
27
  "teardown": { "reset_branch": true }
14
28
  }
@@ -10,5 +10,19 @@
10
10
  "exit_code": 0,
11
11
  "stdout_contains": ["Verdict"]
12
12
  },
13
+ "acceptance": {
14
+ "output_contains": [
15
+ "Design Decision",
16
+ "Checklist Decomposition Matrix",
17
+ "Work package",
18
+ "Verification artifact",
19
+ "rdc:build"
20
+ ],
21
+ "output_not_contains": [
22
+ "verify UI",
23
+ "integration complete",
24
+ "raw MCP"
25
+ ]
26
+ },
13
27
  "teardown": { "reset_branch": true }
14
28
  }
@@ -11,5 +11,20 @@
11
11
  "commits_made": { "min": 0 },
12
12
  "stdout_contains": ["Verdict"]
13
13
  },
14
+ "acceptance": {
15
+ "output_contains": [
16
+ "Research",
17
+ "Best-in-Class",
18
+ "Comparison",
19
+ "Unknowns",
20
+ "Recommendation"
21
+ ],
22
+ "output_not_contains": [
23
+ "create work items",
24
+ "architectural decision",
25
+ "write code"
26
+ ],
27
+ "tool_calls_include_any": ["WebSearch", "web.search_query", "Grep", "Glob"]
28
+ },
14
29
  "teardown": { "reset_branch": true }
15
30
  }
@@ -10,5 +10,19 @@
10
10
  "exit_code": 0,
11
11
  "stdout_contains": ["Verdict"]
12
12
  },
13
+ "acceptance": {
14
+ "output_contains": [
15
+ "docs/source",
16
+ "prototype",
17
+ "TSX",
18
+ "registry",
19
+ "RDC_TEST"
20
+ ],
21
+ "output_not_contains": [
22
+ "git push",
23
+ "production deploy",
24
+ "Supabase insert"
25
+ ]
26
+ },
13
27
  "teardown": { "reset_branch": true }
14
28
  }
@@ -11,5 +11,19 @@
11
11
  "commits_made": { "min": 0 },
12
12
  "stdout_contains": ["Verdict"]
13
13
  },
14
+ "acceptance": {
15
+ "output_contains": [
16
+ "dry-run",
17
+ "Tests/self-test",
18
+ "CI/publish",
19
+ "Installed/runtime version",
20
+ "Smoke test"
21
+ ],
22
+ "output_not_contains": [
23
+ "git push --force",
24
+ "bypass hooks",
25
+ "raw git/npm/CI dumps"
26
+ ]
27
+ },
14
28
  "teardown": { "reset_branch": true }
15
29
  }
@@ -10,5 +10,19 @@
10
10
  "exit_code": 0,
11
11
  "stdout_contains": ["Verdict"]
12
12
  },
13
+ "acceptance": {
14
+ "output_contains": [
15
+ "REPORT_STATUS",
16
+ "report_path",
17
+ "completed_count",
18
+ "open_count",
19
+ "Next Session Recommendation"
20
+ ],
21
+ "output_not_contains": [
22
+ "raw MCP",
23
+ "git push",
24
+ "unbounded dump"
25
+ ]
26
+ },
13
27
  "teardown": { "reset_branch": true }
14
28
  }
@@ -10,5 +10,19 @@
10
10
  "exit_code": 0,
11
11
  "stdout_contains": ["Verdict"]
12
12
  },
13
+ "acceptance": {
14
+ "output_contains": [
15
+ "code-review",
16
+ "verify",
17
+ "fresh evidence",
18
+ "tsc",
19
+ "Verdict"
20
+ ],
21
+ "output_not_contains": [
22
+ "pnpm build",
23
+ "raw MCP",
24
+ "CLEAN without"
25
+ ]
26
+ },
13
27
  "teardown": { "reset_branch": true }
14
28
  }
@@ -11,5 +11,18 @@
11
11
  "commits_made": { "min": 0 },
12
12
  "stdout_contains": ["PASS", "strict"]
13
13
  },
14
+ "acceptance": {
15
+ "output_contains": [
16
+ "Tier 1",
17
+ "Tier 2",
18
+ "29 manifests",
19
+ "JSONL",
20
+ "tool calls"
21
+ ],
22
+ "output_not_contains": [
23
+ "skip findings by relaxing the linter",
24
+ "raw runner dumps"
25
+ ]
26
+ },
14
27
  "teardown": { "reset_branch": true }
15
28
  }
@@ -11,5 +11,19 @@
11
11
  "commits_made": { "min": 0 },
12
12
  "stdout_contains": ["Recommended Next"]
13
13
  },
14
+ "acceptance": {
15
+ "output_contains": [
16
+ "Recommended Next",
17
+ "read-only",
18
+ "work items",
19
+ "health"
20
+ ],
21
+ "output_not_contains": [
22
+ "raw MCP",
23
+ "UUID",
24
+ "UPDATE work_items",
25
+ "INSERT"
26
+ ]
27
+ },
14
28
  "teardown": { "reset_branch": true }
15
29
  }
@@ -11,5 +11,19 @@
11
11
  "commits_made": { "min": 0 },
12
12
  "stdout_contains": ["hidden-window", "No settings written"]
13
13
  },
14
+ "acceptance": {
15
+ "output_contains": [
16
+ "hidden-window",
17
+ "No settings written",
18
+ "read before edit",
19
+ "JSON/TOML syntax"
20
+ ],
21
+ "output_not_contains": [
22
+ "SetForegroundWindow",
23
+ "ShowWindow",
24
+ "collapse all windows",
25
+ "restore all windows"
26
+ ]
27
+ },
14
28
  "teardown": { "reset_branch": true }
15
29
  }
@@ -226,6 +226,26 @@ async function main() {
226
226
  check('rdc_skill_get format=json returns skill metadata', getJsonBody.skill?.slash === 'rdc:build' && getJsonBody.skill?.codeflow_required === true);
227
227
  check('rdc_skill_get format=json returns rendered body', /rdc:build/i.test(getJsonBody.body || ''));
228
228
 
229
+ const getJsonUnknown = postMcp({
230
+ jsonrpc: '2.0',
231
+ id: 6,
232
+ method: 'tools/call',
233
+ params: {
234
+ name: 'rdc_skill_get',
235
+ arguments: { name: 'rdc:not-real', format: 'json' },
236
+ },
237
+ }, 'rdc_skill_get_json_unknown');
238
+ check('rdc_skill_get unknown format=json curl exits 0', getJsonUnknown.status === 0, getJsonUnknown.stderr);
239
+ let getJsonUnknownBody = {};
240
+ const getJsonUnknownText = resultText(latestEnvelope(getJsonUnknown.stdout));
241
+ try {
242
+ getJsonUnknownBody = JSON.parse(getJsonUnknownText);
243
+ } catch {
244
+ check('rdc_skill_get unknown format=json returns parseable JSON', false, getJsonUnknownText || getJsonUnknown.stdout.slice(0, 500));
245
+ }
246
+ check('rdc_skill_get unknown format=json returns machine error', getJsonUnknownBody.error === 'unknown_skill');
247
+ check('rdc_skill_get unknown format=json returns alternatives', getJsonUnknownBody.valid_count >= 29 && getJsonUnknownBody.valid?.some((s) => s.slash === 'rdc:help'));
248
+
229
249
  const getMcp = curlWithStatus([
230
250
  '-s',
231
251
  `${TARGET}/mcp`,
@@ -195,6 +195,10 @@ async function sweep(url, label, { compareSource }) {
195
195
  // error path
196
196
  const unk = await mcp(url, { jsonrpc: '2.0', id: 20, method: 'tools/call', params: { name: 'rdc_skill_get', arguments: { name: '___nope___' } } });
197
197
  check(`${label}: unknown skill returns helpful error`, /unknown skill/i.test(callText(unk.json)));
198
+ const unkJson = await mcp(url, { jsonrpc: '2.0', id: 24, method: 'tools/call', params: { name: 'rdc_skill_get', arguments: { name: '___nope___', format: 'json' } } });
199
+ let unkJsonBody; try { unkJsonBody = JSON.parse(callText(unkJson.json)); } catch { unkJsonBody = {}; }
200
+ check(`${label}: unknown skill format=json returns machine-readable error`, unkJsonBody.error === 'unknown_skill');
201
+ check(`${label}: unknown skill format=json includes valid alternatives`, unkJsonBody.valid_count === names.length && Array.isArray(unkJsonBody.valid) && unkJsonBody.valid.some((s) => s.slash === 'rdc:help'));
198
202
 
199
203
  // Alias path: callers naturally copy the slash form from rdc_skill_list.
200
204
  const aliasGet = await mcp(url, { jsonrpc: '2.0', id: 22, method: 'tools/call', params: { name: 'rdc_skill_get', arguments: { name: 'rdc:brochurify', variant: 'cli' } } });