naive-framework 0.0.0-stage → 0.2.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 (549) hide show
  1. package/AGENTS.md +62 -0
  2. package/LICENSE +21 -0
  3. package/README.md +37 -2
  4. package/docs/decisions/decisions.json +888 -0
  5. package/docs/ontology.json +796 -0
  6. package/docs/ontology.md +163 -0
  7. package/docs/reference/ROUTES.md +124 -0
  8. package/evidence/benchmarks/2026-10-27-golden.jev.after-catalog-fix.json +558 -0
  9. package/evidence/benchmarks/2026-10-27-golden.jev.json +501 -0
  10. package/evidence/benchmarks/2026-10-27-golden.reasoning-answers.json +177 -0
  11. package/evidence/benchmarks/JEV_VS_REASONING_MODEL_2026-10-27.md +68 -0
  12. package/evidence/capabilities/agent-capabilities.json +86 -0
  13. package/evidence/design-documents.registry.json +2896 -0
  14. package/evidence/evals/evals.json +25 -0
  15. package/evidence/evals/harness-evals.json +140 -0
  16. package/evidence/layer.json +51 -0
  17. package/evidence/skills/agent-capabilities/SKILL.md +35 -0
  18. package/evidence/skills/design-coverage/SKILL.md +57 -0
  19. package/evidence/skills/design-coverage/check.mjs +192 -0
  20. package/evidence/skills/design-coverage/scan.mjs +45 -0
  21. package/evidence/skills/fidelity-ladder-audit/SKILL.md +121 -0
  22. package/evidence/skills/fidelity-ladder-audit/ladder-census.mjs +180 -0
  23. package/evidence/skills/findability/SKILL.md +32 -0
  24. package/evidence/skills/findability/inventory.rb +41 -0
  25. package/evidence/skills/foreshadowing-audit/SKILL.md +183 -0
  26. package/evidence/skills/metrics-review/SKILL.md +177 -0
  27. package/evidence/tooling/integrations.json +153 -0
  28. package/governance/layer.json +102 -0
  29. package/governance/references/references.json +26 -0
  30. package/governance/skills/board-design/SKILL.md +68 -0
  31. package/governance/skills/brand-pillar/SKILL.md +90 -0
  32. package/governance/skills/business-pillar/SKILL.md +96 -0
  33. package/governance/skills/chief-of-staff/SKILL.md +45 -0
  34. package/governance/skills/cofounder-structure/SKILL.md +64 -0
  35. package/governance/skills/cross-pillar-tradeoff/SKILL.md +168 -0
  36. package/governance/skills/equity-and-share-classes/SKILL.md +68 -0
  37. package/governance/skills/executive-roles/SKILL.md +95 -0
  38. package/governance/skills/exit-planning/SKILL.md +66 -0
  39. package/governance/skills/financing-and-investor-rights/SKILL.md +73 -0
  40. package/governance/skills/office-hours-mode/SKILL.md +113 -0
  41. package/governance/skills/product-pillar/SKILL.md +81 -0
  42. package/governance/skills/publication-policy/SKILL.md +63 -0
  43. package/governance/skills/role-and-candidate-authoring/SKILL.md +198 -0
  44. package/governance/skills/stakeholder-update/SKILL.md +177 -0
  45. package/governance/tooling/integrations.json +37 -0
  46. package/governance/venture-template/AGENT_ROLES_AND_DECISION_RIGHTS.md +58 -0
  47. package/governance/venture-template/COMPANY_VAULT_DEFINITION_2026-10-25.md +204 -0
  48. package/governance/venture-template/README.md +74 -0
  49. package/governance/venture-template/decision-rights.json +186 -0
  50. package/governance/venture-template/index.md +151 -0
  51. package/governance/venture-template/pillars/brand.md +209 -0
  52. package/governance/venture-template/pillars/business.md +255 -0
  53. package/governance/venture-template/pillars/product.md +254 -0
  54. package/governance/venture-template/render-roles.py +11 -0
  55. package/governance/venture-template/roles/README.md +85 -0
  56. package/governance/venture-template/roles/agent-roles.json +202 -0
  57. package/governance/venture-template/roles/ceo.md +163 -0
  58. package/governance/venture-template/roles/chief-of-staff.md +153 -0
  59. package/governance/venture-template/roles/cmo.md +165 -0
  60. package/governance/venture-template/roles/coo.md +189 -0
  61. package/governance/venture-template/roles/cto.md +158 -0
  62. package/governance/venture-template/roles/department-head.md +47 -0
  63. package/governance/venture-template/roles/forward-deployed-engineer.md +51 -0
  64. package/governance/venture-template/roles/founder.md +173 -0
  65. package/governance/venture-template/roles/hr-manager.md +49 -0
  66. package/governance/venture-template/roles/talent-acquisition-manager.md +50 -0
  67. package/governance/venture-template/roles/venture-roles.json +62 -0
  68. package/interface/acting.mjs +83 -0
  69. package/interface/adapters/claude-code.json +16 -0
  70. package/interface/adapters/codex.json +14 -0
  71. package/interface/adapters/cursor.json +16 -0
  72. package/interface/adapters.mjs +182 -0
  73. package/interface/api/server.mjs +71 -0
  74. package/interface/boundaries.mjs +218 -0
  75. package/interface/brand.mjs +214 -0
  76. package/interface/cli/find-venture.mjs +15 -0
  77. package/interface/cli/freshness.mjs +59 -0
  78. package/interface/cli/guard.mjs +6 -0
  79. package/interface/cli/mentura.mjs +341 -0
  80. package/interface/cli/naive.mjs +194 -0
  81. package/interface/context.mjs +524 -0
  82. package/interface/demo/board.mjs +581 -0
  83. package/interface/demo/decision-harness.mjs +91 -0
  84. package/interface/demo/live-agent.mjs +47 -0
  85. package/interface/dev/setup.mjs +84 -0
  86. package/interface/gate-hooks.mjs +36 -0
  87. package/interface/harness/evals.mjs +90 -0
  88. package/interface/harness/examples/pt-no-shows.dump.md +19 -0
  89. package/interface/harness/run.mjs +313 -0
  90. package/interface/harness/site.mjs +59 -0
  91. package/interface/instrumentation.mjs +86 -0
  92. package/interface/kit-boundary.mjs +73 -0
  93. package/interface/layer.json +37 -0
  94. package/interface/mcp/server.mjs +162 -0
  95. package/interface/operator-console/README.md +58 -0
  96. package/interface/package-routes.mjs +196 -0
  97. package/interface/provenance.mjs +65 -0
  98. package/interface/reads.mjs +173 -0
  99. package/interface/references/references.json +28 -0
  100. package/interface/release-card.mjs +42 -0
  101. package/interface/route-aliases.json +32 -0
  102. package/interface/router.mjs +653 -0
  103. package/interface/skills/install-mentura/SKILL.md +88 -0
  104. package/interface/skills/naive-setup/SKILL.md +71 -0
  105. package/interface/skills/naive-setup/artifact.html +83 -0
  106. package/interface/tooling/integrations.json +112 -0
  107. package/interface/vitals.mjs +115 -0
  108. package/interface/writes.mjs +190 -0
  109. package/knowledge/connectors/README.md +54 -0
  110. package/knowledge/connectors/catalog.mjs +118 -0
  111. package/knowledge/connectors/contract.mjs +56 -0
  112. package/knowledge/connectors/eval.mjs +176 -0
  113. package/knowledge/connectors/filesystem.mjs +79 -0
  114. package/knowledge/connectors/index.mjs +102 -0
  115. package/knowledge/connectors/resolve.mjs +44 -0
  116. package/knowledge/connectors/suite.mjs +80 -0
  117. package/knowledge/freshness.json +85 -0
  118. package/knowledge/layer.json +50 -0
  119. package/knowledge/skills/find-reference/SKILL.md +38 -0
  120. package/knowledge/skills/industry-awareness/SKILL.md +277 -0
  121. package/knowledge/templates/glossary.md +23 -0
  122. package/knowledge/tooling/integrations.json +127 -0
  123. package/knowledge/tooling/questions.md +46 -0
  124. package/operations/FOUNDER_OPERATING_MODEL_CAMPAIGN_2026-10-14.md +16 -0
  125. package/operations/departments.json +162 -0
  126. package/operations/handoff-v2.md +93 -0
  127. package/operations/layer.json +67 -0
  128. package/operations/marketing/check-public.mjs +68 -0
  129. package/operations/marketing/site/README.md +86 -0
  130. package/operations/marketing/site/matrix.json +731 -0
  131. package/operations/marketing/site/plan.mjs +117 -0
  132. package/operations/marketing/site/presence.mjs +252 -0
  133. package/operations/references/references.json +45 -0
  134. package/operations/skills/recruiting/SKILL.md +32 -0
  135. package/operations/skills/team-design/SKILL.md +36 -0
  136. package/operations/skills/tool-selection/SKILL.md +46 -0
  137. package/operations/templates/marketing-brand.md +46 -0
  138. package/operations/templates/public-assets.md +39 -0
  139. package/operations/templates/recruiting-brief.md +35 -0
  140. package/operations/tooling/integrations.json +158 -0
  141. package/package.json +59 -4
  142. package/packages/catalog.json +280 -0
  143. package/packages/cofounder/package.json +42 -0
  144. package/packages/counsel/package.json +47 -0
  145. package/packages/customers/package.json +41 -0
  146. package/packages/deals/package.json +27 -0
  147. package/packages/decisions/package.json +28 -0
  148. package/packages/engineering/package.json +41 -0
  149. package/packages/evidence/package.json +17 -0
  150. package/packages/finance/frames/fund-without-ceding-control.frame.json +177 -0
  151. package/packages/finance/package.json +48 -0
  152. package/packages/foundation/package.json +59 -0
  153. package/packages/fund/package.json +48 -0
  154. package/packages/investor/package.json +57 -0
  155. package/packages/investors/package.json +21 -0
  156. package/packages/legal/package.json +73 -0
  157. package/packages/marketing/package.json +63 -0
  158. package/packages/money/package.json +42 -0
  159. package/packages/operations/package.json +74 -0
  160. package/packages/partner/package.json +38 -0
  161. package/packages/people/package.json +64 -0
  162. package/packages/product/package.json +49 -0
  163. package/packages/raw/package.json +19 -0
  164. package/packages/relationships/package.json +52 -0
  165. package/packages/validation/package.json +112 -0
  166. package/platform/README.md +51 -0
  167. package/platform/adapter.json +15 -0
  168. package/platform/connectors/eval.mjs +154 -0
  169. package/platform/connectors/fake-github.mjs +91 -0
  170. package/platform/connectors/github.mjs +105 -0
  171. package/platform/integrations/jev.mjs +30 -0
  172. package/platform/integrations/langsmith-docket.mjs +53 -0
  173. package/platform/integrations/langsmith-setup.mjs +115 -0
  174. package/platform/integrations/langsmith.mjs +47 -0
  175. package/platform/integrations/remote-image.mjs +79 -0
  176. package/platform/integrations/rho.mjs +146 -0
  177. package/platform/integrations/site.mjs +75 -0
  178. package/platform/kits/README.md +14 -0
  179. package/platform/kits/agent-upgrade/kit.json +15 -0
  180. package/platform/kits/agent-upgrade/run.mjs +82 -0
  181. package/platform/kits/agent-upgrade/stand-in-agent.mjs +32 -0
  182. package/platform/kits/validation-kickoff/kit.json +29 -0
  183. package/platform/mcp/research.mjs +64 -0
  184. package/platform/webhooks/server.mjs +70 -0
  185. package/purpose/checklists/vault-and-tooling-consultancy-setup.md +216 -0
  186. package/purpose/frameworks/business-discovery-framework-amendments-2026-05-20.md +181 -0
  187. package/purpose/frameworks/business-discovery-framework.html +938 -0
  188. package/purpose/frameworks/business-discovery-framework.md +326 -0
  189. package/purpose/frameworks/idea-map/README.md +74 -0
  190. package/purpose/frameworks/idea-map/conventions.json +146 -0
  191. package/purpose/frameworks/idea-map/graph.mjs +182 -0
  192. package/purpose/frameworks/idea-map/ideamap.mjs +181 -0
  193. package/purpose/frameworks/idea-map/route.mjs +140 -0
  194. package/purpose/frameworks/onboarding-handoff-framework.md +269 -0
  195. package/purpose/frameworks/post-discovery-deliverable-playbook.md +274 -0
  196. package/purpose/frameworks/product-anatomy/README.md +63 -0
  197. package/purpose/frameworks/product-anatomy/anatomy.mjs +195 -0
  198. package/purpose/frameworks/product-anatomy/examples/polity.answers.reasoned.json +11 -0
  199. package/purpose/frameworks/product-anatomy/examples/polity.json +89 -0
  200. package/purpose/frameworks/product-anatomy/phases.json +107 -0
  201. package/purpose/frameworks/product-anatomy/questions.json +74 -0
  202. package/purpose/kits/validation/README.md +14 -0
  203. package/purpose/kits/validation/references/references.json +122 -0
  204. package/purpose/kits/validation/skills/problem-validation/SKILL.md +43 -0
  205. package/purpose/kits/validation/skills/validation-score/SKILL.md +35 -0
  206. package/purpose/kits/validation/templates/go-to-market.md +19 -0
  207. package/purpose/kits/validation/templates/operations-readiness.md +20 -0
  208. package/purpose/kits/validation/templates/pricing.md +22 -0
  209. package/purpose/kits/validation/templates/problem-interview.md +36 -0
  210. package/purpose/kits/validation/templates/problem.md +45 -0
  211. package/purpose/kits/validation/templates/product-market-fit.md +23 -0
  212. package/purpose/kits/validation/templates/solution.md +18 -0
  213. package/purpose/kits/validation/templates/team.md +19 -0
  214. package/purpose/kits/validation/weights.json +22 -0
  215. package/purpose/layer.json +53 -0
  216. package/purpose/references/references.json +324 -0
  217. package/purpose/skills/ambition-tier/SKILL.md +205 -0
  218. package/purpose/skills/telos/SKILL.md +52 -0
  219. package/purpose/strategic-foundation.json +133 -0
  220. package/purpose/templates/telos-based-smart.md +39 -0
  221. package/purpose/tooling/integrations.json +48 -0
  222. package/schema/README.md +62 -0
  223. package/schema/VERSION +1 -0
  224. package/schema/access.mjs +57 -0
  225. package/schema/account.schema.json +79 -0
  226. package/schema/adapter.schema.json +33 -0
  227. package/schema/add-department.mjs +41 -0
  228. package/schema/agent-capability.schema.json +94 -0
  229. package/schema/alignment.schema.json +61 -0
  230. package/schema/assess-problem.mjs +131 -0
  231. package/schema/assets.mjs +212 -0
  232. package/schema/bdd.mjs +56 -0
  233. package/schema/board.schema.json +101 -0
  234. package/schema/brand.mjs +373 -0
  235. package/schema/build-release.mjs +61 -0
  236. package/schema/caching.mjs +505 -0
  237. package/schema/check-assets.mjs +24 -0
  238. package/schema/check-boundary.mjs +54 -0
  239. package/schema/check-brand.mjs +24 -0
  240. package/schema/check-config.mjs +110 -0
  241. package/schema/check-data-model.mjs +170 -0
  242. package/schema/check-data-packages.mjs +83 -0
  243. package/schema/check-departments.mjs +45 -0
  244. package/schema/check-execution.mjs +85 -0
  245. package/schema/check-governance.mjs +98 -0
  246. package/schema/check-integrations.mjs +33 -0
  247. package/schema/check-nextjs-status.mjs +79 -0
  248. package/schema/check-nouns.mjs +49 -0
  249. package/schema/check-people.mjs +70 -0
  250. package/schema/check-private.mjs +61 -0
  251. package/schema/check-provenance.mjs +55 -0
  252. package/schema/check-publication.mjs +96 -0
  253. package/schema/check-ready.mjs +89 -0
  254. package/schema/check-sources.mjs +74 -0
  255. package/schema/check-team.mjs +94 -0
  256. package/schema/check-telos.mjs +59 -0
  257. package/schema/check-validation.mjs +165 -0
  258. package/schema/check-ventures.mjs +81 -0
  259. package/schema/check-where-used.mjs +58 -0
  260. package/schema/data-master.schema.json +14 -0
  261. package/schema/data-model.json +1584 -0
  262. package/schema/data-model.schema.json +152 -0
  263. package/schema/deal.schema.json +80 -0
  264. package/schema/decision-analytics.mjs +77 -0
  265. package/schema/decision-record.schema.json +290 -0
  266. package/schema/decision-rights.schema.json +34 -0
  267. package/schema/decision.schema.json +30 -0
  268. package/schema/decisions.mjs +327 -0
  269. package/schema/department-catalog.schema.json +55 -0
  270. package/schema/department.schema.json +15 -0
  271. package/schema/departments.mjs +32 -0
  272. package/schema/docket-eval.mjs +89 -0
  273. package/schema/docket.mjs +135 -0
  274. package/schema/eval-suite.schema.json +45 -0
  275. package/schema/evidence.schema.json +110 -0
  276. package/schema/examples/frames/judge.mjs +10 -0
  277. package/schema/examples/migrate/agent.mjs +12 -0
  278. package/schema/examples/venture-type/jev.mjs +12 -0
  279. package/schema/examples/workspace/ventures/acme-labs/AGENTS.md +17 -0
  280. package/schema/examples/workspace/ventures/acme-labs/accounts/.gitkeep +0 -0
  281. package/schema/examples/workspace/ventures/acme-labs/decisions/discovery-goal.decision.json +23 -0
  282. package/schema/examples/workspace/ventures/acme-labs/decisions/statement-icp.decision.json +22 -0
  283. package/schema/examples/workspace/ventures/acme-labs/decisions/statement-problem.decision.json +22 -0
  284. package/schema/examples/workspace/ventures/acme-labs/decisions/venture.team.decision.json +37 -0
  285. package/schema/examples/workspace/ventures/acme-labs/knowledge/README.md +3 -0
  286. package/schema/examples/workspace/ventures/acme-labs/knowledge/sources.json +46 -0
  287. package/schema/examples/workspace/ventures/acme-labs/money/30000000-0000-4000-8000-000000000001.json +12 -0
  288. package/schema/examples/workspace/ventures/acme-labs/money/30000000-0000-4000-8000-000000000002.json +12 -0
  289. package/schema/examples/workspace/ventures/acme-labs/money/30000000-0000-4000-8000-000000000003.json +12 -0
  290. package/schema/examples/workspace/ventures/acme-labs/money/30000000-0000-4000-8000-000000000004.json +12 -0
  291. package/schema/examples/workspace/ventures/acme-labs/money/30000000-0000-4000-8000-000000000005.json +12 -0
  292. package/schema/examples/workspace/ventures/acme-labs/money/30000000-0000-4000-8000-000000000006.json +12 -0
  293. package/schema/examples/workspace/ventures/acme-labs/money/30000000-0000-4000-8000-000000000007.json +12 -0
  294. package/schema/examples/workspace/ventures/acme-labs/money/30000000-0000-4000-8000-000000000008.json +12 -0
  295. package/schema/examples/workspace/ventures/acme-labs/money/30000000-0000-4000-8000-000000000009.json +12 -0
  296. package/schema/examples/workspace/ventures/acme-labs/money/30000000-0000-4000-8000-000000000010.json +12 -0
  297. package/schema/examples/workspace/ventures/acme-labs/money/30000000-0000-4000-8000-000000000011.json +12 -0
  298. package/schema/examples/workspace/ventures/acme-labs/money/30000000-0000-4000-8000-000000000012.json +12 -0
  299. package/schema/examples/workspace/ventures/acme-labs/money/30000000-0000-4000-8000-000000000013.json +12 -0
  300. package/schema/examples/workspace/ventures/acme-labs/money/30000000-0000-4000-8000-000000000014.json +12 -0
  301. package/schema/examples/workspace/ventures/acme-labs/money/_streams/transactions/stream.json +5 -0
  302. package/schema/examples/workspace/ventures/acme-labs/money/_summary.json +30 -0
  303. package/schema/examples/workspace/ventures/acme-labs/operations/departments/customer-service/README.md +5 -0
  304. package/schema/examples/workspace/ventures/acme-labs/operations/departments/customer-service/department.json +5 -0
  305. package/schema/examples/workspace/ventures/acme-labs/operations/departments/finance/README.md +5 -0
  306. package/schema/examples/workspace/ventures/acme-labs/operations/departments/finance/department.json +5 -0
  307. package/schema/examples/workspace/ventures/acme-labs/operations/departments/human-capital/README.md +5 -0
  308. package/schema/examples/workspace/ventures/acme-labs/operations/departments/human-capital/department.json +5 -0
  309. package/schema/examples/workspace/ventures/acme-labs/operations/departments/it/README.md +5 -0
  310. package/schema/examples/workspace/ventures/acme-labs/operations/departments/it/department.json +5 -0
  311. package/schema/examples/workspace/ventures/acme-labs/operations/departments/marketing-and-sales/README.md +5 -0
  312. package/schema/examples/workspace/ventures/acme-labs/operations/departments/marketing-and-sales/department.json +5 -0
  313. package/schema/examples/workspace/ventures/acme-labs/operations/departments/products/README.md +5 -0
  314. package/schema/examples/workspace/ventures/acme-labs/operations/departments/products/department.json +5 -0
  315. package/schema/examples/workspace/ventures/acme-labs/operations/departments/strategy/README.md +5 -0
  316. package/schema/examples/workspace/ventures/acme-labs/operations/departments/strategy/department.json +5 -0
  317. package/schema/examples/workspace/ventures/acme-labs/people/founders/maya-chen.json +15 -0
  318. package/schema/examples/workspace/ventures/acme-labs/people/people.json +22 -0
  319. package/schema/examples/workspace/ventures/acme-labs/pillars/brand.md +5 -0
  320. package/schema/examples/workspace/ventures/acme-labs/pillars/business.md +5 -0
  321. package/schema/examples/workspace/ventures/acme-labs/pillars/product.md +5 -0
  322. package/schema/examples/workspace/ventures/acme-labs/products/.gitkeep +0 -0
  323. package/schema/examples/workspace/ventures/acme-labs/products/decisions/product.core-product.decision.json +28 -0
  324. package/schema/examples/workspace/ventures/acme-labs/products/decisions/product.exists.decision.json +38 -0
  325. package/schema/examples/workspace/ventures/acme-labs/products/decisions/product.flagship.decision.json +27 -0
  326. package/schema/examples/workspace/ventures/acme-labs/profile.md +12 -0
  327. package/schema/examples/workspace/ventures/acme-labs/provenance.jsonl +12 -0
  328. package/schema/examples/workspace/ventures/acme-labs/raw/dump.md +6 -0
  329. package/schema/examples/workspace/ventures/acme-labs/venture.json +27 -0
  330. package/schema/examples/workspace/ventures/northstar/AGENTS.md +17 -0
  331. package/schema/examples/workspace/ventures/northstar/accounts/.gitkeep +0 -0
  332. package/schema/examples/workspace/ventures/northstar/deals/ductline.json +8 -0
  333. package/schema/examples/workspace/ventures/northstar/deals/kilnworks.json +14 -0
  334. package/schema/examples/workspace/ventures/northstar/decisions/venture.team.decision.json +31 -0
  335. package/schema/examples/workspace/ventures/northstar/evidence/README.md +3 -0
  336. package/schema/examples/workspace/ventures/northstar/fund/decisions/terms.decision.json +27 -0
  337. package/schema/examples/workspace/ventures/northstar/fund/decisions/terms.first-close.decision.json +27 -0
  338. package/schema/examples/workspace/ventures/northstar/fund/decisions/thesis.decision.json +26 -0
  339. package/schema/examples/workspace/ventures/northstar/fund/terms.json +22 -0
  340. package/schema/examples/workspace/ventures/northstar/fund/thesis.json +22 -0
  341. package/schema/examples/workspace/ventures/northstar/governance/README.md +3 -0
  342. package/schema/examples/workspace/ventures/northstar/governance/departments/external-relationships/charter.md +5 -0
  343. package/schema/examples/workspace/ventures/northstar/governance/departments/external-relationships/department.json +5 -0
  344. package/schema/examples/workspace/ventures/northstar/governance/departments/finance/charter.md +5 -0
  345. package/schema/examples/workspace/ventures/northstar/governance/departments/finance/department.json +5 -0
  346. package/schema/examples/workspace/ventures/northstar/governance/departments/human-capital/charter.md +5 -0
  347. package/schema/examples/workspace/ventures/northstar/governance/departments/human-capital/department.json +5 -0
  348. package/schema/examples/workspace/ventures/northstar/governance/departments/risk-and-compliance/charter.md +5 -0
  349. package/schema/examples/workspace/ventures/northstar/governance/departments/risk-and-compliance/department.json +5 -0
  350. package/schema/examples/workspace/ventures/northstar/governance/departments/strategy/charter.md +5 -0
  351. package/schema/examples/workspace/ventures/northstar/governance/departments/strategy/department.json +5 -0
  352. package/schema/examples/workspace/ventures/northstar/knowledge/README.md +3 -0
  353. package/schema/examples/workspace/ventures/northstar/operations/README.md +3 -0
  354. package/schema/examples/workspace/ventures/northstar/operations/departments/external-relationships/README.md +5 -0
  355. package/schema/examples/workspace/ventures/northstar/operations/departments/external-relationships/department.json +5 -0
  356. package/schema/examples/workspace/ventures/northstar/operations/departments/finance/README.md +5 -0
  357. package/schema/examples/workspace/ventures/northstar/operations/departments/finance/department.json +5 -0
  358. package/schema/examples/workspace/ventures/northstar/operations/departments/human-capital/README.md +5 -0
  359. package/schema/examples/workspace/ventures/northstar/operations/departments/human-capital/department.json +5 -0
  360. package/schema/examples/workspace/ventures/northstar/operations/departments/risk-and-compliance/README.md +5 -0
  361. package/schema/examples/workspace/ventures/northstar/operations/departments/risk-and-compliance/department.json +5 -0
  362. package/schema/examples/workspace/ventures/northstar/operations/departments/strategy/README.md +5 -0
  363. package/schema/examples/workspace/ventures/northstar/operations/departments/strategy/department.json +5 -0
  364. package/schema/examples/workspace/ventures/northstar/people/founders/ana-ruiz.json +13 -0
  365. package/schema/examples/workspace/ventures/northstar/people/founders/ben-okafor.json +7 -0
  366. package/schema/examples/workspace/ventures/northstar/people/people.json +27 -0
  367. package/schema/examples/workspace/ventures/northstar/pillars/brand.md +5 -0
  368. package/schema/examples/workspace/ventures/northstar/pillars/business.md +5 -0
  369. package/schema/examples/workspace/ventures/northstar/pillars/product.md +5 -0
  370. package/schema/examples/workspace/ventures/northstar/portfolio/kilnworks/AGENTS.md +17 -0
  371. package/schema/examples/workspace/ventures/northstar/portfolio/kilnworks/accounts/.gitkeep +0 -0
  372. package/schema/examples/workspace/ventures/northstar/portfolio/kilnworks/decisions/venture.team.decision.json +31 -0
  373. package/schema/examples/workspace/ventures/northstar/portfolio/kilnworks/knowledge/README.md +3 -0
  374. package/schema/examples/workspace/ventures/northstar/portfolio/kilnworks/operations/departments/customer-service/README.md +5 -0
  375. package/schema/examples/workspace/ventures/northstar/portfolio/kilnworks/operations/departments/customer-service/department.json +5 -0
  376. package/schema/examples/workspace/ventures/northstar/portfolio/kilnworks/operations/departments/finance/README.md +5 -0
  377. package/schema/examples/workspace/ventures/northstar/portfolio/kilnworks/operations/departments/finance/department.json +5 -0
  378. package/schema/examples/workspace/ventures/northstar/portfolio/kilnworks/operations/departments/human-capital/README.md +5 -0
  379. package/schema/examples/workspace/ventures/northstar/portfolio/kilnworks/operations/departments/human-capital/department.json +5 -0
  380. package/schema/examples/workspace/ventures/northstar/portfolio/kilnworks/operations/departments/it/README.md +5 -0
  381. package/schema/examples/workspace/ventures/northstar/portfolio/kilnworks/operations/departments/it/department.json +5 -0
  382. package/schema/examples/workspace/ventures/northstar/portfolio/kilnworks/operations/departments/marketing-and-sales/README.md +5 -0
  383. package/schema/examples/workspace/ventures/northstar/portfolio/kilnworks/operations/departments/marketing-and-sales/department.json +5 -0
  384. package/schema/examples/workspace/ventures/northstar/portfolio/kilnworks/operations/departments/products/README.md +5 -0
  385. package/schema/examples/workspace/ventures/northstar/portfolio/kilnworks/operations/departments/products/department.json +5 -0
  386. package/schema/examples/workspace/ventures/northstar/portfolio/kilnworks/operations/departments/strategy/README.md +5 -0
  387. package/schema/examples/workspace/ventures/northstar/portfolio/kilnworks/operations/departments/strategy/department.json +5 -0
  388. package/schema/examples/workspace/ventures/northstar/portfolio/kilnworks/pillars/brand.md +5 -0
  389. package/schema/examples/workspace/ventures/northstar/portfolio/kilnworks/pillars/business.md +5 -0
  390. package/schema/examples/workspace/ventures/northstar/portfolio/kilnworks/pillars/product.md +5 -0
  391. package/schema/examples/workspace/ventures/northstar/portfolio/kilnworks/products/.gitkeep +0 -0
  392. package/schema/examples/workspace/ventures/northstar/portfolio/kilnworks/products/decisions/product.core-product.decision.json +28 -0
  393. package/schema/examples/workspace/ventures/northstar/portfolio/kilnworks/products/decisions/product.exists.decision.json +32 -0
  394. package/schema/examples/workspace/ventures/northstar/portfolio/kilnworks/products/decisions/product.flagship.decision.json +27 -0
  395. package/schema/examples/workspace/ventures/northstar/portfolio/kilnworks/profile.md +5 -0
  396. package/schema/examples/workspace/ventures/northstar/portfolio/kilnworks/venture.json +27 -0
  397. package/schema/examples/workspace/ventures/northstar/products/.gitkeep +0 -0
  398. package/schema/examples/workspace/ventures/northstar/profile.md +5 -0
  399. package/schema/examples/workspace/ventures/northstar/provenance.jsonl +3 -0
  400. package/schema/examples/workspace/ventures/northstar/purpose/README.md +3 -0
  401. package/schema/examples/workspace/ventures/northstar/venture.json +49 -0
  402. package/schema/examples/workspace/ventures/studio/accounts/bakery/account.json +18 -0
  403. package/schema/examples/workspace/ventures/studio/evidence/.gitkeep +0 -0
  404. package/schema/examples/workspace/ventures/studio/governance/.gitkeep +0 -0
  405. package/schema/examples/workspace/ventures/studio/knowledge/.gitkeep +0 -0
  406. package/schema/examples/workspace/ventures/studio/operations/.gitkeep +0 -0
  407. package/schema/examples/workspace/ventures/studio/print/knowledge/.gitkeep +0 -0
  408. package/schema/examples/workspace/ventures/studio/print/purpose/.gitkeep +0 -0
  409. package/schema/examples/workspace/ventures/studio/print/venture.json +37 -0
  410. package/schema/examples/workspace/ventures/studio/products/brand-care.json +19 -0
  411. package/schema/examples/workspace/ventures/studio/products/brand-kit.json +23 -0
  412. package/schema/examples/workspace/ventures/studio/provenance.jsonl +3 -0
  413. package/schema/examples/workspace/ventures/studio/purpose/.gitkeep +0 -0
  414. package/schema/examples/workspace/ventures/studio/venture.json +43 -0
  415. package/schema/examples/workspace/ventures/tandem/accounts/.gitkeep +0 -0
  416. package/schema/examples/workspace/ventures/tandem/evidence/README.md +3 -0
  417. package/schema/examples/workspace/ventures/tandem/governance/README.md +3 -0
  418. package/schema/examples/workspace/ventures/tandem/governance/agreements/dee-fast.md +3 -0
  419. package/schema/examples/workspace/ventures/tandem/governance/board.json +51 -0
  420. package/schema/examples/workspace/ventures/tandem/governance/departments/finance/charter.md +5 -0
  421. package/schema/examples/workspace/ventures/tandem/governance/departments/finance/department.json +5 -0
  422. package/schema/examples/workspace/ventures/tandem/governance/departments/primary/marketing-and-sales/charter.md +5 -0
  423. package/schema/examples/workspace/ventures/tandem/governance/departments/primary/marketing-and-sales/department.json +5 -0
  424. package/schema/examples/workspace/ventures/tandem/governance/exit.json +33 -0
  425. package/schema/examples/workspace/ventures/tandem/governance/founder-agreement.json +24 -0
  426. package/schema/examples/workspace/ventures/tandem/governance/founder-agreement.md +3 -0
  427. package/schema/examples/workspace/ventures/tandem/governance/ownership.json +131 -0
  428. package/schema/examples/workspace/ventures/tandem/governance/publication-policy.json +171 -0
  429. package/schema/examples/workspace/ventures/tandem/knowledge/README.md +3 -0
  430. package/schema/examples/workspace/ventures/tandem/knowledge/research/friends-feedback-2026-08.md +3 -0
  431. package/schema/examples/workspace/ventures/tandem/knowledge/research/pilot-2026-10.md +3 -0
  432. package/schema/examples/workspace/ventures/tandem/knowledge/research/problem-interviews-2026-09.md +20 -0
  433. package/schema/examples/workspace/ventures/tandem/knowledge/sources.json +8 -0
  434. package/schema/examples/workspace/ventures/tandem/knowledge/where-used.json +13 -0
  435. package/schema/examples/workspace/ventures/tandem/operations/README.md +3 -0
  436. package/schema/examples/workspace/ventures/tandem/operations/departments/finance/README.md +5 -0
  437. package/schema/examples/workspace/ventures/tandem/operations/departments/finance/department.json +5 -0
  438. package/schema/examples/workspace/ventures/tandem/operations/departments/primary/marketing-and-sales/README.md +5 -0
  439. package/schema/examples/workspace/ventures/tandem/operations/departments/primary/marketing-and-sales/department.json +5 -0
  440. package/schema/examples/workspace/ventures/tandem/pillars/brand.md +5 -0
  441. package/schema/examples/workspace/ventures/tandem/pillars/business.md +5 -0
  442. package/schema/examples/workspace/ventures/tandem/pillars/product.md +5 -0
  443. package/schema/examples/workspace/ventures/tandem/products/.gitkeep +0 -0
  444. package/schema/examples/workspace/ventures/tandem/products/shop-app.json +22 -0
  445. package/schema/examples/workspace/ventures/tandem/profile.md +5 -0
  446. package/schema/examples/workspace/ventures/tandem/provenance.jsonl +13 -0
  447. package/schema/examples/workspace/ventures/tandem/purpose/README.md +3 -0
  448. package/schema/examples/workspace/ventures/tandem/purpose/telos.json +78 -0
  449. package/schema/examples/workspace/ventures/tandem/purpose/validation/go-to-market.json +35 -0
  450. package/schema/examples/workspace/ventures/tandem/purpose/validation/pricing.json +37 -0
  451. package/schema/examples/workspace/ventures/tandem/purpose/validation/problem.json +74 -0
  452. package/schema/examples/workspace/ventures/tandem/purpose/validation/product-market-fit.json +66 -0
  453. package/schema/examples/workspace/ventures/tandem/purpose/validation/solution.json +33 -0
  454. package/schema/examples/workspace/ventures/tandem/purpose/validation/team.json +52 -0
  455. package/schema/examples/workspace/ventures/tandem/venture.json +79 -0
  456. package/schema/examples/workspace/ventures/woodworking/knowledge/.gitkeep +0 -0
  457. package/schema/examples/workspace/ventures/woodworking/venture.json +21 -0
  458. package/schema/examples/workspace/workspace.json +8 -0
  459. package/schema/exit.schema.json +74 -0
  460. package/schema/foundation.mjs +118 -0
  461. package/schema/founder-agreement.schema.json +83 -0
  462. package/schema/founder.schema.json +72 -0
  463. package/schema/frame.schema.json +240 -0
  464. package/schema/frames.mjs +228 -0
  465. package/schema/freshness-log.schema.json +40 -0
  466. package/schema/freshness-profiles.schema.json +44 -0
  467. package/schema/freshness.mjs +473 -0
  468. package/schema/fund-terms.schema.json +107 -0
  469. package/schema/fund-thesis.schema.json +87 -0
  470. package/schema/gate-drafts.mjs +130 -0
  471. package/schema/gate.mjs +133 -0
  472. package/schema/glossary.schema.json +25 -0
  473. package/schema/handoff.schema.json +239 -0
  474. package/schema/icp.schema.json +136 -0
  475. package/schema/idea-graph.schema.json +61 -0
  476. package/schema/init-venture.mjs +128 -0
  477. package/schema/integration.schema.json +143 -0
  478. package/schema/judgment.schema.json +38 -0
  479. package/schema/kit.schema.json +47 -0
  480. package/schema/kits.mjs +24 -0
  481. package/schema/knowledge-sources.schema.json +260 -0
  482. package/schema/layer.json +59 -0
  483. package/schema/layer.schema.json +119 -0
  484. package/schema/load-packages.mjs +26 -0
  485. package/schema/marketing-brand.schema.json +116 -0
  486. package/schema/marketing-sitemap.schema.json +232 -0
  487. package/schema/migrate-venture.mjs +192 -0
  488. package/schema/migrations/kit-to-package.mjs +94 -0
  489. package/schema/migrations/package-layout.mjs +86 -0
  490. package/schema/model-steps.mjs +717 -0
  491. package/schema/money-summary.schema.json +138 -0
  492. package/schema/naive-config.mjs +165 -0
  493. package/schema/naive-config.schema.json +268 -0
  494. package/schema/need-now.json +772 -0
  495. package/schema/need-now.mjs +108 -0
  496. package/schema/nextjs-status.schema.json +29 -0
  497. package/schema/ownership.schema.json +282 -0
  498. package/schema/packages.json +4 -0
  499. package/schema/packages.mjs +252 -0
  500. package/schema/payouts.mjs +91 -0
  501. package/schema/people.schema.json +86 -0
  502. package/schema/port-venture.mjs +161 -0
  503. package/schema/product.schema.json +223 -0
  504. package/schema/provenance-entry.schema.json +154 -0
  505. package/schema/public-assets.schema.json +76 -0
  506. package/schema/publication-policy.schema.json +293 -0
  507. package/schema/raw-source.schema.json +15 -0
  508. package/schema/reference.schema.json +115 -0
  509. package/schema/release-read.mjs +111 -0
  510. package/schema/releases.mjs +497 -0
  511. package/schema/route-aliases.schema.json +25 -0
  512. package/schema/run-handoff.mjs +51 -0
  513. package/schema/scaffold/defaults.json +54 -0
  514. package/schema/setup.mjs +164 -0
  515. package/schema/site-presence.schema.json +337 -0
  516. package/schema/stale.mjs +111 -0
  517. package/schema/start-release.mjs +41 -0
  518. package/schema/strategic-foundation.schema.json +74 -0
  519. package/schema/stream.schema.json +14 -0
  520. package/schema/structure.mjs +186 -0
  521. package/schema/systems-catalog.json +126 -0
  522. package/schema/systems-catalog.schema.json +78 -0
  523. package/schema/team-plan.schema.json +157 -0
  524. package/schema/telos.schema.json +197 -0
  525. package/schema/time-to-ready.mjs +93 -0
  526. package/schema/trigger.schema.json +44 -0
  527. package/schema/triggers.mjs +237 -0
  528. package/schema/upgrade-registry.schema.json +60 -0
  529. package/schema/upgrade-venture.mjs +107 -0
  530. package/schema/upgrades.json +69 -0
  531. package/schema/upgrades.mjs +385 -0
  532. package/schema/use-model.mjs +10 -0
  533. package/schema/validate.py +58 -0
  534. package/schema/validation-evidence.schema.json +123 -0
  535. package/schema/validation-go-to-market.schema.json +110 -0
  536. package/schema/validation-operations-readiness.schema.json +91 -0
  537. package/schema/validation-pricing.schema.json +114 -0
  538. package/schema/validation-problem.schema.json +118 -0
  539. package/schema/validation-product-market-fit.schema.json +135 -0
  540. package/schema/validation-solution.schema.json +79 -0
  541. package/schema/validation-team.schema.json +116 -0
  542. package/schema/venture-role.schema.json +64 -0
  543. package/schema/venture-type.mjs +62 -0
  544. package/schema/venture-types.json +346 -0
  545. package/schema/venture-types.schema.json +129 -0
  546. package/schema/venture.schema.json +460 -0
  547. package/schema/vocab/business-models.json +298 -0
  548. package/schema/where-used.schema.json +56 -0
  549. package/schema/workspace.schema.json +38 -0
