codex-genesis-harness 0.1.0 → 0.1.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.
Files changed (231) hide show
  1. package/.codebase/API_CONTRACTS.md +12 -0
  2. package/.codebase/ARCHITECTURE.md +6 -0
  3. package/.codebase/CURRENT_STATE.md +6 -0
  4. package/.codebase/DEPENDENCY_GRAPH.md +14 -0
  5. package/.codebase/DOMAIN_MODELS.md +8 -0
  6. package/.codebase/EVOLUTION_PLAN.md +35 -0
  7. package/.codebase/KNOWN_PROBLEMS.md +6 -0
  8. package/.codebase/MODULE_INDEX.md +13 -0
  9. package/.codebase/PIPELINE_FLOW.md +14 -0
  10. package/.codebase/TEST_MATRIX.md +11 -0
  11. package/.codebase/UI_ROUTES.md +4 -0
  12. package/.codebase/context/backend-summary.md +4 -0
  13. package/.codebase/context/frontend-summary.md +4 -0
  14. package/.codebase/context/pipeline-summary.md +4 -0
  15. package/.codebase/context/providers-summary.md +4 -0
  16. package/.codebase/context/render-summary.md +4 -0
  17. package/.codebase/context/tests-summary.md +4 -0
  18. package/.codex/skills/ai-provider-skill/SKILL.md +46 -0
  19. package/.codex/skills/ai-provider-skill/agents/openai.yaml +7 -0
  20. package/.codex/skills/ai-provider-skill/checklists/checklist.md +9 -0
  21. package/.codex/skills/ai-provider-skill/examples/example.md +4 -0
  22. package/.codex/skills/ai-provider-skill/templates/provider-contract-template.md +9 -0
  23. package/.codex/skills/api-contract-skill/SKILL.md +46 -0
  24. package/.codex/skills/api-contract-skill/agents/openai.yaml +7 -0
  25. package/.codex/skills/api-contract-skill/checklists/checklist.md +8 -0
  26. package/.codex/skills/api-contract-skill/examples/example.md +4 -0
  27. package/.codex/skills/api-contract-skill/templates/api-contract-template.md +4 -0
  28. package/.codex/skills/architecture-skill/SKILL.md +46 -0
  29. package/.codex/skills/architecture-skill/agents/openai.yaml +7 -0
  30. package/.codex/skills/architecture-skill/checklists/checklist.md +8 -0
  31. package/.codex/skills/architecture-skill/examples/example.md +4 -0
  32. package/.codex/skills/architecture-skill/templates/architecture-decision-template.md +14 -0
  33. package/.codex/skills/codebase-map-skill/SKILL.md +46 -0
  34. package/.codex/skills/codebase-map-skill/agents/openai.yaml +7 -0
  35. package/.codex/skills/codebase-map-skill/checklists/checklist.md +7 -0
  36. package/.codex/skills/codebase-map-skill/examples/example.md +4 -0
  37. package/.codex/skills/codebase-map-skill/templates/map-update-template.md +8 -0
  38. package/.codex/skills/design-spec-skill/SKILL.md +46 -0
  39. package/.codex/skills/design-spec-skill/agents/openai.yaml +7 -0
  40. package/.codex/skills/design-spec-skill/checklists/checklist.md +7 -0
  41. package/.codex/skills/design-spec-skill/examples/example.md +4 -0
  42. package/.codex/skills/design-spec-skill/templates/design-spec-template.md +9 -0
  43. package/.codex/skills/docs-skill/SKILL.md +46 -0
  44. package/.codex/skills/docs-skill/agents/openai.yaml +7 -0
  45. package/.codex/skills/docs-skill/checklists/checklist.md +7 -0
  46. package/.codex/skills/docs-skill/examples/example.md +4 -0
  47. package/.codex/skills/docs-skill/templates/docs-update-template.md +8 -0
  48. package/.codex/skills/{project-genesis-harness → genesis-harness}/SKILL.md +43 -4
  49. package/.codex/skills/genesis-harness/agents/openai.yaml +9 -0
  50. package/.codex/skills/genesis-harness/checklists/checklist.md +10 -0
  51. package/.codex/skills/genesis-harness/examples/example.md +4 -0
  52. package/.codex/skills/genesis-harness/templates/harness-workflow-template.md +10 -0
  53. package/.codex/skills/genesis-new-design/SKILL.md +95 -0
  54. package/.codex/skills/genesis-new-design/agents/openai.yaml +4 -0
  55. package/.codex/skills/genesis-new-design/checklists/checklist.md +8 -0
  56. package/.codex/skills/genesis-new-design/examples/example.md +4 -0
  57. package/.codex/skills/genesis-new-design/templates/new-design-template.md +9 -0
  58. package/.codex/skills/genesis-upgrade-design/SKILL.md +97 -0
  59. package/.codex/skills/genesis-upgrade-design/agents/openai.yaml +4 -0
  60. package/.codex/skills/genesis-upgrade-design/checklists/checklist.md +8 -0
  61. package/.codex/skills/genesis-upgrade-design/examples/example.md +4 -0
  62. package/.codex/skills/genesis-upgrade-design/templates/upgrade-design-template.md +9 -0
  63. package/.codex/skills/harness-engineering-skill/SKILL.md +45 -0
  64. package/.codex/skills/harness-engineering-skill/agents/openai.yaml +7 -0
  65. package/.codex/skills/harness-engineering-skill/checklists/checklist.md +8 -0
  66. package/.codex/skills/harness-engineering-skill/examples/example.md +4 -0
  67. package/.codex/skills/harness-engineering-skill/templates/harness-change-template.md +8 -0
  68. package/.codex/skills/pipeline-orchestration-skill/SKILL.md +46 -0
  69. package/.codex/skills/pipeline-orchestration-skill/agents/openai.yaml +7 -0
  70. package/.codex/skills/pipeline-orchestration-skill/checklists/checklist.md +12 -0
  71. package/.codex/skills/pipeline-orchestration-skill/examples/example.md +4 -0
  72. package/.codex/skills/pipeline-orchestration-skill/templates/orchestration-template.md +12 -0
  73. package/.codex/skills/planning-skill/SKILL.md +46 -0
  74. package/.codex/skills/planning-skill/agents/openai.yaml +7 -0
  75. package/.codex/skills/planning-skill/checklists/checklist.md +8 -0
  76. package/.codex/skills/planning-skill/examples/example.md +4 -0
  77. package/.codex/skills/planning-skill/templates/plan-template.md +11 -0
  78. package/.codex/skills/release-skill/SKILL.md +46 -0
  79. package/.codex/skills/release-skill/agents/openai.yaml +7 -0
  80. package/.codex/skills/release-skill/checklists/checklist.md +8 -0
  81. package/.codex/skills/release-skill/examples/example.md +4 -0
  82. package/.codex/skills/release-skill/templates/release-checklist-template.md +9 -0
  83. package/.codex/skills/research-skill/SKILL.md +46 -0
  84. package/.codex/skills/research-skill/agents/openai.yaml +7 -0
  85. package/.codex/skills/research-skill/checklists/checklist.md +7 -0
  86. package/.codex/skills/research-skill/examples/example.md +4 -0
  87. package/.codex/skills/research-skill/templates/research-note-template.md +9 -0
  88. package/.codex/skills/ui-ux-test-skill/SKILL.md +46 -0
  89. package/.codex/skills/ui-ux-test-skill/agents/openai.yaml +7 -0
  90. package/.codex/skills/ui-ux-test-skill/checklists/checklist.md +8 -0
  91. package/.codex/skills/ui-ux-test-skill/examples/example.md +4 -0
  92. package/.codex/skills/ui-ux-test-skill/templates/playwright-test-template.md +4 -0
  93. package/.codex-plugin/plugin.json +13 -11
  94. package/README.md +164 -181
  95. package/bin/genesis-harness.js +124 -79
  96. package/contracts/agents/CharacterBibleAgent/error.json +1 -0
  97. package/contracts/agents/CharacterBibleAgent/example.json +1 -0
  98. package/contracts/agents/CharacterBibleAgent/request.json +1 -0
  99. package/contracts/agents/CharacterBibleAgent/response.json +1 -0
  100. package/contracts/agents/CharacterBibleAgent/schema.json +1 -0
  101. package/contracts/agents/ImageGenerationAgent/error.json +1 -0
  102. package/contracts/agents/ImageGenerationAgent/example.json +1 -0
  103. package/contracts/agents/ImageGenerationAgent/request.json +1 -0
  104. package/contracts/agents/ImageGenerationAgent/response.json +1 -0
  105. package/contracts/agents/ImageGenerationAgent/schema.json +1 -0
  106. package/contracts/agents/PipelineOrchestrator/error.json +1 -0
  107. package/contracts/agents/PipelineOrchestrator/example.json +1 -0
  108. package/contracts/agents/PipelineOrchestrator/request.json +1 -0
  109. package/contracts/agents/PipelineOrchestrator/response.json +1 -0
  110. package/contracts/agents/PipelineOrchestrator/schema.json +1 -0
  111. package/contracts/agents/PromptGenerationAgent/error.json +1 -0
  112. package/contracts/agents/PromptGenerationAgent/example.json +1 -0
  113. package/contracts/agents/PromptGenerationAgent/request.json +1 -0
  114. package/contracts/agents/PromptGenerationAgent/response.json +1 -0
  115. package/contracts/agents/PromptGenerationAgent/schema.json +1 -0
  116. package/contracts/agents/RenderAgent/error.json +1 -0
  117. package/contracts/agents/RenderAgent/example.json +1 -0
  118. package/contracts/agents/RenderAgent/request.json +1 -0
  119. package/contracts/agents/RenderAgent/response.json +1 -0
  120. package/contracts/agents/RenderAgent/schema.json +1 -0
  121. package/contracts/agents/ScenePlanningAgent/error.json +1 -0
  122. package/contracts/agents/ScenePlanningAgent/example.json +1 -0
  123. package/contracts/agents/ScenePlanningAgent/request.json +1 -0
  124. package/contracts/agents/ScenePlanningAgent/response.json +1 -0
  125. package/contracts/agents/ScenePlanningAgent/schema.json +1 -0
  126. package/contracts/agents/ScreenplayAgent/error.json +1 -0
  127. package/contracts/agents/ScreenplayAgent/example.json +1 -0
  128. package/contracts/agents/ScreenplayAgent/request.json +1 -0
  129. package/contracts/agents/ScreenplayAgent/response.json +1 -0
  130. package/contracts/agents/ScreenplayAgent/schema.json +1 -0
  131. package/contracts/agents/StoryAnalysisAgent/error.json +1 -0
  132. package/contracts/agents/StoryAnalysisAgent/example.json +1 -0
  133. package/contracts/agents/StoryAnalysisAgent/request.json +1 -0
  134. package/contracts/agents/StoryAnalysisAgent/response.json +1 -0
  135. package/contracts/agents/StoryAnalysisAgent/schema.json +1 -0
  136. package/contracts/agents/SubtitleGenerationAgent/error.json +1 -0
  137. package/contracts/agents/SubtitleGenerationAgent/example.json +1 -0
  138. package/contracts/agents/SubtitleGenerationAgent/request.json +1 -0
  139. package/contracts/agents/SubtitleGenerationAgent/response.json +1 -0
  140. package/contracts/agents/SubtitleGenerationAgent/schema.json +1 -0
  141. package/contracts/agents/VoiceGenerationAgent/error.json +1 -0
  142. package/contracts/agents/VoiceGenerationAgent/example.json +1 -0
  143. package/contracts/agents/VoiceGenerationAgent/request.json +1 -0
  144. package/contracts/agents/VoiceGenerationAgent/response.json +1 -0
  145. package/contracts/agents/VoiceGenerationAgent/schema.json +1 -0
  146. package/contracts/api/README.md +4 -0
  147. package/contracts/api/endpoint-template/error.json +7 -0
  148. package/contracts/api/endpoint-template/example.json +11 -0
  149. package/contracts/api/endpoint-template/request.json +7 -0
  150. package/contracts/api/endpoint-template/response.json +6 -0
  151. package/contracts/api/endpoint-template/schema.json +9 -0
  152. package/contracts/events/README.md +4 -0
  153. package/contracts/events/event-template/error.json +4 -0
  154. package/contracts/events/event-template/example.json +6 -0
  155. package/contracts/events/event-template/request.json +6 -0
  156. package/contracts/events/event-template/response.json +3 -0
  157. package/contracts/events/event-template/schema.json +8 -0
  158. package/contracts/ui/README.md +4 -0
  159. package/contracts/ui/screen-template/error.json +4 -0
  160. package/contracts/ui/screen-template/example.json +7 -0
  161. package/contracts/ui/screen-template/request.json +4 -0
  162. package/contracts/ui/screen-template/response.json +4 -0
  163. package/contracts/ui/screen-template/schema.json +8 -0
  164. package/fixtures/agents/agent-fixture-template.md +14 -0
  165. package/fixtures/api/api-fixture-template.md +14 -0
  166. package/fixtures/images/image-fixture-template.md +14 -0
  167. package/fixtures/pipeline/pipeline-fixture-template.md +14 -0
  168. package/fixtures/render/render-fixture-template.md +14 -0
  169. package/fixtures/tts/tts-fixture-template.md +14 -0
  170. package/fixtures/videos/video-fixture-template.md +14 -0
  171. package/observability/agent-runs/agent-run-template.md +22 -0
  172. package/observability/decision-logs/decision-log-template.md +18 -0
  173. package/observability/failures/failure-template.md +18 -0
  174. package/package.json +8 -2
  175. package/playwright/e2e/e2e-template.md +4 -0
  176. package/playwright/fixtures/ui-fixture-template.md +4 -0
  177. package/playwright/smoke/smoke-template.md +4 -0
  178. package/playwright/visual/visual-regression-template.md +4 -0
  179. package/scripts/install.sh +64 -39
  180. package/scripts/run-evals.sh +61 -22
  181. package/scripts/uninstall.sh +40 -20
  182. package/scripts/verify.sh +234 -55
  183. package/tests/contracts/contract-template.test.md +10 -0
  184. package/tests/fixtures/fixture-index.md +4 -0
  185. package/tests/integration/integration-template.test.md +4 -0
  186. package/tests/unit/unit-template.test.md +4 -0
  187. package/.codex/skills/project-genesis-harness/agents/openai.yaml +0 -9
  188. /package/.codex/skills/{project-genesis-harness → genesis-harness}/references/planning-schema.md +0 -0
  189. /package/.codex/skills/{project-genesis-harness → genesis-harness}/references/quality-rubric.md +0 -0
  190. /package/.codex/skills/{project-genesis-harness → genesis-harness}/references/research-rubric.md +0 -0
  191. /package/.codex/skills/{project-genesis-harness → genesis-harness}/references/workflows.md +0 -0
  192. /package/.codex/skills/{project-genesis-harness → genesis-harness}/resources/agents-template.md +0 -0
  193. /package/.codex/skills/{project-genesis-harness → genesis-harness}/resources/api-docs-template.md +0 -0
  194. /package/.codex/skills/{project-genesis-harness → genesis-harness}/resources/architecture-template.md +0 -0
  195. /package/.codex/skills/{project-genesis-harness → genesis-harness}/resources/audit-template.md +0 -0
  196. /package/.codex/skills/{project-genesis-harness → genesis-harness}/resources/bug-template.md +0 -0
  197. /package/.codex/skills/{project-genesis-harness → genesis-harness}/resources/check-template.md +0 -0
  198. /package/.codex/skills/{project-genesis-harness → genesis-harness}/resources/conventions-template.md +0 -0
  199. /package/.codex/skills/{project-genesis-harness → genesis-harness}/resources/decision-template.md +0 -0
  200. /package/.codex/skills/{project-genesis-harness → genesis-harness}/resources/design-template.md +0 -0
  201. /package/.codex/skills/{project-genesis-harness → genesis-harness}/resources/escalation-template.md +0 -0
  202. /package/.codex/skills/{project-genesis-harness → genesis-harness}/resources/feature-template.md +0 -0
  203. /package/.codex/skills/{project-genesis-harness → genesis-harness}/resources/integrations-template.md +0 -0
  204. /package/.codex/skills/{project-genesis-harness → genesis-harness}/resources/journeys-template.md +0 -0
  205. /package/.codex/skills/{project-genesis-harness → genesis-harness}/resources/lessons-learned-template.md +0 -0
  206. /package/.codex/skills/{project-genesis-harness → genesis-harness}/resources/observability-template.md +0 -0
  207. /package/.codex/skills/{project-genesis-harness → genesis-harness}/resources/phase-template.md +0 -0
  208. /package/.codex/skills/{project-genesis-harness → genesis-harness}/resources/pitfalls-template.md +0 -0
  209. /package/.codex/skills/{project-genesis-harness → genesis-harness}/resources/planning-tree-template.md +0 -0
  210. /package/.codex/skills/{project-genesis-harness → genesis-harness}/resources/project-template.md +0 -0
  211. /package/.codex/skills/{project-genesis-harness → genesis-harness}/resources/quality-score-template.md +0 -0
  212. /package/.codex/skills/{project-genesis-harness → genesis-harness}/resources/requirements-template.md +0 -0
  213. /package/.codex/skills/{project-genesis-harness → genesis-harness}/resources/research-template.md +0 -0
  214. /package/.codex/skills/{project-genesis-harness → genesis-harness}/resources/review-template.md +0 -0
  215. /package/.codex/skills/{project-genesis-harness → genesis-harness}/resources/spec-changelog-template.md +0 -0
  216. /package/.codex/skills/{project-genesis-harness → genesis-harness}/resources/stack-template.md +0 -0
  217. /package/.codex/skills/{project-genesis-harness → genesis-harness}/resources/verification-template.md +0 -0
  218. /package/.codex/skills/{project-genesis-harness → genesis-harness}/scripts/check-architecture-boundaries.sh +0 -0
  219. /package/.codex/skills/{project-genesis-harness → genesis-harness}/scripts/check-docs-sync.sh +0 -0
  220. /package/.codex/skills/{project-genesis-harness → genesis-harness}/scripts/check-no-debug-logs.sh +0 -0
  221. /package/.codex/skills/{project-genesis-harness → genesis-harness}/scripts/check-required-planning-files.sh +0 -0
  222. /package/.codex/skills/{project-genesis-harness → genesis-harness}/scripts/check-spec-changelog.sh +0 -0
  223. /package/.codex/skills/{project-genesis-harness → genesis-harness}/scripts/check-task-tracking.sh +0 -0
  224. /package/.codex/skills/{project-genesis-harness → genesis-harness}/scripts/create-adr.sh +0 -0
  225. /package/.codex/skills/{project-genesis-harness → genesis-harness}/scripts/create-bug.sh +0 -0
  226. /package/.codex/skills/{project-genesis-harness → genesis-harness}/scripts/create-feature.sh +0 -0
  227. /package/.codex/skills/{project-genesis-harness → genesis-harness}/scripts/detect-stack.sh +0 -0
  228. /package/.codex/skills/{project-genesis-harness → genesis-harness}/scripts/init-planning.sh +0 -0
  229. /package/.codex/skills/{project-genesis-harness → genesis-harness}/scripts/list-changed-files.sh +0 -0
  230. /package/.codex/skills/{project-genesis-harness → genesis-harness}/scripts/run-verification.sh +0 -0
  231. /package/.codex/skills/{project-genesis-harness → genesis-harness}/scripts/update-state.sh +0 -0
