craftar 0.35.0 → 0.37.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/README.md +25 -4
- package/dist/cli.js +31 -19
- package/dist/cli.js.map +1 -1
- package/dist/core/capabilities.js +2 -2
- package/dist/core/capabilities.js.map +1 -1
- package/dist/core/doctor.js +74 -1
- package/dist/core/doctor.js.map +1 -1
- package/dist/core/drift.js +10 -4
- package/dist/core/drift.js.map +1 -1
- package/dist/core/extract.js +2 -2
- package/dist/core/extract.js.map +1 -1
- package/dist/core/report.js +12 -0
- package/dist/core/report.js.map +1 -1
- package/dist/core/resolve.js +29 -0
- package/dist/core/resolve.js.map +1 -1
- package/dist/core/sync.js +154 -3
- package/dist/core/sync.js.map +1 -1
- package/dist/core/template-import.js +16 -3
- package/dist/core/template-import.js.map +1 -1
- package/dist/core/write-actions.js +21 -12
- package/dist/core/write-actions.js.map +1 -1
- package/dist/emitters/agents-md.js +26 -3
- package/dist/emitters/agents-md.js.map +1 -1
- package/dist/emitters/claude-code.js +175 -20
- package/dist/emitters/claude-code.js.map +1 -1
- package/dist/emitters/kiro.js +111 -26
- package/dist/emitters/kiro.js.map +1 -1
- package/dist/emitters/shared.js +135 -57
- package/dist/emitters/shared.js.map +1 -1
- package/dist/importers/claude-code.js +75 -7
- package/dist/importers/claude-code.js.map +1 -1
- package/dist/importers/decide.js +22 -4
- package/dist/importers/decide.js.map +1 -1
- package/dist/importers/drift-promote.js +9 -3
- package/dist/importers/drift-promote.js.map +1 -1
- package/dist/schema/index.js +11 -1
- package/dist/schema/index.js.map +1 -1
- package/dist/ui/page.js +115 -10
- package/dist/ui/page.js.map +1 -1
- package/dist/ui/routes.js +129 -8
- package/dist/ui/routes.js.map +1 -1
- package/dist/ui/server.js +121 -34
- package/dist/ui/server.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,6 +1,8 @@
|
|
|
1
|
-
import { buildRuleLookup, outName, resolveRuleRefs, ruleFile, ruleWriter, textFile } from "./shared.js";
|
|
1
|
+
import { buildRuleLookup, effectiveTargets, outName, resolveRuleRefs, ruleFile, ruleWriter, textFile } from "./shared.js";
|
|
2
2
|
/** The param that sets the AGENTS.md size budget, read by `plan()` (and reserved from extraction, like `kiro.banner`). */
|
|
3
3
|
export const AGENTS_MD_BUDGET_KEY = "agents-md.maxBytes";
|
|
4
|
+
/** The param that turns AGENTS.md into the one home of the always-on rules (spec 41 §4.1). */
|
|
5
|
+
export const AGENTS_MD_PRIMARY_KEY = "agents-md.primary";
|
|
4
6
|
/**
|
|
5
7
|
* AGENTS.md target (open standard read by Codex, Cursor, Warp, Copilot, Kiro, Kimi…).
|
|
6
8
|
* Concatenates the `always` rules into one file. Scoped rules (`fileMatch`, `manual`, `auto`)
|
|
@@ -30,7 +32,12 @@ export const agentsMd = {
|
|
|
30
32
|
if (!rules.length)
|
|
31
33
|
return [];
|
|
32
34
|
// Build the lookup once per AGENTS.md, not once per body (spec 15 §4.2)
|
|
33
|
-
const lookup = buildRuleLookup(ctx.resolution.ingredients);
|
|
35
|
+
const lookup = buildRuleLookup(ctx.resolution.ingredients, ctx.resolution);
|
|
36
|
+
// For mode-off comparison (spec 41 §4.4)
|
|
37
|
+
const primary = ctx.resolution.primary;
|
|
38
|
+
const lookupOff = primary ? buildRuleLookup(ctx.resolution.ingredients, { primary: false }) : null;
|
|
39
|
+
// Track whether any text differs due to mode
|
|
40
|
+
let anyDiffersDueToMode = false;
|
|
34
41
|
const parts = [
|
|
35
42
|
"<!-- GENERATED by craftar from the Forge. Edit the rule ingredients, not this file. -->",
|
|
36
43
|
"",
|
|
@@ -52,13 +59,19 @@ export const agentsMd = {
|
|
|
52
59
|
const { text: resolved, report } = resolveRuleRefs(rawBody, ing.ref, lookup, ctx.resolution.targets);
|
|
53
60
|
alwaysReports.push(report);
|
|
54
61
|
const body = resolved.replace(/\n+$/, "");
|
|
62
|
+
// Check for reworded (spec 41 §4.4)
|
|
63
|
+
if (primary && lookupOff) {
|
|
64
|
+
const modeOffResolved = resolveRuleRefs(rawBody, ing.ref, lookupOff, ctx.resolution.targets).text;
|
|
65
|
+
if (modeOffResolved !== resolved)
|
|
66
|
+
anyDiffersDueToMode = true;
|
|
67
|
+
}
|
|
55
68
|
// Report the byte size of this always-on rule's body as it appears in AGENTS.md
|
|
56
69
|
ctx.reportAgentsMdRule(outName(ing.meta), Buffer.byteLength(body, "utf8"), false);
|
|
57
70
|
parts.push(`<!-- rule: ${outName(ing.meta)} -->`, body, "");
|
|
58
71
|
}
|
|
59
72
|
else {
|
|
60
73
|
// Spec 14 §4.1: decide which target writes this rule file
|
|
61
|
-
const writer = ruleWriter(ctx.resolution.targets, ing.meta.
|
|
74
|
+
const writer = ruleWriter(ctx.resolution.targets, effectiveTargets(ing.meta, ctx.resolution));
|
|
62
75
|
const scopeText = ing.meta.inclusion === "fileMatch"
|
|
63
76
|
? `applies to \`${[ing.meta.fileMatchPattern].flat().join("`, `")}\``
|
|
64
77
|
: ing.meta.inclusion;
|
|
@@ -74,6 +87,12 @@ export const agentsMd = {
|
|
|
74
87
|
const { text: resolved, report } = resolveRuleRefs(rawBody, ing.ref, lookup, ctx.resolution.targets);
|
|
75
88
|
embeddedReports.push(report);
|
|
76
89
|
const body = resolved.replace(/\n+$/, "");
|
|
90
|
+
// Check for reworded (spec 41 §4.4)
|
|
91
|
+
if (primary && lookupOff) {
|
|
92
|
+
const modeOffResolved = resolveRuleRefs(rawBody, ing.ref, lookupOff, ctx.resolution.targets).text;
|
|
93
|
+
if (modeOffResolved !== resolved)
|
|
94
|
+
anyDiffersDueToMode = true;
|
|
95
|
+
}
|
|
77
96
|
// Report the byte size of this embedded scoped rule
|
|
78
97
|
ctx.reportAgentsMdRule(outName(ing.meta), Buffer.byteLength(body, "utf8"), true);
|
|
79
98
|
embedded.push(`<!-- rule: ${outName(ing.meta)} -->`, `> Scoped rule — ${scopeText}`, "", body, "");
|
|
@@ -89,6 +108,10 @@ export const agentsMd = {
|
|
|
89
108
|
// Emit the warning per spec 15 §4.5: at most one ctx.warn for AGENTS.md
|
|
90
109
|
// Reports in AGENTS.md order: always-on first, then embedded
|
|
91
110
|
emitRefWarning(ctx.warn, [...alwaysReports, ...embeddedReports]);
|
|
111
|
+
// Report reworded if any body differs due to mode (spec 41 §4.4)
|
|
112
|
+
if (anyDiffersDueToMode) {
|
|
113
|
+
ctx.reportReworded("AGENTS.md");
|
|
114
|
+
}
|
|
92
115
|
return [await textFile(ctx, "AGENTS.md", parts.join("\n"), "agents-md", "rule/*")];
|
|
93
116
|
},
|
|
94
117
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agents-md.js","sourceRoot":"","sources":["../../src/emitters/agents-md.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAkB,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"agents-md.js","sourceRoot":"","sources":["../../src/emitters/agents-md.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,14 @@
|
|
|
1
|
+
import path from "node:path";
|
|
1
2
|
import { serializeFrontmatter } from "../core/frontmatter.js";
|
|
2
3
|
import { listFiles } from "../core/forge.js";
|
|
3
|
-
import {
|
|
4
|
+
import { decodeForScan } from "../core/secrets.js";
|
|
5
|
+
import { authEnvNames, buildRuleLookup, EXAMPLE_SETTINGS, formatDeadRefs, formatScannedRefs, mcpServers, outName, resolveRuleRefs, ruleFile, textFile, unresolvedRuleRefs, UNKNOWN_NAME_KIND, } from "./shared.js";
|
|
4
6
|
/**
|
|
5
7
|
* Claude Code target: `.claude/{rules,agents,commands,skills,scripts,hooks}` + `.mcp.json`.
|
|
6
8
|
* Files are emitted verbatim from the Forge so that `import` → `sync` on the source workspace is a no-op.
|
|
9
|
+
*
|
|
10
|
+
* Under agents-md.primary (spec 41 §4.4), references to rules in bodies are resolved through
|
|
11
|
+
* resolveRuleRefs, and copied files are scanned and warned about but not rewritten.
|
|
7
12
|
*/
|
|
8
13
|
export const claudeCode = {
|
|
9
14
|
target: "claude-code",
|
|
@@ -11,50 +16,128 @@ export const claudeCode = {
|
|
|
11
16
|
const out = [];
|
|
12
17
|
const t = "claude-code";
|
|
13
18
|
const mcp = [];
|
|
19
|
+
const primary = ctx.resolution.primary;
|
|
20
|
+
// Under the mode, build the lookup once
|
|
21
|
+
const lookup = primary ? buildRuleLookup(ctx.resolution.ingredients, ctx.resolution) : null;
|
|
22
|
+
const targets = ctx.resolution.targets;
|
|
23
|
+
// Collect reports for the warning (spec 41 §4.4)
|
|
24
|
+
const reports = [];
|
|
25
|
+
const scannedHits = [];
|
|
26
|
+
// Resolve function under primary mode, returns original text when mode is off
|
|
27
|
+
const resolve = (text, citing) => {
|
|
28
|
+
if (!primary || !lookup)
|
|
29
|
+
return text;
|
|
30
|
+
const { text: resolved, report } = resolveRuleRefs(text, citing, lookup, targets, "agents-md");
|
|
31
|
+
reports.push(report);
|
|
32
|
+
return resolved;
|
|
33
|
+
};
|
|
34
|
+
// Track whether a file was reworded
|
|
35
|
+
// Each [original, resolved] pair is one text of the file, compared on its own (spec 41 §4.4)
|
|
36
|
+
const checkReworded = (path, ...pairs) => {
|
|
37
|
+
if (primary && pairs.some(([original, resolved]) => original !== resolved))
|
|
38
|
+
ctx.reportReworded(path);
|
|
39
|
+
};
|
|
40
|
+
// Scan a file for unresolved references (spec 41 §4.4): files copied as bytes or other TEXT_EXT
|
|
41
|
+
const scanFile = (path, content) => {
|
|
42
|
+
if (!primary || !lookup)
|
|
43
|
+
return;
|
|
44
|
+
const text = decodeForScan(content);
|
|
45
|
+
if (text === null)
|
|
46
|
+
return; // Binary file
|
|
47
|
+
const hits = unresolvedRuleRefs(text, lookup, targets, "agents-md");
|
|
48
|
+
for (const h of hits) {
|
|
49
|
+
scannedHits.push({ path, line: h.line, name: h.name });
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
// An agent's or a command's metadata, then its body (spec 41 §4.4, kiro's order): its frontmatterRaw when it has
|
|
53
|
+
// one, else its description. With the mode off `resolve` returns each text as given.
|
|
54
|
+
const resolveDoc = (path, citing, m, rawBody) => {
|
|
55
|
+
const raw = m.frontmatterRaw != null ? resolve(m.frontmatterRaw, citing) : null;
|
|
56
|
+
const description = m.frontmatterRaw == null && m.description !== undefined ? resolve(m.description, citing) : m.description;
|
|
57
|
+
const body = resolve(rawBody, citing);
|
|
58
|
+
checkReworded(path, [m.frontmatterRaw ?? m.description, raw ?? description], [rawBody, body]);
|
|
59
|
+
return { raw, description, body };
|
|
60
|
+
};
|
|
14
61
|
// What this target writes comes from its walk; the matrix decides the rest and warns (spec 18).
|
|
15
62
|
for (const ing of ctx.aimed) {
|
|
16
63
|
const m = ing.meta;
|
|
17
64
|
switch (m.type) {
|
|
18
65
|
case "rule": {
|
|
19
|
-
const
|
|
66
|
+
const rawBody = await ctx.text(ing, m.file);
|
|
67
|
+
const body = resolve(rawBody, ing.ref);
|
|
68
|
+
const path = ruleFile("claude-code", m);
|
|
20
69
|
// If frontmatterRaw is set, serialize with it; otherwise emit body only (no generated paths:)
|
|
70
|
+
// frontmatterRaw is NOT resolved (spec 41 §4.4)
|
|
21
71
|
const doc = m.frontmatterRaw != null ? serializeFrontmatter({}, body, { raw: m.frontmatterRaw }) : body;
|
|
22
|
-
|
|
72
|
+
checkReworded(path, [rawBody, body]);
|
|
73
|
+
out.push(await textFile(ctx, path, doc, t, ing.ref));
|
|
23
74
|
break;
|
|
24
75
|
}
|
|
25
76
|
case "agent": {
|
|
26
|
-
const
|
|
27
|
-
const
|
|
28
|
-
const doc = serializeFrontmatter({ name: outName(m), description
|
|
29
|
-
out.push(await textFile(ctx,
|
|
77
|
+
const path = `.claude/agents/${outName(m)}.md`;
|
|
78
|
+
const { raw, description, body } = resolveDoc(path, ing.ref, m, await ctx.text(ing, m.file));
|
|
79
|
+
const doc = serializeFrontmatter({ name: outName(m), description, tools: m.tools, model: m.model }, body, { raw });
|
|
80
|
+
out.push(await textFile(ctx, path, doc, t, ing.ref));
|
|
30
81
|
break;
|
|
31
82
|
}
|
|
32
83
|
case "command": {
|
|
33
|
-
const
|
|
34
|
-
const
|
|
35
|
-
|
|
84
|
+
const path = `.claude/commands/${outName(m)}.md`;
|
|
85
|
+
const { raw, description, body } = resolveDoc(path, ing.ref, m, await ctx.text(ing, m.file));
|
|
86
|
+
const doc = serializeFrontmatter({ description, "argument-hint": m.argumentHint, "allowed-tools": m.allowedTools }, body, { raw });
|
|
87
|
+
out.push(await textFile(ctx, path, doc, t, ing.ref));
|
|
36
88
|
break;
|
|
37
89
|
}
|
|
38
90
|
case "skill": {
|
|
39
91
|
if (m.layout === "file") {
|
|
40
|
-
|
|
92
|
+
const path = `.claude/skills/${outName(m)}.md`;
|
|
93
|
+
const rawText = await ctx.text(ing, "SKILL.md");
|
|
94
|
+
const text = resolve(rawText, ing.ref);
|
|
95
|
+
checkReworded(path, [rawText, text]);
|
|
96
|
+
out.push(await textFile(ctx, path, text, t, ing.ref));
|
|
41
97
|
}
|
|
42
98
|
else {
|
|
99
|
+
// Directory skill: resolve .md files, scan others
|
|
43
100
|
for (const f of await listFiles(ing.dir)) {
|
|
44
101
|
if (f === "ingredient.yaml")
|
|
45
102
|
continue;
|
|
46
|
-
|
|
103
|
+
const path = `.claude/skills/${outName(m)}/${f}`;
|
|
104
|
+
if (claudeResolves(m, f)) {
|
|
105
|
+
const rawText = await ctx.text(ing, f);
|
|
106
|
+
const text = resolve(rawText, ing.ref);
|
|
107
|
+
checkReworded(path, [rawText, text]);
|
|
108
|
+
out.push(await textFile(ctx, path, text, t, ing.ref));
|
|
109
|
+
}
|
|
110
|
+
else if (TEXT_EXT.test(f)) {
|
|
111
|
+
// Other text files: not resolved, but scanned
|
|
112
|
+
const rawText = await ctx.text(ing, f);
|
|
113
|
+
if (primary && lookup) {
|
|
114
|
+
scanFile(path, Buffer.from(rawText, "utf8"));
|
|
115
|
+
}
|
|
116
|
+
out.push(await textFile(ctx, path, rawText, t, ing.ref));
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
// Binary files: copied as bytes, scanned
|
|
120
|
+
const content = await ctx.bytes(ing, f);
|
|
121
|
+
scanFile(path, content);
|
|
122
|
+
out.push({ path, content, target: t, ingredient: ing.ref });
|
|
123
|
+
}
|
|
47
124
|
}
|
|
48
125
|
}
|
|
49
126
|
break;
|
|
50
127
|
}
|
|
51
128
|
case "script":
|
|
52
|
-
for (const f of m.files)
|
|
53
|
-
|
|
129
|
+
for (const f of m.files) {
|
|
130
|
+
const path = `.claude/scripts/${f}`;
|
|
131
|
+
const file = await anyFileWithScan(ctx, ing, f, path, t, lookup, targets, primary, scanFile);
|
|
132
|
+
out.push(file);
|
|
133
|
+
}
|
|
54
134
|
break;
|
|
55
135
|
case "hook":
|
|
56
|
-
for (const f of m.files)
|
|
57
|
-
|
|
136
|
+
for (const f of m.files) {
|
|
137
|
+
const path = `.claude/hooks/${f}`;
|
|
138
|
+
const file = await anyFileWithScan(ctx, ing, f, path, t, lookup, targets, primary, scanFile);
|
|
139
|
+
out.push(file);
|
|
140
|
+
}
|
|
58
141
|
break;
|
|
59
142
|
case "mcp":
|
|
60
143
|
mcp.push(ing); // collected into .mcp.json below
|
|
@@ -65,6 +148,10 @@ export const claudeCode = {
|
|
|
65
148
|
}
|
|
66
149
|
}
|
|
67
150
|
}
|
|
151
|
+
// Emit the claude-code warning (spec 41 §4.4)
|
|
152
|
+
if (primary) {
|
|
153
|
+
emitClaudeCodeWarning(ctx, reports, scannedHits);
|
|
154
|
+
}
|
|
68
155
|
const servers = mcpServers(ctx, t, ".mcp.json", mcp);
|
|
69
156
|
if (Object.keys(servers).length) {
|
|
70
157
|
const json = JSON.stringify({ mcpServers: servers }, null, 2) + "\n";
|
|
@@ -83,11 +170,79 @@ export const claudeCode = {
|
|
|
83
170
|
return out;
|
|
84
171
|
},
|
|
85
172
|
};
|
|
173
|
+
/**
|
|
174
|
+
* Whether the claude-code emitter resolves rule references in this file of an ingredient under agents-md.primary
|
|
175
|
+
* (spec 41 §4.4): a rule's, an agent's or a command's body file, a file-layout skill's SKILL.md and every `.md` file of a
|
|
176
|
+
* directory skill. Every other file is copied as written and scanned. An agent's and a command's metadata are resolved
|
|
177
|
+
* too (`frontmatterRaw` when present, else `description`). The one answer, read by the emitter and by import (§4.10).
|
|
178
|
+
*/
|
|
179
|
+
export function claudeResolves(meta, file) {
|
|
180
|
+
// Compared as the emitters read them (`emittedFile`): `./rule.md` and `/rule.md` name the file listed as `rule.md`.
|
|
181
|
+
const eq = (a, b) => path.posix.join(".", a) === path.posix.join(".", b);
|
|
182
|
+
switch (meta.type) {
|
|
183
|
+
case "rule":
|
|
184
|
+
case "agent":
|
|
185
|
+
case "command":
|
|
186
|
+
return eq(file, meta.file);
|
|
187
|
+
case "skill":
|
|
188
|
+
return meta.layout === "file" ? eq(file, "SKILL.md") : /\.md$/i.test(file);
|
|
189
|
+
default:
|
|
190
|
+
return false;
|
|
191
|
+
}
|
|
192
|
+
}
|
|
86
193
|
/** Files claude-code emits as text, through `ctx.text` (substituted); anything else is copied as raw bytes. */
|
|
87
194
|
export const TEXT_EXT = /\.(md|txt|json|ya?ml|ps1|py|sh|js|ts|cjs|mjs|toml|xml|csv)$/i;
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
195
|
+
/** Emit a file for scripts/hooks: scan but do not rewrite (spec 41 §4.4). */
|
|
196
|
+
async function anyFileWithScan(ctx, ing, file, relPath, target, lookup, targets, primary, scanFile) {
|
|
197
|
+
if (TEXT_EXT.test(file)) {
|
|
198
|
+
const text = await ctx.text(ing, file);
|
|
199
|
+
if (primary && lookup) {
|
|
200
|
+
scanFile(relPath, Buffer.from(text, "utf8"));
|
|
201
|
+
}
|
|
202
|
+
return textFile(ctx, relPath, text, target, ing.ref);
|
|
203
|
+
}
|
|
204
|
+
const content = await ctx.bytes(ing, file);
|
|
205
|
+
scanFile(relPath, content);
|
|
206
|
+
return { path: relPath, content, target, ingredient: ing.ref };
|
|
207
|
+
}
|
|
208
|
+
/** Emit the claude-code warning for dead references and scanned files (spec 41 §4.4). */
|
|
209
|
+
function emitClaudeCodeWarning(ctx, reports, scannedHits) {
|
|
210
|
+
// Collect D entries: dead references (kind not empty, not UNKNOWN_NAME_KIND)
|
|
211
|
+
// Unknown names produce nothing in claude-code (claude-code is a target, so they are unchanged — state A-like)
|
|
212
|
+
const dead = [];
|
|
213
|
+
const seenDead = new Set();
|
|
214
|
+
for (const report of reports) {
|
|
215
|
+
for (const e of report.reworded) {
|
|
216
|
+
if (e.kind === UNKNOWN_NAME_KIND)
|
|
217
|
+
continue; // Unknown names are unchanged with claude-code
|
|
218
|
+
const key = `${e.ref}|${e.citing}`;
|
|
219
|
+
if (!seenDead.has(key)) {
|
|
220
|
+
seenDead.add(key);
|
|
221
|
+
dead.push(e);
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
// Dedupe scanned hits by path+line+name
|
|
226
|
+
const seenScanned = new Set();
|
|
227
|
+
const dedupedHits = [];
|
|
228
|
+
// Sort by path then line
|
|
229
|
+
const sortedHits = [...scannedHits].sort((a, b) => a.path.localeCompare(b.path) || a.line - b.line);
|
|
230
|
+
for (const h of sortedHits) {
|
|
231
|
+
const key = `${h.path}:${h.line}:${h.name}`;
|
|
232
|
+
if (!seenScanned.has(key)) {
|
|
233
|
+
seenScanned.add(key);
|
|
234
|
+
dedupedHits.push(h);
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
if (dead.length === 0 && dedupedHits.length === 0)
|
|
238
|
+
return;
|
|
239
|
+
const parts = [];
|
|
240
|
+
if (dead.length > 0) {
|
|
241
|
+
parts.push(formatDeadRefs(dead));
|
|
242
|
+
}
|
|
243
|
+
if (dedupedHits.length > 0) {
|
|
244
|
+
parts.push(formatScannedRefs(dedupedHits));
|
|
245
|
+
}
|
|
246
|
+
ctx.warn(`claude-code: ${parts.join("; ")}`);
|
|
92
247
|
}
|
|
93
248
|
//# sourceMappingURL=claude-code.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claude-code.js","sourceRoot":"","sources":["../../src/emitters/claude-code.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"claude-code.js","sourceRoot":"","sources":["../../src/emitters/claude-code.ts"],"names":[],"mappings":"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"}
|
package/dist/emitters/kiro.js
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { posix } from "node:path";
|
|
2
|
+
import { climbsOut, toCrlf } from "../core/text.js";
|
|
2
3
|
import { serializeFrontmatter } from "../core/frontmatter.js";
|
|
3
4
|
import { listFiles } from "../core/forge.js";
|
|
4
|
-
import {
|
|
5
|
+
import { decodeForScan } from "../core/secrets.js";
|
|
6
|
+
import { appliesTo, buildRuleLookup, effectiveTargets, formatDeadRefs, formatScannedRefs, mcpServers, outName, resolveRuleRefs, ruleFile, RULE_NAME_CHARS, UNKNOWN_NAME_KIND, unresolvedRuleRefs, } from "./shared.js";
|
|
5
7
|
/** Files kiro copies as text, through `ctx.text` (substituted); anything else is copied as raw bytes. */
|
|
6
8
|
export const KIRO_TEXT_EXT = /\.(md|txt|json|ya?ml)$/i;
|
|
7
9
|
/**
|
|
@@ -20,17 +22,47 @@ export const kiro = {
|
|
|
20
22
|
const out = [];
|
|
21
23
|
const t = "kiro";
|
|
22
24
|
const banner = String(ctx.resolution.params["kiro.banner"] ?? "<!-- GENERATED from {{source}} by craftar -- do not edit. -->");
|
|
23
|
-
const
|
|
24
|
-
|
|
25
|
+
const primary = ctx.resolution.primary;
|
|
26
|
+
// Under the mode, filter ruleNames and scopedRules to rules kiro WRITES (spec 41 §4.5)
|
|
27
|
+
// Mode off: unchanged (every rule)
|
|
28
|
+
const rulesKiroWrites = primary
|
|
29
|
+
? ctx.resolution.ingredients.filter((i) => i.meta.type === "rule" && appliesTo(effectiveTargets(i.meta, ctx.resolution), "kiro"))
|
|
30
|
+
: ctx.resolution.ingredients.filter((i) => i.meta.type === "rule");
|
|
31
|
+
const ruleNames = new Set(rulesKiroWrites.map((i) => outName(i.meta)));
|
|
32
|
+
const scopedRules = rulesKiroWrites.filter((i) => i.meta.type === "rule" && i.meta.inclusion === "fileMatch").map((i) => outName(i.meta));
|
|
25
33
|
const targets = ctx.resolution.targets;
|
|
26
|
-
const lookup = buildRuleLookup(ctx.resolution.ingredients);
|
|
34
|
+
const lookup = buildRuleLookup(ctx.resolution.ingredients, ctx.resolution);
|
|
35
|
+
// For mode-off comparison (spec 41 §4.4), build lookup without primary
|
|
36
|
+
const lookupOff = primary ? buildRuleLookup(ctx.resolution.ingredients, { primary: false }) : null;
|
|
27
37
|
// Collect reports for the warning (spec 17 §4.5)
|
|
28
38
|
const reports = [];
|
|
39
|
+
// Scanned file hits (spec 41 §4.4)
|
|
40
|
+
const scannedHits = [];
|
|
29
41
|
const resolve = (text, citing) => {
|
|
30
42
|
const { text: resolved, report } = resolveRuleRefs(text, citing, lookup, targets, "kiro");
|
|
31
43
|
reports.push(report);
|
|
32
44
|
return resolved;
|
|
33
45
|
};
|
|
46
|
+
// Track reworded: each text of the file, resolved with the mode and without it (spec 41 §4.4)
|
|
47
|
+
const checkReworded = (path, texts, citing) => {
|
|
48
|
+
if (!primary || !lookupOff)
|
|
49
|
+
return;
|
|
50
|
+
const differs = (text) => resolveRuleRefs(text, citing, lookupOff, targets, "kiro").text !== resolveRuleRefs(text, citing, lookup, targets, "kiro").text;
|
|
51
|
+
if (texts.some(differs))
|
|
52
|
+
ctx.reportReworded(path);
|
|
53
|
+
};
|
|
54
|
+
// Scan a file for unresolved references (spec 41 §4.4)
|
|
55
|
+
const scanFile = (path, content) => {
|
|
56
|
+
if (!primary)
|
|
57
|
+
return;
|
|
58
|
+
const text = decodeForScan(content);
|
|
59
|
+
if (text === null)
|
|
60
|
+
return; // Binary
|
|
61
|
+
const hits = unresolvedRuleRefs(text, lookup, targets, "kiro");
|
|
62
|
+
for (const h of hits) {
|
|
63
|
+
scannedHits.push({ path, line: h.line, name: h.name });
|
|
64
|
+
}
|
|
65
|
+
};
|
|
34
66
|
const mcp = [];
|
|
35
67
|
// What this target writes comes from its walk; the matrix decides the rest and warns (spec 18).
|
|
36
68
|
// `ctx.resolution.ingredients` above is for lookups only.
|
|
@@ -38,12 +70,15 @@ export const kiro = {
|
|
|
38
70
|
const m = ing.meta;
|
|
39
71
|
switch (m.type) {
|
|
40
72
|
case "rule": {
|
|
41
|
-
const
|
|
73
|
+
const rawBody = await ctx.text(ing, m.file);
|
|
74
|
+
const body = resolve(rawBody, ing.ref);
|
|
75
|
+
const path = ruleFile("kiro", m);
|
|
76
|
+
checkReworded(path, [rawBody], ing.ref);
|
|
42
77
|
const fm = m.inclusion === "fileMatch"
|
|
43
78
|
? `---\ninclusion: fileMatch\nfileMatchPattern: ${JSON.stringify(Array.isArray(m.fileMatchPattern) ? m.fileMatchPattern.join(",") : m.fileMatchPattern ?? "**")}\n---\n\n`
|
|
44
79
|
: `---\ninclusion: ${m.inclusion}\n---\n\n`;
|
|
45
80
|
const head = banner.replace("{{source}}", `.claude/rules/${outName(m)}.md`) + "\n\n";
|
|
46
|
-
out.push(crlf(
|
|
81
|
+
out.push(crlf(path, fm + head + body, ing.ref));
|
|
47
82
|
break;
|
|
48
83
|
}
|
|
49
84
|
case "steering":
|
|
@@ -51,38 +86,80 @@ export const kiro = {
|
|
|
51
86
|
out.push(crlf(`.kiro/steering/${outName(m)}.md`, await ctx.text(ing, m.file), ing.ref));
|
|
52
87
|
break;
|
|
53
88
|
case "agent": {
|
|
89
|
+
const path = `.kiro/agents/${outName(m)}.json`;
|
|
54
90
|
// Resolve description first, then body (spec 17 §4.5 order: description before prompt)
|
|
55
|
-
const
|
|
91
|
+
const rawDesc = m.description ?? "";
|
|
92
|
+
const description = resolve(rawDesc, ing.ref);
|
|
56
93
|
// Read the body once and derive both versions from it
|
|
57
94
|
const rawBody = await ctx.text(ing, m.file);
|
|
58
95
|
const body = resolve(rawBody, ing.ref);
|
|
96
|
+
checkReworded(path, [rawDesc, rawBody], ing.ref);
|
|
59
97
|
const tools = mapTools(m.tools, ctx);
|
|
60
98
|
// agentResources reads the blanket-rewritten text, not the resolved text (spec 17 §4.6)
|
|
61
|
-
const resources = m.resources ?? agentResources(outName(m), rewrite(
|
|
99
|
+
const resources = m.resources ?? agentResources(outName(m), rewrite(rawDesc) + "\n" + rewrite(rawBody), ruleNames, scopedRules);
|
|
100
|
+
// Under the mode, record hand-written resources for the check (spec 41 §4.5)
|
|
101
|
+
if (primary && m.resources) {
|
|
102
|
+
for (const entry of m.resources) {
|
|
103
|
+
if (!entry.startsWith("file://"))
|
|
104
|
+
continue;
|
|
105
|
+
const raw = entry.slice("file://".length);
|
|
106
|
+
// Skip globs
|
|
107
|
+
if (/[*?[{]/.test(raw))
|
|
108
|
+
continue;
|
|
109
|
+
// Compared as a path (`.kiro/steering/./x.md` is `.kiro/steering/x.md`); one that climbs out of the workspace
|
|
110
|
+
// names nothing the plan can write and is never looked up on disk.
|
|
111
|
+
if (climbsOut(raw))
|
|
112
|
+
continue;
|
|
113
|
+
const rel = posix.normalize(raw);
|
|
114
|
+
// Only check .kiro/steering/, .claude/rules/, or AGENTS.md
|
|
115
|
+
if (rel.startsWith(".kiro/steering/") || rel.startsWith(".claude/rules/") || rel === "AGENTS.md") {
|
|
116
|
+
ctx.reportKiroResource(outName(m), rel);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
62
120
|
const json = JSON.stringify({ name: outName(m), description, prompt: body.replace(/^\n+/, "").replace(/\n+$/, ""), tools, allowedTools: tools, resources }, null, 2) + "\n";
|
|
63
|
-
out.push(crlf(
|
|
121
|
+
out.push(crlf(path, json, ing.ref));
|
|
64
122
|
break;
|
|
65
123
|
}
|
|
66
124
|
case "command": {
|
|
125
|
+
const path = `.kiro/steering/commands/${outName(m)}.md`;
|
|
126
|
+
const rawBody = await ctx.text(ing, m.file);
|
|
67
127
|
// Resolve description and raw frontmatter first, then body (spec 17 §4.5 order: frontmatter before body)
|
|
68
128
|
// When frontmatterRaw is set, the description field is unused (serializeFrontmatter ignores it),
|
|
69
129
|
// so we skip resolving it to avoid spurious reports.
|
|
70
130
|
const resolvedDescription = !m.frontmatterRaw && m.description !== undefined ? resolve(m.description, ing.ref) : undefined;
|
|
71
131
|
const resolvedFm = m.frontmatterRaw ? resolve(m.frontmatterRaw, ing.ref) : null;
|
|
72
|
-
const body = resolve(
|
|
132
|
+
const body = resolve(rawBody, ing.ref);
|
|
133
|
+
checkReworded(path, [m.frontmatterRaw ? m.frontmatterRaw : (m.description ?? ""), rawBody], ing.ref);
|
|
73
134
|
const doc = serializeFrontmatter({ description: resolvedDescription, "argument-hint": m.argumentHint, "allowed-tools": m.allowedTools }, body, { raw: resolvedFm });
|
|
74
|
-
out.push(crlf(
|
|
135
|
+
out.push(crlf(path, `---\ninclusion: manual\n---\n\n` + doc, ing.ref));
|
|
75
136
|
break;
|
|
76
137
|
}
|
|
77
138
|
case "skill": {
|
|
78
139
|
if (m.layout === "file") {
|
|
79
|
-
|
|
140
|
+
const path = `.kiro/skills/${outName(m)}/SKILL.md`;
|
|
141
|
+
const rawText = await ctx.text(ing, "SKILL.md");
|
|
142
|
+
const text = resolve(rawText, ing.ref);
|
|
143
|
+
checkReworded(path, [rawText], ing.ref);
|
|
144
|
+
out.push(crlf(path, text, ing.ref));
|
|
80
145
|
}
|
|
81
146
|
else {
|
|
82
147
|
for (const f of await listFiles(ing.dir)) {
|
|
83
148
|
if (f === "ingredient.yaml")
|
|
84
149
|
continue;
|
|
85
|
-
|
|
150
|
+
const path = `.kiro/skills/${outName(m)}/${f}`;
|
|
151
|
+
if (KIRO_TEXT_EXT.test(f)) {
|
|
152
|
+
const rawText = await ctx.text(ing, f);
|
|
153
|
+
const text = resolve(rawText, ing.ref);
|
|
154
|
+
checkReworded(path, [rawText], ing.ref);
|
|
155
|
+
out.push(crlf(path, text, ing.ref));
|
|
156
|
+
}
|
|
157
|
+
else {
|
|
158
|
+
// Binary file: scan but don't rewrite (spec 41 §4.4)
|
|
159
|
+
const content = await ctx.bytes(ing, f);
|
|
160
|
+
scanFile(path, content);
|
|
161
|
+
out.push({ path, content, target: t, ingredient: ing.ref });
|
|
162
|
+
}
|
|
86
163
|
}
|
|
87
164
|
}
|
|
88
165
|
break;
|
|
@@ -97,8 +174,8 @@ export const kiro = {
|
|
|
97
174
|
}
|
|
98
175
|
}
|
|
99
176
|
}
|
|
100
|
-
// Emit one warning for all dead and unknown references (spec 17 §4.5)
|
|
101
|
-
emitKiroWarning(ctx, reports);
|
|
177
|
+
// Emit one warning for all dead and unknown references (spec 17 §4.5) and scanned files (spec 41 §4.4)
|
|
178
|
+
emitKiroWarning(ctx, reports, scannedHits);
|
|
102
179
|
const servers = mcpServers(ctx, t, ".kiro/settings/mcp.json", mcp);
|
|
103
180
|
if (Object.keys(servers).length) {
|
|
104
181
|
out.push(crlf(".kiro/settings/mcp.json", JSON.stringify({ mcpServers: servers }, null, 2) + "\n", "mcp/*"));
|
|
@@ -106,8 +183,8 @@ export const kiro = {
|
|
|
106
183
|
return out;
|
|
107
184
|
},
|
|
108
185
|
};
|
|
109
|
-
/** Emit the kiro warning for dead
|
|
110
|
-
function emitKiroWarning(ctx, reports) {
|
|
186
|
+
/** Emit the kiro warning for dead, unknown references, and scanned files (spec 17 §4.5, spec 41 §4.4). */
|
|
187
|
+
function emitKiroWarning(ctx, reports, scannedHits = []) {
|
|
111
188
|
// Collect entries: D (has kind with "reaches no target") and unknown (empty kind)
|
|
112
189
|
const dead = [];
|
|
113
190
|
const unknown = [];
|
|
@@ -132,12 +209,22 @@ function emitKiroWarning(ctx, reports) {
|
|
|
132
209
|
}
|
|
133
210
|
}
|
|
134
211
|
}
|
|
135
|
-
|
|
212
|
+
// Dedupe scanned hits by path+line+name, sort by path then line
|
|
213
|
+
const seenScanned = new Set();
|
|
214
|
+
const dedupedHits = [];
|
|
215
|
+
const sortedHits = [...scannedHits].sort((a, b) => a.path.localeCompare(b.path) || a.line - b.line);
|
|
216
|
+
for (const h of sortedHits) {
|
|
217
|
+
const key = `${h.path}:${h.line}:${h.name}`;
|
|
218
|
+
if (!seenScanned.has(key)) {
|
|
219
|
+
seenScanned.add(key);
|
|
220
|
+
dedupedHits.push(h);
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
if (dead.length === 0 && unknown.length === 0 && dedupedHits.length === 0)
|
|
136
224
|
return;
|
|
137
225
|
const parts = [];
|
|
138
226
|
if (dead.length > 0) {
|
|
139
|
-
|
|
140
|
-
parts.push(`${dead.length} reference(s) to rule files this workspace does not have — reworded: ${entries}`);
|
|
227
|
+
parts.push(formatDeadRefs(dead));
|
|
141
228
|
}
|
|
142
229
|
if (unknown.length > 0) {
|
|
143
230
|
const entries = unknown.map((e) => `${e.ref} (in ${e.citing})`).join(", ");
|
|
@@ -148,6 +235,9 @@ function emitKiroWarning(ctx, reports) {
|
|
|
148
235
|
parts.push(`${unknown.length} reference(s) to names that are no rule or steering of this workspace — rewritten to .kiro/steering/ as before: ${entries}`);
|
|
149
236
|
}
|
|
150
237
|
}
|
|
238
|
+
if (dedupedHits.length > 0) {
|
|
239
|
+
parts.push(formatScannedRefs(dedupedHits));
|
|
240
|
+
}
|
|
151
241
|
ctx.warn(`kiro: ${parts.join("; ")}`);
|
|
152
242
|
}
|
|
153
243
|
export function rewrite(text) {
|
|
@@ -156,11 +246,6 @@ export function rewrite(text) {
|
|
|
156
246
|
function crlf(path, text, ingredient) {
|
|
157
247
|
return { path, content: Buffer.from(toCrlf(text), "utf8"), target: "kiro", ingredient };
|
|
158
248
|
}
|
|
159
|
-
async function copy(ctx, ing, file, relPath, resolve) {
|
|
160
|
-
if (KIRO_TEXT_EXT.test(file))
|
|
161
|
-
return crlf(relPath, resolve(await ctx.text(ing, file), ing.ref), ing.ref);
|
|
162
|
-
return { path: relPath, content: await ctx.bytes(ing, file), target: "kiro", ingredient: ing.ref };
|
|
163
|
-
}
|
|
164
249
|
const TOOL_MAP = {
|
|
165
250
|
read: "read",
|
|
166
251
|
grep: "grep",
|