cohorte 2.10.1 → 3.0.0-dev.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +7 -0
- package/assets/manifest.json +193 -0
- package/assets/migrations/config/README.md +12 -0
- package/assets/migrations/state/0001_init.sql +154 -0
- package/assets/prompts/README.md +11 -0
- package/assets/prompts/agents/fixer.md +7 -0
- package/assets/prompts/agents/implementer.md +12 -0
- package/assets/prompts/agents/reviewer.md +8 -0
- package/assets/prompts/agents/security-reviewer.md +7 -0
- package/assets/prompts/phases/build.md +5 -0
- package/assets/prompts/phases/review.md +5 -0
- package/assets/prompts/phases/test.md +5 -0
- package/assets/prompts/system.md +11 -0
- package/assets/schemas/agent-output.schema.json +225 -0
- package/assets/schemas/auth-status.schema.json +87 -0
- package/assets/schemas/command-result.schema.json +192 -0
- package/assets/schemas/commands.schema.json +952 -0
- package/assets/schemas/config.schema.json +2259 -0
- package/assets/schemas/doctor-report.schema.json +104 -0
- package/assets/schemas/events.schema.json +8514 -0
- package/assets/schemas/fake-script.schema.json +549 -0
- package/assets/schemas/inspect.schema.json +3133 -0
- package/assets/schemas/manifest.schema.json +79 -0
- package/assets/schemas/ownership.schema.json +52 -0
- package/assets/schemas/policy-verdict.schema.json +282 -0
- package/assets/schemas/project-model.schema.json +783 -0
- package/assets/schemas/project-status.schema.json +217 -0
- package/assets/schemas/reconcile-plan.schema.json +154 -0
- package/assets/schemas/run-diff.schema.json +177 -0
- package/assets/schemas/run-snapshot-manifest.schema.json +2104 -0
- package/assets/schemas/run-state.schema.json +1755 -0
- package/assets/schemas/runtime-capabilities.schema.json +1545 -0
- package/assets/schemas/sandbox-capabilities.schema.json +116 -0
- package/assets/schemas/skill.schema.json +87 -0
- package/assets/schemas/spec.schema.json +202 -0
- package/assets/schemas/tool-catalogue.schema.json +655 -0
- package/assets/schemas/trust-record.schema.json +38 -0
- package/assets/skills/README.md +9 -0
- package/assets/skills/inspect-surface.md +4 -0
- package/dist/agent-host.mjs +2187 -0
- package/dist/agent-host.mjs.map +1 -0
- package/dist/bundle-manifest.json +104 -0
- package/dist/chunks/__host-DgGPyco9.mjs +18 -0
- package/dist/chunks/__host-DgGPyco9.mjs.map +1 -0
- package/dist/chunks/approve-Cv135UqI.mjs +19 -0
- package/dist/chunks/approve-Cv135UqI.mjs.map +1 -0
- package/dist/chunks/auth-BT5oVp76.mjs +132 -0
- package/dist/chunks/auth-BT5oVp76.mjs.map +1 -0
- package/dist/chunks/auth-CYOh60KG.mjs +93 -0
- package/dist/chunks/auth-CYOh60KG.mjs.map +1 -0
- package/dist/chunks/brainstorm-BwKA6yZP.mjs +7 -0
- package/dist/chunks/brainstorm-BwKA6yZP.mjs.map +1 -0
- package/dist/chunks/cancel-KV_cpsqS.mjs +15 -0
- package/dist/chunks/cancel-KV_cpsqS.mjs.map +1 -0
- package/dist/chunks/canonical-C8UxeEmB.mjs +57 -0
- package/dist/chunks/canonical-C8UxeEmB.mjs.map +1 -0
- package/dist/chunks/catalogue-BvwSrM_j.mjs +1549 -0
- package/dist/chunks/catalogue-BvwSrM_j.mjs.map +1 -0
- package/dist/chunks/compose-Dvxunpto.mjs +7307 -0
- package/dist/chunks/compose-Dvxunpto.mjs.map +1 -0
- package/dist/chunks/config-DefHA2Lw.mjs +96 -0
- package/dist/chunks/config-DefHA2Lw.mjs.map +1 -0
- package/dist/chunks/contract-BkMjU1kR.mjs +295 -0
- package/dist/chunks/contract-BkMjU1kR.mjs.map +1 -0
- package/dist/chunks/contract-bQ9FJl4N.mjs +123 -0
- package/dist/chunks/contract-bQ9FJl4N.mjs.map +1 -0
- package/dist/chunks/deny-ClTxSvHJ.mjs +15 -0
- package/dist/chunks/deny-ClTxSvHJ.mjs.map +1 -0
- package/dist/chunks/diff-Qw0II0sj.mjs +101 -0
- package/dist/chunks/diff-Qw0II0sj.mjs.map +1 -0
- package/dist/chunks/discover-eS01-me1.mjs +21 -0
- package/dist/chunks/discover-eS01-me1.mjs.map +1 -0
- package/dist/chunks/doctor-B-H2UK5e.mjs +222 -0
- package/dist/chunks/doctor-B-H2UK5e.mjs.map +1 -0
- package/dist/chunks/fix-D4Tj8RVA.mjs +18 -0
- package/dist/chunks/fix-D4Tj8RVA.mjs.map +1 -0
- package/dist/chunks/gc-BBXlBF5w.mjs +161 -0
- package/dist/chunks/gc-BBXlBF5w.mjs.map +1 -0
- package/dist/chunks/init-BUnzIkeE.mjs +63 -0
- package/dist/chunks/init-BUnzIkeE.mjs.map +1 -0
- package/dist/chunks/inspect-Buby4cQD.mjs +22 -0
- package/dist/chunks/inspect-Buby4cQD.mjs.map +1 -0
- package/dist/chunks/logs-Giq5sUau.mjs +25 -0
- package/dist/chunks/logs-Giq5sUau.mjs.map +1 -0
- package/dist/chunks/migrate-DybihKzZ.mjs +33 -0
- package/dist/chunks/migrate-DybihKzZ.mjs.map +1 -0
- package/dist/chunks/models-Btp6X2YZ.mjs +24 -0
- package/dist/chunks/models-Btp6X2YZ.mjs.map +1 -0
- package/dist/chunks/pause-BASBfKLO.mjs +16 -0
- package/dist/chunks/pause-BASBfKLO.mjs.map +1 -0
- package/dist/chunks/policy-DUIgzF3W.mjs +139 -0
- package/dist/chunks/policy-DUIgzF3W.mjs.map +1 -0
- package/dist/chunks/providers-Dx78imKj.mjs +19 -0
- package/dist/chunks/providers-Dx78imKj.mjs.map +1 -0
- package/dist/chunks/reconcile-Bhy3IIYo.mjs +50 -0
- package/dist/chunks/reconcile-Bhy3IIYo.mjs.map +1 -0
- package/dist/chunks/render-DyZr5Lgi.mjs +53 -0
- package/dist/chunks/render-DyZr5Lgi.mjs.map +1 -0
- package/dist/chunks/resume-GJQRb2Eb.mjs +15 -0
- package/dist/chunks/resume-GJQRb2Eb.mjs.map +1 -0
- package/dist/chunks/retry-CLrUem1H.mjs +15 -0
- package/dist/chunks/retry-CLrUem1H.mjs.map +1 -0
- package/dist/chunks/review-BDdjb6kB.mjs +17 -0
- package/dist/chunks/review-BDdjb6kB.mjs.map +1 -0
- package/dist/chunks/run-CgTWYlcd.mjs +82 -0
- package/dist/chunks/run-CgTWYlcd.mjs.map +1 -0
- package/dist/chunks/run-tool-C3rAv4XF.mjs +26 -0
- package/dist/chunks/run-tool-C3rAv4XF.mjs.map +1 -0
- package/dist/chunks/scan-8Gy_B6kI.mjs +122 -0
- package/dist/chunks/scan-8Gy_B6kI.mjs.map +1 -0
- package/dist/chunks/schema-C9QbUW4H.mjs +578 -0
- package/dist/chunks/schema-C9QbUW4H.mjs.map +1 -0
- package/dist/chunks/send-BdnJ85Nz.mjs +19 -0
- package/dist/chunks/send-BdnJ85Nz.mjs.map +1 -0
- package/dist/chunks/ship-DTuLGoaJ.mjs +19 -0
- package/dist/chunks/ship-DTuLGoaJ.mjs.map +1 -0
- package/dist/chunks/shutdown-BM92Iyv2.mjs +15 -0
- package/dist/chunks/shutdown-BM92Iyv2.mjs.map +1 -0
- package/dist/chunks/skip-DZG5kpcH.mjs +18 -0
- package/dist/chunks/skip-DZG5kpcH.mjs.map +1 -0
- package/dist/chunks/spec-Bq0P3jVh.mjs +20 -0
- package/dist/chunks/spec-Bq0P3jVh.mjs.map +1 -0
- package/dist/chunks/src-CId6kMsY.mjs +1689 -0
- package/dist/chunks/src-CId6kMsY.mjs.map +1 -0
- package/dist/chunks/src-CfAOde7C.mjs +5403 -0
- package/dist/chunks/src-CfAOde7C.mjs.map +1 -0
- package/dist/chunks/src-CmFjh4M0.mjs +928 -0
- package/dist/chunks/src-CmFjh4M0.mjs.map +1 -0
- package/dist/chunks/src-Cu3TxNob.mjs +783 -0
- package/dist/chunks/src-Cu3TxNob.mjs.map +1 -0
- package/dist/chunks/src-DcU4IXMe.mjs +117 -0
- package/dist/chunks/src-DcU4IXMe.mjs.map +1 -0
- package/dist/chunks/src-s7YRvk0t.mjs +2116 -0
- package/dist/chunks/src-s7YRvk0t.mjs.map +1 -0
- package/dist/chunks/status-SMjiOMYy.mjs +29 -0
- package/dist/chunks/status-SMjiOMYy.mjs.map +1 -0
- package/dist/chunks/tail-BuhT-2PH.mjs +25 -0
- package/dist/chunks/tail-BuhT-2PH.mjs.map +1 -0
- package/dist/chunks/update-BXIppsbi.mjs +16 -0
- package/dist/chunks/update-BXIppsbi.mjs.map +1 -0
- package/dist/cli.mjs +175 -0
- package/dist/cli.mjs.map +1 -0
- package/package.json +17 -32
- package/CHANGELOG.md +0 -1461
- package/bin/cli.js +0 -817
- package/bin/report.js +0 -141
- package/core/adapter/render.js +0 -415
- package/core/agents/implementer.template.md +0 -142
- package/core/agents/profile-reader.md +0 -50
- package/core/agents/release.md +0 -58
- package/core/agents/review.md +0 -179
- package/core/commands/cohorte-align-ds.md +0 -33
- package/core/commands/cohorte-audit.md +0 -58
- package/core/commands/cohorte-brainstorm.md +0 -70
- package/core/commands/cohorte-build.md +0 -219
- package/core/commands/cohorte-doctor.md +0 -194
- package/core/commands/cohorte-fix.md +0 -80
- package/core/commands/cohorte-fleet.md +0 -103
- package/core/commands/cohorte-init-pipeline.md +0 -31
- package/core/commands/cohorte-intake.md +0 -92
- package/core/commands/cohorte-patch.md +0 -118
- package/core/commands/cohorte-refactor.md +0 -59
- package/core/commands/cohorte-retro.md +0 -85
- package/core/commands/cohorte-review.md +0 -270
- package/core/commands/cohorte-ship.md +0 -122
- package/core/commands/cohorte-spec.md +0 -101
- package/core/commands/cohorte-update-pipeline.md +0 -165
- package/core/hooks/gate.py +0 -588
- package/core/runtimes/claude.json +0 -74
- package/core/runtimes/codex.json +0 -85
- package/core/runtimes/cursor.json +0 -76
- package/core/runtimes/gemini.json +0 -76
- package/core/runtimes/opencode.json +0 -73
- package/core/templates/agent-handoff.md +0 -34
- package/core/templates/brainstorm-return.md +0 -36
- package/core/templates/decisions.template.md +0 -42
- package/core/templates/design-brief.md +0 -44
- package/core/templates/patch.template.md +0 -86
- package/core/templates/pr-body.md +0 -25
- package/core/templates/review-feedback.md +0 -38
- package/core/templates/spec.template.md +0 -87
- package/core/templates/steps/init-pipeline/01-detect-stack.md +0 -44
- package/core/templates/steps/init-pipeline/02-interview-gaps.md +0 -55
- package/core/templates/steps/init-pipeline/03-draft-profile.md +0 -10
- package/core/templates/steps/init-pipeline/04-write-render.md +0 -145
- package/core/templates/steps/init-pipeline/05-report.md +0 -12
- package/core/workflows/audit.js +0 -240
- package/core/workflows/loop.js +0 -641
- package/core/workflows/refactor.js +0 -276
- package/core/workflows/review.js +0 -456
- package/install.ps1 +0 -103
- package/install.sh +0 -114
- package/lib/doctor.js +0 -534
- package/lib/runtime.js +0 -139
- package/lib/versions.js +0 -149
- package/lib/yaml.js +0 -129
- package/profile/PIPELINE.template.md +0 -259
- package/profile/SCHEMA.md +0 -735
- package/profile/cohorte.config.template.yaml +0 -43
- package/scripts/assert-gate-hook.mjs +0 -75
- package/scripts/kanban-move.sh +0 -313
- package/scripts/metrics/collect.mjs +0 -531
- package/scripts/metrics/prices.json +0 -42
- package/scripts/new-feature.sh.template +0 -98
- package/scripts/preflight.sh +0 -124
- package/scripts/remove-feature.sh.template +0 -56
- package/scripts/test-adapter.mjs +0 -437
- package/scripts/test-gate.mjs +0 -443
- package/scripts/test-kanban.mjs +0 -304
- package/scripts/test-lib.mjs +0 -356
- package/scripts/test-metrics.mjs +0 -156
- package/scripts/test-workflows.mjs +0 -758
- package/scripts/validate-core.mjs +0 -325
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { n as sha256Hex } from "./canonical-C8UxeEmB.mjs";
|
|
2
|
+
import { N as errorOf, j as CohorteError } from "./src-Cu3TxNob.mjs";
|
|
3
|
+
import { n as createKeyStore, r as createTrustStore } from "./auth-BT5oVp76.mjs";
|
|
4
|
+
import { i as resolveConfig, n as loadConfig } from "./src-DcU4IXMe.mjs";
|
|
5
|
+
import { join } from "node:path";
|
|
6
|
+
import { existsSync } from "node:fs";
|
|
7
|
+
//#region src/commands/run/index.ts
|
|
8
|
+
const run = {
|
|
9
|
+
verb: "run",
|
|
10
|
+
async run(ctx, args) {
|
|
11
|
+
const valueAfter = (flag) => {
|
|
12
|
+
const index = args.positionals.indexOf(flag);
|
|
13
|
+
return index >= 0 ? args.positionals[index + 1] : void 0;
|
|
14
|
+
};
|
|
15
|
+
const profile = valueAfter("--profile") ?? args.positionals.find((value) => [
|
|
16
|
+
"feature",
|
|
17
|
+
"bugfix",
|
|
18
|
+
"review"
|
|
19
|
+
].includes(value)) ?? "feature";
|
|
20
|
+
if (![
|
|
21
|
+
"feature",
|
|
22
|
+
"bugfix",
|
|
23
|
+
"review"
|
|
24
|
+
].includes(profile)) return 2;
|
|
25
|
+
const spec = args.positionals.find((value, index) => !value.startsWith("--") && args.positionals[index - 1] !== "--profile" && args.positionals[index - 1] !== "--runtime" && args.positionals[index - 1] !== "--script" && args.positionals[index - 1] !== "--model" && ![
|
|
26
|
+
"feature",
|
|
27
|
+
"bugfix",
|
|
28
|
+
"review"
|
|
29
|
+
].includes(value));
|
|
30
|
+
const model = valueAfter("--model");
|
|
31
|
+
const waitValue = valueAfter("--wait");
|
|
32
|
+
const waitMs = waitValue === void 0 ? void 0 : Number(waitValue) * 1e3;
|
|
33
|
+
if (waitValue !== void 0 && (!Number.isFinite(waitMs) || waitMs < 0)) return 2;
|
|
34
|
+
const trustProjectConfig = args.positionals.includes("--trust-project-config");
|
|
35
|
+
let consent;
|
|
36
|
+
if (ctx.env.HOME && existsSync(join(ctx.cwd, ".cohorte", "config.yaml"))) {
|
|
37
|
+
const home = ctx.env.HOME ?? ctx.cwd;
|
|
38
|
+
const loaded = await loadConfig({
|
|
39
|
+
cwd: ctx.cwd,
|
|
40
|
+
home
|
|
41
|
+
});
|
|
42
|
+
const keys = createKeyStore({ directory: join(home, ".cohorte", "keys") });
|
|
43
|
+
const trustStore = createTrustStore({
|
|
44
|
+
directory: join(home, ".cohorte", "trust"),
|
|
45
|
+
keys
|
|
46
|
+
});
|
|
47
|
+
const resolved = await resolveConfig(loaded, {
|
|
48
|
+
trustStore,
|
|
49
|
+
projectKeyId: sha256Hex(loaded.projectRoot).slice(0, 24)
|
|
50
|
+
});
|
|
51
|
+
if (resolved.status === "untrusted" && !trustProjectConfig) throw new CohorteError(errorOf("security/project-policy-untrusted", `project policy is untrusted (${resolved.loosenedKeys.join(", ") || "unknown key"})`));
|
|
52
|
+
if (resolved.status === "untrusted") consent = {
|
|
53
|
+
policySha256: resolved.policySha256,
|
|
54
|
+
via: "cli-flag"
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
const payload = {
|
|
58
|
+
profile,
|
|
59
|
+
unattended: false,
|
|
60
|
+
...spec ? { spec: { path: spec } } : {},
|
|
61
|
+
...valueAfter("--runtime") ? { runtime: valueAfter("--runtime") } : {},
|
|
62
|
+
...valueAfter("--script") ? { fakeScript: valueAfter("--script") } : {},
|
|
63
|
+
...model ? { modelOverrides: { implementer: {
|
|
64
|
+
provider: "default",
|
|
65
|
+
model
|
|
66
|
+
} } } : {},
|
|
67
|
+
...consent ? { consent } : {}
|
|
68
|
+
};
|
|
69
|
+
const result = waitMs === void 0 ? await ctx.controller.send("start", payload) : await ctx.controller.send("start", payload, { waitMs });
|
|
70
|
+
if (result.status === "pending" && result.result && typeof result.result === "object" && "runId" in result.result) {
|
|
71
|
+
const runId = result.result.runId;
|
|
72
|
+
if (runId) await ctx.hostSpawner.spawnDetached(runId);
|
|
73
|
+
}
|
|
74
|
+
if (args.json) ctx.stdio.stdout.write(`${JSON.stringify(result)}\n`);
|
|
75
|
+
else ctx.stdio.stdout.write(`${result.status}\n`);
|
|
76
|
+
return result.status === "rejected" ? 3 : result.status === "pending" ? 4 : 0;
|
|
77
|
+
}
|
|
78
|
+
};
|
|
79
|
+
//#endregion
|
|
80
|
+
export { run as default };
|
|
81
|
+
|
|
82
|
+
//# sourceMappingURL=run-CgTWYlcd.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-CgTWYlcd.mjs","names":[],"sources":["../../../../apps/cli/src/commands/run/index.ts"],"sourcesContent":["// apps/cli/src/commands/run/index.ts — DESIGN §9 verb `run` (PLAN §3 rule 3 \"later units fill\n// stub files that lie inside their owned paths; they never edit ... the registry\"). Wave-0 stub: exits with the\n// documented not-available error (spec 24 `configuration/phase-not-available`); filled by the Wave-4/5\n// unit that owns `apps/cli/src/commands/run/**`.\nimport { existsSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { CohorteError, errorOf, type Sha256, sha256Hex } from '@cohorte/base';\nimport { loadConfig, resolveConfig } from '@cohorte/config';\nimport { createKeyStore, createTrustStore } from '@cohorte/security/auth';\nimport type { CommandModule } from '../../contract/index.ts';\n\nconst run: CommandModule = {\n verb: 'run',\n async run(ctx, args) {\n const valueAfter = (flag: string): string | undefined => {\n const index = args.positionals.indexOf(flag);\n return index >= 0 ? args.positionals[index + 1] : undefined;\n };\n const profile = (valueAfter('--profile') ??\n args.positionals.find((value) => ['feature', 'bugfix', 'review'].includes(value)) ??\n 'feature') as 'feature' | 'bugfix' | 'review';\n if (!['feature', 'bugfix', 'review'].includes(profile)) return 2;\n const spec = args.positionals.find(\n (value, index) =>\n !value.startsWith('--') &&\n args.positionals[index - 1] !== '--profile' &&\n args.positionals[index - 1] !== '--runtime' &&\n args.positionals[index - 1] !== '--script' &&\n args.positionals[index - 1] !== '--model' &&\n !['feature', 'bugfix', 'review'].includes(value),\n );\n const model = valueAfter('--model');\n const waitValue = valueAfter('--wait');\n const waitMs = waitValue === undefined ? undefined : Number(waitValue) * 1000;\n if (waitValue !== undefined && (!Number.isFinite(waitMs) || (waitMs as number) < 0)) return 2;\n const trustProjectConfig = args.positionals.includes('--trust-project-config');\n let consent: { policySha256: Sha256; via: 'cli-flag' } | undefined;\n // Test/fake contexts intentionally omit HOME; a real CLI invocation always\n // supplies it and is the only context allowed to resolve project trust.\n if (ctx.env.HOME && existsSync(join(ctx.cwd, '.cohorte', 'config.yaml'))) {\n const home = ctx.env.HOME ?? ctx.cwd;\n const loaded = await loadConfig({ cwd: ctx.cwd, home });\n const keys = createKeyStore({ directory: join(home, '.cohorte', 'keys') });\n const trustStore = createTrustStore({ directory: join(home, '.cohorte', 'trust'), keys });\n const resolved = await resolveConfig(loaded, {\n trustStore,\n projectKeyId: sha256Hex(loaded.projectRoot).slice(0, 24),\n });\n if (resolved.status === 'untrusted' && !trustProjectConfig) {\n throw new CohorteError(\n errorOf(\n 'security/project-policy-untrusted',\n `project policy is untrusted (${resolved.loosenedKeys.join(', ') || 'unknown key'})`,\n ),\n );\n }\n if (resolved.status === 'untrusted') consent = { policySha256: resolved.policySha256, via: 'cli-flag' };\n }\n const payload = {\n profile,\n unattended: false,\n ...(spec ? { spec: { path: spec } } : {}),\n ...(valueAfter('--runtime') ? { runtime: valueAfter('--runtime') as string } : {}),\n ...(valueAfter('--script') ? { fakeScript: valueAfter('--script') as string } : {}),\n ...(model ? { modelOverrides: { implementer: { provider: 'default', model } } } : {}),\n ...(consent ? { consent } : {}),\n };\n const result =\n waitMs === undefined\n ? await ctx.controller.send('start', payload)\n : await ctx.controller.send('start', payload, { waitMs });\n if (result.status === 'pending' && result.result && typeof result.result === 'object' && 'runId' in result.result) {\n const runId = (result.result as { runId?: string }).runId;\n if (runId) await ctx.hostSpawner.spawnDetached(runId);\n }\n if (args.json) ctx.stdio.stdout.write(`${JSON.stringify(result)}\\n`);\n else ctx.stdio.stdout.write(`${result.status}\\n`);\n return result.status === 'rejected' ? 3 : result.status === 'pending' ? 4 : 0;\n },\n};\n\nexport default run;\n"],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
//#region src/commands/run-tool/index.ts
|
|
2
|
+
const runTool = {
|
|
3
|
+
verb: "run-tool",
|
|
4
|
+
async run(ctx, args) {
|
|
5
|
+
const [runId, tool, inputText, ...justificationParts] = args.positionals;
|
|
6
|
+
if (!runId || !tool || !inputText || justificationParts.length === 0) return 2;
|
|
7
|
+
let input;
|
|
8
|
+
try {
|
|
9
|
+
input = JSON.parse(inputText);
|
|
10
|
+
} catch {
|
|
11
|
+
return 2;
|
|
12
|
+
}
|
|
13
|
+
const result = await ctx.controller.send("run-tool", {
|
|
14
|
+
tool,
|
|
15
|
+
input,
|
|
16
|
+
justification: justificationParts.join(" ")
|
|
17
|
+
}, { runId });
|
|
18
|
+
if (args.json) ctx.stdio.stdout.write(`${JSON.stringify(result)}\n`);
|
|
19
|
+
else ctx.stdio.stdout.write(`${result.status}\n`);
|
|
20
|
+
return result.status === "rejected" ? 3 : result.status === "pending" ? 4 : 0;
|
|
21
|
+
}
|
|
22
|
+
};
|
|
23
|
+
//#endregion
|
|
24
|
+
export { runTool as default };
|
|
25
|
+
|
|
26
|
+
//# sourceMappingURL=run-tool-C3rAv4XF.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-tool-C3rAv4XF.mjs","names":[],"sources":["../../../../apps/cli/src/commands/run-tool/index.ts"],"sourcesContent":["import type { CommandModule } from '../../contract/index.ts';\n\nconst runTool: CommandModule = {\n verb: 'run-tool',\n async run(ctx, args) {\n const [runId, tool, inputText, ...justificationParts] = args.positionals;\n if (!runId || !tool || !inputText || justificationParts.length === 0) return 2;\n let input: unknown;\n try {\n input = JSON.parse(inputText);\n } catch {\n return 2;\n }\n const result = await ctx.controller.send(\n 'run-tool',\n { tool, input: input as never, justification: justificationParts.join(' ') },\n { runId },\n );\n if (args.json) ctx.stdio.stdout.write(`${JSON.stringify(result)}\\n`);\n else ctx.stdio.stdout.write(`${result.status}\\n`);\n return result.status === 'rejected' ? 3 : result.status === 'pending' ? 4 : 0;\n },\n};\n\nexport default runTool;\n"],"mappings":";AAEA,MAAM,UAAyB;CAC7B,MAAM;CACN,MAAM,IAAI,KAAK,MAAM;EACnB,MAAM,CAAC,OAAO,MAAM,WAAW,GAAG,sBAAsB,KAAK;EAC7D,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,aAAa,mBAAmB,WAAW,GAAG,OAAO;EAC7E,IAAI;EACJ,IAAI;GACF,QAAQ,KAAK,MAAM,SAAS;EAC9B,QAAQ;GACN,OAAO;EACT;EACA,MAAM,SAAS,MAAM,IAAI,WAAW,KAClC,YACA;GAAE;GAAa;GAAgB,eAAe,mBAAmB,KAAK,GAAG;EAAE,GAC3E,EAAE,MAAM,CACV;EACA,IAAI,KAAK,MAAM,IAAI,MAAM,OAAO,MAAM,GAAG,KAAK,UAAU,MAAM,EAAE,GAAG;OAC9D,IAAI,MAAM,OAAO,MAAM,GAAG,OAAO,OAAO,GAAG;EAChD,OAAO,OAAO,WAAW,aAAa,IAAI,OAAO,WAAW,YAAY,IAAI;CAC9E;AACF"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { readFile, readdir } from "node:fs/promises";
|
|
2
|
+
import { join, relative } from "node:path";
|
|
3
|
+
//#region ../../packages/project-model/src/scan/index.ts
|
|
4
|
+
async function filesUnder(root) {
|
|
5
|
+
const found = [];
|
|
6
|
+
const visit = async (dir) => {
|
|
7
|
+
try {
|
|
8
|
+
const entries = await readdir(dir, { withFileTypes: true });
|
|
9
|
+
for (const entry of entries.sort((a, b) => a.name.localeCompare(b.name))) {
|
|
10
|
+
if (entry.name === ".git" || entry.name === "node_modules" || entry.name === ".cohorte" || entry.name === ".pi" || entry.name === ".build" || entry.name === "dist" || entry.name === "coverage") continue;
|
|
11
|
+
const path = join(dir, entry.name);
|
|
12
|
+
if (entry.isDirectory()) await visit(path);
|
|
13
|
+
else if (entry.isFile()) found.push(relative(root, path).split("\\").join("/"));
|
|
14
|
+
}
|
|
15
|
+
} catch {
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
};
|
|
19
|
+
await visit(root);
|
|
20
|
+
return found.sort();
|
|
21
|
+
}
|
|
22
|
+
function field(value, detector, sources, className = "observed") {
|
|
23
|
+
return {
|
|
24
|
+
value,
|
|
25
|
+
class: className,
|
|
26
|
+
provenance: {
|
|
27
|
+
detector,
|
|
28
|
+
sources
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
async function scanRepository(root, options) {
|
|
33
|
+
const files = await filesUnder(root);
|
|
34
|
+
const packagePath = join(root, "package.json");
|
|
35
|
+
let pkg = {};
|
|
36
|
+
try {
|
|
37
|
+
pkg = JSON.parse(await readFile(packagePath, "utf8"));
|
|
38
|
+
} catch {}
|
|
39
|
+
const ext = /* @__PURE__ */ new Map([
|
|
40
|
+
[".ts", "typescript"],
|
|
41
|
+
[".tsx", "typescript"],
|
|
42
|
+
[".js", "javascript"],
|
|
43
|
+
[".jsx", "javascript"],
|
|
44
|
+
[".py", "python"],
|
|
45
|
+
[".go", "go"],
|
|
46
|
+
[".rs", "rust"],
|
|
47
|
+
[".java", "java"]
|
|
48
|
+
]);
|
|
49
|
+
const languages = [...new Set(files.map((file) => ext.get(file.slice(file.lastIndexOf(".")))).filter((value) => value !== void 0))].sort();
|
|
50
|
+
const supportedLocks = [
|
|
51
|
+
"pnpm-lock.yaml",
|
|
52
|
+
"package-lock.json",
|
|
53
|
+
"yarn.lock",
|
|
54
|
+
"bun.lockb"
|
|
55
|
+
];
|
|
56
|
+
const locks = files.filter((file) => supportedLocks.includes(file));
|
|
57
|
+
const lock = locks.length === 1 ? locks[0] : void 0;
|
|
58
|
+
const packageManager = lock === void 0 ? pkg.packageManager?.split("@")[0] ?? null : lock === "pnpm-lock.yaml" ? "pnpm" : lock === "package-lock.json" ? "npm" : lock === "yarn.lock" ? "yarn" : "bun";
|
|
59
|
+
const deps = {
|
|
60
|
+
...pkg.dependencies ?? {},
|
|
61
|
+
...pkg.devDependencies ?? {}
|
|
62
|
+
};
|
|
63
|
+
const frameworks = Object.keys(deps).filter((name) => /^(react|vue|angular|svelte|next|nuxt|express|nestjs|fastify|vite|vitest|jest|playwright)/i.test(name)).sort();
|
|
64
|
+
const scripts = pkg.scripts ?? {};
|
|
65
|
+
const commands = {};
|
|
66
|
+
for (const name of Object.keys(scripts).sort()) {
|
|
67
|
+
const command = scripts[name];
|
|
68
|
+
if (command !== void 0) commands[name] = field(command.split(/\s+/u), "package-json", ["package.json"]);
|
|
69
|
+
}
|
|
70
|
+
const testLocations = files.filter((file) => /(^|\/)(test|tests|__tests__)(\/|$)|\.(test|spec)\./u.test(file));
|
|
71
|
+
const surfaces = {};
|
|
72
|
+
const topLevel = [...new Set(files.map((file) => file.split("/")[0]).filter((name) => Boolean(name && !name.startsWith("."))))];
|
|
73
|
+
for (const name of topLevel.sort()) {
|
|
74
|
+
const paths = files.filter((file) => file === name || file.startsWith(`${name}/`));
|
|
75
|
+
if (paths.length) surfaces[name.replace(/[^A-Za-z0-9_.-]/g, "_")] = { paths: field([`${name}/**`], "workspace-layout", paths) };
|
|
76
|
+
}
|
|
77
|
+
const id = pkg.name?.replace(/^@[^/]+\//u, "") ?? (relative(process.cwd(), root).replace(/[^A-Za-z0-9_.-]/g, "_") || "project");
|
|
78
|
+
const unknowns = locks.length > 1 ? [{
|
|
79
|
+
id: "package-manager",
|
|
80
|
+
question: "more than one supported lockfile was detected; which package manager is authoritative?",
|
|
81
|
+
candidates: [...locks].sort(),
|
|
82
|
+
sources: [...locks].sort()
|
|
83
|
+
}] : [];
|
|
84
|
+
return {
|
|
85
|
+
schemaVersion: 1,
|
|
86
|
+
project: {
|
|
87
|
+
id: field(id, "package-json", ["package.json"], "human"),
|
|
88
|
+
root: field(root, "filesystem", [])
|
|
89
|
+
},
|
|
90
|
+
stack: {
|
|
91
|
+
languages: field(languages, "file-extensions", files),
|
|
92
|
+
packageManager: field(packageManager, "lockfile", lock ? [lock] : []),
|
|
93
|
+
frameworks: field(frameworks, "package-json", ["package.json"])
|
|
94
|
+
},
|
|
95
|
+
surfaces,
|
|
96
|
+
commands,
|
|
97
|
+
testStrategy: field({
|
|
98
|
+
runner: scripts.test ? scripts.test.split(/\s+/u)[0] ?? null : null,
|
|
99
|
+
locations: testLocations
|
|
100
|
+
}, "package-json", ["package.json"]),
|
|
101
|
+
deploymentHints: field(files.filter((file) => /(^|\/)(Dockerfile|Procfile|vercel\.json|fly\.toml)$/u.test(file)), "file-presence", files),
|
|
102
|
+
ownership: field({ codeowners: files.includes(".github/CODEOWNERS") ? ".github/CODEOWNERS" : null }, "file-presence", [".github/CODEOWNERS"]),
|
|
103
|
+
risks: packageManager === null ? [{
|
|
104
|
+
id: "missing-lockfile",
|
|
105
|
+
severity: "medium",
|
|
106
|
+
message: "no supported lockfile was detected",
|
|
107
|
+
sources: []
|
|
108
|
+
}] : [],
|
|
109
|
+
conventions: field(files.filter((file) => /(^|\/)(CONTRIBUTING|conventions)\.(md|yaml)$/iu.test(file)), "file-presence", files),
|
|
110
|
+
generatedArtifacts: field(["manifest.yaml", "project.yaml"], "manifest", [".cohorte/manifest.yaml"]),
|
|
111
|
+
unknowns,
|
|
112
|
+
provenance: {
|
|
113
|
+
generatedAt: options.clock.now(),
|
|
114
|
+
toolVersion: options.toolVersion,
|
|
115
|
+
analysis: "deterministic"
|
|
116
|
+
}
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
//#endregion
|
|
120
|
+
export { scanRepository as t };
|
|
121
|
+
|
|
122
|
+
//# sourceMappingURL=scan-8Gy_B6kI.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scan-8Gy_B6kI.mjs","names":[],"sources":["../../../../packages/project-model/src/scan/index.ts"],"sourcesContent":["// Deterministic repository scan: bounded filesystem observations, never guessed semantics.\n\nimport { readdir, readFile } from 'node:fs/promises';\nimport { join, relative } from 'node:path';\nimport type { Clock } from '@cohorte/base';\nimport type { ProjectModel } from '../contract.ts';\n\nexport interface ScanOptions {\n clock: Clock;\n /** stamped into `provenance.toolVersion` */\n toolVersion: string;\n}\n\nasync function filesUnder(root: string): Promise<string[]> {\n const found: string[] = [];\n const visit = async (dir: string): Promise<void> => {\n try {\n const entries = await readdir(dir, { withFileTypes: true });\n for (const entry of entries.sort((a, b) => a.name.localeCompare(b.name))) {\n if (\n entry.name === '.git' ||\n entry.name === 'node_modules' ||\n entry.name === '.cohorte' ||\n entry.name === '.pi' ||\n entry.name === '.build' ||\n entry.name === 'dist' ||\n entry.name === 'coverage'\n )\n continue;\n const path = join(dir, entry.name);\n if (entry.isDirectory()) await visit(path);\n else if (entry.isFile()) found.push(relative(root, path).split('\\\\').join('/'));\n }\n } catch {\n return;\n }\n };\n await visit(root);\n return found.sort();\n}\n\nfunction field<T>(\n value: T,\n detector: string,\n sources: string[],\n className: ProjectModel['project']['id']['class'] = 'observed',\n) {\n return { value, class: className, provenance: { detector, sources } };\n}\n\nexport async function scanRepository(root: string, options: ScanOptions): Promise<ProjectModel> {\n const files = await filesUnder(root);\n const packagePath = join(root, 'package.json');\n let pkg: {\n name?: string;\n packageManager?: string;\n scripts?: Record<string, string>;\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n } = {};\n try {\n pkg = JSON.parse(await readFile(packagePath, 'utf8')) as typeof pkg;\n } catch {\n /* absent or invalid package.json is an observation */\n }\n const ext = new Map<string, string>([\n ['.ts', 'typescript'],\n ['.tsx', 'typescript'],\n ['.js', 'javascript'],\n ['.jsx', 'javascript'],\n ['.py', 'python'],\n ['.go', 'go'],\n ['.rs', 'rust'],\n ['.java', 'java'],\n ]);\n const languages = [\n ...new Set(\n files\n .map((file) => ext.get(file.slice(file.lastIndexOf('.'))))\n .filter((value): value is string => value !== undefined),\n ),\n ].sort();\n const supportedLocks = ['pnpm-lock.yaml', 'package-lock.json', 'yarn.lock', 'bun.lockb'];\n const locks = files.filter((file) => supportedLocks.includes(file));\n const lock = locks.length === 1 ? locks[0] : undefined;\n const packageManager =\n lock === undefined\n ? (pkg.packageManager?.split('@')[0] ?? null)\n : lock === 'pnpm-lock.yaml'\n ? 'pnpm'\n : lock === 'package-lock.json'\n ? 'npm'\n : lock === 'yarn.lock'\n ? 'yarn'\n : 'bun';\n const deps = { ...(pkg.dependencies ?? {}), ...(pkg.devDependencies ?? {}) };\n const frameworks = Object.keys(deps)\n .filter((name) =>\n /^(react|vue|angular|svelte|next|nuxt|express|nestjs|fastify|vite|vitest|jest|playwright)/i.test(name),\n )\n .sort();\n const scripts = pkg.scripts ?? {};\n const commands: Record<string, ReturnType<typeof field<string[]>>> = {};\n for (const name of Object.keys(scripts).sort()) {\n const command = scripts[name];\n if (command !== undefined) commands[name] = field(command.split(/\\s+/u), 'package-json', ['package.json']);\n }\n const testLocations = files.filter((file) => /(^|\\/)(test|tests|__tests__)(\\/|$)|\\.(test|spec)\\./u.test(file));\n const surfaces: ProjectModel['surfaces'] = {};\n const topLevel: string[] = [\n ...new Set(\n files.map((file) => file.split('/')[0]).filter((name): name is string => Boolean(name && !name.startsWith('.'))),\n ),\n ];\n for (const name of topLevel.sort()) {\n const paths = files.filter((file) => file === name || file.startsWith(`${name}/`));\n if (paths.length)\n surfaces[name.replace(/[^A-Za-z0-9_.-]/g, '_')] = { paths: field([`${name}/**`], 'workspace-layout', paths) };\n }\n const id =\n pkg.name?.replace(/^@[^/]+\\//u, '') ??\n (relative(process.cwd(), root).replace(/[^A-Za-z0-9_.-]/g, '_') || 'project');\n const unknowns =\n locks.length > 1\n ? [\n {\n id: 'package-manager',\n question: 'more than one supported lockfile was detected; which package manager is authoritative?',\n candidates: [...locks].sort(),\n sources: [...locks].sort(),\n },\n ]\n : [];\n return {\n schemaVersion: 1,\n project: { id: field(id, 'package-json', ['package.json'], 'human'), root: field(root, 'filesystem', []) },\n stack: {\n languages: field(languages, 'file-extensions', files),\n packageManager: field(packageManager, 'lockfile', lock ? [lock] : []),\n frameworks: field(frameworks, 'package-json', ['package.json']),\n },\n surfaces,\n commands,\n testStrategy: field(\n { runner: scripts.test ? (scripts.test.split(/\\s+/u)[0] ?? null) : null, locations: testLocations },\n 'package-json',\n ['package.json'],\n ),\n deploymentHints: field(\n files.filter((file) => /(^|\\/)(Dockerfile|Procfile|vercel\\.json|fly\\.toml)$/u.test(file)),\n 'file-presence',\n files,\n ),\n ownership: field(\n { codeowners: files.includes('.github/CODEOWNERS') ? '.github/CODEOWNERS' : null },\n 'file-presence',\n ['.github/CODEOWNERS'],\n ),\n risks:\n packageManager === null\n ? [{ id: 'missing-lockfile', severity: 'medium', message: 'no supported lockfile was detected', sources: [] }]\n : [],\n conventions: field(\n files.filter((file) => /(^|\\/)(CONTRIBUTING|conventions)\\.(md|yaml)$/iu.test(file)),\n 'file-presence',\n files,\n ),\n generatedArtifacts: field(['manifest.yaml', 'project.yaml'], 'manifest', ['.cohorte/manifest.yaml']),\n unknowns,\n provenance: { generatedAt: options.clock.now(), toolVersion: options.toolVersion, analysis: 'deterministic' },\n };\n}\n"],"mappings":"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"}
|