@crewbie/cli 0.1.0-alpha.49

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.
Files changed (165) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +253 -0
  3. package/dist/cli.d.ts +2 -0
  4. package/dist/cli.js +506 -0
  5. package/dist/cli.js.map +1 -0
  6. package/dist/config.d.ts +84 -0
  7. package/dist/config.js +178 -0
  8. package/dist/config.js.map +1 -0
  9. package/dist/core.d.ts +31 -0
  10. package/dist/core.js +186 -0
  11. package/dist/core.js.map +1 -0
  12. package/dist/execution/attribution.d.ts +10 -0
  13. package/dist/execution/attribution.js +102 -0
  14. package/dist/execution/attribution.js.map +1 -0
  15. package/dist/execution/cancel.d.ts +3 -0
  16. package/dist/execution/cancel.js +59 -0
  17. package/dist/execution/cancel.js.map +1 -0
  18. package/dist/execution/capabilities.d.ts +22 -0
  19. package/dist/execution/capabilities.js +101 -0
  20. package/dist/execution/capabilities.js.map +1 -0
  21. package/dist/execution/controls.d.ts +51 -0
  22. package/dist/execution/controls.js +257 -0
  23. package/dist/execution/controls.js.map +1 -0
  24. package/dist/execution/dispatch.d.ts +69 -0
  25. package/dist/execution/dispatch.js +831 -0
  26. package/dist/execution/dispatch.js.map +1 -0
  27. package/dist/execution/fix.d.ts +3 -0
  28. package/dist/execution/fix.js +267 -0
  29. package/dist/execution/fix.js.map +1 -0
  30. package/dist/execution/github.d.ts +15 -0
  31. package/dist/execution/github.js +43 -0
  32. package/dist/execution/github.js.map +1 -0
  33. package/dist/execution/merge.d.ts +15 -0
  34. package/dist/execution/merge.js +133 -0
  35. package/dist/execution/merge.js.map +1 -0
  36. package/dist/execution/planning-approval.d.ts +33 -0
  37. package/dist/execution/planning-approval.js +227 -0
  38. package/dist/execution/planning-approval.js.map +1 -0
  39. package/dist/execution/pr-review.d.ts +86 -0
  40. package/dist/execution/pr-review.js +339 -0
  41. package/dist/execution/pr-review.js.map +1 -0
  42. package/dist/execution/review-loop.d.ts +63 -0
  43. package/dist/execution/review-loop.js +463 -0
  44. package/dist/execution/review-loop.js.map +1 -0
  45. package/dist/execution/test-feature.d.ts +29 -0
  46. package/dist/execution/test-feature.js +240 -0
  47. package/dist/execution/test-feature.js.map +1 -0
  48. package/dist/execution/watch.d.ts +12 -0
  49. package/dist/execution/watch.js +34 -0
  50. package/dist/execution/watch.js.map +1 -0
  51. package/dist/memory/context.d.ts +14 -0
  52. package/dist/memory/context.js +82 -0
  53. package/dist/memory/context.js.map +1 -0
  54. package/dist/memory/improvement.d.ts +25 -0
  55. package/dist/memory/improvement.js +168 -0
  56. package/dist/memory/improvement.js.map +1 -0
  57. package/dist/memory/launch.d.ts +9 -0
  58. package/dist/memory/launch.js +65 -0
  59. package/dist/memory/launch.js.map +1 -0
  60. package/dist/memory/runner.d.ts +4 -0
  61. package/dist/memory/runner.js +74 -0
  62. package/dist/memory/runner.js.map +1 -0
  63. package/dist/memory/state.d.ts +10 -0
  64. package/dist/memory/state.js +42 -0
  65. package/dist/memory/state.js.map +1 -0
  66. package/dist/presentation.d.ts +19 -0
  67. package/dist/presentation.js +128 -0
  68. package/dist/presentation.js.map +1 -0
  69. package/dist/reporting/dashboard.d.ts +2 -0
  70. package/dist/reporting/dashboard.js +106 -0
  71. package/dist/reporting/dashboard.js.map +1 -0
  72. package/dist/reporting/pr-usage.d.ts +24 -0
  73. package/dist/reporting/pr-usage.js +179 -0
  74. package/dist/reporting/pr-usage.js.map +1 -0
  75. package/dist/reporting/records.d.ts +28 -0
  76. package/dist/reporting/records.js +152 -0
  77. package/dist/reporting/records.js.map +1 -0
  78. package/dist/setup/agents.d.ts +8 -0
  79. package/dist/setup/agents.js +83 -0
  80. package/dist/setup/agents.js.map +1 -0
  81. package/dist/setup/assessment.d.ts +31 -0
  82. package/dist/setup/assessment.js +75 -0
  83. package/dist/setup/assessment.js.map +1 -0
  84. package/dist/setup/auto-loaded.d.ts +17 -0
  85. package/dist/setup/auto-loaded.js +49 -0
  86. package/dist/setup/auto-loaded.js.map +1 -0
  87. package/dist/setup/copilot-version.d.ts +7 -0
  88. package/dist/setup/copilot-version.js +39 -0
  89. package/dist/setup/copilot-version.js.map +1 -0
  90. package/dist/setup/copilot.d.ts +22 -0
  91. package/dist/setup/copilot.js +164 -0
  92. package/dist/setup/copilot.js.map +1 -0
  93. package/dist/setup/init.d.ts +41 -0
  94. package/dist/setup/init.js +315 -0
  95. package/dist/setup/init.js.map +1 -0
  96. package/dist/setup/install.d.ts +12 -0
  97. package/dist/setup/install.js +211 -0
  98. package/dist/setup/install.js.map +1 -0
  99. package/dist/setup/instruction-quality.d.ts +25 -0
  100. package/dist/setup/instruction-quality.js +258 -0
  101. package/dist/setup/instruction-quality.js.map +1 -0
  102. package/dist/setup/inventory.d.ts +26 -0
  103. package/dist/setup/inventory.js +78 -0
  104. package/dist/setup/inventory.js.map +1 -0
  105. package/dist/setup/onboarding.d.ts +40 -0
  106. package/dist/setup/onboarding.js +472 -0
  107. package/dist/setup/onboarding.js.map +1 -0
  108. package/dist/setup/package.d.ts +2 -0
  109. package/dist/setup/package.js +8 -0
  110. package/dist/setup/package.js.map +1 -0
  111. package/dist/setup/planning-workflow.d.ts +3 -0
  112. package/dist/setup/planning-workflow.js +250 -0
  113. package/dist/setup/planning-workflow.js.map +1 -0
  114. package/dist/setup/repository-map.d.ts +34 -0
  115. package/dist/setup/repository-map.js +89 -0
  116. package/dist/setup/repository-map.js.map +1 -0
  117. package/dist/setup/review.d.ts +8 -0
  118. package/dist/setup/review.js +137 -0
  119. package/dist/setup/review.js.map +1 -0
  120. package/dist/setup/team.d.ts +18 -0
  121. package/dist/setup/team.js +172 -0
  122. package/dist/setup/team.js.map +1 -0
  123. package/dist/setup/templates.d.ts +11 -0
  124. package/dist/setup/templates.js +494 -0
  125. package/dist/setup/templates.js.map +1 -0
  126. package/dist/setup/terminal.d.ts +12 -0
  127. package/dist/setup/terminal.js +11 -0
  128. package/dist/setup/terminal.js.map +1 -0
  129. package/dist/setup/update.d.ts +6 -0
  130. package/dist/setup/update.js +71 -0
  131. package/dist/setup/update.js.map +1 -0
  132. package/dist/specification/batch.d.ts +50 -0
  133. package/dist/specification/batch.js +127 -0
  134. package/dist/specification/batch.js.map +1 -0
  135. package/dist/specification/plan-checks.d.ts +6 -0
  136. package/dist/specification/plan-checks.js +73 -0
  137. package/dist/specification/plan-checks.js.map +1 -0
  138. package/dist/specification/planning.d.ts +26 -0
  139. package/dist/specification/planning.js +507 -0
  140. package/dist/specification/planning.js.map +1 -0
  141. package/dist/specification/prose.d.ts +1 -0
  142. package/dist/specification/prose.js +15 -0
  143. package/dist/specification/prose.js.map +1 -0
  144. package/dist/tracking/ado.d.ts +19 -0
  145. package/dist/tracking/ado.js +128 -0
  146. package/dist/tracking/ado.js.map +1 -0
  147. package/dist/tracking/github.d.ts +8 -0
  148. package/dist/tracking/github.js +112 -0
  149. package/dist/tracking/github.js.map +1 -0
  150. package/dist/tracking/issues.d.ts +28 -0
  151. package/dist/tracking/issues.js +180 -0
  152. package/dist/tracking/issues.js.map +1 -0
  153. package/dist/tracking/native.d.ts +5 -0
  154. package/dist/tracking/native.js +30 -0
  155. package/dist/tracking/native.js.map +1 -0
  156. package/dist/tracking/refs.d.ts +14 -0
  157. package/dist/tracking/refs.js +56 -0
  158. package/dist/tracking/refs.js.map +1 -0
  159. package/dist/tracking/sources.d.ts +5 -0
  160. package/dist/tracking/sources.js +29 -0
  161. package/dist/tracking/sources.js.map +1 -0
  162. package/docs/operations.md +1114 -0
  163. package/examples/batch.json +27 -0
  164. package/examples/runs.json +22 -0
  165. package/package.json +50 -0
