@uoyo/mvtt 2.0.0-beta.6 → 2.1.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 (109) hide show
  1. package/dist/cli.d.ts.map +1 -1
  2. package/dist/cli.js +14 -6
  3. package/dist/cli.js.map +1 -1
  4. package/dist/commands/doctor.d.ts.map +1 -1
  5. package/dist/commands/doctor.js +28 -16
  6. package/dist/commands/doctor.js.map +1 -1
  7. package/dist/commands/install.d.ts.map +1 -1
  8. package/dist/commands/install.js +64 -59
  9. package/dist/commands/install.js.map +1 -1
  10. package/dist/commands/uninstall.d.ts.map +1 -1
  11. package/dist/commands/uninstall.js +58 -25
  12. package/dist/commands/uninstall.js.map +1 -1
  13. package/dist/commands/update.d.ts.map +1 -1
  14. package/dist/commands/update.js +31 -20
  15. package/dist/commands/update.js.map +1 -1
  16. package/dist/fs/materialize.d.ts.map +1 -1
  17. package/dist/fs/materialize.js +3 -2
  18. package/dist/fs/materialize.js.map +1 -1
  19. package/dist/index.js +0 -1
  20. package/dist/index.js.map +1 -1
  21. package/dist/scripts/epic-update.cjs +32 -14
  22. package/dist/scripts/epic-update.md +57 -0
  23. package/dist/scripts/plan-update.cjs +54 -23
  24. package/dist/scripts/plan-update.md +59 -0
  25. package/dist/scripts/session-update.cjs +36 -17
  26. package/dist/types/platform.d.ts +1 -1
  27. package/dist/types/platform.d.ts.map +1 -1
  28. package/dist/types/platform.js +12 -0
  29. package/dist/types/platform.js.map +1 -1
  30. package/dist/util/bilingual.d.ts +10 -0
  31. package/dist/util/bilingual.d.ts.map +1 -0
  32. package/dist/util/bilingual.js +14 -0
  33. package/dist/util/bilingual.js.map +1 -0
  34. package/dist/util/cancel.d.ts +2 -0
  35. package/dist/util/cancel.d.ts.map +1 -0
  36. package/dist/util/cancel.js +6 -0
  37. package/dist/util/cancel.js.map +1 -0
  38. package/dist/util/color.d.ts +9 -6
  39. package/dist/util/color.d.ts.map +1 -1
  40. package/dist/util/color.js +10 -10
  41. package/dist/util/color.js.map +1 -1
  42. package/dist/util/spinner.d.ts +8 -0
  43. package/dist/util/spinner.d.ts.map +1 -0
  44. package/dist/util/spinner.js +17 -0
  45. package/dist/util/spinner.js.map +1 -0
  46. package/install-manifest.yaml +4 -0
  47. package/package.json +4 -3
  48. package/registry.yaml +72 -72
  49. package/sources/defaults/config.yaml +5 -0
  50. package/sources/scripts/epic-update.js +3 -21
  51. package/sources/scripts/epic-update.md +57 -0
  52. package/sources/scripts/plan-update.js +30 -20
  53. package/sources/scripts/plan-update.md +59 -0
  54. package/sources/scripts/session-update.js +7 -23
  55. package/sources/sections/activation-load-config.md +7 -10
  56. package/sources/sections/activation-load-context.md +15 -25
  57. package/sources/sections/activation-preflight.md +1 -1
  58. package/sources/sections/footer-next-steps.md +1 -1
  59. package/sources/sections/language-constraint.md +11 -0
  60. package/sources/sections/output-format-constraint.md +11 -14
  61. package/sources/sections/project-context-profile.md +29 -29
  62. package/sources/sections/script-usage-rule.md +32 -0
  63. package/sources/sections/session-update.md +24 -110
  64. package/sources/skills/mvt-analyze/business.md +1 -1
  65. package/sources/skills/mvt-analyze/manifest.yaml +7 -7
  66. package/sources/skills/mvt-analyze-code/manifest.yaml +7 -7
  67. package/sources/skills/mvt-bug-detect/manifest.yaml +3 -0
  68. package/sources/skills/mvt-check-context/manifest.yaml +3 -0
  69. package/sources/skills/mvt-cleanup/business.md +9 -0
  70. package/sources/skills/mvt-cleanup/manifest.yaml +6 -6
  71. package/sources/skills/mvt-config/business.md +1 -0
  72. package/sources/skills/mvt-config/manifest.yaml +4 -0
  73. package/sources/skills/mvt-create-skill/business.md +1 -1
  74. package/sources/skills/mvt-create-skill/manifest.yaml +1 -1
  75. package/sources/skills/mvt-decompose/business.md +18 -9
  76. package/sources/skills/mvt-decompose/manifest.yaml +7 -7
  77. package/sources/skills/mvt-design/business.md +34 -43
  78. package/sources/skills/mvt-design/manifest.yaml +7 -7
  79. package/sources/skills/mvt-fix/manifest.yaml +6 -6
  80. package/sources/skills/mvt-help/business.md +19 -9
  81. package/sources/skills/mvt-help/manifest.yaml +6 -14
  82. package/sources/skills/mvt-implement/business.md +27 -34
  83. package/sources/skills/mvt-implement/manifest.yaml +8 -14
  84. package/sources/skills/mvt-init/manifest.yaml +6 -6
  85. package/sources/skills/mvt-manage-context/manifest.yaml +1 -1
  86. package/sources/skills/mvt-plan-dev/business.md +12 -2
  87. package/sources/skills/mvt-plan-dev/manifest.yaml +7 -7
  88. package/sources/skills/mvt-quick-dev/manifest.yaml +1 -1
  89. package/sources/skills/mvt-refactor/manifest.yaml +1 -1
  90. package/sources/skills/mvt-resume/manifest.yaml +3 -0
  91. package/sources/skills/mvt-review/business.md +3 -9
  92. package/sources/skills/mvt-review/manifest.yaml +7 -7
  93. package/sources/skills/mvt-status/business.md +2 -12
  94. package/sources/skills/mvt-status/manifest.yaml +3 -0
  95. package/sources/skills/mvt-sync-context/business.md +1 -1
  96. package/sources/skills/mvt-sync-context/manifest.yaml +6 -6
  97. package/sources/skills/mvt-template/manifest.yaml +3 -0
  98. package/sources/skills/mvt-test/business.md +2 -10
  99. package/sources/skills/mvt-test/manifest.yaml +7 -7
  100. package/sources/skills/mvt-update-plan/business.md +12 -27
  101. package/sources/skills/mvt-update-plan/manifest.yaml +12 -6
  102. package/sources/templates/analyze-output/body.md +41 -0
  103. package/sources/templates/decompose-output/body.md +36 -0
  104. package/sources/templates/design-output/body.md +48 -0
  105. package/sources/templates/implement-output/body.md +48 -3
  106. package/sources/templates/project-context/body.md +45 -0
  107. package/sources/templates/review-output/body.md +59 -0
  108. package/sources/templates/test-output/body.md +72 -0
  109. package/sources/sections/output-language-constraint.md +0 -11
