cc-devflow 4.4.1 → 4.5.0

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.
Files changed (65) hide show
  1. package/.claude/skills/cc-act/CHANGELOG.md +6 -0
  2. package/.claude/skills/cc-act/SKILL.md +9 -1
  3. package/.claude/skills/cc-act/assets/PR_BRIEF_TEMPLATE.md +4 -0
  4. package/.claude/skills/cc-act/assets/RELEASE_NOTE_TEMPLATE.md +4 -0
  5. package/.claude/skills/cc-act/scripts/cc-act-common.sh +5 -0
  6. package/.claude/skills/cc-act/scripts/render-pr-brief.sh +5 -0
  7. package/.claude/skills/cc-act/scripts/sync-act-docs.sh +14 -1
  8. package/.claude/skills/cc-check/CHANGELOG.md +5 -0
  9. package/.claude/skills/cc-check/SKILL.md +9 -1
  10. package/.claude/skills/cc-check/assets/REPORT_CARD_TEMPLATE.json +3 -0
  11. package/.claude/skills/cc-do/CHANGELOG.md +5 -0
  12. package/.claude/skills/cc-do/SKILL.md +9 -1
  13. package/.claude/skills/cc-investigate/CHANGELOG.md +5 -0
  14. package/.claude/skills/cc-investigate/SKILL.md +9 -1
  15. package/.claude/skills/cc-investigate/assets/ANALYSIS_TEMPLATE.md +1 -0
  16. package/.claude/skills/cc-investigate/assets/TASKS_TEMPLATE.md +1 -0
  17. package/.claude/skills/cc-investigate/assets/TASK_MANIFEST_TEMPLATE.json +3 -0
  18. package/.claude/skills/cc-plan/CHANGELOG.md +5 -0
  19. package/.claude/skills/cc-plan/SKILL.md +9 -1
  20. package/.claude/skills/cc-plan/assets/DESIGN_TEMPLATE.md +1 -0
  21. package/.claude/skills/cc-plan/assets/TASKS_TEMPLATE.md +1 -0
  22. package/.claude/skills/cc-plan/assets/TASK_MANIFEST_TEMPLATE.json +3 -0
  23. package/.claude/skills/cc-plan/assets/TINY_DESIGN_TEMPLATE.md +1 -0
  24. package/.claude/skills/cc-roadmap/CHANGELOG.md +5 -0
  25. package/.claude/skills/cc-roadmap/SKILL.md +9 -1
  26. package/.claude/skills/cc-roadmap/assets/BACKLOG_TEMPLATE.md +1 -0
  27. package/.claude/skills/cc-roadmap/assets/ROADMAP_TEMPLATE.md +1 -0
  28. package/.claude/skills/cc-roadmap/assets/TRACKING_TEMPLATE.json +4 -1
  29. package/.claude/skills/cc-spec-init/CHANGELOG.md +5 -0
  30. package/.claude/skills/cc-spec-init/SKILL.md +9 -1
  31. package/.claude/skills/cc-spec-init/assets/CAPABILITY_TEMPLATE.md +1 -0
  32. package/.claude/skills/cc-spec-init/assets/CHANGE_META_TEMPLATE.json +3 -0
  33. package/.claude/skills/cc-spec-init/assets/INDEX_TEMPLATE.md +1 -0
  34. package/CHANGELOG.md +19 -0
  35. package/README.md +43 -0
  36. package/README.zh-CN.md +43 -0
  37. package/bin/cc-devflow-cli.js +226 -0
  38. package/config/schema/cc-devflow-config.schema.json +45 -0
  39. package/config/user-config.template.yml +16 -0
  40. package/docs/examples/example-bindings.json +8 -8
  41. package/docs/examples/full-design-blocked/BACKLOG.md +1 -1
  42. package/docs/examples/full-design-blocked/README.md +1 -1
  43. package/docs/examples/full-design-blocked/ROADMAP.md +1 -1
  44. package/docs/examples/full-design-blocked/changes/REQ-002-bulk-invite-import/planning/design.md +1 -1
  45. package/docs/examples/full-design-blocked/changes/REQ-002-bulk-invite-import/planning/tasks.md +1 -1
  46. package/docs/examples/full-design-blocked/roadmap-tracking.json +1 -1
  47. package/docs/examples/local-handoff/BACKLOG.md +1 -1
  48. package/docs/examples/local-handoff/README.md +1 -1
  49. package/docs/examples/local-handoff/ROADMAP.md +1 -1
  50. package/docs/examples/local-handoff/changes/REQ-003-audit-log-export/planning/design.md +1 -1
  51. package/docs/examples/local-handoff/changes/REQ-003-audit-log-export/planning/tasks.md +1 -1
  52. package/docs/examples/local-handoff/roadmap-tracking.json +1 -1
  53. package/docs/examples/pdca-loop/BACKLOG.md +1 -1
  54. package/docs/examples/pdca-loop/README.md +1 -1
  55. package/docs/examples/pdca-loop/ROADMAP.md +1 -1
  56. package/docs/examples/pdca-loop/changes/REQ-001-copy-invite-link/planning/design.md +1 -1
  57. package/docs/examples/pdca-loop/changes/REQ-001-copy-invite-link/planning/task-manifest.json +2 -2
  58. package/docs/examples/pdca-loop/changes/REQ-001-copy-invite-link/planning/tasks.md +1 -1
  59. package/docs/examples/pdca-loop/roadmap-tracking.json +1 -1
  60. package/lib/skill-runtime/__tests__/cli-bootstrap.integration.test.js +112 -2
  61. package/lib/skill-runtime/__tests__/config.test.js +161 -0
  62. package/lib/skill-runtime/__tests__/runtime.integration.test.js +2 -0
  63. package/lib/skill-runtime/config.js +379 -0
  64. package/lib/skill-runtime/index.js +2 -0
  65. package/package.json +1 -1
