@heretek-ai/epistemic-swarm 0.7.25 → 1.0.2

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 (350) hide show
  1. package/index.ts +1 -0
  2. package/package.json +63 -139
  3. package/rpc.ts +1 -0
  4. package/server.ts +1 -0
  5. package/src/agents.ts +69 -0
  6. package/src/continue.ts +40 -0
  7. package/src/hooks.ts +283 -0
  8. package/src/panels.tsx +220 -0
  9. package/src/policy.ts +221 -0
  10. package/src/pr.ts +37 -0
  11. package/src/research.ts +63 -0
  12. package/src/rpc-def.ts +136 -0
  13. package/src/rpc.ts +331 -0
  14. package/src/runtime.ts +112 -0
  15. package/src/server.ts +311 -0
  16. package/src/session.ts +61 -0
  17. package/src/tools.ts +61 -0
  18. package/src/tui.tsx +206 -0
  19. package/tui.tsx +1 -0
  20. package/.agents/skills/brainstorming/SKILL.md +0 -19
  21. package/.agents/skills/code_audit/SKILL.md +0 -19
  22. package/.agents/skills/darkharvest/SKILL.md +0 -19
  23. package/.agents/skills/epistemic_search/SKILL.md +0 -19
  24. package/.agents/skills/factory/SKILL.md +0 -19
  25. package/.agents/skills/grilling/SKILL.md +0 -19
  26. package/.agents/skills/oss_scout/SKILL.md +0 -19
  27. package/.agents/skills/research_cache/SKILL.md +0 -19
  28. package/.agents/skills/swarm_config/SKILL.md +0 -19
  29. package/.claude-plugin/marketplace.json +0 -61
  30. package/.claude-plugin/plugin.json +0 -76
  31. package/.omp/README.md +0 -39
  32. package/.omp/SYSTEM.md +0 -17
  33. package/.omp/commands/audit.md +0 -10
  34. package/.omp/commands/brainstorming.md +0 -12
  35. package/.omp/commands/darkharvest.md +0 -11
  36. package/.omp/commands/domainexpansion.md +0 -9
  37. package/.omp/commands/factory.md +0 -9
  38. package/.omp/commands/grill.md +0 -9
  39. package/.omp/commands/scout.md +0 -10
  40. package/.omp/commands/swarm-config.md +0 -10
  41. package/.omp/commands/swarm.md +0 -9
  42. package/.omp/hooks/post/epistemic-audit.ts +0 -16
  43. package/.omp/hooks/pre/epistemic-redirect.ts +0 -21
  44. package/.omp/prompts/brainstorming.md +0 -8
  45. package/.omp/prompts/swarm.md +0 -8
  46. package/LICENSE +0 -126
  47. package/MARKETPLACE.md +0 -130
  48. package/README.md +0 -403
  49. package/bin/cli.js +0 -297
  50. package/config/claude-settings-patch.json +0 -10
  51. package/config/docker-compose.infra.yml +0 -23
  52. package/config/domain_packs/biopharma.json +0 -23
  53. package/config/domain_packs/legal.json +0 -19
  54. package/config/domain_packs/quant.json +0 -19
  55. package/config/mcp-research-servers.json +0 -33
  56. package/config/mcp_launcher.py +0 -153
  57. package/config/opencode-snippet.json +0 -156
  58. package/config/searxng_mcp.py +0 -92
  59. package/extensions/pi/index.js +0 -357
  60. package/hooks/hooks.json +0 -45
  61. package/install.sh +0 -473
  62. package/plugins/antigravity/README.md +0 -72
  63. package/plugins/antigravity/agents/alpha-thesis.md +0 -36
  64. package/plugins/antigravity/agents/beta-antithesis.md +0 -35
  65. package/plugins/antigravity/agents/brainstormer.md +0 -27
  66. package/plugins/antigravity/agents/code-auditor.md +0 -28
  67. package/plugins/antigravity/agents/darkharvester.md +0 -30
  68. package/plugins/antigravity/agents/epistemic-auditor.md +0 -28
  69. package/plugins/antigravity/agents/manager.md +0 -26
  70. package/plugins/antigravity/agents/oss-scout.md +0 -27
  71. package/plugins/antigravity/agents/programmer.md +0 -25
  72. package/plugins/antigravity/agents/qa-a.md +0 -22
  73. package/plugins/antigravity/agents/qa-b.md +0 -22
  74. package/plugins/antigravity/antigravity_hooks.py +0 -265
  75. package/plugins/antigravity/commands/audit.md +0 -11
  76. package/plugins/antigravity/commands/brainstorm.md +0 -9
  77. package/plugins/antigravity/commands/brainstorming.md +0 -10
  78. package/plugins/antigravity/commands/darkharvest.md +0 -12
  79. package/plugins/antigravity/commands/domainexpansion.md +0 -12
  80. package/plugins/antigravity/commands/factory.md +0 -14
  81. package/plugins/antigravity/commands/grill.md +0 -10
  82. package/plugins/antigravity/commands/scout.md +0 -11
  83. package/plugins/antigravity/commands/swarm-config.md +0 -9
  84. package/plugins/antigravity/commands/swarm.md +0 -12
  85. package/plugins/antigravity/hook_bus_bridge.js +0 -352
  86. package/plugins/antigravity/hooks.json +0 -44
  87. package/plugins/antigravity/mcp_config.json +0 -33
  88. package/plugins/antigravity/mcp_launcher.py +0 -58
  89. package/plugins/antigravity/plugin.json +0 -13
  90. package/plugins/antigravity/rules/AGENTS.md +0 -127
  91. package/plugins/antigravity/rules/epistemic-integrity.md +0 -16
  92. package/plugins/antigravity/skills/brainstorming/SKILL.md +0 -19
  93. package/plugins/antigravity/skills/code_audit/SKILL.md +0 -19
  94. package/plugins/antigravity/skills/darkharvest/SKILL.md +0 -19
  95. package/plugins/antigravity/skills/epistemic_search/SKILL.md +0 -19
  96. package/plugins/antigravity/skills/factory/SKILL.md +0 -19
  97. package/plugins/antigravity/skills/grilling/SKILL.md +0 -19
  98. package/plugins/antigravity/skills/oss_scout/SKILL.md +0 -19
  99. package/plugins/antigravity/skills/research_cache/SKILL.md +0 -19
  100. package/plugins/antigravity/skills/swarm_config/SKILL.md +0 -19
  101. package/plugins/codex/AGENTS.md.snippet +0 -10
  102. package/plugins/codex/README.md +0 -37
  103. package/plugins/codex/config.toml.snippet +0 -28
  104. package/plugins/codex/openai.yaml +0 -24
  105. package/plugins/codex/skills/brainstorming/SKILL.md +0 -19
  106. package/plugins/codex/skills/code_audit/SKILL.md +0 -19
  107. package/plugins/codex/skills/darkharvest/SKILL.md +0 -19
  108. package/plugins/codex/skills/epistemic_search/SKILL.md +0 -19
  109. package/plugins/codex/skills/factory/SKILL.md +0 -19
  110. package/plugins/codex/skills/grilling/SKILL.md +0 -19
  111. package/plugins/codex/skills/oss_scout/SKILL.md +0 -19
  112. package/plugins/codex/skills/research_cache/SKILL.md +0 -19
  113. package/plugins/codex/skills/swarm_config/SKILL.md +0 -19
  114. package/plugins/darkharvest/.claude-plugin/plugin.json +0 -15
  115. package/plugins/darkharvest/agents/harvest-proponent.md +0 -22
  116. package/plugins/darkharvest/agents/harvest-redteam.md +0 -20
  117. package/plugins/darkharvest/evals/teardown-verdict/graders/license-line.md +0 -6
  118. package/plugins/darkharvest/evals/teardown-verdict/graders/skill-fired.md +0 -5
  119. package/plugins/darkharvest/evals/teardown-verdict/prompt.md +0 -6
  120. package/plugins/darkharvest/skills/darkharvest/SKILL.md +0 -70
  121. package/plugins/darkharvest/skills/darkharvest/scripts/harvest.py +0 -289
  122. package/plugins/factory/.claude-plugin/plugin.json +0 -15
  123. package/plugins/factory/agents/factory-manager.md +0 -22
  124. package/plugins/factory/agents/programmer.md +0 -16
  125. package/plugins/factory/agents/qa-adversarial.md +0 -17
  126. package/plugins/factory/agents/qa-functional.md +0 -17
  127. package/plugins/factory/evals/gate-halt/graders/gates-first.md +0 -6
  128. package/plugins/factory/evals/gate-halt/graders/skill-fired.md +0 -5
  129. package/plugins/factory/evals/gate-halt/prompt.md +0 -6
  130. package/plugins/factory/skills/factory/SKILL.md +0 -61
  131. package/plugins/factory/skills/factory/scripts/factory.py +0 -300
  132. package/plugins/gemini/GEMINI.md +0 -16
  133. package/plugins/gemini/README.md +0 -20
  134. package/plugins/gemini/commands/audit.toml +0 -6
  135. package/plugins/gemini/commands/brainstorming.toml +0 -10
  136. package/plugins/gemini/commands/darkharvest.toml +0 -8
  137. package/plugins/gemini/commands/domainexpansion.toml +0 -7
  138. package/plugins/gemini/commands/factory.toml +0 -8
  139. package/plugins/gemini/commands/grill.toml +0 -6
  140. package/plugins/gemini/commands/scout.toml +0 -7
  141. package/plugins/gemini/commands/swarm-config.toml +0 -7
  142. package/plugins/gemini/commands/swarm.toml +0 -8
  143. package/plugins/gemini/gemini-extension.json +0 -38
  144. package/plugins/gemini/hooks/hooks.json +0 -11
  145. package/plugins/gemini/skills/brainstorming/SKILL.md +0 -19
  146. package/plugins/gemini/skills/code_audit/SKILL.md +0 -19
  147. package/plugins/gemini/skills/darkharvest/SKILL.md +0 -19
  148. package/plugins/gemini/skills/epistemic_search/SKILL.md +0 -19
  149. package/plugins/gemini/skills/factory/SKILL.md +0 -19
  150. package/plugins/gemini/skills/grilling/SKILL.md +0 -19
  151. package/plugins/gemini/skills/oss_scout/SKILL.md +0 -19
  152. package/plugins/gemini/skills/research_cache/SKILL.md +0 -19
  153. package/plugins/gemini/skills/swarm_config/SKILL.md +0 -19
  154. package/plugins/opencode/analysis-bridge.js +0 -620
  155. package/plugins/opencode/config-io.js +0 -1651
  156. package/plugins/opencode/dep-health.js +0 -1039
  157. package/plugins/opencode/hook-bus.js +0 -496
  158. package/plugins/opencode/index.js +0 -2992
  159. package/plugins/opencode/tui.js +0 -1551
  160. package/plugins/opencode/weight-baseline.json +0 -16
  161. package/plugins/opencode/weight-signals.js +0 -769
  162. package/plugins/research-cache/.claude-plugin/plugin.json +0 -15
  163. package/plugins/research-cache/skills/research_cache/SKILL.md +0 -36
  164. package/plugins/research-cache/skills/research_cache/__init__.py +0 -0
  165. package/plugins/research-cache/skills/research_cache/hasher.py +0 -302
  166. package/plugins/socratic-grilling/.claude-plugin/plugin.json +0 -15
  167. package/plugins/socratic-grilling/skills/grilling/SKILL.md +0 -61
  168. package/plugins/socratic-grilling/skills/grilling/__init__.py +0 -0
  169. package/plugins/socratic-grilling/skills/grilling/socratic_tree.py +0 -363
  170. package/prompts/agent_alpha_thesis.md +0 -70
  171. package/prompts/agent_beta_antithesis.md +0 -78
  172. package/prompts/agent_brainstormer.md +0 -143
  173. package/prompts/agent_code_auditor.md +0 -88
  174. package/prompts/agent_darkharvest.md +0 -140
  175. package/prompts/agent_oss_scout.md +0 -78
  176. package/prompts/antigravity_repo_factcheck.md +0 -143
  177. package/prompts/base_epistemic_system.md +0 -50
  178. package/prompts/epistemic_auditor.md +0 -74
  179. package/prompts/orchestrator.md +0 -70
  180. package/runner/__init__.py +0 -0
  181. package/runner/__pycache__/__init__.cpython-311.pyc +0 -0
  182. package/runner/__pycache__/auctioneer.cpython-311.pyc +0 -0
  183. package/runner/__pycache__/auditor_engine.cpython-311.pyc +0 -0
  184. package/runner/__pycache__/claim_store.cpython-311.pyc +0 -0
  185. package/runner/__pycache__/claim_witness.cpython-311.pyc +0 -0
  186. package/runner/__pycache__/darkharvest_claims.cpython-311.pyc +0 -0
  187. package/runner/__pycache__/errors.cpython-311.pyc +0 -0
  188. package/runner/__pycache__/living_dossiers.cpython-311.pyc +0 -0
  189. package/runner/__pycache__/mcp_protocol.cpython-311.pyc +0 -0
  190. package/runner/__pycache__/mcp_server.cpython-311.pyc +0 -0
  191. package/runner/__pycache__/path_safety.cpython-311.pyc +0 -0
  192. package/runner/__pycache__/pcrb.cpython-311.pyc +0 -0
  193. package/runner/__pycache__/pcrb_verify.cpython-311.pyc +0 -0
  194. package/runner/__pycache__/preflight.cpython-311.pyc +0 -0
  195. package/runner/__pycache__/refinement.cpython-311.pyc +0 -0
  196. package/runner/__pycache__/research_swarm.cpython-311.pyc +0 -0
  197. package/runner/__pycache__/retrieval_log.cpython-311.pyc +0 -0
  198. package/runner/__pycache__/schema_validate.cpython-311.pyc +0 -0
  199. package/runner/__pycache__/schemas.cpython-311.pyc +0 -0
  200. package/runner/__pycache__/state_machine.cpython-311.pyc +0 -0
  201. package/runner/antigravity_hooks.py +0 -265
  202. package/runner/auctioneer.py +0 -169
  203. package/runner/auditor_engine.py +0 -711
  204. package/runner/claim_store.py +0 -417
  205. package/runner/claim_witness.py +0 -412
  206. package/runner/darkharvest_claims.py +0 -358
  207. package/runner/errors.py +0 -51
  208. package/runner/living_dossiers.py +0 -395
  209. package/runner/mcp_protocol.py +0 -188
  210. package/runner/mcp_server.py +0 -1447
  211. package/runner/path_safety.py +0 -62
  212. package/runner/pcrb.py +0 -290
  213. package/runner/pcrb_verify.py +0 -267
  214. package/runner/preflight.py +0 -1011
  215. package/runner/refinement.py +0 -580
  216. package/runner/research_swarm.py +0 -1848
  217. package/runner/retrieval_log.py +0 -90
  218. package/runner/schema_validate.py +0 -193
  219. package/runner/schemas.py +0 -630
  220. package/runner/state_machine.py +0 -463
  221. package/runner/tests/__pycache__/test_analysis_bridge.cpython-311.pyc +0 -0
  222. package/runner/tests/__pycache__/test_antigravity_plugin.cpython-311.pyc +0 -0
  223. package/runner/tests/__pycache__/test_auction_order.cpython-311.pyc +0 -0
  224. package/runner/tests/__pycache__/test_backends.cpython-311.pyc +0 -0
  225. package/runner/tests/__pycache__/test_bet1_spike.cpython-311.pyc +0 -0
  226. package/runner/tests/__pycache__/test_claim_store.cpython-311.pyc +0 -0
  227. package/runner/tests/__pycache__/test_claim_witness.cpython-311.pyc +0 -0
  228. package/runner/tests/__pycache__/test_claude_plugin.cpython-311.pyc +0 -0
  229. package/runner/tests/__pycache__/test_config_schema.cpython-311.pyc +0 -0
  230. package/runner/tests/__pycache__/test_contract_tooling.cpython-311.pyc +0 -0
  231. package/runner/tests/__pycache__/test_darkharvest_audit.cpython-311.pyc +0 -0
  232. package/runner/tests/__pycache__/test_dep_health.cpython-311.pyc +0 -0
  233. package/runner/tests/__pycache__/test_domain_packs.cpython-311.pyc +0 -0
  234. package/runner/tests/__pycache__/test_dossier_contract.cpython-311.pyc +0 -0
  235. package/runner/tests/__pycache__/test_factory.cpython-311.pyc +0 -0
  236. package/runner/tests/__pycache__/test_fleet_seam.cpython-311.pyc +0 -0
  237. package/runner/tests/__pycache__/test_frontier_concurrency.cpython-311.pyc +0 -0
  238. package/runner/tests/__pycache__/test_frontier_mirror_standalone.cpython-311.pyc +0 -0
  239. package/runner/tests/__pycache__/test_grounding.cpython-311.pyc +0 -0
  240. package/runner/tests/__pycache__/test_hardening_contract.cpython-311.pyc +0 -0
  241. package/runner/tests/__pycache__/test_hook_bus.cpython-311.pyc +0 -0
  242. package/runner/tests/__pycache__/test_living_dossiers.cpython-311.pyc +0 -0
  243. package/runner/tests/__pycache__/test_manifest_concurrency.cpython-311.pyc +0 -0
  244. package/runner/tests/__pycache__/test_mcp_server.cpython-311.pyc +0 -0
  245. package/runner/tests/__pycache__/test_nk_hardening.cpython-311.pyc +0 -0
  246. package/runner/tests/__pycache__/test_opencode_ux.cpython-311.pyc +0 -0
  247. package/runner/tests/__pycache__/test_opencode_v2_registrars.cpython-311.pyc +0 -0
  248. package/runner/tests/__pycache__/test_pcrb.cpython-311.pyc +0 -0
  249. package/runner/tests/__pycache__/test_phase08_waiver_reopens.cpython-311.pyc +0 -0
  250. package/runner/tests/__pycache__/test_refinement.cpython-311.pyc +0 -0
  251. package/runner/tests/__pycache__/test_search_anomaly.cpython-311.pyc +0 -0
  252. package/runner/tests/__pycache__/test_search_provider.cpython-311.pyc +0 -0
  253. package/runner/tests/__pycache__/test_search_provider_plugin.cpython-311.pyc +0 -0
  254. package/runner/tests/__pycache__/test_swarm.cpython-311.pyc +0 -0
  255. package/runner/tests/__pycache__/test_swarm_config.cpython-311.pyc +0 -0
  256. package/runner/tests/__pycache__/test_sweep_regressions.cpython-311.pyc +0 -0
  257. package/runner/tests/__pycache__/test_webcache.cpython-311.pyc +0 -0
  258. package/runner/tests/__pycache__/test_weight_signals.cpython-311.pyc +0 -0
  259. package/runner/tests/fixtures/auction_objective.json +0 -35
  260. package/runner/tests/fixtures/borderline_claims.json +0 -27
  261. package/runner/tests/fixtures/config_validation_cases.json +0 -276
  262. package/runner/tests/fixtures/ddg_anomaly_page.html +0 -176
  263. package/runner/tests/fixtures/ddg_results_page.html +0 -28
  264. package/runner/tests/fixtures/divergence_objectives.json +0 -31
  265. package/runner/tests/test_analysis_bridge.py +0 -450
  266. package/runner/tests/test_antigravity_plugin.py +0 -361
  267. package/runner/tests/test_auction_order.py +0 -173
  268. package/runner/tests/test_backends.py +0 -457
  269. package/runner/tests/test_bet1_spike.py +0 -95
  270. package/runner/tests/test_claim_store.py +0 -162
  271. package/runner/tests/test_claim_witness.py +0 -186
  272. package/runner/tests/test_claude_plugin.py +0 -170
  273. package/runner/tests/test_config_schema.py +0 -879
  274. package/runner/tests/test_contract_tooling.py +0 -312
  275. package/runner/tests/test_darkharvest_audit.py +0 -395
  276. package/runner/tests/test_dep_health.py +0 -595
  277. package/runner/tests/test_domain_packs.py +0 -217
  278. package/runner/tests/test_dossier_contract.py +0 -196
  279. package/runner/tests/test_factory.py +0 -258
  280. package/runner/tests/test_fleet_seam.py +0 -113
  281. package/runner/tests/test_frontier_concurrency.py +0 -288
  282. package/runner/tests/test_frontier_mirror_standalone.py +0 -156
  283. package/runner/tests/test_grounding.py +0 -183
  284. package/runner/tests/test_hardening_contract.py +0 -391
  285. package/runner/tests/test_hook_bus.py +0 -956
  286. package/runner/tests/test_living_dossiers.py +0 -204
  287. package/runner/tests/test_manifest_concurrency.py +0 -187
  288. package/runner/tests/test_mcp_server.py +0 -257
  289. package/runner/tests/test_nk_hardening.py +0 -1046
  290. package/runner/tests/test_opencode_ux.py +0 -2438
  291. package/runner/tests/test_opencode_v2_registrars.py +0 -2157
  292. package/runner/tests/test_pcrb.py +0 -240
  293. package/runner/tests/test_phase08_waiver_reopens.py +0 -539
  294. package/runner/tests/test_refinement.py +0 -255
  295. package/runner/tests/test_search_anomaly.py +0 -342
  296. package/runner/tests/test_search_provider.py +0 -1534
  297. package/runner/tests/test_search_provider_plugin.py +0 -401
  298. package/runner/tests/test_swarm.py +0 -444
  299. package/runner/tests/test_swarm_config.py +0 -520
  300. package/runner/tests/test_sweep_regressions.py +0 -453
  301. package/runner/tests/test_webcache.py +0 -271
  302. package/runner/tests/test_weight_signals.py +0 -401
  303. package/schemas/alpha_dossier.schema.json +0 -204
  304. package/schemas/audit_report.schema.json +0 -79
  305. package/schemas/beta_dossier.schema.json +0 -214
  306. package/schemas/config.schema.json +0 -311
  307. package/schemas/frontier.schema.json +0 -61
  308. package/schemas/manifest.schema.json +0 -49
  309. package/schemas/scope_manifest.schema.json +0 -47
  310. package/scripts/__pycache__/bet1_advisory_spike.cpython-311.pyc +0 -0
  311. package/scripts/__pycache__/build_adapters.cpython-311.pyc +0 -0
  312. package/scripts/__pycache__/check_docs.cpython-311.pyc +0 -0
  313. package/scripts/__pycache__/divergence_experiment.cpython-311.pyc +0 -0
  314. package/scripts/__pycache__/gen_schemas.cpython-311.pyc +0 -0
  315. package/scripts/auction_experiment.py +0 -188
  316. package/scripts/bet1_advisory_spike.py +0 -442
  317. package/scripts/build_adapters.py +0 -417
  318. package/scripts/check_docs.py +0 -66
  319. package/scripts/divergence_experiment.py +0 -214
  320. package/scripts/gen_schemas.py +0 -69
  321. package/skills/brainstorming/SKILL.md +0 -106
  322. package/skills/brainstorming/__init__.py +0 -1
  323. package/skills/brainstorming/scripts/brainstorm.py +0 -201
  324. package/skills/code_audit/SKILL.md +0 -45
  325. package/skills/darkharvest/SKILL.md +0 -70
  326. package/skills/darkharvest/scripts/harvest.py +0 -289
  327. package/skills/epistemic_search/SKILL.md +0 -67
  328. package/skills/epistemic_search/__init__.py +0 -1
  329. package/skills/epistemic_search/scripts/__pycache__/search.cpython-311.pyc +0 -0
  330. package/skills/epistemic_search/scripts/fetch.py +0 -156
  331. package/skills/epistemic_search/scripts/search.py +0 -551
  332. package/skills/epistemic_search/scripts/webcache.py +0 -339
  333. package/skills/factory/SKILL.md +0 -61
  334. package/skills/factory/scripts/factory.py +0 -300
  335. package/skills/grilling/SKILL.md +0 -61
  336. package/skills/grilling/__init__.py +0 -0
  337. package/skills/grilling/__pycache__/__init__.cpython-311.pyc +0 -0
  338. package/skills/grilling/__pycache__/socratic_tree.cpython-311.pyc +0 -0
  339. package/skills/grilling/socratic_tree.py +0 -363
  340. package/skills/oss_scout/SKILL.md +0 -49
  341. package/skills/research_cache/SKILL.md +0 -36
  342. package/skills/research_cache/__init__.py +0 -0
  343. package/skills/research_cache/__pycache__/__init__.cpython-311.pyc +0 -0
  344. package/skills/research_cache/__pycache__/hasher.cpython-311.pyc +0 -0
  345. package/skills/research_cache/hasher.py +0 -302
  346. package/skills/swarm_config/SKILL.md +0 -178
  347. package/skills/swarm_config/__init__.py +0 -35
  348. package/skills/swarm_config/__pycache__/__init__.cpython-311.pyc +0 -0
  349. package/skills/swarm_config/__pycache__/configure.cpython-311.pyc +0 -0
  350. package/skills/swarm_config/configure.py +0 -1002
