@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 @@
1
+ {"version":3,"file":"improvement.js","sourceRoot":"","sources":["../../src/memory/improvement.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { type Config } from "../config.js";
2
+ import type { GitHubApi } from "../tracking/github.js";
3
+ export declare const LAUNCH_MEMORY_CHARACTERS = 20000;
4
+ export declare function launchMemoryPaths(config: Config, role: string): string[];
5
+ /**
6
+ * The role's required Crewbie memory at the launch revision, embedded in cloud-agent launch instructions.
7
+ * Cloud agents told to read memory often skipped it; embedding makes the context deterministic, like the Actions jobs.
8
+ */
9
+ export declare function launchMemory(client: GitHubApi, config: Config, role: string, ref: string): Promise<string>;
@@ -0,0 +1,65 @@
1
+ import { GitHubError, record, slug, textHash } from "../core.js";
2
+ import { SHARED_HOT, SHARED_INDEX } from "./context.js";
3
+ // GitHub documents no limit for launch instructions; stay well below issue-body size so assignment is not rejected.
4
+ export const LAUNCH_MEMORY_CHARACTERS = 20_000;
5
+ export function launchMemoryPaths(config, role) {
6
+ slug(role, "role");
7
+ return [
8
+ ".crewbie/instructions.md",
9
+ ...(config.constitution ? [config.constitution] : []),
10
+ SHARED_HOT,
11
+ SHARED_INDEX,
12
+ `.crewbie/team/${role}/hot.md`,
13
+ `.crewbie/team/${role}/index.md`,
14
+ ];
15
+ }
16
+ async function remoteText(client, repository, path, ref) {
17
+ try {
18
+ const file = record(await client.request("GET", `/repos/${repository}/contents/${path.split("/").map(encodeURIComponent).join("/")}?ref=${encodeURIComponent(ref)}`), "memory file");
19
+ if (file.type !== "file")
20
+ return null;
21
+ // Files over 1 MB come back without inline content.
22
+ if (file.encoding !== "base64" || typeof file.content !== "string")
23
+ return "large";
24
+ return Buffer.from(file.content, "base64").toString("utf8");
25
+ }
26
+ catch (error) {
27
+ if (error instanceof GitHubError && error.status === 404)
28
+ return null;
29
+ throw error;
30
+ }
31
+ }
32
+ /**
33
+ * The role's required Crewbie memory at the launch revision, embedded in cloud-agent launch instructions.
34
+ * Cloud agents told to read memory often skipped it; embedding makes the context deterministic, like the Actions jobs.
35
+ */
36
+ export async function launchMemory(client, config, role, ref) {
37
+ const blocks = [], missing = [], unread = [];
38
+ let budget = LAUNCH_MEMORY_CHARACTERS;
39
+ for (const path of launchMemoryPaths(config, role)) {
40
+ const content = await remoteText(client, config.repository, path, ref);
41
+ if (content === null) {
42
+ missing.push(path);
43
+ continue;
44
+ }
45
+ if (content === "large") {
46
+ unread.push(path);
47
+ continue;
48
+ }
49
+ const block = `----- BEGIN ${path} (sha256 ${textHash(content).slice(0, 12)}) -----\n${content.trimEnd()}\n----- END ${path} -----`;
50
+ if (block.length > budget) {
51
+ unread.push(path);
52
+ continue;
53
+ }
54
+ budget -= block.length;
55
+ blocks.push(block);
56
+ }
57
+ return [
58
+ `Crewbie memory at ${ref}, embedded by Crewbie so you start with it; treat it as already read and cite these paths and hashes when reporting memory read.`,
59
+ ...blocks,
60
+ ...(unread.length ? [`Too large to embed; read before any other work: ${unread.join(", ")}.`] : []),
61
+ ...(missing.length ? [`Absent at this revision (do not claim to have read them): ${missing.join(", ")}.`] : []),
62
+ "Read linked cold/archive topics only when relevant.",
63
+ ].join("\n");
64
+ }
65
+ //# sourceMappingURL=launch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"launch.js","sourceRoot":"","sources":["../../src/memory/launch.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { Config } from "../config.js";
2
+ import type { GitHubApi } from "../tracking/github.js";
3
+ export declare function prepareMaintenance(root: string, client: GitHubApi, config: Config): Promise<number>;
4
+ export declare function applyMaintenance(root: string, client: GitHubApi, config: Config): Promise<string>;
@@ -0,0 +1,74 @@
1
+ import { unlink } from "node:fs/promises";
2
+ import { errorCode, json, optionalText, readJson, record, safePath, textHash, writeAtomic } from "../core.js";
3
+ import { collectRecords, evidenceId, parseRecords } from "../reporting/records.js";
4
+ import { contextTopics, memoryContext } from "./context.js";
5
+ import { maintenancePrompt, parseProposal, publishProposal, seenEvidence, selectEvidence, validateProposal } from "./improvement.js";
6
+ import { readState, saveState } from "./state.js";
7
+ const INPUT = ".crewbie-maintenance-input.json";
8
+ const OUTPUT = ".crewbie-maintenance-output.txt";
9
+ const PROMPT = ".crewbie-maintenance-prompt.txt";
10
+ export async function prepareMaintenance(root, client, config) {
11
+ for (const path of [INPUT, OUTPUT, PROMPT]) {
12
+ try {
13
+ await unlink(await safePath(root, path));
14
+ }
15
+ catch (error) {
16
+ if (!errorCode(error, "ENOENT"))
17
+ throw error;
18
+ }
19
+ }
20
+ if (!config.nightly.enabled)
21
+ return 0;
22
+ const state = await readState(client, config.repository);
23
+ const seen = await seenEvidence(client, config.repository);
24
+ for (const entry of Object.values(state.processed))
25
+ seen.add(entry.fingerprint);
26
+ const evidence = selectEvidence(await collectRecords(client, config), seen, config.nightly.maxRecords);
27
+ if (!evidence.length)
28
+ return 0;
29
+ const byPath = new Map();
30
+ const affectedRoles = ["improver", ...config.roles.filter((role) => evidence.some((run) => run.specialist === role.id)).map((role) => role.id)];
31
+ const query = evidence.map((run) => run.summary).join("\n");
32
+ for (const role of affectedRoles) {
33
+ const base = await memoryContext(root, config, role);
34
+ for (const file of await memoryContext(root, config, role, contextTopics(base, query)))
35
+ byPath.set(file.path, file);
36
+ const path = `.github/agents/crewbie-${role}.agent.md`;
37
+ const content = await optionalText(await safePath(root, path));
38
+ if (content === null)
39
+ throw new Error(`Missing charter ${path}.`);
40
+ byPath.set(path, { path, content, sha256: textHash(content) });
41
+ }
42
+ const files = [...byPath.values()];
43
+ const prompt = maintenancePrompt(config, evidence, files);
44
+ if (prompt.length > 100_000)
45
+ throw new Error("Maintenance context exceeds 100 KB. Narrow the evidence batch; no input was silently truncated.");
46
+ await writeAtomic(root, INPUT, json({ schemaVersion: 1, evidence, stateRevision: state.revision }));
47
+ await writeAtomic(root, PROMPT, prompt);
48
+ return evidence.length;
49
+ }
50
+ export async function applyMaintenance(root, client, config) {
51
+ if (!config.nightly.enabled)
52
+ return "Nightly improvement is disabled.";
53
+ const inputPath = await safePath(root, INPUT);
54
+ if (await optionalText(inputPath) === null)
55
+ return "No new evidence; no analysis or proposal needed.";
56
+ const input = record(await readJson(inputPath), "maintenance input");
57
+ const evidence = parseRecords(input.evidence);
58
+ const output = await optionalText(await safePath(root, OUTPUT));
59
+ if (!output)
60
+ throw new Error("Maintenance analysis did not produce output.");
61
+ const body = output.trim().replace(/^```json\s*\n([\s\S]*?)\n```$/, "$1");
62
+ const proposal = parseProposal(JSON.parse(body));
63
+ await validateProposal(root, config, proposal, evidence);
64
+ const state = await readState(client, config.repository);
65
+ if (state.revision !== input.stateRevision)
66
+ throw new Error("Maintenance state changed during analysis. Prepare again.");
67
+ const url = await publishProposal(client, config, proposal, evidence);
68
+ for (const run of evidence) {
69
+ state.processed = { ...state.processed, [run.id]: { fingerprint: evidenceId(run), outcome: url ? `Proposed: ${url}` : "Reviewed; no justified change." } };
70
+ }
71
+ await saveState(client, config.repository, state);
72
+ return url ? `Proposal ready for human review: ${url}` : "Evidence reviewed; no justified change. Cursor saved without opening a PR.";
73
+ }
74
+ //# sourceMappingURL=runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/memory/runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { GitHubApi } from "../tracking/github.js";
2
+ export interface MaintenanceState {
3
+ processed: Record<string, {
4
+ fingerprint: string;
5
+ outcome: string;
6
+ }>;
7
+ revision: string | null;
8
+ }
9
+ export declare function readState(client: GitHubApi, repository: string): Promise<MaintenanceState>;
10
+ export declare function saveState(client: GitHubApi, repository: string, state: MaintenanceState): Promise<void>;
@@ -0,0 +1,42 @@
1
+ import { json, record, string } from "../core.js";
2
+ import { GitHubError } from "../execution/github.js";
3
+ const BRANCH = "crewbie/runtime";
4
+ export async function readState(client, repository) {
5
+ let ref;
6
+ try {
7
+ ref = record(await client.request("GET", `/repos/${repository}/git/ref/heads/${BRANCH}`), "runtime ref");
8
+ }
9
+ catch (error) {
10
+ if (error instanceof GitHubError && error.status === 404)
11
+ return { processed: {}, revision: null };
12
+ throw error;
13
+ }
14
+ const revision = string(record(ref.object, "runtime ref object").sha, "runtime revision");
15
+ const file = record(await client.request("GET", `/repos/${repository}/contents/state.json?ref=${revision}`), "runtime state file");
16
+ if (file.encoding !== "base64")
17
+ throw new Error("Unexpected runtime state encoding.");
18
+ const data = record(JSON.parse(Buffer.from(string(file.content, "state content"), "base64").toString("utf8")), "runtime state");
19
+ if (data.schemaVersion !== 1)
20
+ throw new Error("Unsupported runtime state version.");
21
+ const processed = record(data.processed, "processed evidence");
22
+ const parsed = Object.fromEntries(Object.entries(processed).map(([id, raw]) => {
23
+ const entry = record(raw, "processed record");
24
+ return [id, { fingerprint: string(entry.fingerprint, "fingerprint"), outcome: string(entry.outcome, "outcome") }];
25
+ }));
26
+ return { processed: parsed, revision };
27
+ }
28
+ export async function saveState(client, repository, state) {
29
+ const prefix = `/repos/${repository}`;
30
+ const tree = record(await client.request("POST", `${prefix}/git/trees`, {
31
+ tree: [{ path: "state.json", mode: "100644", type: "blob", content: json({ schemaVersion: 1, processed: state.processed }) }],
32
+ }), "runtime tree");
33
+ const commit = record(await client.request("POST", `${prefix}/git/commits`, {
34
+ message: "Record reviewed Crewbie evidence\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>", tree: string(tree.sha, "runtime tree SHA"), parents: state.revision ? [state.revision] : [],
35
+ }), "runtime commit");
36
+ const sha = string(commit.sha, "runtime commit SHA");
37
+ if (state.revision)
38
+ await client.request("PATCH", `${prefix}/git/refs/heads/${BRANCH}`, { sha, force: false });
39
+ else
40
+ await client.request("POST", `${prefix}/git/refs`, { ref: `refs/heads/${BRANCH}`, sha });
41
+ }
42
+ //# sourceMappingURL=state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/memory/state.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ interface OutputStream {
2
+ isTTY?: boolean;
3
+ columns?: number;
4
+ write: (text: string) => unknown;
5
+ }
6
+ interface OutputOptions {
7
+ stdout?: OutputStream;
8
+ stderr?: OutputStream;
9
+ env?: NodeJS.ProcessEnv;
10
+ machine?: boolean;
11
+ }
12
+ export declare function wrapText(value: string, width: number): string;
13
+ export declare function createOutput(options?: OutputOptions): {
14
+ text: (value: string) => void;
15
+ data: (value: unknown, plainFallback?: string) => unknown;
16
+ heading: (command: string) => void;
17
+ error: (message: string) => unknown;
18
+ };
19
+ export {};
@@ -0,0 +1,128 @@
1
+ import { stripVTControlCharacters } from "node:util";
2
+ import stringWidth from "string-width";
3
+ import { json } from "./core.js";
4
+ const codes = { bold: 1, dim: 2, cyan: 36, green: 32, yellow: 33, red: 31 };
5
+ const segments = new Intl.Segmenter(undefined, { granularity: "grapheme" });
6
+ const plain = (value) => stripVTControlCharacters(value).replace(/\r\n?/g, "\n");
7
+ const label = (value) => value.replace(/([a-z])([A-Z])/g, "$1 $2").replace(/[_-]/g, " ");
8
+ const scalar = (value) => value === null ? "null" : value === undefined ? "-" : String(value);
9
+ const isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
10
+ const simple = (value) => value === null || ["string", "number", "boolean", "undefined"].includes(typeof value);
11
+ export function wrapText(value, width) {
12
+ const columns = Math.max(4, Math.floor(width));
13
+ return plain(value).replaceAll("\t", " ").split("\n").flatMap((line) => {
14
+ const indent = " ".repeat(Math.min(line.match(/^ */)[0].length, Math.max(0, columns - 8)));
15
+ const lines = [];
16
+ let current = indent;
17
+ for (const { segment } of segments.segment(line.trimStart())) {
18
+ if (stringWidth(current + segment) > columns) {
19
+ const space = current.lastIndexOf(" ");
20
+ if (space > indent.length) {
21
+ lines.push(current.slice(0, space));
22
+ current = indent + current.slice(space + 1);
23
+ }
24
+ else {
25
+ lines.push(current);
26
+ current = indent;
27
+ }
28
+ }
29
+ if (current !== indent || segment !== " ")
30
+ current += segment;
31
+ }
32
+ lines.push(current.trimEnd());
33
+ return lines;
34
+ }).join("\n");
35
+ }
36
+ export function createOutput(options = {}) {
37
+ const stdout = options.stdout ?? process.stdout, stderr = options.stderr ?? process.stderr;
38
+ const env = options.env ?? process.env;
39
+ const interactive = (stream) => stream.isTTY === true && !options.machine;
40
+ const coloured = (stream) => interactive(stream) && !("NO_COLOR" in env) && env.FORCE_COLOR !== "0" && env.TERM !== "dumb";
41
+ const width = (stream) => Math.max(20, Math.min(stream.columns ?? 100, 120));
42
+ const paint = (value, colour, stream = stdout) => coloured(stream) ? `\u001b[${codes[colour]}m${value}\u001b[0m` : value;
43
+ const status = (value) => {
44
+ const state = value.trim().toLowerCase();
45
+ if (["ready", "approved", "done", "success", "completed", "clean"].includes(state))
46
+ return paint(value, "green");
47
+ if (["blocked", "failed", "error", "not ready"].includes(state))
48
+ return paint(value, "red");
49
+ if (["unknown", "unavailable", "pending", "waiting", "cancelled"].includes(state))
50
+ return paint(value, "yellow");
51
+ if (["running", "review"].includes(state))
52
+ return paint(value, "cyan");
53
+ return value;
54
+ };
55
+ const decorate = (line) => {
56
+ if (/^(?:Crewbie\b|[123]\. (?:Assess|Review|Apply)\b|[A-Z][A-Z /]+(?: \||$)|Installation preview:|Saved for review)/.test(line))
57
+ return paint(line, "bold");
58
+ return line.replace(/^(\s*)\[(ready|blocked|unknown)\]/i, (_, indent, state) => `${indent}[${status(state.toUpperCase())}]`);
59
+ };
60
+ const text = (value) => {
61
+ const display = interactive(stdout)
62
+ ? wrapText(value.replace(/\*\*([^*\n]+)\*\*/g, "$1").replace(/`([^`\n]+)`/g, "$1"), width(stdout)).split("\n").map(decorate).join("\n")
63
+ : value;
64
+ stdout.write(display + "\n");
65
+ };
66
+ function table(rows, depth) {
67
+ const keys = [...new Set(rows.flatMap((row) => Object.keys(row)))];
68
+ const indent = " ".repeat(Math.min(depth * 2, 8));
69
+ const available = width(stdout) - stringWidth(indent);
70
+ if (!keys.length || keys.length > 5 || keys.length * 10 + (keys.length - 1) * 3 > available
71
+ || rows.some((row) => keys.some((key) => !simple(row[key]) || scalar(row[key]).includes("\n"))))
72
+ return null;
73
+ const widths = keys.map((key) => Math.min(48, Math.max(10, stringWidth(label(key)), ...rows.map((row) => stringWidth(plain(scalar(row[key])))))));
74
+ while (widths.reduce((sum, size) => sum + size, (keys.length - 1) * 3) > available) {
75
+ const widest = widths.indexOf(Math.max(...widths));
76
+ widths[widest]--;
77
+ }
78
+ const pad = (value, size) => value + " ".repeat(Math.max(0, size - stringWidth(value)));
79
+ const headings = keys.map((key, index) => wrapText(label(key).toUpperCase(), widths[index]).split("\n"));
80
+ const lines = [];
81
+ for (let line = 0; line < Math.max(...headings.map((cell) => cell.length)); line++) {
82
+ lines.push(paint((indent + headings.map((cell, index) => pad(cell[line] ?? "", widths[index])).join(" | ")).trimEnd(), "bold"));
83
+ }
84
+ lines.push(indent + widths.map((size) => "-".repeat(size)).join("-+-"));
85
+ for (const row of rows) {
86
+ const cells = keys.map((key, index) => wrapText(scalar(row[key]), widths[index]).split("\n"));
87
+ for (let line = 0; line < Math.max(...cells.map((cell) => cell.length)); line++) {
88
+ lines.push((indent + cells.map((cell, index) => status(pad(cell[line] ?? "", widths[index])))
89
+ .join(" | ")).trimEnd());
90
+ }
91
+ }
92
+ return lines.join("\n");
93
+ }
94
+ function details(value, depth = 0) {
95
+ const indent = " ".repeat(Math.min(depth * 2, 8));
96
+ if (Array.isArray(value)) {
97
+ if (!value.length)
98
+ return `${indent}(none)`;
99
+ if (value.every(isRecord)) {
100
+ const rendered = table(value, depth);
101
+ if (rendered !== null)
102
+ return rendered;
103
+ }
104
+ return value.map((item, index) => simple(item)
105
+ ? wrapText(`${indent}- ${scalar(item)}`, width(stdout))
106
+ : `${paint(`${indent}[${index + 1}]`, "dim")}\n${details(item, depth + 1)}`).join("\n");
107
+ }
108
+ if (isRecord(value)) {
109
+ return Object.entries(value).filter(([, item]) => item !== undefined).map(([key, item]) => simple(item)
110
+ ? wrapText(`${indent}${label(key)}: ${scalar(item)}`, width(stdout)).split("\n").map((line) => line.replace(/: ([^:]+)$/, (_, content) => `: ${status(content)}`)).join("\n")
111
+ : `${paint(wrapText(`${indent}${label(key).toUpperCase()}`, width(stdout)), "bold")}\n${details(item, depth + 1)}`).join("\n");
112
+ }
113
+ return wrapText(`${indent}${scalar(value)}`, width(stdout));
114
+ }
115
+ return {
116
+ text,
117
+ data: (value, plainFallback) => stdout.write((interactive(stdout) ? details(value)
118
+ : options.machine ? json(value) : plainFallback ?? json(value)) + "\n"),
119
+ heading: (command) => {
120
+ if (interactive(stdout))
121
+ stdout.write(`\n${paint("CREWBIE", "cyan")} ${paint("/", "dim")} ${paint(command.toUpperCase(), "bold")}\n\n`);
122
+ },
123
+ error: (message) => stderr.write(interactive(stderr)
124
+ ? `\n${paint("ERROR", "red", stderr)} ${paint("Crewbie", "bold", stderr)}\n\n${wrapText(` ${message}`, width(stderr))}\n`
125
+ : `Crewbie: ${message}\n`),
126
+ };
127
+ }
128
+ //# sourceMappingURL=presentation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"presentation.js","sourceRoot":"","sources":["../src/presentation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,WAAW,CAAC;AACrD,OAAO,WAAW,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAajC,MAAM,KAAK,GAAG,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC;AAE5E,MAAM,QAAQ,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,WAAW,EAAE,UAAU,EAAE,CAAC,CAAC;AAC5E,MAAM,KAAK,GAAG,CAAC,KAAa,EAAE,EAAE,CAAC,wBAAwB,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;AACzF,MAAM,KAAK,GAAG,CAAC,KAAa,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;AACjG,MAAM,MAAM,GAAG,CAAC,KAAc,EAAU,EAAE,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC/G,MAAM,QAAQ,GAAG,CAAC,KAAc,EAAoC,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC5I,MAAM,MAAM,GAAG,CAAC,KAAc,EAAE,EAAE,CAAC,KAAK,KAAK,IAAI,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,OAAO,KAAK,CAAC,CAAC;AAEzH,MAAM,UAAU,QAAQ,CAAC,KAAa,EAAE,KAAa;IACnD,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;IAC/C,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;QACxE,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAE,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5F,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,IAAI,OAAO,GAAG,MAAM,CAAC;QACrB,KAAK,MAAM,EAAE,OAAO,EAAE,IAAI,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,EAAE,CAAC;YAC7D,IAAI,WAAW,CAAC,OAAO,GAAG,OAAO,CAAC,GAAG,OAAO,EAAE,CAAC;gBAC7C,MAAM,KAAK,GAAG,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;gBACvC,IAAI,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC;oBAC1B,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;oBACpC,OAAO,GAAG,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;gBAC9C,CAAC;qBAAM,CAAC;oBACN,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;oBACpB,OAAO,GAAG,MAAM,CAAC;gBACnB,CAAC;YACH,CAAC;YACD,IAAI,OAAO,KAAK,MAAM,IAAI,OAAO,KAAK,GAAG;gBAAE,OAAO,IAAI,OAAO,CAAC;QAChE,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;QAC9B,OAAO,KAAK,CAAC;IACf,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,UAAyB,EAAE;IACtD,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC;IAC3F,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC;IACvC,MAAM,WAAW,GAAG,CAAC,MAAoB,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,KAAK,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;IACxF,MAAM,QAAQ,GAAG,CAAC,MAAoB,EAAE,EAAE,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,UAAU,IAAI,GAAG,CAAC,IAAI,GAAG,CAAC,WAAW,KAAK,GAAG,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,CAAC;IACzI,MAAM,KAAK,GAAG,CAAC,MAAoB,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,IAAI,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;IAC3F,MAAM,KAAK,GAAG,CAAC,KAAa,EAAE,MAAc,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,UAAU,KAAK,CAAC,MAAM,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC;IACzI,MAAM,MAAM,GAAG,CAAC,KAAa,EAAE,EAAE;QAC/B,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACzC,IAAI,CAAC,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QACjH,IAAI,CAAC,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAC5F,IAAI,CAAC,SAAS,EAAE,aAAa,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QACjH,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QACvE,OAAO,KAAK,CAAC;IACf,CAAC,CAAC;IACF,MAAM,QAAQ,GAAG,CAAC,IAAY,EAAE,EAAE;QAChC,IAAI,gHAAgH,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,OAAO,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAC5J,OAAO,IAAI,CAAC,OAAO,CAAC,oCAAoC,EAAE,CAAC,CAAC,EAAE,MAAc,EAAE,KAAa,EAAE,EAAE,CAAC,GAAG,MAAM,IAAI,MAAM,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC,CAAC;IAC/I,CAAC,CAAC;IACF,MAAM,IAAI,GAAG,CAAC,KAAa,EAAE,EAAE;QAC7B,MAAM,OAAO,GAAG,WAAW,CAAC,MAAM,CAAC;YACjC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,oBAAoB,EAAE,IAAI,CAAC,CAAC,OAAO,CAAC,cAAc,EAAE,IAAI,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;YACvI,CAAC,CAAC,KAAK,CAAC;QACV,MAAM,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;IAC/B,CAAC,CAAC;IACF,SAAS,KAAK,CAAC,IAA+B,EAAE,KAAa;QAC3D,MAAM,IAAI,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACnE,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAClD,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;QACtD,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,SAAS;eACtF,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;YAAE,OAAO,IAAI,CAAC;QAC/G,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAClJ,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,GAAG,GAAG,IAAI,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,SAAS,EAAE,CAAC;YACnF,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC;YACnD,MAAM,CAAC,MAAM,CAAE,EAAE,CAAC;QACpB,CAAC;QACD,MAAM,GAAG,GAAG,CAAC,KAAa,EAAE,IAAY,EAAE,EAAE,CAAC,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACxG,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,EAAE,MAAM,CAAC,KAAK,CAAE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;QAC1G,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,KAAK,IAAI,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC;YACnF,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,MAAM,CAAC,KAAK,CAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC;QACnI,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QACxE,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,CAAE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;YAC/F,KAAK,IAAI,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC;gBAChF,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,MAAM,CAAC,KAAK,CAAE,CAAC,CAAC,CAAC;qBAC3F,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;YAC7B,CAAC;QACH,CAAC;QACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IACD,SAAS,OAAO,CAAC,KAAc,EAAE,KAAK,GAAG,CAAC;QACxC,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAClD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACzB,IAAI,CAAC,KAAK,CAAC,MAAM;gBAAE,OAAO,GAAG,MAAM,QAAQ,CAAC;YAC5C,IAAI,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC1B,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;gBACrC,IAAI,QAAQ,KAAK,IAAI;oBAAE,OAAO,QAAQ,CAAC;YACzC,CAAC;YACD,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC;gBAC5C,CAAC,CAAC,QAAQ,CAAC,GAAG,MAAM,KAAK,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;gBACvD,CAAC,CAAC,GAAG,KAAK,CAAC,GAAG,MAAM,IAAI,KAAK,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,OAAO,CAAC,IAAI,EAAE,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5F,CAAC;QACD,IAAI,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YACpB,OAAO,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC;gBACrG,CAAC,CAAC,QAAQ,CAAC,GAAG,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,KAAK,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAC5F,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC,EAAE,OAAe,EAAE,EAAE,CAAC,KAAK,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;gBACxF,CAAC,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,GAAG,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,EAAE,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,OAAO,CAAC,IAAI,EAAE,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnI,CAAC;QACD,OAAO,QAAQ,CAAC,GAAG,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IAC9D,CAAC;IACD,OAAO;QACL,IAAI;QACJ,IAAI,EAAE,CAAC,KAAc,EAAE,aAAsB,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC;YAClG,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,aAAa,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC;QACzE,OAAO,EAAE,CAAC,OAAe,EAAE,EAAE;YAC3B,IAAI,WAAW,CAAC,MAAM,CAAC;gBAAE,MAAM,CAAC,KAAK,CAAC,KAAK,KAAK,CAAC,SAAS,EAAE,MAAM,CAAC,IAAI,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QAC1I,CAAC;QACD,KAAK,EAAE,CAAC,OAAe,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC;YAC1D,CAAC,CAAC,KAAK,KAAK,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,IAAI,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,OAAO,QAAQ,CAAC,KAAK,OAAO,EAAE,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI;YAC1H,CAAC,CAAC,YAAY,OAAO,IAAI,CAAC;KAC7B,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { type RunRecord } from "./records.js";
2
+ export declare function dashboard(input: RunRecord[]): string;
@@ -0,0 +1,106 @@
1
+ import { parseRecords } from "./records.js";
2
+ export function dashboard(input) {
3
+ const data = JSON.stringify(parseRecords(input)).replaceAll("<", "\\u003c").replaceAll(">", "\\u003e").replaceAll("&", "\\u0026").replaceAll("\u2028", "\\u2028").replaceAll("\u2029", "\\u2029");
4
+ return `<!doctype html>
5
+ <html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1">
6
+ <title>Crewbie usage and model report</title>
7
+ <script>
8
+ (() => {
9
+ const param = new URLSearchParams(window.location.search).get("scoutTheme");
10
+ const theme =
11
+ param || (window.matchMedia("(prefers-color-scheme: dark)").matches ? "dark" : "light");
12
+ document.documentElement.setAttribute("data-theme", theme);
13
+ })();
14
+ </script>
15
+ <style>
16
+ :root {
17
+ color-scheme: light;
18
+ --cp-bg: #f7f4ef;
19
+ --cp-bg-elevated: #fcfbf8;
20
+ --cp-surface: #ffffff;
21
+ --cp-surface-soft: #f5f5f5;
22
+ --cp-border: #dedede;
23
+ --cp-border-strong: #919191;
24
+ --cp-text: #242424;
25
+ --cp-text-muted: #5c5c5c;
26
+ --cp-text-soft: #6f6f6f;
27
+ --cp-accent: #b11f4b;
28
+ --cp-accent-hover: #9a1a41;
29
+ --cp-accent-soft: rgba(177, 31, 75, 0.08);
30
+ --cp-accent-fg: #ffffff;
31
+ --cp-success: #16a34a;
32
+ --cp-danger: #dc2626;
33
+ --cp-warning: #f59e0b;
34
+ --cp-link: #0078d4;
35
+ --cp-shadow: 0 18px 48px rgba(0, 0, 0, 0.12);
36
+ --cp-overlay: rgba(255, 255, 255, 0.8);
37
+ --cp-panel: rgba(255, 255, 255, 0.86);
38
+ --cp-panel-strong: rgba(255, 255, 255, 0.96);
39
+ --cp-sheen: rgba(255, 255, 255, 0.55);
40
+ --cp-highlight: rgba(177, 31, 75, 0.12);
41
+ }
42
+ html[data-theme="dark"] {
43
+ color-scheme: dark;
44
+ --cp-bg: #3d3b3a;
45
+ --cp-bg-elevated: #343231;
46
+ --cp-surface: #292929;
47
+ --cp-surface-soft: #2e2e2e;
48
+ --cp-border: #474747;
49
+ --cp-border-strong: #5f5f5f;
50
+ --cp-text: #dedede;
51
+ --cp-text-muted: #919191;
52
+ --cp-text-soft: #b0b0b0;
53
+ --cp-accent: #fd8ea1;
54
+ --cp-accent-hover: #fb7b91;
55
+ --cp-accent-soft: rgba(253, 142, 161, 0.14);
56
+ --cp-accent-fg: #1a1a1a;
57
+ --cp-success: #4ade80;
58
+ --cp-danger: #f87171;
59
+ --cp-warning: #fbbf24;
60
+ --cp-link: #4da6ff;
61
+ --cp-shadow: 0 18px 48px rgba(0, 0, 0, 0.32);
62
+ --cp-overlay: rgba(41, 41, 41, 0.88);
63
+ --cp-panel: rgba(41, 41, 41, 0.72);
64
+ --cp-panel-strong: rgba(41, 41, 41, 0.96);
65
+ --cp-sheen: rgba(255, 255, 255, 0.04);
66
+ --cp-highlight: rgba(253, 142, 161, 0.12);
67
+ }
68
+ *{box-sizing:border-box}body{margin:0;padding:32px;background:var(--cp-bg);color:var(--cp-text);font:16px "Segoe UI",Aptos,Calibri,-apple-system,BlinkMacSystemFont,sans-serif}
69
+ main{max-width:1400px;margin:auto}h1{font-size:28px;margin:0 0 8px}.muted{color:var(--cp-text-muted)}
70
+ .card{background:var(--cp-surface);border:1px solid var(--cp-border);border-radius:16px;padding:20px;margin:20px 0}
71
+ .filters{display:flex;flex-wrap:wrap;gap:16px}label{display:flex;flex-direction:column;gap:8px}input,select{font:inherit;color:var(--cp-text);background:var(--cp-surface);border:1px solid var(--cp-border-strong);border-radius:.625rem;padding:8px}
72
+ .table{overflow:auto}table{width:100%;border-collapse:collapse}th,td{text-align:left;border-bottom:1px solid var(--cp-border);padding:12px;vertical-align:top}th{color:var(--cp-text-muted)}a{color:var(--cp-link)}.mismatch{color:var(--cp-danger)}.unknown{color:var(--cp-text-muted)}:focus-visible{outline:2px solid var(--cp-accent);outline-offset:4px}
73
+ code{font-family:Consolas,"Courier New",Courier,monospace}footer{font-size:14px}
74
+ </style></head><body><main>
75
+ <h1>Crewbie usage and models</h1><p class="muted">A static snapshot. Unknown usage is not zero, and a requested model is not proof of the model used.</p>
76
+ <div class="card filters"><label>Specialist<select id="specialist"><option value="">All specialists</option></select></label>
77
+ <label>Requested model<select id="model"><option value="">All models</option></select></label>
78
+ <label>From<input type="date" id="from"></label><label>Through<input type="date" id="through"></label></div>
79
+ <section class="card" aria-live="polite"><h2>Coverage</h2><p id="coverage"></p><p id="usage"></p></section>
80
+ <div class="card table"><table><caption>Attributable records in the selected range</caption><thead><tr><th>Specialist / work</th><th>Date / status</th><th>Requested model</th><th>Observed model</th><th>Tokens in / out</th><th>Credits / billed amount</th><th>Evidence / memory reads</th></tr></thead><tbody id="runs"></tbody></table></div>
81
+ <footer class="muted">Collected issue and review records are not an exhaustive session ledger. Repository and artifact retention limit coverage. Organization-wide billing is not allocated to specialists. Missing sessions, unallocated charges, and unavailable Actions costs are not inferred. Memory-read attestations are agent reports, not proof of internal model behavior.</footer>
82
+ </main><script>
83
+ const DATA=${data};
84
+ const el=id=>document.getElementById(id);
85
+ for(const [field,id] of [['specialist','specialist'],['requestedModel','model']]){
86
+ for(const value of [...new Set(DATA.map(r=>r[field]))].sort())el(id).add(new Option(value,value));
87
+ }
88
+ function cell(row,text,cls){const td=document.createElement('td');td.textContent=text;if(cls)td.className=cls;row.append(td);return td}
89
+ function safeLink(parent,label,url){if(!/^https:\\/\\/github\\.com\\//.test(url||''))return;const a=document.createElement('a');a.textContent=label;a.href=url;a.rel='noopener noreferrer';parent.append(document.createTextNode(' '),a)}
90
+ function render(){
91
+ const rows=DATA.filter(r=>(!el('specialist').value||r.specialist===el('specialist').value)&&(!el('model').value||r.requestedModel===el('model').value)&&(!el('from').value||r.date.slice(0,10)>=el('from').value)&&(!el('through').value||r.date.slice(0,10)<=el('through').value));
92
+ const known=rows.filter(r=>r.inputTokens!==null&&r.outputTokens!==null);
93
+ const dates=rows.map(r=>r.date.slice(0,10)).sort();
94
+ el('coverage').textContent=rows.length+' records; '+known.length+' with both token measurements. '+(dates.length?'Recorded dates: '+dates[0]+' to '+dates[dates.length-1]+'.':'No records in this range.');
95
+ const metric=k=>{const measured=rows.filter(r=>r[k]!==null);return measured.length?measured.reduce((sum,r)=>sum+r[k],0).toLocaleString()+' ('+measured.length+'/'+rows.length+' records)':'Unavailable'};
96
+ el('usage').textContent='Input tokens: '+metric('inputTokens')+'. Output tokens: '+metric('outputTokens')+'. AI credits: '+metric('credits')+'. Currency totals are not mixed across currencies or incomplete sources.';
97
+ el('runs').replaceChildren();
98
+ for(const r of rows){const tr=document.createElement('tr');const work=cell(tr,r.specialist);safeLink(work,'Issue',r.issue);safeLink(work,'PR',r.pullRequest);cell(tr,r.date.slice(0,10)+' / '+r.status);cell(tr,r.requestedModel);
99
+ cell(tr,r.observedModel===null?'Unverified':r.observedModel,r.observedModel===null?'unknown':r.observedModel!==r.requestedModel?'mismatch':'');
100
+ cell(tr,(r.inputTokens??'Unknown')+' / '+(r.outputTokens??'Unknown'));cell(tr,(r.credits??'Unknown')+' / '+(r.currencyAmount===null?'Unknown':r.currencyAmount+' '+r.currency));
101
+ cell(tr,([r.observedModelSource,r.usageSource].filter(Boolean).join('; ')||'No runtime usage evidence')+'; memory reads: '+r.contextStatus);el('runs').append(tr)}
102
+ }
103
+ for(const id of ['specialist','model','from','through'])el(id).addEventListener('change',render);render();
104
+ </script></body></html>`;
105
+ }
106
+ //# sourceMappingURL=dashboard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboard.js","sourceRoot":"","sources":["../../src/reporting/dashboard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAkB,MAAM,cAAc,CAAC;AAE5D,MAAM,UAAU,SAAS,CAAC,KAAkB;IAC1C,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC,UAAU,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,UAAU,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IAClM,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;aA+EI,IAAI;;;;;;;;;;;;;;;;;;;;;wBAqBO,CAAC;AACzB,CAAC"}
@@ -0,0 +1,24 @@
1
+ import type { GitHubApi } from "../tracking/github.js";
2
+ export interface PrUsage {
3
+ sessions: number;
4
+ measuredSessions: number;
5
+ inputTokens: number | null;
6
+ outputTokens: number | null;
7
+ credits: null;
8
+ sources: string[];
9
+ warnings: string[];
10
+ /** Wall-clock minutes of completed workflow runs on the PR head branch (agent sessions and CI); not billed minutes. */
11
+ actionsMinutes: number | null;
12
+ actionsRuns: number;
13
+ }
14
+ export declare class UsageUnavailable extends Error {
15
+ }
16
+ export declare function parseUsageLog(log: string): {
17
+ sessionId: string;
18
+ inputTokens: number;
19
+ outputTokens: number;
20
+ } | null;
21
+ declare function actionsLog(repository: string, runId: number): string;
22
+ export declare function collectPrUsage(client: GitHubApi, repository: string, pr: Record<string, unknown>, readLog?: typeof actionsLog): Promise<PrUsage>;
23
+ export declare function renderPrUsage(usage: PrUsage): string;
24
+ export {};