@@ -7,6 +7,13 @@ const PACKAGE_ROOT = path.resolve(__dirname, '..');
7
7
  const TEMPLATE_DIR = path.join(PACKAGE_ROOT, '.claude');
8
8
  const TEMPLATE_SKILLS_DIR = path.join(TEMPLATE_DIR, 'skills');
9
9
  const DISTRIBUTION_CONFIG = require(path.join(PACKAGE_ROOT, 'config', 'distributable-skills.json'));
10
+ const {
11
+ doctorUserConfig,
12
+ getConfigValue,
13
+ resolveUserConfig,
14
+ setConfigValue,
15
+ writeConfigTemplate
16
+ } = require(path.join(PACKAGE_ROOT, 'lib/skill-runtime/config.js'));
10
17
  const ADAPT_BIN = path.join(PACKAGE_ROOT, 'bin', 'adapt.js');
11
18
  const ADAPTER_BIN = path.join(PACKAGE_ROOT, 'bin', 'cc-devflow.js');
12
19
  const TEMPLATE_IGNORES = new Set(['.DS_Store', 'tsc-cache']);
@@ -42,6 +49,11 @@ Usage: cc-devflow <command> [options]
42
49
  Commands:
43
50
  init Install .claude template into a project
44
51
  adapt Compile .claude into multi-platform outputs
52
+ config init Create a YAML config template
53
+ config get Print one resolved config value
54
+ config set Set one project/user/local config value
55
+ config resolve Print resolved YAML config with key-level trace
56
+ config doctor Validate config and local ignore safety
45
57
 
46
58
  Init options:
47
59
  --dir <path> Target project path (default: cwd)
@@ -56,11 +68,26 @@ Adapt options:
56
68
  --rules Generate rules entry files only
57
69
  --verbose Show detailed output
58
70
 
