@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,547 @@
1
+ #!/bin/bash
2
+ # =============================================================================
3
+ # init-agent.sh — One-line setup for a Northwind AI Agent Mac Mini
4
+ # =============================================================================
5
+ #
6
+ # Usage:
7
+ # npm run init-agent
8
+ # # or directly:
9
+ # ./scripts/setup/init-agent.sh
10
+ #
11
+ # This script bootstraps a fresh clone/fork of a Northwind AI agent repo on a
12
+ # new Mac Mini. It:
13
+ # 1. Validates prerequisites (Node, npm, Claude CLI)
14
+ # 2. Installs npm dependencies
15
+ # 3. Creates required state/log directories
16
+ # 4. Installs global Claude Code settings (~/.claude/settings.json)
17
+ # 5. Generates and installs macOS launchd plists
18
+ # 6. Loads all launchd agents
19
+ # 7. Runs a health check
20
+ #
21
+ # For identity refactoring (changing agent name/role), run:
22
+ # claude "/init-agent"
23
+ #
24
+ # =============================================================================
25
+
26
+ set -e
27
+ # Report which step failed instead of dying silently mid-setup.
28
+ trap 'echo "[init-agent] FAILED at line ${LINENO} (exit $?)" >&2' ERR
29
+
30
+ # ---------------------------------------------------------------------------
31
+ # Configuration
32
+ # ---------------------------------------------------------------------------
33
+
34
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
35
+ AGENT_DIR="$(cd "$SCRIPT_DIR/../.." && pwd)"
36
+ AGENT_NAME=$(basename "$AGENT_DIR") # e.g. "ravi-ai", "jacob-ai"
37
+
38
+ # Colours
39
+ RED='\033[0;31m'
40
+ GREEN='\033[0;32m'
41
+ YELLOW='\033[1;33m'
42
+ BLUE='\033[0;34m'
43
+ NC='\033[0m' # No Color
44
+
45
+ log() { echo -e "${BLUE}[init]${NC} $1"; }
46
+ ok() { echo -e "${GREEN} ✓${NC} $1"; }
47
+ warn() { echo -e "${YELLOW} ⚠${NC} $1"; }
48
+ fail() { echo -e "${RED} ✗${NC} $1"; exit 1; }
49
+
50
+ # ---------------------------------------------------------------------------
51
+ # Step 0: Banner
52
+ # ---------------------------------------------------------------------------
53
+
54
+ echo ""
55
+ echo "╔══════════════════════════════════════════════════════════════╗"
56
+ echo "║ Maestro — AI Agent Machine Setup ║"
57
+ echo "╠══════════════════════════════════════════════════════════════╣"
58
+ echo "║ Agent directory: $AGENT_DIR"
59
+ echo "║ Agent name: $AGENT_NAME"
60
+ echo "╚══════════════════════════════════════════════════════════════╝"
61
+ echo ""
62
+
63
+ # ---------------------------------------------------------------------------
64
+ # Step 1: Prerequisites
65
+ # ---------------------------------------------------------------------------
66
+
67
+ log "Checking prerequisites..."
68
+
69
+ # Node.js
70
+ if ! command -v node &>/dev/null; then
71
+ fail "Node.js not found. Install via: brew install node"
72
+ fi
73
+ NODE_VERSION=$(node --version)
74
+ ok "Node.js $NODE_VERSION"
75
+
76
+ # npm
77
+ if ! command -v npm &>/dev/null; then
78
+ fail "npm not found."
79
+ fi
80
+ NPM_VERSION=$(npm --version)
81
+ ok "npm v$NPM_VERSION"
82
+
83
+ # Check for legacy standalone npx (known to break on Node 25+)
84
+ LEGACY_NPX="$HOME/.npm-global/lib/node_modules/npx"
85
+ if [ -d "$LEGACY_NPX" ]; then
86
+ warn "Legacy standalone npx detected at $LEGACY_NPX"
87
+ warn "This causes 'cb.apply is not a function' errors on Node 25+"
88
+ # Prompt only when a console is attached; on unattended runs default to
89
+ # removing it (override with MAESTRO_REMOVE_LEGACY_NPX=0 to keep).
90
+ REMOVE_NPX="${MAESTRO_REMOVE_LEGACY_NPX:-Y}"
91
+ if [ -t 0 ] && [ -z "${MAESTRO_REMOVE_LEGACY_NPX:-}" ]; then
92
+ read -p " Remove it? (recommended) [Y/n]: " REMOVE_NPX
93
+ fi
94
+ if [ "${REMOVE_NPX:-Y}" != "n" ] && [ "${REMOVE_NPX:-Y}" != "N" ] && [ "${REMOVE_NPX:-Y}" != "0" ]; then
95
+ npm uninstall -g npx 2>/dev/null || true
96
+ ok "Removed legacy npx"
97
+ fi
98
+ fi
99
+
100
+ # Claude CLI
101
+ if ! command -v claude &>/dev/null; then
102
+ warn "Claude CLI not found. Install via: npm install -g @anthropic-ai/claude-code"
103
+ warn "Some features (scheduled triggers, init-agent command) require it."
104
+ else
105
+ CLAUDE_VERSION=$(claude --version 2>/dev/null | head -1)
106
+ ok "Claude CLI: $CLAUDE_VERSION"
107
+ fi
108
+
109
+ # jq (used by hooks)
110
+ if ! command -v jq &>/dev/null; then
111
+ warn "jq not found. Install via: brew install jq"
112
+ warn "Hook commands use jq — they'll fail silently without it."
113
+ else
114
+ ok "jq $(jq --version 2>/dev/null)"
115
+ fi
116
+
117
+ echo ""
118
+
119
+ # ---------------------------------------------------------------------------
120
+ # Step 1b: Claude-Mem (persistent session memory plugin)
121
+ # ---------------------------------------------------------------------------
122
+
123
+ log "Setting up Claude-Mem (persistent session memory)..."
124
+
125
+ if command -v claude &>/dev/null; then
126
+ # Install via Claude Code plugin system
127
+ if npx claude-mem install --non-interactive 2>/dev/null; then
128
+ ok "Claude-Mem installed and configured"
129
+ else
130
+ warn "Claude-Mem auto-install failed — install manually: npx claude-mem install"
131
+ fi
132
+ else
133
+ warn "Claude CLI required for Claude-Mem — install Claude CLI first, then run: npx claude-mem install"
134
+ fi
135
+
136
+ echo ""
137
+
138
+ # ---------------------------------------------------------------------------
139
+ # Step 1c: Claude-Pace (real-time rate limit tracker)
140
+ # ---------------------------------------------------------------------------
141
+
142
+ log "Setting up Claude-Pace (rate limit tracker)..."
143
+
144
+ if command -v claude &>/dev/null; then
145
+ # Install via Claude Code plugin system
146
+ if claude plugin marketplace add Astro-Han/claude-pace 2>/dev/null && \
147
+ claude plugin install claude-pace 2>/dev/null; then
148
+ ok "Claude-Pace installed"
149
+ else
150
+ warn "Claude-Pace auto-install failed — install manually:"
151
+ warn " claude plugin marketplace add Astro-Han/claude-pace"
152
+ warn " claude plugin install claude-pace"
153
+ fi
154
+ else
155
+ warn "Claude CLI required for Claude-Pace — install Claude CLI first"
156
+ fi
157
+
158
+ echo ""
159
+
160
+ # ---------------------------------------------------------------------------
161
+ # Step 1d: Claudraband (persistent sessions + daemon mode) [optional]
162
+ # ---------------------------------------------------------------------------
163
+
164
+ log "Checking claudraband availability (persistent session backend)..."
165
+
166
+ if npx @halfwhey/claudraband --version &>/dev/null 2>&1; then
167
+ ok "Claudraband available (npx @halfwhey/claudraband)"
168
+ else
169
+ warn "Claudraband not cached — will be fetched on first use via npx"
170
+ warn " Pre-cache: npx @halfwhey/claudraband --version"
171
+ fi
172
+
173
+ echo ""
174
+
175
+ # ---------------------------------------------------------------------------
176
+ # Step 1e: ClawTeam swarm orchestrator [optional]
177
+ # ---------------------------------------------------------------------------
178
+
179
+ if [ "${MAESTRO_ENABLE_SWARM:-0}" = "1" ]; then
180
+ log "Setting up ClawTeam swarm orchestrator..."
181
+
182
+ CLAWTEAM_DIR="$HOME/ClawTeam-OpenClaw"
183
+ if [ -d "$CLAWTEAM_DIR" ]; then
184
+ ok "ClawTeam already cloned at $CLAWTEAM_DIR"
185
+ (cd "$CLAWTEAM_DIR" && git pull --ff-only 2>/dev/null) && ok "ClawTeam updated" || warn "ClawTeam update failed — check manually"
186
+ else
187
+ if git clone https://github.com/win4r/ClawTeam-OpenClaw.git "$CLAWTEAM_DIR" 2>/dev/null; then
188
+ ok "ClawTeam cloned to $CLAWTEAM_DIR"
189
+ else
190
+ warn "ClawTeam clone failed — install manually: git clone https://github.com/win4r/ClawTeam-OpenClaw.git ~/ClawTeam-OpenClaw"
191
+ fi
192
+ fi
193
+
194
+ # Ensure tmux is available (required by ClawTeam)
195
+ if ! command -v tmux &>/dev/null; then
196
+ warn "tmux not found — ClawTeam requires tmux. Install via: brew install tmux"
197
+ else
198
+ ok "tmux $(tmux -V 2>/dev/null)"
199
+ fi
200
+
201
+ echo ""
202
+ else
203
+ log "Skipping ClawTeam (set MAESTRO_ENABLE_SWARM=1 to enable)"
204
+ echo ""
205
+ fi
206
+
207
+ # ---------------------------------------------------------------------------
208
+ # Step 2: npm install
209
+ # ---------------------------------------------------------------------------
210
+
211
+ log "Installing npm dependencies..."
212
+ cd "$AGENT_DIR"
213
+ npm install --silent 2>&1 | tail -3
214
+ ok "Dependencies installed"
215
+ echo ""
216
+
217
+ # ---------------------------------------------------------------------------
218
+ # Step 3: Create directories
219
+ # ---------------------------------------------------------------------------
220
+
221
+ log "Creating state and log directories..."
222
+
223
+ DIRS=(
224
+ "config"
225
+ "knowledge/decisions"
226
+ "knowledge/decisions/archive"
227
+ "knowledge/entities"
228
+ "knowledge/memory"
229
+ "knowledge/sources"
230
+ "knowledge/syntheses"
231
+ "memory/interactions"
232
+ "memory/profiles/users"
233
+ "memory/profiles/channels"
234
+ "memory/precedents"
235
+ "memory/precedents/market-signals"
236
+ "memory/indexes"
237
+ "memory/templates"
238
+ "state/inbox/slack"
239
+ "state/inbox/gmail"
240
+ "state/inbox/calendar"
241
+ "state/inbox/sms"
242
+ "state/inbox/whatsapp"
243
+ "state/inbox/internal"
244
+ "state/inbox/attachments"
245
+ "state/inbox/processed"
246
+ "state/queues"
247
+ "state/dashboards"
248
+ "state/polling"
249
+ "state/locks/outbound"
250
+ "state/triggers/priority"
251
+ "state/handoffs"
252
+ "state/huddle"
253
+ "state/indexes"
254
+ "state/rag"
255
+ "state/sessions"
256
+ "state/slack-responded"
257
+ "state/slack-thread-tracker"
258
+ "state/tmp"
259
+ "outputs/briefs"
260
+ "outputs/drafts"
261
+ "outputs/memos"
262
+ "outputs/research"
263
+ "outputs/tasks"
264
+ "outputs/sessions"
265
+ "logs/polling"
266
+ "logs/workflows"
267
+ "logs/sessions"
268
+ "logs/audit"
269
+ "logs/security"
270
+ "logs/evolution"
271
+ "logs/huddle"
272
+ "logs/daemon"
273
+ "logs/infra"
274
+ "logs/monitor"
275
+ "logs/phone"
276
+ "logs/sms"
277
+ "logs/whatsapp"
278
+ "logs/email"
279
+ "self-optimization/scenarios"
280
+ "tests"
281
+ )
282
+
283
+ for dir in "${DIRS[@]}"; do
284
+ mkdir -p "$AGENT_DIR/$dir"
285
+ done
286
+ ok "Created ${#DIRS[@]} directories"
287
+ echo ""
288
+
289
+ # ---------------------------------------------------------------------------
290
+ # Step 4: Global Claude Code settings
291
+ # ---------------------------------------------------------------------------
292
+
293
+ log "Setting up global Claude Code settings..."
294
+
295
+ CLAUDE_SETTINGS_DIR="$HOME/.claude"
296
+ CLAUDE_SETTINGS="$CLAUDE_SETTINGS_DIR/settings.json"
297
+ mkdir -p "$CLAUDE_SETTINGS_DIR"
298
+
299
+ # What maestro needs in the *global* settings. This is DEEP-MERGED into any
300
+ # pre-existing settings.json — we never overwrite the operator's file, never
301
+ # install an allow-all `permissions.allow` block, and never wire unpinned
302
+ # third-party hooks. Outbound governance permissions live in each agent repo's
303
+ # project `.claude/settings.json`; the global file stays least-privilege.
304
+ #
305
+ # (The previous PreToolUse/PostToolUse hooks invoked an unpinned, @latest
306
+ # third-party npm package on every Bash/file call fleet-wide — a supply-chain
307
+ # RCE vector — and have been removed entirely. Collective-memory hooks are
308
+ # wired separately and idempotently by `maestro global-setup` below, which
309
+ # deep-merges its own hooks.)
310
+ MAESTRO_SETTINGS_ADDITIONS='{
311
+ "$schema": "https://json.schemastore.org/claude-code-settings.json",
312
+ "enabledPlugins": {
313
+ "frontend-design@claude-plugins-official": true,
314
+ "superpowers@claude-plugins-official": true,
315
+ "context7@claude-plugins-official": true,
316
+ "code-review@claude-plugins-official": true,
317
+ "code-simplifier@claude-plugins-official": true,
318
+ "feature-dev@claude-plugins-official": true,
319
+ "playwright@claude-plugins-official": true,
320
+ "ralph-loop@claude-plugins-official": true,
321
+ "claude-md-management@claude-plugins-official": true,
322
+ "commit-commands@claude-plugins-official": true,
323
+ "skill-creator@claude-plugins-official": true,
324
+ "pr-review-toolkit@claude-plugins-official": true,
325
+ "claude-code-setup@claude-plugins-official": true,
326
+ "agent-sdk-dev@claude-plugins-official": true,
327
+ "plugin-dev@claude-plugins-official": true,
328
+ "hookify@claude-plugins-official": true,
329
+ "huggingface-skills@claude-plugins-official": true,
330
+ "railway@claude-plugins-official": true,
331
+ "netlify-skills@claude-plugins-official": true,
332
+ "telegram@claude-plugins-official": true,
333
+ "chrome-devtools-mcp@claude-plugins-official": true,
334
+ "remember@claude-plugins-official": true,
335
+ "mcp-server-dev@claude-plugins-official": true,
336
+ "zapier@claude-plugins-official": true,
337
+ "explanatory-output-style@claude-plugins-official": true,
338
+ "learning-output-style@claude-plugins-official": true,
339
+ "claude-mem": true,
340
+ "claude-pace": true
341
+ },
342
+ "effortLevel": "high"
343
+ }'
344
+
345
+ # Deep-merge MAESTRO_SETTINGS_ADDITIONS into the existing (or empty) settings.
346
+ # Existing user keys win on scalar conflicts; objects merge recursively. We
347
+ # never emit a `permissions.allow` allow-all block and refuse to introduce one
348
+ # even if the additions ever grew one by accident. The merge runs in node
349
+ # (always present) rather than jq: the user-keys-win recursive semantics plus
350
+ # the allow-all guard are easier to get right — and to unit-test — as one
351
+ # implementation than to maintain divergent jq and node code paths. The prior
352
+ # file is backed up once before any write.
353
+ if [ -f "$CLAUDE_SETTINGS" ]; then
354
+ BACKUP="$CLAUDE_SETTINGS.backup.$(date +%Y%m%d-%H%M%S)"
355
+ cp "$CLAUDE_SETTINGS" "$BACKUP"
356
+ warn "Existing settings backed up to $BACKUP"
357
+ fi
358
+
359
+ # --- BEGIN maestro settings deep-merge (kept testable; do not edit markers) ---
360
+ # The node program below is the source of truth for the deep-merge. It reads the
361
+ # existing settings from $1 (may be missing/empty/invalid) and the additions
362
+ # JSON from stdin, writes the merged result to $2. init-agent.test.mjs extracts
363
+ # and exercises this exact program.
364
+ MAESTRO_MERGE_NODE='
365
+ const fs = require("fs");
366
+ // argv layout differs between `node prog.cjs in out` (argv = [node, prog, in,
367
+ // out]) and `node -e <prog> in out` (argv = [node, in, out]); take the last two
368
+ // positional args so both invocation styles resolve in/out correctly.
369
+ const [inPath, outPath] = process.argv.slice(-2);
370
+ const isObj = (v) => v && typeof v === "object" && !Array.isArray(v);
371
+ // Deep-merge: existing (base) keys win on scalar conflicts; objects recurse.
372
+ // Arrays from additions are only used when the base has no value at that key.
373
+ function merge(base, add) {
374
+ const out = isObj(base) ? { ...base } : {};
375
+ for (const k of Object.keys(add)) {
376
+ if (isObj(add[k]) && isObj(out[k])) out[k] = merge(out[k], add[k]);
377
+ else if (!(k in out)) out[k] = add[k];
378
+ // else: base already has this key — keep the user value, do not clobber.
379
+ }
380
+ return out;
381
+ }
382
+ let existing = {};
383
+ try { existing = JSON.parse(fs.readFileSync(inPath, "utf8")) || {}; } catch { existing = {}; }
384
+ if (!isObj(existing)) existing = {};
385
+ let additions = {};
386
+ try { additions = JSON.parse(fs.readFileSync(0, "utf8")) || {}; } catch { additions = {}; }
387
+ const merged = merge(existing, additions);
388
+ // Hard guard: maestro must never introduce a machine-wide allow-all block.
389
+ // We only strip an allow list we would have *added* (i.e. when the user had
390
+ // none); a pre-existing user allow list is preserved untouched.
391
+ if (!isObj(existing.permissions) || !("allow" in (existing.permissions || {}))) {
392
+ if (isObj(merged.permissions) && "allow" in merged.permissions) {
393
+ delete merged.permissions.allow;
394
+ if (Object.keys(merged.permissions).length === 0) delete merged.permissions;
395
+ }
396
+ }
397
+ fs.writeFileSync(outPath, JSON.stringify(merged, null, 2) + "\n");
398
+ '
399
+ # --- END maestro settings deep-merge ---
400
+
401
+ MERGED_TMP="$CLAUDE_SETTINGS.merge.$$"
402
+ if printf '%s' "$MAESTRO_SETTINGS_ADDITIONS" | node -e "$MAESTRO_MERGE_NODE" "$CLAUDE_SETTINGS" "$MERGED_TMP"; then
403
+ mv "$MERGED_TMP" "$CLAUDE_SETTINGS"
404
+ ok "Global Claude settings deep-merged (existing keys preserved; no allow-all block)"
405
+ else
406
+ rm -f "$MERGED_TMP"
407
+ warn "Settings deep-merge failed — leaving existing ~/.claude/settings.json untouched"
408
+ fi
409
+ echo ""
410
+
411
+ # ---------------------------------------------------------------------------
412
+ # Wire collective memory + presence + org mesh into the global Claude config.
413
+ # Idempotent + additive: deep-merges onto the settings just written above so
414
+ # every Claude Code session on this machine contributes to + recalls from this
415
+ # agent's long-term memory. See docs/architecture/collective-memory-and-org-mesh.md.
416
+ # ---------------------------------------------------------------------------
417
+ log "Wiring collective memory (global-setup)..."
418
+ MAESTRO_PKG_BIN="$AGENT_DIR/node_modules/@cohortapp/agent-sdk/bin/maestro.mjs"
419
+ if [ -f "$MAESTRO_PKG_BIN" ]; then
420
+ ( cd "$AGENT_DIR" && node "$MAESTRO_PKG_BIN" global-setup ) || log "global-setup skipped (non-fatal)"
421
+ elif [ -f "$AGENT_DIR/bin/maestro.mjs" ]; then
422
+ ( cd "$AGENT_DIR" && node "$AGENT_DIR/bin/maestro.mjs" global-setup ) || log "global-setup skipped (non-fatal)"
423
+ else
424
+ log "global-setup skipped — maestro CLI not found (run: npx @cohortapp/agent-sdk global-setup)"
425
+ fi
426
+ echo ""
427
+
428
+ # ---------------------------------------------------------------------------
429
+ # Step 5: Generate and install launchd plists
430
+ # ---------------------------------------------------------------------------
431
+
432
+ log "Generating and installing macOS launchd agents..."
433
+
434
+ LAUNCH_AGENTS_DIR="$HOME/Library/LaunchAgents"
435
+ PLIST_GENERATOR="$AGENT_DIR/scripts/local-triggers/generate-plists.sh"
436
+ PLIST_DIR="$AGENT_DIR/scripts/local-triggers/plists"
437
+ mkdir -p "$LAUNCH_AGENTS_DIR"
438
+
439
+ # Generate plists from agent config (handles agent name substitution)
440
+ if [ -x "$PLIST_GENERATOR" ]; then
441
+ bash "$PLIST_GENERATOR"
442
+ ok "Generated plist files from agent config"
443
+ else
444
+ warn "Plist generator not found at $PLIST_GENERATOR — using existing plists"
445
+ fi
446
+
447
+ if [ -d "$PLIST_DIR" ] && ls "$PLIST_DIR"/*.plist &>/dev/null; then
448
+ for plist in "$PLIST_DIR"/*.plist; do
449
+ PLIST_NAME=$(basename "$plist")
450
+ LABEL=$(basename "$plist" .plist)
451
+ DST="$LAUNCH_AGENTS_DIR/$PLIST_NAME"
452
+
453
+ # Unload if already loaded
454
+ launchctl unload "$DST" 2>/dev/null || true
455
+
456
+ # Copy and load
457
+ cp "$plist" "$DST"
458
+ launchctl load "$DST"
459
+ ok "Loaded: $LABEL"
460
+ done
461
+ else
462
+ warn "No plist files found in $PLIST_DIR — skipping launchd setup"
463
+ fi
464
+
465
+ echo ""
466
+
467
+ # ---------------------------------------------------------------------------
468
+ # Step 6: Environment file
469
+ # ---------------------------------------------------------------------------
470
+
471
+ log "Checking environment configuration..."
472
+
473
+ ENV_FILE="$AGENT_DIR/.env"
474
+ if [ ! -f "$ENV_FILE" ]; then
475
+ cat > "$ENV_FILE" << 'ENV_EOF'
476
+ # Maestro — AI Agent Environment Variables
477
+ # See .env.example for full documentation of all variables
478
+
479
+ # Slack
480
+ SLACK_USER_TOKEN=
481
+ SLACK_BOT_TOKEN=
482
+ SLACK_SIGNING_SECRET=
483
+
484
+ # Gmail (OAuth)
485
+ GMAIL_CLIENT_ID=
486
+ GMAIL_CLIENT_SECRET=
487
+ GMAIL_REFRESH_TOKEN=
488
+
489
+ # Google Calendar
490
+ GCAL_CLIENT_ID=
491
+ GCAL_CLIENT_SECRET=
492
+ GCAL_REFRESH_TOKEN=
493
+
494
+ # Twilio (SMS/Phone)
495
+ TWILIO_ACCOUNT_SID=
496
+ TWILIO_AUTH_TOKEN=
497
+ TWILIO_PHONE_NUMBER=
498
+
499
+ # Gemini (Media generation)
500
+ GEMINI_API_KEY=
501
+
502
+ # Cloudflare Tunnel
503
+ TUNNEL_TOKEN=
504
+ ENV_EOF
505
+ chmod 600 "$ENV_FILE" # credentials must not be world-readable
506
+ warn "Created .env template — fill in your API keys before running"
507
+ else
508
+ chmod 600 "$ENV_FILE" # harden perms on any pre-existing .env
509
+ ok ".env file exists"
510
+ fi
511
+
512
+ echo ""
513
+
514
+ # ---------------------------------------------------------------------------
515
+ # Step 7: Health check
516
+ # ---------------------------------------------------------------------------
517
+
518
+ log "Running health check..."
519
+
520
+ if [ -f "$AGENT_DIR/scripts/healthcheck.sh" ]; then
521
+ bash "$AGENT_DIR/scripts/healthcheck.sh" 2>&1 | head -20 || true
522
+ else
523
+ warn "healthcheck.sh not found — skipping"
524
+ fi
525
+
526
+ echo ""
527
+
528
+ # ---------------------------------------------------------------------------
529
+ # Done
530
+ # ---------------------------------------------------------------------------
531
+
532
+ echo "╔══════════════════════════════════════════════════════════════╗"
533
+ echo "║ Setup Complete ║"
534
+ echo "╠══════════════════════════════════════════════════════════════╣"
535
+ echo "║ ║"
536
+ echo "║ Next steps: ║"
537
+ echo "║ ║"
538
+ echo "║ 1. Fill in API keys in .env ║"
539
+ echo "║ 2. Configure the agent (deterministic wizard): ║"
540
+ echo "║ cd $AGENT_DIR"
541
+ echo "║ maestro setup ║"
542
+ echo "║ ║"
543
+ echo "║ 3. Verify launchd agents: ║"
544
+ echo "║ launchctl list | grep \"$AGENT_NAME\""
545
+ echo "║ ║"
546
+ echo "╚══════════════════════════════════════════════════════════════╝"
547
+ echo ""