arggon-harness 0.1.0
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 +229 -0
- package/config/default-opencode.json +21 -0
- package/dist/init.d.ts +3 -0
- package/dist/init.d.ts.map +1 -0
- package/dist/init.js +406 -0
- package/dist/init.js.map +1 -0
- package/dist/plugin/engine/artifact-graph.d.ts +38 -0
- package/dist/plugin/engine/artifact-graph.d.ts.map +1 -0
- package/dist/plugin/engine/artifact-graph.js +137 -0
- package/dist/plugin/engine/artifact-graph.js.map +1 -0
- package/dist/plugin/engine/config.d.ts +21 -0
- package/dist/plugin/engine/config.d.ts.map +1 -0
- package/dist/plugin/engine/config.js +146 -0
- package/dist/plugin/engine/config.js.map +1 -0
- package/dist/plugin/engine/delta-apply.d.ts +23 -0
- package/dist/plugin/engine/delta-apply.d.ts.map +1 -0
- package/dist/plugin/engine/delta-apply.js +153 -0
- package/dist/plugin/engine/delta-apply.js.map +1 -0
- package/dist/plugin/engine/git.d.ts +32 -0
- package/dist/plugin/engine/git.d.ts.map +1 -0
- package/dist/plugin/engine/git.js +61 -0
- package/dist/plugin/engine/git.js.map +1 -0
- package/dist/plugin/engine/integrity.d.ts +45 -0
- package/dist/plugin/engine/integrity.d.ts.map +1 -0
- package/dist/plugin/engine/integrity.js +98 -0
- package/dist/plugin/engine/integrity.js.map +1 -0
- package/dist/plugin/engine/registry.d.ts +39 -0
- package/dist/plugin/engine/registry.d.ts.map +1 -0
- package/dist/plugin/engine/registry.js +191 -0
- package/dist/plugin/engine/registry.js.map +1 -0
- package/dist/plugin/engine/state.d.ts +31 -0
- package/dist/plugin/engine/state.d.ts.map +1 -0
- package/dist/plugin/engine/state.js +116 -0
- package/dist/plugin/engine/state.js.map +1 -0
- package/dist/plugin/engine/task-tracker.d.ts +66 -0
- package/dist/plugin/engine/task-tracker.d.ts.map +1 -0
- package/dist/plugin/engine/task-tracker.js +124 -0
- package/dist/plugin/engine/task-tracker.js.map +1 -0
- package/dist/plugin/engine/types.d.ts +349 -0
- package/dist/plugin/engine/types.d.ts.map +1 -0
- package/dist/plugin/engine/types.js +3 -0
- package/dist/plugin/engine/types.js.map +1 -0
- package/dist/plugin/engine/validator.d.ts +52 -0
- package/dist/plugin/engine/validator.d.ts.map +1 -0
- package/dist/plugin/engine/validator.js +457 -0
- package/dist/plugin/engine/validator.js.map +1 -0
- package/dist/plugin/engine/verifier.d.ts +61 -0
- package/dist/plugin/engine/verifier.d.ts.map +1 -0
- package/dist/plugin/engine/verifier.js +441 -0
- package/dist/plugin/engine/verifier.js.map +1 -0
- package/dist/plugin/hooks/context-injection.d.ts +11 -0
- package/dist/plugin/hooks/context-injection.d.ts.map +1 -0
- package/dist/plugin/hooks/context-injection.js +88 -0
- package/dist/plugin/hooks/context-injection.js.map +1 -0
- package/dist/plugin/hooks/event-handlers.d.ts +9 -0
- package/dist/plugin/hooks/event-handlers.d.ts.map +1 -0
- package/dist/plugin/hooks/event-handlers.js +10 -0
- package/dist/plugin/hooks/event-handlers.js.map +1 -0
- package/dist/plugin/hooks/workflow-gate.d.ts +24 -0
- package/dist/plugin/hooks/workflow-gate.d.ts.map +1 -0
- package/dist/plugin/hooks/workflow-gate.js +78 -0
- package/dist/plugin/hooks/workflow-gate.js.map +1 -0
- package/dist/plugin/index.d.ts +423 -0
- package/dist/plugin/index.d.ts.map +1 -0
- package/dist/plugin/index.js +253 -0
- package/dist/plugin/index.js.map +1 -0
- package/dist/plugin/tools/spec-artifact-instr.d.ts +7 -0
- package/dist/plugin/tools/spec-artifact-instr.d.ts.map +1 -0
- package/dist/plugin/tools/spec-artifact-instr.js +73 -0
- package/dist/plugin/tools/spec-artifact-instr.js.map +1 -0
- package/dist/plugin/tools/spec-change-archive.d.ts +6 -0
- package/dist/plugin/tools/spec-change-archive.d.ts.map +1 -0
- package/dist/plugin/tools/spec-change-archive.js +62 -0
- package/dist/plugin/tools/spec-change-archive.js.map +1 -0
- package/dist/plugin/tools/spec-change-list.d.ts +3 -0
- package/dist/plugin/tools/spec-change-list.d.ts.map +1 -0
- package/dist/plugin/tools/spec-change-list.js +38 -0
- package/dist/plugin/tools/spec-change-list.js.map +1 -0
- package/dist/plugin/tools/spec-change-new.d.ts +7 -0
- package/dist/plugin/tools/spec-change-new.d.ts.map +1 -0
- package/dist/plugin/tools/spec-change-new.js +47 -0
- package/dist/plugin/tools/spec-change-new.js.map +1 -0
- package/dist/plugin/tools/spec-change-status.d.ts +6 -0
- package/dist/plugin/tools/spec-change-status.d.ts.map +1 -0
- package/dist/plugin/tools/spec-change-status.js +43 -0
- package/dist/plugin/tools/spec-change-status.js.map +1 -0
- package/dist/plugin/tools/spec-design-critique.d.ts +20 -0
- package/dist/plugin/tools/spec-design-critique.d.ts.map +1 -0
- package/dist/plugin/tools/spec-design-critique.js +412 -0
- package/dist/plugin/tools/spec-design-critique.js.map +1 -0
- package/dist/plugin/tools/spec-design-hifi.d.ts +119 -0
- package/dist/plugin/tools/spec-design-hifi.d.ts.map +1 -0
- package/dist/plugin/tools/spec-design-hifi.js +653 -0
- package/dist/plugin/tools/spec-design-hifi.js.map +1 -0
- package/dist/plugin/tools/spec-design-wireframe.d.ts +91 -0
- package/dist/plugin/tools/spec-design-wireframe.d.ts.map +1 -0
- package/dist/plugin/tools/spec-design-wireframe.js +357 -0
- package/dist/plugin/tools/spec-design-wireframe.js.map +1 -0
- package/dist/plugin/tools/spec-init.d.ts +9 -0
- package/dist/plugin/tools/spec-init.d.ts.map +1 -0
- package/dist/plugin/tools/spec-init.js +58 -0
- package/dist/plugin/tools/spec-init.js.map +1 -0
- package/dist/plugin/tools/spec-integrity-check.d.ts +6 -0
- package/dist/plugin/tools/spec-integrity-check.d.ts.map +1 -0
- package/dist/plugin/tools/spec-integrity-check.js +19 -0
- package/dist/plugin/tools/spec-integrity-check.js.map +1 -0
- package/dist/plugin/tools/spec-registry-update.d.ts +3 -0
- package/dist/plugin/tools/spec-registry-update.d.ts.map +1 -0
- package/dist/plugin/tools/spec-registry-update.js +34 -0
- package/dist/plugin/tools/spec-registry-update.js.map +1 -0
- package/dist/plugin/tools/spec-schema-list.d.ts +3 -0
- package/dist/plugin/tools/spec-schema-list.d.ts.map +1 -0
- package/dist/plugin/tools/spec-schema-list.js +28 -0
- package/dist/plugin/tools/spec-schema-list.js.map +1 -0
- package/dist/plugin/tools/spec-specs-apply.d.ts +7 -0
- package/dist/plugin/tools/spec-specs-apply.d.ts.map +1 -0
- package/dist/plugin/tools/spec-specs-apply.js +49 -0
- package/dist/plugin/tools/spec-specs-apply.js.map +1 -0
- package/dist/plugin/tools/spec-task-progress.d.ts +8 -0
- package/dist/plugin/tools/spec-task-progress.d.ts.map +1 -0
- package/dist/plugin/tools/spec-task-progress.js +96 -0
- package/dist/plugin/tools/spec-task-progress.js.map +1 -0
- package/dist/plugin/tools/spec-validate.d.ts +21 -0
- package/dist/plugin/tools/spec-validate.d.ts.map +1 -0
- package/dist/plugin/tools/spec-validate.js +182 -0
- package/dist/plugin/tools/spec-validate.js.map +1 -0
- package/dist/plugin/tools/spec-verify.d.ts +7 -0
- package/dist/plugin/tools/spec-verify.d.ts.map +1 -0
- package/dist/plugin/tools/spec-verify.js +50 -0
- package/dist/plugin/tools/spec-verify.js.map +1 -0
- package/dist/plugin/tools/util.d.ts +25 -0
- package/dist/plugin/tools/util.d.ts.map +1 -0
- package/dist/plugin/tools/util.js +33 -0
- package/dist/plugin/tools/util.js.map +1 -0
- package/package.json +61 -0
- package/src/agents/orchestrator.md +158 -0
- package/src/agents/spec-apply.md +114 -0
- package/src/agents/spec-archive.md +103 -0
- package/src/agents/spec-propose.md +120 -0
- package/src/agents/spec-verify.md +103 -0
- package/src/commands/spec-init.md +6 -0
- package/src/commands/spec-onboard.md +6 -0
- package/src/commands/spec-status.md +6 -0
- package/src/commands/spec-sync.md +6 -0
- package/src/schemas/hybrid.yaml +144 -0
- package/src/schemas/spec-driven.yaml +155 -0
- package/src/schemas/tdd.yaml +203 -0
- package/src/skills/playwright-cli/SKILL.md +388 -0
- package/src/skills/playwright-cli/references/element-attributes.md +23 -0
- package/src/skills/playwright-cli/references/playwright-tests.md +39 -0
- package/src/skills/playwright-cli/references/request-mocking.md +87 -0
- package/src/skills/playwright-cli/references/running-code.md +241 -0
- package/src/skills/playwright-cli/references/session-management.md +225 -0
- package/src/skills/playwright-cli/references/spec-driven-testing.md +305 -0
- package/src/skills/playwright-cli/references/storage-state.md +275 -0
- package/src/skills/playwright-cli/references/test-generation.md +134 -0
- package/src/skills/playwright-cli/references/tracing.md +139 -0
- package/src/skills/playwright-cli/references/video-recording.md +143 -0
- package/src/skills/spec-init/SKILL.md +61 -0
- package/src/skills/spec-onboard/SKILL.md +178 -0
- package/src/skills/spec-status/SKILL.md +72 -0
- package/src/skills/spec-sync/SKILL.md +63 -0
- package/src/templates/config.yaml +14 -0
- package/src/templates/design-hifi.yaml +580 -0
- package/src/templates/design-tech.yaml +42 -0
- package/src/templates/design-wireframe.yaml +114 -0
- package/src/templates/proposal.yaml +43 -0
- package/src/templates/registry.yaml +3 -0
- package/src/templates/spec.yaml +56 -0
- package/src/templates/tasks.yaml +58 -0
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { execFile } from "child_process";
|
|
2
|
+
import { promisify } from "util";
|
|
3
|
+
const execFileAsync = promisify(execFile);
|
|
4
|
+
/**
|
|
5
|
+
* Checks whether the given directory is inside a git repository.
|
|
6
|
+
* Runs `git rev-parse --is-inside-work-tree` in projectRoot.
|
|
7
|
+
* Never throws — errors are captured in the return value.
|
|
8
|
+
*/
|
|
9
|
+
export async function isGitRepo(projectRoot) {
|
|
10
|
+
try {
|
|
11
|
+
await execFileAsync("git", ["rev-parse", "--is-inside-work-tree"], { cwd: projectRoot });
|
|
12
|
+
return { success: true, isRepo: true };
|
|
13
|
+
}
|
|
14
|
+
catch {
|
|
15
|
+
return { success: true, isRepo: false };
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Checks whether there are uncommitted changes (staged or unstaged).
|
|
20
|
+
* Runs `git status --porcelain` in projectRoot.
|
|
21
|
+
* Never throws — errors are captured in the return value.
|
|
22
|
+
*/
|
|
23
|
+
export async function hasChanges(projectRoot) {
|
|
24
|
+
try {
|
|
25
|
+
const { stdout } = await execFileAsync("git", ["status", "--porcelain"], { cwd: projectRoot });
|
|
26
|
+
return { success: true, hasChanges: stdout.trim().length > 0 };
|
|
27
|
+
}
|
|
28
|
+
catch (err) {
|
|
29
|
+
return { success: false, hasChanges: false };
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Stages all changes with `git add -A` and creates a commit with the given message.
|
|
34
|
+
* Returns the full 40-character commit hash on success.
|
|
35
|
+
* Never throws — all errors are captured in the return value.
|
|
36
|
+
*/
|
|
37
|
+
export async function gitCommit(projectRoot, message) {
|
|
38
|
+
try {
|
|
39
|
+
await execFileAsync("git", ["add", "-A"], { cwd: projectRoot });
|
|
40
|
+
const { stdout } = await execFileAsync("git", ["commit", "-m", message], { cwd: projectRoot });
|
|
41
|
+
const hashMatch = stdout.match(/\[([a-f0-9]+)\s/) ?? stdout.match(/([a-f0-9]{40})/);
|
|
42
|
+
let hash = hashMatch?.[1] ?? null;
|
|
43
|
+
// If we didn't capture a hash from stdout, retrieve it with git rev-parse
|
|
44
|
+
if (!hash) {
|
|
45
|
+
try {
|
|
46
|
+
const { stdout: revParseOut } = await execFileAsync("git", ["rev-parse", "HEAD"], { cwd: projectRoot });
|
|
47
|
+
hash = revParseOut.trim() || null;
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
// Could not retrieve hash — leave as null
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return { success: true, hash, error: null };
|
|
54
|
+
}
|
|
55
|
+
catch (err) {
|
|
56
|
+
const stderr = err?.stderr?.toString?.()?.trim() ?? "";
|
|
57
|
+
const errMsg = stderr || err?.message || "git commit failed";
|
|
58
|
+
return { success: false, hash: null, error: errMsg };
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=git.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git.js","sourceRoot":"","sources":["../../../src/plugin/engine/git.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAA;AAEhC,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAA;AAkBzC;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,WAAmB;IACjD,IAAI,CAAC;QACH,MAAM,aAAa,CAAC,KAAK,EAAE,CAAC,WAAW,EAAE,uBAAuB,CAAC,EAAE,EAAE,GAAG,EAAE,WAAW,EAAE,CAAC,CAAA;QACxF,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAA;IACxC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAA;IACzC,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,WAAmB;IAClD,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,aAAa,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,aAAa,CAAC,EAAE,EAAE,GAAG,EAAE,WAAW,EAAE,CAAC,CAAA;QAC9F,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAA;IAChE,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,CAAA;IAC9C,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,WAAmB,EAAE,OAAe;IAClE,IAAI,CAAC;QACH,MAAM,aAAa,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,EAAE,GAAG,EAAE,WAAW,EAAE,CAAC,CAAA;QAC/D,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,aAAa,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,EAAE,EAAE,GAAG,EAAE,WAAW,EAAE,CAAC,CAAA;QAC9F,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,iBAAiB,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAA;QACnF,IAAI,IAAI,GAAkB,SAAS,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAA;QAEhD,0EAA0E;QAC1E,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,IAAI,CAAC;gBACH,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,aAAa,CAAC,KAAK,EAAE,CAAC,WAAW,EAAE,MAAM,CAAC,EAAE,EAAE,GAAG,EAAE,WAAW,EAAE,CAAC,CAAA;gBACvG,IAAI,GAAG,WAAW,CAAC,IAAI,EAAE,IAAI,IAAI,CAAA;YACnC,CAAC;YAAC,MAAM,CAAC;gBACP,0CAA0C;YAC5C,CAAC;QACH,CAAC;QAED,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAA;IAC7C,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,MAAM,MAAM,GAAG,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAA;QACtD,MAAM,MAAM,GAAG,MAAM,IAAI,GAAG,EAAE,OAAO,IAAI,mBAAmB,CAAA;QAC5D,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,CAAA;IACtD,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import type { IntegrityResult } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Per-artifact hash information for integrity verification.
|
|
4
|
+
*/
|
|
5
|
+
export interface ArtifactHashInfo {
|
|
6
|
+
path?: string;
|
|
7
|
+
paths?: string[];
|
|
8
|
+
hash?: string;
|
|
9
|
+
hashes?: string[];
|
|
10
|
+
completed: boolean;
|
|
11
|
+
completed_at?: string;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Computes SHA-256 hash of content.
|
|
15
|
+
* @param content - The content to hash
|
|
16
|
+
* @returns Hex-encoded hash string
|
|
17
|
+
*/
|
|
18
|
+
export declare function computeHash(content: string): string;
|
|
19
|
+
/**
|
|
20
|
+
* Verifies a file's hash matches expected value.
|
|
21
|
+
* @param filePath - Path to the file
|
|
22
|
+
* @param expectedHash - Expected SHA-256 hash
|
|
23
|
+
* @returns True if hash matches
|
|
24
|
+
*/
|
|
25
|
+
export declare function verifyArtifact(filePath: string, expectedHash: string): Promise<boolean>;
|
|
26
|
+
/**
|
|
27
|
+
* Verifies integrity of all artifacts in a change.
|
|
28
|
+
* @param changeDir - Path to the change directory
|
|
29
|
+
* @param artifacts - Record of artifact hash info (formerly on Meta)
|
|
30
|
+
* @returns Integrity result with mismatches and missing files
|
|
31
|
+
*/
|
|
32
|
+
export declare function verifyChange(changeDir: string, artifacts: Record<string, ArtifactHashInfo>): Promise<IntegrityResult>;
|
|
33
|
+
/**
|
|
34
|
+
* Computes hash for a file.
|
|
35
|
+
* @param filePath - Path to the file
|
|
36
|
+
* @returns Hex-encoded hash string or null if file doesn't exist
|
|
37
|
+
*/
|
|
38
|
+
export declare function hashFile(filePath: string): Promise<string | null>;
|
|
39
|
+
/**
|
|
40
|
+
* Computes hashes for multiple files.
|
|
41
|
+
* @param filePaths - Array of file paths
|
|
42
|
+
* @returns Map of file paths to hashes
|
|
43
|
+
*/
|
|
44
|
+
export declare function hashFiles(filePaths: string[]): Promise<Map<string, string>>;
|
|
45
|
+
//# sourceMappingURL=integrity.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"integrity.d.ts","sourceRoot":"","sources":["../../../src/plugin/engine/integrity.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAEjD;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;IAChB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;IACjB,SAAS,EAAE,OAAO,CAAA;IAClB,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED;;;;;GAKG;AACH,wBAAsB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAQ7F;AAED;;;;;GAKG;AACH,wBAAsB,YAAY,CAChC,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,GAC1C,OAAO,CAAC,eAAe,CAAC,CAwC1B;AAED;;;;GAIG;AACH,wBAAsB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAOvE;AAED;;;;GAIG;AACH,wBAAsB,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAWjF"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import * as fs from 'fs/promises';
|
|
2
|
+
import * as crypto from 'crypto';
|
|
3
|
+
/**
|
|
4
|
+
* Computes SHA-256 hash of content.
|
|
5
|
+
* @param content - The content to hash
|
|
6
|
+
* @returns Hex-encoded hash string
|
|
7
|
+
*/
|
|
8
|
+
export function computeHash(content) {
|
|
9
|
+
return crypto.createHash('sha256').update(content, 'utf8').digest('hex');
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Verifies a file's hash matches expected value.
|
|
13
|
+
* @param filePath - Path to the file
|
|
14
|
+
* @param expectedHash - Expected SHA-256 hash
|
|
15
|
+
* @returns True if hash matches
|
|
16
|
+
*/
|
|
17
|
+
export async function verifyArtifact(filePath, expectedHash) {
|
|
18
|
+
try {
|
|
19
|
+
const content = await fs.readFile(filePath, 'utf8');
|
|
20
|
+
const actualHash = computeHash(content);
|
|
21
|
+
return actualHash === expectedHash;
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
return false;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Verifies integrity of all artifacts in a change.
|
|
29
|
+
* @param changeDir - Path to the change directory
|
|
30
|
+
* @param artifacts - Record of artifact hash info (formerly on Meta)
|
|
31
|
+
* @returns Integrity result with mismatches and missing files
|
|
32
|
+
*/
|
|
33
|
+
export async function verifyChange(changeDir, artifacts) {
|
|
34
|
+
const mismatches = [];
|
|
35
|
+
const missing = [];
|
|
36
|
+
for (const [artifactId, artifactInfo] of Object.entries(artifacts)) {
|
|
37
|
+
if (!artifactInfo)
|
|
38
|
+
continue;
|
|
39
|
+
const paths = artifactInfo.paths || (artifactInfo.path ? [artifactInfo.path] : []);
|
|
40
|
+
const hashes = artifactInfo.hashes || (artifactInfo.hash ? [artifactInfo.hash] : []);
|
|
41
|
+
for (let i = 0; i < paths.length; i++) {
|
|
42
|
+
const filePath = paths[i];
|
|
43
|
+
const expectedHash = hashes[i];
|
|
44
|
+
if (!expectedHash)
|
|
45
|
+
continue;
|
|
46
|
+
const fullPath = `${changeDir}/${filePath}`;
|
|
47
|
+
try {
|
|
48
|
+
const content = await fs.readFile(fullPath, 'utf8');
|
|
49
|
+
const actualHash = computeHash(content);
|
|
50
|
+
if (actualHash !== expectedHash) {
|
|
51
|
+
mismatches.push({
|
|
52
|
+
path: filePath,
|
|
53
|
+
expected: expectedHash,
|
|
54
|
+
actual: actualHash
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
missing.push(filePath);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
return {
|
|
64
|
+
valid: mismatches.length === 0 && missing.length === 0,
|
|
65
|
+
mismatches,
|
|
66
|
+
missing
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Computes hash for a file.
|
|
71
|
+
* @param filePath - Path to the file
|
|
72
|
+
* @returns Hex-encoded hash string or null if file doesn't exist
|
|
73
|
+
*/
|
|
74
|
+
export async function hashFile(filePath) {
|
|
75
|
+
try {
|
|
76
|
+
const content = await fs.readFile(filePath, 'utf8');
|
|
77
|
+
return computeHash(content);
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
return null;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Computes hashes for multiple files.
|
|
85
|
+
* @param filePaths - Array of file paths
|
|
86
|
+
* @returns Map of file paths to hashes
|
|
87
|
+
*/
|
|
88
|
+
export async function hashFiles(filePaths) {
|
|
89
|
+
const result = new Map();
|
|
90
|
+
for (const filePath of filePaths) {
|
|
91
|
+
const hash = await hashFile(filePath);
|
|
92
|
+
if (hash) {
|
|
93
|
+
result.set(filePath, hash);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
return result;
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=integrity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"integrity.js","sourceRoot":"","sources":["../../../src/plugin/engine/integrity.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { ChangeInfo, Registry } from './types.ts';
|
|
2
|
+
/**
|
|
3
|
+
* Reads the change registry from spec/registry.yaml.
|
|
4
|
+
* @param projectRoot - Path to the project root
|
|
5
|
+
* @returns The parsed registry
|
|
6
|
+
*/
|
|
7
|
+
export declare function readRegistry(projectRoot: string): Promise<Registry>;
|
|
8
|
+
/**
|
|
9
|
+
* Writes the change registry to spec/registry.yaml.
|
|
10
|
+
* @param projectRoot - Path to the project root
|
|
11
|
+
* @param registry - The registry to write
|
|
12
|
+
*/
|
|
13
|
+
export declare function writeRegistry(projectRoot: string, registry: Registry): Promise<void>;
|
|
14
|
+
/**
|
|
15
|
+
* Registers a new change in the registry.
|
|
16
|
+
* @param projectRoot - Path to the project root
|
|
17
|
+
* @param change - The change info to register
|
|
18
|
+
*/
|
|
19
|
+
export declare function registerChange(projectRoot: string, change: ChangeInfo): Promise<void>;
|
|
20
|
+
/**
|
|
21
|
+
* Unregisters a change from the registry.
|
|
22
|
+
* @param projectRoot - Path to the project root
|
|
23
|
+
* @param changeName - Name of the change to remove
|
|
24
|
+
*/
|
|
25
|
+
export declare function unregisterChange(projectRoot: string, changeName: string): Promise<void>;
|
|
26
|
+
/**
|
|
27
|
+
* Gets a specific change from the registry.
|
|
28
|
+
* @param projectRoot - Path to the project root
|
|
29
|
+
* @param changeName - Name of the change to find
|
|
30
|
+
* @returns The change info or undefined
|
|
31
|
+
*/
|
|
32
|
+
export declare function getChange(projectRoot: string, changeName: string): Promise<ChangeInfo | undefined>;
|
|
33
|
+
/**
|
|
34
|
+
* Lists all active changes in the registry.
|
|
35
|
+
* @param projectRoot - Path to the project root
|
|
36
|
+
* @returns Array of active change infos
|
|
37
|
+
*/
|
|
38
|
+
export declare function listActiveChanges(projectRoot: string): Promise<ChangeInfo[]>;
|
|
39
|
+
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/plugin/engine/registry.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAEtD;;;;GAIG;AACH,wBAAsB,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAYzE;AAED;;;;GAIG;AACH,wBAAsB,aAAa,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAY1F;AAED;;;;GAIG;AACH,wBAAsB,cAAc,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAY3F;AAED;;;;GAIG;AACH,wBAAsB,gBAAgB,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAK7F;AAED;;;;;GAKG;AACH,wBAAsB,SAAS,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,CAGxG;AAED;;;;GAIG;AACH,wBAAsB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAGlF"}
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
import * as fs from 'fs/promises';
|
|
2
|
+
import * as path from 'path';
|
|
3
|
+
/**
|
|
4
|
+
* Reads the change registry from spec/registry.yaml.
|
|
5
|
+
* @param projectRoot - Path to the project root
|
|
6
|
+
* @returns The parsed registry
|
|
7
|
+
*/
|
|
8
|
+
export async function readRegistry(projectRoot) {
|
|
9
|
+
const registryPath = path.join(projectRoot, 'spec', 'registry.yaml');
|
|
10
|
+
try {
|
|
11
|
+
const content = await fs.readFile(registryPath, 'utf8');
|
|
12
|
+
return parseRegistryYaml(content);
|
|
13
|
+
}
|
|
14
|
+
catch (err) {
|
|
15
|
+
if (err.code === 'ENOENT') {
|
|
16
|
+
return { changes: [], last_updated: new Date().toISOString() };
|
|
17
|
+
}
|
|
18
|
+
throw err;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Writes the change registry to spec/registry.yaml.
|
|
23
|
+
* @param projectRoot - Path to the project root
|
|
24
|
+
* @param registry - The registry to write
|
|
25
|
+
*/
|
|
26
|
+
export async function writeRegistry(projectRoot, registry) {
|
|
27
|
+
const registryPath = path.join(projectRoot, 'spec', 'registry.yaml');
|
|
28
|
+
const specDir = path.join(projectRoot, 'spec');
|
|
29
|
+
try {
|
|
30
|
+
await fs.mkdir(specDir, { recursive: true });
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
// directory may already exist
|
|
34
|
+
}
|
|
35
|
+
const content = serializeRegistryYaml(registry);
|
|
36
|
+
await fs.writeFile(registryPath, content, 'utf8');
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Registers a new change in the registry.
|
|
40
|
+
* @param projectRoot - Path to the project root
|
|
41
|
+
* @param change - The change info to register
|
|
42
|
+
*/
|
|
43
|
+
export async function registerChange(projectRoot, change) {
|
|
44
|
+
const registry = await readRegistry(projectRoot);
|
|
45
|
+
const existing = registry.changes.findIndex(c => c.name === change.name);
|
|
46
|
+
if (existing !== -1) {
|
|
47
|
+
registry.changes[existing] = change;
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
registry.changes.push(change);
|
|
51
|
+
}
|
|
52
|
+
registry.last_updated = new Date().toISOString();
|
|
53
|
+
await writeRegistry(projectRoot, registry);
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Unregisters a change from the registry.
|
|
57
|
+
* @param projectRoot - Path to the project root
|
|
58
|
+
* @param changeName - Name of the change to remove
|
|
59
|
+
*/
|
|
60
|
+
export async function unregisterChange(projectRoot, changeName) {
|
|
61
|
+
const registry = await readRegistry(projectRoot);
|
|
62
|
+
registry.changes = registry.changes.filter(c => c.name !== changeName);
|
|
63
|
+
registry.last_updated = new Date().toISOString();
|
|
64
|
+
await writeRegistry(projectRoot, registry);
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Gets a specific change from the registry.
|
|
68
|
+
* @param projectRoot - Path to the project root
|
|
69
|
+
* @param changeName - Name of the change to find
|
|
70
|
+
* @returns The change info or undefined
|
|
71
|
+
*/
|
|
72
|
+
export async function getChange(projectRoot, changeName) {
|
|
73
|
+
const registry = await readRegistry(projectRoot);
|
|
74
|
+
return registry.changes.find(c => c.name === changeName);
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Lists all active changes in the registry.
|
|
78
|
+
* @param projectRoot - Path to the project root
|
|
79
|
+
* @returns Array of active change infos
|
|
80
|
+
*/
|
|
81
|
+
export async function listActiveChanges(projectRoot) {
|
|
82
|
+
const registry = await readRegistry(projectRoot);
|
|
83
|
+
return registry.changes.filter(c => c.status === 'active');
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Simple YAML parser for registry files.
|
|
87
|
+
*/
|
|
88
|
+
function parseRegistryYaml(content) {
|
|
89
|
+
const result = { changes: [], last_updated: new Date().toISOString() };
|
|
90
|
+
const lines = content.split('\n');
|
|
91
|
+
let currentChange = null;
|
|
92
|
+
let inChanges = false;
|
|
93
|
+
let inArtifacts = false;
|
|
94
|
+
for (const line of lines) {
|
|
95
|
+
const trimmed = line.trim();
|
|
96
|
+
if (trimmed === '' || trimmed.startsWith('#'))
|
|
97
|
+
continue;
|
|
98
|
+
const indent = line.length - line.trimStart().length;
|
|
99
|
+
if (indent === 0) {
|
|
100
|
+
if (trimmed.startsWith('last_updated:')) {
|
|
101
|
+
result.last_updated = trimmed.substring('last_updated:'.length).trim().replace(/['"]/g, '');
|
|
102
|
+
}
|
|
103
|
+
else if (trimmed === 'changes:') {
|
|
104
|
+
inChanges = true;
|
|
105
|
+
}
|
|
106
|
+
continue;
|
|
107
|
+
}
|
|
108
|
+
if (inChanges) {
|
|
109
|
+
if (trimmed.startsWith('- ')) {
|
|
110
|
+
if (currentChange) {
|
|
111
|
+
result.changes.push(currentChange);
|
|
112
|
+
}
|
|
113
|
+
currentChange = { artifacts: {} };
|
|
114
|
+
inArtifacts = false;
|
|
115
|
+
const rest = trimmed.substring(2).trim();
|
|
116
|
+
if (rest.includes(':')) {
|
|
117
|
+
const colonIdx = rest.indexOf(':');
|
|
118
|
+
const key = rest.substring(0, colonIdx).trim();
|
|
119
|
+
const val = rest.substring(colonIdx + 1).trim().replace(/['"]/g, '');
|
|
120
|
+
setChangeField(currentChange, key, val);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
else if (currentChange) {
|
|
124
|
+
if (trimmed === 'artifacts:') {
|
|
125
|
+
inArtifacts = true;
|
|
126
|
+
}
|
|
127
|
+
else if (inArtifacts && trimmed.includes(':')) {
|
|
128
|
+
const colonIdx = trimmed.indexOf(':');
|
|
129
|
+
const key = trimmed.substring(0, colonIdx).trim();
|
|
130
|
+
const val = trimmed.substring(colonIdx + 1).trim();
|
|
131
|
+
currentChange.artifacts[key] = val === 'true';
|
|
132
|
+
}
|
|
133
|
+
else if (trimmed.includes(':')) {
|
|
134
|
+
inArtifacts = false;
|
|
135
|
+
const colonIdx = trimmed.indexOf(':');
|
|
136
|
+
const key = trimmed.substring(0, colonIdx).trim();
|
|
137
|
+
const val = trimmed.substring(colonIdx + 1).trim().replace(/['"]/g, '');
|
|
138
|
+
setChangeField(currentChange, key, val);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
if (currentChange) {
|
|
144
|
+
result.changes.push(currentChange);
|
|
145
|
+
}
|
|
146
|
+
return result;
|
|
147
|
+
}
|
|
148
|
+
function setChangeField(change, key, value) {
|
|
149
|
+
switch (key) {
|
|
150
|
+
case 'name':
|
|
151
|
+
change.name = value;
|
|
152
|
+
break;
|
|
153
|
+
case 'schema':
|
|
154
|
+
change.schema = value;
|
|
155
|
+
break;
|
|
156
|
+
case 'status':
|
|
157
|
+
change.status = value;
|
|
158
|
+
break;
|
|
159
|
+
case 'created':
|
|
160
|
+
change.created = value;
|
|
161
|
+
break;
|
|
162
|
+
case 'progress':
|
|
163
|
+
change.progress = parseFloat(value) || 0;
|
|
164
|
+
break;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Serializes registry to YAML format.
|
|
169
|
+
*/
|
|
170
|
+
function serializeRegistryYaml(registry) {
|
|
171
|
+
const lines = [];
|
|
172
|
+
lines.push(`last_updated: '${registry.last_updated}'`);
|
|
173
|
+
lines.push('changes:');
|
|
174
|
+
for (const change of registry.changes) {
|
|
175
|
+
lines.push(` - name: '${change.name}'`);
|
|
176
|
+
lines.push(` schema: '${change.schema}'`);
|
|
177
|
+
lines.push(` status: ${change.status}`);
|
|
178
|
+
lines.push(` created: '${change.created}'`);
|
|
179
|
+
lines.push(` progress: ${change.progress}`);
|
|
180
|
+
lines.push(' artifacts:');
|
|
181
|
+
if (change.artifacts) {
|
|
182
|
+
for (const [key, value] of Object.entries(change.artifacts)) {
|
|
183
|
+
if (value !== undefined) {
|
|
184
|
+
lines.push(` ${key}: ${value}`);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
return lines.join('\n') + '\n';
|
|
190
|
+
}
|
|
191
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/plugin/engine/registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { ArtifactId, CompletedSet, Schema } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Detects which artifacts are completed by checking file existence.
|
|
4
|
+
* @param changeDir - Path to the change directory
|
|
5
|
+
* @param schema - The schema containing artifact definitions
|
|
6
|
+
* @returns Set of completed artifact IDs
|
|
7
|
+
*/
|
|
8
|
+
export declare function detectCompleted(changeDir: string, schema: Schema): Promise<CompletedSet>;
|
|
9
|
+
/**
|
|
10
|
+
* Checks if an artifact is complete by verifying its generated files exist.
|
|
11
|
+
* @param changeDir - Path to the change directory
|
|
12
|
+
* @param generates - Glob pattern or path for generated files
|
|
13
|
+
* @returns True if the artifact is complete
|
|
14
|
+
*/
|
|
15
|
+
export declare function isArtifactComplete(changeDir: string, generates: string): Promise<boolean>;
|
|
16
|
+
/**
|
|
17
|
+
* Gets the file paths for a completed artifact.
|
|
18
|
+
* @param changeDir - Path to the change directory
|
|
19
|
+
* @param generates - Glob pattern or path for generated files
|
|
20
|
+
* @returns Array of file paths
|
|
21
|
+
*/
|
|
22
|
+
export declare function getArtifactPaths(changeDir: string, generates: string): Promise<string[]>;
|
|
23
|
+
/**
|
|
24
|
+
* Finds all artifact IDs that are ready to be built.
|
|
25
|
+
* @param changeDir - Path to the change directory
|
|
26
|
+
* @param schema - The schema containing artifact definitions
|
|
27
|
+
* @param skipped - Optional set of artifact IDs to skip (only respected for optional artifacts)
|
|
28
|
+
* @returns Array of artifact IDs that can be built next
|
|
29
|
+
*/
|
|
30
|
+
export declare function getBuildableArtifacts(changeDir: string, schema: Schema, skipped?: CompletedSet): Promise<ArtifactId[]>;
|
|
31
|
+
//# sourceMappingURL=state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../../src/plugin/engine/state.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AAGlE;;;;;GAKG;AACH,wBAAsB,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAW9F;AAED;;;;;GAKG;AACH,wBAAsB,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CA4B/F;AAED;;;;;GAKG;AACH,wBAAsB,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CA4B9F;AAED;;;;;;GAMG;AACH,wBAAsB,qBAAqB,CACzC,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC,UAAU,EAAE,CAAC,CAkBvB"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import * as fs from 'fs/promises';
|
|
2
|
+
import * as path from 'path';
|
|
3
|
+
import { buildGraph, getNextArtifacts } from './artifact-graph.js';
|
|
4
|
+
/**
|
|
5
|
+
* Detects which artifacts are completed by checking file existence.
|
|
6
|
+
* @param changeDir - Path to the change directory
|
|
7
|
+
* @param schema - The schema containing artifact definitions
|
|
8
|
+
* @returns Set of completed artifact IDs
|
|
9
|
+
*/
|
|
10
|
+
export async function detectCompleted(changeDir, schema) {
|
|
11
|
+
const completed = new Set();
|
|
12
|
+
for (const artifact of schema.artifacts) {
|
|
13
|
+
const isComplete = await isArtifactComplete(changeDir, artifact.generates);
|
|
14
|
+
if (isComplete) {
|
|
15
|
+
completed.add(artifact.id);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
return completed;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Checks if an artifact is complete by verifying its generated files exist.
|
|
22
|
+
* @param changeDir - Path to the change directory
|
|
23
|
+
* @param generates - Glob pattern or path for generated files
|
|
24
|
+
* @returns True if the artifact is complete
|
|
25
|
+
*/
|
|
26
|
+
export async function isArtifactComplete(changeDir, generates) {
|
|
27
|
+
try {
|
|
28
|
+
if (generates.includes('*')) {
|
|
29
|
+
const dirPattern = generates.split('*')[0];
|
|
30
|
+
const dirPath = path.join(changeDir, dirPattern);
|
|
31
|
+
try {
|
|
32
|
+
const stat = await fs.stat(dirPath);
|
|
33
|
+
if (!stat.isDirectory())
|
|
34
|
+
return false;
|
|
35
|
+
const files = await fs.readdir(dirPath);
|
|
36
|
+
return files.length > 0;
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
return false;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
const filePath = path.join(changeDir, generates);
|
|
44
|
+
try {
|
|
45
|
+
const stat = await fs.stat(filePath);
|
|
46
|
+
return stat.isFile() || stat.isDirectory();
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
return false;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
return false;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Gets the file paths for a completed artifact.
|
|
59
|
+
* @param changeDir - Path to the change directory
|
|
60
|
+
* @param generates - Glob pattern or path for generated files
|
|
61
|
+
* @returns Array of file paths
|
|
62
|
+
*/
|
|
63
|
+
export async function getArtifactPaths(changeDir, generates) {
|
|
64
|
+
try {
|
|
65
|
+
if (generates.includes('*')) {
|
|
66
|
+
const dirPattern = generates.split('*')[0];
|
|
67
|
+
const dirPath = path.join(changeDir, dirPattern);
|
|
68
|
+
try {
|
|
69
|
+
const stat = await fs.stat(dirPath);
|
|
70
|
+
if (!stat.isDirectory())
|
|
71
|
+
return [];
|
|
72
|
+
const files = await fs.readdir(dirPath);
|
|
73
|
+
return files.map(f => path.join(dirPattern, f));
|
|
74
|
+
}
|
|
75
|
+
catch {
|
|
76
|
+
return [];
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
const filePath = path.join(changeDir, generates);
|
|
81
|
+
try {
|
|
82
|
+
await fs.access(filePath);
|
|
83
|
+
return [generates];
|
|
84
|
+
}
|
|
85
|
+
catch {
|
|
86
|
+
return [];
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
catch {
|
|
91
|
+
return [];
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Finds all artifact IDs that are ready to be built.
|
|
96
|
+
* @param changeDir - Path to the change directory
|
|
97
|
+
* @param schema - The schema containing artifact definitions
|
|
98
|
+
* @param skipped - Optional set of artifact IDs to skip (only respected for optional artifacts)
|
|
99
|
+
* @returns Array of artifact IDs that can be built next
|
|
100
|
+
*/
|
|
101
|
+
export async function getBuildableArtifacts(changeDir, schema, skipped) {
|
|
102
|
+
const completed = await detectCompleted(changeDir, schema);
|
|
103
|
+
// Filter skipped to only include artifacts defined as optional in the schema
|
|
104
|
+
const validSkipped = new Set();
|
|
105
|
+
if (skipped) {
|
|
106
|
+
const optionalIds = new Set(schema.artifacts.filter(a => a.optional).map(a => a.id));
|
|
107
|
+
for (const id of skipped) {
|
|
108
|
+
if (optionalIds.has(id)) {
|
|
109
|
+
validSkipped.add(id);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
const graph = buildGraph(schema);
|
|
114
|
+
return getNextArtifacts(graph, completed, validSkipped);
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.js","sourceRoot":"","sources":["../../../src/plugin/engine/state.ts"],"names":[],"mappings":"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"}
|