71
+ Config options:
72
+ --cwd <path> Project path used for project/local config lookup
73
+ --user Read/write ~/.cc-devflow/config.yml
74
+ --project Read/write .cc-devflow/config.yml
75
+ --local Read/write .cc-devflow/config.local.yml
76
+ --scope <name> Backward-compatible scope alias: user, project, or local
77
+ --format <name> Output format: json or policy
78
+ --document-language CLI override for output.document_language
79
+ --trace Include key-level source trace with policy output
80
+ --force Overwrite an existing config template
81
+
59
82
  Examples:
60
83
  cc-devflow init
61
84
  cc-devflow init --dir /path/to/project
62
85
  cc-devflow adapt --platform cursor
63
86
  cc-devflow adapt --cwd /path/to/project --platform codex
87
+ cc-devflow config init --cwd /path/to/project --project
88
+ cc-devflow config set output.document_language zh-CN --cwd /path/to/project --project
89
+ cc-devflow config set output.document_language zh-CN --user
90
+ cc-devflow config resolve --cwd /path/to/project --format policy
64
91
  `);
65
92
  }
66
93
 
@@ -210,6 +237,201 @@ function runInit(args) {
210
237
  return 0;
211
238
  }
212
239
 
240
+ function parseConfigArgs(args) {
241
+ const parsed = {
242
+ cwd: null,
243
+ documentLanguage: null,
244
+ force: false,
245
+ format: 'json',
246
+ scope: 'project',
247
+ trace: false
248
+ };
249
+ const rest = [];
250
+
251
+ for (let i = 0; i < args.length; i++) {
252
+ const arg = args[i];
253
+
254
+ if (arg === '--force') {
255
+ parsed.force = true;
256
+ continue;
257
+ }
258
+
259
+ if (arg === '--trace') {
260
+ parsed.trace = true;
261
+ continue;
262
+ }
263
+
264
+ if (arg === '--user') {
265
+ parsed.scope = 'user';
266
+ continue;
267
+ }
268
+
269
+ if (arg === '--project') {
270
+ parsed.scope = 'project';
271
+ continue;
272
+ }
273
+
274
+ if (arg === '--local') {
275
+ parsed.scope = 'local';
276
+ continue;
277
+ }
278
+
279
+ if (arg === '--cwd') {
280
+ parsed.cwd = args[++i];
281
+ continue;
282
+ }
283
+
284
+ if (arg.startsWith('--cwd=')) {
285
+ parsed.cwd = arg.slice('--cwd='.length);
286
+ continue;
287
+ }
288
+
289
+ if (arg === '--scope') {
290
+ parsed.scope = args[++i];
291
+ continue;
292
+ }
293
+
294
+ if (arg.startsWith('--scope=')) {
295
+ parsed.scope = arg.slice('--scope='.length);
296
+ continue;
297
+ }
298
+
299
+ if (arg === '--format') {
300
+ parsed.format = args[++i];
301
+ continue;
302
+ }
303
+
304
+ if (arg.startsWith('--format=')) {
305
+ parsed.format = arg.slice('--format='.length);
306
+ continue;
307
+ }
308
+
309
+ if (arg === '--document-language') {
310
+ parsed.documentLanguage = args[++i];
311
+ continue;
312
+ }
313
+
314
+ if (arg.startsWith('--document-language=')) {
315
+ parsed.documentLanguage = arg.slice('--document-language='.length);
316
+ continue;
317
+ }
318
+
319
+ rest.push(arg);
320
+ }
321
+
322
+ parsed.rest = rest;
323
+ return parsed;
324
+ }
325
+
326
+ function parseConfigOverrides(options) {
327
+ if (!options.documentLanguage) {
328
+ return {};
329
+ }
330
+
331
+ return {
332
+ output: {
333
+ document_language: options.documentLanguage
334
+ }
335
+ };
336
+ }
337
+
338
+ function runConfig(args) {
339
+ const [subcommand, ...rest] = args;
340
+ const options = parseConfigArgs(rest);
341
+ const cwd = path.resolve(options.cwd || process.cwd());
342
+
343
+ if (subcommand === 'init') {
344
+ const configPath = writeConfigTemplate({
345
+ cwd,
346
+ force: options.force,
347
+ scope: options.scope
348
+ });
349
+ console.log(`Config template ready: ${configPath}`);
350
+ return 0;
351
+ }
352
+
353
+ if (subcommand === 'get') {
354
+ const keyPath = options.rest[0];
355
+ if (!keyPath) {
356
+ console.error('Config key is required.');
357
+ return 3;
358
+ }
359
+
360
+ const resolved = resolveUserConfig({
361
+ cwd,
362
+ overrides: parseConfigOverrides(options)
363
+ });
364
+ const value = getConfigValue(resolved.config, keyPath);
365
+ if (value === undefined) {
366
+ return 4;
367
+ }
368
+ process.stdout.write(`${typeof value === 'object' ? JSON.stringify(value, null, 2) : String(value)}\n`);
369
+ return 0;
370
+ }
371
+
372
+ if (subcommand === 'set') {
373
+ const [keyPath, value] = options.rest;
374
+ if (!keyPath || value === undefined) {
375
+ console.error('Use: cc-devflow config set <key> <value>');
376
+ return 3;
377
+ }
378
+
379
+ const configPath = setConfigValue(keyPath, value, {
380
+ cwd,
381
+ scope: options.scope
382
+ });
383
+ console.log(`Updated ${configPath}`);
384
+ return 0;
385
+ }
386
+
387
+ if (subcommand === 'doctor') {
388
+ const result = doctorUserConfig({
389
+ cwd,
390
+ overrides: parseConfigOverrides(options)
391
+ });
392
+
393
+ if (result.ok) {
394
+ console.log('Config OK');
395
+ return 0;
396
+ }
397
+
398
+ for (const warning of result.warnings) {
399
+ console.error(`Config warning: ${warning}`);
400
+ }
401
+ return 2;
402
+ }
403
+
404
+ if (subcommand !== 'resolve') {
405
+ console.error('Unknown config command. Use: cc-devflow config init|get|set|resolve|doctor');
406
+ return 3;
407
+ }
408
+
409
+ const resolved = resolveUserConfig({
410
+ cwd,
411
+ overrides: parseConfigOverrides(options)
412
+ });
413
+
414
+ if (options.format === 'policy') {
415
+ process.stdout.write(resolved.policy || '');
416
+ if (options.trace) {
417
+ process.stdout.write('\nTrace:\n');
418
+ for (const entry of resolved.trace) {
419
+ const sourcePath = entry.path ? ` ${entry.path}` : '';
420
+ process.stdout.write(`- ${entry.key} = ${entry.value} (${entry.source}${sourcePath})\n`);
421
+ }
422
+ }
423
+ return 0;
424
+ }
425
+
426
+ if (options.format !== 'json') {
427
+ console.error(`Unknown config format: ${options.format}`);
428
+ return 3;
429
+ }
430
+
431
+ process.stdout.write(`${JSON.stringify(resolved, null, 2)}\n`);
432
+ return 0;
433
+ }
434
+
213
435
  function runAdapt(args) {
214
436
  const { options, rest } = parseCliArgs(args);
215
437
 
@@ -270,6 +492,10 @@ function main() {
270
492
  return runAdapt(rest);
271
493
  }
272
494
 
495
+ if (command === 'config') {
496
+ return runConfig(rest);
497
+ }
498
+
273
499
  return runAdapter(command, rest);
274
500
  }
275
501
 
@@ -0,0 +1,45 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "title": "CC-DevFlow User Config",
4
+ "type": "object",
5
+ "additionalProperties": false,
6
+ "properties": {
7
+ "version": {
8
+ "type": "integer",
9
+ "enum": [1]
10
+ },
11
+ "output": {
12
+ "type": "object",
13
+ "additionalProperties": false,
14
+ "properties": {
15
+ "document_language": {
16
+ "type": "string",
17
+ "enum": ["en", "zh-CN"]
18
+ }
19
+ }
20
+ },
21
+ "agent_preferences": {
22
+ "type": "object",
23
+ "description": "Advisory user preferences. These can be non-standard, but they do not override workflow contracts.",
24
+ "additionalProperties": {
25
+ "oneOf": [
26
+ { "type": "string" },
27
+ { "type": "number" },
28
+ { "type": "boolean" },
29
+ {
30
+ "type": "array",
31
+ "items": {
32
+ "type": ["string", "number", "boolean", "object", "array", "null"]
33
+ }
34
+ },
35
+ {
36
+ "type": "object",
37
+ "additionalProperties": true
38
+ },
39
+ { "type": "null" }
40
+ ]
41
+ }
42
+ }
43
+ },
44
+ "required": ["version"]
45
+ }
@@ -0,0 +1,16 @@
1
+ version: 1
2
+
3
+ output:
4
+ # Machine-enforced. Supported values: en, zh-CN.
5
+ document_language: zh-CN
6
+
7
+ # Advisory preferences. cc-devflow preserves these values and exposes them in
8
+ # `cc-devflow config resolve --format policy`, but workflow rules still win.
9
+ agent_preferences:
10
+ general:
11
+ - Durable planning, review, and handoff documents should be direct and verifiable.
12
+ - State assumptions before task breakdowns.
13
+ planning:
14
+ - Record trade-offs and non-goals before implementation tasks.
15
+ review:
16
+ - List behavior risks before style suggestions.
@@ -1,13 +1,13 @@
1
1
  {
2
- "updatedAt": "2026-04-25",
2
+ "updatedAt": "2026-04-27",
3
3
  "skills": {
4
- "cc-roadmap": "4.3.1",
5
- "cc-plan": "3.5.3",
6
- "cc-investigate": "1.1.1",
7
- "cc-do": "1.5.1",
8
- "cc-check": "1.8.1",
9
- "cc-act": "1.6.1",
10
- "cc-spec-init": "1.0.0"
4
+ "cc-roadmap": "4.3.2",
5
+ "cc-plan": "3.5.4",
6
+ "cc-investigate": "1.1.2",
7
+ "cc-do": "1.5.2",
8
+ "cc-check": "1.8.2",
9
+ "cc-act": "1.6.2",
10
+ "cc-spec-init": "1.0.1"
11
11
  },
12
12
  "examples": [
13
13
  {
@@ -3,7 +3,7 @@
3
3
  ## Backlog Meta
4
4
 
5
5
  - Roadmap version: `roadmap.v2`
6
- - Skill version: `4.3.1`
6
+ - Skill version: `4.3.2`
7
7
  - Last synced: `2026-04-19`
8
8
  - Current focus stage: `Stage 2`
9
9
  - Tracking source: `roadmap-tracking.json`
@@ -4,7 +4,7 @@
4
4
 
5
5
  - Example version: `1.0.0`
6
6
  - Last reviewed: `2026-04-17`
7
- - Bound skills: `cc-roadmap@4.3.1`, `cc-plan@3.5.3`, `cc-do@1.5.1`, `cc-check@1.8.1`
7
+ - Bound skills: `cc-roadmap@4.3.2`, `cc-plan@3.5.4`, `cc-do@1.5.2`, `cc-check@1.8.2`
8
8
 
9
9
  This example shows a requirement that **looked executable**, but `cc-check` correctly stopped it and sent it back to `cc-plan`.
10
10
 
@@ -3,7 +3,7 @@
3
3
  ## Roadmap Meta
4
4
 
5
5
  - Roadmap version: `roadmap.v2`
6
- - Skill version: `4.3.1`
6
+ - Skill version: `4.3.2`
7
7
  - Status: `active`
8
8
  - Last updated: `2026-04-16`
9
9
  - Owner / decider: `product-owner`
@@ -4,7 +4,7 @@
4
4
 
5
5
  - Requirement version: `REQ-002.v2`
6
6
  - Design version: `design.v2`
7
- - CC-Plan skill version: `3.5.3`
7
+ - CC-Plan skill version: `3.5.4`
8
8
  - Requirement ID: `REQ-002`
9
9
  - Design mode: `full-design`
10
10
  - Why not `tiny-design`: the feature crosses import parsing, invite rules, billing limits, duplicate handling, and audit logging
@@ -4,7 +4,7 @@
4
4
 
5
5
  - Requirement version: `REQ-002.v2`
6
6
  - Design version: `design.v2`
7
- - CC-Plan skill version: `3.5.3`
7
+ - CC-Plan skill version: `3.5.4`
8
8
  - Source roadmap item: `RM-010`
9
9
  - Source roadmap version: `roadmap.v2`
10
10
 
@@ -3,7 +3,7 @@
3
3
  "lastSyncedAt": "2026-04-19",
4
4
  "backlogMeta": {
5
5
  "roadmapVersion": "roadmap.v2",
6
- "skillVersion": "4.3.1",
6
+ "skillVersion": "4.3.2",
7
7
  "currentFocusStage": "Stage 2"
8
8
  },
9
9
  "dependencyHandoff": {
@@ -3,7 +3,7 @@
3
3
  ## Backlog Meta
4
4
 
5
5
  - Roadmap version: `roadmap.v2`
6
- - Skill version: `4.3.1`
6
+ - Skill version: `4.3.2`
7
7
  - Last synced: `2026-04-19`
8
8
  - Current focus stage: `Stage 2`
9
9
  - Tracking source: `roadmap-tracking.json`
@@ -4,7 +4,7 @@
4
4
 
5
5
  - Example version: `1.0.0`
6
6
  - Last reviewed: `2026-04-17`
7
- - Bound skills: `cc-roadmap@4.3.1`, `cc-plan@3.5.3`, `cc-do@1.5.1`, `cc-check@1.8.1`, `cc-act@1.6.1`
7
+ - Bound skills: `cc-roadmap@4.3.2`, `cc-plan@3.5.4`, `cc-do@1.5.2`, `cc-check@1.8.2`, `cc-act@1.6.2`
8
8
 
9
9
  This example shows verified work that is **ready to move forward**, but `cc-act` still chooses `local-handoff`.
10
10
 
@@ -3,7 +3,7 @@
3
3
  ## Roadmap Meta
4
4
 
5
5
  - Roadmap version: `roadmap.v3`
6
- - Skill version: `4.3.1`
6
+ - Skill version: `4.3.2`
7
7
  - Status: `active`
8
8
  - Last updated: `2026-04-16`
9
9
  - Owner / decider: `product-owner`
@@ -4,7 +4,7 @@
4
4
 
5
5
  - Requirement version: `REQ-003.v1`
6
6
  - Design version: `design.v1`
7
- - CC-Plan skill version: `3.5.3`
7
+ - CC-Plan skill version: `3.5.4`
8
8
  - Requirement ID: `REQ-003`
9
9
  - Design mode: `tiny-design`
10
10
  - Why this stays `tiny-design`: the patch adds one export action inside the existing admin audit UI without changing data contracts
@@ -4,7 +4,7 @@
4
4
 
5
5
  - Requirement version: `REQ-003.v1`
6
6
  - Design version: `design.v1`
7
- - CC-Plan skill version: `3.5.3`
7
+ - CC-Plan skill version: `3.5.4`
8
8
  - Source roadmap item: `RM-020`
9
9
  - Source roadmap version: `roadmap.v3`
10
10
 
@@ -3,7 +3,7 @@
3
3
  "lastSyncedAt": "2026-04-19",
4
4
  "backlogMeta": {
5
5
  "roadmapVersion": "roadmap.v2",
6
- "skillVersion": "4.3.1",
6
+ "skillVersion": "4.3.2",
7
7
  "currentFocusStage": "Stage 2"
8
8
  },
9
9
  "dependencyHandoff": {
@@ -3,7 +3,7 @@
3
3
  ## Backlog Meta
4
4
 
5
5
  - Roadmap version: `roadmap.v1`
6
- - Skill version: `4.3.1`
6
+ - Skill version: `4.3.2`
7
7
  - Last synced: `2026-04-19`
8
8
  - Current focus stage: `Stage 1`
9
9
  - Tracking source: `roadmap-tracking.json`
@@ -4,7 +4,7 @@
4
4
 
5
5
  - Example version: `1.0.0`
6
6
  - Last reviewed: `2026-04-17`
7
- - Bound skills: `cc-roadmap@4.3.1`, `cc-plan@3.5.3`, `cc-do@1.5.1`, `cc-check@1.8.1`, `cc-act@1.6.1`
7
+ - Bound skills: `cc-roadmap@4.3.2`, `cc-plan@3.5.4`, `cc-do@1.5.2`, `cc-check@1.8.2`, `cc-act@1.6.2`
8
8
 
9
9
  This folder shows one minimal but complete `cc-roadmap -> cc-plan -> cc-do -> cc-check -> cc-act` loop.
10
10
 
@@ -3,7 +3,7 @@
3
3
  ## Roadmap Meta
4
4
 
5
5
  - Roadmap version: `roadmap.v1`
6
- - Skill version: `4.3.1`
6
+ - Skill version: `4.3.2`
7
7
  - Status: `active`
8
8
  - Last updated: `2026-04-15`
9
9
  - Owner / decider: `product-owner`
@@ -4,7 +4,7 @@
4
4
 
5
5
  - Requirement version: `REQ-001.v1`
6
6
  - Design version: `design.v1`
7
- - CC-Plan skill version: `3.5.3`
7
+ - CC-Plan skill version: `3.5.4`
8
8
  - Requirement ID: `REQ-001`
9
9
  - Design mode: `tiny-design`
10
10
  - Why this stays `tiny-design`: the patch is limited to an existing dialog and test file, with no API or data model changes
@@ -9,7 +9,7 @@
9
9
  "sourceRoadmap": {
10
10
  "itemId": "RM-001",
11
11
  "roadmapVersion": "roadmap.v1",
12
- "roadmapSkillVersion": "4.3.1",
12
+ "roadmapSkillVersion": "4.3.2",
13
13
  "sourceStage": "Stage 1",
14
14
  "successSignal": "Users can copy the invite link with one click",
15
15
  "killSignal": "The patch requires backend or permission changes",
@@ -22,7 +22,7 @@
22
22
  ]
23
23
  },
24
24
  "planningMeta": {
25
- "reqPlanSkillVersion": "3.5.3",
25
+ "reqPlanSkillVersion": "3.5.4",
26
26
  "designVersion": "design.v1",
27
27
  "approvedAt": "2026-04-15T10:05:00.000Z",
28
28
  "approvedBy": "user",
@@ -4,7 +4,7 @@
4
4
 
5
5
  - Requirement version: `REQ-001.v1`
6
6
  - Design version: `design.v1`
7
- - CC-Plan skill version: `3.5.3`
7
+ - CC-Plan skill version: `3.5.4`
8
8
  - Source roadmap item: `RM-001`
9
9
  - Source roadmap version: `roadmap.v1`
10
10
 
@@ -3,7 +3,7 @@
3
3
  "lastSyncedAt": "2026-04-19",
4
4
  "backlogMeta": {
5
5
  "roadmapVersion": "roadmap.v1",
6
- "skillVersion": "4.3.1",
6
+ "skillVersion": "4.3.2",
7
7
  "currentFocusStage": "Stage 1"
8
8
  },
9
9
  "dependencyHandoff": {