@@ -0,0 +1,258 @@
1
+ import { stat } from "node:fs/promises";
2
+ import { posix } from "node:path";
3
+ import YAML from "yaml";
4
+ import { errorCode, optionalText, safePath } from "../core.js";
5
+ import { autoLoadedGuidance, autoLoadedPointer } from "./auto-loaded.js";
6
+ export const INSTRUCTION_STUDY = "https://www.sri.inf.ethz.ch/publications/gloaguen2026agentsmd";
7
+ export function instructionFile(path) {
8
+ return path === ".crewbie/instructions.md" || /(^|\/)(AGENTS\.md|CLAUDE\.md|GEMINI\.md|copilot-instructions\.md)$|\.instructions\.md$|(^|\/)\.github\/agents\/[^/]+\.agent\.md$|(^|\/)\.claude\/agents\/[^/]+\.md$/.test(path);
9
+ }
10
+ // AI guidance that setup may rewrite; Crewbie-managed agents and all non-AI files are excluded.
11
+ export function editableGuidance(path) {
12
+ return /^(?:(?:[a-zA-Z0-9._-]+\/)*(?:AGENTS|CLAUDE|GEMINI)\.md|\.github\/copilot-instructions\.md|\.github\/instructions\/[a-z0-9._/-]+\.instructions\.md|\.github\/agents\/(?!crewbie-)[a-z0-9._-]+\.agent\.md|\.claude\/agents\/[a-z0-9._-]+\.md)$/.test(path);
13
+ }
14
+ export function validateInstructionScope(path, content) {
15
+ if (!path.startsWith(".github/instructions/") || !path.endsWith(".instructions.md"))
16
+ return;
17
+ const header = /^---\r?\n([\s\S]*?)\r?\n---(?:\r?\n|$)/.exec(content);
18
+ if (!header)
19
+ throw new Error(`${path} needs YAML frontmatter with an explicit applyTo scope.`);
20
+ const data = YAML.parse(header[1]);
21
+ if (typeof data !== "object" || data === null || !("applyTo" in data) || typeof data.applyTo !== "string"
22
+ || !data.applyTo.trim() || data.applyTo.split(",").some((glob) => !glob.trim() || /(?:^|\/)\.\.(?:\/|$)|\\|^[\/~]|:/.test(glob.trim()))) {
23
+ throw new Error(`${path} needs repository-relative applyTo globs.`);
24
+ }
25
+ }
26
+ const normalize = (text) => text.replace(/[`*_]/g, "").replace(/\s+/g, " ").trim().toLowerCase();
27
+ const generic = /^(?:you are (?:a )?(?:(?:senior|experienced) )?(?:software )?(?:engineer|developer)|write (?:clean(?:,? readable)?(?: and maintainable)?|(?:high[- ]quality|good)) code(?: and tests)?|follow (?:coding )?best practices|be (?:thorough|helpful|concise)|ensure (?:high )?code quality|run (?:the )?tests|write (?:high[- ]quality|good |unit )?tests)[.!]?$/i;
28
+ function scopeDirectory(path) {
29
+ const marker = path.indexOf(".github/");
30
+ return marker >= 0 ? path.slice(0, marker) : (posix.dirname(path) === "." ? "" : `${posix.dirname(path)}/`);
31
+ }
32
+ export async function assessInstructions(root, paths) {
33
+ const result = {
34
+ basis: INSTRUCTION_STUDY,
35
+ interpretation: "Advisory static heuristics, not a quality score or a causal prediction. The study does not establish a harmful word-count threshold or prove these individual patterns cause failures. Preserve justified policy; compare task outcomes before and after approved changes.",
36
+ inspected: [], omitted: [], signals: [], signalsOmitted: 0,
37
+ };
38
+ const signalCounts = new Map();
39
+ const add = (signal) => {
40
+ const count = signalCounts.get(signal.path) ?? 0;
41
+ signalCounts.set(signal.path, count + 1);
42
+ if (count < 12)
43
+ result.signals.push(signal);
44
+ else
45
+ result.signalsOmitted++;
46
+ };
47
+ const visible = new Set(paths);
48
+ const priority = (path) => ["AGENTS.md", "CLAUDE.md", ".github/copilot-instructions.md", ".crewbie/instructions.md"].includes(path) ? 0 : path.endsWith(".agent.md") ? 2 : 1;
49
+ const instructions = paths.filter(instructionFile).sort((a, b) => priority(a) - priority(b) || a.localeCompare(b));
50
+ const allDocs = paths.filter((path) => /(^|\/)(README|CONTRIBUTING)\.md$/i.test(path));
51
+ const docs = allDocs.slice(0, 12);
52
+ const manifests = paths.filter((path) => /(^|\/)package\.json$/.test(path));
53
+ const content = new Map();
54
+ let remaining = 512_000;
55
+ const read = async (path) => {
56
+ if (content.has(path))
57
+ return content.get(path);
58
+ const absolute = await safePath(root, path);
59
+ let size;
60
+ try {
61
+ size = (await stat(absolute)).size;
62
+ }
63
+ catch (error) {
64
+ if (!errorCode(error, "ENOENT"))
65
+ throw error;
66
+ result.omitted.push({ path, reason: "File disappeared during assessment." });
67
+ return null;
68
+ }
69
+ if (size > 64_000 || size > remaining) {
70
+ result.omitted.push({ path, reason: "Not inspected because of the assessment's byte budget; size alone is not a quality finding." });
71
+ return null;
72
+ }
73
+ remaining -= size;
74
+ const text = await optionalText(absolute);
75
+ if (text === null || text.includes("\0")) {
76
+ result.omitted.push({ path, reason: "Not readable as ordinary text." });
77
+ return null;
78
+ }
79
+ content.set(path, text);
80
+ return text;
81
+ };
82
+ for (const path of instructions.slice(0, 32)) {
83
+ if (await read(path) !== null)
84
+ result.inspected.push(path);
85
+ }
86
+ for (const path of instructions.slice(32))
87
+ result.omitted.push({ path, reason: "Instruction-file count exceeds the bounded assessment window." });
88
+ for (const path of docs)
89
+ await read(path);
90
+ for (const path of allDocs.slice(12))
91
+ result.omitted.push({ path, reason: "Documentation count exceeds the overlap-check window." });
92
+ const scripts = new Map();
93
+ for (const path of manifests.slice(0, 20)) {
94
+ const text = await read(path);
95
+ if (text === null)
96
+ continue;
97
+ let data;
98
+ try {
99
+ data = JSON.parse(text);
100
+ }
101
+ catch (error) {
102
+ if (!(error instanceof SyntaxError))
103
+ throw error;
104
+ result.omitted.push({ path, reason: "Invalid package JSON; script references were not verified against it." });
105
+ continue;
106
+ }
107
+ if (typeof data !== "object" || data === null || Array.isArray(data)) {
108
+ result.omitted.push({ path, reason: "Package manifest is not an object; script references remain unverified." });
109
+ continue;
110
+ }
111
+ const declared = "scripts" in data ? data.scripts : undefined;
112
+ if (declared !== undefined && (typeof declared !== "object" || declared === null || Array.isArray(declared))) {
113
+ result.omitted.push({ path, reason: "Invalid scripts declaration; script references remain unverified." });
114
+ continue;
115
+ }
116
+ scripts.set(path, new Set(Object.keys(declared ?? {})));
117
+ }
118
+ for (const path of manifests.slice(20))
119
+ result.omitted.push({ path, reason: "Manifest count exceeds the script-check window." });
120
+ for (const path of result.inspected) {
121
+ const text = content.get(path);
122
+ const lines = text.split(/\r?\n/);
123
+ if (path.startsWith(".github/instructions/") && path.endsWith(".instructions.md")) {
124
+ try {
125
+ validateInstructionScope(path, text);
126
+ }
127
+ catch (error) {
128
+ add({ code: "missing-path-scope", level: "warning", path, line: 1,
129
+ detail: error instanceof Error ? error.message : "Invalid path-scoped instruction header.",
130
+ recommendation: "Specify valid applyTo globs for the intended domain before moving repository-wide rules here." });
131
+ }
132
+ }
133
+ if (["AGENTS.md", ".github/copilot-instructions.md"].includes(path) && text.trim().split(/\s+/).length > 600) {
134
+ add({ code: "broad-root-guidance", level: "advisory", path, line: 1,
135
+ detail: "Always-loaded guidance exceeds Crewbie's 600-word review threshold, not a paper-established harmful limit.",
136
+ recommendation: "Review relevance and domain scope. Keep necessary shared policy; move justified domain rules behind scoped instructions or nested AGENTS.md, with source reductions and destination edits reviewed together." });
137
+ }
138
+ const frontmatter = /^---\r?\n[\s\S]*?\r?\n---(?:\r?\n|$)/.exec(text)?.[0];
139
+ const frontmatterEndLine = frontmatter === undefined ? 0 : lines.findIndex((line, index) => index > 0 && line.trim() === "---") + 1;
140
+ const semantic = lines.map((line, index) => ({ text: line.replace(/^\s*[-*]\s*/, "").trim(), line: index + 1 }))
141
+ .filter((line) => line.line > frontmatterEndLine)
142
+ .filter((line) => line.text && !line.text.startsWith("#") && !line.text.startsWith("<!--"));
143
+ if (semantic.length && semantic.every((line) => generic.test(line.text))) {
144
+ add({ code: "generic-only", level: "advisory", path, line: semantic[0].line,
145
+ detail: "The file contains only generic advice, without a concrete command, local constraint or context pointer.",
146
+ recommendation: "Check whether it adds useful context. Prefer a non-obvious repository convention or a scoped pointer; do not pad it to meet a length target." });
147
+ }
148
+ let lineNumber = 1;
149
+ let sharedProfileReported = false;
150
+ for (const paragraph of text.split(/(\r?\n\s*\r?\n)/)) {
151
+ const normalized = normalize(paragraph);
152
+ if (normalized.split(" ").length >= 12 && normalized.length >= 80 && !/^\s*#/.test(paragraph)) {
153
+ const duplicate = docs.find((doc) => doc !== path && content.has(doc) && normalize(content.get(doc)).includes(normalized));
154
+ if (duplicate)
155
+ add({
156
+ code: "duplicated-documentation", level: "advisory", path, line: lineNumber, related: duplicate,
157
+ detail: "A substantial passage repeats existing repository documentation. This is an exact normalized overlap, not a claim that repetition caused a failure.",
158
+ recommendation: "Consider a short pointer explaining when to read the existing document. Retain necessary standalone constraints where the contexts differ.",
159
+ });
160
+ if (path.endsWith(".agent.md") && !sharedProfileReported) {
161
+ const other = result.inspected.find((candidate) => candidate !== path && candidate.endsWith(".agent.md")
162
+ && posix.dirname(candidate) === posix.dirname(path) && normalize(content.get(candidate)).includes(normalized));
163
+ if (other) {
164
+ sharedProfileReported = true;
165
+ add({ code: "shared-profile-boilerplate", level: "advisory", path, line: lineNumber, related: other,
166
+ detail: "A substantial instruction block is repeated across specialist profiles. This indicates shared maintenance, not proven runtime harm.",
167
+ recommendation: "Consider one explicit shared-policy pointer, keeping domain-specific checks and non-negotiables in each charter. Preserve access for agents that run independently." });
168
+ }
169
+ }
170
+ }
171
+ lineNumber += (paragraph.match(/\n/g) ?? []).length;
172
+ }
173
+ // Files Copilot reads; other hosts (Claude, Gemini) do not attach .github guidance, so their pointers are needed.
174
+ const copilotHost = /^\.github\/(?:copilot-instructions\.md|instructions\/.+\.instructions\.md|agents\/(?!crewbie-)[^/]+\.agent\.md)$|(^|\/)AGENTS\.md$/.test(path);
175
+ const directory = scopeDirectory(path);
176
+ const scopedManifests = manifests.filter((manifest) => manifest.startsWith(directory));
177
+ let fenced = false;
178
+ for (let index = 0; index < lines.length; index++) {
179
+ const line = lines[index];
180
+ if (/^\s*(```|~~~)/.test(line)) {
181
+ fenced = !fenced;
182
+ continue;
183
+ }
184
+ const pointer = !fenced && copilotHost ? autoLoadedPointer(line) : null;
185
+ const targets = pointer?.references.map((reference) => reference.replace(/^\.\//, "").replace(/^copilot-instructions\.md$/, ".github/copilot-instructions.md")
186
+ .replace(/^([\w.-]+\.instructions\.md)$/, ".github/instructions/$1")).filter((target) => target !== path) ?? [];
187
+ if (pointer && targets.length) {
188
+ const missing = targets.filter((target) => autoLoadedGuidance(target) && !visible.has(target));
189
+ add({ code: "auto-loaded-reference", level: "warning", path, line: index + 1, related: targets[0],
190
+ detail: `Tells the agent to read ${targets.join(", ")}, which Copilot already attaches: repository-wide instructions and AGENTS.md always, path-specific instructions when the working files match applyTo.${missing.length ? ` ${missing.join(", ")} does not exist.` : ""}`,
191
+ recommendation: pointer.pointerOnly
192
+ ? "Remove the line. Adopted agents are cleaned on install; the archive keeps the original."
193
+ : "Remove only the pointer and keep the rest of the line. If the agent needs rules that no automatically loaded file contains, put them in a path-scoped .github/instructions/<domain>.instructions.md." });
194
+ }
195
+ if (!fenced && path.startsWith(".github/agents/") && copilotHost && /\b(?:read|consult|follow|review|see)\b/i.test(line)) {
196
+ for (const match of line.matchAll(/`([\w./-]+\.md)`|\]\(([\w./-]+\.md)\)/g)) {
197
+ const target = posix.normalize(match[1] ?? match[2]).replace(/^\.\//, "");
198
+ if (autoLoadedGuidance(target) || target.startsWith(".crewbie/") || target.startsWith(".github/agents/") || !visible.has(target))
199
+ continue;
200
+ add({ code: "agent-only-context", level: "advisory", path, line: index + 1, related: target,
201
+ detail: "Only this agent is told to read this document; other agents and Copilot chat working on the same files do not get it.",
202
+ recommendation: "If it holds rules for specific paths, consider a path-scoped .github/instructions/<domain>.instructions.md with applyTo globs so Copilot loads them automatically, then drop the pointer." });
203
+ }
204
+ }
205
+ if (!fenced)
206
+ for (const match of line.matchAll(/\[[^\]]+\]\(([^)\s]+)(?:\s+"[^"]*")?\)/g)) {
207
+ const raw = match[1];
208
+ if (/^(?:[a-z][a-z0-9+.-]*:|#|\/|~)/i.test(raw) || /[<>{}$*]/.test(raw))
209
+ continue;
210
+ let target;
211
+ try {
212
+ target = decodeURIComponent(raw.split(/[?#]/)[0]);
213
+ }
214
+ catch (error) {
215
+ if (error instanceof URIError)
216
+ continue;
217
+ throw error;
218
+ }
219
+ if (!target)
220
+ continue;
221
+ const resolved = posix.normalize(posix.join(posix.dirname(path), target)).replace(/\/+$/, "") || ".";
222
+ if (resolved === "." || resolved.startsWith("../") || visible.has(resolved) || paths.some((candidate) => candidate.startsWith(`${resolved}/`)))
223
+ continue;
224
+ add({ code: "unverified-reference", level: "warning", path, line: index + 1,
225
+ detail: "A literal relative Markdown link has no target in the visible, non-ignored repository file index.",
226
+ recommendation: "Verify the link relative to this instruction file. Correct stale paths, or state when an ignored/generated target becomes available." });
227
+ }
228
+ if (!/\b(?:don't|do not|avoid|never)\b/i.test(line)) {
229
+ if (/\b(?:always|every change)\b/i.test(line) && /\b(?:full|entire|all)\b.*\btests?\b/i.test(line) && !/\b(?:merge|release|compliance|security|CI)\b/i.test(line)) {
230
+ add({ code: "unconditional-full-suite", level: "advisory", path, line: index + 1,
231
+ detail: "The text appears to require full-suite work unconditionally; faithful compliance may increase cost.",
232
+ recommendation: "Confirm the intent. Scope routine checks to changed behavior where appropriate, while preserving explicit merge, release and compliance gates." });
233
+ }
234
+ if (!line.includes("--if-present")) {
235
+ const npmScripts = [...line.matchAll(/\bnpm\s+run\s+([a-zA-Z0-9:_-]+)/g)];
236
+ if (npmScripts.length) {
237
+ if (!scopedManifests.length) {
238
+ add({ code: "missing-package-manifest", level: "warning", path, line: index + 1,
239
+ detail: "A literal npm run command has no package.json in this instruction scope to establish its working directory or script.",
240
+ recommendation: "Verify the command's working directory. Add the relevant package manifest to the repository or make the guidance name the intended package location." });
241
+ }
242
+ else if (scopedManifests.every((manifest) => scripts.has(manifest))) {
243
+ for (const match of npmScripts) {
244
+ if (scopedManifests.some((manifest) => scripts.get(manifest).has(match[1])))
245
+ continue;
246
+ add({ code: "missing-npm-script", level: "warning", path, line: index + 1,
247
+ detail: "A literal npm run command names no script in any inspected package manifest within this instruction scope.",
248
+ recommendation: "Verify the command and working directory against the current manifest. Correct stale guidance instead of creating a script solely to satisfy it." });
249
+ }
250
+ }
251
+ }
252
+ }
253
+ }
254
+ }
255
+ }
256
+ return result;
257
+ }
258
+ //# sourceMappingURL=instruction-quality.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"instruction-quality.js","sourceRoot":"","sources":["../../src/setup/instruction-quality.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ export interface Inventory {
2
+ mode: "brownfield" | "greenfield";
3
+ files: {
4
+ path: string;
5
+ kind: "instructions" | "agents" | "archive" | "constitution";
6
+ content: string;
7
+ beforeHash: string;
8
+ redacted: boolean;
9
+ }[];
10
+ mcp: {
11
+ path: string;
12
+ servers: {
13
+ name: string;
14
+ transport: string;
15
+ executable: string | null;
16
+ credentials: string[];
17
+ }[];
18
+ }[];
19
+ omitted: {
20
+ path: string;
21
+ reason: string;
22
+ }[];
23
+ scope: string;
24
+ }
25
+ export declare function redact(text: string): string;
26
+ export declare function inventory(root: string, paths: string[]): Promise<Inventory>;
@@ -0,0 +1,78 @@
1
+ import { stat } from "node:fs/promises";
2
+ import { basename } from "node:path";
3
+ import { parse } from "jsonc-parser";
4
+ import { errorCode, hash, optionalText, record, safePath } from "../core.js";
5
+ import { instructionFile } from "./instruction-quality.js";
6
+ export function redact(text) {
7
+ return text.replace(/-----BEGIN [^-]*PRIVATE KEY-----[\s\S]*?-----END [^-]*PRIVATE KEY-----/g, "<REDACTED>")
8
+ .replace(/\b(?:gh[pousr]_[A-Za-z0-9]{20,}|github_pat_[A-Za-z0-9_]{20,}|sk-[A-Za-z0-9_-]{20,})\b/g, "<REDACTED>")
9
+ .replace(/((?:token|password|secret|api[_-]?key)\s*["']?\s*[:=]\s*)["']?[^\s"',;}]+/gi, "$1<REDACTED>")
10
+ .replace(/(https?:\/\/)[^\s/@]+:[^\s/@]+@/g, "$1<REDACTED>@");
11
+ }
12
+ export async function inventory(root, paths) {
13
+ const implementation = paths.filter((path) => !/(^|\/)(?:\.git|\.github|\.crewbie|\.claude|\.copilot|node_modules|vendor|dist|build|coverage|test|tests|docs)\//.test(path)
14
+ && /\.(?:[cm]?[jt]sx?|py|go|rs|java|cs|rb|php|swift|kt|tf|bicep|vue|svelte)$/.test(path));
15
+ const result = {
16
+ mode: implementation.length ? "brownfield" : "greenfield", files: [], mcp: [], omitted: [],
17
+ scope: "AI guidance only: agent instructions, custom agents, constitution and MCP metadata, bounded to 256 KB of text. Application code, READMEs, manifests and other project files are not read; only their names are mapped (directories and workspaces) to check cited paths. Ignored files and personal/global MCP settings are not read. MCP configurations are inspected, never launched; arguments, URLs, headers and credential values are withheld. Builds and server availability are unverified.",
18
+ };
19
+ const mcpPaths = paths.filter((path) => /(^|\/)(?:mcp\.json|mcp-config\.json|\.mcp\.json)$/.test(path) || path === ".vscode/settings.json");
20
+ const guidance = paths.filter((path) => instructionFile(path) || /^\.crewbie\/agent-archive\/(?:github|claude)\/agents\/.*\.md$/.test(path) || /(^|\/)constitution\.md$/i.test(path));
21
+ const candidates = [...new Set([...guidance, ...mcpPaths])];
22
+ let remaining = 256_000;
23
+ for (const path of candidates) {
24
+ const absolute = await safePath(root, path);
25
+ let size;
26
+ try {
27
+ size = (await stat(absolute)).size;
28
+ }
29
+ catch (error) {
30
+ if (!errorCode(error, "ENOENT"))
31
+ throw error;
32
+ result.omitted.push({ path, reason: "File disappeared during assessment." });
33
+ continue;
34
+ }
35
+ if (size > 64_000 || size > remaining) {
36
+ result.omitted.push({ path, reason: "File exceeds the text assessment budget or is not ordinary text." });
37
+ continue;
38
+ }
39
+ const content = await optionalText(absolute);
40
+ if (content === null || content.includes("\0")) {
41
+ result.omitted.push({ path, reason: "File disappeared or is not ordinary text." });
42
+ continue;
43
+ }
44
+ remaining -= size;
45
+ if (mcpPaths.includes(path)) {
46
+ try {
47
+ const errors = [];
48
+ const parsed = parse(content, errors, { allowTrailingComma: true });
49
+ if (errors.length)
50
+ throw new SyntaxError("Invalid MCP JSON.");
51
+ const config = record(parsed, "MCP configuration");
52
+ const nested = config.mcp === undefined ? config : record(config.mcp, "MCP settings");
53
+ const servers = record(nested.mcpServers ?? nested.servers ?? {}, "MCP servers");
54
+ result.mcp.push({ path, servers: Object.entries(servers).map(([name, raw]) => {
55
+ const server = record(raw, "MCP server");
56
+ return {
57
+ name: redact(name), transport: typeof server.type === "string" ? redact(server.type) : server.command ? "stdio" : "remote",
58
+ executable: typeof server.command === "string" ? redact(basename(server.command.replaceAll("\\", "/"))) : null,
59
+ credentials: Object.keys(record(server.env ?? {}, "MCP environment")).map(redact),
60
+ };
61
+ }) });
62
+ }
63
+ catch (error) {
64
+ if (!(error instanceof SyntaxError) && !(error instanceof Error && /must be an object/.test(error.message)))
65
+ throw error;
66
+ result.omitted.push({ path, reason: "MCP configuration is not valid JSON/JSONC; inspect manually. Raw configuration was not shared." });
67
+ }
68
+ continue;
69
+ }
70
+ const safe = redact(content);
71
+ result.files.push({
72
+ path, kind: /(^|\/)constitution\.md$/i.test(path) ? "constitution" : path.startsWith(".crewbie/agent-archive/") ? "archive" : /(^|\/)(?:\.github|\.claude)\/agents\//.test(path) ? "agents" : "instructions",
73
+ content: safe, beforeHash: hash(content), redacted: safe !== content,
74
+ });
75
+ }
76
+ return result;
77
+ }
78
+ //# sourceMappingURL=inventory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inventory.js","sourceRoot":"","sources":["../../src/setup/inventory.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ import type { Assessment } from "./assessment.js";
2
+ import { type Analyze, type ModelChoice } from "./copilot.js";
3
+ export { analyzeWithCopilot, explicitModel, type Analyze } from "./copilot.js";
4
+ export interface SetupReview {
5
+ summary: string;
6
+ findings: {
7
+ area: string;
8
+ path: string | null;
9
+ assessment: string;
10
+ recommendation: string;
11
+ action: string;
12
+ editPaths?: string[];
13
+ deferReason?: string;
14
+ }[];
15
+ agentDecisions?: {
16
+ path: string;
17
+ action: "adopt" | "retain";
18
+ reason: string;
19
+ }[];
20
+ /** Deterministic checks of the proposal against the working tree; advisory, never applied. */
21
+ warnings?: string[];
22
+ }
23
+ export interface SetupProposal extends Assessment {
24
+ status: "ready" | "clarification";
25
+ description: string;
26
+ review: SetupReview;
27
+ analysisModel: string;
28
+ agentAdoptions: Record<string, string>;
29
+ }
30
+ export declare function setupPrompt(assessment: Assessment, description: string, models?: ModelChoice[]): string;
31
+ export declare function parseSetupReview(output: string, assessment: Assessment, description: string, model: string, models?: ModelChoice[], specialistModel?: string): SetupProposal;
32
+ export declare function proposeSetup(assessment: Assessment, description: string, model: string, io: {
33
+ analyze?: Analyze;
34
+ ask?: (question: string) => Promise<string>;
35
+ report: (text: string) => void;
36
+ models?: ModelChoice[];
37
+ specialistModel?: string;
38
+ }): Promise<SetupProposal>;
39
+ export declare function renderSetupReview(proposal: SetupProposal): string;
40
+ export declare function selectGuidance<T extends Assessment>(proposal: T, apply: boolean): T;