@ccdd/project 2.0.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 +25 -0
- package/dist/monitor-ui/assets/GraphView-CYMJ1Nb7.css +1 -0
- package/dist/monitor-ui/assets/GraphView-UjtW4QRC.js +27 -0
- package/dist/monitor-ui/assets/ValidationView-CC1FvqUl.js +1 -0
- package/dist/monitor-ui/assets/ValidationView-DWl4b8Ug.css +1 -0
- package/dist/monitor-ui/assets/_plugin-vue_export-helper-BDNMzG2s.js +1 -0
- package/dist/monitor-ui/assets/elk-api-yRi2AOS6.js +1 -0
- package/dist/monitor-ui/assets/elk.bundled-CtLobQTy.js +24 -0
- package/dist/monitor-ui/assets/graph-layout-worker-CgfWoa9t.js +22 -0
- package/dist/monitor-ui/assets/index-CUzg-dht.css +1 -0
- package/dist/monitor-ui/assets/index-Cpm0fC0p.js +8 -0
- package/dist/monitor-ui/index.html +15 -0
- package/dist/scripts/prepare-demo.d.ts +26 -0
- package/dist/scripts/prepare-demo.js +121 -0
- package/dist/scripts/prepare-demo.js.map +1 -0
- package/dist/src/artifacts/groups.d.ts +9 -0
- package/dist/src/artifacts/groups.js +77 -0
- package/dist/src/artifacts/groups.js.map +1 -0
- package/dist/src/artifacts/human.d.ts +38 -0
- package/dist/src/artifacts/human.js +156 -0
- package/dist/src/artifacts/human.js.map +1 -0
- package/dist/src/artifacts/index.d.ts +149 -0
- package/dist/src/artifacts/index.js +354 -0
- package/dist/src/artifacts/index.js.map +1 -0
- package/dist/src/artifacts/instruction.d.ts +23 -0
- package/dist/src/artifacts/instruction.js +94 -0
- package/dist/src/artifacts/instruction.js.map +1 -0
- package/dist/src/artifacts/mcp-server.d.ts +6 -0
- package/dist/src/artifacts/mcp-server.js +96 -0
- package/dist/src/artifacts/mcp-server.js.map +1 -0
- package/dist/src/artifacts/tool-check.d.ts +40 -0
- package/dist/src/artifacts/tool-check.js +113 -0
- package/dist/src/artifacts/tool-check.js.map +1 -0
- package/dist/src/artifacts/types.d.ts +43 -0
- package/dist/src/artifacts/types.js +97 -0
- package/dist/src/artifacts/types.js.map +1 -0
- package/dist/src/broker/config.d.ts +11 -0
- package/dist/src/broker/config.js +141 -0
- package/dist/src/broker/config.js.map +1 -0
- package/dist/src/broker/graph.d.ts +69 -0
- package/dist/src/broker/graph.js +94 -0
- package/dist/src/broker/graph.js.map +1 -0
- package/dist/src/broker/index.d.ts +170 -0
- package/dist/src/broker/index.js +931 -0
- package/dist/src/broker/index.js.map +1 -0
- package/dist/src/cli.d.ts +24 -0
- package/dist/src/cli.js +340 -0
- package/dist/src/cli.js.map +1 -0
- package/dist/src/contracts.d.ts +116 -0
- package/dist/src/contracts.js +2 -0
- package/dist/src/contracts.js.map +1 -0
- package/dist/src/definitions.d.ts +53 -0
- package/dist/src/definitions.js +2 -0
- package/dist/src/definitions.js.map +1 -0
- package/dist/src/doctor/index.d.ts +41 -0
- package/dist/src/doctor/index.js +189 -0
- package/dist/src/doctor/index.js.map +1 -0
- package/dist/src/executors/auth.d.ts +16 -0
- package/dist/src/executors/auth.js +150 -0
- package/dist/src/executors/auth.js.map +1 -0
- package/dist/src/executors/errors.d.ts +6 -0
- package/dist/src/executors/errors.js +10 -0
- package/dist/src/executors/errors.js.map +1 -0
- package/dist/src/executors/index.d.ts +20 -0
- package/dist/src/executors/index.js +262 -0
- package/dist/src/executors/index.js.map +1 -0
- package/dist/src/executors/pi.d.ts +32 -0
- package/dist/src/executors/pi.js +190 -0
- package/dist/src/executors/pi.js.map +1 -0
- package/dist/src/executors/process.d.ts +22 -0
- package/dist/src/executors/process.js +70 -0
- package/dist/src/executors/process.js.map +1 -0
- package/dist/src/local.d.ts +13 -0
- package/dist/src/local.js +20 -0
- package/dist/src/local.js.map +1 -0
- package/dist/src/monitor/actions.d.ts +12 -0
- package/dist/src/monitor/actions.js +74 -0
- package/dist/src/monitor/actions.js.map +1 -0
- package/dist/src/monitor/server.d.ts +8 -0
- package/dist/src/monitor/server.js +493 -0
- package/dist/src/monitor/server.js.map +1 -0
- package/dist/src/monitor/store.d.ts +22 -0
- package/dist/src/monitor/store.js +517 -0
- package/dist/src/monitor/store.js.map +1 -0
- package/dist/src/monitor/types.d.ts +143 -0
- package/dist/src/monitor/types.js +2 -0
- package/dist/src/monitor/types.js.map +1 -0
- package/dist/src/monitor/ui/api.d.ts +11 -0
- package/dist/src/monitor/ui/api.js +29 -0
- package/dist/src/monitor/ui/api.js.map +1 -0
- package/dist/src/monitor/ui/critic-presentation.d.ts +11 -0
- package/dist/src/monitor/ui/critic-presentation.js +60 -0
- package/dist/src/monitor/ui/critic-presentation.js.map +1 -0
- package/dist/src/monitor/ui/format.d.ts +9 -0
- package/dist/src/monitor/ui/format.js +22 -0
- package/dist/src/monitor/ui/format.js.map +1 -0
- package/dist/src/monitor/ui/graph-layout.d.ts +43 -0
- package/dist/src/monitor/ui/graph-layout.js +191 -0
- package/dist/src/monitor/ui/graph-layout.js.map +1 -0
- package/dist/src/monitor/ui/tool-content.d.ts +13 -0
- package/dist/src/monitor/ui/tool-content.js +22 -0
- package/dist/src/monitor/ui/tool-content.js.map +1 -0
- package/dist/src/monitor/ui/tool-input.d.ts +23 -0
- package/dist/src/monitor/ui/tool-input.js +112 -0
- package/dist/src/monitor/ui/tool-input.js.map +1 -0
- package/dist/src/project/cli.d.ts +9 -0
- package/dist/src/project/cli.js +306 -0
- package/dist/src/project/cli.js.map +1 -0
- package/dist/src/project/graph.d.ts +4 -0
- package/dist/src/project/graph.js +26 -0
- package/dist/src/project/graph.js.map +1 -0
- package/dist/src/project/identity.d.ts +5 -0
- package/dist/src/project/identity.js +87 -0
- package/dist/src/project/identity.js.map +1 -0
- package/dist/src/project/index.d.ts +19 -0
- package/dist/src/project/index.js +26 -0
- package/dist/src/project/index.js.map +1 -0
- package/dist/src/project/query.d.ts +9 -0
- package/dist/src/project/query.js +136 -0
- package/dist/src/project/query.js.map +1 -0
- package/dist/src/project/store.d.ts +15 -0
- package/dist/src/project/store.js +47 -0
- package/dist/src/project/store.js.map +1 -0
- package/dist/src/project/types.d.ts +106 -0
- package/dist/src/project/types.js +2 -0
- package/dist/src/project/types.js.map +1 -0
- package/dist/src/requester/index.d.ts +16 -0
- package/dist/src/requester/index.js +96 -0
- package/dist/src/requester/index.js.map +1 -0
- package/dist/src/runtime-paths.d.ts +1 -0
- package/dist/src/runtime-paths.js +4 -0
- package/dist/src/runtime-paths.js.map +1 -0
- package/dist/src/sdk.d.ts +9 -0
- package/dist/src/sdk.js +3 -0
- package/dist/src/sdk.js.map +1 -0
- package/dist/src/tools/contracts.d.ts +108 -0
- package/dist/src/tools/contracts.js +2 -0
- package/dist/src/tools/contracts.js.map +1 -0
- package/dist/src/tools/host.d.ts +7 -0
- package/dist/src/tools/host.js +98 -0
- package/dist/src/tools/host.js.map +1 -0
- package/dist/src/tools/paths.d.ts +2 -0
- package/dist/src/tools/paths.js +18 -0
- package/dist/src/tools/paths.js.map +1 -0
- package/dist/src/tools/runner.d.ts +54 -0
- package/dist/src/tools/runner.js +194 -0
- package/dist/src/tools/runner.js.map +1 -0
- package/dist/src/tools/runtime-host.d.ts +1 -0
- package/dist/src/tools/runtime-host.js +116 -0
- package/dist/src/tools/runtime-host.js.map +1 -0
- package/dist/src/tools/schema.d.ts +6 -0
- package/dist/src/tools/schema.js +106 -0
- package/dist/src/tools/schema.js.map +1 -0
- package/dist/src/worker-client.d.ts +27 -0
- package/dist/src/worker-client.js +96 -0
- package/dist/src/worker-client.js.map +1 -0
- package/dist/src/worker.d.ts +1 -0
- package/dist/src/worker.js +50 -0
- package/dist/src/worker.js.map +1 -0
- package/dist/src/workspaces/index.d.ts +33 -0
- package/dist/src/workspaces/index.js +394 -0
- package/dist/src/workspaces/index.js.map +1 -0
- package/package.json +26 -0
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export interface ToolField {
|
|
2
|
+
name: string;
|
|
3
|
+
label: string;
|
|
4
|
+
description?: string;
|
|
5
|
+
kind: 'string' | 'integer' | 'number' | 'boolean' | 'enum';
|
|
6
|
+
required: boolean;
|
|
7
|
+
options?: unknown[];
|
|
8
|
+
minimum?: number;
|
|
9
|
+
maximum?: number;
|
|
10
|
+
minLength?: number;
|
|
11
|
+
maxLength?: number;
|
|
12
|
+
default?: unknown;
|
|
13
|
+
}
|
|
14
|
+
/** Only simple object schemas become fields. Everything else keeps its full JSON shape. */
|
|
15
|
+
export declare function toolInputForm(schema: Record<string, unknown>): {
|
|
16
|
+
fields: ToolField[];
|
|
17
|
+
json: boolean;
|
|
18
|
+
};
|
|
19
|
+
export declare function initialToolFields(fields: ToolField[], legacy?: boolean): Record<string, string>;
|
|
20
|
+
export declare function initialToolJson(schema: Record<string, unknown>): string;
|
|
21
|
+
export declare function validateToolInput(schema: Record<string, unknown>, value: unknown): Record<string, unknown>;
|
|
22
|
+
export declare function parseToolFields(schema: Record<string, unknown>, definitions: ToolField[], fields: Record<string, string>): Record<string, unknown>;
|
|
23
|
+
export declare function parseToolJson(schema: Record<string, unknown>, source: string): Record<string, unknown>;
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { Check, Errors } from 'typebox/value';
|
|
2
|
+
const record = (value) => value !== null && typeof value === 'object' && !Array.isArray(value);
|
|
3
|
+
const labels = { path: '내부 경로', startLine: '시작 줄', lineCount: '읽을 줄 수', offset: '시작 항목', limit: '항목 수' };
|
|
4
|
+
const complexKeywords = ['$ref', 'allOf', 'anyOf', 'oneOf', 'not', 'if', 'then', 'else', 'dependentRequired', 'dependentSchemas', 'patternProperties', 'unevaluatedProperties'];
|
|
5
|
+
const simple = (schema) => !complexKeywords.some(key => key in schema);
|
|
6
|
+
const primitive = (value) => value === null || ['string', 'number', 'boolean'].includes(typeof value);
|
|
7
|
+
/** Only simple object schemas become fields. Everything else keeps its full JSON shape. */
|
|
8
|
+
export function toolInputForm(schema) {
|
|
9
|
+
if (schema.type !== 'object' || !simple(schema))
|
|
10
|
+
return { fields: [], json: true };
|
|
11
|
+
const properties = schema.properties ?? {};
|
|
12
|
+
if (!record(properties))
|
|
13
|
+
return { fields: [], json: true };
|
|
14
|
+
if (!Object.keys(properties).length && schema.additionalProperties !== false)
|
|
15
|
+
return { fields: [], json: true };
|
|
16
|
+
const required = Array.isArray(schema.required) ? schema.required : [];
|
|
17
|
+
const fields = [];
|
|
18
|
+
for (const [name, property] of Object.entries(properties)) {
|
|
19
|
+
if (!record(property) || !simple(property))
|
|
20
|
+
return { fields: [], json: true };
|
|
21
|
+
const enumeration = Array.isArray(property.enum) && property.enum.length > 0 && property.enum.every(primitive) ? property.enum : undefined;
|
|
22
|
+
const kind = enumeration ? 'enum' : property.type;
|
|
23
|
+
if (kind !== 'string' && kind !== 'integer' && kind !== 'number' && kind !== 'boolean' && kind !== 'enum')
|
|
24
|
+
return { fields: [], json: true };
|
|
25
|
+
fields.push({ name, label: typeof property.title === 'string' ? property.title : labels[name] ?? name,
|
|
26
|
+
description: typeof property.description === 'string' ? property.description : undefined,
|
|
27
|
+
kind, required: required.includes(name), options: enumeration, default: property.default,
|
|
28
|
+
minimum: typeof property.minimum === 'number' ? property.minimum : undefined,
|
|
29
|
+
maximum: typeof property.maximum === 'number' ? property.maximum : undefined,
|
|
30
|
+
minLength: typeof property.minLength === 'number' ? property.minLength : undefined,
|
|
31
|
+
maxLength: typeof property.maxLength === 'number' ? property.maxLength : undefined,
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
// A required key not described in properties cannot be represented by these fields.
|
|
35
|
+
if (required.some(name => typeof name !== 'string' || !Object.hasOwn(properties, name)))
|
|
36
|
+
return { fields: [], json: true };
|
|
37
|
+
return { fields, json: false };
|
|
38
|
+
}
|
|
39
|
+
export function initialToolFields(fields, legacy = false) {
|
|
40
|
+
const legacyDefaults = { startLine: 1, lineCount: 80, offset: 0, limit: 100 };
|
|
41
|
+
return Object.fromEntries(fields.map(field => {
|
|
42
|
+
const value = field.default !== undefined ? field.default : legacy ? legacyDefaults[field.name] : undefined;
|
|
43
|
+
return [field.name, value === undefined ? '' : field.kind === 'enum'
|
|
44
|
+
? String(field.options?.findIndex(option => JSON.stringify(option) === JSON.stringify(value)) ?? -1)
|
|
45
|
+
: String(value)];
|
|
46
|
+
}));
|
|
47
|
+
}
|
|
48
|
+
export function initialToolJson(schema) {
|
|
49
|
+
if (record(schema.default))
|
|
50
|
+
return JSON.stringify(schema.default, null, 2);
|
|
51
|
+
const value = {};
|
|
52
|
+
if (record(schema.properties))
|
|
53
|
+
for (const [name, property] of Object.entries(schema.properties)) {
|
|
54
|
+
if (record(property) && property.default !== undefined)
|
|
55
|
+
Object.defineProperty(value, name, { value: property.default, enumerable: true });
|
|
56
|
+
}
|
|
57
|
+
return JSON.stringify(value, null, 2);
|
|
58
|
+
}
|
|
59
|
+
export function validateToolInput(schema, value) {
|
|
60
|
+
if (!record(value))
|
|
61
|
+
throw new Error('도구 입력은 JSON 객체여야 합니다.');
|
|
62
|
+
if (new TextEncoder().encode(JSON.stringify({ arguments: value })).byteLength > 32_768)
|
|
63
|
+
throw new Error('도구 입력은 32KiB 이하여야 합니다.');
|
|
64
|
+
// The interpreter works with the monitor CSP (no generated code/eval).
|
|
65
|
+
if (!Check(schema, value)) {
|
|
66
|
+
const first = Errors(schema, value)[0];
|
|
67
|
+
throw new Error(`도구 입력 형식을 확인하세요.${first ? ` ${first.message}` : ''}`);
|
|
68
|
+
}
|
|
69
|
+
return value;
|
|
70
|
+
}
|
|
71
|
+
export function parseToolFields(schema, definitions, fields) {
|
|
72
|
+
const args = {};
|
|
73
|
+
for (const field of definitions) {
|
|
74
|
+
const value = fields[field.name] ?? '';
|
|
75
|
+
if (!value && !field.required)
|
|
76
|
+
continue;
|
|
77
|
+
let parsed;
|
|
78
|
+
if (field.kind === 'enum') {
|
|
79
|
+
if (!/^\d+$/.test(value) || !field.options || Number(value) >= field.options.length)
|
|
80
|
+
throw new Error(`${field.label}을 선택해 주세요.`);
|
|
81
|
+
parsed = field.options[Number(value)];
|
|
82
|
+
}
|
|
83
|
+
else if (field.kind === 'boolean') {
|
|
84
|
+
if (value !== 'true' && value !== 'false')
|
|
85
|
+
throw new Error(`${field.label}을 선택해 주세요.`);
|
|
86
|
+
parsed = value === 'true';
|
|
87
|
+
}
|
|
88
|
+
else if (field.kind === 'number' || field.kind === 'integer') {
|
|
89
|
+
const input = value.trim();
|
|
90
|
+
if (!/^-?(?:0|[1-9]\d*)(?:\.\d+)?(?:e[+-]?\d+)?$/i.test(input))
|
|
91
|
+
throw new Error(`${field.label}에 숫자를 입력해 주세요.`);
|
|
92
|
+
parsed = Number(input);
|
|
93
|
+
if (!Number.isFinite(parsed) || (field.kind === 'integer' && !Number.isSafeInteger(parsed)))
|
|
94
|
+
throw new Error(`${field.label}의 숫자 형식을 확인해 주세요.`);
|
|
95
|
+
}
|
|
96
|
+
else
|
|
97
|
+
parsed = value;
|
|
98
|
+
Object.defineProperty(args, field.name, { value: parsed, enumerable: true });
|
|
99
|
+
}
|
|
100
|
+
return validateToolInput(schema, args);
|
|
101
|
+
}
|
|
102
|
+
export function parseToolJson(schema, source) {
|
|
103
|
+
let input;
|
|
104
|
+
try {
|
|
105
|
+
input = JSON.parse(source);
|
|
106
|
+
}
|
|
107
|
+
catch {
|
|
108
|
+
throw new Error('올바른 JSON을 입력해 주세요.');
|
|
109
|
+
}
|
|
110
|
+
return validateToolInput(schema, input);
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=tool-input.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-input.js","sourceRoot":"","sources":["../../../../src/monitor/ui/tool-input.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,306 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { existsSync, realpathSync } from 'node:fs';
|
|
3
|
+
import { readFile } from 'node:fs/promises';
|
|
4
|
+
import { resolve, join } from 'node:path';
|
|
5
|
+
import { fileURLToPath } from 'node:url';
|
|
6
|
+
import { setTimeout as delay } from 'node:timers/promises';
|
|
7
|
+
import { main as legacyMain } from '../cli.js';
|
|
8
|
+
import { createBroker, readStateContext } from '../broker/index.js';
|
|
9
|
+
import { createGraphDefinition } from '../broker/graph.js';
|
|
10
|
+
import { includedCritics } from './query.js';
|
|
11
|
+
import { isArtifactGroup } from '../artifacts/groups.js';
|
|
12
|
+
import { localContext, createLocalAlarmMethods } from '../local.js';
|
|
13
|
+
import { createExecutorRegistry } from '../executors/index.js';
|
|
14
|
+
import { ensureRunWorker } from '../worker-client.js';
|
|
15
|
+
import { inspectProject } from './index.js';
|
|
16
|
+
import { projectHistory, projectRun, projectRuns, projectRequests } from './store.js';
|
|
17
|
+
const terminal = new Set(['GREEN', 'RED', 'ERROR', 'INCOMPLETE']);
|
|
18
|
+
const flags = new Set(['--all', '--recursive', '--force', '--wait', '--json', '--help', '--copy', '--lock', '--human-inbox']);
|
|
19
|
+
const values = new Set(['--repo', '--state-dir', '--critic', '--timeout-ms', '--requester', '--reviewer', '--result-file', '--tool', '--args', '--run', '--pi-auth-file', '--codex-auth-file']);
|
|
20
|
+
const help = `CCDD Project — pull validation and explicit review execution
|
|
21
|
+
|
|
22
|
+
ccdd-project status [ARTIFACT | --critic ID] [--json]
|
|
23
|
+
ccdd-project plan (ARTIFACT | --critic ID | --all) [--recursive] [--force]
|
|
24
|
+
ccdd-project verify (ARTIFACT | --critic ID | --all) [--recursive] [--force] [--wait]
|
|
25
|
+
ccdd-project history [ARTIFACT | --critic ID]
|
|
26
|
+
ccdd-project graph [ARTIFACT]
|
|
27
|
+
ccdd-project config check
|
|
28
|
+
ccdd-project run list
|
|
29
|
+
ccdd-project run show RUN_ID [--wait]
|
|
30
|
+
ccdd-project run resume RUN_ID [--wait]
|
|
31
|
+
ccdd-project run cancel RUN_ID
|
|
32
|
+
ccdd-project request list [--run RUN_ID]
|
|
33
|
+
ccdd-project request show REQUEST_ID
|
|
34
|
+
ccdd-project request claim REQUEST_ID --reviewer ID
|
|
35
|
+
ccdd-project request tool REQUEST_ID --reviewer ID --tool NAME --args JSON
|
|
36
|
+
ccdd-project request submit REQUEST_ID --reviewer ID --result-file PATH
|
|
37
|
+
ccdd-project doctor | tools check | monitor (existing diagnostics and UI)
|
|
38
|
+
|
|
39
|
+
Individual verification runs ready selected Critics and reports blocked Critics as incomplete.
|
|
40
|
+
--recursive includes required ancestors; direct Critic selection never bypasses dependencies.
|
|
41
|
+
--force reviews selected Critics again, keeping dependency gates and ancestor reuse.
|
|
42
|
+
Queries never create review tickets, send alarms or execute review tools or Providers.
|
|
43
|
+
verify defaults to --copy; --lock is explicit. State must be outside the repository.
|
|
44
|
+
Common options: --repo PATH, --state-dir PATH, --json.
|
|
45
|
+
Execution: --human-inbox, --pi-auth-file PATH, --codex-auth-file PATH.
|
|
46
|
+
--wait: 0=fulfilled, 1=RED, 2=ERROR, 3=timeout, 4=incomplete. Timeout does not cancel.
|
|
47
|
+
Without --wait, 0 means accepted or already fulfilled; inspect the reported outcome.
|
|
48
|
+
`;
|
|
49
|
+
function parse(argv) {
|
|
50
|
+
const options = {}, positional = [];
|
|
51
|
+
for (let i = 0; i < argv.length; i++) {
|
|
52
|
+
const arg = argv[i];
|
|
53
|
+
if (flags.has(arg) || values.has(arg)) {
|
|
54
|
+
if (options[arg] !== undefined)
|
|
55
|
+
throw new Error(`Duplicate option: ${arg}`);
|
|
56
|
+
if (flags.has(arg))
|
|
57
|
+
options[arg] = true;
|
|
58
|
+
else {
|
|
59
|
+
const value = argv[++i];
|
|
60
|
+
if (!value || value.startsWith('--'))
|
|
61
|
+
throw new Error(`${arg} requires a value.`);
|
|
62
|
+
options[arg] = value;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
else if (arg.startsWith('-'))
|
|
66
|
+
throw new Error(`Unknown option: ${arg}`);
|
|
67
|
+
else
|
|
68
|
+
positional.push(arg);
|
|
69
|
+
}
|
|
70
|
+
return { options, positional };
|
|
71
|
+
}
|
|
72
|
+
const exitFor = (run) => run.status === 'GREEN' ? 0 : run.status === 'RED' ? 1 : run.status === 'INCOMPLETE' ? 4 : 2;
|
|
73
|
+
const publicRun = ({ project, ...run }) => run;
|
|
74
|
+
function planText(plan) {
|
|
75
|
+
const target = plan.selection.kind === 'artifact' ? plan.selection.artifactId : plan.selection.kind === 'critic' ? plan.selection.criticId : 'Project';
|
|
76
|
+
const artifacts = plan.artifacts.filter(a => plan.selection.kind === 'all' || plan.selection.kind === 'artifact' && a.id === plan.selection.artifactId);
|
|
77
|
+
return `${target}: ${plan.satisfied ? 'SATISFIED' : 'NOT SATISFIED'}\nSnapshot: ${plan.snapshotHash}\n` + artifacts.map(a => ` Artifact ${a.id}: ${a.status} (${a.passed}/${a.total} Critics)\n`).join('') + plan.items.map(c => ` ${c.id}: ${c.action} · ${c.status}\n ${c.reason}`).join('\n') +
|
|
78
|
+
`\nReuse ${plan.counts.reuse} · Ready ${plan.counts.execute} · Waiting ${plan.counts.wait} · Active ${plan.counts.active} · Failed ${plan.counts.failed}`;
|
|
79
|
+
}
|
|
80
|
+
export async function main(argv = process.argv.slice(2), { stdout = process.stdout, stderr = process.stderr } = {}) {
|
|
81
|
+
let json = argv.includes('--json');
|
|
82
|
+
let broker;
|
|
83
|
+
const print = (value, plain) => stdout.write((!json && plain !== undefined ? plain : JSON.stringify(value, null, 2)) + '\n');
|
|
84
|
+
try {
|
|
85
|
+
const command = argv[0] ?? 'help';
|
|
86
|
+
if (['doctor', 'tools', 'monitor'].includes(command))
|
|
87
|
+
return await legacyMain(argv, { stdout, stderr });
|
|
88
|
+
const { options, positional } = parse(argv.slice(1));
|
|
89
|
+
json = Boolean(options['--json']);
|
|
90
|
+
const get = (key) => typeof options[key] === 'string' ? options[key] : undefined;
|
|
91
|
+
if (['help', '--help'].includes(command) || options['--help']) {
|
|
92
|
+
stdout.write(help);
|
|
93
|
+
return 0;
|
|
94
|
+
}
|
|
95
|
+
if (!['status', 'plan', 'verify', 'history', 'graph', 'config', 'run', 'request'].includes(command))
|
|
96
|
+
throw new Error(`Unknown command: ${command}`);
|
|
97
|
+
const common = ['--repo', '--state-dir', '--json'];
|
|
98
|
+
const permitted = new Set([...common, ...(['status', 'plan', 'verify', 'history'].includes(command) ? ['--critic', '--all'] : []),
|
|
99
|
+
...(['plan', 'verify'].includes(command) ? ['--recursive', '--force'] : []),
|
|
100
|
+
...(command === 'verify' ? ['--wait', '--timeout-ms', '--requester', '--human-inbox', '--pi-auth-file', '--codex-auth-file', '--copy', '--lock'] : []),
|
|
101
|
+
...(command === 'run' ? ['--wait', '--timeout-ms'] : []),
|
|
102
|
+
...(command === 'request' ? ['--run', '--reviewer', '--result-file', '--tool', '--args'] : [])]);
|
|
103
|
+
for (const key of Object.keys(options))
|
|
104
|
+
if (!permitted.has(key))
|
|
105
|
+
throw new Error(`${key} is not supported by ${command}.`);
|
|
106
|
+
if (options['--copy'] && options['--lock'])
|
|
107
|
+
throw new Error('--copy and --lock are mutually exclusive.');
|
|
108
|
+
const timeoutMs = Number(get('--timeout-ms') ?? 600000);
|
|
109
|
+
if (!Number.isSafeInteger(timeoutMs) || timeoutMs < 1 || timeoutMs > 86400000)
|
|
110
|
+
throw new Error('--timeout-ms must be between 1 and 86400000.');
|
|
111
|
+
let context;
|
|
112
|
+
const requestedState = get('--state-dir');
|
|
113
|
+
if (requestedState && existsSync(join(resolve(requestedState), 'broker.sqlite'))) {
|
|
114
|
+
context = readStateContext(resolve(requestedState));
|
|
115
|
+
if (get('--repo') && realpathSync(resolve(get('--repo'))) !== context.repoPath)
|
|
116
|
+
throw new Error('State directory belongs to a different repository.');
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
context = await localContext({ repoPath: resolve(get('--repo') ?? process.cwd()), stateDir: requestedState });
|
|
120
|
+
if (existsSync(join(context.stateDir, 'broker.sqlite'))) {
|
|
121
|
+
const stored = readStateContext(context.stateDir);
|
|
122
|
+
if (stored.repoPath !== context.repoPath)
|
|
123
|
+
throw new Error('State directory belongs to a different repository.');
|
|
124
|
+
context = stored;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
const select = (required = false) => {
|
|
128
|
+
if (positional.length > 1 || Number(Boolean(positional[0])) + Number(Boolean(get('--critic'))) + Number(Boolean(options['--all'])) > 1)
|
|
129
|
+
throw new Error('Choose one Artifact, --critic ID, or --all.');
|
|
130
|
+
if (positional[0])
|
|
131
|
+
return { kind: 'artifact', artifactId: positional[0] };
|
|
132
|
+
if (get('--critic'))
|
|
133
|
+
return { kind: 'critic', criticId: get('--critic') };
|
|
134
|
+
if (required && !options['--all'])
|
|
135
|
+
throw new Error('An Artifact, --critic ID, or --all is required.');
|
|
136
|
+
return { kind: 'all' };
|
|
137
|
+
};
|
|
138
|
+
const verifySelection = command === 'verify' ? select(true) : undefined;
|
|
139
|
+
const printRun = (run) => print(publicRun(run), `Run: ${run.id}\nExecution: ${run.status}${run.validation ? `\n${planText(run.validation)}` : ''}`);
|
|
140
|
+
const wait = async (id) => {
|
|
141
|
+
const deadline = Date.now() + timeoutMs;
|
|
142
|
+
for (;;) {
|
|
143
|
+
const run = projectRun(context.stateDir, id);
|
|
144
|
+
if (!run)
|
|
145
|
+
throw new Error('Review handle not found.');
|
|
146
|
+
if (terminal.has(run.status)) {
|
|
147
|
+
printRun(run);
|
|
148
|
+
return exitFor(run);
|
|
149
|
+
}
|
|
150
|
+
if (Date.now() >= deadline) {
|
|
151
|
+
print({ ...publicRun(run), wait: { completed: false, reason: 'timeout' } }, `Run ${id}: waiting timed out; execution continues.`);
|
|
152
|
+
return 3;
|
|
153
|
+
}
|
|
154
|
+
await delay(Math.min(100, Math.max(1, deadline - Date.now())));
|
|
155
|
+
}
|
|
156
|
+
};
|
|
157
|
+
if (['status', 'plan', 'graph', 'config'].includes(command)) {
|
|
158
|
+
if (command === 'config' && (positional.length !== 1 || positional[0] !== 'check'))
|
|
159
|
+
throw new Error('Use config check.');
|
|
160
|
+
const selection = command === 'config' ? { kind: 'all' } : select(command === 'plan');
|
|
161
|
+
const { snapshot, plan } = await inspectProject({ ...context, selection, recursive: Boolean(options['--recursive']), force: Boolean(options['--force']) });
|
|
162
|
+
if (command === 'config') {
|
|
163
|
+
print({ ok: true, artifacts: Object.keys(snapshot.config.artifacts).length, critics: snapshot.config.critics.length, snapshotHash: snapshot.snapshotHash }, 'Configuration and Artifact DAG are valid.');
|
|
164
|
+
return 0;
|
|
165
|
+
}
|
|
166
|
+
if (command === 'graph') {
|
|
167
|
+
const graph = createGraphDefinition(snapshot.config);
|
|
168
|
+
if (selection.kind !== 'all') {
|
|
169
|
+
const ids = new Set(includedCritics(snapshot, selection, true));
|
|
170
|
+
graph.critics = graph.critics.filter(c => ids.has(c.id));
|
|
171
|
+
const artifacts = new Set(selection.kind === 'artifact' ? [selection.artifactId] : []);
|
|
172
|
+
const include = (id) => { artifacts.add(id); const entry = graph.artifacts[id]; if (isArtifactGroup(entry))
|
|
173
|
+
for (const member of entry.members)
|
|
174
|
+
if (!artifacts.has(member))
|
|
175
|
+
include(member); };
|
|
176
|
+
for (const c of graph.critics)
|
|
177
|
+
for (const id of [c.target, ...c.deps])
|
|
178
|
+
include(id);
|
|
179
|
+
for (const id of [...artifacts])
|
|
180
|
+
include(id);
|
|
181
|
+
graph.artifacts = Object.fromEntries(Object.entries(graph.artifacts).filter(([id]) => artifacts.has(id)));
|
|
182
|
+
}
|
|
183
|
+
print(graph, graph.critics.map(c => `${c.id}: ${c.deps.join(', ') || '(no deps)'} -> ${c.target}`).join('\n') || Object.keys(graph.artifacts).join('\n'));
|
|
184
|
+
return 0;
|
|
185
|
+
}
|
|
186
|
+
print(plan, planText(plan));
|
|
187
|
+
return command === 'plan' || plan.satisfied ? 0 : 1;
|
|
188
|
+
}
|
|
189
|
+
if (command === 'history') {
|
|
190
|
+
const selection = select();
|
|
191
|
+
const entries = projectHistory(context.stateDir).filter(e => selection.kind === 'all' || selection.kind === 'critic' && e.criticId === selection.criticId || selection.kind === 'artifact' && e.input.target.id === selection.artifactId);
|
|
192
|
+
print(entries, entries.map(e => `${e.completedAt} ${e.criticId} ${e.verdict} · ${e.requestId}\n ${e.summary}`).join('\n') || 'No recorded validation evidence.');
|
|
193
|
+
return 0;
|
|
194
|
+
}
|
|
195
|
+
if (command === 'run' || command === 'request') {
|
|
196
|
+
const [action, id] = positional;
|
|
197
|
+
const actions = command === 'run' ? ['list', 'show', 'resume', 'cancel'] : ['list', 'show', 'claim', 'tool', 'submit'];
|
|
198
|
+
if (!actions.includes(action) || positional.length !== (action === 'list' ? 1 : 2))
|
|
199
|
+
throw new Error(`Use ${command} ${actions.join('|')} with the appropriate ID.`);
|
|
200
|
+
if (command === 'run' && options['--wait'] && !['show', 'resume'].includes(action))
|
|
201
|
+
throw new Error('--wait requires run show or run resume.');
|
|
202
|
+
if (action === 'list') {
|
|
203
|
+
print(command === 'run' ? projectRuns(context.stateDir).map(publicRun) : projectRequests(context.stateDir, get('--run')));
|
|
204
|
+
return 0;
|
|
205
|
+
}
|
|
206
|
+
if (action === 'show') {
|
|
207
|
+
if (command === 'run') {
|
|
208
|
+
if (options['--wait'])
|
|
209
|
+
return await wait(id);
|
|
210
|
+
const run = projectRun(context.stateDir, id);
|
|
211
|
+
if (!run)
|
|
212
|
+
throw new Error('Review handle not found.');
|
|
213
|
+
printRun(run);
|
|
214
|
+
}
|
|
215
|
+
else {
|
|
216
|
+
const request = projectRequests(context.stateDir).find(r => r.id === id);
|
|
217
|
+
if (!request)
|
|
218
|
+
throw new Error('Review request not found.');
|
|
219
|
+
print(request);
|
|
220
|
+
}
|
|
221
|
+
return 0;
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
const piOptions = {};
|
|
225
|
+
const piFile = get('--pi-auth-file') ?? process.env.CCDD_PI_AUTH_FILE;
|
|
226
|
+
const codexFile = get('--codex-auth-file') ?? process.env.CCDD_CODEX_AUTH_FILE;
|
|
227
|
+
if (piFile)
|
|
228
|
+
piOptions.authFile = resolve(piFile);
|
|
229
|
+
if (codexFile)
|
|
230
|
+
piOptions.codexAuthFile = resolve(codexFile);
|
|
231
|
+
const humanInbox = Boolean(options['--human-inbox']);
|
|
232
|
+
const executors = createExecutorRegistry({ piOptions, alarmMethods: createLocalAlarmMethods({ ...context, humanInbox }) });
|
|
233
|
+
broker = createBroker({ ...context, executors });
|
|
234
|
+
if (command === 'verify') {
|
|
235
|
+
const run = await broker.submitProject({ selection: verifySelection, recursive: Boolean(options['--recursive']), force: Boolean(options['--force']), requesterId: get('--requester') ?? 'cli', mode: options['--lock'] ? 'lock' : 'copy' });
|
|
236
|
+
if (!terminal.has(run.status))
|
|
237
|
+
await ensureRunWorker({ broker, context, run, initialConfig: { piOptions, humanInbox } });
|
|
238
|
+
if (options['--wait'])
|
|
239
|
+
return await wait(run.id);
|
|
240
|
+
const view = projectRun(context.stateDir, run.id);
|
|
241
|
+
printRun(view);
|
|
242
|
+
return view.status === 'INCOMPLETE' ? 4 : view.status === 'ERROR' ? 2 : 0;
|
|
243
|
+
}
|
|
244
|
+
const [action, id] = positional;
|
|
245
|
+
if (command === 'run') {
|
|
246
|
+
let run = broker.getRun(id);
|
|
247
|
+
if (!run)
|
|
248
|
+
throw new Error('Review handle not found.');
|
|
249
|
+
if (action === 'cancel')
|
|
250
|
+
run = broker.cancel(id);
|
|
251
|
+
else if (action === 'resume' && !terminal.has(run.status))
|
|
252
|
+
run = await ensureRunWorker({ broker, context, run });
|
|
253
|
+
if (options['--wait'])
|
|
254
|
+
return await wait(id);
|
|
255
|
+
printRun(projectRun(context.stateDir, id));
|
|
256
|
+
return 0;
|
|
257
|
+
}
|
|
258
|
+
const reviewerId = get('--reviewer');
|
|
259
|
+
if (!reviewerId)
|
|
260
|
+
throw new Error('--reviewer is required for Human actions.');
|
|
261
|
+
const request = broker.getRequest(id);
|
|
262
|
+
if (!request)
|
|
263
|
+
throw new Error('Review request not found.');
|
|
264
|
+
if (action === 'claim')
|
|
265
|
+
print(broker.claimHuman(id, reviewerId));
|
|
266
|
+
else if (action === 'tool') {
|
|
267
|
+
const toolName = get('--tool');
|
|
268
|
+
if (!toolName)
|
|
269
|
+
throw new Error('--tool is required.');
|
|
270
|
+
print(await broker.executeHumanTool(id, { reviewerId, toolName, arguments: JSON.parse(get('--args') ?? '{}') }));
|
|
271
|
+
}
|
|
272
|
+
else {
|
|
273
|
+
const filename = get('--result-file');
|
|
274
|
+
if (!filename)
|
|
275
|
+
throw new Error('--result-file is required.');
|
|
276
|
+
const content = await readFile(resolve(filename), 'utf8');
|
|
277
|
+
if (Buffer.byteLength(content) > 256000)
|
|
278
|
+
throw new Error('Human result file is too large.');
|
|
279
|
+
await broker.completeHuman(id, { reviewerId, result: JSON.parse(content) });
|
|
280
|
+
const run = broker.getRun(request.runId);
|
|
281
|
+
if (run.status === 'QUEUED')
|
|
282
|
+
await ensureRunWorker({ broker, context, run });
|
|
283
|
+
printRun(projectRun(context.stateDir, request.runId));
|
|
284
|
+
}
|
|
285
|
+
return 0;
|
|
286
|
+
}
|
|
287
|
+
catch (error) {
|
|
288
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
289
|
+
if (json)
|
|
290
|
+
print({ error: message });
|
|
291
|
+
else
|
|
292
|
+
stderr.write(message + '\n');
|
|
293
|
+
return 2;
|
|
294
|
+
}
|
|
295
|
+
finally {
|
|
296
|
+
await broker?.close();
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
let entrypoint = false;
|
|
300
|
+
try {
|
|
301
|
+
entrypoint = Boolean(process.argv[1]) && realpathSync(process.argv[1]) === fileURLToPath(import.meta.url);
|
|
302
|
+
}
|
|
303
|
+
catch { }
|
|
304
|
+
if (entrypoint)
|
|
305
|
+
process.exitCode = await main();
|
|
306
|
+
//# sourceMappingURL=cli.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../../src/project/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { type GraphDefinition, type GraphProjection, type GraphRequest } from '../broker/graph.js';
|
|
2
|
+
import type { ProjectPlan } from './types.js';
|
|
3
|
+
/** Explicit projections may refer to actual earlier evidence, never fabricated tickets. */
|
|
4
|
+
export declare function projectValidationGraph(graph: GraphDefinition, plan: ProjectPlan, requests: GraphRequest[], runId: string): GraphProjection;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { projectGraph } from '../broker/graph.js';
|
|
2
|
+
const reviewStatus = (status) => status === 'PASS' ? 'GREEN' : status === 'STALE' || status === 'UNREVIEWED' || status === 'BASIS' ? null : status;
|
|
3
|
+
/** Explicit projections may refer to actual earlier evidence, never fabricated tickets. */
|
|
4
|
+
export function projectValidationGraph(graph, plan, requests, runId) {
|
|
5
|
+
const projection = projectGraph(graph, requests);
|
|
6
|
+
for (const critic of projection.critics) {
|
|
7
|
+
const value = plan.critics.find(c => c.id === critic.id);
|
|
8
|
+
const reused = value.status === 'PASS' && value.result && value.result.runId !== runId;
|
|
9
|
+
critic.validationStatus = value.status;
|
|
10
|
+
critic.validationReason = value.reason;
|
|
11
|
+
critic.status = reviewStatus(value.status);
|
|
12
|
+
critic.requestId = value.requestId ?? value.result?.requestId ?? null;
|
|
13
|
+
critic.blockedReason = value.blockedBy.length ? value.reason : null;
|
|
14
|
+
if (reused)
|
|
15
|
+
critic.reusedFrom = { requestId: value.result.requestId, runId: value.result.runId, completedAt: value.result.completedAt };
|
|
16
|
+
}
|
|
17
|
+
for (const artifact of projection.artifacts) {
|
|
18
|
+
const value = plan.artifacts.find(a => a.id === artifact.id);
|
|
19
|
+
artifact.validationStatus = value.status;
|
|
20
|
+
artifact.status = (value.status === 'BASIS' ? 'BASIS' : reviewStatus(value.status) ?? 'UNREVIEWED');
|
|
21
|
+
artifact.passed = value.passed;
|
|
22
|
+
artifact.included = value.criticIds.filter(id => plan.includedCriticIds.includes(id)).length;
|
|
23
|
+
}
|
|
24
|
+
return projection;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=graph.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graph.js","sourceRoot":"","sources":["../../../src/project/graph.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAsF,MAAM,oBAAoB,CAAC;AAItI,MAAM,YAAY,GAAG,CAAC,MAAwB,EAAuB,EAAE,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,KAAK,OAAO,IAAI,MAAM,KAAK,YAAY,IAAI,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC;AAC1L,2FAA2F;AAC3F,MAAM,UAAU,sBAAsB,CAAC,KAAsB,EAAE,IAAiB,EAAE,QAAwB,EAAE,KAAa;IACvH,MAAM,UAAU,GAAG,YAAY,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IACjD,KAAK,MAAM,MAAM,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC;QACxC,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,MAAM,CAAC,EAAE,CAAE,CAAC;QAC1D,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,KAAK,MAAM,IAAI,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,KAAK,KAAK,CAAC;QACvF,MAAM,CAAC,gBAAgB,GAAG,KAAK,CAAC,MAAM,CAAC;QAAC,MAAM,CAAC,gBAAgB,GAAG,KAAK,CAAC,MAAM,CAAC;QAC/E,MAAM,CAAC,MAAM,GAAG,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC3C,MAAM,CAAC,SAAS,GAAG,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,MAAM,EAAE,SAAS,IAAI,IAAI,CAAC;QACtE,MAAM,CAAC,aAAa,GAAG,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;QACpE,IAAI,MAAM;YAAE,MAAM,CAAC,UAAU,GAAG,EAAE,SAAS,EAAE,KAAK,CAAC,MAAO,CAAC,SAAS,EAAE,KAAK,EAAE,KAAK,CAAC,MAAO,CAAC,KAAK,EAAE,WAAW,EAAE,KAAK,CAAC,MAAO,CAAC,WAAW,EAAE,CAAC;IAC7I,CAAC;IACD,KAAK,MAAM,QAAQ,IAAI,UAAU,CAAC,SAAS,EAAE,CAAC;QAC5C,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,QAAQ,CAAC,EAAE,CAAE,CAAC;QAC9D,QAAQ,CAAC,gBAAgB,GAAG,KAAK,CAAC,MAAM,CAAC;QACzC,QAAQ,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,YAAY,CAAmB,CAAC;QACtH,QAAQ,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;QAC/B,QAAQ,CAAC,QAAQ,GAAG,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;IAC/F,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { RepoConfig } from '../contracts.js';
|
|
2
|
+
import type { ProjectSnapshot } from './types.js';
|
|
3
|
+
export declare function canonical(value: unknown): string;
|
|
4
|
+
export declare const inputHash: (value: unknown) => string;
|
|
5
|
+
export declare function createProjectSnapshot(config: RepoConfig, root: string, snapshotHash: string, signal?: AbortSignal): Promise<ProjectSnapshot>;
|