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.
Files changed (170) hide show
  1. package/README.md +229 -0
  2. package/config/default-opencode.json +21 -0
  3. package/dist/init.d.ts +3 -0
  4. package/dist/init.d.ts.map +1 -0
  5. package/dist/init.js +406 -0
  6. package/dist/init.js.map +1 -0
  7. package/dist/plugin/engine/artifact-graph.d.ts +38 -0
  8. package/dist/plugin/engine/artifact-graph.d.ts.map +1 -0
  9. package/dist/plugin/engine/artifact-graph.js +137 -0
  10. package/dist/plugin/engine/artifact-graph.js.map +1 -0
  11. package/dist/plugin/engine/config.d.ts +21 -0
  12. package/dist/plugin/engine/config.d.ts.map +1 -0
  13. package/dist/plugin/engine/config.js +146 -0
  14. package/dist/plugin/engine/config.js.map +1 -0
  15. package/dist/plugin/engine/delta-apply.d.ts +23 -0
  16. package/dist/plugin/engine/delta-apply.d.ts.map +1 -0
  17. package/dist/plugin/engine/delta-apply.js +153 -0
  18. package/dist/plugin/engine/delta-apply.js.map +1 -0
  19. package/dist/plugin/engine/git.d.ts +32 -0
  20. package/dist/plugin/engine/git.d.ts.map +1 -0
  21. package/dist/plugin/engine/git.js +61 -0
  22. package/dist/plugin/engine/git.js.map +1 -0
  23. package/dist/plugin/engine/integrity.d.ts +45 -0
  24. package/dist/plugin/engine/integrity.d.ts.map +1 -0
  25. package/dist/plugin/engine/integrity.js +98 -0
  26. package/dist/plugin/engine/integrity.js.map +1 -0
  27. package/dist/plugin/engine/registry.d.ts +39 -0
  28. package/dist/plugin/engine/registry.d.ts.map +1 -0
  29. package/dist/plugin/engine/registry.js +191 -0
  30. package/dist/plugin/engine/registry.js.map +1 -0
  31. package/dist/plugin/engine/state.d.ts +31 -0
  32. package/dist/plugin/engine/state.d.ts.map +1 -0
  33. package/dist/plugin/engine/state.js +116 -0
  34. package/dist/plugin/engine/state.js.map +1 -0
  35. package/dist/plugin/engine/task-tracker.d.ts +66 -0
  36. package/dist/plugin/engine/task-tracker.d.ts.map +1 -0
  37. package/dist/plugin/engine/task-tracker.js +124 -0
  38. package/dist/plugin/engine/task-tracker.js.map +1 -0
  39. package/dist/plugin/engine/types.d.ts +349 -0
  40. package/dist/plugin/engine/types.d.ts.map +1 -0
  41. package/dist/plugin/engine/types.js +3 -0
  42. package/dist/plugin/engine/types.js.map +1 -0
  43. package/dist/plugin/engine/validator.d.ts +52 -0
  44. package/dist/plugin/engine/validator.d.ts.map +1 -0
  45. package/dist/plugin/engine/validator.js +457 -0
  46. package/dist/plugin/engine/validator.js.map +1 -0
  47. package/dist/plugin/engine/verifier.d.ts +61 -0
  48. package/dist/plugin/engine/verifier.d.ts.map +1 -0
  49. package/dist/plugin/engine/verifier.js +441 -0
  50. package/dist/plugin/engine/verifier.js.map +1 -0
  51. package/dist/plugin/hooks/context-injection.d.ts +11 -0
  52. package/dist/plugin/hooks/context-injection.d.ts.map +1 -0
  53. package/dist/plugin/hooks/context-injection.js +88 -0
  54. package/dist/plugin/hooks/context-injection.js.map +1 -0
  55. package/dist/plugin/hooks/event-handlers.d.ts +9 -0
  56. package/dist/plugin/hooks/event-handlers.d.ts.map +1 -0
  57. package/dist/plugin/hooks/event-handlers.js +10 -0
  58. package/dist/plugin/hooks/event-handlers.js.map +1 -0
  59. package/dist/plugin/hooks/workflow-gate.d.ts +24 -0
  60. package/dist/plugin/hooks/workflow-gate.d.ts.map +1 -0
  61. package/dist/plugin/hooks/workflow-gate.js +78 -0
  62. package/dist/plugin/hooks/workflow-gate.js.map +1 -0
  63. package/dist/plugin/index.d.ts +423 -0
  64. package/dist/plugin/index.d.ts.map +1 -0
  65. package/dist/plugin/index.js +253 -0
  66. package/dist/plugin/index.js.map +1 -0
  67. package/dist/plugin/tools/spec-artifact-instr.d.ts +7 -0
  68. package/dist/plugin/tools/spec-artifact-instr.d.ts.map +1 -0
  69. package/dist/plugin/tools/spec-artifact-instr.js +73 -0
  70. package/dist/plugin/tools/spec-artifact-instr.js.map +1 -0
  71. package/dist/plugin/tools/spec-change-archive.d.ts +6 -0
  72. package/dist/plugin/tools/spec-change-archive.d.ts.map +1 -0
  73. package/dist/plugin/tools/spec-change-archive.js +62 -0
  74. package/dist/plugin/tools/spec-change-archive.js.map +1 -0
  75. package/dist/plugin/tools/spec-change-list.d.ts +3 -0
  76. package/dist/plugin/tools/spec-change-list.d.ts.map +1 -0
  77. package/dist/plugin/tools/spec-change-list.js +38 -0
  78. package/dist/plugin/tools/spec-change-list.js.map +1 -0
  79. package/dist/plugin/tools/spec-change-new.d.ts +7 -0
  80. package/dist/plugin/tools/spec-change-new.d.ts.map +1 -0
  81. package/dist/plugin/tools/spec-change-new.js +47 -0
  82. package/dist/plugin/tools/spec-change-new.js.map +1 -0
  83. package/dist/plugin/tools/spec-change-status.d.ts +6 -0
  84. package/dist/plugin/tools/spec-change-status.d.ts.map +1 -0
  85. package/dist/plugin/tools/spec-change-status.js +43 -0
  86. package/dist/plugin/tools/spec-change-status.js.map +1 -0
  87. package/dist/plugin/tools/spec-design-critique.d.ts +20 -0
  88. package/dist/plugin/tools/spec-design-critique.d.ts.map +1 -0
  89. package/dist/plugin/tools/spec-design-critique.js +412 -0
  90. package/dist/plugin/tools/spec-design-critique.js.map +1 -0
  91. package/dist/plugin/tools/spec-design-hifi.d.ts +119 -0
  92. package/dist/plugin/tools/spec-design-hifi.d.ts.map +1 -0
  93. package/dist/plugin/tools/spec-design-hifi.js +653 -0
  94. package/dist/plugin/tools/spec-design-hifi.js.map +1 -0
  95. package/dist/plugin/tools/spec-design-wireframe.d.ts +91 -0
  96. package/dist/plugin/tools/spec-design-wireframe.d.ts.map +1 -0
  97. package/dist/plugin/tools/spec-design-wireframe.js +357 -0
  98. package/dist/plugin/tools/spec-design-wireframe.js.map +1 -0
  99. package/dist/plugin/tools/spec-init.d.ts +9 -0
  100. package/dist/plugin/tools/spec-init.d.ts.map +1 -0
  101. package/dist/plugin/tools/spec-init.js +58 -0
  102. package/dist/plugin/tools/spec-init.js.map +1 -0
  103. package/dist/plugin/tools/spec-integrity-check.d.ts +6 -0
  104. package/dist/plugin/tools/spec-integrity-check.d.ts.map +1 -0
  105. package/dist/plugin/tools/spec-integrity-check.js +19 -0
  106. package/dist/plugin/tools/spec-integrity-check.js.map +1 -0
  107. package/dist/plugin/tools/spec-registry-update.d.ts +3 -0
  108. package/dist/plugin/tools/spec-registry-update.d.ts.map +1 -0
  109. package/dist/plugin/tools/spec-registry-update.js +34 -0
  110. package/dist/plugin/tools/spec-registry-update.js.map +1 -0
  111. package/dist/plugin/tools/spec-schema-list.d.ts +3 -0
  112. package/dist/plugin/tools/spec-schema-list.d.ts.map +1 -0
  113. package/dist/plugin/tools/spec-schema-list.js +28 -0
  114. package/dist/plugin/tools/spec-schema-list.js.map +1 -0
  115. package/dist/plugin/tools/spec-specs-apply.d.ts +7 -0
  116. package/dist/plugin/tools/spec-specs-apply.d.ts.map +1 -0
  117. package/dist/plugin/tools/spec-specs-apply.js +49 -0
  118. package/dist/plugin/tools/spec-specs-apply.js.map +1 -0
  119. package/dist/plugin/tools/spec-task-progress.d.ts +8 -0
  120. package/dist/plugin/tools/spec-task-progress.d.ts.map +1 -0
  121. package/dist/plugin/tools/spec-task-progress.js +96 -0
  122. package/dist/plugin/tools/spec-task-progress.js.map +1 -0
  123. package/dist/plugin/tools/spec-validate.d.ts +21 -0
  124. package/dist/plugin/tools/spec-validate.d.ts.map +1 -0
  125. package/dist/plugin/tools/spec-validate.js +182 -0
  126. package/dist/plugin/tools/spec-validate.js.map +1 -0
  127. package/dist/plugin/tools/spec-verify.d.ts +7 -0
  128. package/dist/plugin/tools/spec-verify.d.ts.map +1 -0
  129. package/dist/plugin/tools/spec-verify.js +50 -0
  130. package/dist/plugin/tools/spec-verify.js.map +1 -0
  131. package/dist/plugin/tools/util.d.ts +25 -0
  132. package/dist/plugin/tools/util.d.ts.map +1 -0
  133. package/dist/plugin/tools/util.js +33 -0
  134. package/dist/plugin/tools/util.js.map +1 -0
  135. package/package.json +61 -0
  136. package/src/agents/orchestrator.md +158 -0
  137. package/src/agents/spec-apply.md +114 -0
  138. package/src/agents/spec-archive.md +103 -0
  139. package/src/agents/spec-propose.md +120 -0
  140. package/src/agents/spec-verify.md +103 -0
  141. package/src/commands/spec-init.md +6 -0
  142. package/src/commands/spec-onboard.md +6 -0
  143. package/src/commands/spec-status.md +6 -0
  144. package/src/commands/spec-sync.md +6 -0
  145. package/src/schemas/hybrid.yaml +144 -0
  146. package/src/schemas/spec-driven.yaml +155 -0
  147. package/src/schemas/tdd.yaml +203 -0
  148. package/src/skills/playwright-cli/SKILL.md +388 -0
  149. package/src/skills/playwright-cli/references/element-attributes.md +23 -0
  150. package/src/skills/playwright-cli/references/playwright-tests.md +39 -0
  151. package/src/skills/playwright-cli/references/request-mocking.md +87 -0
  152. package/src/skills/playwright-cli/references/running-code.md +241 -0
  153. package/src/skills/playwright-cli/references/session-management.md +225 -0
  154. package/src/skills/playwright-cli/references/spec-driven-testing.md +305 -0
  155. package/src/skills/playwright-cli/references/storage-state.md +275 -0
  156. package/src/skills/playwright-cli/references/test-generation.md +134 -0
  157. package/src/skills/playwright-cli/references/tracing.md +139 -0
  158. package/src/skills/playwright-cli/references/video-recording.md +143 -0
  159. package/src/skills/spec-init/SKILL.md +61 -0
  160. package/src/skills/spec-onboard/SKILL.md +178 -0
  161. package/src/skills/spec-status/SKILL.md +72 -0
  162. package/src/skills/spec-sync/SKILL.md +63 -0
  163. package/src/templates/config.yaml +14 -0
  164. package/src/templates/design-hifi.yaml +580 -0
  165. package/src/templates/design-tech.yaml +42 -0
  166. package/src/templates/design-wireframe.yaml +114 -0
  167. package/src/templates/proposal.yaml +43 -0
  168. package/src/templates/registry.yaml +3 -0
  169. package/src/templates/spec.yaml +56 -0
  170. 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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"}