@@ -0,0 +1,59 @@
1
+ # Plan Update Script — Full Reference
2
+
3
+ > **This file is the authoritative usage reference for `plan-update.cjs`.**
4
+ > Read this file before calling the script. Do NOT read the `.cjs` or `.js` source to learn flag names or semantics.
5
+
6
+ ## Command
7
+
8
+ ```bash
9
+ node .ai-agents/scripts/plan-update.cjs \
10
+ --plan "<active_change.plan_path>" \
11
+ --task <task_id> \
12
+ --projects "<comma,separated,project,names>" \
13
+ [--status <pending|in_progress|done|blocked|skipped>] \
14
+ [--artifacts "<comma,separated,paths>"] \
15
+ [--notes "<free-form text>"] \
16
+ [--deliverables-pointer current] \
17
+ [--mark-deliverable-stale <task_id>[,task_id2,...]]
18
+ ```
19
+
20
+ Include `--artifacts`, `--notes`, `--deliverables-pointer`, and `--mark-deliverable-stale` only when the skill's logic determines they apply; omit each flag otherwise.
21
+
22
+ ## Argument values
23
+
24
+ | Argument | Value source | Example |
25
+ |----------|-------------|---------|
26
+ | `--plan` | `active_change.plan_path` resolved from session.yaml | `".ai-agents/workspace/artifacts/chg-001/plan.yaml"` |
27
+ | `--task` | the `task_id` being updated (resolved by the skill's Step 1) | `t1` |
28
+ | `--status` | optional; the new status: `pending` / `in_progress` / `done` / `blocked` / `skipped` | `done` |
29
+ | `--projects` | comma-separated project names from `project-context.yaml > projects[].name` (single-project: the sole project name) | `"web,api"` |
30
+ | `--artifacts` | optional; comma-separated paths to append (the script de-duplicates) | `"src/auth.ts,src/auth.test.ts"` |
31
+ | `--notes` | optional; overwrites the task's `notes` | `"blocked on API spec"` |
32
+ | `--deliverables-pointer` | optional; set to `current` to record that this task's deliverables section is written | `current` |
33
+ | `--mark-deliverable-stale` | optional; comma-separated downstream task ids whose deliverables are now stale | `"t3,t4"` |
34
+
35
+ ## Parameter semantics
36
+
37
+ | Argument | When to use | Effect on `plan.yaml` |
38
+ |----------|-------------|------------------------|
39
+ | `--task` + optional `--status` | Use `--status` for status transitions; omit it for metadata-only updates such as deliverables freshness | When present, sets the task status; sets `completed_at` to now when `done`, else `null`; refreshes `plan.updated_at`. When omitted, status, `completed_at`, DAG advancement, and `current_tasks` are left unchanged. |
40
+ | `--projects` | Always (per-project validation) | Drives per-project DAG advancement of `current_tasks` and per-project validation. Required for correct multi-project plans. |
41
+ | `--artifacts` | Task produced or touched files | Appends + de-duplicates paths into the task's `artifacts.files`; handles `artifacts: null`. |
42
+ | `--notes` | Task needs a free-form note | Overwrites the task's existing `notes`. |
43
+ | `--deliverables-pointer` + `--mark-deliverable-stale` | Task wrote its deliverables section (e.g. `/mvt-implement` Step 8) | Records the deliverables pointer on the task; marks the listed downstream tasks' deliverables as stale so `/mvt-resume` and `/mvt-status` surface a warning. Use both flags together in a single invocation. |
44
+
45
+ ## What the script does (deterministically)
46
+
47
+ 1. **Apply**: when `--status` is present, sets the task status and `completed_at`; appends + de-duplicates `--artifacts`; overwrites `--notes`; refreshes `plan.updated_at`.
48
+ 2. **Recompute `current_tasks`** only when `--status` is present (per-project independent advancement): for each project, finds the `in_progress` task or advances the first `pending` task whose `depends_on` are all in `resolvedIds` (done + skipped; blocked does NOT satisfy). Detects `project_switch` when advancement crosses a project boundary. Plan done -> `current_tasks = {}`.
49
+ 3. **Validate** the mutated plan (unique ids, valid `depends_on` references, DAG/no-cycle per project, one `in_progress` per project, every task has acceptance, `completed_at` consistency, `current_tasks` validity, project naming constraint, task project membership).
50
+ 4. **Write atomically** (temp + rename) only if validation passes.
51
+
52
+ ## Output interpretation
53
+
54
+ - **Exit 0**: success. stdout is a single-line JSON object, e.g.:
55
+ ```json
56
+ {"ok":true,"task":{"id":"t1","title":"...","old_status":"in_progress","new_status":"done"},"current_tasks":{"default":"t2"},"plan_status":"in_progress","progress":{"done":1,"total":4},"warning":null,"project_switch":null}
57
+ ```
58
+ Use these fields directly to render output. The file is already written — do NOT read it back to verify. If `warning` is non-null, surface it. If `project_switch` is non-null, note the project boundary crossing.
59
+ - **Exit 1**: failure. stderr carries the error (invalid status, task not found, validation failure, parse/write error). The file was **not** modified. Report the error to the user and do not fabricate a success summary.
@@ -7,7 +7,11 @@ var __getOwnPropNames = Object.getOwnPropertyNames;
7
7
  var __getProtoOf = Object.getPrototypeOf;
8
8
  var __hasOwnProp = Object.prototype.hasOwnProperty;
9
9
  var __commonJS = (cb, mod) => function __require() {
10
- return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
10
+ try {
11
+ return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
12
+ } catch (e) {
13
+ throw mod = 0, e;
14
+ }
11
15
  };
12
16
  var __copyProps = (to, from, except, desc) => {
13
17
  if (from && typeof from === "object" || typeof from === "function") {
@@ -30,13 +34,13 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
30
34
  var require_identity = __commonJS({
31
35
  "node_modules/yaml/dist/nodes/identity.js"(exports2) {
32
36
  "use strict";
33
- var ALIAS = Symbol.for("yaml.alias");
34
- var DOC = Symbol.for("yaml.document");
35
- var MAP = Symbol.for("yaml.map");
36
- var PAIR = Symbol.for("yaml.pair");
37
- var SCALAR = Symbol.for("yaml.scalar");
38
- var SEQ = Symbol.for("yaml.seq");
39
- var NODE_TYPE = Symbol.for("yaml.node.type");
37
+ var ALIAS = /* @__PURE__ */ Symbol.for("yaml.alias");
38
+ var DOC = /* @__PURE__ */ Symbol.for("yaml.document");
39
+ var MAP = /* @__PURE__ */ Symbol.for("yaml.map");
40
+ var PAIR = /* @__PURE__ */ Symbol.for("yaml.pair");
41
+ var SCALAR = /* @__PURE__ */ Symbol.for("yaml.scalar");
42
+ var SEQ = /* @__PURE__ */ Symbol.for("yaml.seq");
43
+ var NODE_TYPE = /* @__PURE__ */ Symbol.for("yaml.node.type");
40
44
  var isAlias = (node) => !!node && typeof node === "object" && node[NODE_TYPE] === ALIAS;
41
45
  var isDocument = (node) => !!node && typeof node === "object" && node[NODE_TYPE] === DOC;
42
46
  var isMap = (node) => !!node && typeof node === "object" && node[NODE_TYPE] === MAP;
@@ -88,9 +92,9 @@ var require_visit = __commonJS({
88
92
  "node_modules/yaml/dist/visit.js"(exports2) {
89
93
  "use strict";
90
94
  var identity = require_identity();
91
- var BREAK = Symbol("break visit");
92
- var SKIP = Symbol("skip children");
93
- var REMOVE = Symbol("remove node");
95
+ var BREAK = /* @__PURE__ */ Symbol("break visit");
96
+ var SKIP = /* @__PURE__ */ Symbol("skip children");
97
+ var REMOVE = /* @__PURE__ */ Symbol("remove node");
94
98
  function visit(node, visitor) {
95
99
  const visitor_ = initVisitor(visitor);
96
100
  if (identity.isDocument(node)) {
@@ -3856,6 +3860,7 @@ var require_resolve_props = __commonJS({
3856
3860
  hasSpace = false;
3857
3861
  break;
3858
3862
  }
3863
+ // else fallthrough
3859
3864
  default:
3860
3865
  onError(token, "UNEXPECTED_TOKEN", `Unexpected ${token.type} token`);
3861
3866
  atNewline = false;
@@ -4564,6 +4569,7 @@ var require_resolve_block_scalar = __commonJS({
4564
4569
  switch (token.type) {
4565
4570
  case "space":
4566
4571
  hasSpace = true;
4572
+ // fallthrough
4567
4573
  case "newline":
4568
4574
  length += token.source.length;
4569
4575
  break;
@@ -4579,6 +4585,7 @@ var require_resolve_block_scalar = __commonJS({
4579
4585
  onError(token, "UNEXPECTED_TOKEN", token.message);
4580
4586
  length += token.source.length;
4581
4587
  break;
4588
+ /* istanbul ignore next should not happen */
4582
4589
  default: {
4583
4590
  const message = `Unexpected token in block scalar header: ${token.type}`;
4584
4591
  onError(token, "UNEXPECTED_TOKEN", message);
@@ -4628,6 +4635,7 @@ var require_resolve_flow_scalar = __commonJS({
4628
4635
  _type = Scalar.Scalar.QUOTE_DOUBLE;
4629
4636
  value = doubleQuotedValue(source, _onError);
4630
4637
  break;
4638
+ /* istanbul ignore next should not happen */
4631
4639
  default:
4632
4640
  onError(scalar, "UNEXPECTED_TOKEN", `Expected a flow scalar value, but found: ${type}`);
4633
4641
  return {
@@ -4649,6 +4657,7 @@ var require_resolve_flow_scalar = __commonJS({
4649
4657
  function plainValue(source, onError) {
4650
4658
  let badChar = "";
4651
4659
  switch (source[0]) {
4660
+ /* istanbul ignore next should not happen */
4652
4661
  case " ":
4653
4662
  badChar = "a tab character";
4654
4663
  break;
@@ -5537,9 +5546,9 @@ var require_cst_stringify = __commonJS({
5537
5546
  var require_cst_visit = __commonJS({
5538
5547
  "node_modules/yaml/dist/parse/cst-visit.js"(exports2) {
5539
5548
  "use strict";
5540
- var BREAK = Symbol("break visit");
5541
- var SKIP = Symbol("skip children");
5542
- var REMOVE = Symbol("remove item");
5549
+ var BREAK = /* @__PURE__ */ Symbol("break visit");
5550
+ var SKIP = /* @__PURE__ */ Symbol("skip children");
5551
+ var REMOVE = /* @__PURE__ */ Symbol("remove item");
5543
5552
  function visit(cst, visitor) {
5544
5553
  if ("type" in cst && cst.type === "document")
5545
5554
  cst = { start: cst.start, value: cst.value };
@@ -5912,6 +5921,7 @@ var require_lexer = __commonJS({
5912
5921
  switch (line[n]) {
5913
5922
  case "#":
5914
5923
  yield* this.pushCount(line.length - n);
5924
+ // fallthrough
5915
5925
  case void 0:
5916
5926
  yield* this.pushNewline();
5917
5927
  return yield* this.parseLineStart();
@@ -6007,6 +6017,7 @@ var require_lexer = __commonJS({
6007
6017
  return "flow";
6008
6018
  }
6009
6019
  }
6020
+ // fallthrough
6010
6021
  default:
6011
6022
  this.flowKey = false;
6012
6023
  return yield* this.parsePlainScalar();
@@ -6084,6 +6095,7 @@ var require_lexer = __commonJS({
6084
6095
  if (next === "\n")
6085
6096
  break;
6086
6097
  }
6098
+ // fallthrough
6087
6099
  default:
6088
6100
  break loop;
6089
6101
  }
@@ -6201,7 +6213,9 @@ var require_lexer = __commonJS({
6201
6213
  case "&":
6202
6214
  return (yield* this.pushUntil(isNotAnchorChar)) + (yield* this.pushSpaces(true)) + (yield* this.pushIndicators());
6203
6215
  case "-":
6216
+ // this is an error
6204
6217
  case "?":
6218
+ // this is an error outside flow collections
6205
6219
  case ":": {
6206
6220
  const inFlow = this.flowLevel > 0;
6207
6221
  const ch1 = this.charAt(1);
@@ -6350,6 +6364,7 @@ var require_parser = __commonJS({
6350
6364
  }
6351
6365
  case "block-seq":
6352
6366
  return parent.items[parent.items.length - 1].start;
6367
+ /* istanbul ignore next should not happen */
6353
6368
  default:
6354
6369
  return [];
6355
6370
  }
@@ -6583,6 +6598,7 @@ var require_parser = __commonJS({
6583
6598
  Object.assign(it, { key: token, sep: [] });
6584
6599
  return;
6585
6600
  }
6601
+ /* istanbul ignore next should not happen */
6586
6602
  default:
6587
6603
  yield* this.pop();
6588
6604
  yield* this.pop(token);
@@ -6704,6 +6720,7 @@ var require_parser = __commonJS({
6704
6720
  }
6705
6721
  yield* this.pop();
6706
6722
  break;
6723
+ /* istanbul ignore next should not happen */
6707
6724
  default:
6708
6725
  yield* this.pop();
6709
6726
  yield* this.step();
@@ -7149,6 +7166,7 @@ var require_parser = __commonJS({
7149
7166
  break;
7150
7167
  case "newline":
7151
7168
  this.onKeyLine = false;
7169
+ // fallthrough
7152
7170
  case "space":
7153
7171
  case "comment":
7154
7172
  default:
@@ -7460,11 +7478,12 @@ function main() {
7460
7478
  session.changes = session.changes.slice(-limits.changes);
7461
7479
  }
7462
7480
  }
7481
+ const isSameChange = session.active_change.id === args["change-id"];
7463
7482
  session.active_change.id = args["change-id"];
7464
7483
  session.active_change.title = args["new-change"];
7465
- session.active_change.created_at = now;
7466
- session.active_change.plan_path = "";
7467
- session.active_change.epic_id = args["epic-id"] || "";
7484
+ session.active_change.created_at = isSameChange ? session.active_change.created_at || now : now;
7485
+ session.active_change.plan_path = isSameChange ? session.active_change.plan_path || "" : "";
7486
+ session.active_change.epic_id = args["epic-id"] || session.active_change.epic_id || "";
7468
7487
  }
7469
7488
  if (args["set-initialized"]) {
7470
7489
  session.session = session.session || {};
@@ -1,4 +1,4 @@
1
- export type PlatformId = "claude" | "qoder";
1
+ export type PlatformId = "claude" | "qoder" | "cursor" | "opencode";
2
2
  export interface PlatformDef {
3
3
  id: PlatformId;
4
4
  dir: string;
@@ -1 +1 @@
1
- {"version":3,"file":"platform.d.ts","sourceRoot":"","sources":["../../src/types/platform.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,OAAO,CAAC;AAE5C,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,UAAU,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,eAAO,MAAM,SAAS,EAAE,WAAW,EAalC,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,UAAU,EAAe,CAAC;AAE1D,wBAAgB,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS,CAEnE;AAED,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,UAAU,EAAE,GAAG,WAAW,EAAE,CAIlE"}
1
+ {"version":3,"file":"platform.d.ts","sourceRoot":"","sources":["../../src/types/platform.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,UAAU,CAAC;AAEpE,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,UAAU,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,eAAO,MAAM,SAAS,EAAE,WAAW,EAyBlC,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,UAAU,EAAe,CAAC;AAE1D,wBAAgB,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS,CAEnE;AAED,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,UAAU,EAAE,GAAG,WAAW,EAAE,CAIlE"}
@@ -11,6 +11,18 @@ export const PLATFORMS = [
11
11
  skillDir: ".qoder/skills",
12
12
  description: "Qoder IDE",
13
13
  },
14
+ {
15
+ id: "cursor",
16
+ dir: ".cursor",
17
+ skillDir: ".cursor/skills",
18
+ description: "Cursor IDE",
19
+ },
20
+ {
21
+ id: "opencode",
22
+ dir: ".opencode",
23
+ skillDir: ".opencode/skills",
24
+ description: "Opencode CLI",
25
+ },
14
26
  ];
15
27
  export const DEFAULT_PLATFORMS = ["claude"];
16
28
  export function getPlatformById(id) {
@@ -1 +1 @@
1
- {"version":3,"file":"platform.js","sourceRoot":"","sources":["../../src/types/platform.ts"],"names":[],"mappings":"AASA,MAAM,CAAC,MAAM,SAAS,GAAkB;IACtC;QACE,EAAE,EAAE,QAAQ;QACZ,GAAG,EAAE,SAAS;QACd,QAAQ,EAAE,gBAAgB;QAC1B,WAAW,EAAE,+CAA+C;KAC7D;IACD;QACE,EAAE,EAAE,OAAO;QACX,GAAG,EAAE,QAAQ;QACb,QAAQ,EAAE,eAAe;QACzB,WAAW,EAAE,WAAW;KACzB;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,iBAAiB,GAAiB,CAAC,QAAQ,CAAC,CAAC;AAE1D,MAAM,UAAU,eAAe,CAAC,EAAU;IACxC,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,GAAiB;IACjD,OAAO,GAAG;SACP,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;SAChC,MAAM,CAAC,CAAC,CAAC,EAAoB,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC;AACtD,CAAC"}
1
+ {"version":3,"file":"platform.js","sourceRoot":"","sources":["../../src/types/platform.ts"],"names":[],"mappings":"AASA,MAAM,CAAC,MAAM,SAAS,GAAkB;IACtC;QACE,EAAE,EAAE,QAAQ;QACZ,GAAG,EAAE,SAAS;QACd,QAAQ,EAAE,gBAAgB;QAC1B,WAAW,EAAE,+CAA+C;KAC7D;IACD;QACE,EAAE,EAAE,OAAO;QACX,GAAG,EAAE,QAAQ;QACb,QAAQ,EAAE,eAAe;QACzB,WAAW,EAAE,WAAW;KACzB;IACD;QACE,EAAE,EAAE,QAAQ;QACZ,GAAG,EAAE,SAAS;QACd,QAAQ,EAAE,gBAAgB;QAC1B,WAAW,EAAE,YAAY;KAC1B;IACD;QACE,EAAE,EAAE,UAAU;QACd,GAAG,EAAE,WAAW;QAChB,QAAQ,EAAE,kBAAkB;QAC5B,WAAW,EAAE,cAAc;KAC5B;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,iBAAiB,GAAiB,CAAC,QAAQ,CAAC,CAAC;AAE1D,MAAM,UAAU,eAAe,CAAC,EAAU;IACxC,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,GAAiB;IACjD,OAAO,GAAG;SACP,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;SAChC,MAAM,CAAC,CAAC,CAAC,EAAoB,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC;AACtD,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Combine an English string with its Chinese translation into a single
3
+ * bilingual message. The English text always comes first, separated from the
4
+ * Chinese text by " / ".
5
+ *
6
+ * @example
7
+ * bilingual("Install complete", "安装完成") // "Install complete / 安装完成"
8
+ */
9
+ export declare function bilingual(en: string, zh: string): string;
10
+ //# sourceMappingURL=bilingual.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bilingual.d.ts","sourceRoot":"","sources":["../../src/util/bilingual.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,wBAAgB,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAGxD"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Combine an English string with its Chinese translation into a single
3
+ * bilingual message. The English text always comes first, separated from the
4
+ * Chinese text by " / ".
5
+ *
6
+ * @example
7
+ * bilingual("Install complete", "安装完成") // "Install complete / 安装完成"
8
+ */
9
+ export function bilingual(en, zh) {
10
+ if (en === zh)
11
+ return en; // Avoid redundancy when both languages are the same
12
+ return `${en} / ${zh}`;
13
+ }
14
+ //# sourceMappingURL=bilingual.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bilingual.js","sourceRoot":"","sources":["../../src/util/bilingual.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,MAAM,UAAU,SAAS,CAAC,EAAU,EAAE,EAAU;IAC9C,IAAI,EAAE,KAAK,EAAE;QAAE,OAAO,EAAE,CAAC,CAAC,oDAAoD;IAC9E,OAAO,GAAG,EAAE,MAAM,EAAE,EAAE,CAAC;AACzB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function cancelled(): never;
2
+ //# sourceMappingURL=cancel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cancel.d.ts","sourceRoot":"","sources":["../../src/util/cancel.ts"],"names":[],"mappings":"AAEA,wBAAgB,SAAS,IAAI,KAAK,CAGjC"}
@@ -0,0 +1,6 @@
1
+ import * as p from "@clack/prompts";
2
+ export function cancelled() {
3
+ p.cancel("Cancelled.");
4
+ throw new Error("Cancelled");
5
+ }
6
+ //# sourceMappingURL=cancel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cancel.js","sourceRoot":"","sources":["../../src/util/cancel.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,gBAAgB,CAAC;AAEpC,MAAM,UAAU,SAAS;IACvB,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;IACvB,MAAM,IAAI,KAAK,CAAC,WAAW,CAAC,CAAC;AAC/B,CAAC"}
@@ -1,9 +1,12 @@
1
1
  export declare const color: {
2
- green: (s: string) => string;
3
- yellow: (s: string) => string;
4
- red: (s: string) => string;
5
- cyan: (s: string) => string;
6
- gray: (s: string) => string;
7
- bold: (s: string) => string;
2
+ green: import("picocolors/types.js").Formatter;
3
+ yellow: import("picocolors/types.js").Formatter;
4
+ red: import("picocolors/types.js").Formatter;
5
+ cyan: import("picocolors/types.js").Formatter;
6
+ gray: import("picocolors/types.js").Formatter;
7
+ bold: import("picocolors/types.js").Formatter;
8
+ dim: import("picocolors/types.js").Formatter;
9
+ magenta: import("picocolors/types.js").Formatter;
10
+ blue: import("picocolors/types.js").Formatter;
8
11
  };
9
12
  //# sourceMappingURL=color.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"color.d.ts","sourceRoot":"","sources":["../../src/util/color.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,KAAK;eACL,MAAM;gBACL,MAAM;aACT,MAAM;cACL,MAAM;cACN,MAAM;cACN,MAAM;CACjB,CAAC"}
1
+ {"version":3,"file":"color.d.ts","sourceRoot":"","sources":["../../src/util/color.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,KAAK;;;;;;;;;;CAUjB,CAAC"}
@@ -1,13 +1,13 @@
1
- const useColor = process.stdout.isTTY && !process.env.NO_COLOR;
2
- function wrap(code, text) {
3
- return useColor ? `\x1b[${code}m${text}\x1b[0m` : text;
4
- }
1
+ import pc from "picocolors";
5
2
  export const color = {
6
- green: (s) => wrap(32, s),
7
- yellow: (s) => wrap(33, s),
8
- red: (s) => wrap(31, s),
9
- cyan: (s) => wrap(36, s),
10
- gray: (s) => wrap(90, s),
11
- bold: (s) => wrap(1, s),
3
+ green: pc.green,
4
+ yellow: pc.yellow,
5
+ red: pc.red,
6
+ cyan: pc.cyan,
7
+ gray: pc.gray,
8
+ bold: pc.bold,
9
+ dim: pc.dim,
10
+ magenta: pc.magenta,
11
+ blue: pc.blue,
12
12
  };
13
13
  //# sourceMappingURL=color.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"color.js","sourceRoot":"","sources":["../../src/util/color.ts"],"names":[],"mappings":"AAAA,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC;AAE/D,SAAS,IAAI,CAAC,IAAY,EAAE,IAAY;IACtC,OAAO,QAAQ,CAAC,CAAC,CAAC,QAAQ,IAAI,IAAI,IAAI,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC;AACzD,CAAC;AAED,MAAM,CAAC,MAAM,KAAK,GAAG;IACnB,KAAK,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;IACjC,MAAM,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;IAClC,GAAG,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;IAC/B,IAAI,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;IAChC,IAAI,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;IAChC,IAAI,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC;CAChC,CAAC"}
1
+ {"version":3,"file":"color.js","sourceRoot":"","sources":["../../src/util/color.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAC;AAE5B,MAAM,CAAC,MAAM,KAAK,GAAG;IACnB,KAAK,EAAE,EAAE,CAAC,KAAK;IACf,MAAM,EAAE,EAAE,CAAC,MAAM;IACjB,GAAG,EAAE,EAAE,CAAC,GAAG;IACX,IAAI,EAAE,EAAE,CAAC,IAAI;IACb,IAAI,EAAE,EAAE,CAAC,IAAI;IACb,IAAI,EAAE,EAAE,CAAC,IAAI;IACb,GAAG,EAAE,EAAE,CAAC,GAAG;IACX,OAAO,EAAE,EAAE,CAAC,OAAO;IACnB,IAAI,EAAE,EAAE,CAAC,IAAI;CACd,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { type Ora } from "ora";
2
+ export type SpinnerHandle = Ora;
3
+ export declare function startSpinner(text: string): SpinnerHandle;
4
+ export declare function withSpinner<T>(text: string, fn: () => Promise<T> | T, options?: {
5
+ successText?: string;
6
+ failText?: string;
7
+ }): Promise<T>;
8
+ //# sourceMappingURL=spinner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spinner.d.ts","sourceRoot":"","sources":["../../src/util/spinner.ts"],"names":[],"mappings":"AAAA,OAAY,EAAE,KAAK,GAAG,EAAE,MAAM,KAAK,CAAC;AAEpC,MAAM,MAAM,aAAa,GAAG,GAAG,CAAC;AAEhC,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,CAExD;AAED,wBAAsB,WAAW,CAAC,CAAC,EACjC,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,EACxB,OAAO,GAAE;IACP,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACd,GACL,OAAO,CAAC,CAAC,CAAC,CAUZ"}
@@ -0,0 +1,17 @@
1
+ import ora from "ora";
2
+ export function startSpinner(text) {
3
+ return ora({ text, color: "cyan" }).start();
4
+ }
5
+ export async function withSpinner(text, fn, options = {}) {
6
+ const spinner = startSpinner(text);
7
+ try {
8
+ const result = await fn();
9
+ spinner.succeed(options.successText ?? text);
10
+ return result;
11
+ }
12
+ catch (err) {
13
+ spinner.fail(options.failText ?? text);
14
+ throw err;
15
+ }
16
+ }
17
+ //# sourceMappingURL=spinner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spinner.js","sourceRoot":"","sources":["../../src/util/spinner.ts"],"names":[],"mappings":"AAAA,OAAO,GAAiB,MAAM,KAAK,CAAC;AAIpC,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,OAAO,GAAG,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;AAC9C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,IAAY,EACZ,EAAwB,EACxB,UAGI,EAAE;IAEN,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IACnC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,EAAE,EAAE,CAAC;QAC1B,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,IAAI,IAAI,CAAC,CAAC;QAC7C,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,IAAI,IAAI,CAAC,CAAC;QACvC,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC"}
@@ -17,6 +17,10 @@ generated:
17
17
  source: "bundle:sources/scripts/plan-update.js"
18
18
  - pattern: ".ai-agents/scripts/epic-update.cjs"
19
19
  source: "bundle:sources/scripts/epic-update.js"
20
+ - pattern: ".ai-agents/scripts/plan-update.md"
21
+ source: "copy:sources/scripts/plan-update.md"
22
+ - pattern: ".ai-agents/scripts/epic-update.md"
23
+ source: "copy:sources/scripts/epic-update.md"
20
24
 
21
25
  create_once:
22
26
  - path: ".ai-agents/config.yaml"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@uoyo/mvtt",
3
- "version": "2.0.0-beta.6",
3
+ "version": "2.1.0",
4
4
  "description": "My Virtual Tech Team - AI-guided prompt orchestration framework",
5
5
  "type": "module",
6
6
  "bin": {
@@ -43,15 +43,16 @@
43
43
  },
44
44
  "devDependencies": {
45
45
  "@types/node": "^25.6.0",
46
- "@types/prompts": "^2.4.9",
47
46
  "@vitest/coverage-v8": "^2.1.9",
48
47
  "esbuild": "^0.28.0",
49
48
  "typescript": "^5.4.0",
50
49
  "vitest": "^2.0.0"
51
50
  },
52
51
  "dependencies": {
52
+ "@clack/prompts": "^1.5.1",
53
53
  "commander": "^14.0.3",
54
- "prompts": "^2.4.2",
54
+ "ora": "^9.4.0",
55
+ "picocolors": "^1.1.1",
55
56
  "yaml": "^2.4.0"
56
57
  },
57
58
  "license": "MIT"
package/registry.yaml CHANGED
@@ -1,72 +1,72 @@
1
- last_updated: "2026-05-23"
2
-
3
- # ============================================================
4
- # Knowledge
5
- # Project-keyed map. Each key is a project name;
6
- # "_all" is the reserved key for entries loaded by all projects and all skills.
7
- # ============================================================
8
- knowledge:
9
- # _all:
10
- # - id: "core"
11
- # source: "knowledge/core/"
12
- # files_from_manifest: true
13
-
14
- # ============================================================
15
- # Skills
16
- # ============================================================
17
- skills:
18
- mvt-init:
19
- description: "Initialize or refresh a project: scan structure, detect tech stack, infer project type."
20
- mvt-status:
21
- description: "Display current project and workflow status: skill history, active changes, session state."
22
- mvt-config:
23
- description: "Manage framework configuration: language, output format, and other settings."
24
- mvt-sync-context:
25
- description: "Synchronize workspace context with code after manual edits or git operations."
26
- mvt-cleanup:
27
- description: "Clean up workspace artifacts, summarize completed changes, and archive change records."
28
- mvt-analyze:
29
- description: "Analyze requirements and extract domain concepts, features, and business rules."
30
- template: .ai-agents/skills/_templates/analyze-output.md
31
- mvt-analyze-code:
32
- description: "Reverse-analyze existing code into project-context.md (terms, modules, layers, rules)."
33
- template: .ai-agents/skills/_templates/project-context.md
34
- mvt-decompose:
35
- description: "Decompose epic-scale requirements into right-sized sub-changes with DAG dependencies."
36
- template: .ai-agents/skills/_templates/decompose-output.md
37
- mvt-design:
38
- description: "Create architecture design from analyzed requirements."
39
- template: .ai-agents/skills/_templates/design-output.md
40
- mvt-plan-dev:
41
- description: "Generate a tracked development plan (plan.yaml) for a large change."
42
- mvt-update-plan:
43
- description: "Update one task in the active plan.yaml: status, artifacts, notes; auto-advance current_task."
44
- mvt-bug-detect:
45
- description: "Diagnose a bug (root cause, severity, impact scope) without applying fixes."
46
- mvt-implement:
47
- description: "Implement features from architecture design; write production code."
48
- template: .ai-agents/skills/_templates/implement-output.md
49
- mvt-fix:
50
- description: "Diagnose and fix bugs or errors in the codebase."
51
- mvt-refactor:
52
- description: "Refactor existing code while preserving behavior."
53
- mvt-quick-dev:
54
- description: "Quickly implement small, well-scoped changes (1-3 files) without the full workflow."
55
- mvt-review:
56
- description: "Review code for quality, standards compliance, and best practices."
57
- template: .ai-agents/skills/_templates/review-output.md
58
- mvt-test:
59
- description: "Generate and design tests to validate implementations."
60
- template: .ai-agents/skills/_templates/test-output.md
61
- mvt-help:
62
- description: "Show available skills, project status, and workflow guidance."
63
- mvt-resume:
64
- description: "Resume an in-progress task in a new conversation from session.yaml and recent artifacts."
65
- mvt-create-skill:
66
- description: "Create custom MVTT skills through an interactive guided workflow."
67
- mvt-manage-context:
68
- description: "Manage knowledge and registry: add (with AI routing), remove, move, rename, list."
69
- mvt-check-context:
70
- description: "Analyze context token load and provide optimization recommendations."
71
- mvt-template:
72
- description: "View, customize, and manage output templates for MVTT skills."
1
+ last_updated: "2026-05-23"
2
+
3
+ # ============================================================
4
+ # Knowledge
5
+ # Project-keyed map. Each key is a project name;
6
+ # "_all" is the reserved key for entries loaded by all projects and all skills.
7
+ # ============================================================
8
+ knowledge:
9
+ # _all:
10
+ # - id: "core"
11
+ # source: "knowledge/core/"
12
+ # files_from_manifest: true
13
+
14
+ # ============================================================
15
+ # Skills
16
+ # ============================================================
17
+ skills:
18
+ mvt-init:
19
+ description: "Initialize or refresh a project: scan structure, detect tech stack, infer project type."
20
+ mvt-status:
21
+ description: "Display current project and workflow status: skill history, active changes, session state."
22
+ mvt-config:
23
+ description: "Manage framework configuration: language, output format, and other settings."
24
+ mvt-sync-context:
25
+ description: "Synchronize workspace context with code after manual edits or git operations."
26
+ mvt-cleanup:
27
+ description: "Clean up workspace artifacts, summarize completed changes, and archive change records."
28
+ mvt-analyze:
29
+ description: "Analyze requirements and extract domain concepts, features, and business rules."
30
+ template: .ai-agents/skills/_templates/analyze-output.md
31
+ mvt-analyze-code:
32
+ description: "Reverse-analyze existing code into project-context.md (terms, modules, layers, rules)."
33
+ template: .ai-agents/skills/_templates/project-context.md
34
+ mvt-decompose:
35
+ description: "Decompose epic-scale requirements into right-sized sub-changes with DAG dependencies."
36
+ template: .ai-agents/skills/_templates/decompose-output.md
37
+ mvt-design:
38
+ description: "Create architecture design from analyzed requirements."
39
+ template: .ai-agents/skills/_templates/design-output.md
40
+ mvt-plan-dev:
41
+ description: "Generate a tracked development plan (plan.yaml) for a large change."
42
+ mvt-update-plan:
43
+ description: "Update one task in the active plan.yaml: status, artifacts, notes; auto-advance current_task."
44
+ mvt-bug-detect:
45
+ description: "Diagnose a bug (root cause, severity, impact scope) without applying fixes."
46
+ mvt-implement:
47
+ description: "Implement features from architecture design; write production code."
48
+ template: .ai-agents/skills/_templates/implement-output.md
49
+ mvt-fix:
50
+ description: "Diagnose and fix bugs or errors in the codebase."
51
+ mvt-refactor:
52
+ description: "Refactor existing code while preserving behavior."
53
+ mvt-quick-dev:
54
+ description: "Quickly implement small, well-scoped changes (1-3 files) without the full workflow."
55
+ mvt-review:
56
+ description: "Review code for quality, standards compliance, and best practices."
57
+ template: .ai-agents/skills/_templates/review-output.md
58
+ mvt-test:
59
+ description: "Generate and design tests to validate implementations."
60
+ template: .ai-agents/skills/_templates/test-output.md
61
+ mvt-help:
62
+ description: "Show available skills, project status, and workflow guidance."
63
+ mvt-resume:
64
+ description: "Resume an in-progress task in a new conversation from session.yaml and recent artifacts."
65
+ mvt-create-skill:
66
+ description: "Create custom MVTT skills through an interactive guided workflow."
67
+ mvt-manage-context:
68
+ description: "Manage knowledge and registry: add (with AI routing), remove, move, rename, list."
69
+ mvt-check-context:
70
+ description: "Analyze context token load and provide optimization recommendations."
71
+ mvt-template:
72
+ description: "View, customize, and manage output templates for MVTT skills."
@@ -20,3 +20,8 @@ preferences:
20
20
  history_limits:
21
21
  history: 10
22
22
  changes: 10
23
+
24
+ # Planning granularity for /mvt-plan-dev
25
+ # Options: coarse (fewer, larger tasks) | medium (balanced) | fine (more, smaller tasks)
26
+ planning:
27
+ granularity: medium