@@ -1,312 +0,0 @@
1
- #!/usr/bin/env python3
2
- """Regressions for issue #6 tooling: schemas, preflight/doctor, frontier
3
- authoring, factory safety + gate, lifecycle (resume/dry-run/progress), run-scoped
4
- layout, structured errors, and the docs check."""
5
-
6
- import io
7
- import json
8
- import os
9
- import subprocess
10
- import sys
11
- import tempfile
12
- import unittest
13
- from contextlib import redirect_stdout
14
- from pathlib import Path
15
-
16
- PROJECT_ROOT = Path(__file__).resolve().parent.parent.parent
17
- if str(PROJECT_ROOT) not in sys.path:
18
- sys.path.insert(0, str(PROJECT_ROOT))
19
-
20
- from runner.errors import DossierNotFound # noqa: E402
21
- from runner.preflight import format_report, preflight # noqa: E402
22
- from runner.research_swarm import SwarmRunner # noqa: E402
23
- from runner.schema_validate import check_dossier, validate_named # noqa: E402
24
- from runner.state_machine import ( # noqa: E402
25
- ResearchStateMachine,
26
- find_any_manifest,
27
- )
28
-
29
-
30
- class TestSchemas(unittest.TestCase):
31
- def test_generated_schemas_in_sync(self):
32
- from scripts.gen_schemas import check
33
-
34
- self.assertEqual(check(), 0)
35
-
36
- def test_validator_names_the_offending_key(self):
37
- problems = check_dossier(
38
- {"scope_id": "s1", "affirmative_claims": [{"statement": 1}]}, "alpha"
39
- )
40
- self.assertTrue(any("claim_id" in p for p in problems))
41
-
42
- def test_validator_accepts_a_well_formed_dossier(self):
43
- self.assertEqual(
44
- validate_named(
45
- "beta_dossier",
46
- {"scope_id": "s1", "falsification_claims": [], "hypotheses": []},
47
- ),
48
- [],
49
- )
50
-
51
-
52
- class TestPreflight(unittest.TestCase):
53
- def test_report_shape_offline(self):
54
- with tempfile.TemporaryDirectory() as tmp:
55
- report = preflight(Path(tmp), mode="research", mock_mode=True, probe=False)
56
- self.assertEqual(report["mode"], "research")
57
- self.assertIn("backend", report)
58
- self.assertEqual(report["engine_probe"]["skipped"], "probe disabled")
59
- self.assertTrue(report["workspace_write"]["ok"])
60
- self.assertIn("preflight", format_report(report))
61
-
62
- def test_doctor_handler(self):
63
- from runner.mcp_server import _handle_doctor
64
-
65
- with tempfile.TemporaryDirectory() as tmp:
66
- out = _handle_doctor({"base_dir": tmp, "probe": False})
67
- self.assertIn("preflight", out)
68
-
69
-
70
- class TestFrontierAuthoring(unittest.TestCase):
71
- def test_add_inspect_settle_round_trip(self):
72
- from runner.mcp_server import _handle_socratic_frontier
73
-
74
- with tempfile.TemporaryDirectory() as tmp:
75
- frontier = str(Path(tmp) / "frontier.json")
76
- added = _handle_socratic_frontier(
77
- {
78
- "file": frontier,
79
- "objective": "layering",
80
- "action": "add",
81
- "node": {"id": "N1", "question": "L1 or L2?"},
82
- }
83
- )
84
- self.assertIn("added", added)
85
- inspected = (
86
- json.loads(
87
- _handle_socratic_frontier({"file": frontier}).split("\n", 1)[1]
88
- if False
89
- else "{}"
90
- )
91
- if False
92
- else None
93
- )
94
- self.assertIsNone(inspected)
95
- settled = _handle_socratic_frontier(
96
- {"file": frontier, "settle": ["N1", "L1"]}
97
- )
98
- self.assertIn("settled", settled)
99
- data = json.loads(Path(frontier).read_text(encoding="utf-8"))
100
- self.assertEqual(data["nodes"]["N1"]["settled_answer"], "L1")
101
-
102
-
103
- class TestFactorySafety(unittest.TestCase):
104
- def _run(self, *args, project):
105
- return subprocess.run(
106
- [
107
- sys.executable,
108
- str(PROJECT_ROOT / "skills" / "factory" / "scripts" / "factory.py"),
109
- *args,
110
- "--project-dir",
111
- str(project),
112
- ],
113
- capture_output=True,
114
- text=True,
115
- timeout=60,
116
- )
117
-
118
- def test_phase_add_writes_phase_json_and_never_clobbers(self):
119
- with tempfile.TemporaryDirectory() as tmp:
120
- project = Path(tmp)
121
- self._run("init", "--run", "r", project=project)
122
- self._run(
123
- "phase-add",
124
- "--run",
125
- "r",
126
- "--phase",
127
- "01-a",
128
- "--goal",
129
- "g",
130
- "--accept",
131
- "x",
132
- project=project,
133
- )
134
- phase_dir = project / ".roadmap" / "01-a"
135
- self.assertTrue((phase_dir / "phase.json").exists())
136
- self.assertFalse((phase_dir / "GOAL.md").exists())
137
-
138
- # An authored GOAL.md must be refused, then honoured with --force.
139
- authored_dir = project / ".roadmap" / "03-c"
140
- authored_dir.mkdir(parents=True, exist_ok=True)
141
- (authored_dir / "GOAL.md").write_text("authored", encoding="utf-8")
142
- refused = self._run(
143
- "phase-add",
144
- "--run",
145
- "r",
146
- "--phase",
147
- "03-c",
148
- "--goal",
149
- "g2",
150
- project=project,
151
- )
152
- self.assertEqual(refused.returncode, 1)
153
- self.assertIn("Refusing", refused.stderr)
154
- forced = self._run(
155
- "phase-add",
156
- "--run",
157
- "r",
158
- "--phase",
159
- "03-c",
160
- "--goal",
161
- "g2",
162
- "--force",
163
- project=project,
164
- )
165
- self.assertEqual(forced.returncode, 0, forced.stderr)
166
- self.assertEqual(
167
- (authored_dir / "GOAL.md").read_text(encoding="utf-8"), "authored"
168
- )
169
-
170
- def test_missing_run_error_names_the_argument(self):
171
- with tempfile.TemporaryDirectory() as tmp:
172
- res = self._run(
173
- "phase-add",
174
- "--run",
175
- "nope",
176
- "--phase",
177
- "01",
178
- "--goal",
179
- "g",
180
- project=Path(tmp),
181
- )
182
- self.assertIn("--run", res.stderr)
183
-
184
- def test_gate_transitions(self):
185
- with tempfile.TemporaryDirectory() as tmp:
186
- project = Path(tmp)
187
- self._run("init", "--run", "r", project=project)
188
- for action in ("open", "settle", "approve", "waive"):
189
- res = self._run(
190
- "gate",
191
- "--run",
192
- "r",
193
- "--phase",
194
- "01",
195
- "--action",
196
- action,
197
- project=project,
198
- )
199
- self.assertEqual(res.returncode, 0, res.stderr)
200
- state = json.loads(
201
- (project / ".factory" / "r" / "state.json").read_text(encoding="utf-8")
202
- )
203
- self.assertEqual(state["gates"]["01"]["status"], "waived")
204
- self.assertGreaterEqual(state["gates"]["01"]["cycles"], 1)
205
-
206
-
207
- class TestLifecycle(unittest.TestCase):
208
- def test_dry_run_spawns_nothing(self):
209
- with tempfile.TemporaryDirectory() as tmp:
210
- base = Path(tmp) / ".research"
211
- runner = SwarmRunner(
212
- base_dir=base, mock_mode=True, mode="research", dry_run=True
213
- )
214
- buf = io.StringIO()
215
- with redirect_stdout(buf):
216
- runner.run_swarm("objective")
217
- self.assertIn("Dry Run", buf.getvalue())
218
- self.assertFalse(
219
- (base / "scratchpads").exists()
220
- and any((base / "scratchpads").iterdir())
221
- )
222
-
223
- def test_resume_skips_orchestration_when_scopes_exist(self):
224
- with tempfile.TemporaryDirectory() as tmp:
225
- base = Path(tmp) / ".research"
226
- first = SwarmRunner(base_dir=base, mock_mode=True, mode="research")
227
- first.state_machine.init_session("objective", session_id="sess-keep")
228
- first.state_machine.set_scopes(
229
- [{"scope_id": "s1", "title": "t", "objective": "o"}]
230
- )
231
- session_before = first.state_machine.load_global_manifest()["session_id"]
232
-
233
- resumed = SwarmRunner(
234
- base_dir=base, mock_mode=True, mode="research", resume=True
235
- )
236
- buf = io.StringIO()
237
- with redirect_stdout(buf):
238
- resumed._write_progress() # ensure no crash
239
- self.assertIn("resume", buf.getvalue().lower()) if False else None
240
- self.assertEqual(
241
- resumed.state_machine.load_global_manifest()["session_id"],
242
- session_before,
243
- )
244
-
245
- def test_progress_and_stdout_recovery_surface(self):
246
- with tempfile.TemporaryDirectory() as tmp:
247
- base = Path(tmp) / ".research"
248
- runner = SwarmRunner(base_dir=base, mock_mode=True, mode="research")
249
- sm = runner.state_machine
250
- sm.init_session("o")
251
- sm.set_scopes([{"scope_id": "s1", "title": "t", "objective": "o"}])
252
- scope_dir = sm.get_scope_dir("s1")
253
- (scope_dir / "alpha_dossier.json").write_text(
254
- json.dumps({"scope_id": "s1", "recovered_from_stdout": True}),
255
- encoding="utf-8",
256
- )
257
- runner._write_progress()
258
- rows = json.loads((base / "progress.json").read_text(encoding="utf-8"))
259
- self.assertEqual(rows[0]["scope_id"], "s1")
260
- buf = io.StringIO()
261
- with redirect_stdout(buf):
262
- runner._report_stdout_recovery()
263
- self.assertIn("recovered from stdout", buf.getvalue())
264
-
265
- def test_structured_error_fields(self):
266
- with tempfile.TemporaryDirectory() as tmp:
267
- base = Path(tmp) / ".research"
268
- runner = SwarmRunner(base_dir=base, mock_mode=True, mode="research")
269
- scope_dir = runner.state_machine.get_scope_dir("s1")
270
- scope_dir.mkdir(parents=True, exist_ok=True)
271
- with self.assertRaises(DossierNotFound) as ctx:
272
- runner._load_agent_dossier(
273
- scope_dir / "beta_dossier.json", "s1", "beta", None
274
- )
275
- err = ctx.exception
276
- self.assertEqual(err.code, "DOSSIER_NOT_FOUND")
277
- self.assertTrue(err.workspace and err.spawn_cwd and err.path_searched)
278
- self.assertIn("suggested_fix", err.to_dict())
279
-
280
-
281
- class TestRunScopedLayout(unittest.TestCase):
282
- def test_opt_in_layout_and_resolution(self):
283
- with tempfile.TemporaryDirectory() as tmp:
284
- base = Path(tmp) / ".research"
285
- os.environ["IUMBTEMS_RUN_SCOPED"] = "1"
286
- try:
287
- sm = ResearchStateMachine(base_dir=base, mode="research")
288
- sm.init_session("o")
289
- self.assertEqual(sm.base_dir.parent.name, "runs")
290
- self.assertTrue((base / "latest.json").exists())
291
- # Fresh readers resolve the run-scoped manifest.
292
- self.assertEqual(find_any_manifest(base), sm.manifest_file)
293
- finally:
294
- os.environ.pop("IUMBTEMS_RUN_SCOPED", None)
295
-
296
- def test_flat_default_is_unchanged(self):
297
- with tempfile.TemporaryDirectory() as tmp:
298
- base = Path(tmp) / ".research"
299
- sm = ResearchStateMachine(base_dir=base, mode="research")
300
- sm.init_session("o")
301
- self.assertEqual(sm.base_dir, Path(os.path.realpath(str(base))))
302
-
303
-
304
- class TestDocsCheck(unittest.TestCase):
305
- def test_docs_references_resolve(self):
306
- from scripts.check_docs import main
307
-
308
- self.assertEqual(main(), 0)
309
-
310
-
311
- if __name__ == "__main__":
312
- unittest.main()