@cohortapp/agent-sdk 2.3.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 (731) hide show
  1. package/.claude/commands/init-agent.md +104 -0
  2. package/.claude/commands/init-maestro.md +1187 -0
  3. package/.claude/settings.json +161 -0
  4. package/.env.example +216 -0
  5. package/README.md +632 -0
  6. package/agents/browser-operator/agent.md +52 -0
  7. package/agents/calendar-ops/agent.md +50 -0
  8. package/agents/communications/agent.md +96 -0
  9. package/agents/decision-log/agent.md +65 -0
  10. package/agents/desktop-operator/agent.md +59 -0
  11. package/agents/gmail-operator/agent.md +62 -0
  12. package/agents/inbound-dispatcher/agent.md +66 -0
  13. package/agents/inbox-processor/agent.md +39 -0
  14. package/agents/pmo-execution/agent.md +60 -0
  15. package/agents/session-spawner/agent.md +64 -0
  16. package/agents/slack-operator/agent.md +60 -0
  17. package/agents/whatsapp-operator/agent.md +60 -0
  18. package/agents/workflow-automation/agent.md +61 -0
  19. package/archetypes/altitudes/c-suite.yaml +58 -0
  20. package/archetypes/altitudes/founder.yaml +68 -0
  21. package/archetypes/altitudes/senior-manager.yaml +63 -0
  22. package/archetypes/altitudes/svp.yaml +60 -0
  23. package/archetypes/altitudes/vp.yaml +50 -0
  24. package/archetypes/archetype.schema.json +77 -0
  25. package/archetypes/base.yaml +47 -0
  26. package/archetypes/capabilities/commercial-leader.yaml +159 -0
  27. package/archetypes/capabilities/compliance-officer.yaml +159 -0
  28. package/archetypes/capabilities/executive-operator.yaml +169 -0
  29. package/archetypes/capabilities/finance-leader.yaml +162 -0
  30. package/archetypes/capabilities/operations-leader.yaml +154 -0
  31. package/archetypes/capabilities/product-leader.yaml +148 -0
  32. package/archetypes/capabilities/technical-leader.yaml +146 -0
  33. package/archetypes/functions/commercial-leader.yaml +62 -0
  34. package/archetypes/functions/compliance-officer.yaml +64 -0
  35. package/archetypes/functions/executive-operator.yaml +70 -0
  36. package/archetypes/functions/finance-leader.yaml +70 -0
  37. package/archetypes/functions/operations-leader.yaml +62 -0
  38. package/archetypes/functions/product-leader.yaml +61 -0
  39. package/archetypes/functions/technical-leader.yaml +57 -0
  40. package/bin/cohort-mcp.mjs +81 -0
  41. package/bin/maestro.mjs +3516 -0
  42. package/bin/maestro.test.mjs +1015 -0
  43. package/desktop-control/README.md +56 -0
  44. package/desktop-control/app-profiles/gmail.yaml +120 -0
  45. package/desktop-control/app-profiles/slack.yaml +315 -0
  46. package/desktop-control/app-profiles/whatsapp.yaml +107 -0
  47. package/docs/architecture/agent-topology.md +2239 -0
  48. package/docs/architecture/archetype-agent-factory.md +110 -0
  49. package/docs/architecture/collective-memory-and-org-mesh.md +115 -0
  50. package/docs/architecture/continuous-monitoring.md +221 -0
  51. package/docs/architecture/mcp-capability-map.md +585 -0
  52. package/docs/architecture/system-architecture.md +1272 -0
  53. package/docs/company-context/README.md +40 -0
  54. package/docs/guides/agent-persona-setup.md +600 -0
  55. package/docs/guides/agents-observe-setup.md +64 -0
  56. package/docs/guides/billing-console-keys.md +88 -0
  57. package/docs/guides/ccxray-diagnostics.md +65 -0
  58. package/docs/guides/channel-bus.md +127 -0
  59. package/docs/guides/claude-mem-setup.md +79 -0
  60. package/docs/guides/claude-pace-setup.md +56 -0
  61. package/docs/guides/claudraband-sessions.md +98 -0
  62. package/docs/guides/clawteam-swarm.md +116 -0
  63. package/docs/guides/code-review-graph-setup.md +86 -0
  64. package/docs/guides/email-setup.md +431 -0
  65. package/docs/guides/mac-mini.md +119 -0
  66. package/docs/guides/media-generation-setup.md +349 -0
  67. package/docs/guides/model-routing.md +162 -0
  68. package/docs/guides/observability-otel.md +265 -0
  69. package/docs/guides/org-onboarding.md +132 -0
  70. package/docs/guides/outbound-governance-setup.md +437 -0
  71. package/docs/guides/pdf-generation-setup.md +315 -0
  72. package/docs/guides/poller-daemon-setup.md +563 -0
  73. package/docs/guides/rag-context-setup.md +459 -0
  74. package/docs/guides/self-optimization-pattern.md +82 -0
  75. package/docs/guides/setup-wizard.md +178 -0
  76. package/docs/guides/slack-setup.md +350 -0
  77. package/docs/guides/telegram-setup.md +227 -0
  78. package/docs/guides/twilio-subaccounts-setup.md +223 -0
  79. package/docs/guides/verification.md +128 -0
  80. package/docs/guides/voice-mode.md +188 -0
  81. package/docs/guides/voice-sms-setup.md +698 -0
  82. package/docs/guides/webhook-relay-setup.md +349 -0
  83. package/docs/guides/whatsapp-setup.md +288 -0
  84. package/docs/prompts/board-pack-cover-template.md +36 -0
  85. package/docs/prompts/decision-recommendation-template.md +88 -0
  86. package/docs/prompts/followup-message-template.md +141 -0
  87. package/docs/prompts/investor-letter-template.md +52 -0
  88. package/docs/prompts/morning-brief-template.md +82 -0
  89. package/docs/prompts/presentation-template.md +58 -0
  90. package/docs/prompts/weekly-strategic-memo-template.md +104 -0
  91. package/docs/research/hallucinated-tool-output-investigation.md +151 -0
  92. package/docs/runbooks/backup-restore.md +205 -0
  93. package/docs/runbooks/cohort-cutover.md +129 -0
  94. package/docs/runbooks/fleet-operations.md +200 -0
  95. package/docs/runbooks/incident-response.md +226 -0
  96. package/docs/runbooks/mac-mini-bootstrap.md +431 -0
  97. package/docs/runbooks/perpetual-operations.md +509 -0
  98. package/docs/runbooks/recovery-and-failover.md +260 -0
  99. package/framework-features.json +267 -0
  100. package/ingest/README.md +87 -0
  101. package/lib/action-executor.js +689 -0
  102. package/lib/action-executor.test.mjs +871 -0
  103. package/lib/agent-root.mjs +37 -0
  104. package/lib/archetype.mjs +236 -0
  105. package/lib/archetype.test.mjs +132 -0
  106. package/lib/autonomy.mjs +114 -0
  107. package/lib/autonomy.test.mjs +66 -0
  108. package/lib/backlog.mjs +358 -0
  109. package/lib/backlog.test.mjs +266 -0
  110. package/lib/budget-guard.mjs +279 -0
  111. package/lib/budget-guard.test.mjs +291 -0
  112. package/lib/cadence-bus-schedule.test.mjs +194 -0
  113. package/lib/cadence-bus.mjs +1120 -0
  114. package/lib/cadence-bus.test.mjs +720 -0
  115. package/lib/cadences.mjs +205 -0
  116. package/lib/cadences.test.mjs +125 -0
  117. package/lib/capability.mjs +154 -0
  118. package/lib/capability.test.mjs +78 -0
  119. package/lib/channels/base-adapter.mjs +719 -0
  120. package/lib/channels/base-adapter.test.mjs +590 -0
  121. package/lib/channels/channel.mjs +128 -0
  122. package/lib/channels/channels.test.mjs +371 -0
  123. package/lib/channels/contract.mjs +215 -0
  124. package/lib/channels/contract.test.mjs +137 -0
  125. package/lib/channels/conversation-resolver.mjs +95 -0
  126. package/lib/channels/gmail/adapter.mjs +87 -0
  127. package/lib/channels/inbox-item.mjs +255 -0
  128. package/lib/channels/inbox-item.test.mjs +335 -0
  129. package/lib/channels/index.mjs +94 -0
  130. package/lib/channels/orgmail/adapter.mjs +353 -0
  131. package/lib/channels/orgmail/adapter.test.mjs +311 -0
  132. package/lib/channels/pairing.mjs +363 -0
  133. package/lib/channels/pairing.test.mjs +270 -0
  134. package/lib/channels/registry.mjs +164 -0
  135. package/lib/channels/slack/adapter.mjs +317 -0
  136. package/lib/channels/slack-adapter.test.mjs +212 -0
  137. package/lib/channels/sms/adapter.mjs +43 -0
  138. package/lib/channels/telegram/adapter.mjs +432 -0
  139. package/lib/channels/telegram-adapter.test.mjs +306 -0
  140. package/lib/channels/voice/adapter.mjs +301 -0
  141. package/lib/channels/voice/adapter.test.mjs +278 -0
  142. package/lib/channels/whatsapp/adapter-baileys.mjs +587 -0
  143. package/lib/channels/whatsapp/adapter-baileys.test.mjs +359 -0
  144. package/lib/channels/whatsapp/adapter-twilio.mjs +65 -0
  145. package/lib/channels/whatsapp/baileys-typing.test.mjs +154 -0
  146. package/lib/charter.mjs +256 -0
  147. package/lib/charter.test.mjs +89 -0
  148. package/lib/claude-bin.mjs +134 -0
  149. package/lib/claude-bin.test.mjs +75 -0
  150. package/lib/collective/capture.mjs +185 -0
  151. package/lib/collective/capture.test.mjs +121 -0
  152. package/lib/collective/cards.mjs +201 -0
  153. package/lib/collective/cards.test.mjs +114 -0
  154. package/lib/collective/config.mjs +186 -0
  155. package/lib/collective/config.test.mjs +123 -0
  156. package/lib/collective/global-config.mjs +113 -0
  157. package/lib/collective/global-config.test.mjs +75 -0
  158. package/lib/collective/presence.mjs +201 -0
  159. package/lib/collective/presence.test.mjs +95 -0
  160. package/lib/collective/recall.mjs +215 -0
  161. package/lib/collective/recall.test.mjs +116 -0
  162. package/lib/comms/send-gate.mjs +554 -0
  163. package/lib/comms/send-gate.test.mjs +577 -0
  164. package/lib/comms.mjs +67 -0
  165. package/lib/comms.test.mjs +41 -0
  166. package/lib/diagnostics/alerts.mjs +424 -0
  167. package/lib/diagnostics/alerts.test.mjs +318 -0
  168. package/lib/diagnostics/backup-freshness.mjs +188 -0
  169. package/lib/diagnostics/backup-freshness.test.mjs +185 -0
  170. package/lib/diagnostics/counters.mjs +269 -0
  171. package/lib/diagnostics/counters.test.mjs +206 -0
  172. package/lib/diagnostics/events.mjs +188 -0
  173. package/lib/diagnostics/events.test.mjs +290 -0
  174. package/lib/diagnostics/otel.mjs +237 -0
  175. package/lib/diagnostics/otel.test.mjs +196 -0
  176. package/lib/diagnostics/trace.mjs +216 -0
  177. package/lib/diagnostics/trace.test.mjs +251 -0
  178. package/lib/env-compat.mjs +74 -0
  179. package/lib/env-compat.test.mjs +104 -0
  180. package/lib/feature-init.mjs +331 -0
  181. package/lib/fs-atomic.mjs +112 -0
  182. package/lib/fs-atomic.test.mjs +72 -0
  183. package/lib/fs-ownership.mjs +111 -0
  184. package/lib/fs-ownership.test.mjs +158 -0
  185. package/lib/hooks/bus.mjs +347 -0
  186. package/lib/hooks/bus.test.mjs +387 -0
  187. package/lib/index.js +16 -0
  188. package/lib/learning/config.mjs +106 -0
  189. package/lib/learning/config.test.mjs +75 -0
  190. package/lib/learning/counters.mjs +156 -0
  191. package/lib/learning/counters.test.mjs +69 -0
  192. package/lib/learning/curator-consolidate.test.mjs +238 -0
  193. package/lib/learning/curator.mjs +453 -0
  194. package/lib/learning/curator.test.mjs +106 -0
  195. package/lib/learning/log.mjs +40 -0
  196. package/lib/learning/reflect.mjs +534 -0
  197. package/lib/learning/reflect.test.mjs +0 -0
  198. package/lib/learning/session-index.mjs +352 -0
  199. package/lib/learning/session-index.test.mjs +125 -0
  200. package/lib/learning/skill-writer.mjs +474 -0
  201. package/lib/learning/skill-writer.test.mjs +210 -0
  202. package/lib/mcp/server.mjs +328 -0
  203. package/lib/mcp/server.test.mjs +400 -0
  204. package/lib/model-router/auth-profiles.mjs +758 -0
  205. package/lib/model-router/auth-profiles.test.mjs +580 -0
  206. package/lib/model-router/catalog/anthropic.yaml +153 -0
  207. package/lib/model-router/catalog/deepseek.yaml +86 -0
  208. package/lib/model-router/catalog/moonshot.yaml +81 -0
  209. package/lib/model-router/catalog/qwen.yaml +114 -0
  210. package/lib/model-router/catalog.mjs +925 -0
  211. package/lib/model-router/catalog.test.mjs +385 -0
  212. package/lib/model-router/economics.mjs +564 -0
  213. package/lib/model-router/economics.test.mjs +344 -0
  214. package/lib/model-router/failover.mjs +298 -0
  215. package/lib/model-router/failover.test.mjs +439 -0
  216. package/lib/model-router/health.mjs +453 -0
  217. package/lib/model-router/health.test.mjs +338 -0
  218. package/lib/model-router/integration-coverage.test.mjs +829 -0
  219. package/lib/model-router/integration.test.mjs +564 -0
  220. package/lib/model-router/ledger.mjs +402 -0
  221. package/lib/model-router/ledger.test.mjs +382 -0
  222. package/lib/model-router/llm-task.mjs +515 -0
  223. package/lib/model-router/llm-task.test.mjs +392 -0
  224. package/lib/model-router/org-credentials.mjs +260 -0
  225. package/lib/model-router/org-credentials.test.mjs +265 -0
  226. package/lib/model-router/pricing-refresh.mjs +463 -0
  227. package/lib/model-router/pricing-refresh.test.mjs +286 -0
  228. package/lib/model-router/reconcile.mjs +429 -0
  229. package/lib/model-router/reconcile.test.mjs +316 -0
  230. package/lib/model-router/repair.mjs +471 -0
  231. package/lib/model-router/repair.test.mjs +180 -0
  232. package/lib/model-router/resolve.mjs +1206 -0
  233. package/lib/model-router/spawn.mjs +497 -0
  234. package/lib/model-router/spawn.test.mjs +425 -0
  235. package/lib/model-router/taxonomy.mjs +893 -0
  236. package/lib/model-router/taxonomy.test.mjs +410 -0
  237. package/lib/model-router.mjs +677 -0
  238. package/lib/model-router.test.mjs +907 -0
  239. package/lib/org/activity.mjs +211 -0
  240. package/lib/org/activity.test.mjs +134 -0
  241. package/lib/org/approvals.mjs +448 -0
  242. package/lib/org/approvals.test.mjs +216 -0
  243. package/lib/org/awareness.mjs +222 -0
  244. package/lib/org/awareness.test.mjs +159 -0
  245. package/lib/org/board.mjs +229 -0
  246. package/lib/org/board.test.mjs +177 -0
  247. package/lib/org/bootstrap-context.mjs +169 -0
  248. package/lib/org/bootstrap-context.test.mjs +153 -0
  249. package/lib/org/client.mjs +1628 -0
  250. package/lib/org/client.test.mjs +1107 -0
  251. package/lib/org/cohort-client.mjs +67 -0
  252. package/lib/org/cohort-client.test.mjs +126 -0
  253. package/lib/org/cost-sync.mjs +227 -0
  254. package/lib/org/cost-sync.test.mjs +153 -0
  255. package/lib/org/doctor.mjs +212 -0
  256. package/lib/org/doctor.test.mjs +212 -0
  257. package/lib/org/handoff.mjs +293 -0
  258. package/lib/org/handoff.test.mjs +269 -0
  259. package/lib/org/integration-tools.mjs +182 -0
  260. package/lib/org/integration-tools.test.mjs +160 -0
  261. package/lib/org/keys.mjs +131 -0
  262. package/lib/org/keys.test.mjs +92 -0
  263. package/lib/org/knowledge.mjs +463 -0
  264. package/lib/org/knowledge.test.mjs +319 -0
  265. package/lib/org/leases.mjs +335 -0
  266. package/lib/org/leases.test.mjs +235 -0
  267. package/lib/org/mesh-integration.test.mjs +127 -0
  268. package/lib/org/mesh.mjs +459 -0
  269. package/lib/org/mesh.test.mjs +345 -0
  270. package/lib/org/messaging.mjs +503 -0
  271. package/lib/org/messaging.test.mjs +238 -0
  272. package/lib/org/policy.mjs +345 -0
  273. package/lib/org/policy.test.mjs +237 -0
  274. package/lib/org/protocol.checksum +1 -0
  275. package/lib/org/protocol.checksum.test.mjs +90 -0
  276. package/lib/org/protocol.mjs +967 -0
  277. package/lib/org/protocol.test.mjs +264 -0
  278. package/lib/org/registry.mjs +194 -0
  279. package/lib/org/registry.test.mjs +100 -0
  280. package/lib/org/tool-surface-integration.test.mjs +120 -0
  281. package/lib/org/tool-surface.mjs +2535 -0
  282. package/lib/org/tool-surface.test.mjs +589 -0
  283. package/lib/org/ui-parity.mjs +3236 -0
  284. package/lib/org/ui-parity.test.mjs +348 -0
  285. package/lib/org/verify.mjs +176 -0
  286. package/lib/org/verify.test.mjs +194 -0
  287. package/lib/rag/embed.mjs +188 -0
  288. package/lib/rag/indexer.mjs +425 -0
  289. package/lib/rag/rag.test.mjs +505 -0
  290. package/lib/rag/search.mjs +475 -0
  291. package/lib/rate-guard.mjs +246 -0
  292. package/lib/rate-guard.test.mjs +201 -0
  293. package/lib/render.mjs +112 -0
  294. package/lib/render.test.mjs +68 -0
  295. package/lib/resource-governor.mjs +297 -0
  296. package/lib/resource-governor.test.mjs +262 -0
  297. package/lib/scheduling/dynamic-jobs.mjs +675 -0
  298. package/lib/scheduling/dynamic-jobs.test.mjs +344 -0
  299. package/lib/scheduling/jitter.mjs +0 -0
  300. package/lib/scheduling/jitter.test.mjs +140 -0
  301. package/lib/secrets/broker.mjs +315 -0
  302. package/lib/secrets/broker.test.mjs +280 -0
  303. package/lib/secrets/providers.mjs +461 -0
  304. package/lib/secrets/providers.test.mjs +274 -0
  305. package/lib/security/audit-engine.mjs +684 -0
  306. package/lib/security/audit-engine.test.mjs +389 -0
  307. package/lib/security/coerce-args.mjs +552 -0
  308. package/lib/security/coerce-args.test.mjs +281 -0
  309. package/lib/security/dangerous-tools.mjs +97 -0
  310. package/lib/security/dangerous-tools.test.mjs +68 -0
  311. package/lib/security/external-content.mjs +145 -0
  312. package/lib/security/external-content.test.mjs +67 -0
  313. package/lib/security/redact.mjs +592 -0
  314. package/lib/security/redact.test.mjs +441 -0
  315. package/lib/security/secret-equal.mjs +73 -0
  316. package/lib/security/secret-equal.test.mjs +55 -0
  317. package/lib/session-permissions.mjs +101 -0
  318. package/lib/session-permissions.test.mjs +100 -0
  319. package/lib/setup/claude-probe.mjs +74 -0
  320. package/lib/setup/completeness.mjs +175 -0
  321. package/lib/setup/completeness.test.mjs +110 -0
  322. package/lib/setup/context-pack.mjs +173 -0
  323. package/lib/setup/context-pack.test.mjs +89 -0
  324. package/lib/setup/enrich.mjs +277 -0
  325. package/lib/setup/enrich.test.mjs +115 -0
  326. package/lib/setup/enroll-from-cohort.mjs +441 -0
  327. package/lib/setup/enroll-from-cohort.test.mjs +233 -0
  328. package/lib/setup/integration.test.mjs +162 -0
  329. package/lib/setup/io.mjs +360 -0
  330. package/lib/setup/io.test.mjs +77 -0
  331. package/lib/setup/run-generator.mjs +81 -0
  332. package/lib/setup/runner.mjs +244 -0
  333. package/lib/setup/runner.test.mjs +132 -0
  334. package/lib/setup/sections/comms.mjs +173 -0
  335. package/lib/setup/sections/company.mjs +120 -0
  336. package/lib/setup/sections/enrich.mjs +138 -0
  337. package/lib/setup/sections/identity.mjs +182 -0
  338. package/lib/setup/sections/identity.test.mjs +140 -0
  339. package/lib/setup/sections/learning.mjs +153 -0
  340. package/lib/setup/sections/learning.test.mjs +81 -0
  341. package/lib/setup/sections/messaging.mjs +219 -0
  342. package/lib/setup/sections/messaging.test.mjs +127 -0
  343. package/lib/setup/sections/model.mjs +102 -0
  344. package/lib/setup/sections/operating-model.mjs +78 -0
  345. package/lib/setup/sections/org.mjs +475 -0
  346. package/lib/setup/sections/org.test.mjs +313 -0
  347. package/lib/setup/sections/orgmail.mjs +173 -0
  348. package/lib/setup/sections/orgmail.test.mjs +118 -0
  349. package/lib/setup/sections/recovery.mjs +159 -0
  350. package/lib/setup/sections/recovery.test.mjs +98 -0
  351. package/lib/setup/sections/tools.mjs +132 -0
  352. package/lib/setup/sections/verify.mjs +97 -0
  353. package/lib/setup/sot.mjs +205 -0
  354. package/lib/setup/sot.test.mjs +81 -0
  355. package/lib/setup/state.mjs +151 -0
  356. package/lib/setup/state.test.mjs +92 -0
  357. package/lib/singleton.js +229 -0
  358. package/lib/singleton.test.mjs +135 -0
  359. package/lib/telemetry/alerts.mjs +216 -0
  360. package/lib/telemetry/alerts.test.mjs +109 -0
  361. package/lib/telemetry/collect.mjs +512 -0
  362. package/lib/telemetry/collect.test.mjs +202 -0
  363. package/lib/tool-definitions-integration.test.mjs +83 -0
  364. package/lib/tool-definitions.js +738 -0
  365. package/lib/tool-definitions.test.mjs +437 -0
  366. package/lib/util/fetch-timeout.mjs +136 -0
  367. package/lib/util/fetch-timeout.test.mjs +202 -0
  368. package/lib/util/reconnect.mjs +343 -0
  369. package/lib/util/reconnect.test.mjs +369 -0
  370. package/lib/util/unhandled.mjs +205 -0
  371. package/lib/util/unhandled.test.mjs +216 -0
  372. package/lib/voice/context-loader.mjs +466 -0
  373. package/lib/voice/index.mjs +100 -0
  374. package/lib/voice/openai-realtime.mjs +510 -0
  375. package/lib/voice/outbound.mjs +542 -0
  376. package/lib/voice/outbound.test.mjs +69 -0
  377. package/lib/voice/post-call-brief.mjs +428 -0
  378. package/lib/voice/provider.mjs +52 -0
  379. package/lib/voice/session-rotation.mjs +257 -0
  380. package/lib/voice/stt.mjs +161 -0
  381. package/lib/voice/stt.test.mjs +226 -0
  382. package/lib/voice/tool-bridge.mjs +370 -0
  383. package/lib/voice/tts.mjs +104 -0
  384. package/lib/voice/twilio-sip-bridge.mjs +288 -0
  385. package/lib/voice/voice.test.mjs +990 -0
  386. package/mcp/README.md +80 -0
  387. package/package.json +151 -0
  388. package/plugins/maestro-skills/plugin.json +139 -0
  389. package/plugins/maestro-skills/skills/agents-observe.md +110 -0
  390. package/plugins/maestro-skills/skills/board-deck.md +68 -0
  391. package/plugins/maestro-skills/skills/books-close.md +77 -0
  392. package/plugins/maestro-skills/skills/brand-steward.md +121 -0
  393. package/plugins/maestro-skills/skills/calendar-plan.md +57 -0
  394. package/plugins/maestro-skills/skills/call-working-sessions.md +124 -0
  395. package/plugins/maestro-skills/skills/ccxray-diagnostics.md +91 -0
  396. package/plugins/maestro-skills/skills/claude-pace.md +61 -0
  397. package/plugins/maestro-skills/skills/code-review-graph.md +99 -0
  398. package/plugins/maestro-skills/skills/crm-pipeline.md +65 -0
  399. package/plugins/maestro-skills/skills/decision-brief.md +89 -0
  400. package/plugins/maestro-skills/skills/directory-hygiene.md +125 -0
  401. package/plugins/maestro-skills/skills/draft-comms.md +84 -0
  402. package/plugins/maestro-skills/skills/evening-wrap.md +53 -0
  403. package/plugins/maestro-skills/skills/files-find.md +65 -0
  404. package/plugins/maestro-skills/skills/generative-ui.md +228 -0
  405. package/plugins/maestro-skills/skills/hiring-triage.md +74 -0
  406. package/plugins/maestro-skills/skills/inbox-triage.md +61 -0
  407. package/plugins/maestro-skills/skills/mail-triage.md +86 -0
  408. package/plugins/maestro-skills/skills/morning-brief.md +54 -0
  409. package/plugins/maestro-skills/skills/native-artifacts.md +157 -0
  410. package/plugins/maestro-skills/skills/org-board.md +133 -0
  411. package/plugins/maestro-skills/skills/org-credential.md +68 -0
  412. package/plugins/maestro-skills/skills/org-recall.md +81 -0
  413. package/plugins/maestro-skills/skills/pipeline-review.md +76 -0
  414. package/plugins/maestro-skills/skills/regulatory-status.md +81 -0
  415. package/plugins/maestro-skills/skills/router-why.md +78 -0
  416. package/plugins/maestro-skills/skills/schedule-meeting.md +91 -0
  417. package/plugins/maestro-skills/skills/session-search.md +71 -0
  418. package/plugins/maestro-skills/skills/set-reminder.md +93 -0
  419. package/plugins/maestro-skills/skills/slack-followup.md +64 -0
  420. package/plugins/maestro-skills/skills/team-activity.md +86 -0
  421. package/plugins/maestro-skills/skills/weekly-memo.md +70 -0
  422. package/policies/action-classification.yaml +114 -0
  423. package/policies/ai-disclosure.yaml +294 -0
  424. package/policies/communication-style.md +139 -0
  425. package/policies/information-barriers.yaml +118 -0
  426. package/policies/prompt-injection-defence.yaml +138 -0
  427. package/public/assets/icon-dark.png +0 -0
  428. package/public/assets/icon-dark.svg +9 -0
  429. package/public/assets/icon-light.svg +9 -0
  430. package/public/assets/logo-dark.svg +15 -0
  431. package/public/assets/logo-light.svg +15 -0
  432. package/scaffold/.mcp.json +7 -0
  433. package/scaffold/CLAUDE.md +368 -0
  434. package/scaffold/config/agent.json +55 -0
  435. package/scaffold/config/agent.ts +76 -0
  436. package/scaffold/config/agent.ts.example +89 -0
  437. package/scaffold/config/alerts.yaml +23 -0
  438. package/scaffold/config/allowlist.yaml.example +25 -0
  439. package/scaffold/config/caller-id-map.yaml +46 -0
  440. package/scaffold/config/collective.yaml +49 -0
  441. package/scaffold/config/company.json +20 -0
  442. package/scaffold/config/known-agents.json +6 -0
  443. package/scaffold/config/learning.yaml +55 -0
  444. package/scaffold/config/model-routing.yaml.example +104 -0
  445. package/scaffold/config/org.yaml +25 -0
  446. package/scaffold/config/orgmail.yaml.example +19 -0
  447. package/scaffold/config/recovery.yaml +72 -0
  448. package/scaffold/config/secrets.yaml +27 -0
  449. package/scaffold/config/slack.yaml.example +35 -0
  450. package/scaffold/config/telegram.yaml.example +38 -0
  451. package/scaffold/config/voice.yaml.example +89 -0
  452. package/scaffold/config/whatsapp.yaml.example +39 -0
  453. package/schedules/README.md +49 -0
  454. package/schedules/triggers/backlog-executor.md +102 -0
  455. package/schedules/triggers/brand-steward.md +72 -0
  456. package/schedules/triggers/daily-evening-wrap.md +159 -0
  457. package/schedules/triggers/daily-midday-sweep.md +58 -0
  458. package/schedules/triggers/daily-morning-brief.md +55 -0
  459. package/schedules/triggers/directory-hygiene.md +81 -0
  460. package/schedules/triggers/dynamic-jobs.md +40 -0
  461. package/schedules/triggers/inbox-processor.md +115 -0
  462. package/schedules/triggers/meeting-action-capture.md +60 -0
  463. package/schedules/triggers/meeting-prep.md +69 -0
  464. package/schedules/triggers/messaging-inbound.md +50 -0
  465. package/schedules/triggers/org-pulse.md +24 -0
  466. package/schedules/triggers/quarterly-self-assessment.md +54 -0
  467. package/schedules/triggers/weekly-engineering-health.md +37 -0
  468. package/schedules/triggers/weekly-execution.md +65 -0
  469. package/schedules/triggers/weekly-hiring.md +53 -0
  470. package/schedules/triggers/weekly-priorities.md +38 -0
  471. package/schedules/triggers/weekly-strategic-memo.md +124 -0
  472. package/scripts/archive-email.sh +55 -0
  473. package/scripts/cadence/cadence-status.mjs +36 -0
  474. package/scripts/cadence/enqueue-cadence-tick.mjs +174 -0
  475. package/scripts/cadence/enqueue-cadence-tick.test.mjs +187 -0
  476. package/scripts/cadence/launchd-cadence-wrapper.sh +85 -0
  477. package/scripts/cadence/launchd-cloud-relay-wrapper.sh +95 -0
  478. package/scripts/cadence/launchd-socket-mode-wrapper.sh +95 -0
  479. package/scripts/ci/check-docs-accuracy.mjs +493 -0
  480. package/scripts/ci/check-docs-accuracy.test.mjs +409 -0
  481. package/scripts/ci/check-exports-exist.mjs +140 -0
  482. package/scripts/ci/check-files-exist.mjs +107 -0
  483. package/scripts/ci/check-no-build-artifacts.mjs +111 -0
  484. package/scripts/ci/check-no-build-artifacts.test.mjs +71 -0
  485. package/scripts/ci/check-no-confidential.mjs +198 -0
  486. package/scripts/ci/check-no-conflict-markers.mjs +169 -0
  487. package/scripts/ci/check-no-residual-identity.mjs +163 -0
  488. package/scripts/ci/check-no-residual-identity.test.mjs +89 -0
  489. package/scripts/ci/check-tarball-fidelity.mjs +205 -0
  490. package/scripts/ci/check-unresolved-tokens.mjs +83 -0
  491. package/scripts/ci/check.mjs +109 -0
  492. package/scripts/ci/check.test.mjs +194 -0
  493. package/scripts/ci/run-coverage.mjs +82 -0
  494. package/scripts/ci/run-tests.mjs +71 -0
  495. package/scripts/cloud-relay/README.md +59 -0
  496. package/scripts/cloud-relay/index.mjs +233 -0
  497. package/scripts/cloud-relay/package.json +15 -0
  498. package/scripts/cloud-relay/railway.json +13 -0
  499. package/scripts/cloud-relay/voice/README.md +94 -0
  500. package/scripts/cloud-relay/voice/package-lock.json +39 -0
  501. package/scripts/cloud-relay/voice/package.json +16 -0
  502. package/scripts/cloud-relay/voice/railway.json +13 -0
  503. package/scripts/cloud-relay/voice/server.mjs +532 -0
  504. package/scripts/collective/hook-runner.mjs +211 -0
  505. package/scripts/collective/hook-runner.test.mjs +90 -0
  506. package/scripts/collective/org-pulse.mjs +72 -0
  507. package/scripts/collective/org-sync.mjs +61 -0
  508. package/scripts/collective/recall.mjs +45 -0
  509. package/scripts/collective/who.mjs +30 -0
  510. package/scripts/comms-monitor.sh +288 -0
  511. package/scripts/configure-whatsapp-sandbox.sh +201 -0
  512. package/scripts/continuous-monitor.sh +91 -0
  513. package/scripts/cost/fleet-digest.mjs +407 -0
  514. package/scripts/cost/fleet-digest.test.mjs +207 -0
  515. package/scripts/cost/track-claude-usage.mjs +169 -0
  516. package/scripts/daemon/agent-daemon.mjs +989 -0
  517. package/scripts/daemon/agent-daemon.test.mjs +525 -0
  518. package/scripts/daemon/cadence-consumer-governance.test.mjs +220 -0
  519. package/scripts/daemon/cadence-consumer.mjs +1080 -0
  520. package/scripts/daemon/cadence-consumer.test.mjs +770 -0
  521. package/scripts/daemon/cadence-handlers.mjs +1121 -0
  522. package/scripts/daemon/cadence-handlers.test.mjs +617 -0
  523. package/scripts/daemon/classifier.mjs +704 -0
  524. package/scripts/daemon/classifier.test.mjs +238 -0
  525. package/scripts/daemon/classify-kind.mjs +54 -0
  526. package/scripts/daemon/classify-kind.test.mjs +40 -0
  527. package/scripts/daemon/context-compiler.mjs +605 -0
  528. package/scripts/daemon/context-compiler.test.mjs +300 -0
  529. package/scripts/daemon/dispatcher-cooldown.test.mjs +122 -0
  530. package/scripts/daemon/dispatcher-governance.test.mjs +886 -0
  531. package/scripts/daemon/dispatcher.mjs +1516 -0
  532. package/scripts/daemon/health.mjs +72 -0
  533. package/scripts/daemon/inbox-deferral.mjs +210 -0
  534. package/scripts/daemon/inbox-deferral.test.mjs +242 -0
  535. package/scripts/daemon/integration.test.mjs +149 -0
  536. package/scripts/daemon/launchd-wrapper-generic.sh +96 -0
  537. package/scripts/daemon/launchd-wrapper-slack-events.sh +37 -0
  538. package/scripts/daemon/launchd-wrapper.sh +91 -0
  539. package/scripts/daemon/lib/session-router.mjs +274 -0
  540. package/scripts/daemon/lib/session-router.test.mjs +295 -0
  541. package/scripts/daemon/maestro-daemon.mjs +275 -0
  542. package/scripts/daemon/prompt-builder.mjs +685 -0
  543. package/scripts/daemon/prompt-builder.test.mjs +213 -0
  544. package/scripts/daemon/responder.mjs +854 -0
  545. package/scripts/daemon/session-lock.mjs +721 -0
  546. package/scripts/daemon/session-lock.test.mjs +252 -0
  547. package/scripts/daemon/session-outcomes.mjs +640 -0
  548. package/scripts/daemon/session-outcomes.test.mjs +533 -0
  549. package/scripts/daemon/typing-registry.mjs +90 -0
  550. package/scripts/daemon/typing-registry.test.mjs +77 -0
  551. package/scripts/daemon/voice-webhook-server.mjs +804 -0
  552. package/scripts/decisions/capture-decision.mjs +116 -0
  553. package/scripts/disclosure_assessment.py +873 -0
  554. package/scripts/disclosure_boundaries.py +562 -0
  555. package/scripts/email-signature-principal.html +52 -0
  556. package/scripts/email-signature.html +60 -0
  557. package/scripts/email_quote_thread.py +167 -0
  558. package/scripts/email_thread_dedup.py +362 -0
  559. package/scripts/emergency-stop.sh +81 -0
  560. package/scripts/healthcheck.sh +116 -0
  561. package/scripts/hooks/block-mcp-cohort-send.sh +15 -0
  562. package/scripts/hooks/block-mcp-slack-send.sh +7 -0
  563. package/scripts/hooks/post-action-log.sh +126 -0
  564. package/scripts/hooks/pre-send-audit.sh +174 -0
  565. package/scripts/hooks/pre-send-audit.test.mjs +215 -0
  566. package/scripts/hooks/session-end-log.sh +27 -0
  567. package/scripts/hooks/session-start-banner.sh +115 -0
  568. package/scripts/huddle/audio-bridge.mjs +664 -0
  569. package/scripts/huddle/boot-slack-cdp.sh +102 -0
  570. package/scripts/huddle/huddle-controller.mjs +942 -0
  571. package/scripts/huddle/huddle-server.mjs +1229 -0
  572. package/scripts/huddle/launch-slack.sh +232 -0
  573. package/scripts/huddle/openai-realtime-bridge.mjs +462 -0
  574. package/scripts/huddle/package-lock.json +62 -0
  575. package/scripts/huddle/package.json +22 -0
  576. package/scripts/huddle/setup-audio.sh +239 -0
  577. package/scripts/huddle/start-call.mjs +318 -0
  578. package/scripts/huddle/test-pipeline.mjs +263 -0
  579. package/scripts/learning/consolidate-skills.mjs +72 -0
  580. package/scripts/learning/session-search.mjs +125 -0
  581. package/scripts/llm_email_dedup.py +442 -0
  582. package/scripts/local-triggers/generate-plists.sh +432 -0
  583. package/scripts/local-triggers/generate-plists.test.mjs +413 -0
  584. package/scripts/local-triggers/install-all.sh +49 -0
  585. package/scripts/local-triggers/plists/.gitkeep +0 -0
  586. package/scripts/local-triggers/run-trigger.sh +63 -0
  587. package/scripts/local-triggers/templates/rag-reindex.plist.template +47 -0
  588. package/scripts/local-triggers/templates/voice-relay-poller.plist.template +54 -0
  589. package/scripts/local-triggers/templates/voice-tunnel.plist.template +55 -0
  590. package/scripts/local-triggers/templates/voice-webhook.plist.template +51 -0
  591. package/scripts/maintenance/backup-to-cloud.sh +124 -0
  592. package/scripts/maintenance/health-check.sh +377 -0
  593. package/scripts/media-generation/README.md +105 -0
  594. package/scripts/media-generation/gemini-image-client.mjs +173 -0
  595. package/scripts/media-generation/generate-assets.mjs +289 -0
  596. package/scripts/media-generation/veo-video-client.mjs +219 -0
  597. package/scripts/org/send-orgmail.mjs +227 -0
  598. package/scripts/outbound-dedup-cleanup.sh +43 -0
  599. package/scripts/outbound-dedup.sh +477 -0
  600. package/scripts/outbound_dedup.py +115 -0
  601. package/scripts/parse-voice-transcript.mjs +481 -0
  602. package/scripts/pdf-generation/README.md +63 -0
  603. package/scripts/pdf-generation/build-document.mjs +247 -0
  604. package/scripts/pdf-generation/templates/board-pack.latex +136 -0
  605. package/scripts/pdf-generation/templates/corporate-letter.latex +126 -0
  606. package/scripts/pdf-generation/templates/memo.latex +114 -0
  607. package/scripts/poll-slack-events.sh +35 -0
  608. package/scripts/poller/calendar-poller.mjs +12 -0
  609. package/scripts/poller/gmail-poller.mjs +192 -0
  610. package/scripts/poller/imap-client.mjs +289 -0
  611. package/scripts/poller/inbox-scan-poller.mjs +156 -0
  612. package/scripts/poller/inbox-scan-poller.test.mjs +231 -0
  613. package/scripts/poller/index.mjs +73 -0
  614. package/scripts/poller/intra-session-check.mjs +285 -0
  615. package/scripts/poller/lib/cloud-relay-dedup.mjs +88 -0
  616. package/scripts/poller/lib/cloud-relay-dedup.test.mjs +133 -0
  617. package/scripts/poller/lib/slash-command-handlers.mjs +177 -0
  618. package/scripts/poller/secondary-gmail-poller.mjs +132 -0
  619. package/scripts/poller/slack-cloud-relay-client.mjs +368 -0
  620. package/scripts/poller/slack-poller.mjs +854 -0
  621. package/scripts/poller/slack-socket-mode.mjs +917 -0
  622. package/scripts/poller/slack-socket-mode.test.mjs +753 -0
  623. package/scripts/poller/trigger.mjs +75 -0
  624. package/scripts/poller/utils.mjs +371 -0
  625. package/scripts/poller/voice-cloud-relay-client.mjs +179 -0
  626. package/scripts/poller/voice-poller.mjs +236 -0
  627. package/scripts/poller-launchd/install.sh +66 -0
  628. package/scripts/poller-launchd/poller.plist.template +40 -0
  629. package/scripts/poller-launchd/whatsapp-handler.plist.template +39 -0
  630. package/scripts/post-interaction-indexer.py +1598 -0
  631. package/scripts/pre-draft-context.py +994 -0
  632. package/scripts/pre_draft_lookup.py +258 -0
  633. package/scripts/rag/build-index.mjs +47 -0
  634. package/scripts/rag/ingest.mjs +111 -0
  635. package/scripts/rag/search.mjs +119 -0
  636. package/scripts/rag-indexer.py +629 -0
  637. package/scripts/restore-from-backup.sh +248 -0
  638. package/scripts/restore-from-backup.test.mjs +178 -0
  639. package/scripts/resume-operations.sh +80 -0
  640. package/scripts/search-secondary-inbox.py +181 -0
  641. package/scripts/secondary-inbox-poller.py +437 -0
  642. package/scripts/self-optimization/compute-metrics.py +398 -0
  643. package/scripts/send-email-as-principal.py +369 -0
  644. package/scripts/send-email-threaded.py +392 -0
  645. package/scripts/send-email-with-attachment.py +377 -0
  646. package/scripts/send-email.sh +131 -0
  647. package/scripts/send-sms.sh +175 -0
  648. package/scripts/send-whatsapp.sh +292 -0
  649. package/scripts/session-start.sh +106 -0
  650. package/scripts/setup/boot-claude-session.sh +94 -0
  651. package/scripts/setup/configure-macos.sh +674 -0
  652. package/scripts/setup/configure-twilio-sip-trunk.mjs +207 -0
  653. package/scripts/setup/configure-voice-tunnel.mjs +182 -0
  654. package/scripts/setup/generate-agent-env.mjs +92 -0
  655. package/scripts/setup/generate-agent-package-json.mjs +222 -0
  656. package/scripts/setup/generate-agent-package-json.test.mjs +143 -0
  657. package/scripts/setup/generate-autonomy.mjs +60 -0
  658. package/scripts/setup/generate-backlog.mjs +101 -0
  659. package/scripts/setup/generate-cadences.mjs +92 -0
  660. package/scripts/setup/generate-capability.mjs +162 -0
  661. package/scripts/setup/generate-charter.mjs +76 -0
  662. package/scripts/setup/generate-comms.mjs +59 -0
  663. package/scripts/setup/generate-company.mjs +92 -0
  664. package/scripts/setup/init-agent.sh +547 -0
  665. package/scripts/setup/init-agent.test.mjs +151 -0
  666. package/scripts/setup/init-archetype.mjs +74 -0
  667. package/scripts/setup/init-backup.mjs +54 -0
  668. package/scripts/setup/init-cadence-bus.mjs +60 -0
  669. package/scripts/setup/init-channel-bus.mjs +46 -0
  670. package/scripts/setup/init-cost-tracking.mjs +45 -0
  671. package/scripts/setup/init-decision-capture.mjs +66 -0
  672. package/scripts/setup/init-known-agents.mjs +57 -0
  673. package/scripts/setup/init-learning.mjs +70 -0
  674. package/scripts/setup/init-memory-executive.mjs +45 -0
  675. package/scripts/setup/init-model-router.mjs +124 -0
  676. package/scripts/setup/init-rag.mjs +174 -0
  677. package/scripts/setup/init-session-router.mjs +38 -0
  678. package/scripts/setup/init-slack-socket-mode.mjs +260 -0
  679. package/scripts/setup/init-telegram.mjs +165 -0
  680. package/scripts/setup/init-voice-realtime.mjs +204 -0
  681. package/scripts/setup/init-whatsapp-baileys.mjs +77 -0
  682. package/scripts/setup/install-dev-tools.sh +150 -0
  683. package/scripts/setup/lib/install-plist.mjs +95 -0
  684. package/scripts/setup/migrate-agent-to-sot.mjs +192 -0
  685. package/scripts/setup/render-environment-yaml.mjs +133 -0
  686. package/scripts/slack-events-ctl.sh +177 -0
  687. package/scripts/slack-events-server.mjs +1045 -0
  688. package/scripts/slack-react.mjs +89 -0
  689. package/scripts/slack-responded.sh +232 -0
  690. package/scripts/slack-send.sh +287 -0
  691. package/scripts/slack-typing.mjs +196 -0
  692. package/scripts/slack-upload-v2.py +95 -0
  693. package/scripts/sms-handler.mjs +450 -0
  694. package/scripts/spawn-session.sh +120 -0
  695. package/scripts/sync-protocol.mjs +217 -0
  696. package/scripts/system-verify.sh +184 -0
  697. package/scripts/test-email-thread-dedup.py +239 -0
  698. package/scripts/test-information-barriers.py +484 -0
  699. package/scripts/test-llm-email-dedup.py +251 -0
  700. package/scripts/test-pre-draft-integration.py +203 -0
  701. package/scripts/test-rag-phase2.sh +442 -0
  702. package/scripts/test-rag-search.sh +251 -0
  703. package/scripts/test-voice-parser.mjs +316 -0
  704. package/scripts/user-context-search.py +659 -0
  705. package/scripts/validate_outbound.py +1504 -0
  706. package/scripts/watchdog/ai.maestro.memory-watchdog.plist +41 -0
  707. package/scripts/watchdog/force-reboot.sh +157 -0
  708. package/scripts/watchdog/memory-watchdog.sh +473 -0
  709. package/scripts/whatsapp-handler.mjs +538 -0
  710. package/teams/desktop-operations.yaml +34 -0
  711. package/teams/executive-office.yaml +27 -0
  712. package/teams/legal-and-regulatory.yaml +24 -0
  713. package/teams/platform-and-engineering.yaml +23 -0
  714. package/teams/strategy-and-growth.yaml +29 -0
  715. package/workflows/continuous/backlog-executor.yaml +141 -0
  716. package/workflows/continuous/inbound-monitor.yaml +168 -0
  717. package/workflows/daily/applicant-triage.yaml +197 -0
  718. package/workflows/daily/comms-triage.yaml +80 -0
  719. package/workflows/daily/evening-wrap.yaml +105 -0
  720. package/workflows/daily/morning-brief.yaml +164 -0
  721. package/workflows/daily/slack-followup-sweep.yaml +87 -0
  722. package/workflows/event-driven/README.md +50 -0
  723. package/workflows/event-driven/agent-failure-investigation.yaml +137 -0
  724. package/workflows/event-driven/pr-review.yaml +107 -0
  725. package/workflows/monthly/board-readiness.yaml +76 -0
  726. package/workflows/quarterly/strategic-scenario-analysis.yaml +85 -0
  727. package/workflows/session-protocol.md +171 -0
  728. package/workflows/weekly/engineering-health.yaml +154 -0
  729. package/workflows/weekly/hiring-review.yaml +169 -0
  730. package/workflows/weekly/rollup-pipeline-review.yaml +76 -0
  731. package/workflows/weekly/strategic-memo.yaml +79 -0
