@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,56 @@
|
|
|
1
|
+
import { GitHubError, record, string } from "../core.js";
|
|
2
|
+
/**
|
|
3
|
+
* Crewbie's ledger refs (claims, launches, pause, dispatch lock) live under refs/crewbie/, outside refs/heads and
|
|
4
|
+
* refs/tags, so creating them never fires a repository's `on: push` workflows. Releases before 0.1.0-alpha.44 wrote
|
|
5
|
+
* them as tags; those legacy refs are still read so existing claims and launch allowances keep counting.
|
|
6
|
+
*/
|
|
7
|
+
const ROOT = "crewbie";
|
|
8
|
+
const LEGACY = "tags/crewbie";
|
|
9
|
+
/** Full ref for a ledger entry, e.g. ledgerRef("claims/3") === "refs/crewbie/claims/3". */
|
|
10
|
+
export function ledgerRef(name) { return `refs/${ROOT}/${name}`; }
|
|
11
|
+
export async function listLedger(client, repository, prefix) {
|
|
12
|
+
const entries = [];
|
|
13
|
+
for (const root of [ROOT, LEGACY]) {
|
|
14
|
+
const refs = await client.request("GET", `/repos/${repository}/git/matching-refs/${root}/${prefix}`);
|
|
15
|
+
if (!Array.isArray(refs))
|
|
16
|
+
throw new Error("GitHub returned an invalid Crewbie ref ledger.");
|
|
17
|
+
for (const raw of refs) {
|
|
18
|
+
const item = record(raw, "ledger ref");
|
|
19
|
+
const ref = string(item.ref, "ledger ref name");
|
|
20
|
+
if (!ref.startsWith(`refs/${root}/${prefix}`))
|
|
21
|
+
throw new Error(`Unexpected Crewbie ledger ref: ${ref}`);
|
|
22
|
+
entries.push({ name: ref.slice(`refs/${root}/`.length), ref, ...(item.object === undefined ? {} : { object: record(item.object, "ledger ref object") }) });
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
return entries;
|
|
26
|
+
}
|
|
27
|
+
export async function ledgerHas(client, repository, name) {
|
|
28
|
+
for (const root of [ROOT, LEGACY]) {
|
|
29
|
+
try {
|
|
30
|
+
await client.request("GET", `/repos/${repository}/git/ref/${root}/${name}`);
|
|
31
|
+
return true;
|
|
32
|
+
}
|
|
33
|
+
catch (error) {
|
|
34
|
+
if (!(error instanceof GitHubError && error.status === 404))
|
|
35
|
+
throw error;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
return false;
|
|
39
|
+
}
|
|
40
|
+
/** Atomically creates a ledger ref; GitHub answers 422 when it already exists. */
|
|
41
|
+
export async function createLedger(client, repository, name, sha) {
|
|
42
|
+
await client.request("POST", `/repos/${repository}/git/refs`, { ref: ledgerRef(name), sha });
|
|
43
|
+
}
|
|
44
|
+
/** Deletes the ledger ref; with legacy, deletes whichever of the current and legacy refs exist. */
|
|
45
|
+
export async function deleteLedger(client, repository, name, legacy = false) {
|
|
46
|
+
for (const root of legacy ? [ROOT, LEGACY] : [ROOT]) {
|
|
47
|
+
try {
|
|
48
|
+
await client.request("DELETE", `/repos/${repository}/git/refs/${root}/${name}`);
|
|
49
|
+
}
|
|
50
|
+
catch (error) {
|
|
51
|
+
if (!legacy || !(error instanceof GitHubError && [404, 422].includes(error.status)))
|
|
52
|
+
throw error;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=refs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"refs.js","sourceRoot":"","sources":["../../src/tracking/refs.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { Config } from "../config.js";
|
|
2
|
+
import type { SourceReference } from "../specification/batch.js";
|
|
3
|
+
import type { GitHubApi } from "./github.js";
|
|
4
|
+
import { type AdoApi } from "./ado.js";
|
|
5
|
+
export declare function verifySources(sources: SourceReference[], github: GitHubApi, config: Config, ado?: AdoApi): Promise<void>;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { hash, integer, record, string } from "../core.js";
|
|
2
|
+
import { importWorkItem } from "./ado.js";
|
|
3
|
+
export async function verifySources(sources, github, config, ado) {
|
|
4
|
+
for (const source of sources) {
|
|
5
|
+
const gh = /^https:\/\/github\.com\/([A-Za-z0-9_.-]+\/[A-Za-z0-9_.-]+)\/issues\/(\d+)$/.exec(source.uri);
|
|
6
|
+
if (gh) {
|
|
7
|
+
const issue = record(await github.request("GET", `/repos/${gh[1]}/issues/${gh[2]}`), "source issue");
|
|
8
|
+
const content = `${string(issue.title, "source title")}\n\n${typeof issue.body === "string" ? issue.body : ""}`;
|
|
9
|
+
const matches = source.fingerprint ? source.fingerprint === hash(content) : source.revision === issue.updated_at;
|
|
10
|
+
if (!matches)
|
|
11
|
+
throw new Error(`Source changed: ${source.uri}. Reconcile and approve the batch again.`);
|
|
12
|
+
}
|
|
13
|
+
else if (source.uri.startsWith("https://dev.azure.com/")) {
|
|
14
|
+
if (!config.ado || !ado)
|
|
15
|
+
throw new Error("ADO source verification requires the configured integration and credential.");
|
|
16
|
+
const url = new URL(source.uri);
|
|
17
|
+
const parts = url.pathname.split("/").filter(Boolean).map(decodeURIComponent);
|
|
18
|
+
if (parts.length !== 5 || parts[0] !== config.ado.organization || parts[1] !== config.ado.project || parts[2] !== "_workitems" || parts[3] !== "edit") {
|
|
19
|
+
throw new Error("ADO source must match the configured organization and project.");
|
|
20
|
+
}
|
|
21
|
+
const current = await importWorkItem(ado, config.ado, integer(Number(parts[4]), "source work item"));
|
|
22
|
+
const matches = source.fingerprint ? current.fingerprint === source.fingerprint : current.revision === source.revision;
|
|
23
|
+
if (!matches)
|
|
24
|
+
throw new Error(`ADO requirements changed: ${source.uri}. Reconcile and reapprove; no source fields were overwritten.`);
|
|
25
|
+
}
|
|
26
|
+
// Other inputs are approved text snapshots, not continuously synchronized trackers.
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=sources.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sources.js","sourceRoot":"","sources":["../../src/tracking/sources.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAI3D,OAAO,EAAE,cAAc,EAAe,MAAM,UAAU,CAAC;AAEvD,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAA0B,EAAE,MAAiB,EAAE,MAAc,EAAE,GAAY;IAC7G,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,EAAE,GAAG,4EAA4E,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACzG,IAAI,EAAE,EAAE,CAAC;YACP,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,cAAc,CAAC,CAAC;YACrG,MAAM,OAAO,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,cAAc,CAAC,OAAO,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;YAChH,MAAM,OAAO,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,KAAK,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,KAAK,KAAK,CAAC,UAAU,CAAC;YACjH,IAAI,CAAC,OAAO;gBAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,MAAM,CAAC,GAAG,0CAA0C,CAAC,CAAC;QACzG,CAAC;aAAM,IAAI,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,wBAAwB,CAAC,EAAE,CAAC;YAC3D,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG;gBAAE,MAAM,IAAI,KAAK,CAAC,6EAA6E,CAAC,CAAC;YACxH,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAChC,MAAM,KAAK,GAAG,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;YAC9E,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,GAAG,CAAC,YAAY,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,GAAG,CAAC,OAAO,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,YAAY,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,MAAM,EAAE,CAAC;gBACtJ,MAAM,IAAI,KAAK,CAAC,gEAAgE,CAAC,CAAC;YACpF,CAAC;YACD,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,kBAAkB,CAAC,CAAC,CAAC;YACrG,MAAM,OAAO,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,KAAK,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,KAAK,MAAM,CAAC,QAAQ,CAAC;YACvH,IAAI,CAAC,OAAO;gBAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,MAAM,CAAC,GAAG,+DAA+D,CAAC,CAAC;QACxI,CAAC;QACD,oFAAoF;IACtF,CAAC;AACH,CAAC"}
|