@uoyo/mvtt 2.0.0-beta.2 → 2.0.0-beta.4
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/README.md +1 -11
- package/dist/build/section-loader.d.ts.map +1 -1
- package/dist/build/section-loader.js +18 -8
- package/dist/build/section-loader.js.map +1 -1
- package/dist/fs/materialize.d.ts.map +1 -1
- package/dist/fs/materialize.js +12 -4
- package/dist/fs/materialize.js.map +1 -1
- package/dist/fs/registry-merge.d.ts +19 -0
- package/dist/fs/registry-merge.d.ts.map +1 -0
- package/dist/fs/registry-merge.js +177 -0
- package/dist/fs/registry-merge.js.map +1 -0
- package/dist/scripts/plan-update.cjs +7563 -0
- package/dist/scripts/session-update.cjs +7568 -0
- package/install-manifest.yaml +8 -2
- package/package.json +3 -2
- package/sources/defaults/config.yaml +7 -7
- package/sources/defaults/session.yaml +9 -16
- package/sources/scripts/plan-update.js +353 -0
- package/sources/scripts/session-update.js +351 -0
- package/sources/sections/activation-load-context.md +4 -0
- package/sources/sections/footer-next-steps.md +1 -1
- package/sources/sections/output-format-constraint.md +14 -0
- package/sources/sections/project-context-profile.md +29 -0
- package/sources/sections/session-update.md +100 -32
- package/sources/skills/mvt-analyze/manifest.yaml +4 -0
- package/sources/skills/mvt-analyze-code/manifest.yaml +24 -4
- package/sources/skills/mvt-bug-detect/business.md +99 -101
- package/sources/skills/mvt-bug-detect/manifest.yaml +84 -84
- package/sources/skills/mvt-check-context/business.md +3 -5
- package/sources/skills/mvt-check-context/manifest.yaml +15 -8
- package/sources/skills/mvt-cleanup/business.md +49 -23
- package/sources/skills/mvt-cleanup/manifest.yaml +18 -10
- package/sources/skills/mvt-config/business.md +1 -2
- package/sources/skills/mvt-config/manifest.yaml +11 -4
- package/sources/skills/mvt-create-skill/business.md +6 -5
- package/sources/skills/mvt-create-skill/manifest.yaml +30 -11
- package/sources/skills/mvt-design/business.md +3 -6
- package/sources/skills/mvt-design/manifest.yaml +17 -1
- package/sources/skills/mvt-fix/business.md +2 -1
- package/sources/skills/mvt-fix/manifest.yaml +9 -3
- package/sources/skills/mvt-help/business.md +2 -4
- package/sources/skills/mvt-help/manifest.yaml +13 -5
- package/sources/skills/mvt-implement/business.md +10 -7
- package/sources/skills/mvt-implement/manifest.yaml +16 -0
- package/sources/skills/mvt-init/business.md +2 -2
- package/sources/skills/mvt-init/manifest.yaml +4 -0
- package/sources/skills/mvt-manage-context/business.md +11 -0
- package/sources/skills/mvt-manage-context/manifest.yaml +20 -3
- package/sources/skills/mvt-plan-dev/business.md +101 -20
- package/sources/skills/mvt-plan-dev/manifest.yaml +21 -19
- package/sources/skills/mvt-quick-dev/business.md +2 -1
- package/sources/skills/mvt-quick-dev/manifest.yaml +24 -6
- package/sources/skills/mvt-refactor/business.md +2 -1
- package/sources/skills/mvt-refactor/manifest.yaml +24 -3
- package/sources/skills/mvt-resume/business.md +28 -68
- package/sources/skills/mvt-resume/manifest.yaml +17 -7
- package/sources/skills/mvt-review/business.md +3 -3
- package/sources/skills/mvt-review/manifest.yaml +25 -1
- package/sources/skills/mvt-status/business.md +14 -18
- package/sources/skills/mvt-status/manifest.yaml +11 -3
- package/sources/skills/mvt-sync-context/business.md +69 -35
- package/sources/skills/mvt-sync-context/manifest.yaml +9 -0
- package/sources/skills/mvt-template/business.md +0 -2
- package/sources/skills/mvt-template/manifest.yaml +13 -8
- package/sources/skills/mvt-test/business.md +3 -3
- package/sources/skills/mvt-test/manifest.yaml +17 -1
- package/sources/skills/mvt-update-plan/business.md +41 -28
- package/sources/skills/mvt-update-plan/manifest.yaml +14 -19
- package/dist/build/plan-validator.d.ts +0 -26
- package/dist/build/plan-validator.d.ts.map +0 -1
- package/dist/build/plan-validator.js +0 -225
- package/dist/build/plan-validator.js.map +0 -1
- package/dist/commands/build.d.ts +0 -5
- package/dist/commands/build.d.ts.map +0 -1
- package/dist/commands/build.js +0 -46
- package/dist/commands/build.js.map +0 -1
- package/dist/commands/migrate.d.ts +0 -16
- package/dist/commands/migrate.d.ts.map +0 -1
- package/dist/commands/migrate.js +0 -118
- package/dist/commands/migrate.js.map +0 -1
package/README.md
CHANGED
|
@@ -19,7 +19,7 @@ MVTT turns Claude Code into a coordinated engineering team — Analyst, Architec
|
|
|
19
19
|
│ ├── project-context.yaml # Tech stack, domain model, conventions
|
|
20
20
|
│ └── artifacts/ # Analysis docs, design specs, review logs
|
|
21
21
|
└── knowledge/
|
|
22
|
-
├── core/ # Framework principles
|
|
22
|
+
├── core/ # Framework principles
|
|
23
23
|
├── principle/ # Your team's coding standards
|
|
24
24
|
└── project/ # Domain-specific knowledge
|
|
25
25
|
```
|
|
@@ -147,16 +147,6 @@ mvtt doctor # Check installation health
|
|
|
147
147
|
mvtt uninstall # Remove generated files (user data preserved)
|
|
148
148
|
```
|
|
149
149
|
|
|
150
|
-
## Architecture Patterns
|
|
151
|
-
|
|
152
|
-
MVTT ships knowledge for three patterns that workflow skills automatically consume:
|
|
153
|
-
|
|
154
|
-
- **`ddd`** — Domain-Driven Design (bounded contexts, aggregates, domain events)
|
|
155
|
-
- **`clean-architecture`** — Layered boundaries, dependency inversion
|
|
156
|
-
- **`frontend-react`** — React-specific structural conventions
|
|
157
|
-
|
|
158
|
-
Detected automatically by `/mvt-init` or configured via `/mvt-config`.
|
|
159
|
-
|
|
160
150
|
## Extending MVTT
|
|
161
151
|
|
|
162
152
|
- **Add team knowledge** — Drop markdown files into `.ai-agents/knowledge/principle/` for coding standards, or `project/` for domain knowledge. All skills load them automatically.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"section-loader.d.ts","sourceRoot":"","sources":["../../src/build/section-loader.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"section-loader.d.ts","sourceRoot":"","sources":["../../src/build/section-loader.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AA0FpD,wBAAgB,WAAW,CACzB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,MAAM,CAQR;AAED,wBAAgB,WAAW,CACzB,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,GACjB,MAAM,CAiBR"}
|
|
@@ -25,13 +25,14 @@ function replaceVars(template, vars) {
|
|
|
25
25
|
});
|
|
26
26
|
}
|
|
27
27
|
function expandBlocks(template, params) {
|
|
28
|
-
return template.replace(BLOCK_PATTERN, (
|
|
28
|
+
return template.replace(BLOCK_PATTERN, (match, key, rawBody) => {
|
|
29
29
|
const val = params[key];
|
|
30
30
|
if (val === undefined || val === null || val === false)
|
|
31
31
|
return "";
|
|
32
32
|
if (Array.isArray(val) && val.length === 0)
|
|
33
33
|
return "";
|
|
34
34
|
const body = rawBody.replace(/^\n/, "").replace(/\n$/, "");
|
|
35
|
+
const suffix = match.endsWith("\n") ? "\n" : "";
|
|
35
36
|
if (Array.isArray(val)) {
|
|
36
37
|
const items = val
|
|
37
38
|
.map((item) => {
|
|
@@ -41,35 +42,44 @@ function expandBlocks(template, params) {
|
|
|
41
42
|
return applyParams(body, { ".": item }).trimEnd();
|
|
42
43
|
})
|
|
43
44
|
.join("\n");
|
|
44
|
-
return items +
|
|
45
|
+
return items + suffix;
|
|
45
46
|
}
|
|
46
47
|
if (typeof val === "object") {
|
|
47
|
-
return applyParams(body, val) +
|
|
48
|
+
return applyParams(body, val) + suffix;
|
|
48
49
|
}
|
|
49
|
-
return applyParams(body, params) +
|
|
50
|
+
return applyParams(body, params) + suffix;
|
|
50
51
|
});
|
|
51
52
|
}
|
|
52
53
|
function expandInverted(template, params) {
|
|
53
|
-
return template.replace(INVERTED_PATTERN, (
|
|
54
|
+
return template.replace(INVERTED_PATTERN, (match, key, rawBody) => {
|
|
54
55
|
if (isTruthyNonEmpty(params[key]))
|
|
55
56
|
return "";
|
|
56
57
|
const body = rawBody.replace(/^\n/, "").replace(/\n$/, "");
|
|
57
|
-
|
|
58
|
+
const suffix = match.endsWith("\n") ? "\n" : "";
|
|
59
|
+
return applyParams(body, params) + suffix;
|
|
58
60
|
});
|
|
59
61
|
}
|
|
60
62
|
function expandConditionals(template, params) {
|
|
61
|
-
return template.replace(COND_PATTERN, (
|
|
63
|
+
return template.replace(COND_PATTERN, (match, key, rawBody) => {
|
|
62
64
|
if (!isTruthyNonEmpty(params[key]))
|
|
63
65
|
return "";
|
|
64
66
|
const body = rawBody.replace(/^\n/, "").replace(/\n$/, "");
|
|
65
|
-
|
|
67
|
+
const suffix = match.endsWith("\n") ? "\n" : "";
|
|
68
|
+
return body + suffix;
|
|
66
69
|
});
|
|
67
70
|
}
|
|
71
|
+
function stripEmptyTables(text) {
|
|
72
|
+
// Remove Markdown tables that have a heading + header row + separator but no
|
|
73
|
+
// data rows (all conditional rows were removed during template expansion).
|
|
74
|
+
return text.replace(/^#{1,6} [^\n]+\n\n\|[^\n]+\|\n\|[-| :]+\|\n(?=\n|$)/gm, "");
|
|
75
|
+
}
|
|
68
76
|
export function applyParams(template, params) {
|
|
69
77
|
let result = expandConditionals(template, params);
|
|
70
78
|
result = expandBlocks(result, params);
|
|
71
79
|
result = expandInverted(result, params);
|
|
72
80
|
result = replaceVars(result, params);
|
|
81
|
+
result = stripEmptyTables(result);
|
|
82
|
+
result = result.replace(/\n{3,}/g, "\n\n");
|
|
73
83
|
return result;
|
|
74
84
|
}
|
|
75
85
|
export function loadSection(section, skillDir, sourcesDir) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"section-loader.js","sourceRoot":"","sources":["../../src/build/section-loader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,IAAI,MAAM,WAAW,CAAC;AAG7B,MAAM,aAAa,GAAG,0CAA0C,CAAC;AACjE,MAAM,gBAAgB,GAAG,2CAA2C,CAAC;AACrE,MAAM,YAAY,GAAG,2CAA2C,CAAC;AACjE,MAAM,WAAW,GAAG,oBAAoB,CAAC;AAEzC,SAAS,gBAAgB,CAAC,GAAY;IACpC,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,KAAK,IAAI,GAAG,KAAK,EAAE;QAAE,OAAO,KAAK,CAAC;IACnF,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACzD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,YAAY,CAAC,QAAgB;IACpC,OAAO,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;AAChE,CAAC;AAED,SAAS,WAAW,CAClB,QAAgB,EAChB,IAA6B;IAE7B,OAAO,QAAQ,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,MAAM,EAAE,GAAW,EAAE,EAAE;QAC3D,IAAI,GAAG,KAAK,GAAG;YAAE,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;QAChD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;QACtB,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,IAAI;YAAE,OAAO,EAAE,CAAC;QACjD,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;IACrB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,YAAY,CACnB,QAAgB,EAChB,MAA+B;IAE/B,OAAO,QAAQ,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC,
|
|
1
|
+
{"version":3,"file":"section-loader.js","sourceRoot":"","sources":["../../src/build/section-loader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,IAAI,MAAM,WAAW,CAAC;AAG7B,MAAM,aAAa,GAAG,0CAA0C,CAAC;AACjE,MAAM,gBAAgB,GAAG,2CAA2C,CAAC;AACrE,MAAM,YAAY,GAAG,2CAA2C,CAAC;AACjE,MAAM,WAAW,GAAG,oBAAoB,CAAC;AAEzC,SAAS,gBAAgB,CAAC,GAAY;IACpC,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,KAAK,IAAI,GAAG,KAAK,EAAE;QAAE,OAAO,KAAK,CAAC;IACnF,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACzD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,YAAY,CAAC,QAAgB;IACpC,OAAO,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;AAChE,CAAC;AAED,SAAS,WAAW,CAClB,QAAgB,EAChB,IAA6B;IAE7B,OAAO,QAAQ,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,MAAM,EAAE,GAAW,EAAE,EAAE;QAC3D,IAAI,GAAG,KAAK,GAAG;YAAE,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;QAChD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;QACtB,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,IAAI;YAAE,OAAO,EAAE,CAAC;QACjD,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;IACrB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,YAAY,CACnB,QAAgB,EAChB,MAA+B;IAE/B,OAAO,QAAQ,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC,KAAK,EAAE,GAAW,EAAE,OAAe,EAAE,EAAE;QAC7E,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QACxB,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,KAAK;YAAE,OAAO,EAAE,CAAC;QAClE,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QACtD,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAC3D,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;QAChD,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YACvB,MAAM,KAAK,GAAG,GAAG;iBACd,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;gBACZ,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;oBAC9C,OAAO,WAAW,CAAC,IAAI,EAAE,IAA+B,CAAC,CAAC,OAAO,EAAE,CAAC;gBACtE,CAAC;gBACD,OAAO,WAAW,CAAC,IAAI,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC;YACpD,CAAC,CAAC;iBACD,IAAI,CAAC,IAAI,CAAC,CAAC;YACd,OAAO,KAAK,GAAG,MAAM,CAAC;QACxB,CAAC;QACD,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;YAC5B,OAAO,WAAW,CAAC,IAAI,EAAE,GAA8B,CAAC,GAAG,MAAM,CAAC;QACpE,CAAC;QACD,OAAO,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,MAAM,CAAC;IAC5C,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,cAAc,CACrB,QAAgB,EAChB,MAA+B;IAE/B,OAAO,QAAQ,CAAC,OAAO,CAAC,gBAAgB,EAAE,CAAC,KAAK,EAAE,GAAW,EAAE,OAAe,EAAE,EAAE;QAChF,IAAI,gBAAgB,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAAE,OAAO,EAAE,CAAC;QAC7C,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAC3D,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;QAChD,OAAO,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,MAAM,CAAC;IAC5C,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,kBAAkB,CACzB,QAAgB,EAChB,MAA+B;IAE/B,OAAO,QAAQ,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC,KAAK,EAAE,GAAW,EAAE,OAAe,EAAE,EAAE;QAC5E,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAAE,OAAO,EAAE,CAAC;QAC9C,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAC3D,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;QAChD,OAAO,IAAI,GAAG,MAAM,CAAC;IACvB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,gBAAgB,CAAC,IAAY;IACpC,6EAA6E;IAC7E,2EAA2E;IAC3E,OAAO,IAAI,CAAC,OAAO,CACjB,uDAAuD,EACvD,EAAE,CACH,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,WAAW,CACzB,QAAgB,EAChB,MAA+B;IAE/B,IAAI,MAAM,GAAG,kBAAkB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAClD,MAAM,GAAG,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,MAAM,GAAG,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,MAAM,GAAG,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,MAAM,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAClC,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAC3C,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,WAAW,CACzB,OAAgB,EAChB,QAAgB,EAChB,UAAkB;IAElB,QAAQ,OAAO,CAAC,IAAI,EAAE,CAAC;QACrB,KAAK,QAAQ;YACX,OAAO,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAEhD,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;YACxD,OAAO,YAAY,CAAC,QAAQ,CAAC,CAAC;QAChC,CAAC;QAED,KAAK,QAAQ,CAAC;QACd,KAAK,UAAU,CAAC,CAAC,CAAC;YAChB,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;YAC1D,MAAM,OAAO,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;YACvC,OAAO,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;QACpD,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"materialize.d.ts","sourceRoot":"","sources":["../../src/fs/materialize.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"materialize.d.ts","sourceRoot":"","sources":["../../src/fs/materialize.ts"],"names":[],"mappings":"AAiBA,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,WAAW,GAAG,aAAa,CAAC;CACvC;AAED,MAAM,WAAW,kBAAkB;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC/B;AAuCD,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,kBAAkB,GAAG,gBAAgB,EAAE,CA+HlF"}
|
package/dist/fs/materialize.js
CHANGED
|
@@ -4,6 +4,7 @@ import { parse as parseYaml } from "yaml";
|
|
|
4
4
|
import { assembleFromManifest } from "../build/assembler.js";
|
|
5
5
|
import { hashString, hashFile } from "./hash.js";
|
|
6
6
|
import { updateCoreManifest } from "./core-manifest.js";
|
|
7
|
+
import { updateRegistry } from "./registry-merge.js";
|
|
7
8
|
function copyRecursive(srcDir, destDir, collected, projectRoot, shouldSkip, baseSrcDir) {
|
|
8
9
|
if (!existsSync(srcDir))
|
|
9
10
|
return;
|
|
@@ -77,16 +78,23 @@ export function materializeProject(options) {
|
|
|
77
78
|
hash: hashFile(coreManifestDest),
|
|
78
79
|
category: "create_once",
|
|
79
80
|
});
|
|
80
|
-
|
|
81
|
+
// Reconcile registry.yaml instead of overwriting it: user-authored skills
|
|
82
|
+
// (custom: true) and knowledge bindings added via /mvt-create-skill and
|
|
83
|
+
// /mvt-manage-context must survive `mvtt update`. Treated as create_once
|
|
84
|
+
// (like core/manifest.yaml) so the modified-files guard does not flag it.
|
|
81
85
|
const registryDest = path.resolve(projectRoot, ".ai-agents/registry.yaml");
|
|
82
|
-
|
|
83
|
-
copyFileSync(registrySrc, registryDest);
|
|
86
|
+
updateRegistry(projectRoot, packageRoot);
|
|
84
87
|
materialized.push({
|
|
85
88
|
absPath: registryDest,
|
|
86
89
|
relPath: ".ai-agents/registry.yaml",
|
|
87
90
|
hash: hashFile(registryDest),
|
|
88
|
-
category: "
|
|
91
|
+
category: "create_once",
|
|
89
92
|
});
|
|
93
|
+
// Copy bundled scripts from dist/scripts/ (bundled by esbuild, zero external deps)
|
|
94
|
+
// Only copy .cjs files to avoid stale build artifacts leaking into user projects
|
|
95
|
+
const scriptsSrc = path.resolve(packageRoot, "dist/scripts");
|
|
96
|
+
const scriptsDest = path.resolve(projectRoot, ".ai-agents/scripts");
|
|
97
|
+
copyRecursive(scriptsSrc, scriptsDest, materialized, projectRoot, (rel) => !rel.endsWith(".cjs"));
|
|
90
98
|
const defaults = [
|
|
91
99
|
[
|
|
92
100
|
path.resolve(sourcesDir, "defaults/config.yaml"),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"materialize.js","sourceRoot":"","sources":["../../src/fs/materialize.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,UAAU,EACV,SAAS,EACT,WAAW,EACX,YAAY,EACZ,QAAQ,EACR,aAAa,GACd,MAAM,SAAS,CAAC;AACjB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,MAAM,CAAC;AAE1C,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACjD,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"materialize.js","sourceRoot":"","sources":["../../src/fs/materialize.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export interface RegistryMergeResult {
|
|
2
|
+
written: boolean;
|
|
3
|
+
backup: string | null;
|
|
4
|
+
frameworkSkillCount: number;
|
|
5
|
+
customSkillCount: number;
|
|
6
|
+
preservedBindingCount: number;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Reconcile the project's `.ai-agents/registry.yaml` with the framework
|
|
10
|
+
* registry shipped in the package, preserving user-authored skills and
|
|
11
|
+
* knowledge bindings across `mvtt update`.
|
|
12
|
+
*
|
|
13
|
+
* On a fresh install (no existing user registry) the framework file is copied
|
|
14
|
+
* verbatim so its documentation comments survive. When a user registry already
|
|
15
|
+
* exists it is backed up to `.ai-agents/.backup/` and rewritten with the merged
|
|
16
|
+
* result.
|
|
17
|
+
*/
|
|
18
|
+
export declare function updateRegistry(projectRoot: string, packageRoot: string): RegistryMergeResult;
|
|
19
|
+
//# sourceMappingURL=registry-merge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry-merge.d.ts","sourceRoot":"","sources":["../../src/fs/registry-merge.ts"],"names":[],"mappings":"AA0BA,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,gBAAgB,EAAE,MAAM,CAAC;IACzB,qBAAqB,EAAE,MAAM,CAAC;CAC/B;AAiJD;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,mBAAmB,CAqC5F"}
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
import { copyFileSync, existsSync, mkdirSync, readFileSync, writeFileSync, } from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { parse as parseYaml, stringify as stringifyYaml } from "yaml";
|
|
4
|
+
const FRAMEWORK_REGISTRY_REL = "registry.yaml";
|
|
5
|
+
const USER_REGISTRY_REL = ".ai-agents/registry.yaml";
|
|
6
|
+
const BACKUP_DIR_REL = ".ai-agents/.backup";
|
|
7
|
+
/**
|
|
8
|
+
* Deterministic, order-independent key for a knowledge binding so two entries
|
|
9
|
+
* with the same content compare equal regardless of YAML key order.
|
|
10
|
+
*/
|
|
11
|
+
function stableKey(value) {
|
|
12
|
+
if (Array.isArray(value))
|
|
13
|
+
return `[${value.map(stableKey).join(",")}]`;
|
|
14
|
+
if (value && typeof value === "object") {
|
|
15
|
+
const keys = Object.keys(value).sort();
|
|
16
|
+
return `{${keys.map((k) => `${k}:${stableKey(value[k])}`).join(",")}}`;
|
|
17
|
+
}
|
|
18
|
+
return JSON.stringify(value);
|
|
19
|
+
}
|
|
20
|
+
function clone(value) {
|
|
21
|
+
return JSON.parse(JSON.stringify(value));
|
|
22
|
+
}
|
|
23
|
+
function readRegistry(filePath) {
|
|
24
|
+
if (!existsSync(filePath))
|
|
25
|
+
return null;
|
|
26
|
+
const parsed = parseYaml(readFileSync(filePath, "utf-8"));
|
|
27
|
+
if (!parsed || typeof parsed !== "object")
|
|
28
|
+
return null;
|
|
29
|
+
return parsed;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Preserve the framework file's leading comment block (documentation header)
|
|
33
|
+
* when we have to re-serialize the merged document, since stringify() drops
|
|
34
|
+
* comments.
|
|
35
|
+
*/
|
|
36
|
+
function leadingComments(raw) {
|
|
37
|
+
const out = [];
|
|
38
|
+
for (const line of raw.split(/\r?\n/)) {
|
|
39
|
+
if (line.trim() === "" || line.trimStart().startsWith("#")) {
|
|
40
|
+
out.push(line);
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
break;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return out.length > 0 ? out.join("\n") + "\n" : "";
|
|
47
|
+
}
|
|
48
|
+
function backupRegistry(projectRoot, sourcePath) {
|
|
49
|
+
const backupDir = path.resolve(projectRoot, BACKUP_DIR_REL);
|
|
50
|
+
mkdirSync(backupDir, { recursive: true });
|
|
51
|
+
const stamp = new Date().toISOString().replace(/[:.]/g, "-");
|
|
52
|
+
const backupPath = path.join(backupDir, `registry-${stamp}.yaml`);
|
|
53
|
+
copyFileSync(sourcePath, backupPath);
|
|
54
|
+
return backupPath;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Merge a fresh framework registry with the user's existing registry,
|
|
58
|
+
* preserving user-authored content (Plan A — diff-based, no markers required).
|
|
59
|
+
*
|
|
60
|
+
* Rules:
|
|
61
|
+
* - Framework skills (those present in the framework registry) take the NEW
|
|
62
|
+
* framework definition verbatim. Any knowledge bindings the user added to a
|
|
63
|
+
* framework skill (entries present in the user copy but absent from the
|
|
64
|
+
* framework copy) are re-grafted onto the refreshed entry.
|
|
65
|
+
* - User custom skills (present in the user registry, absent from the framework
|
|
66
|
+
* registry, and flagged `custom: true`) are preserved as-is.
|
|
67
|
+
* - User skills that are neither framework skills nor flagged `custom: true`
|
|
68
|
+
* are dropped (retired framework skills / legacy/malformed entries).
|
|
69
|
+
* - `knowledge.shared[]` is the framework baseline plus any user shared entries
|
|
70
|
+
* not already present in the framework baseline (keyed by `id`, falling back
|
|
71
|
+
* to deep content equality).
|
|
72
|
+
*/
|
|
73
|
+
function mergeRegistry(framework, user) {
|
|
74
|
+
const fwSkills = framework.skills ?? {};
|
|
75
|
+
const userSkills = user.skills ?? {};
|
|
76
|
+
const mergedSkills = {};
|
|
77
|
+
let preservedBindingCount = 0;
|
|
78
|
+
// Framework skills: refresh from framework, re-graft user-added knowledge.
|
|
79
|
+
for (const [name, fwEntry] of Object.entries(fwSkills)) {
|
|
80
|
+
const next = clone(fwEntry);
|
|
81
|
+
const userEntry = userSkills[name];
|
|
82
|
+
if (userEntry && userEntry.custom !== true) {
|
|
83
|
+
const fwKnow = Array.isArray(fwEntry.knowledge) ? fwEntry.knowledge : [];
|
|
84
|
+
const userKnow = Array.isArray(userEntry.knowledge)
|
|
85
|
+
? userEntry.knowledge
|
|
86
|
+
: [];
|
|
87
|
+
const fwKeys = new Set(fwKnow.map(stableKey));
|
|
88
|
+
const additions = userKnow.filter((k) => !fwKeys.has(stableKey(k)));
|
|
89
|
+
if (additions.length > 0) {
|
|
90
|
+
next.knowledge = [...clone(fwKnow), ...clone(additions)];
|
|
91
|
+
preservedBindingCount += additions.length;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
mergedSkills[name] = next;
|
|
95
|
+
}
|
|
96
|
+
// User custom skills not part of the framework set.
|
|
97
|
+
let customSkillCount = 0;
|
|
98
|
+
for (const [name, userEntry] of Object.entries(userSkills)) {
|
|
99
|
+
if (mergedSkills[name])
|
|
100
|
+
continue;
|
|
101
|
+
if (userEntry && userEntry.custom === true) {
|
|
102
|
+
mergedSkills[name] = clone(userEntry);
|
|
103
|
+
customSkillCount += 1;
|
|
104
|
+
}
|
|
105
|
+
// Otherwise drop: a retired framework skill or a legacy/unmarked entry.
|
|
106
|
+
}
|
|
107
|
+
// Shared knowledge: framework baseline + user additions.
|
|
108
|
+
const fwShared = Array.isArray(framework.knowledge?.shared)
|
|
109
|
+
? framework.knowledge.shared
|
|
110
|
+
: [];
|
|
111
|
+
const userShared = Array.isArray(user.knowledge?.shared)
|
|
112
|
+
? user.knowledge.shared
|
|
113
|
+
: [];
|
|
114
|
+
const sharedKeyOf = (e) => typeof e?.id === "string" ? `id:${e.id}` : stableKey(e);
|
|
115
|
+
const fwSharedKeys = new Set(fwShared.map(sharedKeyOf));
|
|
116
|
+
const sharedAdditions = userShared.filter((e) => !fwSharedKeys.has(sharedKeyOf(e)));
|
|
117
|
+
preservedBindingCount += sharedAdditions.length;
|
|
118
|
+
const mergedKnowledge = {
|
|
119
|
+
...(framework.knowledge ?? {}),
|
|
120
|
+
shared: [...clone(fwShared), ...clone(sharedAdditions)],
|
|
121
|
+
};
|
|
122
|
+
const merged = {
|
|
123
|
+
...framework,
|
|
124
|
+
knowledge: mergedKnowledge,
|
|
125
|
+
skills: mergedSkills,
|
|
126
|
+
};
|
|
127
|
+
return {
|
|
128
|
+
merged,
|
|
129
|
+
result: {
|
|
130
|
+
frameworkSkillCount: Object.keys(fwSkills).length,
|
|
131
|
+
customSkillCount,
|
|
132
|
+
preservedBindingCount,
|
|
133
|
+
},
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Reconcile the project's `.ai-agents/registry.yaml` with the framework
|
|
138
|
+
* registry shipped in the package, preserving user-authored skills and
|
|
139
|
+
* knowledge bindings across `mvtt update`.
|
|
140
|
+
*
|
|
141
|
+
* On a fresh install (no existing user registry) the framework file is copied
|
|
142
|
+
* verbatim so its documentation comments survive. When a user registry already
|
|
143
|
+
* exists it is backed up to `.ai-agents/.backup/` and rewritten with the merged
|
|
144
|
+
* result.
|
|
145
|
+
*/
|
|
146
|
+
export function updateRegistry(projectRoot, packageRoot) {
|
|
147
|
+
const frameworkPath = path.resolve(packageRoot, FRAMEWORK_REGISTRY_REL);
|
|
148
|
+
const userPath = path.resolve(projectRoot, USER_REGISTRY_REL);
|
|
149
|
+
const frameworkRaw = existsSync(frameworkPath) ? readFileSync(frameworkPath, "utf-8") : null;
|
|
150
|
+
const framework = readRegistry(frameworkPath);
|
|
151
|
+
if (!frameworkRaw || !framework) {
|
|
152
|
+
return {
|
|
153
|
+
written: false,
|
|
154
|
+
backup: null,
|
|
155
|
+
frameworkSkillCount: 0,
|
|
156
|
+
customSkillCount: 0,
|
|
157
|
+
preservedBindingCount: 0,
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
mkdirSync(path.dirname(userPath), { recursive: true });
|
|
161
|
+
// Install and update share one path: a fresh install is just a merge against
|
|
162
|
+
// an empty user registry. This guarantees `mvtt install` and `mvtt update`
|
|
163
|
+
// produce byte-identical output (no verbatim-copy vs re-serialize drift).
|
|
164
|
+
const existingUser = readRegistry(userPath) ?? {};
|
|
165
|
+
let backup = null;
|
|
166
|
+
if (existsSync(userPath)) {
|
|
167
|
+
backup = backupRegistry(projectRoot, userPath);
|
|
168
|
+
}
|
|
169
|
+
const { merged, result } = mergeRegistry(framework, existingUser);
|
|
170
|
+
// lineWidth: 0 disables YAML line folding so long `description` strings stay
|
|
171
|
+
// on a single line. Only the framework file's leading comment header is
|
|
172
|
+
// preserved (yaml.stringify drops comments); inline section comments are not.
|
|
173
|
+
const serialized = leadingComments(frameworkRaw) + stringifyYaml(merged, { lineWidth: 0 });
|
|
174
|
+
writeFileSync(userPath, serialized, "utf-8");
|
|
175
|
+
return { written: true, backup, ...result };
|
|
176
|
+
}
|
|
177
|
+
//# sourceMappingURL=registry-merge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry-merge.js","sourceRoot":"","sources":["../../src/fs/registry-merge.ts"],"names":[],"mappings":"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"}
|