@@ -3,15 +3,32 @@
3
3
 
4
4
  const fs = require("fs");
5
5
  const path = require("path");
6
- const { spawnSync } = require("child_process");
7
-
8
- const packageRoot = path.resolve(__dirname, "..");
9
- const skillName = "project-genesis-harness";
10
- const sourceDir = path.join(packageRoot, ".codex", "skills", skillName);
11
- const codexHome = process.env.CODEX_HOME || path.join(process.env.HOME || "", ".codex");
12
- const agentsHome = process.env.GENESIS_HARNESS_HOME || path.join(process.env.HOME || "", ".agents");
13
- const legacyTargetDir = path.join(codexHome, "skills", skillName);
14
- const agentsTargetDir = path.join(agentsHome, "skills", skillName);
6
+ const { spawnSync } = require("child_process");
7
+
8
+ const packageRoot = path.resolve(__dirname, "..");
9
+ const skillNames = [
10
+ "genesis-harness",
11
+ "genesis-new-design",
12
+ "genesis-upgrade-design",
13
+ "architecture-skill",
14
+ "planning-skill",
15
+ "codebase-map-skill",
16
+ "design-spec-skill",
17
+ "api-contract-skill",
18
+ "ui-ux-test-skill",
19
+ "harness-engineering-skill",
20
+ "ai-provider-skill",
21
+ "pipeline-orchestration-skill",
22
+ "research-skill",
23
+ "docs-skill",
24
+ "release-skill"
25
+ ];
26
+ const legacySkillNames = ["project-genesis-harness"];
27
+ const sourceRoot = path.join(packageRoot, ".codex", "skills");
28
+ const codexHome = process.env.CODEX_HOME || path.join(process.env.HOME || "", ".codex");
29
+ const agentsHome = process.env.GENESIS_HARNESS_HOME || path.join(process.env.HOME || "", ".agents");
30
+ const legacySkillsRoot = path.join(codexHome, "skills");
31
+ const agentsSkillsRoot = path.join(agentsHome, "skills");
15
32
 
