@zedtech/zedkit-ai 0.0.0-stage → 0.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.
- package/LICENSE +21 -0
- package/README.md +175 -2
- package/dist/bin.d.ts +3 -0
- package/dist/bin.d.ts.map +1 -0
- package/dist/bin.js +8 -0
- package/dist/bin.js.map +1 -0
- package/dist/cli.d.ts +8 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +123 -0
- package/dist/cli.js.map +1 -0
- package/dist/frontmatter.d.ts +9 -0
- package/dist/frontmatter.d.ts.map +1 -0
- package/dist/frontmatter.js +22 -0
- package/dist/frontmatter.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/dist/install.d.ts +36 -0
- package/dist/install.d.ts.map +1 -0
- package/dist/install.js +238 -0
- package/dist/install.js.map +1 -0
- package/dist/kit.d.ts +13 -0
- package/dist/kit.d.ts.map +1 -0
- package/dist/kit.js +36 -0
- package/dist/kit.js.map +1 -0
- package/dist/validate.d.ts +22 -0
- package/dist/validate.d.ts.map +1 -0
- package/dist/validate.js +240 -0
- package/dist/validate.js.map +1 -0
- package/kit/AGENTS.template.md +96 -0
- package/kit/THIRD_PARTY_NOTICES.md +63 -0
- package/kit/agents/architect.md +48 -0
- package/kit/agents/explorer.md +33 -0
- package/kit/agents/improver.md +34 -0
- package/kit/agents/plan-challenger.md +50 -0
- package/kit/agents/security-reviewer.md +33 -0
- package/kit/agents/verifier.md +39 -0
- package/kit/commands/challenge.md +5 -0
- package/kit/commands/handoff.md +5 -0
- package/kit/commands/implement.md +5 -0
- package/kit/commands/plan.md +5 -0
- package/kit/commands/pr.md +5 -0
- package/kit/commands/review.md +5 -0
- package/kit/commands/setup-ai.md +5 -0
- package/kit/kit.json +47 -0
- package/kit/skills/LICENSE-humanlayer-Apache-2.0 +202 -0
- package/kit/skills/LICENSE-mattpocock-skills-MIT +21 -0
- package/kit/skills/LICENSE-ponytail-MIT +21 -0
- package/kit/skills/adversarial-tests/SKILL.md +64 -0
- package/kit/skills/challenge/SKILL.md +18 -0
- package/kit/skills/code-review/SKILL.md +74 -0
- package/kit/skills/code-review/agents/openai.yaml +3 -0
- package/kit/skills/codebase-design/DEEPENING.md +37 -0
- package/kit/skills/codebase-design/DESIGN-IT-TWICE.md +44 -0
- package/kit/skills/codebase-design/SKILL.md +114 -0
- package/kit/skills/codebase-design/agents/openai.yaml +3 -0
- package/kit/skills/definition-of-done/SKILL.md +53 -0
- package/kit/skills/diagnosing-bugs/SKILL.md +138 -0
- package/kit/skills/diagnosing-bugs/agents/openai.yaml +3 -0
- package/kit/skills/diagnosing-bugs/scripts/hitl-loop.template.sh +44 -0
- package/kit/skills/domain-modeling/ADR-FORMAT.md +47 -0
- package/kit/skills/domain-modeling/GLOSSARY-FORMAT.md +60 -0
- package/kit/skills/domain-modeling/SKILL.md +74 -0
- package/kit/skills/domain-modeling/agents/openai.yaml +3 -0
- package/kit/skills/ground-truth/SKILL.md +50 -0
- package/kit/skills/handoff/SKILL.md +16 -0
- package/kit/skills/handoff/agents/openai.yaml +5 -0
- package/kit/skills/implement/SKILL.md +25 -0
- package/kit/skills/implement/agents/openai.yaml +5 -0
- package/kit/skills/implement-spec/SKILL.md +42 -0
- package/kit/skills/implement-spec/agents/openai.yaml +5 -0
- package/kit/skills/improve-codebase-architecture/HTML-REPORT.md +123 -0
- package/kit/skills/improve-codebase-architecture/SKILL.md +71 -0
- package/kit/skills/improve-codebase-architecture/agents/openai.yaml +5 -0
- package/kit/skills/parallel-work/SKILL.md +61 -0
- package/kit/skills/persona-review/SKILL.md +38 -0
- package/kit/skills/plan/SKILL.md +38 -0
- package/kit/skills/ponytail/SKILL.md +53 -0
- package/kit/skills/ponytail-audit/SKILL.md +103 -0
- package/kit/skills/ponytail-debt/SKILL.md +44 -0
- package/kit/skills/ponytail-gain/SKILL.md +52 -0
- package/kit/skills/ponytail-help/SKILL.md +76 -0
- package/kit/skills/ponytail-review/SKILL.md +119 -0
- package/kit/skills/pr/CREDITS.md +3 -0
- package/kit/skills/pr/SKILL.md +170 -0
- package/kit/skills/pr/agents/openai.yaml +3 -0
- package/kit/skills/research/SKILL.md +12 -0
- package/kit/skills/research/agents/openai.yaml +3 -0
- package/kit/skills/retro/SKILL.md +44 -0
- package/kit/skills/retro/agents/openai.yaml +5 -0
- package/kit/skills/review/SKILL.md +37 -0
- package/kit/skills/rules-upkeep/SKILL.md +55 -0
- package/kit/skills/setup-ai/SKILL.md +139 -0
- package/kit/skills/setup-matt-pocock-skills/SKILL.md +118 -0
- package/kit/skills/setup-matt-pocock-skills/agents/openai.yaml +5 -0
- package/kit/skills/setup-matt-pocock-skills/domain.md +51 -0
- package/kit/skills/setup-matt-pocock-skills/issue-tracker-github.md +46 -0
- package/kit/skills/setup-matt-pocock-skills/issue-tracker-gitlab.md +46 -0
- package/kit/skills/setup-matt-pocock-skills/issue-tracker-local.md +30 -0
- package/kit/skills/setup-matt-pocock-skills/triage-labels.md +15 -0
- package/kit/skills/setup-ts-deep-modules/SKILL.md +102 -0
- package/kit/skills/setup-ts-deep-modules/agents/openai.yaml +5 -0
- package/kit/skills/setup-ts-deep-modules/dependency-cruiser.config.cjs +95 -0
- package/kit/skills/tdd/SKILL.md +38 -0
- package/kit/skills/tdd/agents/openai.yaml +3 -0
- package/kit/skills/tdd/mocking.md +59 -0
- package/kit/skills/tdd/tests.md +77 -0
- package/kit/skills/to-spec/SKILL.md +75 -0
- package/kit/skills/to-spec/agents/openai.yaml +5 -0
- package/kit/skills/to-tickets/SKILL.md +105 -0
- package/kit/skills/to-tickets/agents/openai.yaml +5 -0
- package/kit/skills/triage/AGENT-BRIEF.md +207 -0
- package/kit/skills/triage/OUT-OF-SCOPE.md +105 -0
- package/kit/skills/triage/SKILL.md +112 -0
- package/kit/skills/triage/agents/openai.yaml +5 -0
- package/kit/skills/use-zedkit/SKILL.md +32 -0
- package/kit/skills/wayfinder/SKILL.md +128 -0
- package/kit/skills/wayfinder/agents/openai.yaml +5 -0
- package/kit/skills/writing-for-agents/SKILL-MECHANICS.md +22 -0
- package/kit/skills/writing-for-agents/SKILL.md +81 -0
- package/kit/skills/writing-for-agents/agents/openai.yaml +3 -0
- package/package.json +48 -3
package/dist/install.js
ADDED
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
// Original work by the same author.
|
|
2
|
+
import { copyFileSync, cpSync, existsSync, lstatSync, mkdirSync, readdirSync, readFileSync, readlinkSync, statSync, symlinkSync, writeFileSync, } from "node:fs";
|
|
3
|
+
import { dirname, join, sep } from "node:path";
|
|
4
|
+
import { err, ok, tryCatch } from "@zedtech/zedkit-core";
|
|
5
|
+
import { parseFrontmatter } from "./frontmatter.js";
|
|
6
|
+
import { kitDir, readManifest } from "./kit.js";
|
|
7
|
+
const ALL_PROVIDERS = ["claude", "cursor", "codex", "muse"];
|
|
8
|
+
const CURSOR_RULE = `---
|
|
9
|
+
description: Project rules
|
|
10
|
+
alwaysApply: true
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
Read and follow /AGENTS.md at the repo root, and use the skills in .agents/skills.
|
|
14
|
+
`;
|
|
15
|
+
function lstatOf(path) {
|
|
16
|
+
const stat = tryCatch(() => lstatSync(path));
|
|
17
|
+
return stat.ok ? stat.value : undefined;
|
|
18
|
+
}
|
|
19
|
+
function isDirectory(path) {
|
|
20
|
+
const stat = tryCatch(() => statSync(path));
|
|
21
|
+
return stat.ok && stat.value.isDirectory();
|
|
22
|
+
}
|
|
23
|
+
// Why `rel` cannot be created, or undefined when the way is free. The path
|
|
24
|
+
// itself is taken if anything (even a dangling symlink) is there; a parent
|
|
25
|
+
// that is not a directory would make the write fail halfway.
|
|
26
|
+
function obstacle(ctx, rel) {
|
|
27
|
+
const parts = rel.split(sep);
|
|
28
|
+
for (let i = 1; i < parts.length; i++) {
|
|
29
|
+
const parent = join(ctx.dest, ...parts.slice(0, i));
|
|
30
|
+
if (lstatOf(parent) && !isDirectory(parent)) {
|
|
31
|
+
return `${parts.slice(0, i).join(sep)} is not a directory`;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
return lstatOf(join(ctx.dest, rel)) ? "already exists, left untouched" : undefined;
|
|
35
|
+
}
|
|
36
|
+
function place(ctx, kind, rel, make, note) {
|
|
37
|
+
const blocked = obstacle(ctx, rel);
|
|
38
|
+
if (blocked) {
|
|
39
|
+
const current = tryCatch(() => readlinkSync(join(ctx.dest, rel)));
|
|
40
|
+
const same = kind === "link" && current.ok && current.value === note;
|
|
41
|
+
ctx.actions.push({ kind: "skip", path: rel, note: same ? "already linked" : blocked });
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
ctx.actions.push({ kind, path: rel, ...(note !== undefined && { note }) });
|
|
45
|
+
if (ctx.dryRun)
|
|
46
|
+
return;
|
|
47
|
+
mkdirSync(dirname(join(ctx.dest, rel)), { recursive: true });
|
|
48
|
+
make();
|
|
49
|
+
}
|
|
50
|
+
function copyFile(ctx, from, rel) {
|
|
51
|
+
place(ctx, "copy", rel, () => copyFileSync(from, join(ctx.dest, rel)));
|
|
52
|
+
}
|
|
53
|
+
function link(ctx, rel, target) {
|
|
54
|
+
place(ctx, "link", rel, () => symlinkSync(target, join(ctx.dest, rel)), target);
|
|
55
|
+
}
|
|
56
|
+
function skillNames(manifest, kit, preset) {
|
|
57
|
+
const entry = Object.hasOwn(manifest.presets, preset) ? manifest.presets[preset] : undefined;
|
|
58
|
+
if (entry === undefined) {
|
|
59
|
+
throw new Error(`unknown preset "${preset}" (have: ${Object.keys(manifest.presets).join(", ")})`);
|
|
60
|
+
}
|
|
61
|
+
if (entry !== "*")
|
|
62
|
+
return entry;
|
|
63
|
+
return readdirSync(join(kit, "skills"), { withFileTypes: true })
|
|
64
|
+
.filter((e) => e.isDirectory())
|
|
65
|
+
.map((e) => e.name);
|
|
66
|
+
}
|
|
67
|
+
// Resolve everything the install needs from the kit before the first write,
|
|
68
|
+
// so a bad preset or manifest never leaves a half install behind.
|
|
69
|
+
function plan(kit, manifest, preset) {
|
|
70
|
+
const skills = skillNames(manifest, kit, preset);
|
|
71
|
+
for (const name of skills) {
|
|
72
|
+
if (!existsSync(join(kit, "skills", name, "SKILL.md")))
|
|
73
|
+
throw new Error(`kit has no skill "${name}"`);
|
|
74
|
+
}
|
|
75
|
+
for (const name of manifest.agents) {
|
|
76
|
+
if (!existsSync(join(kit, "agents", `${name}.md`)))
|
|
77
|
+
throw new Error(`kit has no agent "${name}"`);
|
|
78
|
+
}
|
|
79
|
+
const commands = manifest.commands ?? [];
|
|
80
|
+
for (const name of commands) {
|
|
81
|
+
if (!existsSync(join(kit, "commands", `${name}.md`)))
|
|
82
|
+
throw new Error(`kit has no command "${name}"`);
|
|
83
|
+
}
|
|
84
|
+
const licences = readdirSync(join(kit, "skills")).filter((f) => f.startsWith("LICENSE-"));
|
|
85
|
+
return { skills, licences, agents: manifest.agents, commands };
|
|
86
|
+
}
|
|
87
|
+
// The ladder section every AGENTS.md must carry, lifted from the bundled
|
|
88
|
+
// template so the wording has a single home. Undefined when the kit has
|
|
89
|
+
// no template or no ladder section (foreign kits keep working).
|
|
90
|
+
function ladderSection(kit) {
|
|
91
|
+
const template = tryCatch(() => readFileSync(join(kit, "AGENTS.template.md"), "utf8"));
|
|
92
|
+
if (!template.ok)
|
|
93
|
+
return undefined;
|
|
94
|
+
const start = template.value.indexOf("## Before writing any code");
|
|
95
|
+
if (start < 0)
|
|
96
|
+
return undefined;
|
|
97
|
+
const rest = template.value.slice(start);
|
|
98
|
+
const next = rest.indexOf("\n## ", 1);
|
|
99
|
+
return `${(next < 0 ? rest : rest.slice(0, next)).trimEnd()}\n`;
|
|
100
|
+
}
|
|
101
|
+
// Fresh projects get the whole template; an existing AGENTS.md is never
|
|
102
|
+
// overwritten, but when it lacks the ladder the section is appended (and
|
|
103
|
+
// reported as `append`, so dry runs agree with real ones).
|
|
104
|
+
function installAgentsMd(ctx) {
|
|
105
|
+
const blocked = obstacle(ctx, "AGENTS.md");
|
|
106
|
+
if (blocked === undefined) {
|
|
107
|
+
copyFile(ctx, join(ctx.kit, "AGENTS.template.md"), "AGENTS.md");
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
const current = tryCatch(() => readFileSync(join(ctx.dest, "AGENTS.md"), "utf8"));
|
|
111
|
+
if (!current.ok || current.value.toLowerCase().includes("ladder")) {
|
|
112
|
+
ctx.actions.push({ kind: "skip", path: "AGENTS.md", note: blocked });
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
const section = ladderSection(ctx.kit);
|
|
116
|
+
if (section === undefined) {
|
|
117
|
+
ctx.actions.push({ kind: "skip", path: "AGENTS.md", note: blocked });
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
ctx.actions.push({ kind: "append", path: "AGENTS.md", note: "ladder section" });
|
|
121
|
+
if (ctx.dryRun)
|
|
122
|
+
return;
|
|
123
|
+
const gap = current.value === "" ? "" : current.value.endsWith("\n") ? "\n" : "\n\n";
|
|
124
|
+
writeFileSync(join(ctx.dest, "AGENTS.md"), `${current.value}${gap}${section}`);
|
|
125
|
+
}
|
|
126
|
+
function installContent(ctx, content) {
|
|
127
|
+
for (const name of content.skills) {
|
|
128
|
+
const rel = join(".agents", "skills", name);
|
|
129
|
+
// dereference: a symlink inside a skill must not be copied as a dangling one
|
|
130
|
+
place(ctx, "copy", rel, () => cpSync(join(ctx.kit, "skills", name), join(ctx.dest, rel), { recursive: true, dereference: true }));
|
|
131
|
+
}
|
|
132
|
+
// Licence texts of vendored skills travel with them.
|
|
133
|
+
for (const file of content.licences) {
|
|
134
|
+
copyFile(ctx, join(ctx.kit, "skills", file), join(".agents", "skills", file));
|
|
135
|
+
}
|
|
136
|
+
copyFile(ctx, join(ctx.kit, "THIRD_PARTY_NOTICES.md"), join(".agents", "THIRD_PARTY_NOTICES.md"));
|
|
137
|
+
for (const name of content.agents) {
|
|
138
|
+
copyFile(ctx, join(ctx.kit, "agents", `${name}.md`), join(".agents", "agents", `${name}.md`));
|
|
139
|
+
}
|
|
140
|
+
for (const name of content.commands) {
|
|
141
|
+
copyFile(ctx, join(ctx.kit, "commands", `${name}.md`), join(".agents", "commands", `${name}.md`));
|
|
142
|
+
}
|
|
143
|
+
installAgentsMd(ctx);
|
|
144
|
+
}
|
|
145
|
+
function agentsMdReady(ctx) {
|
|
146
|
+
if (ctx.actions.some((a) => a.kind === "copy" && a.path === "AGENTS.md"))
|
|
147
|
+
return true;
|
|
148
|
+
const stat = tryCatch(() => statSync(join(ctx.dest, "AGENTS.md")));
|
|
149
|
+
return stat.ok && stat.value.isFile();
|
|
150
|
+
}
|
|
151
|
+
// Name of another rule in .cursor/rules/ that is already always on, if any.
|
|
152
|
+
// A second always-on rule would only duplicate (or fight) it, so the
|
|
153
|
+
// installer skips project.mdc then. Reads the disk only, so dry runs agree.
|
|
154
|
+
function existingAlwaysOnRule(ctx) {
|
|
155
|
+
const dir = join(ctx.dest, ".cursor", "rules");
|
|
156
|
+
const entries = tryCatch(() => readdirSync(dir, { withFileTypes: true }));
|
|
157
|
+
if (!entries.ok)
|
|
158
|
+
return undefined;
|
|
159
|
+
for (const entry of entries.value) {
|
|
160
|
+
if (!entry.isFile() || !entry.name.endsWith(".mdc") || entry.name === "project.mdc")
|
|
161
|
+
continue;
|
|
162
|
+
const read = tryCatch(() => readFileSync(join(dir, entry.name), "utf8"));
|
|
163
|
+
if (!read.ok)
|
|
164
|
+
continue;
|
|
165
|
+
const front = parseFrontmatter(read.value);
|
|
166
|
+
if (front.ok && front.value.data.alwaysApply === true)
|
|
167
|
+
return entry.name;
|
|
168
|
+
}
|
|
169
|
+
return undefined;
|
|
170
|
+
}
|
|
171
|
+
function writeCursorRule(ctx) {
|
|
172
|
+
const rel = join(".cursor", "rules", "project.mdc");
|
|
173
|
+
if (obstacle(ctx, rel) === undefined) {
|
|
174
|
+
const existing = existingAlwaysOnRule(ctx);
|
|
175
|
+
if (existing !== undefined) {
|
|
176
|
+
ctx.actions.push({ kind: "skip", path: rel, note: `always-on rule ${existing} already exists` });
|
|
177
|
+
return;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
place(ctx, "write", rel, () => writeFileSync(join(ctx.dest, rel), CURSOR_RULE));
|
|
181
|
+
}
|
|
182
|
+
function wireClaude(ctx) {
|
|
183
|
+
link(ctx, join(".claude", "skills"), "../.agents/skills");
|
|
184
|
+
link(ctx, join(".claude", "agents"), "../.agents/agents");
|
|
185
|
+
link(ctx, join(".claude", "commands"), "../.agents/commands");
|
|
186
|
+
// Only when AGENTS.md is (or will be) a real file: never a dangling link.
|
|
187
|
+
if (agentsMdReady(ctx))
|
|
188
|
+
link(ctx, "CLAUDE.md", "AGENTS.md");
|
|
189
|
+
else
|
|
190
|
+
ctx.actions.push({ kind: "skip", path: "CLAUDE.md", note: "AGENTS.md is not a file" });
|
|
191
|
+
}
|
|
192
|
+
function wireCursor(ctx, content) {
|
|
193
|
+
link(ctx, join(".cursor", "skills"), "../.agents/skills");
|
|
194
|
+
// Real files, not links: a symlinked folder shows up empty here, so the
|
|
195
|
+
// copies are authoritative for Cursor. They can drift from .agents/;
|
|
196
|
+
// checkDrift reports that, and init never overwrites them.
|
|
197
|
+
for (const name of content.agents) {
|
|
198
|
+
copyFile(ctx, join(ctx.kit, "agents", `${name}.md`), join(".cursor", "agents", `${name}.md`));
|
|
199
|
+
}
|
|
200
|
+
for (const name of content.commands) {
|
|
201
|
+
copyFile(ctx, join(ctx.kit, "commands", `${name}.md`), join(".cursor", "commands", `${name}.md`));
|
|
202
|
+
}
|
|
203
|
+
writeCursorRule(ctx);
|
|
204
|
+
}
|
|
205
|
+
function wireProvider(ctx, provider, content) {
|
|
206
|
+
if (provider === "claude")
|
|
207
|
+
wireClaude(ctx);
|
|
208
|
+
else if (provider === "cursor")
|
|
209
|
+
wireCursor(ctx, content);
|
|
210
|
+
// codex and muse read the shared source directly (AGENTS.md plus
|
|
211
|
+
// .agents/): no per-provider layer to generate.
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Install the kit into a project. The shared source (skills, subagents,
|
|
215
|
+
* commands, AGENTS.md) is copied into `.agents/` (the project owns it from
|
|
216
|
+
* then on); each chosen provider then gets its thin layer, links where the
|
|
217
|
+
* provider follows them, real files where it does not. Existing files are
|
|
218
|
+
* never overwritten: they are reported as skipped, except an existing
|
|
219
|
+
* AGENTS.md missing the ladder, which gets the ladder section appended
|
|
220
|
+
* (reported as `append`). A bad preset or kit fails before anything is
|
|
221
|
+
* written.
|
|
222
|
+
*/
|
|
223
|
+
export function installKit(options) {
|
|
224
|
+
const kit = options.kit ?? kitDir();
|
|
225
|
+
const manifest = readManifest(kit);
|
|
226
|
+
if (!manifest.ok)
|
|
227
|
+
return err(manifest.error);
|
|
228
|
+
const ctx = { dest: options.dest, kit, dryRun: options.dryRun ?? false, actions: [] };
|
|
229
|
+
const run = tryCatch(() => {
|
|
230
|
+
const content = plan(kit, manifest.value, options.preset ?? "core");
|
|
231
|
+
installContent(ctx, content);
|
|
232
|
+
for (const provider of options.providers ?? options.targets ?? ALL_PROVIDERS) {
|
|
233
|
+
wireProvider(ctx, provider, content);
|
|
234
|
+
}
|
|
235
|
+
});
|
|
236
|
+
return run.ok ? ok(ctx.actions) : err(run.error);
|
|
237
|
+
}
|
|
238
|
+
//# sourceMappingURL=install.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install.js","sourceRoot":"","sources":["../src/install.ts"],"names":[],"mappings":"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"}
|
package/dist/kit.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { type Result } from "@zedtech/zedkit-core";
|
|
2
|
+
export type KitManifest = {
|
|
3
|
+
/** Preset name -> skill names, or "*" for every skill in the kit. */
|
|
4
|
+
presets: Record<string, string[] | "*">;
|
|
5
|
+
/** Subagent names (files in `agents/`). */
|
|
6
|
+
agents: string[];
|
|
7
|
+
/** Command names (files in `commands/`). Absent means none. */
|
|
8
|
+
commands?: string[];
|
|
9
|
+
};
|
|
10
|
+
/** Absolute path of the bundled kit (same relative spot from `src/` and `dist/`). */
|
|
11
|
+
export declare function kitDir(): string;
|
|
12
|
+
export declare function readManifest(dir?: string): Result<KitManifest>;
|
|
13
|
+
//# sourceMappingURL=kit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kit.d.ts","sourceRoot":"","sources":["../src/kit.ts"],"names":[],"mappings":"AAGA,OAAO,EAAqB,KAAK,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAEtE,MAAM,MAAM,WAAW,GAAG;IACxB,qEAAqE;IACrE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC;IACxC,2CAA2C;IAC3C,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,+DAA+D;IAC/D,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB,CAAC;AAEF,qFAAqF;AACrF,wBAAgB,MAAM,IAAI,MAAM,CAE/B;AAMD,wBAAgB,YAAY,CAAC,GAAG,GAAE,MAAiB,GAAG,MAAM,CAAC,WAAW,CAAC,CAuBxE"}
|
package/dist/kit.js
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
// Original work by the same author.
|
|
2
|
+
import { readFileSync } from "node:fs";
|
|
3
|
+
import { fileURLToPath } from "node:url";
|
|
4
|
+
import { err, ok, tryCatch } from "@zedtech/zedkit-core";
|
|
5
|
+
/** Absolute path of the bundled kit (same relative spot from `src/` and `dist/`). */
|
|
6
|
+
export function kitDir() {
|
|
7
|
+
return fileURLToPath(new URL("../kit/", import.meta.url));
|
|
8
|
+
}
|
|
9
|
+
function isStringList(value) {
|
|
10
|
+
return Array.isArray(value) && value.every((item) => typeof item === "string");
|
|
11
|
+
}
|
|
12
|
+
export function readManifest(dir = kitDir()) {
|
|
13
|
+
const read = tryCatch(() => JSON.parse(readFileSync(`${dir}/kit.json`, "utf8")));
|
|
14
|
+
if (!read.ok) {
|
|
15
|
+
return err(new Error(`cannot read kit.json in ${dir}: ${read.error.message}`));
|
|
16
|
+
}
|
|
17
|
+
const data = read.value;
|
|
18
|
+
const presets = data?.presets;
|
|
19
|
+
if (!presets || typeof presets !== "object" || !isStringList(data?.agents)) {
|
|
20
|
+
return err(new Error("kit.json needs `presets` (object) and `agents` (string list)"));
|
|
21
|
+
}
|
|
22
|
+
if (data.commands !== undefined && !isStringList(data.commands)) {
|
|
23
|
+
return err(new Error("kit.json `commands` must be a string list"));
|
|
24
|
+
}
|
|
25
|
+
for (const [name, value] of Object.entries(presets)) {
|
|
26
|
+
if (value !== "*" && !isStringList(value)) {
|
|
27
|
+
return err(new Error(`kit.json preset "${name}" must be a string list or "*"`));
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
return ok({
|
|
31
|
+
presets: presets,
|
|
32
|
+
agents: data.agents,
|
|
33
|
+
...(data.commands !== undefined && { commands: data.commands }),
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=kit.js.map
|
package/dist/kit.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kit.js","sourceRoot":"","sources":["../src/kit.ts"],"names":[],"mappings":"AAAA,oCAAoC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,QAAQ,EAAe,MAAM,sBAAsB,CAAC;AAWtE,qFAAqF;AACrF,MAAM,UAAU,MAAM;IACpB,OAAO,aAAa,CAAC,IAAI,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC5D,CAAC;AAED,SAAS,YAAY,CAAC,KAAc;IAClC,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC;AACjF,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,MAAc,MAAM,EAAE;IACjD,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,GAAG,GAAG,WAAW,EAAE,MAAM,CAAC,CAAY,CAAC,CAAC;IAC5F,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;QACb,OAAO,GAAG,CAAC,IAAI,KAAK,CAAC,2BAA2B,GAAG,KAAK,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IACjF,CAAC;IACD,MAAM,IAAI,GAAG,IAAI,CAAC,KAA2F,CAAC;IAC9G,MAAM,OAAO,GAAG,IAAI,EAAE,OAAO,CAAC;IAC9B,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC;QAC3E,OAAO,GAAG,CAAC,IAAI,KAAK,CAAC,8DAA8D,CAAC,CAAC,CAAC;IACxF,CAAC;IACD,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;QAChE,OAAO,GAAG,CAAC,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC,CAAC;IACrE,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACpD,IAAI,KAAK,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;YAC1C,OAAO,GAAG,CAAC,IAAI,KAAK,CAAC,oBAAoB,IAAI,gCAAgC,CAAC,CAAC,CAAC;QAClF,CAAC;IACH,CAAC;IACD,OAAO,EAAE,CAAC;QACR,OAAO,EAAE,OAAiC;QAC1C,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,GAAG,CAAC,IAAI,CAAC,QAAQ,KAAK,SAAS,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAoB,EAAE,CAAC;KAC5E,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export type Issue = {
|
|
2
|
+
path: string;
|
|
3
|
+
message: string;
|
|
4
|
+
};
|
|
5
|
+
/**
|
|
6
|
+
* Check a directory laid out as `skills/<name>/SKILL.md`, `agents/<name>.md`,
|
|
7
|
+
* `commands/<name>.md` and optionally `kit.json`. Returns every problem
|
|
8
|
+
* found; empty means valid. An unreadable entry (dangling symlink,
|
|
9
|
+
* permissions) is reported as a problem instead of throwing.
|
|
10
|
+
*/
|
|
11
|
+
export declare function validateKit(root: string): Issue[];
|
|
12
|
+
/**
|
|
13
|
+
* Compare the provider copies (`.cursor/agents`, `.cursor/commands`) against
|
|
14
|
+
* the shared `source` (usually the project's `.agents/`). Copies are real
|
|
15
|
+
* files because that provider does not follow a symlinked folder here; when
|
|
16
|
+
* the source changes they go stale, and init never overwrites them. Reports
|
|
17
|
+
* each missing or drifted copy. Links and missing folders cannot drift and
|
|
18
|
+
* are skipped silently, as are extra files on the provider side (the user's
|
|
19
|
+
* own). Paths are relative to `projectRoot`.
|
|
20
|
+
*/
|
|
21
|
+
export declare function checkDrift(projectRoot: string, source: string): Issue[];
|
|
22
|
+
//# sourceMappingURL=validate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../src/validate.ts"],"names":[],"mappings":"AAOA,MAAM,MAAM,KAAK,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAoMtD;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,KAAK,EAAE,CAMjD;AAOD;;;;;;;;GAQG;AACH,wBAAgB,UAAU,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,KAAK,EAAE,CAoBvE"}
|
package/dist/validate.js
ADDED
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
// Original work by the same author.
|
|
2
|
+
import { existsSync, lstatSync, readdirSync, readFileSync, statSync } from "node:fs";
|
|
3
|
+
import { join, relative } from "node:path";
|
|
4
|
+
import { tryCatch } from "@zedtech/zedkit-core";
|
|
5
|
+
import { readManifest } from "./kit.js";
|
|
6
|
+
import { parseFrontmatter } from "./frontmatter.js";
|
|
7
|
+
const NAME = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;
|
|
8
|
+
const MAX_NAME = 64;
|
|
9
|
+
const MAX_DESCRIPTION = 1024;
|
|
10
|
+
function read(path) {
|
|
11
|
+
return readFileSync(path, "utf8");
|
|
12
|
+
}
|
|
13
|
+
function dirsIn(path) {
|
|
14
|
+
if (!existsSync(path))
|
|
15
|
+
return [];
|
|
16
|
+
return readdirSync(path).filter((entry) => statSync(join(path, entry)).isDirectory());
|
|
17
|
+
}
|
|
18
|
+
function checkName(name, expected, path, issues) {
|
|
19
|
+
if (name !== expected) {
|
|
20
|
+
issues.push({ path, message: `name must equal "${expected}" (got ${JSON.stringify(name)})` });
|
|
21
|
+
}
|
|
22
|
+
if (!NAME.test(expected) || expected.length > MAX_NAME) {
|
|
23
|
+
issues.push({ path, message: `name must be lowercase-hyphen, at most ${MAX_NAME} characters` });
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
// True when `description:` is a plain or quoted scalar that fits on one line.
|
|
27
|
+
// A block scalar (`>`, `|`) can be shown literally in an agent list, and a
|
|
28
|
+
// continuation line is just as invisible to simple parsers.
|
|
29
|
+
function isSingleLineDescription(raw) {
|
|
30
|
+
const lines = raw.split("\n");
|
|
31
|
+
const at = lines.findIndex((line) => /^description:/.test(line));
|
|
32
|
+
if (at < 0)
|
|
33
|
+
return true;
|
|
34
|
+
const value = (lines[at] ?? "").slice("description:".length).trim();
|
|
35
|
+
const next = lines[at + 1];
|
|
36
|
+
return value !== "" && !/^[>|]/.test(value) && !(next !== undefined && /^[ \t]+\S/.test(next));
|
|
37
|
+
}
|
|
38
|
+
function checkDescription(value, path, issues) {
|
|
39
|
+
if (typeof value !== "string" || value.trim() === "") {
|
|
40
|
+
issues.push({ path, message: "description is required and must be a non-empty string" });
|
|
41
|
+
}
|
|
42
|
+
else if (value.length > MAX_DESCRIPTION) {
|
|
43
|
+
issues.push({ path, message: `description is ${value.length} characters (max ${MAX_DESCRIPTION})` });
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
function checkSkill(root, name, issues) {
|
|
47
|
+
const file = join(root, "skills", name, "SKILL.md");
|
|
48
|
+
const path = relative(root, file);
|
|
49
|
+
if (!existsSync(file)) {
|
|
50
|
+
issues.push({ path: relative(root, join(root, "skills", name)), message: "skill folder has no SKILL.md" });
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
const parsed = parseFrontmatter(read(file));
|
|
54
|
+
if (!parsed.ok) {
|
|
55
|
+
issues.push({ path, message: parsed.error.message });
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
checkName(parsed.value.data.name, name, path, issues);
|
|
59
|
+
checkDescription(parsed.value.data.description, path, issues);
|
|
60
|
+
}
|
|
61
|
+
function checkAgent(root, file, issues) {
|
|
62
|
+
const path = join("agents", file);
|
|
63
|
+
const parsed = parseFrontmatter(read(join(root, path)));
|
|
64
|
+
if (!parsed.ok) {
|
|
65
|
+
issues.push({ path, message: parsed.error.message });
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
const { data, raw } = parsed.value;
|
|
69
|
+
checkName(data.name, file.replace(/\.md$/, ""), path, issues);
|
|
70
|
+
checkDescription(data.description, path, issues);
|
|
71
|
+
if (!isSingleLineDescription(raw)) {
|
|
72
|
+
issues.push({ path, message: "description must be a single line (no `>` or `|` block, no continuation lines)" });
|
|
73
|
+
}
|
|
74
|
+
// An id the tool does not know falls back silently, and the kit is
|
|
75
|
+
// tool-agnostic: only `inherit` is portable.
|
|
76
|
+
if (data.model !== undefined && data.model !== "inherit") {
|
|
77
|
+
issues.push({ path, message: 'model must be omitted or "inherit" (pin a model in your project, after listing what your tool accepts)' });
|
|
78
|
+
}
|
|
79
|
+
// `readonly` is a single-tool field, and at least one tool drops the
|
|
80
|
+
// whole definition when it sees an unknown key. Read-only stays in the
|
|
81
|
+
// prompt body plus `disallowedTools`, which every tool tolerates.
|
|
82
|
+
if (data.readonly !== undefined) {
|
|
83
|
+
issues.push({ path, message: "readonly is not portable: some tools skip agent files that set it (use disallowedTools instead)" });
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
function checkCommand(root, file, skills, issues) {
|
|
87
|
+
const path = join("commands", file);
|
|
88
|
+
const base = file.replace(/\.md$/, "");
|
|
89
|
+
if (!NAME.test(base) || base.length > MAX_NAME) {
|
|
90
|
+
issues.push({ path, message: `name must be lowercase-hyphen, at most ${MAX_NAME} characters` });
|
|
91
|
+
}
|
|
92
|
+
const text = read(join(root, path));
|
|
93
|
+
const parsed = parseFrontmatter(text);
|
|
94
|
+
if (!parsed.ok) {
|
|
95
|
+
issues.push({ path, message: parsed.error.message });
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
checkDescription(parsed.value.data.description, path, issues);
|
|
99
|
+
if (!isSingleLineDescription(parsed.value.raw)) {
|
|
100
|
+
issues.push({ path, message: "description must be a single line (no `>` or `|` block, no continuation lines)" });
|
|
101
|
+
}
|
|
102
|
+
// A command runs a skill by name: it must name at least one installed one.
|
|
103
|
+
const names = [...skills].filter((name) => text.includes(`\`${name}\``));
|
|
104
|
+
if (names.length === 0) {
|
|
105
|
+
issues.push({ path, message: "names no installed skill (a command runs a `skill` by name)" });
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
function checkLineEndings(root, issues) {
|
|
109
|
+
const entries = readdirSync(root, { recursive: true, encoding: "utf8" });
|
|
110
|
+
for (const entry of entries) {
|
|
111
|
+
const full = join(root, entry);
|
|
112
|
+
if (entry.endsWith(".md") && statSync(full).isFile() && read(full).includes("\r")) {
|
|
113
|
+
issues.push({ path: entry, message: "CR found: use LF line endings" });
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
const LADDER_SKILLS = ["plan", "implement", "review", "ponytail-review"];
|
|
118
|
+
// The ponytail ladder must survive in the skills that ask it and in the
|
|
119
|
+
// template every setup inherits. Only checked where the file exists, so
|
|
120
|
+
// minimal or foreign layouts are unaffected.
|
|
121
|
+
function checkLadder(root, issues) {
|
|
122
|
+
for (const name of LADDER_SKILLS) {
|
|
123
|
+
const file = join(root, "skills", name, "SKILL.md");
|
|
124
|
+
if (existsSync(file) && !read(file).toLowerCase().includes("ladder")) {
|
|
125
|
+
issues.push({
|
|
126
|
+
path: relative(root, file),
|
|
127
|
+
message: "must state the ponytail ladder (regression: the 7 questions vanished)",
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
const template = join(root, "AGENTS.template.md");
|
|
132
|
+
if (existsSync(template) && !read(template).toLowerCase().includes("ladder")) {
|
|
133
|
+
issues.push({
|
|
134
|
+
path: "AGENTS.template.md",
|
|
135
|
+
message: "must state the ponytail ladder (every setup inherits this file)",
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
function checkManifest(root, issues) {
|
|
140
|
+
if (!existsSync(join(root, "kit.json")))
|
|
141
|
+
return;
|
|
142
|
+
const manifest = readManifest(root);
|
|
143
|
+
if (!manifest.ok) {
|
|
144
|
+
issues.push({ path: "kit.json", message: manifest.error.message });
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
const skills = new Set(dirsIn(join(root, "skills")));
|
|
148
|
+
const agents = new Set(existsSync(join(root, "agents"))
|
|
149
|
+
? readdirSync(join(root, "agents")).map((f) => f.replace(/\.md$/, ""))
|
|
150
|
+
: []);
|
|
151
|
+
for (const [preset, names] of Object.entries(manifest.value.presets)) {
|
|
152
|
+
for (const name of names === "*" ? [] : names) {
|
|
153
|
+
if (!skills.has(name))
|
|
154
|
+
issues.push({ path: "kit.json", message: `preset "${preset}" lists missing skill "${name}"` });
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
for (const name of manifest.value.agents) {
|
|
158
|
+
if (!agents.has(name))
|
|
159
|
+
issues.push({ path: "kit.json", message: `lists missing agent "${name}"` });
|
|
160
|
+
}
|
|
161
|
+
const commands = new Set(existsSync(join(root, "commands"))
|
|
162
|
+
? readdirSync(join(root, "commands")).map((f) => f.replace(/\.md$/, ""))
|
|
163
|
+
: []);
|
|
164
|
+
for (const name of manifest.value.commands ?? []) {
|
|
165
|
+
if (!commands.has(name))
|
|
166
|
+
issues.push({ path: "kit.json", message: `lists missing command "${name}"` });
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
function collect(root) {
|
|
170
|
+
const issues = [];
|
|
171
|
+
const skills = new Set(dirsIn(join(root, "skills")));
|
|
172
|
+
for (const name of skills)
|
|
173
|
+
checkSkill(root, name, issues);
|
|
174
|
+
const agentsDir = join(root, "agents");
|
|
175
|
+
if (existsSync(agentsDir)) {
|
|
176
|
+
for (const file of readdirSync(agentsDir).filter((f) => f.endsWith(".md"))) {
|
|
177
|
+
checkAgent(root, file, issues);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
const commandsDir = join(root, "commands");
|
|
181
|
+
if (existsSync(commandsDir)) {
|
|
182
|
+
for (const file of readdirSync(commandsDir).filter((f) => f.endsWith(".md"))) {
|
|
183
|
+
checkCommand(root, file, skills, issues);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
checkManifest(root, issues);
|
|
187
|
+
checkLadder(root, issues);
|
|
188
|
+
checkLineEndings(root, issues);
|
|
189
|
+
return issues;
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Check a directory laid out as `skills/<name>/SKILL.md`, `agents/<name>.md`,
|
|
193
|
+
* `commands/<name>.md` and optionally `kit.json`. Returns every problem
|
|
194
|
+
* found; empty means valid. An unreadable entry (dangling symlink,
|
|
195
|
+
* permissions) is reported as a problem instead of throwing.
|
|
196
|
+
*/
|
|
197
|
+
export function validateKit(root) {
|
|
198
|
+
if (!existsSync(root)) {
|
|
199
|
+
return [{ path: root, message: "directory does not exist" }];
|
|
200
|
+
}
|
|
201
|
+
const result = tryCatch(() => collect(root));
|
|
202
|
+
return result.ok ? result.value : [{ path: root, message: `cannot read: ${result.error.message}` }];
|
|
203
|
+
}
|
|
204
|
+
function isRealDir(path) {
|
|
205
|
+
const stat = tryCatch(() => lstatSync(path));
|
|
206
|
+
return stat.ok && stat.value.isDirectory();
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Compare the provider copies (`.cursor/agents`, `.cursor/commands`) against
|
|
210
|
+
* the shared `source` (usually the project's `.agents/`). Copies are real
|
|
211
|
+
* files because that provider does not follow a symlinked folder here; when
|
|
212
|
+
* the source changes they go stale, and init never overwrites them. Reports
|
|
213
|
+
* each missing or drifted copy. Links and missing folders cannot drift and
|
|
214
|
+
* are skipped silently, as are extra files on the provider side (the user's
|
|
215
|
+
* own). Paths are relative to `projectRoot`.
|
|
216
|
+
*/
|
|
217
|
+
export function checkDrift(projectRoot, source) {
|
|
218
|
+
const run = tryCatch(() => {
|
|
219
|
+
const issues = [];
|
|
220
|
+
for (const kind of ["agents", "commands"]) {
|
|
221
|
+
const from = join(source, kind);
|
|
222
|
+
const to = join(projectRoot, ".cursor", kind);
|
|
223
|
+
if (!isRealDir(from) || !isRealDir(to))
|
|
224
|
+
continue;
|
|
225
|
+
for (const file of readdirSync(from).filter((f) => f.endsWith(".md"))) {
|
|
226
|
+
const target = join(to, file);
|
|
227
|
+
const want = relative(projectRoot, join(from, file));
|
|
228
|
+
if (!existsSync(target)) {
|
|
229
|
+
issues.push({ path: relative(projectRoot, target), message: `copy missing: copy it from ${want} or re-run init` });
|
|
230
|
+
}
|
|
231
|
+
else if (read(target) !== read(join(from, file))) {
|
|
232
|
+
issues.push({ path: relative(projectRoot, target), message: `drifted from ${want}: copy it over (init never overwrites)` });
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
return issues;
|
|
237
|
+
});
|
|
238
|
+
return run.ok ? run.value : [{ path: projectRoot, message: `cannot check drift: ${run.error.message}` }];
|
|
239
|
+
}
|
|
240
|
+
//# sourceMappingURL=validate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../src/validate.ts"],"names":[],"mappings":"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"}
|