@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.
- package/LICENSE +21 -0
- package/README.md +253 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +506 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +84 -0
- package/dist/config.js +178 -0
- package/dist/config.js.map +1 -0
- package/dist/core.d.ts +31 -0
- package/dist/core.js +186 -0
- package/dist/core.js.map +1 -0
- package/dist/execution/attribution.d.ts +10 -0
- package/dist/execution/attribution.js +102 -0
- package/dist/execution/attribution.js.map +1 -0
- package/dist/execution/cancel.d.ts +3 -0
- package/dist/execution/cancel.js +59 -0
- package/dist/execution/cancel.js.map +1 -0
- package/dist/execution/capabilities.d.ts +22 -0
- package/dist/execution/capabilities.js +101 -0
- package/dist/execution/capabilities.js.map +1 -0
- package/dist/execution/controls.d.ts +51 -0
- package/dist/execution/controls.js +257 -0
- package/dist/execution/controls.js.map +1 -0
- package/dist/execution/dispatch.d.ts +69 -0
- package/dist/execution/dispatch.js +831 -0
- package/dist/execution/dispatch.js.map +1 -0
- package/dist/execution/fix.d.ts +3 -0
- package/dist/execution/fix.js +267 -0
- package/dist/execution/fix.js.map +1 -0
- package/dist/execution/github.d.ts +15 -0
- package/dist/execution/github.js +43 -0
- package/dist/execution/github.js.map +1 -0
- package/dist/execution/merge.d.ts +15 -0
- package/dist/execution/merge.js +133 -0
- package/dist/execution/merge.js.map +1 -0
- package/dist/execution/planning-approval.d.ts +33 -0
- package/dist/execution/planning-approval.js +227 -0
- package/dist/execution/planning-approval.js.map +1 -0
- package/dist/execution/pr-review.d.ts +86 -0
- package/dist/execution/pr-review.js +339 -0
- package/dist/execution/pr-review.js.map +1 -0
- package/dist/execution/review-loop.d.ts +63 -0
- package/dist/execution/review-loop.js +463 -0
- package/dist/execution/review-loop.js.map +1 -0
- package/dist/execution/test-feature.d.ts +29 -0
- package/dist/execution/test-feature.js +240 -0
- package/dist/execution/test-feature.js.map +1 -0
- package/dist/execution/watch.d.ts +12 -0
- package/dist/execution/watch.js +34 -0
- package/dist/execution/watch.js.map +1 -0
- package/dist/memory/context.d.ts +14 -0
- package/dist/memory/context.js +82 -0
- package/dist/memory/context.js.map +1 -0
- package/dist/memory/improvement.d.ts +25 -0
- package/dist/memory/improvement.js +168 -0
- package/dist/memory/improvement.js.map +1 -0
- package/dist/memory/launch.d.ts +9 -0
- package/dist/memory/launch.js +65 -0
- package/dist/memory/launch.js.map +1 -0
- package/dist/memory/runner.d.ts +4 -0
- package/dist/memory/runner.js +74 -0
- package/dist/memory/runner.js.map +1 -0
- package/dist/memory/state.d.ts +10 -0
- package/dist/memory/state.js +42 -0
- package/dist/memory/state.js.map +1 -0
- package/dist/presentation.d.ts +19 -0
- package/dist/presentation.js +128 -0
- package/dist/presentation.js.map +1 -0
- package/dist/reporting/dashboard.d.ts +2 -0
- package/dist/reporting/dashboard.js +106 -0
- package/dist/reporting/dashboard.js.map +1 -0
- package/dist/reporting/pr-usage.d.ts +24 -0
- package/dist/reporting/pr-usage.js +179 -0
- package/dist/reporting/pr-usage.js.map +1 -0
- package/dist/reporting/records.d.ts +28 -0
- package/dist/reporting/records.js +152 -0
- package/dist/reporting/records.js.map +1 -0
- package/dist/setup/agents.d.ts +8 -0
- package/dist/setup/agents.js +83 -0
- package/dist/setup/agents.js.map +1 -0
- package/dist/setup/assessment.d.ts +31 -0
- package/dist/setup/assessment.js +75 -0
- package/dist/setup/assessment.js.map +1 -0
- package/dist/setup/auto-loaded.d.ts +17 -0
- package/dist/setup/auto-loaded.js +49 -0
- package/dist/setup/auto-loaded.js.map +1 -0
- package/dist/setup/copilot-version.d.ts +7 -0
- package/dist/setup/copilot-version.js +39 -0
- package/dist/setup/copilot-version.js.map +1 -0
- package/dist/setup/copilot.d.ts +22 -0
- package/dist/setup/copilot.js +164 -0
- package/dist/setup/copilot.js.map +1 -0
- package/dist/setup/init.d.ts +41 -0
- package/dist/setup/init.js +315 -0
- package/dist/setup/init.js.map +1 -0
- package/dist/setup/install.d.ts +12 -0
- package/dist/setup/install.js +211 -0
- package/dist/setup/install.js.map +1 -0
- package/dist/setup/instruction-quality.d.ts +25 -0
- package/dist/setup/instruction-quality.js +258 -0
- package/dist/setup/instruction-quality.js.map +1 -0
- package/dist/setup/inventory.d.ts +26 -0
- package/dist/setup/inventory.js +78 -0
- package/dist/setup/inventory.js.map +1 -0
- package/dist/setup/onboarding.d.ts +40 -0
- package/dist/setup/onboarding.js +472 -0
- package/dist/setup/onboarding.js.map +1 -0
- package/dist/setup/package.d.ts +2 -0
- package/dist/setup/package.js +8 -0
- package/dist/setup/package.js.map +1 -0
- package/dist/setup/planning-workflow.d.ts +3 -0
- package/dist/setup/planning-workflow.js +250 -0
- package/dist/setup/planning-workflow.js.map +1 -0
- package/dist/setup/repository-map.d.ts +34 -0
- package/dist/setup/repository-map.js +89 -0
- package/dist/setup/repository-map.js.map +1 -0
- package/dist/setup/review.d.ts +8 -0
- package/dist/setup/review.js +137 -0
- package/dist/setup/review.js.map +1 -0
- package/dist/setup/team.d.ts +18 -0
- package/dist/setup/team.js +172 -0
- package/dist/setup/team.js.map +1 -0
- package/dist/setup/templates.d.ts +11 -0
- package/dist/setup/templates.js +494 -0
- package/dist/setup/templates.js.map +1 -0
- package/dist/setup/terminal.d.ts +12 -0
- package/dist/setup/terminal.js +11 -0
- package/dist/setup/terminal.js.map +1 -0
- package/dist/setup/update.d.ts +6 -0
- package/dist/setup/update.js +71 -0
- package/dist/setup/update.js.map +1 -0
- package/dist/specification/batch.d.ts +50 -0
- package/dist/specification/batch.js +127 -0
- package/dist/specification/batch.js.map +1 -0
- package/dist/specification/plan-checks.d.ts +6 -0
- package/dist/specification/plan-checks.js +73 -0
- package/dist/specification/plan-checks.js.map +1 -0
- package/dist/specification/planning.d.ts +26 -0
- package/dist/specification/planning.js +507 -0
- package/dist/specification/planning.js.map +1 -0
- package/dist/specification/prose.d.ts +1 -0
- package/dist/specification/prose.js +15 -0
- package/dist/specification/prose.js.map +1 -0
- package/dist/tracking/ado.d.ts +19 -0
- package/dist/tracking/ado.js +128 -0
- package/dist/tracking/ado.js.map +1 -0
- package/dist/tracking/github.d.ts +8 -0
- package/dist/tracking/github.js +112 -0
- package/dist/tracking/github.js.map +1 -0
- package/dist/tracking/issues.d.ts +28 -0
- package/dist/tracking/issues.js +180 -0
- package/dist/tracking/issues.js.map +1 -0
- package/dist/tracking/native.d.ts +5 -0
- package/dist/tracking/native.js +30 -0
- package/dist/tracking/native.js.map +1 -0
- package/dist/tracking/refs.d.ts +14 -0
- package/dist/tracking/refs.js +56 -0
- package/dist/tracking/refs.js.map +1 -0
- package/dist/tracking/sources.d.ts +5 -0
- package/dist/tracking/sources.js +29 -0
- package/dist/tracking/sources.js.map +1 -0
- package/docs/operations.md +1114 -0
- package/examples/batch.json +27 -0
- package/examples/runs.json +22 -0
- 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":"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"}
|
|
@@ -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 {};
|