@@ -0,0 +1,222 @@
1
+ /**
2
+ * generate-agent-package-json.mjs — the generated-agent package.json builder.
3
+ *
4
+ * Why this module exists (gaps-product-quality P0-1)
5
+ * --------------------------------------------------
6
+ * `maestro create` scaffolds an agent repo and writes its package.json inline
7
+ * in bin/maestro.mjs. That generated package.json has two distribution-breaking
8
+ * holes, both adversarially confirmed in the packaging audit:
9
+ *
10
+ * 1. It does NOT depend on `@cohortapp/agent-sdk`. The documented upgrade path —
11
+ * `npm update @cohortapp/agent-sdk` (and the generated `upgrade`/`doctor`/`init`
12
+ * scripts that shell `npx @cohortapp/agent-sdk …`) — is therefore a no-op: npm
13
+ * has nothing to update, and npx re-fetches the latest tarball on every
14
+ * call instead of running the pinned version the agent was created against.
15
+ * 2. It omits `better-sqlite3` and `js-yaml` — the two real runtime deps of
16
+ * the framework. They are NOT pulled transitively, so the learning loop
17
+ * (sessions.db), RAG (embedding store), and every YAML-gated channel
18
+ * adapter reject at runtime on a freshly-created agent.
19
+ *
20
+ * This module factors the package.json shape into a pure function so it is
21
+ * unit-testable and so the create path can adopt it without re-deriving the
22
+ * dependency set. Pinning `@cohortapp/agent-sdk` to the *framework version that
23
+ * created the repo* also makes drift measurable (each agent records the version
24
+ * it was scaffolded from) and lets `npm update` actually move it forward.
25
+ *
26
+ * NOTE: wiring this into bin/maestro.mjs's `create()` is a follow-up — bin/ is
27
+ * out of this change's scope. Until then this is the single source of truth for
28
+ * the corrected shape, consumed by the writer below and by callers/tests.
29
+ *
30
+ * Node builtins only (maestro is "type":"module", near-zero-dep by design).
31
+ *
32
+ * @module scripts/setup/generate-agent-package-json
33
+ */
34
+
35
+ "use strict";
36
+
37
+ import { writeJsonAtomic } from "../../lib/fs-atomic.mjs";
38
+
39
+ /**
40
+ * The framework's own real runtime dependencies. These MUST be present in a
41
+ * generated agent's package.json because maestro modules `import` them directly
42
+ * and they are not guaranteed to be hoisted transitively from the
43
+ * `@cohortapp/agent-sdk` install. Kept in sync with the framework package.json
44
+ * "dependencies" block.
45
+ *
46
+ * @type {Readonly<Record<string,string>>}
47
+ */
48
+ export const FRAMEWORK_RUNTIME_DEPS = Object.freeze({
49
+ "better-sqlite3": "^12.10.0",
50
+ "js-yaml": "^4.1.1",
51
+ });
52
+
53
+ /**
54
+ * Extra runtime deps the scaffolded agent uses directly (email/IMAP, the
55
+ * Google GenAI + OpenAI SDKs, dotenv, execa). Preserved from the historical
56
+ * inline create() shape so adopting this builder is behaviour-preserving for
57
+ * everything except the maestro/core-dep fix.
58
+ *
59
+ * @type {Readonly<Record<string,string>>}
60
+ */
61
+ export const AGENT_EXTRA_DEPS = Object.freeze({
62
+ "@google/genai": "^1.42.0",
63
+ dotenv: "^16.4.5",
64
+ execa: "^9.6.1",
65
+ imapflow: "^1.2.18",
66
+ mailparser: "^3.9.6",
67
+ openai: "^6.33.0",
68
+ });
69
+
70
+ /** Dev deps preserved from the inline create() shape. @type {Readonly<Record<string,string>>} */
71
+ export const AGENT_DEV_DEPS = Object.freeze({
72
+ sharp: "^0.34.5",
73
+ tsx: "^4.20.6",
74
+ });
75
+
76
+ /** The scripts block preserved from the inline create() shape. @returns {Record<string,string>} */
77
+ function defaultScripts() {
78
+ return {
79
+ "init-agent": "./scripts/setup/init-agent.sh",
80
+ "configure-macos": "sudo ./scripts/setup/configure-macos.sh",
81
+ "configure-macos:check": "./scripts/setup/configure-macos.sh --check",
82
+ daemon: "node scripts/daemon/maestro-daemon.mjs",
83
+ "cadence:enqueue": "node scripts/cadence/enqueue-cadence-tick.mjs",
84
+ "cadence:consume": "node scripts/daemon/cadence-consumer.mjs",
85
+ "cadence:status": "node scripts/cadence/cadence-status.mjs",
86
+ healthcheck: "./scripts/healthcheck.sh",
87
+ "emergency-stop": "./scripts/emergency-stop.sh",
88
+ resume: "./scripts/resume-operations.sh",
89
+ "pdf:memo": "node scripts/pdf-generation/build-document.mjs --template memo",
90
+ "pdf:board-pack": "node scripts/pdf-generation/build-document.mjs --template board-pack",
91
+ "pdf:letter": "node scripts/pdf-generation/build-document.mjs --template corporate-letter",
92
+ "pdf:investor": "node scripts/pdf-generation/build-document.mjs --template investor-letter",
93
+ "gen:illustration": "node scripts/media-generation/generate-assets.mjs --illustration",
94
+ "gen:video": "node scripts/media-generation/generate-assets.mjs --video",
95
+ "gen:all-missing": "node scripts/media-generation/generate-assets.mjs --all-missing",
96
+ "gen:list": "node scripts/media-generation/generate-assets.mjs --list",
97
+ "slack:events": "node scripts/slack-events-server.mjs",
98
+ "slack:events:start": "./scripts/slack-events-ctl.sh start",
99
+ "slack:events:stop": "./scripts/slack-events-ctl.sh stop",
100
+ "slack:events:status": "./scripts/slack-events-ctl.sh status",
101
+ upgrade: "npx @cohortapp/agent-sdk upgrade",
102
+ init: "npx @cohortapp/agent-sdk init",
103
+ doctor: "npx @cohortapp/agent-sdk doctor",
104
+ };
105
+ }
106
+
107
+ /**
108
+ * Normalise an arbitrary framework version into a valid npm version range that
109
+ * pins `@cohortapp/agent-sdk`. A bare semver `1.18.0` is pinned exact-or-newer with
110
+ * a caret (`^1.18.0`) so `npm update` can advance within the major. A value
111
+ * that already carries a range operator (`^`, `~`, `>=`, `*`, a dist-tag like
112
+ * `latest`, or a url/path) is passed through untouched. Empty/invalid input
113
+ * falls back to `"latest"` so the dep is at least present (npm update can still
114
+ * resolve it) rather than omitted — which was the original bug.
115
+ *
116
+ * @param {string} [frameworkVersion]
117
+ * @returns {string}
118
+ */
119
+ export function pinMaestroVersion(frameworkVersion) {
120
+ const v = typeof frameworkVersion === "string" ? frameworkVersion.trim() : "";
121
+ if (!v) return "latest";
122
+ // Already a range / tag / url / path spec — respect it verbatim.
123
+ if (/^[\^~]|^[<>=]|[*x]|\s-\s|\|\||^[a-z]|[:/]/i.test(v)) return v;
124
+ // Bare semver (optionally with a prerelease/build) — caret-pin it.
125
+ if (/^\d+\.\d+\.\d+(?:[-+].*)?$/.test(v)) return `^${v}`;
126
+ // Partial like "1.18" or "1" — caret-pin as-is (valid npm range).
127
+ if (/^\d+(?:\.\d+)?$/.test(v)) return `^${v}`;
128
+ return v;
129
+ }
130
+
131
+ /**
132
+ * Build the package.json object for a freshly-created agent repo.
133
+ *
134
+ * The returned `dependencies` ALWAYS includes a pinned `@cohortapp/agent-sdk` plus
135
+ * the framework runtime deps (`better-sqlite3`, `js-yaml`) on top of the agent's
136
+ * own direct deps — closing P0-1's "npm update is a no-op / core deps missing"
137
+ * holes.
138
+ *
139
+ * Pure: no IO, deterministic for a given input. Sorts dependency keys so the
140
+ * generated file is stable across runs (avoids churny diffs on regenerate).
141
+ *
142
+ * @param {object} opts
143
+ * @param {string} opts.name - npm package name for the agent repo (the dir name).
144
+ * @param {string} [opts.frameworkVersion] - the @cohortapp/agent-sdk version the
145
+ * repo is created against; pinned via {@link pinMaestroVersion}.
146
+ * @param {string} [opts.description]
147
+ * @returns {object} package.json content as a plain object
148
+ */
149
+ export function buildAgentPackageJson(opts = {}) {
150
+ const name = typeof opts.name === "string" ? opts.name.trim() : "";
151
+ if (!name) throw new Error("buildAgentPackageJson: opts.name is required");
152
+
153
+ const dependencies = sortKeys({
154
+ "@cohortapp/agent-sdk": pinMaestroVersion(opts.frameworkVersion),
155
+ ...FRAMEWORK_RUNTIME_DEPS,
156
+ ...AGENT_EXTRA_DEPS,
157
+ });
158
+
159
+ return {
160
+ name,
161
+ version: "1.0.0",
162
+ description:
163
+ typeof opts.description === "string" && opts.description
164
+ ? opts.description
165
+ : "Maestro AI agent — configure with: maestro setup",
166
+ type: "module",
167
+ private: true,
168
+ scripts: defaultScripts(),
169
+ dependencies,
170
+ devDependencies: sortKeys({ ...AGENT_DEV_DEPS }),
171
+ };
172
+ }
173
+
174
+ /** Return a new object with keys sorted ascending (stable serialization). */
175
+ function sortKeys(obj) {
176
+ const out = {};
177
+ for (const k of Object.keys(obj).sort()) out[k] = obj[k];
178
+ return out;
179
+ }
180
+
181
+ /**
182
+ * Thin writer: build the package.json and atomically write it to
183
+ * `<targetDir>/package.json` (durable, crash-safe — uses the shared fs-atomic
184
+ * primitive so a half-written package.json can never ship).
185
+ *
186
+ * @param {string} targetDir - the agent repo root.
187
+ * @param {object} opts - forwarded to {@link buildAgentPackageJson}.
188
+ * @returns {object} the package.json object that was written.
189
+ */
190
+ export function writeAgentPackageJson(targetDir, opts = {}) {
191
+ if (typeof targetDir !== "string" || !targetDir) {
192
+ throw new Error("writeAgentPackageJson: targetDir is required");
193
+ }
194
+ const pkg = buildAgentPackageJson(opts);
195
+ // node:path import kept local to the writer so the pure builder stays IO-free.
196
+ const target = joinPath(targetDir, "package.json");
197
+ writeJsonAtomic(target, pkg);
198
+ return pkg;
199
+ }
200
+
201
+ /** Minimal join that avoids importing node:path at module top (builder stays pure-only at top level). */
202
+ function joinPath(dir, file) {
203
+ return dir.endsWith("/") ? `${dir}${file}` : `${dir}/${file}`;
204
+ }
205
+
206
+ // CLI: `node scripts/setup/generate-agent-package-json.mjs <name> [version] [targetDir]`
207
+ // Prints the generated package.json (or writes it if a targetDir is given).
208
+ if (import.meta.url === `file://${process.argv[1]}`) {
209
+ const [name, version, targetDir] = process.argv.slice(2);
210
+ if (!name) {
211
+ console.error(
212
+ "usage: generate-agent-package-json <name> [frameworkVersion] [targetDir]",
213
+ );
214
+ process.exit(2);
215
+ }
216
+ if (targetDir) {
217
+ const pkg = writeAgentPackageJson(targetDir, { name, frameworkVersion: version });
218
+ console.log(`wrote ${targetDir}/package.json (@cohortapp/agent-sdk ${pkg.dependencies["@cohortapp/agent-sdk"]})`);
219
+ } else {
220
+ console.log(JSON.stringify(buildAgentPackageJson({ name, frameworkVersion: version }), null, 2));
221
+ }
222
+ }
@@ -0,0 +1,143 @@
1
+ /**
2
+ * Tests for generate-agent-package-json.mjs — the generated-agent dependency fix
3
+ * (gaps-product-quality P0-1).
4
+ *
5
+ * Asserts the corrected package.json: a pinned `@cohortapp/agent-sdk` plus the real
6
+ * runtime deps (`better-sqlite3`, `js-yaml`) are always present, the version
7
+ * pin normaliser behaves, and the writer round-trips to disk.
8
+ *
9
+ * @module scripts/setup/generate-agent-package-json.test
10
+ */
11
+
12
+ import { describe, it } from "node:test";
13
+ import assert from "node:assert/strict";
14
+ import { mkdtempSync, readFileSync, rmSync } from "node:fs";
15
+ import path from "node:path";
16
+ import os from "node:os";
17
+
18
+ import {
19
+ buildAgentPackageJson,
20
+ writeAgentPackageJson,
21
+ pinMaestroVersion,
22
+ FRAMEWORK_RUNTIME_DEPS,
23
+ AGENT_EXTRA_DEPS,
24
+ } from "./generate-agent-package-json.mjs";
25
+
26
+ describe("buildAgentPackageJson: the P0-1 dependency fix", () => {
27
+ it("depends on a PINNED @cohortapp/agent-sdk (the npm update path is no longer a no-op)", () => {
28
+ const pkg = buildAgentPackageJson({ name: "acme-ai", frameworkVersion: "1.18.0" });
29
+ assert.equal(pkg.dependencies["@cohortapp/agent-sdk"], "^1.18.0");
30
+ });
31
+
32
+ it("includes the real framework runtime deps (better-sqlite3 + js-yaml)", () => {
33
+ const pkg = buildAgentPackageJson({ name: "acme-ai", frameworkVersion: "1.18.0" });
34
+ assert.equal(pkg.dependencies["better-sqlite3"], FRAMEWORK_RUNTIME_DEPS["better-sqlite3"]);
35
+ assert.equal(pkg.dependencies["js-yaml"], FRAMEWORK_RUNTIME_DEPS["js-yaml"]);
36
+ });
37
+
38
+ it("keeps the agent's own direct deps (email/SDK stack)", () => {
39
+ const pkg = buildAgentPackageJson({ name: "acme-ai" });
40
+ for (const dep of Object.keys(AGENT_EXTRA_DEPS)) {
41
+ assert.equal(pkg.dependencies[dep], AGENT_EXTRA_DEPS[dep], `missing ${dep}`);
42
+ }
43
+ });
44
+
45
+ it("produces the expected scaffold shape", () => {
46
+ const pkg = buildAgentPackageJson({ name: "acme-ai" });
47
+ assert.equal(pkg.name, "acme-ai");
48
+ assert.equal(pkg.type, "module");
49
+ assert.equal(pkg.private, true);
50
+ assert.equal(pkg.version, "1.0.0");
51
+ assert.ok(pkg.scripts && typeof pkg.scripts === "object");
52
+ // upgrade/init/doctor scripts shell @cohortapp/agent-sdk — now actually installed.
53
+ assert.match(pkg.scripts.upgrade, /@cohortapp\/agent-sdk upgrade/);
54
+ assert.ok(pkg.devDependencies.sharp);
55
+ });
56
+
57
+ it("dependency keys are sorted for stable serialization", () => {
58
+ const pkg = buildAgentPackageJson({ name: "acme-ai", frameworkVersion: "1.18.0" });
59
+ const keys = Object.keys(pkg.dependencies);
60
+ assert.deepEqual(keys, [...keys].sort());
61
+ // the SDK is pinned and present among the (sorted) dependency keys
62
+ assert.ok(keys.includes("@cohortapp/agent-sdk"));
63
+ });
64
+
65
+ it("trims the name and honours a custom description", () => {
66
+ const pkg = buildAgentPackageJson({ name: " bot-ai ", description: "Bot." });
67
+ assert.equal(pkg.name, "bot-ai");
68
+ assert.equal(pkg.description, "Bot.");
69
+ });
70
+
71
+ it("throws when name is missing", () => {
72
+ assert.throws(() => buildAgentPackageJson({}), /name is required/);
73
+ assert.throws(() => buildAgentPackageJson({ name: " " }), /name is required/);
74
+ });
75
+ });
76
+
77
+ describe("pinMaestroVersion", () => {
78
+ it("caret-pins a bare semver", () => {
79
+ assert.equal(pinMaestroVersion("1.18.0"), "^1.18.0");
80
+ });
81
+
82
+ it("caret-pins a partial version", () => {
83
+ assert.equal(pinMaestroVersion("1.18"), "^1.18");
84
+ assert.equal(pinMaestroVersion("2"), "^2");
85
+ });
86
+
87
+ it("passes through an existing range/tag/operator verbatim", () => {
88
+ assert.equal(pinMaestroVersion("^1.18.0"), "^1.18.0");
89
+ assert.equal(pinMaestroVersion("~1.18.0"), "~1.18.0");
90
+ assert.equal(pinMaestroVersion(">=1.0.0"), ">=1.0.0");
91
+ assert.equal(pinMaestroVersion("latest"), "latest");
92
+ assert.equal(pinMaestroVersion("*"), "*");
93
+ });
94
+
95
+ it("handles a prerelease semver", () => {
96
+ assert.equal(pinMaestroVersion("1.18.0-rc.1"), "^1.18.0-rc.1");
97
+ });
98
+
99
+ it("falls back to 'latest' for empty/invalid input (dep still present)", () => {
100
+ assert.equal(pinMaestroVersion(""), "latest");
101
+ assert.equal(pinMaestroVersion(undefined), "latest");
102
+ assert.equal(pinMaestroVersion(null), "latest");
103
+ });
104
+ });
105
+
106
+ describe("writeAgentPackageJson", () => {
107
+ it("atomically writes a valid, parseable package.json to disk", () => {
108
+ const dir = mkdtempSync(path.join(os.tmpdir(), "agent-pkg-"));
109
+ try {
110
+ const returned = writeAgentPackageJson(dir, {
111
+ name: "disk-ai",
112
+ frameworkVersion: "1.18.0",
113
+ });
114
+ const onDisk = JSON.parse(readFileSync(path.join(dir, "package.json"), "utf8"));
115
+ assert.equal(onDisk.name, "disk-ai");
116
+ assert.equal(onDisk.dependencies["@cohortapp/agent-sdk"], "^1.18.0");
117
+ assert.equal(onDisk.dependencies["better-sqlite3"], FRAMEWORK_RUNTIME_DEPS["better-sqlite3"]);
118
+ assert.equal(onDisk.dependencies["js-yaml"], FRAMEWORK_RUNTIME_DEPS["js-yaml"]);
119
+ assert.deepEqual(onDisk, returned);
120
+ } finally {
121
+ rmSync(dir, { recursive: true, force: true });
122
+ }
123
+ });
124
+
125
+ it("throws when targetDir is missing", () => {
126
+ assert.throws(() => writeAgentPackageJson("", { name: "x" }), /targetDir is required/);
127
+ });
128
+ });
129
+
130
+ describe("parity with the framework's declared runtime deps", () => {
131
+ it("FRAMEWORK_RUNTIME_DEPS matches the maestro package.json dependencies", () => {
132
+ const repoRoot = path.resolve(
133
+ path.dirname(new URL(import.meta.url).pathname),
134
+ "..",
135
+ "..",
136
+ );
137
+ const pkg = JSON.parse(readFileSync(path.join(repoRoot, "package.json"), "utf8"));
138
+ // Every framework runtime dep we inject must exist in the framework itself.
139
+ for (const dep of Object.keys(FRAMEWORK_RUNTIME_DEPS)) {
140
+ assert.ok(pkg.dependencies[dep], `framework no longer declares ${dep}`);
141
+ }
142
+ });
143
+ });
@@ -0,0 +1,60 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * generate-autonomy.mjs — write the agent's archetype-derived autonomy policy.
4
+ *
5
+ * Resolves the archetype (function × altitude) and renders
6
+ * policies/action-classification.yaml from lib/autonomy.mjs — replacing the
7
+ * hardcoded one-persona policy with one whose autonomy bands, decision rights,
8
+ * escalation, and per-action risk map reflect THIS agent's archetype. It lands
9
+ * at policies/action-classification.yaml, exactly where lib/voice/tool-bridge.mjs
10
+ * (and the pre-send/outbound checks) read it, so the gate is live.
11
+ *
12
+ * Execution contract mirrors the other generators (cwd = agent repo; MAESTRO_ROOT
13
+ * / AGENT_ROOT in env). Uses js-yaml.
14
+ *
15
+ * @module scripts/setup/generate-autonomy
16
+ */
17
+
18
+ "use strict";
19
+
20
+ import { readFileSync, writeFileSync, existsSync, mkdirSync } from "node:fs";
21
+ import { join, dirname, resolve } from "node:path";
22
+ import { fileURLToPath, pathToFileURL } from "node:url";
23
+
24
+ const here = dirname(fileURLToPath(import.meta.url));
25
+ const MAESTRO_ROOT =
26
+ process.env.MAESTRO_ROOT && existsSync(join(process.env.MAESTRO_ROOT, "lib", "autonomy.mjs"))
27
+ ? process.env.MAESTRO_ROOT
28
+ : resolve(here, "..", "..");
29
+ const AGENT_ROOT = process.env.AGENT_ROOT || process.cwd();
30
+
31
+ async function main() {
32
+ const { resolveArchetype, migrateLegacyArchetype } = await import(pathToFileURL(join(MAESTRO_ROOT, "lib", "archetype.mjs")).href);
33
+ const { buildActionClassification } = await import(pathToFileURL(join(MAESTRO_ROOT, "lib", "autonomy.mjs")).href);
34
+ const yamlMod = await import("js-yaml");
35
+ const yaml = yamlMod && yamlMod.default ? yamlMod.default : yamlMod;
36
+
37
+ const cfgPath = join(AGENT_ROOT, "config", "agent.json");
38
+ if (!existsSync(cfgPath)) { console.error(`[generate-autonomy] no config/agent.json at ${cfgPath}`); return 1; }
39
+ const identity = JSON.parse(readFileSync(cfgPath, "utf-8"));
40
+ const sel = identity.function && identity.altitude
41
+ ? { function: identity.function, altitude: identity.altitude }
42
+ : migrateLegacyArchetype(identity.archetype);
43
+ if (!sel) { console.error("[generate-autonomy] config/agent.json has no { function, altitude } archetype."); return 1; }
44
+
45
+ const profile = await resolveArchetype(sel);
46
+ const policy = buildActionClassification(profile, identity);
47
+
48
+ const out = join(AGENT_ROOT, "policies", "action-classification.yaml");
49
+ mkdirSync(dirname(out), { recursive: true });
50
+ writeFileSync(out, yaml.dump(policy, { lineWidth: 100, noRefs: true }), "utf-8");
51
+
52
+ const high = Object.values(policy.actions).filter((x) => x.risk === "high").length;
53
+ console.log(`[generate-autonomy] ${profile.label} (${profile.function} × ${profile.altitude}), breadth=${policy.delegation_breadth}`);
54
+ console.log(`[generate-autonomy] wrote policies/action-classification.yaml — ${policy.action_levels.execute_autonomous.examples.length} green / ${policy.action_levels.approval_preferred.examples.length} amber / ${policy.action_levels.escalate.examples.length} red bands; ${Object.keys(policy.actions).length} gated actions (${high} verbal-confirm).`);
55
+ return 0;
56
+ }
57
+
58
+ main()
59
+ .then((c) => process.exit(c))
60
+ .catch((e) => { console.error(`[generate-autonomy] FAILED: ${e && e.message ? e.message : e}`); process.exit(1); });
@@ -0,0 +1,101 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * generate-backlog.mjs — seed a proactive WBS backlog from the agent's resolved
4
+ * archetype profile (lib/archetype.mjs ⊕ lib/backlog.mjs) so the agent gets
5
+ * straight to work the moment the daemon starts.
6
+ *
7
+ * Writes:
8
+ * state/backlog/wbs.yaml — the WBS roll-up (streams → phases → epics → tasks)
9
+ * state/queues/backlog.yaml — first-30-day tasks materialised as backlog-executor items
10
+ * config/priorities.yaml — strategic priorities (one per stream)
11
+ *
12
+ * Run by the init wizard (and re-runnable via `maestro`). The wizard ENRICHES
13
+ * the WBS epics/tasks with company-specific content from the gathered context
14
+ * pack before/after this; even un-enriched the seed is real, actionable work.
15
+ *
16
+ * Execution contract mirrors init-archetype.mjs (cwd = agent repo; MAESTRO_ROOT
17
+ * / AGENT_ROOT in env). Uses js-yaml (a maestro runtime dep).
18
+ *
19
+ * @module scripts/setup/generate-backlog
20
+ */
21
+
22
+ "use strict";
23
+
24
+ import { readFileSync, writeFileSync, existsSync, mkdirSync } from "node:fs";
25
+ import { join, dirname, resolve } from "node:path";
26
+ import { fileURLToPath, pathToFileURL } from "node:url";
27
+
28
+ const here = dirname(fileURLToPath(import.meta.url));
29
+ const MAESTRO_ROOT =
30
+ process.env.MAESTRO_ROOT && existsSync(join(process.env.MAESTRO_ROOT, "lib", "backlog.mjs"))
31
+ ? process.env.MAESTRO_ROOT
32
+ : resolve(here, "..", "..");
33
+ const AGENT_ROOT = process.env.AGENT_ROOT || process.cwd();
34
+
35
+ async function main() {
36
+ const { resolveArchetype, migrateLegacyArchetype } = await import(pathToFileURL(join(MAESTRO_ROOT, "lib", "archetype.mjs")).href);
37
+ const { buildBacklogSkeleton, materializeReadyTasks, toQueueFile, countReadyTasks } = await import(pathToFileURL(join(MAESTRO_ROOT, "lib", "backlog.mjs")).href);
38
+ const yamlMod = await import("js-yaml");
39
+ const yaml = yamlMod && yamlMod.default ? yamlMod.default : yamlMod;
40
+
41
+ const cfgPath = join(AGENT_ROOT, "config", "agent.json");
42
+ if (!existsSync(cfgPath)) {
43
+ console.error(`[generate-backlog] no config/agent.json at ${cfgPath} — run from an agent repo.`);
44
+ return 1;
45
+ }
46
+ const identity = JSON.parse(readFileSync(cfgPath, "utf-8"));
47
+ const sel = identity.function && identity.altitude
48
+ ? { function: identity.function, altitude: identity.altitude }
49
+ : migrateLegacyArchetype(identity.archetype);
50
+ if (!sel) {
51
+ console.error("[generate-backlog] config/agent.json has no { function, altitude } archetype — run init-archetype first.");
52
+ return 1;
53
+ }
54
+ const profile = await resolveArchetype(sel);
55
+ const date = new Date().toISOString().slice(0, 10);
56
+ const owner = (identity.firstName || "agent").toLowerCase();
57
+
58
+ // The fetched org context (config/org-context.json — written by the Cohort
59
+ // bootstrap during `maestro setup`/`sync`) SHAPES the backlog: its strategy
60
+ // streams + ready-board frontier become the leading WBS streams. Fail-open —
61
+ // a standalone (un-enrolled) agent has no cache and gets the archetype-only
62
+ // skeleton unchanged. Loaded via the same loader the awareness SDK uses.
63
+ let orgContext = null;
64
+ try {
65
+ const { loadOrgContext } = await import(pathToFileURL(join(MAESTRO_ROOT, "lib", "org", "bootstrap-context.mjs")).href);
66
+ orgContext = loadOrgContext(AGENT_ROOT);
67
+ } catch {
68
+ orgContext = null;
69
+ }
70
+
71
+ const wbs = buildBacklogSkeleton(profile, identity, { date, orgContext });
72
+ const { queueItems, priorities } = materializeReadyTasks(wbs, { owner, date });
73
+
74
+ const dump = (obj) => yaml.dump(obj, { lineWidth: 100, noRefs: true });
75
+
76
+ const wbsPath = join(AGENT_ROOT, "state", "backlog", "wbs.yaml");
77
+ mkdirSync(dirname(wbsPath), { recursive: true });
78
+ writeFileSync(wbsPath, dump(wbs), "utf-8");
79
+
80
+ const queuePath = join(AGENT_ROOT, "state", "queues", "backlog.yaml");
81
+ mkdirSync(dirname(queuePath), { recursive: true });
82
+ writeFileSync(queuePath, dump(toQueueFile(queueItems, { queue: "backlog" })), "utf-8");
83
+
84
+ const prioPath = join(AGENT_ROOT, "config", "priorities.yaml");
85
+ mkdirSync(dirname(prioPath), { recursive: true });
86
+ writeFileSync(prioPath, dump({ priorities }), "utf-8");
87
+
88
+ console.log(`[generate-backlog] ${profile.label} (${profile.function} × ${profile.altitude})`);
89
+ if (wbs.orgContextApplied) {
90
+ console.log("[generate-backlog] org context APPLIED — strategy streams + ready-board frontier lead the backlog");
91
+ }
92
+ console.log(`[generate-backlog] state/backlog/wbs.yaml — ${wbs.streams.length} streams × 30/60/90, ${countReadyTasks(wbs)} ready tasks`);
93
+ console.log(`[generate-backlog] state/queues/backlog.yaml — ${queueItems.length} seeded items (status open)`);
94
+ console.log(`[generate-backlog] config/priorities.yaml — ${priorities.length} strategic priorities`);
95
+ console.log("[generate-backlog] NEXT: enrich the WBS epics/tasks with company-specific work from the init context pack, then re-run to re-materialise.");
96
+ return 0;
97
+ }
98
+
99
+ main()
100
+ .then((c) => process.exit(c))
101
+ .catch((e) => { console.error(`[generate-backlog] FAILED: ${e && e.message ? e.message : e}`); process.exit(1); });
@@ -0,0 +1,92 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * generate-cadences.mjs — write the agent's archetype-specific cadence set.
4
+ *
5
+ * Resolves the cadence set for the agent's { function, altitude } (lib/cadences.mjs)
6
+ * and writes:
7
+ * config/cadences.yaml — the full resolved cadence list (human SoT;
8
+ * read by cadence-handlers.mjs to route ticks)
9
+ * config/.cadence-plists.tsv — machine-readable params for the NON-standard
10
+ * (function/altitude) cadences, consumed by
11
+ * generate-plists.sh to emit launchd plists
12
+ * (id | interval | base64(scheduleXML), pipe-delimited).
13
+ *
14
+ * The standard cadences (inbox/backlog/meeting/daily/quarterly) are emitted by
15
+ * generate-plists.sh directly; this adds the archetype-specific ones on top, so
16
+ * a compliance officer and a founder get genuinely different schedules.
17
+ *
18
+ * Execution contract mirrors the other generators (cwd = agent repo; MAESTRO_ROOT
19
+ * / AGENT_ROOT in env). Uses js-yaml.
20
+ *
21
+ * @module scripts/setup/generate-cadences
22
+ */
23
+
24
+ "use strict";
25
+
26
+ import { readFileSync, writeFileSync, existsSync, mkdirSync } from "node:fs";
27
+ import { join, dirname, resolve } from "node:path";
28
+ import { fileURLToPath, pathToFileURL } from "node:url";
29
+
30
+ const here = dirname(fileURLToPath(import.meta.url));
31
+ const MAESTRO_ROOT =
32
+ process.env.MAESTRO_ROOT && existsSync(join(process.env.MAESTRO_ROOT, "lib", "cadences.mjs"))
33
+ ? process.env.MAESTRO_ROOT
34
+ : resolve(here, "..", "..");
35
+ const AGENT_ROOT = process.env.AGENT_ROOT || process.cwd();
36
+
37
+ /** Build the StartCalendarInterval dict-content XML expected by generate_trigger_plist. */
38
+ function scheduleXml(cal) {
39
+ let x = "";
40
+ if (cal.weekday != null) x += ` <key>Weekday</key>\n <integer>${cal.weekday}</integer>\n`;
41
+ if (cal.day != null) x += ` <key>Day</key>\n <integer>${cal.day}</integer>\n`;
42
+ x += ` <key>Hour</key>\n <integer>${cal.hour ?? 9}</integer>\n <key>Minute</key>\n <integer>${cal.minute ?? 0}</integer>`;
43
+ return x;
44
+ }
45
+
46
+ async function main() {
47
+ const { resolveArchetype, migrateLegacyArchetype } = await import(pathToFileURL(join(MAESTRO_ROOT, "lib", "archetype.mjs")).href);
48
+ const { resolveCadences } = await import(pathToFileURL(join(MAESTRO_ROOT, "lib", "cadences.mjs")).href);
49
+ const yamlMod = await import("js-yaml");
50
+ const yaml = yamlMod && yamlMod.default ? yamlMod.default : yamlMod;
51
+
52
+ const cfgPath = join(AGENT_ROOT, "config", "agent.json");
53
+ if (!existsSync(cfgPath)) { console.error(`[generate-cadences] no config/agent.json at ${cfgPath}`); return 1; }
54
+ const identity = JSON.parse(readFileSync(cfgPath, "utf-8"));
55
+ const sel = identity.function && identity.altitude
56
+ ? { function: identity.function, altitude: identity.altitude }
57
+ : migrateLegacyArchetype(identity.archetype);
58
+ if (!sel) { console.error("[generate-cadences] config/agent.json has no { function, altitude } archetype."); return 1; }
59
+ // resolveArchetype validates the pair; throws if invalid.
60
+ await resolveArchetype(sel);
61
+
62
+ const cadences = await resolveCadences(sel);
63
+
64
+ mkdirSync(join(AGENT_ROOT, "config"), { recursive: true });
65
+ writeFileSync(join(AGENT_ROOT, "config", "cadences.yaml"),
66
+ yaml.dump({ archetype: `${sel.function}@${sel.altitude}`, cadences }, { lineWidth: 100, noRefs: true }), "utf-8");
67
+
68
+ // TSV for the launchd plist generator — non-standard cadences only (standard
69
+ // ones are emitted by generate-plists.sh directly).
70
+ const lines = [];
71
+ for (const c of cadences) {
72
+ if (c.scope === "standard") continue;
73
+ if (typeof c.interval === "number") lines.push(`${c.id}|${c.interval}|`);
74
+ else if (c.calendar) lines.push(`${c.id}||${Buffer.from(scheduleXml(c.calendar), "utf-8").toString("base64")}`);
75
+ }
76
+ writeFileSync(join(AGENT_ROOT, "config", ".cadence-plists.tsv"), lines.join("\n") + (lines.length ? "\n" : ""), "utf-8");
77
+
78
+ // Routing registry (sync JSON for cadence-handlers.getCadenceDef): id → {mode, prompt}.
79
+ const registry = {};
80
+ for (const c of cadences) registry[c.id] = { mode: c.mode, prompt: c.prompt };
81
+ writeFileSync(join(AGENT_ROOT, "config", ".cadence-registry.json"), JSON.stringify(registry, null, 2) + "\n", "utf-8");
82
+
83
+ const std = cadences.filter((c) => c.scope === "standard").length;
84
+ console.log(`[generate-cadences] ${sel.function} × ${sel.altitude}: ${cadences.length} cadences (${std} standard + ${cadences.length - std} archetype-specific)`);
85
+ console.log(`[generate-cadences] wrote config/cadences.yaml + config/.cadence-plists.tsv (${lines.length} archetype plist entries)`);
86
+ console.log("[generate-cadences] run generate-plists.sh next to emit launchd plists (standard + archetype).");
87
+ return 0;
88
+ }
89
+
90
+ main()
91
+ .then((c) => process.exit(c))
92
+ .catch((e) => { console.error(`[generate-cadences] FAILED: ${e && e.message ? e.message : e}`); process.exit(1); });