16
33
  function usage(exitCode = 0) {
17
34
  const text = `
@@ -37,12 +54,14 @@ function fail(message) {
37
54
  process.exit(1);
38
55
  }
39
56
 
40
- function ensureSource() {
41
- const skillFile = path.join(sourceDir, "SKILL.md");
42
- if (!fs.existsSync(skillFile)) {
43
- fail(`missing packaged skill at ${skillFile}`);
44
- }
45
- }
57
+ function ensureSource() {
58
+ for (const skillName of skillNames) {
59
+ const skillFile = path.join(sourceRoot, skillName, "SKILL.md");
60
+ if (!fs.existsSync(skillFile)) {
61
+ fail(`missing packaged skill at ${skillFile}`);
62
+ }
63
+ }
64
+ }
46
65
 
47
66
  function parseTarget(args, fallback = "both") {
48
67
  let target = fallback;
@@ -58,55 +77,78 @@ function parseTarget(args, fallback = "both") {
58
77
  return target;
59
78
  }
60
79
 
61
- function targetDirs(target) {
62
- if (target === "agents") return [agentsTargetDir];
63
- if (target === "legacy") return [legacyTargetDir];
64
- return [agentsTargetDir, legacyTargetDir];
65
- }
66
-
67
- function copySkill({ quiet = false, target = "both" } = {}) {
68
- ensureSource();
69
- for (const dir of targetDirs(target)) {
70
- fs.mkdirSync(path.dirname(dir), { recursive: true });
71
-
72
- if (fs.existsSync(dir)) {
73
- const backupDir = `${dir}.backup.${timestamp()}`;
74
- fs.renameSync(dir, backupDir);
75
- if (!quiet) console.log(`Existing skill backed up to: ${backupDir}`);
76
- }
77
-
78
- fs.cpSync(sourceDir, dir, { recursive: true });
79
- chmodScripts(path.join(dir, "scripts"));
80
-
81
- if (!quiet) console.log(`Installed ${skillName} to: ${dir}`);
82
- }
83
-
84
- if (!quiet) console.log(`Restart Codex, then invoke: Use $${skillName}`);
85
- }
86
-
87
- function uninstallSkill(target = "both") {
88
- for (const dir of targetDirs(target)) {
89
- if (!fs.existsSync(dir)) {
90
- console.log(`Skill is not installed at: ${dir}`);
91
- continue;
92
- }
93
- fs.rmSync(dir, { recursive: true, force: true });
94
- console.log(`Removed: ${dir}`);
95
- }
96
- }
97
-
98
- function verifySkill(target = "both") {
99
- const verifyScript = path.join(packageRoot, "scripts", "verify.sh");
100
- if (!fs.existsSync(verifyScript)) fail(`missing verify script at ${verifyScript}`);
101
-
102
- for (const verifyTarget of targetDirs(target)) {
103
- const result = spawnSync("bash", [verifyScript, verifyTarget], {
104
- stdio: "inherit",
105
- env: process.env
106
- });
107
- if (result.status) process.exit(result.status);
108
- }
109
- }
80
+ function targetRoots(target) {
81
+ if (target === "agents") return [agentsSkillsRoot];
82
+ if (target === "legacy") return [legacySkillsRoot];
83
+ return [agentsSkillsRoot, legacySkillsRoot];
84
+ }
85
+
86
+ function copySkills({ quiet = false, target = "both" } = {}) {
87
+ ensureSource();
88
+ for (const root of targetRoots(target)) {
89
+ fs.mkdirSync(root, { recursive: true });
90
+ for (const skillName of skillNames) {
91
+ const sourceDir = path.join(sourceRoot, skillName);
92
+ const dir = path.join(root, skillName);
93
+
94
+ if (fs.existsSync(dir)) {
95
+ const backupDir = `${dir}.backup.${timestamp()}`;
96
+ fs.renameSync(dir, backupDir);
97
+ if (!quiet) console.log(`Existing skill backed up to: ${backupDir}`);
98
+ }
99
+
100
+ fs.cpSync(sourceDir, dir, { recursive: true });
101
+ chmodScripts(path.join(dir, "scripts"));
102
+
103
+ if (!quiet) console.log(`Installed ${skillName} to: ${dir}`);
104
+ }
105
+ }
106
+
107
+ if (!quiet) console.log("Restart Codex, then invoke: Use $genesis-harness");
108
+ }
109
+
110
+ function uninstallSkills(target = "both") {
111
+ for (const root of targetRoots(target)) {
112
+ for (const skillName of [...skillNames, ...legacySkillNames]) {
113
+ const dir = path.join(root, skillName);
114
+ if (!fs.existsSync(dir)) {
115
+ console.log(`Skill is not installed at: ${dir}`);
116
+ continue;
117
+ }
118
+ fs.rmSync(dir, { recursive: true, force: true });
119
+ console.log(`Removed: ${dir}`);
120
+ }
121
+ }
122
+ }
123
+
124
+ function verifySkill(target = "both") {
125
+ const verifyScript = path.join(packageRoot, "scripts", "verify.sh");
126
+ if (!fs.existsSync(verifyScript)) fail(`missing verify script at ${verifyScript}`);
127
+ const bash = resolveBash();
128
+
129
+ for (const root of targetRoots(target)) {
130
+ for (const skillName of skillNames) {
131
+ const result = spawnSync(bash, [verifyScript, path.join(root, skillName)], {
132
+ stdio: "inherit",
133
+ env: process.env
134
+ });
135
+ if (result.status) process.exit(result.status);
136
+ }
137
+ }
138
+ }
139
+
140
+ function resolveBash() {
141
+ if (process.platform === "win32") {
142
+ const candidates = [
143
+ "C:\\Program Files\\Git\\bin\\bash.exe",
144
+ "C:\\Program Files\\Git\\usr\\bin\\bash.exe"
145
+ ];
146
+ for (const candidate of candidates) {
147
+ if (fs.existsSync(candidate)) return candidate;
148
+ }
149
+ }
150
+ return "bash";
151
+ }
110
152
 
111
153
  function chmodScripts(dir) {
112
154
  if (!fs.existsSync(dir)) return;
@@ -135,25 +177,28 @@ const command = process.argv[2] || "help";
135
177
  const args = process.argv.slice(3);
136
178
 
137
179
  switch (command) {
138
- case "install":
139
- copySkill({ target: parseTarget(args, "both") });
140
- break;
180
+ case "install":
181
+ copySkills({ target: parseTarget(args, "both") });
182
+ break;
141
183
  case "postinstall":
142
184
  if (process.env.GENESIS_HARNESS_SKIP_POSTINSTALL === "1") {
143
185
  process.exit(0);
144
186
  }
145
- copySkill({ quiet: true, target: "both" });
146
- break;
147
- case "verify":
148
- verifySkill(parseTarget(args, "both"));
149
- break;
150
- case "uninstall":
151
- uninstallSkill(parseTarget(args, "both"));
152
- break;
153
- case "path":
154
- console.log(agentsTargetDir);
155
- console.log(legacyTargetDir);
156
- break;
187
+ copySkills({ quiet: true, target: "both" });
188
+ break;
189
+ case "verify":
190
+ verifySkill(parseTarget(args, "both"));
191
+ break;
192
+ case "uninstall":
193
+ uninstallSkills(parseTarget(args, "both"));
194
+ break;
195
+ case "path":
196
+ for (const root of [agentsSkillsRoot, legacySkillsRoot]) {
197
+ for (const skillName of skillNames) {
198
+ console.log(path.join(root, skillName));
199
+ }
200
+ }
201
+ break;
157
202
  case "help":
158
203
  case "--help":
159
204
  case "-h":
@@ -0,0 +1 @@
1
+ {"error":"invalid_character_input","message":"CharacterBibleAgent input failed validation.","retryable":false}
@@ -0,0 +1 @@
1
+ {"input":{"storySummary":"A traveler returns home.","characters":["Traveler"]},"expected":{"characters":[{"name":"Traveler"}]}}
@@ -0,0 +1 @@
1
+ {"agent":"CharacterBibleAgent","input":{"storySummary":"Example summary","characters":[]}}
@@ -0,0 +1 @@
1
+ {"agent":"CharacterBibleAgent","output":{"characters":[],"continuityRules":[]}}
@@ -0,0 +1 @@
1
+ {"type":"object","required":["agent","input"],"properties":{"agent":{"const":"CharacterBibleAgent"},"input":{"type":"object"}}}
@@ -0,0 +1 @@
1
+ {"error":"image_provider_failed","message":"Image provider failed or returned invalid output.","retryable":true}
@@ -0,0 +1 @@
1
+ {"input":{"prompts":[{"prompt":"quiet room"}],"provider":"mock"},"expected":{"images":[{"status":"created"}]}}
@@ -0,0 +1 @@
1
+ {"agent":"ImageGenerationAgent","input":{"prompts":[],"provider":"mock"}}
@@ -0,0 +1 @@
1
+ {"agent":"ImageGenerationAgent","output":{"images":[],"providerMetadata":{}}}
@@ -0,0 +1 @@
1
+ {"type":"object","required":["agent","input"],"properties":{"agent":{"const":"ImageGenerationAgent"},"input":{"type":"object"}}}
@@ -0,0 +1 @@
1
+ {"error":"pipeline_orchestration_failed","message":"PipelineOrchestrator could not complete or resume the workflow.","retryable":true}
@@ -0,0 +1 @@
1
+ {"input":{"projectId":"demo","phase":"start"},"expected":{"state":"completed"}}
@@ -0,0 +1 @@
1
+ {"agent":"PipelineOrchestrator","input":{"projectId":"example","phase":"start"}}
@@ -0,0 +1 @@
1
+ {"agent":"PipelineOrchestrator","output":{"state":"completed","steps":[]}}
@@ -0,0 +1 @@
1
+ {"type":"object","required":["agent","input"],"properties":{"agent":{"const":"PipelineOrchestrator"},"input":{"type":"object"}}}
@@ -0,0 +1 @@
1
+ {"error":"invalid_prompt_input","message":"PromptGenerationAgent input failed validation.","retryable":false}
@@ -0,0 +1 @@
1
+ {"input":{"scenePlan":[{"scene":"Return"}],"styleGuide":{"tone":"quiet"}},"expected":{"prompts":[{"scene":"Return"}]}}
@@ -0,0 +1 @@
1
+ {"agent":"PromptGenerationAgent","input":{"scenePlan":[],"styleGuide":{}}}
@@ -0,0 +1 @@
1
+ {"agent":"PromptGenerationAgent","output":{"prompts":[],"negativePrompts":[]}}
@@ -0,0 +1 @@
1
+ {"type":"object","required":["agent","input"],"properties":{"agent":{"const":"PromptGenerationAgent"},"input":{"type":"object"}}}
@@ -0,0 +1 @@
1
+ {"error":"render_failed","message":"RenderAgent failed to produce a valid artifact.","retryable":true}
@@ -0,0 +1 @@
1
+ {"input":{"scenePlan":[],"images":[],"audio":[],"subtitles":[]},"expected":{"video":{"status":"created"}}}
@@ -0,0 +1 @@
1
+ {"agent":"RenderAgent","input":{"scenePlan":[],"images":[],"audio":[],"subtitles":[]}}
@@ -0,0 +1 @@
1
+ {"agent":"RenderAgent","output":{"video":{"status":"created"},"metadata":{}}}
@@ -0,0 +1 @@
1
+ {"type":"object","required":["agent","input"],"properties":{"agent":{"const":"RenderAgent"},"input":{"type":"object"}}}
@@ -0,0 +1 @@
1
+ {"error":"invalid_scene_plan_input","message":"ScenePlanningAgent input failed validation.","retryable":false}
@@ -0,0 +1 @@
1
+ {"input":{"screenplay":[{"title":"Return"}],"constraints":["low-cost"]},"expected":{"scenePlan":[{"scene":"Return"}]}}
@@ -0,0 +1 @@
1
+ {"agent":"ScenePlanningAgent","input":{"screenplay":[],"constraints":[]}}
@@ -0,0 +1 @@
1
+ {"agent":"ScenePlanningAgent","output":{"scenePlan":[],"dependencies":[]}}
@@ -0,0 +1 @@
1
+ {"type":"object","required":["agent","input"],"properties":{"agent":{"const":"ScenePlanningAgent"},"input":{"type":"object"}}}
@@ -0,0 +1 @@
1
+ {"error":"invalid_screenplay_input","message":"ScreenplayAgent input failed validation.","retryable":false}
@@ -0,0 +1 @@
1
+ {"input":{"storySummary":"A traveler returns home.","characterBible":[]},"expected":{"scenes":[{"title":"Return"}]}}
@@ -0,0 +1 @@
1
+ {"agent":"ScreenplayAgent","input":{"storySummary":"Example summary","characterBible":[]}}
@@ -0,0 +1 @@
1
+ {"agent":"ScreenplayAgent","output":{"scenes":[],"dialogue":[]}}
@@ -0,0 +1 @@
1
+ {"type":"object","required":["agent","input"],"properties":{"agent":{"const":"ScreenplayAgent"},"input":{"type":"object"}}}
@@ -0,0 +1 @@
1
+ {"error":"invalid_story_input","message":"StoryAnalysisAgent input failed validation.","retryable":false}
@@ -0,0 +1 @@
1
+ {"input":{"storyText":"A traveler returns home.","constraints":["short"]},"expected":{"summary":"A traveler returns home.","themes":["return"]}}
@@ -0,0 +1 @@
1
+ {"agent":"StoryAnalysisAgent","input":{"storyText":"Example story text","constraints":[]}}
@@ -0,0 +1 @@
1
+ {"agent":"StoryAnalysisAgent","output":{"summary":"Example summary","themes":[],"characters":[]}}
@@ -0,0 +1 @@
1
+ {"type":"object","required":["agent","input"],"properties":{"agent":{"const":"StoryAnalysisAgent"},"input":{"type":"object"}}}
@@ -0,0 +1 @@
1
+ {"error":"invalid_subtitle_input","message":"SubtitleGenerationAgent input failed validation.","retryable":false}
@@ -0,0 +1 @@
1
+ {"input":{"script":[{"text":"Welcome home."}],"timings":[{"start":0,"end":1}]},"expected":{"subtitles":[{"text":"Welcome home."}]}}
@@ -0,0 +1 @@
1
+ {"agent":"SubtitleGenerationAgent","input":{"script":[],"timings":[]}}
@@ -0,0 +1 @@
1
+ {"agent":"SubtitleGenerationAgent","output":{"subtitles":[]}}
@@ -0,0 +1 @@
1
+ {"type":"object","required":["agent","input"],"properties":{"agent":{"const":"SubtitleGenerationAgent"},"input":{"type":"object"}}}
@@ -0,0 +1 @@
1
+ {"error":"voice_provider_failed","message":"Voice provider failed or returned invalid output.","retryable":true}
@@ -0,0 +1 @@
1
+ {"input":{"script":[{"text":"Welcome home."}],"voice":"mock"},"expected":{"audio":[{"status":"created"}]}}
@@ -0,0 +1 @@
1
+ {"agent":"VoiceGenerationAgent","input":{"script":[],"voice":"mock"}}
@@ -0,0 +1 @@
1
+ {"agent":"VoiceGenerationAgent","output":{"audio":[],"timings":[]}}
@@ -0,0 +1 @@
1
+ {"type":"object","required":["agent","input"],"properties":{"agent":{"const":"VoiceGenerationAgent"},"input":{"type":"object"}}}
@@ -0,0 +1,4 @@
1
+ # API Contracts
2
+
3
+ Create one folder per endpoint. Each endpoint contract must include `request.json`, `response.json`, `schema.json`, `example.json`, and `error.json`.
4
+
@@ -0,0 +1,7 @@
1
+ {
2
+ "status": 400,
3
+ "body": {
4
+ "error": "validation_error",
5
+ "message": "Request body failed contract validation."
6
+ }
7
+ }
@@ -0,0 +1,11 @@
1
+ {
2
+ "request": {
3
+ "method": "POST",
4
+ "path": "/api/example",
5
+ "body": { "id": "demo-001" }
6
+ },
7
+ "expectedResponse": {
8
+ "status": 200,
9
+ "body": { "ok": true }
10
+ }
11
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "method": "POST",
3
+ "path": "/api/example",
4
+ "body": {
5
+ "id": "example-id"
6
+ }
7
+ }
@@ -0,0 +1,6 @@
1
+ {
2
+ "status": 200,
3
+ "body": {
4
+ "ok": true
5
+ }
6
+ }
@@ -0,0 +1,9 @@
1
+ {
2
+ "type": "object",
3
+ "required": ["method", "path", "body"],
4
+ "properties": {
5
+ "method": { "type": "string" },
6
+ "path": { "type": "string" },
7
+ "body": { "type": "object" }
8
+ }
9
+ }
@@ -0,0 +1,4 @@
1
+ # Event Contracts
2
+
3
+ Define event name, payload schema, producer, consumer, retry behavior, and dead-letter behavior before implementing event code.
4
+
@@ -0,0 +1,4 @@
1
+ {
2
+ "error": "event_validation_failed",
3
+ "retryable": false
4
+ }
@@ -0,0 +1,6 @@
1
+ {
2
+ "event": "example.created",
3
+ "payload": {
4
+ "id": "demo-001"
5
+ }
6
+ }
@@ -0,0 +1,6 @@
1
+ {
2
+ "event": "example.created",
3
+ "payload": {
4
+ "id": "example-id"
5
+ }
6
+ }
@@ -0,0 +1,3 @@
1
+ {
2
+ "acknowledged": true
3
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "type": "object",
3
+ "required": ["event", "payload"],
4
+ "properties": {
5
+ "event": { "type": "string" },
6
+ "payload": { "type": "object" }
7
+ }
8
+ }
@@ -0,0 +1,4 @@
1
+ # UI Contracts
2
+
3
+ Define route, required data, user actions, states, validation errors, accessibility expectations, and API synchronization requirements before UI implementation.
4
+
@@ -0,0 +1,4 @@
1
+ {
2
+ "state": "error",
3
+ "visibleText": ["Unable to load data"]
4
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "route": "/example",
3
+ "state": "empty",
4
+ "expected": {
5
+ "visibleText": ["No records yet"]
6
+ }
7
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "route": "/example",
3
+ "state": "default"
4
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "renders": true,
3
+ "visibleText": ["Example"]
4
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "type": "object",
3
+ "required": ["route", "state"],
4
+ "properties": {
5
+ "route": { "type": "string" },
6
+ "state": { "type": "string" }
7
+ }
8
+ }
@@ -0,0 +1,14 @@
1
+ # Agent Fixture Template
2
+
3
+ ## Input
4
+
5
+ Provide the exact agent input JSON.
6
+
7
+ ## Expected Output
8
+
9
+ Provide the exact expected JSON output or schema-constrained shape.
10
+
11
+ ## Validation Notes
12
+
13
+ Validate schema, error recovery, retry behavior, and persistence.
14
+
@@ -0,0 +1,14 @@
1
+ # API Fixture Template
2
+
3
+ ## Input
4
+
5
+ Describe request method, path, headers, body, and auth state.
6
+
7
+ ## Expected Output
8
+
9
+ Describe response status, body, headers, and persistence side effects.
10
+
11
+ ## Validation Notes
12
+
13
+ List schema, negative, not-found, and snapshot assertions.
14
+
@@ -0,0 +1,14 @@
1
+ # Image Fixture Template
2
+
3
+ ## Input
4
+
5
+ Prompt, size, style constraints, seed policy, and provider options.
6
+
7
+ ## Expected Output
8
+
9
+ Image artifact metadata and validation rules.
10
+
11
+ ## Validation Notes
12
+
13
+ Check provider failures, unsafe prompts, invalid JSON, and persistence.
14
+
@@ -0,0 +1,14 @@
1
+ # Pipeline Fixture Template
2
+
3
+ ## Input
4
+
5
+ List pipeline phase inputs and initial state.
6
+
7
+ ## Expected Output
8
+
9
+ List phase outputs, state transitions, logs, and persisted artifacts.
10
+
11
+ ## Validation Notes
12
+
13
+ Check resumability, idempotency, retries, and failure recovery.
14
+