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,232 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "marketing-sitemap.schema.json",
4
+ "title": "Marketing sitemap",
5
+ "description": "The planned public site (EE-064): which information is shown where, how (the MDX component), when and for whom, with the reasons, planned from the venture's records by operations/marketing/site/plan.mjs. A marketing record, part of the marketing package handed to engineering (EE-065). Version 0.x, unevaluated.",
6
+ "type": "object",
7
+ "required": [
8
+ "version",
9
+ "venture",
10
+ "facts",
11
+ "offerings",
12
+ "audience",
13
+ "pages",
14
+ "omitted",
15
+ "handoff"
16
+ ],
17
+ "properties": {
18
+ "version": {
19
+ "type": "string"
20
+ },
21
+ "venture": {
22
+ "type": "string"
23
+ },
24
+ "name": {
25
+ "type": "string"
26
+ },
27
+ "phase": {
28
+ "type": "string"
29
+ },
30
+ "planned_at": {
31
+ "type": "string"
32
+ },
33
+ "planned_by": {
34
+ "enum": [
35
+ "jev",
36
+ "conventions"
37
+ ]
38
+ },
39
+ "facts": {
40
+ "type": "object"
41
+ },
42
+ "offerings": {
43
+ "type": "array",
44
+ "items": {
45
+ "type": "object",
46
+ "required": [
47
+ "id",
48
+ "offering",
49
+ "offered_to"
50
+ ],
51
+ "properties": {
52
+ "id": {
53
+ "type": "string"
54
+ },
55
+ "name": {
56
+ "type": "string"
57
+ },
58
+ "offering": {
59
+ "enum": [
60
+ "product",
61
+ "service",
62
+ "platform",
63
+ "content",
64
+ "marketplace"
65
+ ]
66
+ },
67
+ "status": {
68
+ "type": [
69
+ "string",
70
+ "null"
71
+ ]
72
+ },
73
+ "offered_to": {
74
+ "type": "array",
75
+ "items": {
76
+ "type": "string"
77
+ }
78
+ },
79
+ "serves": {
80
+ "type": "array",
81
+ "items": {
82
+ "type": "string"
83
+ }
84
+ },
85
+ "from": {
86
+ "type": "string"
87
+ }
88
+ }
89
+ }
90
+ },
91
+ "audience": {
92
+ "type": "object",
93
+ "required": [
94
+ "offered_to",
95
+ "partner_led",
96
+ "types"
97
+ ],
98
+ "properties": {
99
+ "offered_to": {
100
+ "type": "array"
101
+ },
102
+ "partner_led": {
103
+ "type": "boolean"
104
+ },
105
+ "types": {
106
+ "type": "array"
107
+ },
108
+ "weights": {
109
+ "type": "object"
110
+ },
111
+ "note": {
112
+ "type": "string"
113
+ }
114
+ }
115
+ },
116
+ "pages": {
117
+ "type": "array",
118
+ "items": {
119
+ "type": "object",
120
+ "required": [
121
+ "path",
122
+ "parent",
123
+ "label",
124
+ "type",
125
+ "level",
126
+ "sections"
127
+ ],
128
+ "properties": {
129
+ "path": {
130
+ "type": "string"
131
+ },
132
+ "parent": {
133
+ "type": [
134
+ "string",
135
+ "null"
136
+ ]
137
+ },
138
+ "label": {
139
+ "type": "string"
140
+ },
141
+ "type": {
142
+ "type": "string"
143
+ },
144
+ "level": {
145
+ "enum": [
146
+ "home",
147
+ "nav",
148
+ "linked",
149
+ "anywhere"
150
+ ]
151
+ },
152
+ "sections": {
153
+ "type": "array",
154
+ "items": {
155
+ "type": "object",
156
+ "required": [
157
+ "item",
158
+ "component",
159
+ "need",
160
+ "for",
161
+ "why",
162
+ "source",
163
+ "variant"
164
+ ],
165
+ "properties": {
166
+ "item": {
167
+ "type": "string"
168
+ },
169
+ "label": {
170
+ "type": "string"
171
+ },
172
+ "component": {
173
+ "type": "string"
174
+ },
175
+ "need": {
176
+ "type": "number"
177
+ },
178
+ "required": {
179
+ "type": "string"
180
+ },
181
+ "for": {
182
+ "type": "array",
183
+ "items": {
184
+ "type": "string"
185
+ }
186
+ },
187
+ "why": {
188
+ "type": "array",
189
+ "items": {
190
+ "type": "string"
191
+ }
192
+ },
193
+ "when": {
194
+ "type": "string"
195
+ },
196
+ "source": {
197
+ "type": "object"
198
+ },
199
+ "variant": {
200
+ "type": "string"
201
+ }
202
+ }
203
+ }
204
+ }
205
+ }
206
+ }
207
+ },
208
+ "omitted": {
209
+ "type": "array"
210
+ },
211
+ "handoff": {
212
+ "type": "object",
213
+ "required": [
214
+ "to"
215
+ ],
216
+ "properties": {
217
+ "to": {
218
+ "const": "engineering"
219
+ },
220
+ "note": {
221
+ "type": "string"
222
+ },
223
+ "variants": {
224
+ "type": "array",
225
+ "items": {
226
+ "type": "string"
227
+ }
228
+ }
229
+ }
230
+ }
231
+ }
232
+ }
@@ -0,0 +1,192 @@
1
+ #!/usr/bin/env node
2
+ // naive migrate: brings an existing project into a new venture by rewriting it into the Naive
3
+ // convention (EE-076). An agent reads the project's text and proposes records in the shape of
4
+ // Naive's own schemas; nothing lands until a person decides, one decision per function; then each
5
+ // record is written through the router, so its schema, gates and provenance all apply. Port (files
6
+ // kept as they are) is the other way in: schema/port-venture.mjs.
7
+ //
8
+ // node schema/migrate-venture.mjs --from <project> --venture <new venture dir>
9
+ // the agent writes the plan to <venture>/.release/migrate-plan.json and proposes the decisions
10
+ // node schema/migrate-venture.mjs --venture <dir> --apply
11
+ // writes what a person decided ("bring in", "point to them" or "leave them"); open decisions wait
12
+ //
13
+ // The project is only ever read, and the agent gets its text and no tools. Files that look like
14
+ // secrets are never opened. The agent is `claude -p` with no tools, or MENTURA_AGENT_CMD (a command
15
+ // that reads the prompt on stdin and prints the answer).
16
+
17
+ import { spawnSync } from "node:child_process";
18
+ import { existsSync, mkdirSync, readdirSync, readFileSync, statSync, writeFileSync } from "node:fs";
19
+ import { basename, dirname, join, relative, resolve, sep } from "node:path";
20
+ import { fileURLToPath } from "node:url";
21
+ import { call, routes } from "../interface/router.mjs";
22
+ import { agentFromEnv, record as prov } from "../interface/provenance.mjs";
23
+ import { propose } from "./decisions.mjs";
24
+
25
+ export const PLAN = ".release/migrate-plan.json";
26
+ const MAX_FILE = 512 * 1024;
27
+ const MAX_PROMPT = 200_000;
28
+ const SKIP = new Set(["node_modules", ".git", ".next", ".naive", "dist", "build", ".venv", "venv", "__pycache__"]);
29
+ // Never opened: credentials and keys, by name, whatever is in them.
30
+ export const SECRET = /(^|\/)(\.env(\..*)?|.*\.(pem|key|p12|pfx|secret)|id_rsa.*|id_ed25519.*|credentials(\.json)?|\.npmrc|\.netrc)$/i;
31
+ const ANSWERS = { bring: "bring in", point: "point to them", leave: "leave them" };
32
+ const load = (p) => JSON.parse(readFileSync(p, "utf8"));
33
+ const slug = (s) => s.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-|-$/g, "") || "project";
34
+ const functionOf = (route) => route.split("/")[0];
35
+
36
+ /** The project's readable text files; what it will not read is listed with why. */
37
+ export function scan(src) {
38
+ const files = [], skipped = [];
39
+ const walk = (rel) => {
40
+ for (const e of readdirSync(join(src, rel), { withFileTypes: true }).sort((a, b) => a.name.localeCompare(b.name))) {
41
+ const r = rel ? join(rel, e.name) : e.name;
42
+ if (e.isDirectory()) { if (!SKIP.has(e.name) && !e.name.startsWith(".")) walk(r); continue; }
43
+ if (!e.isFile()) continue;
44
+ if (SECRET.test(r)) { skipped.push({ from: r, why: "looks like a secret, so it was not opened" }); continue; }
45
+ if (e.name.startsWith(".")) continue;
46
+ if (statSync(join(src, r)).size > MAX_FILE) { skipped.push({ from: r, why: `larger than ${MAX_FILE / 1024} KB` }); continue; }
47
+ const buf = readFileSync(join(src, r));
48
+ if (buf.includes(0)) { skipped.push({ from: r, why: "not text, so the agent cannot read it" }); continue; }
49
+ files.push({ path: r, text: buf.toString("utf8") });
50
+ }
51
+ };
52
+ walk("");
53
+ return { files, skipped };
54
+ }
55
+
56
+ /** Runs the agent on a prompt and returns its text. A login problem or refusal is an error that says so. */
57
+ export function runAgent(prompt) {
58
+ const cmd = process.env.MENTURA_AGENT_CMD ? process.env.MENTURA_AGENT_CMD.split(" ") : ["claude", "-p", "--output-format", "json", "--tools", "", "--strict-mcp-config"];
59
+ const p = spawnSync(cmd[0], cmd.slice(1), { input: prompt, encoding: "utf8", maxBuffer: 1 << 26 });
60
+ if (p.error) throw new Error(`could not run the agent (${cmd[0]}): ${p.error.message}`);
61
+ let text = p.stdout;
62
+ try { const r = JSON.parse(p.stdout); if (r && typeof r.result === "string") { if (r.is_error) throw new Error(`the agent stopped: ${r.result}`); text = r.result; } }
63
+ catch (e) { if (e.message.startsWith("the agent stopped")) throw e; }
64
+ if (p.status !== 0) throw new Error(`the agent stopped with status ${p.status}: ${(p.stderr || text).trim().slice(0, 500)}${/login/i.test(p.stderr + text) ? " (run claude, then /login)" : ""}`);
65
+ return text;
66
+ }
67
+
68
+ // The routes a migrated record can be written to: JSON records the router can write.
69
+ const writable = () => routes().filter((r) => r.kind === "record" && r.record && r.actions.includes("write") && r.files?.some((g) => g.endsWith(".json")) && r.collection !== "list" && r.record !== "provenance");
70
+
71
+ /** The plan for migrating `from` into the venture at `dir`: the agent's records, checked against the routes. */
72
+ export function plan(from, dir, { agent = runAgent } = {}) {
73
+ const src = resolve(from);
74
+ if (!existsSync(src) || !statSync(src).isDirectory()) throw new Error(`${from} is not a directory`);
75
+ if (!existsSync(join(dir, "venture.json"))) throw new Error(`${dir} is not a venture: create one first with naive init`);
76
+ if (resolve(dir).startsWith(src + sep) || resolve(dir) === src) throw new Error("the venture cannot sit inside the project it migrates from");
77
+ const { files, skipped } = scan(src);
78
+ const left = [...skipped], given = [];
79
+ let size = 0;
80
+ for (const f of files) {
81
+ if (size + f.text.length > MAX_PROMPT) { left.push({ from: f.path, why: "past what one agent pass reads; migrate the rest in another pass" }); continue; }
82
+ size += f.text.length; given.push(f);
83
+ }
84
+ const rs = writable();
85
+ const schemaOf = (r) => { try { return load(join(dirname(fileURLToPath(import.meta.url)), "..", r.schema)); } catch { return null; } };
86
+ const prompt = `You are moving an existing project into Naive, a venture development framework. Read the files below and rewrite what they contain as Naive records.
87
+
88
+ Rules:
89
+ - Use only the routes listed, and make each record match its JSON schema exactly. For a route with [id], put the id in the route (product/kettle).
90
+ - Use only what the files say. Do not invent facts; leave out a field you cannot fill from them.
91
+ - One file can feed several records, and several files can feed one.
92
+ - Every file you do not use goes in left_behind, with why.
93
+ Answer with JSON only, no prose: {"items": [{"route": "...", "from": ["path", ...], "record": {...}, "reshaping": "what you changed and why", "confidence": 0.0-1.0}], "left_behind": [{"from": "path", "why": "..."}]}
94
+
95
+ Routes and schemas: ${JSON.stringify(rs.map((r) => ({ route: r.route, record: r.record, schema: schemaOf(r) })))}
96
+
97
+ Files: ${JSON.stringify(Object.fromEntries(given.map((f) => [f.path, f.text])))}`;
98
+ const text = agent(prompt);
99
+ const start = text.indexOf("{"), end = text.lastIndexOf("}");
100
+ if (start < 0) throw new Error(`the agent did not answer with JSON: ${text.trim().slice(0, 300)}`);
101
+ const answer = JSON.parse(text.slice(start, end + 1));
102
+ const known = new Map(rs.map((r) => [r.route, r]));
103
+ const items = [], used = new Set();
104
+ for (const it of answer.items ?? []) {
105
+ const base = it.route?.replace(/\/[a-z0-9-]+$/, "/[id]");
106
+ const r = known.get(it.route) ?? (known.get(base)?.collection === "item" ? known.get(base) : null);
107
+ const cited = (it.from ?? []).filter((p) => given.some((f) => f.path === p));
108
+ if (!r || !cited.length || typeof it.record !== "object") { left.push({ from: (it.from ?? []).join(", ") || "(none)", why: `the agent proposed ${it.route ?? "no route"}, which is not a record route or cites no file it was given` }); continue; }
109
+ cited.forEach((p) => used.add(p));
110
+ items.push({ id: `m-${items.length + 1}`, from: cited, route: it.route, record: it.record, reshaping: String(it.reshaping ?? ""), confidence: Number(it.confidence ?? 0.5), status: "planned" });
111
+ }
112
+ for (const l of answer.left_behind ?? []) if (l?.from) { used.add(l.from); left.push({ from: l.from, why: String(l.why ?? "the agent left it") }); }
113
+ for (const f of given) if (!used.has(f.path)) left.push({ from: f.path, why: "the agent did not place it" });
114
+ return { from: src, venture: load(join(dir, "venture.json")).id, at: new Date().toISOString(), items, left_behind: left };
115
+ }
116
+
117
+ /** Writes the plan into the venture and proposes one open decision per function it touches. */
118
+ export function proposeDecisions(dir, p) {
119
+ mkdirSync(join(dir, dirname(PLAN)), { recursive: true });
120
+ writeFileSync(join(dir, PLAN), JSON.stringify(p, null, 2) + "\n");
121
+ prov(dir, { entity: PLAN, activity: "draft", agent: agentFromEnv("agent", "migrate", { id: "naive-migrate" }), note: `migrate plan from ${p.from}: ${p.items.length} records, ${p.left_behind.length} left behind` });
122
+ const groups = new Map();
123
+ for (const it of p.items) groups.set(functionOf(it.route), [...(groups.get(functionOf(it.route)) ?? []), it]);
124
+ const proposed = [];
125
+ for (const [fn, its] of groups) {
126
+ const r = propose(dir, {
127
+ id: `migrate-${fn}`,
128
+ question: `Migrate ${its.length} record${its.length === 1 ? "" : "s"} from ${basename(p.from)} into ${fn}, as ${PLAN} plans them?`,
129
+ options: Object.values(ANSWERS), answer: ANSWERS.bring, decides: { path: PLAN },
130
+ note: its.map((it) => `${it.id}: ${it.from.join(", ")} -> ${it.route}`).join("; "),
131
+ }, { agentId: "naive-migrate", via: "migrate" });
132
+ if (!r.ok) throw new Error(r.error);
133
+ proposed.push(r.result.proposed);
134
+ }
135
+ return proposed;
136
+ }
137
+
138
+ const answerOf = (d) => { const a = String(d?.answer ?? "").toLowerCase(); return a.startsWith("point") ? "point" : a.startsWith("leave") ? "leave" : a.startsWith("bring") ? "bring" : null; };
139
+
140
+ /** Writes what a person decided, through the router. Open decisions wait. */
141
+ export async function apply(dir) {
142
+ const p = load(join(dir, PLAN));
143
+ const decisionOf = (fn) => { const f = join(dir, "decisions", `migrate-${fn}.decision.json`); return existsSync(f) ? load(f) : null; };
144
+ const done = { brought: 0, drafted: 0, pointed: 0, left: 0, waiting: 0, failed: 0 };
145
+ let pointed = false;
146
+ for (const it of p.items.filter((x) => x.status === "planned")) {
147
+ const d = decisionOf(functionOf(it.route));
148
+ if (d?.status !== "decided") { done.waiting++; continue; }
149
+ const a = answerOf(d);
150
+ if (a === "leave" || !a) { it.status = "left"; done.left++; continue; }
151
+ if (a === "point") { it.status = "pointed"; pointed = true; done.pointed++; continue; }
152
+ const r = await call({ workspace: dirname(dir), venture: basename(dir), route: it.route, action: "write", input: it.record, actor: "agent", actor_id: "naive-migrate", via: "migrate",
153
+ provenance: { note: `migrated from ${it.from.map((f) => join(p.from, f)).join(", ")}: ${it.reshaping}`, decision: d.id, derived_from: it.from.map((f) => `file://${join(p.from, f)}`) } });
154
+ if (!r.ok) { it.status = "failed"; it.why = r.error; done.failed++; continue; }
155
+ it.status = r.result?.draft ? "drafted" : "brought";
156
+ it.at = r.result?.draft ?? r.result?.written;
157
+ done[it.status]++;
158
+ }
159
+ if (pointed) {
160
+ const f = join(dir, "knowledge/sources.json");
161
+ const s = existsSync(f) ? load(f) : { sources: [], records: {} };
162
+ const id = slug(basename(p.from));
163
+ if (!s.sources.some((x) => x.id === id)) s.sources.push({ id, connector: "filesystem", writes: "none", root: p.from, note: "migrate: a person chose to point to these files rather than rewrite them" });
164
+ mkdirSync(dirname(f), { recursive: true });
165
+ writeFileSync(f, JSON.stringify(s, null, 2) + "\n");
166
+ prov(dir, { entity: "knowledge/sources.json", activity: "write", agent: agentFromEnv("agent", "migrate", { id: "naive-migrate" }), note: `points to ${p.from}, read-only` });
167
+ }
168
+ writeFileSync(join(dir, PLAN), JSON.stringify(p, null, 2) + "\n");
169
+ return done;
170
+ }
171
+
172
+ if (import.meta.url === `file://${process.argv[1]}`) {
173
+ const args = process.argv.slice(2);
174
+ const opt = (k) => { const i = args.indexOf(`--${k}`); return i < 0 ? undefined : args[i + 1]; };
175
+ const dir = opt("venture");
176
+ if (!dir || !existsSync(join(dir, "venture.json"))) { console.error("usage: node schema/migrate-venture.mjs --from <project> --venture <dir> | --venture <dir> --apply"); process.exit(2); }
177
+ try {
178
+ if (args.includes("--apply")) {
179
+ if (!existsSync(join(dir, PLAN))) { console.error(`no plan at ${join(dir, PLAN)}: run with --from first`); process.exit(1); }
180
+ const d = await apply(dir);
181
+ console.log(Object.entries(d).filter(([, n]) => n).map(([k, n]) => `${n} ${k}`).join(", ") || "nothing to do");
182
+ } else {
183
+ if (!opt("from")) { console.error("--from <project> is needed to write a plan"); process.exit(2); }
184
+ const p = plan(opt("from"), dir);
185
+ const decisions = proposeDecisions(dir, p);
186
+ for (const i of p.items) console.log(`${i.id} ${i.from.join(", ")} -> ${i.route} (${i.reshaping})`);
187
+ for (const l of p.left_behind) console.log(`left ${l.from} (${l.why})`);
188
+ console.log(`\n${p.items.length} records planned, ${p.left_behind.length} left behind. Nothing is written yet.`);
189
+ if (decisions.length) console.log(`Read ${relative(process.cwd(), join(dir, PLAN))}, then decide ${decisions.join(", ")} with mentura decide (answer "bring in", "point to them" or "leave them"), then run with --apply.`);
190
+ }
191
+ } catch (e) { console.error(e.message); process.exit(1); }
192
+ }
@@ -0,0 +1,94 @@
1
+ // Migration kit-to-package (framework 0.3.0, EE-071): packages are Naive's, kits are Mentura's. The
2
+ // first record migration, like a Next.js codemod that rewrites code for a renamed API:
3
+ //
4
+ // 1. naive.config.json: before 0.3.0, `kits` listed the venture's Naive packages. A name that is a
5
+ // Naive package moves into `packages` (pinned by the upgrader); a Mentura kit stays in `kits`; any
6
+ // other name is escalated, never guessed.
7
+ // 2. Routes inside records: decision unlocks, the team plan's route globs (who may read and write
8
+ // what) and the where-used list's parent routes still name layer and kit routes
9
+ // (purpose/validation/solution). Each is rewritten to its package route through the route aliases
10
+ // (validation/solution), so access and locks keep meaning what they meant. A glob that spans
11
+ // routes now in several packages (purpose/**) cannot be rewritten safely and is escalated.
12
+ //
13
+ // Every change goes through ctx (schema/upgrades.mjs).
14
+
15
+ import { existsSync, readdirSync, readFileSync } from "node:fs";
16
+ import { join } from "node:path";
17
+
18
+ export const id = "kit-to-package";
19
+ export const describe = "Moves Naive packages out of naive.config.json kits into packages, and rewrites layer and kit routes inside records (decision unlocks, team-plan access, where-used parents) to package routes";
20
+
21
+ const repo = new URL("../..", import.meta.url).pathname;
22
+
23
+ function aliases() {
24
+ const f = process.env.MENTURA_ROUTE_ALIASES ?? join(repo, "interface/route-aliases.json");
25
+ // Longest first, so purpose/validation/problem wins over a shorter alias it starts with.
26
+ return existsSync(f) ? JSON.parse(readFileSync(f, "utf8")).aliases.slice().sort((a, b) => b.from.length - a.from.length) : [];
27
+ }
28
+
29
+ /** A route or route glob rewritten through the aliases: { to } when it moved, { escalate } when it spans moved routes, else null. */
30
+ export function rewriteRoute(route, list = aliases()) {
31
+ if (typeof route !== "string") return null;
32
+ const hit = list.find((a) => route === a.from || route.startsWith(`${a.from}/`));
33
+ if (hit) return { to: hit.to + route.slice(hit.from.length), alias: hit };
34
+ const star = route.indexOf("*");
35
+ if (star >= 0) {
36
+ const head = route.slice(0, star).replace(/\/$/, "");
37
+ // A glob from the root (**) still covers every route after the move.
38
+ const spans = head === "" ? [] : list.filter((a) => a.from === head || a.from.startsWith(`${head}/`));
39
+ if (spans.length) return { escalate: `${route} spans routes that moved to ${[...new Set(spans.map((a) => a.to.split("/")[0]))].join(", ")}` };
40
+ }
41
+ return null;
42
+ }
43
+
44
+ export function apply(dir, ctx) {
45
+ const list = aliases();
46
+
47
+ // 1. kits that are Naive packages become packages.
48
+ const cfg = ctx.config;
49
+ if (Array.isArray(cfg.kits) && cfg.kits.length) {
50
+ const keep = [];
51
+ for (const name of cfg.kits) {
52
+ if (existsSync(join(repo, "packages", name, "package.json"))) {
53
+ cfg.packages = { ...(cfg.packages ?? {}), [name]: cfg.packages?.[name] ?? {} };
54
+ ctx.note(`naive.config.json: ${name} is a Naive package, so it moved from kits to packages`);
55
+ } else if (existsSync(join(repo, "platform/kits", name, "kit.json"))) keep.push(name);
56
+ else { keep.push(name); ctx.escalate(`naive.config.json: kits names ${name}, which is neither a Naive package nor a Mentura kit; left as it is`); }
57
+ }
58
+ if (keep.length !== cfg.kits.length) ctx.configChanged();
59
+ if (keep.length) cfg.kits = keep; else delete cfg.kits;
60
+ }
61
+
62
+ // 2. Routes inside records.
63
+ const rewrite = (file, value, where) => {
64
+ const r = rewriteRoute(value, list);
65
+ if (!r) return value;
66
+ if (r.escalate) { ctx.escalate(`${file}: ${where} ${r.escalate}; rewrite it yourself`); return value; }
67
+ return r.to;
68
+ };
69
+ const rewriteFile = (file, fn) => {
70
+ if (!existsSync(join(dir, file))) return;
71
+ const before = readFileSync(join(dir, file), "utf8");
72
+ const rec = JSON.parse(before);
73
+ fn(rec);
74
+ const after = JSON.stringify(rec, null, 2) + "\n";
75
+ if (after.trim() !== before.trim()) ctx.write(file, after, { note: "routes renamed from layer and kit routes to package routes (EE-071)" });
76
+ };
77
+
78
+ const decisionFiles = (sub = "") => readdirSync(join(dir, sub), { withFileTypes: true }).flatMap((e) => {
79
+ const rel = sub ? `${sub}/${e.name}` : e.name;
80
+ if (e.isDirectory()) return e.name.startsWith(".") || e.name.startsWith("_") || existsSync(join(dir, rel, "venture.json")) ? [] : decisionFiles(rel);
81
+ return e.name.endsWith(".decision.json") ? [rel] : [];
82
+ });
83
+ for (const f of decisionFiles()) rewriteFile(f, (d) => {
84
+ for (const u of d.unlocks ?? []) if (Array.isArray(u.routes)) u.routes = u.routes.map((g) => rewrite(f, g, "unlocks route"));
85
+ });
86
+
87
+ for (const f of ["people/team-plan.json", "operations/team-plan.json"]) rewriteFile(f, (p) => {
88
+ for (const role of p.roles ?? []) for (const k of ["read", "write"]) if (Array.isArray(role.routes?.[k])) role.routes[k] = role.routes[k].map((g) => rewrite(f, g, `role ${role.id} ${k}`));
89
+ });
90
+
91
+ rewriteFile("knowledge/where-used.json", (w) => {
92
+ for (const fact of w.facts ?? []) if (fact.parent?.route) fact.parent.route = rewrite("knowledge/where-used.json", fact.parent.route, `fact ${fact.id} parent`);
93
+ });
94
+ }
@@ -0,0 +1,86 @@
1
+ // Migration package-layout (framework 0.2.0, EE-070): moves a venture from the layer layout onto
2
+ // the package folder layout, like a Next.js codemod. Files move with git mv when git tracks them and
3
+ // with a plain rename otherwise. A file with no clear new home is archived under _private/ and
4
+ // escalated for a person, never guessed. Old routes keep resolving through interface/route-aliases.json.
5
+ //
6
+ // Every change goes through ctx (schema/upgrades.mjs), so a dry run (--check) reports the same moves
7
+ // without touching anything, and the upgrader records each one in provenance.
8
+
9
+ import { existsSync, readdirSync, readFileSync } from "node:fs";
10
+ import { join } from "node:path";
11
+
12
+ export const id = "package-layout";
13
+ export const describe = "Moves records from the layer folders (purpose/, pillars/, products/, knowledge/) into package folders (foundation/, validation/, product/, marketing/, people/, decisions/)";
14
+
15
+ export function apply(dir, ctx) {
16
+ const load = (p) => JSON.parse(readFileSync(p, "utf8"));
17
+ // A decision file infers its target from the folder it sits in. Stamp that path before the file
18
+ // moves, so the decision still points at the same record.
19
+ const stampDecisions = (folder) => {
20
+ const d = join(dir, folder);
21
+ if (!existsSync(d)) return;
22
+ for (const f of readdirSync(d).filter((x) => x.endsWith(".decision.json"))) {
23
+ const rec = load(join(d, f));
24
+ if (rec.decides?.path) continue;
25
+ const at = folder.split("/").slice(0, -1).join("/");
26
+ const base = f.split(".")[0];
27
+ rec.decides = { ...(rec.decides ?? {}), path: at ? `${at}/${base}.json` : `${base}.json` };
28
+ ctx.write(`${folder}/${f}`, JSON.stringify(rec, null, 2) + "\n", { note: "stamped the record it decides before the move (EE-070)", log: false });
29
+ }
30
+ };
31
+
32
+ const pairs = [
33
+ ["purpose/validation/problem.json", "foundation/problem.json"],
34
+ ["purpose/icp.json", "foundation/icp.json"],
35
+ ["purpose/alignment.json", "foundation/alignment.json"],
36
+ ["purpose/telos.draft.md", "foundation/telos.draft.md"],
37
+ ["purpose/validation/solution.json", "validation/solution.json"],
38
+ ["purpose/validation/go-to-market.json", "validation/go-to-market.json"],
39
+ ["operations/team-plan.json", "people/team-plan.json"],
40
+ ["pillars/brand.md", "marketing/brand.md"],
41
+ // A venture made since init writes a root AGENTS.md keeps it; the old README becomes the knowledge layout.
42
+ ["knowledge/README.md", existsSync(join(dir, "AGENTS.md")) ? "knowledge/AGENTS.md" : "AGENTS.md"],
43
+ ["purpose/anatomy.answers.reasoned.json", "product/anatomy.answers.reasoned.json"],
44
+ ["purpose/anatomy.matrix.md", "product/anatomy.matrix.md"],
45
+ ];
46
+ for (const [a, b] of pairs) ctx.mv(a, b);
47
+
48
+ const list = (rel, ext) => existsSync(join(dir, rel)) ? readdirSync(join(dir, rel)).filter((f) => f.endsWith(ext)) : [];
49
+ for (const f of list("products", ".json")) ctx.mv(`products/${f}`, `product/${f}`);
50
+ for (const f of list("purpose/anatomy", ".json")) ctx.mv(`purpose/anatomy/${f}`, `product/anatomy/${f}`);
51
+
52
+ for (const folder of ["purpose/decisions", "purpose/anatomy/decisions", "operations/decisions"]) {
53
+ stampDecisions(folder);
54
+ for (const f of list(folder, ".decision.json")) ctx.mv(`${folder}/${f}`, `decisions/${f}`);
55
+ }
56
+
57
+ for (const f of ["product.md", "business.md"]) {
58
+ if (existsSync(join(dir, "pillars", f))) {
59
+ ctx.mv(`pillars/${f}`, `_private/pillars/${f}`);
60
+ ctx.escalate(`${f.replace(".md", "")} pillar: the brief names a home only for brand (marketing/). Archived at _private/pillars/${f} rather than guessed.`);
61
+ }
62
+ }
63
+ for (const f of list("purpose/research", "")) {
64
+ ctx.mv(`purpose/research/${f}`, `_private/research/${f}`);
65
+ ctx.escalate(`purpose/research/${f}: no package home in the route table. Archived at _private/research/${f}.`);
66
+ }
67
+
68
+ for (const gone of ["purpose", "pillars", "knowledge", "products"]) ctx.removeEmpty(gone);
69
+
70
+ const policy = "governance/publication-policy.json";
71
+ if (existsSync(join(dir, policy))) {
72
+ const text = readFileSync(join(dir, policy), "utf8");
73
+ if (text.includes("pillars/brand.md")) ctx.write(policy, text.replaceAll("pillars/brand.md", "marketing/brand.md"), { note: "the brand pillar moved to marketing/brand.md (EE-070)" });
74
+ }
75
+
76
+ for (const sub of ["raw/dump", "raw/sources", "ideas", "finance", "customers", "investors", "money", "public"]) ctx.keep(sub);
77
+
78
+ // The layout release, as before: the moves this migration made and what it escalated.
79
+ if (ctx.moved.length || ctx.escalated.length) ctx.write(".release/layout.json", JSON.stringify({
80
+ version: 1,
81
+ at: ctx.at,
82
+ note: "Moved onto the package folder layout (EE-070). Old routes stay as aliases for one release.",
83
+ moves: ctx.moved.map(([from, to]) => ({ from, to })),
84
+ escalated: ctx.escalated,
85
+ }, null, 2) + "\n", { activity: "release", note: "package folder layout", derived_from: ctx.moved.map(([, to]) => to) });
86
+ }