@kiwidata/grimoire 0.1.1
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/.claude-plugin/plugin.json +8 -0
- package/AGENTS.md +217 -0
- package/README.md +748 -0
- package/bin/grimoire.js +2 -0
- package/dist/cli/index.d.ts +2 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +42 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/commands/archive.d.ts +3 -0
- package/dist/commands/archive.d.ts.map +1 -0
- package/dist/commands/archive.js +22 -0
- package/dist/commands/archive.js.map +1 -0
- package/dist/commands/branch-check.d.ts +3 -0
- package/dist/commands/branch-check.d.ts.map +1 -0
- package/dist/commands/branch-check.js +16 -0
- package/dist/commands/branch-check.js.map +1 -0
- package/dist/commands/check.d.ts +3 -0
- package/dist/commands/check.d.ts.map +1 -0
- package/dist/commands/check.js +22 -0
- package/dist/commands/check.js.map +1 -0
- package/dist/commands/ci.d.ts +3 -0
- package/dist/commands/ci.d.ts.map +1 -0
- package/dist/commands/ci.js +18 -0
- package/dist/commands/ci.js.map +1 -0
- package/dist/commands/diff.d.ts +3 -0
- package/dist/commands/diff.d.ts.map +1 -0
- package/dist/commands/diff.js +10 -0
- package/dist/commands/diff.js.map +1 -0
- package/dist/commands/docs.d.ts +3 -0
- package/dist/commands/docs.d.ts.map +1 -0
- package/dist/commands/docs.js +11 -0
- package/dist/commands/docs.js.map +1 -0
- package/dist/commands/health.d.ts +3 -0
- package/dist/commands/health.d.ts.map +1 -0
- package/dist/commands/health.js +13 -0
- package/dist/commands/health.js.map +1 -0
- package/dist/commands/init.d.ts +3 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +21 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/list.d.ts +3 -0
- package/dist/commands/list.d.ts.map +1 -0
- package/dist/commands/list.js +22 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/log.d.ts +3 -0
- package/dist/commands/log.d.ts.map +1 -0
- package/dist/commands/log.js +15 -0
- package/dist/commands/log.js.map +1 -0
- package/dist/commands/map.d.ts +3 -0
- package/dist/commands/map.d.ts.map +1 -0
- package/dist/commands/map.js +17 -0
- package/dist/commands/map.js.map +1 -0
- package/dist/commands/pr.d.ts +3 -0
- package/dist/commands/pr.d.ts.map +1 -0
- package/dist/commands/pr.js +17 -0
- package/dist/commands/pr.js.map +1 -0
- package/dist/commands/status.d.ts +3 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +12 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/test-quality.d.ts +3 -0
- package/dist/commands/test-quality.d.ts.map +1 -0
- package/dist/commands/test-quality.js +37 -0
- package/dist/commands/test-quality.js.map +1 -0
- package/dist/commands/trace.d.ts +3 -0
- package/dist/commands/trace.d.ts.map +1 -0
- package/dist/commands/trace.js +12 -0
- package/dist/commands/trace.js.map +1 -0
- package/dist/commands/update.d.ts +3 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +22 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/commands/validate.d.ts +3 -0
- package/dist/commands/validate.d.ts.map +1 -0
- package/dist/commands/validate.js +17 -0
- package/dist/commands/validate.js.map +1 -0
- package/dist/core/archive.d.ts +9 -0
- package/dist/core/archive.d.ts.map +1 -0
- package/dist/core/archive.js +92 -0
- package/dist/core/archive.js.map +1 -0
- package/dist/core/branch-check.d.ts +27 -0
- package/dist/core/branch-check.d.ts.map +1 -0
- package/dist/core/branch-check.js +205 -0
- package/dist/core/branch-check.js.map +1 -0
- package/dist/core/check.d.ts +24 -0
- package/dist/core/check.d.ts.map +1 -0
- package/dist/core/check.js +372 -0
- package/dist/core/check.js.map +1 -0
- package/dist/core/ci.d.ts +24 -0
- package/dist/core/ci.d.ts.map +1 -0
- package/dist/core/ci.js +162 -0
- package/dist/core/ci.js.map +1 -0
- package/dist/core/detect.d.ts +10 -0
- package/dist/core/detect.d.ts.map +1 -0
- package/dist/core/detect.js +368 -0
- package/dist/core/detect.js.map +1 -0
- package/dist/core/diff.d.ts +29 -0
- package/dist/core/diff.d.ts.map +1 -0
- package/dist/core/diff.js +197 -0
- package/dist/core/diff.js.map +1 -0
- package/dist/core/doc-style.d.ts +16 -0
- package/dist/core/doc-style.d.ts.map +1 -0
- package/dist/core/doc-style.js +192 -0
- package/dist/core/doc-style.js.map +1 -0
- package/dist/core/docs.d.ts +6 -0
- package/dist/core/docs.d.ts.map +1 -0
- package/dist/core/docs.js +478 -0
- package/dist/core/docs.js.map +1 -0
- package/dist/core/health.d.ts +7 -0
- package/dist/core/health.d.ts.map +1 -0
- package/dist/core/health.js +489 -0
- package/dist/core/health.js.map +1 -0
- package/dist/core/hooks.d.ts +5 -0
- package/dist/core/hooks.d.ts.map +1 -0
- package/dist/core/hooks.js +168 -0
- package/dist/core/hooks.js.map +1 -0
- package/dist/core/init.d.ts +9 -0
- package/dist/core/init.d.ts.map +1 -0
- package/dist/core/init.js +563 -0
- package/dist/core/init.js.map +1 -0
- package/dist/core/list.d.ts +4 -0
- package/dist/core/list.d.ts.map +1 -0
- package/dist/core/list.js +170 -0
- package/dist/core/list.js.map +1 -0
- package/dist/core/log.d.ts +8 -0
- package/dist/core/log.d.ts.map +1 -0
- package/dist/core/log.js +150 -0
- package/dist/core/log.js.map +1 -0
- package/dist/core/map.d.ts +9 -0
- package/dist/core/map.d.ts.map +1 -0
- package/dist/core/map.js +302 -0
- package/dist/core/map.js.map +1 -0
- package/dist/core/pr.d.ts +9 -0
- package/dist/core/pr.d.ts.map +1 -0
- package/dist/core/pr.js +273 -0
- package/dist/core/pr.js.map +1 -0
- package/dist/core/shared-setup.d.ts +52 -0
- package/dist/core/shared-setup.d.ts.map +1 -0
- package/dist/core/shared-setup.js +221 -0
- package/dist/core/shared-setup.js.map +1 -0
- package/dist/core/status.d.ts +6 -0
- package/dist/core/status.d.ts.map +1 -0
- package/dist/core/status.js +114 -0
- package/dist/core/status.js.map +1 -0
- package/dist/core/test-quality.d.ts +33 -0
- package/dist/core/test-quality.d.ts.map +1 -0
- package/dist/core/test-quality.js +378 -0
- package/dist/core/test-quality.js.map +1 -0
- package/dist/core/trace.d.ts +6 -0
- package/dist/core/trace.d.ts.map +1 -0
- package/dist/core/trace.js +211 -0
- package/dist/core/trace.js.map +1 -0
- package/dist/core/update.d.ts +10 -0
- package/dist/core/update.d.ts.map +1 -0
- package/dist/core/update.js +149 -0
- package/dist/core/update.js.map +1 -0
- package/dist/core/validate.d.ts +20 -0
- package/dist/core/validate.d.ts.map +1 -0
- package/dist/core/validate.js +275 -0
- package/dist/core/validate.js.map +1 -0
- package/dist/index.d.ts +19 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +20 -0
- package/dist/index.js.map +1 -0
- package/dist/utils/config.d.ts +61 -0
- package/dist/utils/config.d.ts.map +1 -0
- package/dist/utils/config.js +172 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/fs.d.ts +17 -0
- package/dist/utils/fs.d.ts.map +1 -0
- package/dist/utils/fs.js +38 -0
- package/dist/utils/fs.js.map +1 -0
- package/dist/utils/paths.d.ts +10 -0
- package/dist/utils/paths.d.ts.map +1 -0
- package/dist/utils/paths.js +35 -0
- package/dist/utils/paths.js.map +1 -0
- package/dist/utils/spawn.d.ts +5 -0
- package/dist/utils/spawn.d.ts.map +1 -0
- package/dist/utils/spawn.js +34 -0
- package/dist/utils/spawn.js.map +1 -0
- package/package.json +68 -0
- package/skills/grimoire-apply/SKILL.md +274 -0
- package/skills/grimoire-audit/SKILL.md +129 -0
- package/skills/grimoire-branch-guard/SKILL.md +111 -0
- package/skills/grimoire-bug/SKILL.md +160 -0
- package/skills/grimoire-bug-explore/SKILL.md +242 -0
- package/skills/grimoire-bug-report/SKILL.md +237 -0
- package/skills/grimoire-bug-session/SKILL.md +222 -0
- package/skills/grimoire-bug-triage/SKILL.md +274 -0
- package/skills/grimoire-commit/SKILL.md +150 -0
- package/skills/grimoire-discover/SKILL.md +297 -0
- package/skills/grimoire-draft/SKILL.md +202 -0
- package/skills/grimoire-plan/SKILL.md +329 -0
- package/skills/grimoire-pr/SKILL.md +134 -0
- package/skills/grimoire-pr-review/SKILL.md +240 -0
- package/skills/grimoire-refactor/SKILL.md +251 -0
- package/skills/grimoire-remove/SKILL.md +112 -0
- package/skills/grimoire-review/SKILL.md +247 -0
- package/skills/grimoire-verify/SKILL.md +223 -0
- package/skills/references/bug-classification.md +154 -0
- package/skills/references/build-vs-buy.md +77 -0
- package/skills/references/elicitation-personas.md +118 -0
- package/skills/references/refactor-register-format.md +88 -0
- package/skills/references/refactor-scan-categories.md +102 -0
- package/skills/references/schema-format.md +68 -0
- package/skills/references/security-compliance.md +110 -0
- package/skills/references/testing-contracts.md +93 -0
- package/templates/context.yml +110 -0
- package/templates/debt-exceptions.yml +61 -0
- package/templates/decision.md +50 -0
- package/templates/dupignore +93 -0
- package/templates/example.feature +24 -0
- package/templates/manifest.md +29 -0
- package/templates/mapignore +58 -0
- package/templates/mapkeys +65 -0
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
import { readdir, readFile } from "node:fs/promises";
|
|
2
|
+
import { join, relative } from "node:path";
|
|
3
|
+
import chalk from "chalk";
|
|
4
|
+
import { simpleGit } from "simple-git";
|
|
5
|
+
import { findProjectRoot } from "../utils/paths.js";
|
|
6
|
+
export async function traceFile(target, options) {
|
|
7
|
+
const root = await findProjectRoot();
|
|
8
|
+
// Parse target: could be "file.ts", "file.ts:42", or "file.ts:10-20"
|
|
9
|
+
const { file, line } = parseTarget(target);
|
|
10
|
+
const relFile = relative(root, join(process.cwd(), file));
|
|
11
|
+
// Step 1: Get commits that touched this file/line
|
|
12
|
+
const commits = await getCommits(root, relFile, line);
|
|
13
|
+
if (commits.length === 0) {
|
|
14
|
+
console.log(chalk.dim(`No git history found for ${relFile}`));
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
// Step 2: Extract change IDs from commit trailers
|
|
18
|
+
const changeIds = new Set();
|
|
19
|
+
for (const c of commits) {
|
|
20
|
+
if (c.changeId)
|
|
21
|
+
changeIds.add(c.changeId);
|
|
22
|
+
}
|
|
23
|
+
// Step 3: Look up change details from archive and active changes
|
|
24
|
+
const changes = await lookupChanges(root, changeIds);
|
|
25
|
+
const result = { file: relFile, line, commits, changes };
|
|
26
|
+
if (options.json) {
|
|
27
|
+
console.log(JSON.stringify(result, null, 2));
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
// Pretty output
|
|
31
|
+
console.log(chalk.bold(`\nTrace: ${relFile}${line ? `:${line}` : ""}\n`));
|
|
32
|
+
// Show commits
|
|
33
|
+
console.log(chalk.bold.underline("Commits\n"));
|
|
34
|
+
for (const c of commits.slice(0, 20)) {
|
|
35
|
+
const changeTag = c.changeId
|
|
36
|
+
? chalk.cyan(` [${c.changeId}]`)
|
|
37
|
+
: "";
|
|
38
|
+
console.log(` ${chalk.dim(c.hash.slice(0, 8))} ${chalk.dim(c.date)} ${c.subject}${changeTag}`);
|
|
39
|
+
}
|
|
40
|
+
if (commits.length > 20) {
|
|
41
|
+
console.log(chalk.dim(` ... and ${commits.length - 20} more`));
|
|
42
|
+
}
|
|
43
|
+
// Show linked changes
|
|
44
|
+
if (changes.length > 0) {
|
|
45
|
+
console.log(chalk.bold.underline("\nLinked Changes\n"));
|
|
46
|
+
for (const ch of changes) {
|
|
47
|
+
const status = ch.archived
|
|
48
|
+
? chalk.green("archived")
|
|
49
|
+
: chalk.yellow("active");
|
|
50
|
+
console.log(` ${chalk.cyan(ch.changeId)} ${chalk.dim(ch.date)} ${status}`);
|
|
51
|
+
console.log(` ${ch.summary}`);
|
|
52
|
+
if (ch.why) {
|
|
53
|
+
console.log(` ${chalk.dim("Why:")} ${ch.why}`);
|
|
54
|
+
}
|
|
55
|
+
if (ch.features.length > 0) {
|
|
56
|
+
console.log(` ${chalk.dim("Features:")} ${ch.features.join(", ")}`);
|
|
57
|
+
}
|
|
58
|
+
if (ch.decisions.length > 0) {
|
|
59
|
+
console.log(` ${chalk.dim("Decisions:")} ${ch.decisions.join(", ")}`);
|
|
60
|
+
}
|
|
61
|
+
console.log();
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
else if (changeIds.size === 0) {
|
|
65
|
+
console.log(chalk.dim("\nNo grimoire change IDs found in commit trailers.\nCommits without a Change: trailer are not linked to grimoire changes.\n"));
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
function parseTarget(target) {
|
|
69
|
+
// Match file.ts:42 or file.ts:10-20 (use start line)
|
|
70
|
+
const match = target.match(/^(.+):(\d+)(?:-\d+)?$/);
|
|
71
|
+
if (match) {
|
|
72
|
+
return { file: match[1], line: parseInt(match[2], 10) };
|
|
73
|
+
}
|
|
74
|
+
return { file: target };
|
|
75
|
+
}
|
|
76
|
+
async function getCommits(root, relFile, line) {
|
|
77
|
+
const commits = [];
|
|
78
|
+
const git = simpleGit(root);
|
|
79
|
+
try {
|
|
80
|
+
// Use git log with trailer parsing
|
|
81
|
+
// Format: hash|date|author|subject|trailers
|
|
82
|
+
const args = [
|
|
83
|
+
"log",
|
|
84
|
+
"--format=%H%x1f%as%x1f%an%x1f%s%x1f%(trailers:key=Change,valueonly,separator=%x00)",
|
|
85
|
+
"--follow",
|
|
86
|
+
];
|
|
87
|
+
if (line) {
|
|
88
|
+
args.push(`-L${line},${line}:${relFile}`);
|
|
89
|
+
// -L doesn't support --follow, remove it
|
|
90
|
+
args.splice(args.indexOf("--follow"), 1);
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
args.push("--", relFile);
|
|
94
|
+
}
|
|
95
|
+
const stdout = await git.raw(args);
|
|
96
|
+
for (const rawLine of stdout.trim().split("\n")) {
|
|
97
|
+
if (!rawLine)
|
|
98
|
+
continue;
|
|
99
|
+
// For -L format, git outputs diff lines too — only parse our format lines
|
|
100
|
+
const parts = rawLine.split("\x1f");
|
|
101
|
+
if (parts.length < 4)
|
|
102
|
+
continue;
|
|
103
|
+
if (!/^[0-9a-f]{40}$/.test(parts[0]))
|
|
104
|
+
continue;
|
|
105
|
+
const [hash, date, author, subject, ...trailerParts] = parts;
|
|
106
|
+
const changeTrailer = trailerParts.join("").trim();
|
|
107
|
+
commits.push({
|
|
108
|
+
hash,
|
|
109
|
+
date,
|
|
110
|
+
author,
|
|
111
|
+
subject,
|
|
112
|
+
changeId: changeTrailer || undefined,
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
catch {
|
|
117
|
+
// git log failed — likely not a git repo or file has no history
|
|
118
|
+
}
|
|
119
|
+
// Deduplicate (git -L can produce dupes)
|
|
120
|
+
const seen = new Set();
|
|
121
|
+
return commits.filter((c) => {
|
|
122
|
+
if (seen.has(c.hash))
|
|
123
|
+
return false;
|
|
124
|
+
seen.add(c.hash);
|
|
125
|
+
return true;
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
async function lookupChanges(root, changeIds) {
|
|
129
|
+
const changes = [];
|
|
130
|
+
for (const changeId of changeIds) {
|
|
131
|
+
// Check archive first
|
|
132
|
+
const archiveEntry = await findInArchive(root, changeId);
|
|
133
|
+
if (archiveEntry) {
|
|
134
|
+
changes.push(archiveEntry);
|
|
135
|
+
continue;
|
|
136
|
+
}
|
|
137
|
+
// Check active changes
|
|
138
|
+
const activeEntry = await findInActive(root, changeId);
|
|
139
|
+
if (activeEntry) {
|
|
140
|
+
changes.push(activeEntry);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
// Sort by date, newest first
|
|
144
|
+
changes.sort((a, b) => b.date.localeCompare(a.date));
|
|
145
|
+
return changes;
|
|
146
|
+
}
|
|
147
|
+
async function findInArchive(root, changeId) {
|
|
148
|
+
const archiveDir = join(root, ".grimoire", "archive");
|
|
149
|
+
let dirs;
|
|
150
|
+
try {
|
|
151
|
+
const entries = await readdir(archiveDir);
|
|
152
|
+
dirs = entries.filter((d) => d.endsWith(`-${changeId}`));
|
|
153
|
+
}
|
|
154
|
+
catch {
|
|
155
|
+
return null;
|
|
156
|
+
}
|
|
157
|
+
if (dirs.length === 0)
|
|
158
|
+
return null;
|
|
159
|
+
const dir = dirs[0];
|
|
160
|
+
const match = dir.match(/^(\d{4}-\d{2}-\d{2})-/);
|
|
161
|
+
const date = match ? match[1] : "";
|
|
162
|
+
const manifestPath = join(archiveDir, dir, "manifest.md");
|
|
163
|
+
try {
|
|
164
|
+
const manifest = await readFile(manifestPath, "utf-8");
|
|
165
|
+
const parsed = parseManifest(manifest);
|
|
166
|
+
return {
|
|
167
|
+
changeId,
|
|
168
|
+
date,
|
|
169
|
+
archived: true,
|
|
170
|
+
...parsed,
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
catch {
|
|
174
|
+
return { changeId, date, summary: "(manifest not readable)", why: "", features: [], decisions: [], archived: true };
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
async function findInActive(root, changeId) {
|
|
178
|
+
const manifestPath = join(root, ".grimoire", "changes", changeId, "manifest.md");
|
|
179
|
+
try {
|
|
180
|
+
const manifest = await readFile(manifestPath, "utf-8");
|
|
181
|
+
const parsed = parseManifest(manifest);
|
|
182
|
+
return {
|
|
183
|
+
changeId,
|
|
184
|
+
date: "(active)",
|
|
185
|
+
archived: false,
|
|
186
|
+
...parsed,
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
catch {
|
|
190
|
+
return null;
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
function parseManifest(content) {
|
|
194
|
+
const titleMatch = content.match(/^#\s+Change:\s*(.+)$/m);
|
|
195
|
+
const summary = titleMatch ? titleMatch[1].trim() : "(no summary)";
|
|
196
|
+
const whyMatch = content.match(/^##\s+Why\s*\n([\s\S]*?)(?=^##|\Z)/m);
|
|
197
|
+
const why = whyMatch ? whyMatch[1].trim() : "";
|
|
198
|
+
const features = [];
|
|
199
|
+
const featurePattern = /\*\*(?:ADDED|MODIFIED|REMOVED)\*\*\s+`([^`]+\.feature)`/g;
|
|
200
|
+
let m;
|
|
201
|
+
while ((m = featurePattern.exec(content)) !== null) {
|
|
202
|
+
features.push(m[1]);
|
|
203
|
+
}
|
|
204
|
+
const decisions = [];
|
|
205
|
+
const decisionPattern = /\*\*(?:ADDED|MODIFIED|SUPERSEDED)\*\*\s+`(\d{4}-[^`]+\.md)`/g;
|
|
206
|
+
while ((m = decisionPattern.exec(content)) !== null) {
|
|
207
|
+
decisions.push(m[1]);
|
|
208
|
+
}
|
|
209
|
+
return { summary, why, features, decisions };
|
|
210
|
+
}
|
|
211
|
+
//# sourceMappingURL=trace.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trace.js","sourceRoot":"","sources":["../../src/core/trace.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AA+BpD,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,MAAc,EACd,OAAqB;IAErB,MAAM,IAAI,GAAG,MAAM,eAAe,EAAE,CAAC;IAErC,qEAAqE;IACrE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;IAC3C,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC;IAE1D,kDAAkD;IAClD,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;IAEtD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,4BAA4B,OAAO,EAAE,CAAC,CAAC,CAAC;QAC9D,OAAO;IACT,CAAC;IAED,kDAAkD;IAClD,MAAM,SAAS,GAAG,IAAI,GAAG,EAAU,CAAC;IACpC,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,IAAI,CAAC,CAAC,QAAQ;YAAE,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IAC5C,CAAC;IAED,iEAAiE;IACjE,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IAErD,MAAM,MAAM,GAAgB,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;IAEtE,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC7C,OAAO;IACT,CAAC;IAED,gBAAgB;IAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;IAE1E,eAAe;IACf,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC;IAC/C,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;QACrC,MAAM,SAAS,GAAG,CAAC,CAAC,QAAQ;YAC1B,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,QAAQ,GAAG,CAAC;YAChC,CAAC,CAAC,EAAE,CAAC;QACP,OAAO,CAAC,GAAG,CACT,KAAK,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,GAAG,SAAS,EAAE,CACrF,CAAC;IACJ,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;QACxB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,aAAa,OAAO,CAAC,MAAM,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC;IAClE,CAAC;IAED,sBAAsB;IACtB,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC,CAAC;QACxD,KAAK,MAAM,EAAE,IAAI,OAAO,EAAE,CAAC;YACzB,MAAM,MAAM,GAAG,EAAE,CAAC,QAAQ;gBACxB,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC;gBACzB,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC3B,OAAO,CAAC,GAAG,CACT,KAAK,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,KAAK,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,MAAM,EAAE,CACjE,CAAC;YACF,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;YAC/B,IAAI,EAAE,CAAC,GAAG,EAAE,CAAC;gBACX,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;YAClD,CAAC;YACD,IAAI,EAAE,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC3B,OAAO,CAAC,GAAG,CACT,KAAK,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACxD,CAAC;YACJ,CAAC;YACD,IAAI,EAAE,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC5B,OAAO,CAAC,GAAG,CACT,KAAK,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAC1D,CAAC;YACJ,CAAC;YACD,OAAO,CAAC,GAAG,EAAE,CAAC;QAChB,CAAC;IACH,CAAC;SAAM,IAAI,SAAS,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QAChC,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,GAAG,CACP,6HAA6H,CAC9H,CACF,CAAC;IACJ,CAAC;AACH,CAAC;AAED,SAAS,WAAW,CAAC,MAAc;IACjC,qDAAqD;IACrD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;IACpD,IAAI,KAAK,EAAE,CAAC;QACV,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;IAC1D,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;AAC1B,CAAC;AAED,KAAK,UAAU,UAAU,CACvB,IAAY,EACZ,OAAe,EACf,IAAa;IAEb,MAAM,OAAO,GAAkB,EAAE,CAAC;IAClC,MAAM,GAAG,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAE5B,IAAI,CAAC;QACH,mCAAmC;QACnC,4CAA4C;QAC5C,MAAM,IAAI,GAAG;YACX,KAAK;YACL,oFAAoF;YACpF,UAAU;SACX,CAAC;QAEF,IAAI,IAAI,EAAE,CAAC;YACT,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,IAAI,IAAI,OAAO,EAAE,CAAC,CAAC;YAC1C,yCAAyC;YACzC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC;QAC3C,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC3B,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAEnC,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YAChD,IAAI,CAAC,OAAO;gBAAE,SAAS;YAEvB,0EAA0E;YAC1E,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YACpC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;gBAAE,SAAS;YAC/B,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;gBAAE,SAAS;YAE/C,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,YAAY,CAAC,GAAG,KAAK,CAAC;YAC7D,MAAM,aAAa,GAAG,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;YAEnD,OAAO,CAAC,IAAI,CAAC;gBACX,IAAI;gBACJ,IAAI;gBACJ,MAAM;gBACN,OAAO;gBACP,QAAQ,EAAE,aAAa,IAAI,SAAS;aACrC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,gEAAgE;IAClE,CAAC;IAED,yCAAyC;IACzC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;QAC1B,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;YAAE,OAAO,KAAK,CAAC;QACnC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACjB,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,aAAa,CAC1B,IAAY,EACZ,SAAsB;IAEtB,MAAM,OAAO,GAAkB,EAAE,CAAC;IAElC,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,sBAAsB;QACtB,MAAM,YAAY,GAAG,MAAM,aAAa,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QACzD,IAAI,YAAY,EAAE,CAAC;YACjB,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YAC3B,SAAS;QACX,CAAC;QAED,uBAAuB;QACvB,MAAM,WAAW,GAAG,MAAM,YAAY,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QACvD,IAAI,WAAW,EAAE,CAAC;YAChB,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC;IAED,6BAA6B;IAC7B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IACrD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,KAAK,UAAU,aAAa,CAC1B,IAAY,EACZ,QAAgB;IAEhB,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC;IAEtD,IAAI,IAAc,CAAC;IACnB,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC;QAC1C,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,QAAQ,EAAE,CAAC,CAAC,CAAC;IAC3D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAEnC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;IACjD,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAEnC,MAAM,YAAY,GAAG,IAAI,CAAC,UAAU,EAAE,GAAG,EAAE,aAAa,CAAC,CAAC;IAC1D,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QACvD,MAAM,MAAM,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC;QACvC,OAAO;YACL,QAAQ;YACR,IAAI;YACJ,QAAQ,EAAE,IAAI;YACd,GAAG,MAAM;SACV,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,yBAAyB,EAAE,GAAG,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IACtH,CAAC;AACH,CAAC;AAED,KAAK,UAAU,YAAY,CACzB,IAAY,EACZ,QAAgB;IAEhB,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAC;IAEjF,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QACvD,MAAM,MAAM,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC;QACvC,OAAO;YACL,QAAQ;YACR,IAAI,EAAE,UAAU;YAChB,QAAQ,EAAE,KAAK;YACf,GAAG,MAAM;SACV,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CAAC,OAAe;IAMpC,MAAM,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;IAC1D,MAAM,OAAO,GAAG,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,cAAc,CAAC;IAEnE,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAC5B,qCAAqC,CACtC,CAAC;IACF,MAAM,GAAG,GAAG,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAE/C,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,MAAM,cAAc,GAAG,0DAA0D,CAAC;IAClF,IAAI,CAAC,CAAC;IACN,OAAO,CAAC,CAAC,GAAG,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QACnD,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACtB,CAAC;IAED,MAAM,SAAS,GAAa,EAAE,CAAC;IAC/B,MAAM,eAAe,GAAG,8DAA8D,CAAC;IACvF,OAAO,CAAC,CAAC,GAAG,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QACpD,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACvB,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;AAC/C,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export interface UpdateOptions {
|
|
2
|
+
skipAgents: boolean;
|
|
3
|
+
skipSkills: boolean;
|
|
4
|
+
skipHooks: boolean;
|
|
5
|
+
skipTemplates: boolean;
|
|
6
|
+
forceTemplates: boolean;
|
|
7
|
+
skipConfig: boolean;
|
|
8
|
+
}
|
|
9
|
+
export declare function updateProject(projectPath: string, options: UpdateOptions): Promise<void>;
|
|
10
|
+
//# sourceMappingURL=update.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../src/core/update.ts"],"names":[],"mappings":"AAqBA,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,OAAO,CAAC;IACpB,UAAU,EAAE,OAAO,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;IACnB,aAAa,EAAE,OAAO,CAAC;IACvB,cAAc,EAAE,OAAO,CAAC;IACxB,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,wBAAsB,aAAa,CACjC,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,IAAI,CAAC,CAuDf"}
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
import { readFile, writeFile } from "node:fs/promises";
|
|
2
|
+
import { join, dirname } from "node:path";
|
|
3
|
+
import { fileURLToPath } from "node:url";
|
|
4
|
+
import { parse as yamlParse, stringify as yamlStringify } from "yaml";
|
|
5
|
+
import chalk from "chalk";
|
|
6
|
+
import { fileExists } from "../utils/fs.js";
|
|
7
|
+
import { loadConfig, CURRENT_CONFIG_VERSION } from "../utils/config.js";
|
|
8
|
+
import { upsertAgentsFile, installSkillFiles, installTemplates, ensureDirectories, generateAgentFiles, detectAgentFiles, SKILL_NAMES, } from "./shared-setup.js";
|
|
9
|
+
import { setupHooks } from "./hooks.js";
|
|
10
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
11
|
+
const PACKAGE_ROOT = join(__dirname, "..", "..");
|
|
12
|
+
export async function updateProject(projectPath, options) {
|
|
13
|
+
const root = join(process.cwd(), projectPath);
|
|
14
|
+
// Verify this is a grimoire project
|
|
15
|
+
if (!(await fileExists(join(root, ".grimoire")))) {
|
|
16
|
+
throw new Error("No .grimoire/ directory found. Run grimoire init first.");
|
|
17
|
+
}
|
|
18
|
+
console.log(chalk.bold("Updating grimoire...\n"));
|
|
19
|
+
// 1. Migrate config if needed
|
|
20
|
+
if (!options.skipConfig) {
|
|
21
|
+
await migrateConfig(root);
|
|
22
|
+
}
|
|
23
|
+
// 2. Ensure all directories exist
|
|
24
|
+
await ensureDirectories(root);
|
|
25
|
+
// 3. Update templates (create missing, optionally force-overwrite)
|
|
26
|
+
if (!options.skipTemplates) {
|
|
27
|
+
await installTemplates(root, PACKAGE_ROOT, options.forceTemplates);
|
|
28
|
+
}
|
|
29
|
+
// 4. Update AGENTS.md
|
|
30
|
+
if (!options.skipAgents) {
|
|
31
|
+
await updateAgentsFile(root);
|
|
32
|
+
}
|
|
33
|
+
// 5. Determine agents from config (fallback to auto-detect for legacy projects)
|
|
34
|
+
const config = await loadConfig(root);
|
|
35
|
+
const configAgents = config.project.agents ?? [];
|
|
36
|
+
const agents = configAgents.length > 0 ? configAgents : await detectAgentFiles(root);
|
|
37
|
+
const instructionAgents = agents.filter((a) => ["cursor", "copilot"].includes(a));
|
|
38
|
+
const skillAgents = agents.filter((a) => ["claude", "opencode", "codex"].includes(a));
|
|
39
|
+
// 6. Update agent-specific instruction files (cursor, copilot)
|
|
40
|
+
if (!options.skipAgents && instructionAgents.length > 0) {
|
|
41
|
+
await generateAgentFiles(root, PACKAGE_ROOT, instructionAgents, "updated");
|
|
42
|
+
}
|
|
43
|
+
// 7. Update skills (install to every selected agent's skill dir)
|
|
44
|
+
if (!options.skipSkills) {
|
|
45
|
+
const targets = skillAgents.length > 0 ? skillAgents : ["claude"];
|
|
46
|
+
await updateSkills(root, targets);
|
|
47
|
+
}
|
|
48
|
+
// 8. Update hooks
|
|
49
|
+
if (!options.skipHooks) {
|
|
50
|
+
await setupHooks(root);
|
|
51
|
+
}
|
|
52
|
+
// 9. Write version stamp
|
|
53
|
+
await writeVersionStamp(root);
|
|
54
|
+
console.log(`\n${chalk.bold.green("Done!")} Grimoire updated.`);
|
|
55
|
+
}
|
|
56
|
+
async function updateAgentsFile(root) {
|
|
57
|
+
const config = await loadConfig(root);
|
|
58
|
+
const caveman = config.project.caveman ?? "none";
|
|
59
|
+
await upsertAgentsFile(root, PACKAGE_ROOT, "updated", caveman);
|
|
60
|
+
}
|
|
61
|
+
async function updateSkills(root, agents) {
|
|
62
|
+
await installSkillFiles(root, PACKAGE_ROOT, SKILL_NAMES, "updated", agents);
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Migrate config.yaml to the current schema version.
|
|
66
|
+
* Additive only — never removes user keys.
|
|
67
|
+
*/
|
|
68
|
+
async function migrateConfig(root) {
|
|
69
|
+
const configPath = join(root, ".grimoire", "config.yaml");
|
|
70
|
+
if (!(await fileExists(configPath))) {
|
|
71
|
+
console.log(` ${chalk.yellow("skipped")} config migration (no config.yaml)`);
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
const content = await readFile(configPath, "utf-8");
|
|
75
|
+
let raw;
|
|
76
|
+
try {
|
|
77
|
+
raw = yamlParse(content) ?? {};
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
console.log(` ${chalk.yellow("skipped")} config migration (invalid YAML)`);
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
const currentVersion = Number(raw.version ?? 1);
|
|
84
|
+
if (currentVersion >= CURRENT_CONFIG_VERSION) {
|
|
85
|
+
return; // already up to date
|
|
86
|
+
}
|
|
87
|
+
// Apply migrations in order
|
|
88
|
+
for (const migration of MIGRATIONS) {
|
|
89
|
+
if (currentVersion <= migration.from) {
|
|
90
|
+
migration.apply(raw);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
raw.version = CURRENT_CONFIG_VERSION;
|
|
94
|
+
await writeFile(configPath, yamlStringify(raw));
|
|
95
|
+
console.log(` ${chalk.blue("migrated")} config.yaml (v${currentVersion} → v${CURRENT_CONFIG_VERSION})`);
|
|
96
|
+
}
|
|
97
|
+
function ensureChecks(raw, required) {
|
|
98
|
+
if (!Array.isArray(raw.checks))
|
|
99
|
+
return;
|
|
100
|
+
const checks = raw.checks;
|
|
101
|
+
for (const check of required) {
|
|
102
|
+
if (!checks.includes(check)) {
|
|
103
|
+
checks.push(check);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
function upgradeFlatlLlm(raw) {
|
|
108
|
+
if (!raw.llm || typeof raw.llm !== "object")
|
|
109
|
+
return;
|
|
110
|
+
const llm = raw.llm;
|
|
111
|
+
if (!llm.thinking && llm.command) {
|
|
112
|
+
const cmd = String(llm.command);
|
|
113
|
+
llm.thinking = { command: cmd };
|
|
114
|
+
llm.coding = { command: cmd };
|
|
115
|
+
delete llm.command;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
const MIGRATIONS = [
|
|
119
|
+
{
|
|
120
|
+
from: 1,
|
|
121
|
+
to: 2,
|
|
122
|
+
apply: (raw) => {
|
|
123
|
+
if (!raw.project || typeof raw.project !== "object") {
|
|
124
|
+
raw.project = {};
|
|
125
|
+
}
|
|
126
|
+
const project = raw.project;
|
|
127
|
+
if (!project.caveman) {
|
|
128
|
+
project.caveman = "lite";
|
|
129
|
+
}
|
|
130
|
+
ensureChecks(raw, ["dep_audit", "secrets", "best_practices"]);
|
|
131
|
+
upgradeFlatlLlm(raw);
|
|
132
|
+
},
|
|
133
|
+
},
|
|
134
|
+
];
|
|
135
|
+
/**
|
|
136
|
+
* Write a version stamp so future updates know what version was last installed.
|
|
137
|
+
*/
|
|
138
|
+
async function writeVersionStamp(root) {
|
|
139
|
+
try {
|
|
140
|
+
const pkgJson = await readFile(join(PACKAGE_ROOT, "package.json"), "utf-8");
|
|
141
|
+
const pkg = JSON.parse(pkgJson);
|
|
142
|
+
const stampPath = join(root, ".grimoire", ".version");
|
|
143
|
+
await writeFile(stampPath, pkg.version + "\n");
|
|
144
|
+
}
|
|
145
|
+
catch {
|
|
146
|
+
// Non-critical — don't fail the update
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
//# sourceMappingURL=update.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/core/update.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
interface ValidateOptions {
|
|
2
|
+
strict: boolean;
|
|
3
|
+
json: boolean;
|
|
4
|
+
}
|
|
5
|
+
export interface ValidationResult {
|
|
6
|
+
file: string;
|
|
7
|
+
errors: string[];
|
|
8
|
+
warnings: string[];
|
|
9
|
+
}
|
|
10
|
+
export interface ValidateResult {
|
|
11
|
+
results: ValidationResult[];
|
|
12
|
+
errorCount: number;
|
|
13
|
+
warnCount: number;
|
|
14
|
+
}
|
|
15
|
+
export declare function validateChange(changeId: string | undefined, options: ValidateOptions): Promise<ValidateResult>;
|
|
16
|
+
export declare function validateFeatureFile(filePath: string, content: string, strict: boolean): ValidationResult;
|
|
17
|
+
export declare function validateDecisionFile(filePath: string, content: string, strict: boolean): ValidationResult;
|
|
18
|
+
export declare function validateManifest(filePath: string, content: string, strict: boolean): ValidationResult;
|
|
19
|
+
export {};
|
|
20
|
+
//# sourceMappingURL=validate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/core/validate.ts"],"names":[],"mappings":"AAcA,UAAU,eAAe;IACvB,MAAM,EAAE,OAAO,CAAC;IAChB,IAAI,EAAE,OAAO,CAAC;CACf;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,gBAAgB,EAAE,CAAC;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAsB,cAAc,CAClC,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,OAAO,EAAE,eAAe,GACvB,OAAO,CAAC,cAAc,CAAC,CAmEzB;AAyFD,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,OAAO,GACd,gBAAgB,CAuElB;AAED,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,OAAO,GACd,gBAAgB,CA4ClB;AASD,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,OAAO,GACd,gBAAgB,CA4ClB"}
|