@@ -0,0 +1,341 @@
1
+ #!/usr/bin/env node
2
+ // The command line over the router (EE-030). Same routes and gates as the MCP server and the API.
3
+ //
4
+ // mentura routes [--group <phase>] [--json] the route table, or one route group
5
+ // mentura groups [--json] route groups: the routes each phase needs
6
+ // mentura ventures [--json] ventures in the workspace
7
+ // mentura init <dir> --id <id> [--phase <phase>] [--layers purpose,governance]
8
+ // start a venture; --layers turns on only those
9
+ // mentura add <function> --venture <id> [--group]
10
+ // import a function (department is the alias for one release): list it and create its folders
11
+ // mentura upgrade --venture <id> alias of naive upgrade: move the venture onto the package folder layout (EE-070, EE-076)
12
+ // mentura migrate --from <project> --venture <id|dir> [--apply]
13
+ // alias of naive migrate: an agent rewrites a project as Naive records (EE-076)
14
+ // mentura typegen alias of naive typegen (EE-073)
15
+ // mentura steps <payload|run|check|waterfall|provenance|confirm> --venture <id> [--answers <file>] [--speculate] [--stream]
16
+ // model steps (use model, EE-073): schema/model-steps.mjs
17
+ // mentura accept <route> --venture <id> [--confirm <route>]
18
+ // a person accepts an agent's draft of a gated record;
19
+ // one holding a foundation statement asks you to type the route;
20
+ // [--pick <letter>] [--by <name>] accepts one of drafts kept side by side
21
+ // mentura decide <decision> --venture <id> --by <name> [--answer <text>] [--confirm <decision>]
22
+ // a person makes a decision: approves its wording or gives their own (EE-058)
23
+ // mentura propose --venture <id> --input <file.json> [--as <role>]
24
+ // an agent proposes a decision; it stays open until a person decides
25
+ // mentura understand --venture <id> [--confirm ideas] [--note <corrections made>]
26
+ // a person confirms Mentura read their ideas right (the map
27
+ // and graph, after any corrections), before routing (EE-069)
28
+ // mentura confirm <statement> --venture <id> [--confirm <statement>]
29
+ // a person confirms one foundation statement as theirs (EE-051)
30
+ // mentura <route> <action> --venture <id|path> [--input <file>|-] [--as person] [--value <n>] [--json]
31
+ // actions: read, write, check, template, layout, view (a page), run (commands)
32
+ // a collection item is <route>/<id> (purpose/product/kettle); a nested venture is its
33
+ // folder path (--venture studio/print); system/overview view shows the venture at a glance
34
+ // [--derived-from a,b] [--decision <id>] [--note <text>] provenance for a write (EE-031)
35
+ // [--confidence <n>] a score computed before the write, read by the gate's confidence rules
36
+ // knowledge/catalog run builds the catalog over the venture's sources; knowledge/search run
37
+ // --value <query> finds items in any of them (EE-037)
38
+ // purpose/validation/assess run lists what is missing and asks to fill it in or run as is;
39
+ // --as-is runs it anyway (EE-050)
40
+ // [--where status=active|trial,phase=build] filters a read; --hierarchy shows how it resolved
41
+ // a package's own route (validation, packages/product) reads its state; (go-to-market) is a
42
+ // route group; venture read is the manifest, venture check runs every boundary
43
+ // mentura baseline --venture <id> adopt existing records into the provenance log
44
+ // mentura revalidate <tag:route|path:folder|package:name|route> --venture <id> [--pivot] [--reason <text>]
45
+ // mark records stale on demand; a plain folder is refused for exact tags (Revalidating)
46
+ // mentura verify <route|folder> --venture <id> checked and still right, unchanged: its age starts again
47
+ // mentura phase <phase> --venture <id> --as person change phase; per-phase records go stale
48
+ // mentura freshness --venture <id> [--freeze <out dir>] what is fresh, stale, expired or a live hole
49
+ // mentura <route> navigate|head --venture <id> [--session <s>] [--task <text>] [--prefetch a,b | --no-prefetch] [--stream]
50
+ // read a route header first, with layout once per session, template and prefetch
51
+ // mentura batch --venture <id> --input <calls.json> [--stream]
52
+ // run a list of {route, action, input} calls, reporting each as it finishes
53
+ //
54
+ // The workspace is MENTURA_WORKSPACE, else --workspace <dir>, else this repository's instance/.
55
+ // Writes default to an agent actor; --as person is for a person at the keyboard, and a gated
56
+ // record written by an agent lands in <venture>/_drafts/ for a person to accept.
57
+
58
+ import "./guard.mjs"; // wf/writes hook: a broken framework file answers with recovery steps (E-8)
59
+ import { existsSync, readFileSync, rmSync } from "node:fs";
60
+ import { join, relative, resolve } from "node:path";
61
+ import { spawnSync } from "node:child_process";
62
+ import { call, draftOf, files, glob, groups, repo, routes, routesMd, ventureDir, ventures } from "../router.mjs";
63
+ import { agentFromEnv, entries, record } from "../provenance.mjs";
64
+ import { FRAME, filesOf } from "../../schema/foundation.mjs";
65
+ import { approve, decisions, propose } from "../../schema/decisions.mjs";
66
+ // Gate group hook (X-2): held drafts kept side by side.
67
+ import { pick as pickDraft, settle as settleDraft } from "../../schema/gate-drafts.mjs";
68
+ import { asRouted, findVenture } from "./find-venture.mjs";
69
+
70
+ // The danger zone (EE-051): a foundation statement is accepted or confirmed only when the person types
71
+ // its name, at the prompt or with --confirm <name>.
72
+ async function typed(name, what, why = "This is a foundation statement: changing it changes the venture.") {
73
+ if (opt("confirm") !== undefined) return opt("confirm") === name;
74
+ console.log(`${what}\n${why} Type ${name} to confirm.`);
75
+ if (!process.stdin.isTTY) { console.log(`(not at a terminal: pass --confirm ${name})`); return false; }
76
+ const { createInterface } = await import("node:readline/promises");
77
+ const rl = createInterface({ input: process.stdin, output: process.stdout });
78
+ const a = (await rl.question("> ")).trim();
79
+ rl.close();
80
+ return a === name;
81
+ }
82
+ const foundationOf = (recordType) => FRAME.questions.flatMap((q) => q.statements).filter((s) => s.record === recordType);
83
+
84
+ const argv = process.argv.slice(2);
85
+ // Inside a venture, --venture and the workspace default to it (I-2): `cd my-venture && mentura system/overview view`.
86
+ const here = !argv.includes("--venture") && !argv.includes("--workspace") ? findVenture() : null;
87
+ if (here) { argv.push("--venture", asRouted(here).venture, "--workspace", asRouted(here).workspace); process.env.MENTURA_WORKSPACE = asRouted(here).workspace; }
88
+ const opt = (name) => { const i = argv.indexOf(`--${name}`); return i >= 0 ? argv[i + 1] : undefined; };
89
+ const flag = (name) => argv.includes(`--${name}`);
90
+ const positional = argv.filter((a, i) => !a.startsWith("--") && !(i > 0 && argv[i - 1].startsWith("--") && !["json", "hierarchy"].includes(argv[i - 1].slice(2))));
91
+ const workspace = opt("workspace") ? resolve(opt("workspace")) : undefined;
92
+ const out = (x) => console.log(typeof x === "string" ? x : JSON.stringify(x, null, 2));
93
+
94
+ function usage(code = 2) {
95
+ console.error(readFileSync(new URL(import.meta.url), "utf8").split("\n").filter((l) => l.startsWith("// ")).map((l) => l.slice(5)).join("\n"));
96
+ process.exit(code);
97
+ }
98
+
99
+ const [cmd, action] = positional;
100
+ if (!cmd || cmd === "help" || flag("help")) usage(cmd ? 0 : 2);
101
+
102
+ if (cmd === "routes") {
103
+ const g = opt("group")?.replace(/^\(|\)$/g, "");
104
+ const rs = g ? routes().filter((r) => r.groups.includes(`(${g})`)) : routes();
105
+ out(flag("json") || g ? (flag("json") ? rs : rs.map((r) => `${r.route.padEnd(44)} ${r.actions.join(", ")}`).join("\n")) : routesMd());
106
+ process.exit(0);
107
+ }
108
+
109
+ if (cmd === "groups") { out(flag("json") ? groups() : groups().map((g) => `${g.group.padEnd(14)} ${g.routes.length} routes ${g.question}`).join("\n")); process.exit(0); }
110
+
111
+ if (cmd === "ventures") {
112
+ const vs = ventures(workspace);
113
+ out(flag("json") ? vs : vs.map((v) => `${v.id.padEnd(24)} ${String(v.phase).padEnd(12)} ${v.path}`).join("\n") || "no ventures");
114
+ process.exit(0);
115
+ }
116
+
117
+ // Brand hook: mentura brand ... and mentura assets ... (Y-2..Y-4, J-2..J-4, T-1, T-2, P-24, P-26) live in interface/brand.mjs.
118
+ if (cmd === "brand" || cmd === "assets") process.exit(await (await import("../brand.mjs")).main(argv, { workspace }));
119
+
120
+ if (cmd === "add") {
121
+ // Imports one function into a venture (EE-047, EE-048, EE-071). department is the alias for function for one release.
122
+ const v = opt("venture");
123
+ if (!action || !v) usage();
124
+ const p = spawnSync("node", [join(repo, "schema/add-department.mjs"), ventureDir(v, workspace), action, ...(flag("group") ? ["--group"] : [])], { stdio: "inherit" });
125
+ process.exit(p.status ?? 1);
126
+ }
127
+
128
+ if (cmd === "typegen") {
129
+ const p = spawnSync("node", [join(repo, "interface/cli/naive.mjs"), "typegen"], { stdio: "inherit" });
130
+ process.exit(p.status ?? 1);
131
+ }
132
+
133
+ // Upgrades hook (M-12, E-7, V-9, Z-4): these commands live in their own modules; this only dispatches.
134
+ // mentura triggers --venture <id> [--fire] [--json]
135
+ // the venture's triggers, their runs and open failures; --fire runs what new events start
136
+ // mentura stale --venture <id> [--json] summaries whose system of record changed since they were written
137
+ // mentura notify --venture <id> --source <id> --path <p> [--version <v>]
138
+ // a system of record says <p> changed: mark what reads it stale (a webhook does this on Mentura)
139
+ // mentura adapt <adapter> --venture <id> write a harness's entry files into the venture (claude-code, codex, cursor)
140
+ // mentura adapters [verify [<adapter>]] [--json] the adapters, or run the framework's tests an adapter must pass
141
+ if (["triggers", "stale", "notify", "adapt", "adapters"].includes(cmd)) {
142
+ const d = ["triggers", "stale", "notify", "adapt"].includes(cmd) ? (opt("venture") ? ventureDir(opt("venture"), workspace) : null) : null;
143
+ if (cmd !== "adapters" && !d) { console.error(opt("venture") ? `no venture ${opt("venture")}` : `mentura ${cmd} needs --venture <id>`); process.exit(2); }
144
+ const pass = (...names) => names.flatMap((n) => argv.flatMap((a, i) => (a === `--${n}` ? [a, ...(argv[i + 1] && !argv[i + 1].startsWith("--") ? [argv[i + 1]] : [])] : [])));
145
+ const args = cmd === "triggers" ? ["schema/triggers.mjs", d, ...pass("fire", "json")]
146
+ : cmd === "stale" ? ["schema/stale.mjs", d, ...pass("json")]
147
+ : cmd === "notify" ? ["schema/stale.mjs", d, "--notify", ...pass("source", "path", "version", "json")]
148
+ : cmd === "adapt" ? ["interface/adapters.mjs", "adapt", action ?? "", d, ...pass("json")]
149
+ : ["interface/adapters.mjs", ...positional.slice(1), ...pass("json")];
150
+ const p = spawnSync("node", [join(repo, args[0]), ...args.slice(1)], { stdio: "inherit" });
151
+ process.exit(p.status ?? 1);
152
+ }
153
+
154
+ if (cmd === "migrate" && (opt("from") || flag("apply"))) {
155
+ // migrate means rewriting an outside project into a new venture (EE-076): the same as naive migrate.
156
+ const v = opt("venture");
157
+ const d = v && (existsSync(join(resolve(v), "venture.json")) ? resolve(v) : ventureDir(v, workspace));
158
+ if (!d) usage();
159
+ const p = spawnSync("node", [join(repo, "schema/migrate-venture.mjs"), "--venture", d, ...(opt("from") ? ["--from", opt("from")] : ["--apply"])], { stdio: "inherit" });
160
+ process.exit(p.status ?? 1);
161
+ }
162
+
163
+ if (cmd === "upgrade" || cmd === "migrate") {
164
+ // migrate without --from is the old name of upgrade: for one release it still runs upgrade, with a notice.
165
+ if (cmd === "migrate") console.error("mentura migrate --venture <id> is now naive upgrade (EE-076); migrate --from <project> rewrites an outside project into Naive");
166
+ const v = opt("venture");
167
+ const d = v && ventureDir(v, workspace);
168
+ if (!d) usage();
169
+ const p = spawnSync("node", [join(repo, "schema/upgrade-venture.mjs"), d], { stdio: "inherit" });
170
+ process.exit(p.status ?? 1);
171
+ }
172
+
173
+ // Model steps hook (use model, EE-073): mentura steps <payload|run|check|waterfall|provenance|confirm> --venture <id> [...].
174
+ // The logic is schema/model-steps.mjs; this passes the venture folder and the other arguments through.
175
+ if (cmd === "steps") {
176
+ const v = opt("venture"), d = v && ventureDir(v, workspace);
177
+ if (!d || !action) usage();
178
+ const pass = argv.slice(argv.indexOf("steps") + 1).filter((a, i, all) => !["--venture", "--workspace"].includes(a) && !["--venture", "--workspace"].includes(all[i - 1]));
179
+ const p = spawnSync("node", [join(repo, "schema/model-steps.mjs"), d, ...pass], { stdio: "inherit" });
180
+ process.exit(p.status ?? 1);
181
+ }
182
+
183
+ if (cmd === "init") {
184
+ // The venture scaffold lives in schema/init-venture.mjs; this passes the options through.
185
+ const id = opt("id");
186
+ if (!action || !id) usage();
187
+ const pass = ["phase", "parent", "legal-form", "layers"].flatMap((k) => opt(k) !== undefined ? [`--${k}`, opt(k)] : []);
188
+ const p = spawnSync("node", [join(repo, "schema/init-venture.mjs"), resolve(action), id, ...pass], { stdio: "inherit" });
189
+ process.exit(p.status ?? 1);
190
+ }
191
+
192
+ if (cmd === "accept") {
193
+ // The person at the keyboard accepts a draft: it is checked again and moved into place. The CLI
194
+ // cannot tell a person from an agent running it, so the repository's review (a pull request a
195
+ // person merges) remains the gate that holds; this makes the person's step explicit.
196
+ const venture = opt("venture"), rt = action;
197
+ if (!venture || !rt) usage();
198
+ const d = draftOf(rt, venture, workspace);
199
+ // Any held draft can be accepted: one gated by its decision class, held by an open decision, or held by
200
+ // the venture's naive.config.json gate.
201
+ if (!d) { console.error(`${rt} is not a record route, or no venture ${venture}`); process.exit(1); }
202
+ const draft = join(d.dir, d.draft);
203
+ if (!existsSync(draft)) { console.error(`no draft of ${d.route} in ${venture}`); process.exit(1); }
204
+ // Gate group hook (X-2): drafts kept side by side are accepted one at a time with --pick <letter>.
205
+ let chosen;
206
+ try { chosen = pickDraft(d.dir, d.draft, opt("pick")); } catch (e) { console.error(e.message); process.exit(1); }
207
+ const chosenFile = join(d.dir, chosen);
208
+ const recType = routes().find((x) => x.route === d.route || x.route === d.route.replace(/[^/]+$/, "[id]"))?.record;
209
+ const touched = foundationOf(recType);
210
+ if (touched.length) {
211
+ const get = (o, p) => p.split(".").reduce((x, k) => (x == null ? undefined : x[k]), o);
212
+ const now = existsSync(join(d.dir, d.file)) ? JSON.parse(readFileSync(join(d.dir, d.file), "utf8")) : {};
213
+ const next = JSON.parse(readFileSync(chosenFile, "utf8"));
214
+ const diff = touched.map((s) => ` ${s.id}:\n now: ${JSON.stringify(get(now, s.attribute) ?? null)}\n draft: ${JSON.stringify(get(next, s.attribute) ?? null)}`).join("\n");
215
+ const names = new Set([d.route, rt]);
216
+ const confirmed = opt("confirm") !== undefined ? names.has(opt("confirm")) : await typed(d.route, `Accepting ${d.route} changes these foundation statements:\n${diff}`);
217
+ if (!confirmed) { console.error("not accepted: the confirmation did not match"); process.exit(1); }
218
+ }
219
+ const w = await call({ venture, route: d.route, action: "write", input: JSON.parse(readFileSync(chosenFile, "utf8")), actor: "person", workspace, via: "cli",
220
+ provenance: { activity: "accept", derived_from: [chosen], note: opt("note") } });
221
+ if (!w.ok) { console.error(w.error); process.exit(1); }
222
+ // Gate group hook (X-2): removes the draft, its variants and sidecar, and decides the variants decision.
223
+ const settled = settleDraft(d.dir, d.draft, { picked: opt("pick") ?? "a", by: opt("by") });
224
+ out(`accepted: ${w.result.written}${settled.decision ? ` (draft ${settled.picked}; decision ${settled.decision} ${settled.decided ? "decided" : `not decided: ${settled.error}`})` : ""}`);
225
+ process.exit(0);
226
+ }
227
+
228
+ if (cmd === "decide") {
229
+ // A person makes a decision (EE-058): approves the drafted wording, or gives their own with
230
+ // --answer. Typing the decision's id confirms it. Provenance records who, when and in which phase.
231
+ const venture = opt("venture"), id = action;
232
+ const dir = venture && ventureDir(venture, workspace);
233
+ if (!dir || !id) usage();
234
+ const d = decisions(dir).decisions.find((x) => x.id === id);
235
+ if (!d || d.source !== "file") { console.error(`no decision record ${id} in ${venture}`); process.exit(1); }
236
+ if (!(await typed(id, `Deciding ${id}: ${d.question}\n ${opt("answer") ? "your answer" : "drafted wording"}: ${opt("answer") ?? d.answer ?? "(none)"}`, "This is a decision: it unlocks what waits on it."))) { console.error("not decided: the confirmation did not match"); process.exit(1); }
237
+ const r = approve(dir, id, { by: opt("by") ?? process.env.MENTURA_PERSON, answer: opt("answer"), note: opt("note") });
238
+ if (!r.ok) { console.error(r.error); process.exit(1); }
239
+ out(r.result);
240
+ process.exit(0);
241
+ }
242
+
243
+ if (cmd === "propose") {
244
+ // An agent proposes a decision from a JSON file; it stays open until a person decides it.
245
+ const venture = opt("venture"), dir = venture && ventureDir(venture, workspace);
246
+ if (!dir || !opt("input")) usage();
247
+ const r = propose(dir, JSON.parse(readFileSync(resolve(opt("input")), "utf8")), { agentId: opt("as") ?? process.env.MENTURA_ACTOR_ID, via: "cli" });
248
+ if (!r.ok) { console.error(r.error); process.exit(1); }
249
+ out(r.result);
250
+ process.exit(0);
251
+ }
252
+
253
+ if (cmd === "understand") {
254
+ // The Understand gate (EE-069): the founder has looked over the map and the graph, corrected what
255
+ // Mentura got wrong, and confirms the understanding before the ideas are routed.
256
+ const venture = opt("venture"), dir = venture && ventureDir(venture, workspace);
257
+ if (!dir) usage();
258
+ const hits = ["purpose/ideas/map.mdx", "purpose/ideas/graph.json"].filter((f) => existsSync(join(dir, f)));
259
+ if (!hits.length) { console.error(`${venture} has no idea map yet: map the idea dump first (purpose/ideas)`); process.exit(1); }
260
+ if (!(await typed("ideas", `Confirming Mentura's understanding of your ideas: ${hits.join(", ")}`, "Your ideas are routed to their records from this understanding."))) { console.error("not confirmed: the confirmation did not match"); process.exit(1); }
261
+ for (const f of hits) record(dir, { entity: f, route: f.endsWith(".mdx") ? "purpose/ideas" : "purpose/ideas/graph", activity: "confirm", statement: "ideas", agent: agentFromEnv("person", "cli"), note: opt("note") });
262
+ out("confirmed: ideas");
263
+ process.exit(0);
264
+ }
265
+
266
+ if (cmd === "confirm") {
267
+ // A person confirms a foundation statement an agent wrote as their own; the content is unchanged.
268
+ const venture = opt("venture"), id = action;
269
+ const dir = venture && ventureDir(venture, workspace);
270
+ if (!dir || !id) usage();
271
+ const s = FRAME.questions.flatMap((q) => q.statements).find((x) => x.id === id);
272
+ if (!s?.record) { console.error(`${id} is not a foundation statement with a record (see mentura purpose/foundation run)`); process.exit(1); }
273
+ const rt = routes().find((x) => x.record === s.record && x.collection !== "list")?.route ?? s.record;
274
+ const hits = filesOf(dir, s.record).filter((f) => existsSync(join(dir, f)));
275
+ if (!hits.length) { console.error(`${venture} has no ${s.record} record to confirm`); process.exit(1); }
276
+ const get = (o, p) => p.split(".").reduce((x, k) => (x == null ? undefined : x[k]), o);
277
+ const shown = hits.map((f) => ` ${f}: ${JSON.stringify(get(JSON.parse(readFileSync(join(dir, f), "utf8")), s.attribute) ?? null)}`).join("\n");
278
+ if (!(await typed(id, `Confirming ${id} as yours:\n${shown}`))) { console.error("not confirmed: the confirmation did not match"); process.exit(1); }
279
+ for (const f of hits) record(dir, { entity: f, route: rt, activity: "confirm", statement: id, agent: agentFromEnv("person", "cli"), note: opt("note") });
280
+ out(`confirmed: ${id}`);
281
+ process.exit(0);
282
+ }
283
+
284
+ if (cmd === "baseline") {
285
+ // A venture that existed before the log: record each record file as it is now, once, so later
286
+ // writes have a starting point. Files already in the log are left alone.
287
+ const venture = opt("venture");
288
+ const dir = venture && ventureDir(venture, workspace);
289
+ if (!dir) usage();
290
+ const logged = new Set(entries(dir).map((e) => e.entity));
291
+ const globs = routes().filter((r) => r.kind === "record" && r.form === "json" && r.collection !== "list").flatMap((r) => r.files.map((g) => [r.route, g]));
292
+ const routeOf = (rt, g, f) => rt.endsWith("/[id]") ? rt.replace("[id]", f.match(new RegExp("^" + g.split("*").map((x) => x.replace(/[.+^${}()|[\]\\]/g, "\\$&")).join("([^/]*)") + "$"))[1]) : rt;
293
+ let n = 0;
294
+ for (const f of files(dir).filter((f) => !f.startsWith("_drafts/"))) {
295
+ const hit = globs.find(([, g]) => glob(g).test(f));
296
+ if (!hit || logged.has(f)) continue;
297
+ record(dir, { entity: f, route: routeOf(hit[0], hit[1], f), activity: "baseline", agent: agentFromEnv(opt("as") === "person" ? "person" : "agent", "cli"), note: "existed before the provenance log; its history before this is in git" });
298
+ n++;
299
+ }
300
+ out(`baseline: ${n} records added to ${venture}'s provenance log`);
301
+ process.exit(0);
302
+ }
303
+
304
+ // Freshness (Revalidating, V-1 to V-8): revalidate, verify, phase and freshness live in ./freshness.mjs.
305
+ if (["revalidate", "verify", "phase", "freshness"].includes(cmd)) process.exit(await (await import("./freshness.mjs")).main(cmd, argv, workspace));
306
+
307
+ // Context hook (interface/context.mjs): navigate and head read a route header first, with its layout once per
308
+ // session (--session), its template and prefetched refs (--task, --prefetch, --no-prefetch, --stream); batch runs
309
+ // a list of calls with progress.
310
+ if (["navigate", "head"].includes(action) || cmd === "batch") { const { cli } = await import("../context.mjs"); process.exit(await cli(argv, { workspace })); }
311
+ if (!action) usage();
312
+ const venture = opt("venture");
313
+ if (!venture && !["template", "layout"].includes(action)) usage();
314
+ let input;
315
+ const src = opt("input");
316
+ if (src) input = JSON.parse(src === "-" ? readFileSync(0, "utf8") : readFileSync(src, "utf8"));
317
+ if (opt("value")) input = { ...(input ?? {}), value: Number.isNaN(Number(opt("value"))) ? opt("value") : Number(opt("value")) };
318
+ if (flag("as-is")) input = { ...(input ?? {}), as_is: true };
319
+ // wf/writes hook: --where k=v[,k=v] filters a read (L-10); --hierarchy returns its resolution levels (P-28).
320
+ if (["read", "view"].includes(action) && opt("where")) input = { ...(input ?? {}), where: Object.fromEntries(opt("where").split(",").map((kv) => kv.split("=")).map(([k, ...v]) => [k, v.join("=").includes("|") ? v.join("=").split("|") : v.join("=")])) };
321
+ if (["read", "view"].includes(action) && flag("hierarchy")) input = { ...(input ?? {}), hierarchy: true };
322
+ const provenance = { derived_from: opt("derived-from")?.split(",").filter(Boolean), decision: opt("decision"), note: opt("note") };
323
+ // Gate group hook (X-4): a confidence score computed before the write, for the gate's confidence rules.
324
+ if (opt("confidence") !== undefined) provenance.confidence = Number(opt("confidence"));
325
+ let r = await call({ venture, route: cmd, action, input, actor: opt("as") === "person" ? "person" : "agent", workspace, via: "cli", provenance });
326
+ // Asks before running (EE-050): at a terminal, the person chooses; otherwise it prints both choices.
327
+ if (r.ok && r.needs_input && !flag("json")) {
328
+ const n = r.needs_input;
329
+ console.log(`${n.ask}\n${n.missing.map((m) => ` - ${m.field}${m.items ? ` (${m.items.join(", ")})` : ""}: ${m.why}. As is: ${m.as_is}`).join("\n")}`);
330
+ if (!process.stdin.isTTY) { console.log(`Fill in: ${n.options[0].how}\nRun as is: ${n.options[1].how}`); process.exit(0); }
331
+ const { createInterface } = await import("node:readline/promises");
332
+ const rl = createInterface({ input: process.stdin, output: process.stdout });
333
+ const a = (await rl.question("Fill in (f) or run as is (r)? ")).trim().toLowerCase();
334
+ rl.close();
335
+ if (!a.startsWith("r")) { console.log(`Fill in: ${n.options[0].how}`); process.exit(0); }
336
+ r = await call({ venture, route: cmd, action, input: { ...(input ?? {}), as_is: true }, actor: opt("as") === "person" ? "person" : "agent", workspace, via: "cli", provenance });
337
+ }
338
+ if (!r.ok) { console.error(r.error ?? JSON.stringify(r.result, null, 2)); process.exit(1); }
339
+ if (r.deprecated) console.error(`note: ${r.deprecated}`);
340
+ const extra = ["not_found", "pending_draft", "fix", "needs_input", "errors", "filtered_out", "hierarchy", "stale"].some((k) => r[k]); // stale: V-9 (schema/stale.mjs)
341
+ out(flag("json") || extra ? r : r.result);
@@ -0,0 +1,194 @@
1
+ #!/usr/bin/env node
2
+ // The framework CLI (EE-072), the way `next` is Next.js's: run it inside a venture and it finds the
3
+ // venture.json in the current directory or its parents. mentura stays for platform commands and as an
4
+ // alias, so `mentura typegen` and `mentura upgrade` run these same commands.
5
+ //
6
+ // naive dev [--port 4331] the setup page at /setup and the board, live: edit a record and it updates; each saved
7
+ // record is checked against its schema as you go (I-17, I-24)
8
+ // naive build check every package and write a release (I-17)
9
+ // naive start serve the latest release read-only (I-17)
10
+ // naive check run every check that applies to the venture (I-9)
11
+ // naive info versions, the venture, and which agents are connected (I-6)
12
+ // naive mcp serve the venture to an agent over MCP (stdio)
13
+ // naive setup [state|artifact|answer|point|confirm] set the venture up: the state, an artifact of it, and
14
+ // confirming the answers the model relayed (EE-083)
15
+ // naive frame "<the founder's words>" match the words to a frame in the decision library, judge its
16
+ // premises against the venture and propose its decisions, open
17
+ // naive typegen write .naive/types/ from the route table and the MCP tools
18
+ // naive upgrade [<venture dir>] [--framework] move a venture onto the next Naive layout; --framework first
19
+ // updates the installed framework with the venture's package manager (I-29)
20
+ // naive port --from <project> --venture <dir> plan bringing a project in with its files as they are
21
+ // naive port --venture <dir> --apply --confirm port
22
+ // carry out that plan (EE-076)
23
+ // naive migrate --from <project> --venture <dir> an agent rewrites the project as Naive records, as a plan and decisions
24
+ // naive migrate --venture <dir> --apply write what a person decided (EE-076)
25
+ //
26
+ // --venture <dir> names the venture when you are not inside it.
27
+
28
+ import { spawnSync } from "node:child_process";
29
+ import { existsSync, mkdirSync, readFileSync, watch, writeFileSync } from "node:fs";
30
+ import { createServer } from "node:net";
31
+ import { basename, join, relative, resolve } from "node:path";
32
+ import { asRouted, findVenture } from "./find-venture.mjs";
33
+
34
+ const repo = new URL("../..", import.meta.url).pathname;
35
+ const [cmd, ...rest] = process.argv.slice(2);
36
+ const opt = (n) => { const i = rest.indexOf(`--${n}`); return i >= 0 ? rest[i + 1] : undefined; };
37
+ const run = (script, args, opts = {}) => spawnSync("node", [join(repo, script), ...args], { stdio: "inherit", ...opts }).status ?? 1;
38
+ const version = () => JSON.parse(readFileSync(join(repo, "package.json"), "utf8")).version;
39
+
40
+ // The venture: --venture <dir>, else the one this command runs inside.
41
+ function here() {
42
+ const named = opt("venture");
43
+ const dir = named ? (existsSync(join(resolve(named), "venture.json")) ? resolve(named) : null) : findVenture();
44
+ if (!dir) {
45
+ console.error(named ? `${named} has no venture.json` : `no venture here: run naive ${cmd} inside a venture (a directory with venture.json), or pass --venture <dir>`);
46
+ process.exit(1);
47
+ }
48
+ return dir;
49
+ }
50
+
51
+ // A port that is free, starting at the one asked for, the way next dev moves on from 3000.
52
+ const free = (p) => new Promise((ok) => { const s = createServer().once("error", () => ok(free(p + 1))).once("listening", () => s.close(() => ok(p))).listen(p, "127.0.0.1"); });
53
+
54
+ // The schema a venture file is checked against, from the route table (records only).
55
+ async function schemaFor(file) {
56
+ const { glob, routes } = await import("../router.mjs");
57
+ return routes().find((r) => r.kind === "record" && r.schema && (r.files ?? []).some((g) => glob(g).test(file)))?.schema ?? null;
58
+ }
59
+
60
+ async function dev(dir) {
61
+ // The root layout is required (I-21): a venture without AGENTS.md gets a stub, as next dev writes a root layout.
62
+ if (!existsSync(join(dir, "AGENTS.md"))) {
63
+ writeFileSync(join(dir, "AGENTS.md"), `# AGENTS.md: ${basename(dir)}\n\nThe map of this venture for agents. Read it, then a route's layout, before writing anything here.\n\n## Instructions\n\nphase: ${JSON.parse(readFileSync(join(dir, "venture.json"), "utf8")).phase}\nprivate: _private/\n`);
64
+ console.log(" wrote AGENTS.md, the venture's root layout, because it was missing");
65
+ }
66
+ const { workspace, venture } = asRouted(dir);
67
+ process.env.MENTURA_WORKSPACE = workspace;
68
+ const port = await free(Number(opt("port") ?? 4331));
69
+ // One origin: /setup is the setup page (interface/dev/setup.mjs); everything else is the board, served
70
+ // on a port of its own and passed through.
71
+ const { serve } = await import("../demo/board.mjs");
72
+ const { handle } = await import("../dev/setup.mjs");
73
+ const boardPort = await free(port + 1000);
74
+ serve(boardPort, venture);
75
+ const { createServer: http, request } = await import("node:http");
76
+ http(async (req, res) => {
77
+ if (await handle(req, res, dir)) return;
78
+ const up = request({ host: "127.0.0.1", port: boardPort, path: req.url, method: req.method, headers: req.headers }, (r) => { res.writeHead(r.statusCode, r.headers); r.pipe(res); });
79
+ up.on("error", (e) => { res.writeHead(502); res.end(String(e.message)); });
80
+ req.pipe(up);
81
+ }).listen(port, "127.0.0.1");
82
+ const name = JSON.parse(readFileSync(join(dir, "venture.json"), "utf8")).name ?? venture;
83
+ console.log(`\n ▲ Naive ${version()}\n - Venture: ${name} (${relative(process.cwd(), dir) || "."})\n - Setup: http://127.0.0.1:${port}/setup\n - Board: http://127.0.0.1:${port}/\n - Map: http://127.0.0.1:${port}/map\n\n Watching for changes. Each saved record is checked against its schema. Ctrl-C to stop.\n`);
84
+ // Live feedback on save (I-24): a record that no longer matches its schema says so at once.
85
+ const pending = new Map();
86
+ watch(dir, { recursive: true }, (_, f) => {
87
+ if (!f || !f.endsWith(".json") || f.startsWith("node_modules") || f.startsWith(".naive") || f.startsWith("_private")) return;
88
+ clearTimeout(pending.get(f));
89
+ pending.set(f, setTimeout(async () => {
90
+ pending.delete(f);
91
+ if (!existsSync(join(dir, f))) return;
92
+ const schema = await schemaFor(f);
93
+ if (!schema) return;
94
+ const v = spawnSync("python3", [join(repo, "schema/validate.py"), "--schema", schema.replace(/^schema\//, ""), "--file", join(dir, f)], { encoding: "utf8" });
95
+ const out = (v.stdout + v.stderr).trim();
96
+ if (v.status === 0) console.log(` ✓ ${f}`);
97
+ else if (/needs jsonschema/.test(out)) console.log(` - ${f} changed (install python3's jsonschema package to check it as you save)`);
98
+ else console.log(` ✗ ${f} does not match ${schema}\n${out.split("\n").map((l) => ` ${l}`).join("\n")}`);
99
+ }, 150));
100
+ });
101
+ }
102
+
103
+ // The checks that read a workspace, run on this venture: it and the ventures nested in it, not its neighbours.
104
+ const CHECKS = ["check-ventures", "check-people", "check-provenance", "check-sources", "check-data-packages", "check-governance", "check-telos", "check-publication", "check-private", "check-where-used"];
105
+ function check(dir) {
106
+ let failed = 0;
107
+ for (const c of CHECKS) {
108
+ const r = spawnSync("node", [join(repo, `schema/${c}.mjs`), dir], { encoding: "utf8" });
109
+ const last = (r.stdout + r.stderr).trim().split("\n").filter(Boolean).at(-1) ?? "";
110
+ if (r.status !== 0) failed++;
111
+ console.log(`${r.status === 0 ? "pass" : "FAIL"} ${c.replace("check-", "")}: ${last}`);
112
+ if (r.status !== 0) console.log((r.stdout + r.stderr).trim().split("\n").slice(0, 12).map((l) => ` ${l}`).join("\n"));
113
+ }
114
+ console.log(failed ? `\n${failed} failing` : "\nall passing");
115
+ return failed ? 1 : 0;
116
+ }
117
+
118
+ function info(dir) {
119
+ const v = dir && JSON.parse(readFileSync(join(dir, "venture.json"), "utf8"));
120
+ // Supported agents (I-6): the MCP clients Naive is tested with, and whether this venture is connected to each.
121
+ const agents = [
122
+ ["Claude Code", ".mcp.json", (j) => j?.mcpServers?.naive || j?.mcpServers?.mentura],
123
+ ["Cursor", ".cursor/mcp.json", (j) => j?.mcpServers?.naive || j?.mcpServers?.mentura],
124
+ ];
125
+ const read = (f) => { try { return JSON.parse(readFileSync(f, "utf8")); } catch { return null; } };
126
+ const lines = [
127
+ `Naive ${version()} (${repo.replace(/\/$/, "")})`,
128
+ `Node ${process.version}`,
129
+ `Platform ${process.platform} ${process.arch}`,
130
+ `python3 ${spawnSync("python3", ["-c", "import jsonschema; print('jsonschema ' + __import__('importlib.metadata').metadata.version('jsonschema'))"], { encoding: "utf8" }).stdout.trim() || "jsonschema missing (needed by schema checks)"}`,
131
+ `Venture ${v ? `${v.name ?? v.id} (${v.phase}) at ${dir}` : "none here"}`,
132
+ "Agents " + agents.map(([name, f, ok]) => `${name}: ${dir && ok(read(join(dir, f))) ? "connected" : "not connected"}`).join(", "),
133
+ ];
134
+ console.log(lines.join("\n"));
135
+ }
136
+
137
+ function upgradeFramework(dir) {
138
+ const pkg = join(dir, "package.json");
139
+ const deps = existsSync(pkg) ? { ...JSON.parse(readFileSync(pkg, "utf8")).devDependencies, ...JSON.parse(readFileSync(pkg, "utf8")).dependencies } : {};
140
+ const name = Object.keys(deps).find((d) => d === "naive-framework");
141
+ if (!name) { console.error("this venture does not install the framework from its package.json, so there is nothing to update; upgrading its layout only"); return 0; }
142
+ const pm = existsSync(join(dir, "pnpm-lock.yaml")) ? "pnpm" : existsSync(join(dir, "yarn.lock")) ? "yarn" : existsSync(join(dir, "bun.lockb")) || existsSync(join(dir, "bun.lock")) ? "bun" : "npm";
143
+ const spec = deps[name].startsWith("file:") || deps[name].startsWith("github:") ? deps[name] : `${name}@latest`;
144
+ const args = pm === "npm" ? ["install", "--save-dev", spec] : pm === "yarn" ? ["add", "--dev", spec] : ["add", "-D", spec];
145
+ console.log(`updating the framework: ${pm} ${args.join(" ")}`);
146
+ return spawnSync(pm, args, { cwd: dir, stdio: "inherit" }).status ?? 1;
147
+ }
148
+
149
+ if (cmd === "dev") await dev(here());
150
+ else if (cmd === "check") process.exit(check(here()));
151
+ else if (cmd === "mcp") {
152
+ // The MCP server, on the venture this runs in: `claude mcp add naive -- npx naive mcp`.
153
+ const env = { ...process.env };
154
+ if (!env.MENTURA_WORKSPACE) env.MENTURA_WORKSPACE = asRouted(here()).workspace;
155
+ process.exit(spawnSync("node", [join(repo, "interface/mcp/server.mjs")], { stdio: "inherit", env }).status ?? 1);
156
+ }
157
+ else if (cmd === "info") info(findVenture() ?? (opt("venture") && existsSync(join(resolve(opt("venture")), "venture.json")) ? resolve(opt("venture")) : null));
158
+ else if (cmd === "build" || cmd === "start") {
159
+ // The release itself is written and served by schema/build-release.mjs and schema/start-release.mjs.
160
+ const script = `schema/${cmd}-release.mjs`;
161
+ if (!existsSync(join(repo, script))) { console.error(`naive ${cmd} runs ${script}, which this version of Naive does not have yet`); process.exit(1); }
162
+ process.exit(run(script, [here(), ...rest.filter((a, i) => a !== "--venture" && rest[i - 1] !== "--venture")]));
163
+ } else if (cmd === "upgrade") {
164
+ // Outside a venture with none named, upgrade-venture.mjs prints its usage.
165
+ const dir = rest[0] && !rest[0].startsWith("--") ? resolve(rest[0]) : (opt("venture") ? here() : findVenture());
166
+ if (dir && rest.includes("--framework") && upgradeFramework(dir) !== 0) process.exit(1);
167
+ // Flags (--check, --guide, --adopt, --canary, --agent, --accept, --confirm) pass through to upgrade-venture.mjs; --framework and --venture are handled here.
168
+ const flags = rest.filter((a, i) => !(i === 0 && !a.startsWith("--")) && a !== "--framework" && a !== "--venture" && rest[i - 1] !== "--venture");
169
+ process.exit(run("schema/upgrade-venture.mjs", dir ? [dir, ...flags] : flags));
170
+ } else if (cmd === "frame") {
171
+ // The decision library (schema/frames.mjs): naive frame "<the founder's words>" runs the frame those words fit.
172
+ const sub = rest[0];
173
+ if (["list", "match", "check", "eval"].includes(sub)) process.exit(run("schema/frames.mjs", rest));
174
+ const words = rest.filter((a, i) => a !== "--venture" && rest[i - 1] !== "--venture" && a !== "--frame" && rest[i - 1] !== "--frame" && a !== "--lookup" && rest[i - 1] !== "--lookup").join(" ");
175
+ process.exit(run("schema/frames.mjs", ["run", here(), ...(opt("frame") ? [opt("frame")] : []), ...(words ? ["--text", words] : []), ...(opt("lookup") ? ["--lookup", opt("lookup")] : [])]));
176
+ } else if (cmd === "setup") {
177
+ // Setup in the model's harness (EE-083): the state, the artifact, and the founder confirming relayed answers.
178
+ process.exit(run("schema/setup.mjs", [here(), ...(rest.length ? rest.filter((a, i) => a !== "--venture" && rest[i - 1] !== "--venture") : ["state"])]));
179
+ } else if (cmd === "port" || cmd === "migrate") {
180
+ // Inside a venture, --venture defaults to it.
181
+ const args = rest.includes("--venture") ? rest : [...rest, "--venture", here()];
182
+ process.exit(run(`schema/${cmd}-venture.mjs`, args));
183
+ } else if (cmd === "typegen") {
184
+ const { TOOLS } = await import("../mcp/server.mjs");
185
+ const { routes } = await import("../router.mjs");
186
+ const out = join(repo, ".naive/types");
187
+ mkdirSync(out, { recursive: true });
188
+ writeFileSync(join(out, "tools.json"), JSON.stringify(TOOLS, null, 2) + "\n");
189
+ writeFileSync(join(out, "routes.json"), JSON.stringify(routes().map((r) => ({ route: r.route, actions: r.actions, kind: r.kind })), null, 2) + "\n");
190
+ console.log(`wrote ${out}`);
191
+ } else {
192
+ console.error(readFileSync(new URL(import.meta.url), "utf8").split("\n").filter((l) => l.startsWith("// ")).map((l) => l.slice(5)).join("\n"));
193
+ process.exit(cmd ? 1 : 2);
194
+ }