@uoyo/mvtt 2.0.0-beta.3 → 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/dist/fs/materialize.d.ts.map +1 -1
- package/dist/fs/materialize.js +7 -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/install-manifest.yaml +6 -2
- package/package.json +1 -1
- package/sources/scripts/plan-update.js +353 -0
- package/sources/sections/output-format-constraint.md +14 -0
- package/sources/sections/project-context-profile.md +29 -0
- package/sources/skills/mvt-analyze/manifest.yaml +3 -0
- package/sources/skills/mvt-analyze-code/manifest.yaml +6 -0
- package/sources/skills/mvt-cleanup/manifest.yaml +3 -0
- package/sources/skills/mvt-create-skill/manifest.yaml +3 -0
- package/sources/skills/mvt-design/manifest.yaml +3 -0
- package/sources/skills/mvt-fix/manifest.yaml +3 -0
- package/sources/skills/mvt-implement/business.md +9 -5
- package/sources/skills/mvt-implement/manifest.yaml +3 -0
- package/sources/skills/mvt-init/manifest.yaml +3 -0
- package/sources/skills/mvt-manage-context/manifest.yaml +6 -0
- package/sources/skills/mvt-plan-dev/manifest.yaml +3 -0
- package/sources/skills/mvt-quick-dev/manifest.yaml +3 -0
- package/sources/skills/mvt-refactor/manifest.yaml +3 -0
- package/sources/skills/mvt-review/manifest.yaml +3 -0
- package/sources/skills/mvt-sync-context/business.md +58 -29
- package/sources/skills/mvt-sync-context/manifest.yaml +6 -0
- package/sources/skills/mvt-test/manifest.yaml +3 -0
- package/sources/skills/mvt-update-plan/business.md +30 -28
- package/sources/skills/mvt-update-plan/manifest.yaml +3 -0
|
@@ -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,15 +78,17 @@ 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
|
});
|
|
90
93
|
// Copy bundled scripts from dist/scripts/ (bundled by esbuild, zero external deps)
|
|
91
94
|
// Only copy .cjs files to avoid stale build artifacts leaking into user projects
|
|
@@ -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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"}
|