@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.
- package/.claude/commands/init-agent.md +104 -0
- package/.claude/commands/init-maestro.md +1187 -0
- package/.claude/settings.json +161 -0
- package/.env.example +216 -0
- package/README.md +632 -0
- package/agents/browser-operator/agent.md +52 -0
- package/agents/calendar-ops/agent.md +50 -0
- package/agents/communications/agent.md +96 -0
- package/agents/decision-log/agent.md +65 -0
- package/agents/desktop-operator/agent.md +59 -0
- package/agents/gmail-operator/agent.md +62 -0
- package/agents/inbound-dispatcher/agent.md +66 -0
- package/agents/inbox-processor/agent.md +39 -0
- package/agents/pmo-execution/agent.md +60 -0
- package/agents/session-spawner/agent.md +64 -0
- package/agents/slack-operator/agent.md +60 -0
- package/agents/whatsapp-operator/agent.md +60 -0
- package/agents/workflow-automation/agent.md +61 -0
- package/archetypes/altitudes/c-suite.yaml +58 -0
- package/archetypes/altitudes/founder.yaml +68 -0
- package/archetypes/altitudes/senior-manager.yaml +63 -0
- package/archetypes/altitudes/svp.yaml +60 -0
- package/archetypes/altitudes/vp.yaml +50 -0
- package/archetypes/archetype.schema.json +77 -0
- package/archetypes/base.yaml +47 -0
- package/archetypes/capabilities/commercial-leader.yaml +159 -0
- package/archetypes/capabilities/compliance-officer.yaml +159 -0
- package/archetypes/capabilities/executive-operator.yaml +169 -0
- package/archetypes/capabilities/finance-leader.yaml +162 -0
- package/archetypes/capabilities/operations-leader.yaml +154 -0
- package/archetypes/capabilities/product-leader.yaml +148 -0
- package/archetypes/capabilities/technical-leader.yaml +146 -0
- package/archetypes/functions/commercial-leader.yaml +62 -0
- package/archetypes/functions/compliance-officer.yaml +64 -0
- package/archetypes/functions/executive-operator.yaml +70 -0
- package/archetypes/functions/finance-leader.yaml +70 -0
- package/archetypes/functions/operations-leader.yaml +62 -0
- package/archetypes/functions/product-leader.yaml +61 -0
- package/archetypes/functions/technical-leader.yaml +57 -0
- package/bin/cohort-mcp.mjs +81 -0
- package/bin/maestro.mjs +3516 -0
- package/bin/maestro.test.mjs +1015 -0
- package/desktop-control/README.md +56 -0
- package/desktop-control/app-profiles/gmail.yaml +120 -0
- package/desktop-control/app-profiles/slack.yaml +315 -0
- package/desktop-control/app-profiles/whatsapp.yaml +107 -0
- package/docs/architecture/agent-topology.md +2239 -0
- package/docs/architecture/archetype-agent-factory.md +110 -0
- package/docs/architecture/collective-memory-and-org-mesh.md +115 -0
- package/docs/architecture/continuous-monitoring.md +221 -0
- package/docs/architecture/mcp-capability-map.md +585 -0
- package/docs/architecture/system-architecture.md +1272 -0
- package/docs/company-context/README.md +40 -0
- package/docs/guides/agent-persona-setup.md +600 -0
- package/docs/guides/agents-observe-setup.md +64 -0
- package/docs/guides/billing-console-keys.md +88 -0
- package/docs/guides/ccxray-diagnostics.md +65 -0
- package/docs/guides/channel-bus.md +127 -0
- package/docs/guides/claude-mem-setup.md +79 -0
- package/docs/guides/claude-pace-setup.md +56 -0
- package/docs/guides/claudraband-sessions.md +98 -0
- package/docs/guides/clawteam-swarm.md +116 -0
- package/docs/guides/code-review-graph-setup.md +86 -0
- package/docs/guides/email-setup.md +431 -0
- package/docs/guides/mac-mini.md +119 -0
- package/docs/guides/media-generation-setup.md +349 -0
- package/docs/guides/model-routing.md +162 -0
- package/docs/guides/observability-otel.md +265 -0
- package/docs/guides/org-onboarding.md +132 -0
- package/docs/guides/outbound-governance-setup.md +437 -0
- package/docs/guides/pdf-generation-setup.md +315 -0
- package/docs/guides/poller-daemon-setup.md +563 -0
- package/docs/guides/rag-context-setup.md +459 -0
- package/docs/guides/self-optimization-pattern.md +82 -0
- package/docs/guides/setup-wizard.md +178 -0
- package/docs/guides/slack-setup.md +350 -0
- package/docs/guides/telegram-setup.md +227 -0
- package/docs/guides/twilio-subaccounts-setup.md +223 -0
- package/docs/guides/verification.md +128 -0
- package/docs/guides/voice-mode.md +188 -0
- package/docs/guides/voice-sms-setup.md +698 -0
- package/docs/guides/webhook-relay-setup.md +349 -0
- package/docs/guides/whatsapp-setup.md +288 -0
- package/docs/prompts/board-pack-cover-template.md +36 -0
- package/docs/prompts/decision-recommendation-template.md +88 -0
- package/docs/prompts/followup-message-template.md +141 -0
- package/docs/prompts/investor-letter-template.md +52 -0
- package/docs/prompts/morning-brief-template.md +82 -0
- package/docs/prompts/presentation-template.md +58 -0
- package/docs/prompts/weekly-strategic-memo-template.md +104 -0
- package/docs/research/hallucinated-tool-output-investigation.md +151 -0
- package/docs/runbooks/backup-restore.md +205 -0
- package/docs/runbooks/cohort-cutover.md +129 -0
- package/docs/runbooks/fleet-operations.md +200 -0
- package/docs/runbooks/incident-response.md +226 -0
- package/docs/runbooks/mac-mini-bootstrap.md +431 -0
- package/docs/runbooks/perpetual-operations.md +509 -0
- package/docs/runbooks/recovery-and-failover.md +260 -0
- package/framework-features.json +267 -0
- package/ingest/README.md +87 -0
- package/lib/action-executor.js +689 -0
- package/lib/action-executor.test.mjs +871 -0
- package/lib/agent-root.mjs +37 -0
- package/lib/archetype.mjs +236 -0
- package/lib/archetype.test.mjs +132 -0
- package/lib/autonomy.mjs +114 -0
- package/lib/autonomy.test.mjs +66 -0
- package/lib/backlog.mjs +358 -0
- package/lib/backlog.test.mjs +266 -0
- package/lib/budget-guard.mjs +279 -0
- package/lib/budget-guard.test.mjs +291 -0
- package/lib/cadence-bus-schedule.test.mjs +194 -0
- package/lib/cadence-bus.mjs +1120 -0
- package/lib/cadence-bus.test.mjs +720 -0
- package/lib/cadences.mjs +205 -0
- package/lib/cadences.test.mjs +125 -0
- package/lib/capability.mjs +154 -0
- package/lib/capability.test.mjs +78 -0
- package/lib/channels/base-adapter.mjs +719 -0
- package/lib/channels/base-adapter.test.mjs +590 -0
- package/lib/channels/channel.mjs +128 -0
- package/lib/channels/channels.test.mjs +371 -0
- package/lib/channels/contract.mjs +215 -0
- package/lib/channels/contract.test.mjs +137 -0
- package/lib/channels/conversation-resolver.mjs +95 -0
- package/lib/channels/gmail/adapter.mjs +87 -0
- package/lib/channels/inbox-item.mjs +255 -0
- package/lib/channels/inbox-item.test.mjs +335 -0
- package/lib/channels/index.mjs +94 -0
- package/lib/channels/orgmail/adapter.mjs +353 -0
- package/lib/channels/orgmail/adapter.test.mjs +311 -0
- package/lib/channels/pairing.mjs +363 -0
- package/lib/channels/pairing.test.mjs +270 -0
- package/lib/channels/registry.mjs +164 -0
- package/lib/channels/slack/adapter.mjs +317 -0
- package/lib/channels/slack-adapter.test.mjs +212 -0
- package/lib/channels/sms/adapter.mjs +43 -0
- package/lib/channels/telegram/adapter.mjs +432 -0
- package/lib/channels/telegram-adapter.test.mjs +306 -0
- package/lib/channels/voice/adapter.mjs +301 -0
- package/lib/channels/voice/adapter.test.mjs +278 -0
- package/lib/channels/whatsapp/adapter-baileys.mjs +587 -0
- package/lib/channels/whatsapp/adapter-baileys.test.mjs +359 -0
- package/lib/channels/whatsapp/adapter-twilio.mjs +65 -0
- package/lib/channels/whatsapp/baileys-typing.test.mjs +154 -0
- package/lib/charter.mjs +256 -0
- package/lib/charter.test.mjs +89 -0
- package/lib/claude-bin.mjs +134 -0
- package/lib/claude-bin.test.mjs +75 -0
- package/lib/collective/capture.mjs +185 -0
- package/lib/collective/capture.test.mjs +121 -0
- package/lib/collective/cards.mjs +201 -0
- package/lib/collective/cards.test.mjs +114 -0
- package/lib/collective/config.mjs +186 -0
- package/lib/collective/config.test.mjs +123 -0
- package/lib/collective/global-config.mjs +113 -0
- package/lib/collective/global-config.test.mjs +75 -0
- package/lib/collective/presence.mjs +201 -0
- package/lib/collective/presence.test.mjs +95 -0
- package/lib/collective/recall.mjs +215 -0
- package/lib/collective/recall.test.mjs +116 -0
- package/lib/comms/send-gate.mjs +554 -0
- package/lib/comms/send-gate.test.mjs +577 -0
- package/lib/comms.mjs +67 -0
- package/lib/comms.test.mjs +41 -0
- package/lib/diagnostics/alerts.mjs +424 -0
- package/lib/diagnostics/alerts.test.mjs +318 -0
- package/lib/diagnostics/backup-freshness.mjs +188 -0
- package/lib/diagnostics/backup-freshness.test.mjs +185 -0
- package/lib/diagnostics/counters.mjs +269 -0
- package/lib/diagnostics/counters.test.mjs +206 -0
- package/lib/diagnostics/events.mjs +188 -0
- package/lib/diagnostics/events.test.mjs +290 -0
- package/lib/diagnostics/otel.mjs +237 -0
- package/lib/diagnostics/otel.test.mjs +196 -0
- package/lib/diagnostics/trace.mjs +216 -0
- package/lib/diagnostics/trace.test.mjs +251 -0
- package/lib/env-compat.mjs +74 -0
- package/lib/env-compat.test.mjs +104 -0
- package/lib/feature-init.mjs +331 -0
- package/lib/fs-atomic.mjs +112 -0
- package/lib/fs-atomic.test.mjs +72 -0
- package/lib/fs-ownership.mjs +111 -0
- package/lib/fs-ownership.test.mjs +158 -0
- package/lib/hooks/bus.mjs +347 -0
- package/lib/hooks/bus.test.mjs +387 -0
- package/lib/index.js +16 -0
- package/lib/learning/config.mjs +106 -0
- package/lib/learning/config.test.mjs +75 -0
- package/lib/learning/counters.mjs +156 -0
- package/lib/learning/counters.test.mjs +69 -0
- package/lib/learning/curator-consolidate.test.mjs +238 -0
- package/lib/learning/curator.mjs +453 -0
- package/lib/learning/curator.test.mjs +106 -0
- package/lib/learning/log.mjs +40 -0
- package/lib/learning/reflect.mjs +534 -0
- package/lib/learning/reflect.test.mjs +0 -0
- package/lib/learning/session-index.mjs +352 -0
- package/lib/learning/session-index.test.mjs +125 -0
- package/lib/learning/skill-writer.mjs +474 -0
- package/lib/learning/skill-writer.test.mjs +210 -0
- package/lib/mcp/server.mjs +328 -0
- package/lib/mcp/server.test.mjs +400 -0
- package/lib/model-router/auth-profiles.mjs +758 -0
- package/lib/model-router/auth-profiles.test.mjs +580 -0
- package/lib/model-router/catalog/anthropic.yaml +153 -0
- package/lib/model-router/catalog/deepseek.yaml +86 -0
- package/lib/model-router/catalog/moonshot.yaml +81 -0
- package/lib/model-router/catalog/qwen.yaml +114 -0
- package/lib/model-router/catalog.mjs +925 -0
- package/lib/model-router/catalog.test.mjs +385 -0
- package/lib/model-router/economics.mjs +564 -0
- package/lib/model-router/economics.test.mjs +344 -0
- package/lib/model-router/failover.mjs +298 -0
- package/lib/model-router/failover.test.mjs +439 -0
- package/lib/model-router/health.mjs +453 -0
- package/lib/model-router/health.test.mjs +338 -0
- package/lib/model-router/integration-coverage.test.mjs +829 -0
- package/lib/model-router/integration.test.mjs +564 -0
- package/lib/model-router/ledger.mjs +402 -0
- package/lib/model-router/ledger.test.mjs +382 -0
- package/lib/model-router/llm-task.mjs +515 -0
- package/lib/model-router/llm-task.test.mjs +392 -0
- package/lib/model-router/org-credentials.mjs +260 -0
- package/lib/model-router/org-credentials.test.mjs +265 -0
- package/lib/model-router/pricing-refresh.mjs +463 -0
- package/lib/model-router/pricing-refresh.test.mjs +286 -0
- package/lib/model-router/reconcile.mjs +429 -0
- package/lib/model-router/reconcile.test.mjs +316 -0
- package/lib/model-router/repair.mjs +471 -0
- package/lib/model-router/repair.test.mjs +180 -0
- package/lib/model-router/resolve.mjs +1206 -0
- package/lib/model-router/spawn.mjs +497 -0
- package/lib/model-router/spawn.test.mjs +425 -0
- package/lib/model-router/taxonomy.mjs +893 -0
- package/lib/model-router/taxonomy.test.mjs +410 -0
- package/lib/model-router.mjs +677 -0
- package/lib/model-router.test.mjs +907 -0
- package/lib/org/activity.mjs +211 -0
- package/lib/org/activity.test.mjs +134 -0
- package/lib/org/approvals.mjs +448 -0
- package/lib/org/approvals.test.mjs +216 -0
- package/lib/org/awareness.mjs +222 -0
- package/lib/org/awareness.test.mjs +159 -0
- package/lib/org/board.mjs +229 -0
- package/lib/org/board.test.mjs +177 -0
- package/lib/org/bootstrap-context.mjs +169 -0
- package/lib/org/bootstrap-context.test.mjs +153 -0
- package/lib/org/client.mjs +1628 -0
- package/lib/org/client.test.mjs +1107 -0
- package/lib/org/cohort-client.mjs +67 -0
- package/lib/org/cohort-client.test.mjs +126 -0
- package/lib/org/cost-sync.mjs +227 -0
- package/lib/org/cost-sync.test.mjs +153 -0
- package/lib/org/doctor.mjs +212 -0
- package/lib/org/doctor.test.mjs +212 -0
- package/lib/org/handoff.mjs +293 -0
- package/lib/org/handoff.test.mjs +269 -0
- package/lib/org/integration-tools.mjs +182 -0
- package/lib/org/integration-tools.test.mjs +160 -0
- package/lib/org/keys.mjs +131 -0
- package/lib/org/keys.test.mjs +92 -0
- package/lib/org/knowledge.mjs +463 -0
- package/lib/org/knowledge.test.mjs +319 -0
- package/lib/org/leases.mjs +335 -0
- package/lib/org/leases.test.mjs +235 -0
- package/lib/org/mesh-integration.test.mjs +127 -0
- package/lib/org/mesh.mjs +459 -0
- package/lib/org/mesh.test.mjs +345 -0
- package/lib/org/messaging.mjs +503 -0
- package/lib/org/messaging.test.mjs +238 -0
- package/lib/org/policy.mjs +345 -0
- package/lib/org/policy.test.mjs +237 -0
- package/lib/org/protocol.checksum +1 -0
- package/lib/org/protocol.checksum.test.mjs +90 -0
- package/lib/org/protocol.mjs +967 -0
- package/lib/org/protocol.test.mjs +264 -0
- package/lib/org/registry.mjs +194 -0
- package/lib/org/registry.test.mjs +100 -0
- package/lib/org/tool-surface-integration.test.mjs +120 -0
- package/lib/org/tool-surface.mjs +2535 -0
- package/lib/org/tool-surface.test.mjs +589 -0
- package/lib/org/ui-parity.mjs +3236 -0
- package/lib/org/ui-parity.test.mjs +348 -0
- package/lib/org/verify.mjs +176 -0
- package/lib/org/verify.test.mjs +194 -0
- package/lib/rag/embed.mjs +188 -0
- package/lib/rag/indexer.mjs +425 -0
- package/lib/rag/rag.test.mjs +505 -0
- package/lib/rag/search.mjs +475 -0
- package/lib/rate-guard.mjs +246 -0
- package/lib/rate-guard.test.mjs +201 -0
- package/lib/render.mjs +112 -0
- package/lib/render.test.mjs +68 -0
- package/lib/resource-governor.mjs +297 -0
- package/lib/resource-governor.test.mjs +262 -0
- package/lib/scheduling/dynamic-jobs.mjs +675 -0
- package/lib/scheduling/dynamic-jobs.test.mjs +344 -0
- package/lib/scheduling/jitter.mjs +0 -0
- package/lib/scheduling/jitter.test.mjs +140 -0
- package/lib/secrets/broker.mjs +315 -0
- package/lib/secrets/broker.test.mjs +280 -0
- package/lib/secrets/providers.mjs +461 -0
- package/lib/secrets/providers.test.mjs +274 -0
- package/lib/security/audit-engine.mjs +684 -0
- package/lib/security/audit-engine.test.mjs +389 -0
- package/lib/security/coerce-args.mjs +552 -0
- package/lib/security/coerce-args.test.mjs +281 -0
- package/lib/security/dangerous-tools.mjs +97 -0
- package/lib/security/dangerous-tools.test.mjs +68 -0
- package/lib/security/external-content.mjs +145 -0
- package/lib/security/external-content.test.mjs +67 -0
- package/lib/security/redact.mjs +592 -0
- package/lib/security/redact.test.mjs +441 -0
- package/lib/security/secret-equal.mjs +73 -0
- package/lib/security/secret-equal.test.mjs +55 -0
- package/lib/session-permissions.mjs +101 -0
- package/lib/session-permissions.test.mjs +100 -0
- package/lib/setup/claude-probe.mjs +74 -0
- package/lib/setup/completeness.mjs +175 -0
- package/lib/setup/completeness.test.mjs +110 -0
- package/lib/setup/context-pack.mjs +173 -0
- package/lib/setup/context-pack.test.mjs +89 -0
- package/lib/setup/enrich.mjs +277 -0
- package/lib/setup/enrich.test.mjs +115 -0
- package/lib/setup/enroll-from-cohort.mjs +441 -0
- package/lib/setup/enroll-from-cohort.test.mjs +233 -0
- package/lib/setup/integration.test.mjs +162 -0
- package/lib/setup/io.mjs +360 -0
- package/lib/setup/io.test.mjs +77 -0
- package/lib/setup/run-generator.mjs +81 -0
- package/lib/setup/runner.mjs +244 -0
- package/lib/setup/runner.test.mjs +132 -0
- package/lib/setup/sections/comms.mjs +173 -0
- package/lib/setup/sections/company.mjs +120 -0
- package/lib/setup/sections/enrich.mjs +138 -0
- package/lib/setup/sections/identity.mjs +182 -0
- package/lib/setup/sections/identity.test.mjs +140 -0
- package/lib/setup/sections/learning.mjs +153 -0
- package/lib/setup/sections/learning.test.mjs +81 -0
- package/lib/setup/sections/messaging.mjs +219 -0
- package/lib/setup/sections/messaging.test.mjs +127 -0
- package/lib/setup/sections/model.mjs +102 -0
- package/lib/setup/sections/operating-model.mjs +78 -0
- package/lib/setup/sections/org.mjs +475 -0
- package/lib/setup/sections/org.test.mjs +313 -0
- package/lib/setup/sections/orgmail.mjs +173 -0
- package/lib/setup/sections/orgmail.test.mjs +118 -0
- package/lib/setup/sections/recovery.mjs +159 -0
- package/lib/setup/sections/recovery.test.mjs +98 -0
- package/lib/setup/sections/tools.mjs +132 -0
- package/lib/setup/sections/verify.mjs +97 -0
- package/lib/setup/sot.mjs +205 -0
- package/lib/setup/sot.test.mjs +81 -0
- package/lib/setup/state.mjs +151 -0
- package/lib/setup/state.test.mjs +92 -0
- package/lib/singleton.js +229 -0
- package/lib/singleton.test.mjs +135 -0
- package/lib/telemetry/alerts.mjs +216 -0
- package/lib/telemetry/alerts.test.mjs +109 -0
- package/lib/telemetry/collect.mjs +512 -0
- package/lib/telemetry/collect.test.mjs +202 -0
- package/lib/tool-definitions-integration.test.mjs +83 -0
- package/lib/tool-definitions.js +738 -0
- package/lib/tool-definitions.test.mjs +437 -0
- package/lib/util/fetch-timeout.mjs +136 -0
- package/lib/util/fetch-timeout.test.mjs +202 -0
- package/lib/util/reconnect.mjs +343 -0
- package/lib/util/reconnect.test.mjs +369 -0
- package/lib/util/unhandled.mjs +205 -0
- package/lib/util/unhandled.test.mjs +216 -0
- package/lib/voice/context-loader.mjs +466 -0
- package/lib/voice/index.mjs +100 -0
- package/lib/voice/openai-realtime.mjs +510 -0
- package/lib/voice/outbound.mjs +542 -0
- package/lib/voice/outbound.test.mjs +69 -0
- package/lib/voice/post-call-brief.mjs +428 -0
- package/lib/voice/provider.mjs +52 -0
- package/lib/voice/session-rotation.mjs +257 -0
- package/lib/voice/stt.mjs +161 -0
- package/lib/voice/stt.test.mjs +226 -0
- package/lib/voice/tool-bridge.mjs +370 -0
- package/lib/voice/tts.mjs +104 -0
- package/lib/voice/twilio-sip-bridge.mjs +288 -0
- package/lib/voice/voice.test.mjs +990 -0
- package/mcp/README.md +80 -0
- package/package.json +151 -0
- package/plugins/maestro-skills/plugin.json +139 -0
- package/plugins/maestro-skills/skills/agents-observe.md +110 -0
- package/plugins/maestro-skills/skills/board-deck.md +68 -0
- package/plugins/maestro-skills/skills/books-close.md +77 -0
- package/plugins/maestro-skills/skills/brand-steward.md +121 -0
- package/plugins/maestro-skills/skills/calendar-plan.md +57 -0
- package/plugins/maestro-skills/skills/call-working-sessions.md +124 -0
- package/plugins/maestro-skills/skills/ccxray-diagnostics.md +91 -0
- package/plugins/maestro-skills/skills/claude-pace.md +61 -0
- package/plugins/maestro-skills/skills/code-review-graph.md +99 -0
- package/plugins/maestro-skills/skills/crm-pipeline.md +65 -0
- package/plugins/maestro-skills/skills/decision-brief.md +89 -0
- package/plugins/maestro-skills/skills/directory-hygiene.md +125 -0
- package/plugins/maestro-skills/skills/draft-comms.md +84 -0
- package/plugins/maestro-skills/skills/evening-wrap.md +53 -0
- package/plugins/maestro-skills/skills/files-find.md +65 -0
- package/plugins/maestro-skills/skills/generative-ui.md +228 -0
- package/plugins/maestro-skills/skills/hiring-triage.md +74 -0
- package/plugins/maestro-skills/skills/inbox-triage.md +61 -0
- package/plugins/maestro-skills/skills/mail-triage.md +86 -0
- package/plugins/maestro-skills/skills/morning-brief.md +54 -0
- package/plugins/maestro-skills/skills/native-artifacts.md +157 -0
- package/plugins/maestro-skills/skills/org-board.md +133 -0
- package/plugins/maestro-skills/skills/org-credential.md +68 -0
- package/plugins/maestro-skills/skills/org-recall.md +81 -0
- package/plugins/maestro-skills/skills/pipeline-review.md +76 -0
- package/plugins/maestro-skills/skills/regulatory-status.md +81 -0
- package/plugins/maestro-skills/skills/router-why.md +78 -0
- package/plugins/maestro-skills/skills/schedule-meeting.md +91 -0
- package/plugins/maestro-skills/skills/session-search.md +71 -0
- package/plugins/maestro-skills/skills/set-reminder.md +93 -0
- package/plugins/maestro-skills/skills/slack-followup.md +64 -0
- package/plugins/maestro-skills/skills/team-activity.md +86 -0
- package/plugins/maestro-skills/skills/weekly-memo.md +70 -0
- package/policies/action-classification.yaml +114 -0
- package/policies/ai-disclosure.yaml +294 -0
- package/policies/communication-style.md +139 -0
- package/policies/information-barriers.yaml +118 -0
- package/policies/prompt-injection-defence.yaml +138 -0
- package/public/assets/icon-dark.png +0 -0
- package/public/assets/icon-dark.svg +9 -0
- package/public/assets/icon-light.svg +9 -0
- package/public/assets/logo-dark.svg +15 -0
- package/public/assets/logo-light.svg +15 -0
- package/scaffold/.mcp.json +7 -0
- package/scaffold/CLAUDE.md +368 -0
- package/scaffold/config/agent.json +55 -0
- package/scaffold/config/agent.ts +76 -0
- package/scaffold/config/agent.ts.example +89 -0
- package/scaffold/config/alerts.yaml +23 -0
- package/scaffold/config/allowlist.yaml.example +25 -0
- package/scaffold/config/caller-id-map.yaml +46 -0
- package/scaffold/config/collective.yaml +49 -0
- package/scaffold/config/company.json +20 -0
- package/scaffold/config/known-agents.json +6 -0
- package/scaffold/config/learning.yaml +55 -0
- package/scaffold/config/model-routing.yaml.example +104 -0
- package/scaffold/config/org.yaml +25 -0
- package/scaffold/config/orgmail.yaml.example +19 -0
- package/scaffold/config/recovery.yaml +72 -0
- package/scaffold/config/secrets.yaml +27 -0
- package/scaffold/config/slack.yaml.example +35 -0
- package/scaffold/config/telegram.yaml.example +38 -0
- package/scaffold/config/voice.yaml.example +89 -0
- package/scaffold/config/whatsapp.yaml.example +39 -0
- package/schedules/README.md +49 -0
- package/schedules/triggers/backlog-executor.md +102 -0
- package/schedules/triggers/brand-steward.md +72 -0
- package/schedules/triggers/daily-evening-wrap.md +159 -0
- package/schedules/triggers/daily-midday-sweep.md +58 -0
- package/schedules/triggers/daily-morning-brief.md +55 -0
- package/schedules/triggers/directory-hygiene.md +81 -0
- package/schedules/triggers/dynamic-jobs.md +40 -0
- package/schedules/triggers/inbox-processor.md +115 -0
- package/schedules/triggers/meeting-action-capture.md +60 -0
- package/schedules/triggers/meeting-prep.md +69 -0
- package/schedules/triggers/messaging-inbound.md +50 -0
- package/schedules/triggers/org-pulse.md +24 -0
- package/schedules/triggers/quarterly-self-assessment.md +54 -0
- package/schedules/triggers/weekly-engineering-health.md +37 -0
- package/schedules/triggers/weekly-execution.md +65 -0
- package/schedules/triggers/weekly-hiring.md +53 -0
- package/schedules/triggers/weekly-priorities.md +38 -0
- package/schedules/triggers/weekly-strategic-memo.md +124 -0
- package/scripts/archive-email.sh +55 -0
- package/scripts/cadence/cadence-status.mjs +36 -0
- package/scripts/cadence/enqueue-cadence-tick.mjs +174 -0
- package/scripts/cadence/enqueue-cadence-tick.test.mjs +187 -0
- package/scripts/cadence/launchd-cadence-wrapper.sh +85 -0
- package/scripts/cadence/launchd-cloud-relay-wrapper.sh +95 -0
- package/scripts/cadence/launchd-socket-mode-wrapper.sh +95 -0
- package/scripts/ci/check-docs-accuracy.mjs +493 -0
- package/scripts/ci/check-docs-accuracy.test.mjs +409 -0
- package/scripts/ci/check-exports-exist.mjs +140 -0
- package/scripts/ci/check-files-exist.mjs +107 -0
- package/scripts/ci/check-no-build-artifacts.mjs +111 -0
- package/scripts/ci/check-no-build-artifacts.test.mjs +71 -0
- package/scripts/ci/check-no-confidential.mjs +198 -0
- package/scripts/ci/check-no-conflict-markers.mjs +169 -0
- package/scripts/ci/check-no-residual-identity.mjs +163 -0
- package/scripts/ci/check-no-residual-identity.test.mjs +89 -0
- package/scripts/ci/check-tarball-fidelity.mjs +205 -0
- package/scripts/ci/check-unresolved-tokens.mjs +83 -0
- package/scripts/ci/check.mjs +109 -0
- package/scripts/ci/check.test.mjs +194 -0
- package/scripts/ci/run-coverage.mjs +82 -0
- package/scripts/ci/run-tests.mjs +71 -0
- package/scripts/cloud-relay/README.md +59 -0
- package/scripts/cloud-relay/index.mjs +233 -0
- package/scripts/cloud-relay/package.json +15 -0
- package/scripts/cloud-relay/railway.json +13 -0
- package/scripts/cloud-relay/voice/README.md +94 -0
- package/scripts/cloud-relay/voice/package-lock.json +39 -0
- package/scripts/cloud-relay/voice/package.json +16 -0
- package/scripts/cloud-relay/voice/railway.json +13 -0
- package/scripts/cloud-relay/voice/server.mjs +532 -0
- package/scripts/collective/hook-runner.mjs +211 -0
- package/scripts/collective/hook-runner.test.mjs +90 -0
- package/scripts/collective/org-pulse.mjs +72 -0
- package/scripts/collective/org-sync.mjs +61 -0
- package/scripts/collective/recall.mjs +45 -0
- package/scripts/collective/who.mjs +30 -0
- package/scripts/comms-monitor.sh +288 -0
- package/scripts/configure-whatsapp-sandbox.sh +201 -0
- package/scripts/continuous-monitor.sh +91 -0
- package/scripts/cost/fleet-digest.mjs +407 -0
- package/scripts/cost/fleet-digest.test.mjs +207 -0
- package/scripts/cost/track-claude-usage.mjs +169 -0
- package/scripts/daemon/agent-daemon.mjs +989 -0
- package/scripts/daemon/agent-daemon.test.mjs +525 -0
- package/scripts/daemon/cadence-consumer-governance.test.mjs +220 -0
- package/scripts/daemon/cadence-consumer.mjs +1080 -0
- package/scripts/daemon/cadence-consumer.test.mjs +770 -0
- package/scripts/daemon/cadence-handlers.mjs +1121 -0
- package/scripts/daemon/cadence-handlers.test.mjs +617 -0
- package/scripts/daemon/classifier.mjs +704 -0
- package/scripts/daemon/classifier.test.mjs +238 -0
- package/scripts/daemon/classify-kind.mjs +54 -0
- package/scripts/daemon/classify-kind.test.mjs +40 -0
- package/scripts/daemon/context-compiler.mjs +605 -0
- package/scripts/daemon/context-compiler.test.mjs +300 -0
- package/scripts/daemon/dispatcher-cooldown.test.mjs +122 -0
- package/scripts/daemon/dispatcher-governance.test.mjs +886 -0
- package/scripts/daemon/dispatcher.mjs +1516 -0
- package/scripts/daemon/health.mjs +72 -0
- package/scripts/daemon/inbox-deferral.mjs +210 -0
- package/scripts/daemon/inbox-deferral.test.mjs +242 -0
- package/scripts/daemon/integration.test.mjs +149 -0
- package/scripts/daemon/launchd-wrapper-generic.sh +96 -0
- package/scripts/daemon/launchd-wrapper-slack-events.sh +37 -0
- package/scripts/daemon/launchd-wrapper.sh +91 -0
- package/scripts/daemon/lib/session-router.mjs +274 -0
- package/scripts/daemon/lib/session-router.test.mjs +295 -0
- package/scripts/daemon/maestro-daemon.mjs +275 -0
- package/scripts/daemon/prompt-builder.mjs +685 -0
- package/scripts/daemon/prompt-builder.test.mjs +213 -0
- package/scripts/daemon/responder.mjs +854 -0
- package/scripts/daemon/session-lock.mjs +721 -0
- package/scripts/daemon/session-lock.test.mjs +252 -0
- package/scripts/daemon/session-outcomes.mjs +640 -0
- package/scripts/daemon/session-outcomes.test.mjs +533 -0
- package/scripts/daemon/typing-registry.mjs +90 -0
- package/scripts/daemon/typing-registry.test.mjs +77 -0
- package/scripts/daemon/voice-webhook-server.mjs +804 -0
- package/scripts/decisions/capture-decision.mjs +116 -0
- package/scripts/disclosure_assessment.py +873 -0
- package/scripts/disclosure_boundaries.py +562 -0
- package/scripts/email-signature-principal.html +52 -0
- package/scripts/email-signature.html +60 -0
- package/scripts/email_quote_thread.py +167 -0
- package/scripts/email_thread_dedup.py +362 -0
- package/scripts/emergency-stop.sh +81 -0
- package/scripts/healthcheck.sh +116 -0
- package/scripts/hooks/block-mcp-cohort-send.sh +15 -0
- package/scripts/hooks/block-mcp-slack-send.sh +7 -0
- package/scripts/hooks/post-action-log.sh +126 -0
- package/scripts/hooks/pre-send-audit.sh +174 -0
- package/scripts/hooks/pre-send-audit.test.mjs +215 -0
- package/scripts/hooks/session-end-log.sh +27 -0
- package/scripts/hooks/session-start-banner.sh +115 -0
- package/scripts/huddle/audio-bridge.mjs +664 -0
- package/scripts/huddle/boot-slack-cdp.sh +102 -0
- package/scripts/huddle/huddle-controller.mjs +942 -0
- package/scripts/huddle/huddle-server.mjs +1229 -0
- package/scripts/huddle/launch-slack.sh +232 -0
- package/scripts/huddle/openai-realtime-bridge.mjs +462 -0
- package/scripts/huddle/package-lock.json +62 -0
- package/scripts/huddle/package.json +22 -0
- package/scripts/huddle/setup-audio.sh +239 -0
- package/scripts/huddle/start-call.mjs +318 -0
- package/scripts/huddle/test-pipeline.mjs +263 -0
- package/scripts/learning/consolidate-skills.mjs +72 -0
- package/scripts/learning/session-search.mjs +125 -0
- package/scripts/llm_email_dedup.py +442 -0
- package/scripts/local-triggers/generate-plists.sh +432 -0
- package/scripts/local-triggers/generate-plists.test.mjs +413 -0
- package/scripts/local-triggers/install-all.sh +49 -0
- package/scripts/local-triggers/plists/.gitkeep +0 -0
- package/scripts/local-triggers/run-trigger.sh +63 -0
- package/scripts/local-triggers/templates/rag-reindex.plist.template +47 -0
- package/scripts/local-triggers/templates/voice-relay-poller.plist.template +54 -0
- package/scripts/local-triggers/templates/voice-tunnel.plist.template +55 -0
- package/scripts/local-triggers/templates/voice-webhook.plist.template +51 -0
- package/scripts/maintenance/backup-to-cloud.sh +124 -0
- package/scripts/maintenance/health-check.sh +377 -0
- package/scripts/media-generation/README.md +105 -0
- package/scripts/media-generation/gemini-image-client.mjs +173 -0
- package/scripts/media-generation/generate-assets.mjs +289 -0
- package/scripts/media-generation/veo-video-client.mjs +219 -0
- package/scripts/org/send-orgmail.mjs +227 -0
- package/scripts/outbound-dedup-cleanup.sh +43 -0
- package/scripts/outbound-dedup.sh +477 -0
- package/scripts/outbound_dedup.py +115 -0
- package/scripts/parse-voice-transcript.mjs +481 -0
- package/scripts/pdf-generation/README.md +63 -0
- package/scripts/pdf-generation/build-document.mjs +247 -0
- package/scripts/pdf-generation/templates/board-pack.latex +136 -0
- package/scripts/pdf-generation/templates/corporate-letter.latex +126 -0
- package/scripts/pdf-generation/templates/memo.latex +114 -0
- package/scripts/poll-slack-events.sh +35 -0
- package/scripts/poller/calendar-poller.mjs +12 -0
- package/scripts/poller/gmail-poller.mjs +192 -0
- package/scripts/poller/imap-client.mjs +289 -0
- package/scripts/poller/inbox-scan-poller.mjs +156 -0
- package/scripts/poller/inbox-scan-poller.test.mjs +231 -0
- package/scripts/poller/index.mjs +73 -0
- package/scripts/poller/intra-session-check.mjs +285 -0
- package/scripts/poller/lib/cloud-relay-dedup.mjs +88 -0
- package/scripts/poller/lib/cloud-relay-dedup.test.mjs +133 -0
- package/scripts/poller/lib/slash-command-handlers.mjs +177 -0
- package/scripts/poller/secondary-gmail-poller.mjs +132 -0
- package/scripts/poller/slack-cloud-relay-client.mjs +368 -0
- package/scripts/poller/slack-poller.mjs +854 -0
- package/scripts/poller/slack-socket-mode.mjs +917 -0
- package/scripts/poller/slack-socket-mode.test.mjs +753 -0
- package/scripts/poller/trigger.mjs +75 -0
- package/scripts/poller/utils.mjs +371 -0
- package/scripts/poller/voice-cloud-relay-client.mjs +179 -0
- package/scripts/poller/voice-poller.mjs +236 -0
- package/scripts/poller-launchd/install.sh +66 -0
- package/scripts/poller-launchd/poller.plist.template +40 -0
- package/scripts/poller-launchd/whatsapp-handler.plist.template +39 -0
- package/scripts/post-interaction-indexer.py +1598 -0
- package/scripts/pre-draft-context.py +994 -0
- package/scripts/pre_draft_lookup.py +258 -0
- package/scripts/rag/build-index.mjs +47 -0
- package/scripts/rag/ingest.mjs +111 -0
- package/scripts/rag/search.mjs +119 -0
- package/scripts/rag-indexer.py +629 -0
- package/scripts/restore-from-backup.sh +248 -0
- package/scripts/restore-from-backup.test.mjs +178 -0
- package/scripts/resume-operations.sh +80 -0
- package/scripts/search-secondary-inbox.py +181 -0
- package/scripts/secondary-inbox-poller.py +437 -0
- package/scripts/self-optimization/compute-metrics.py +398 -0
- package/scripts/send-email-as-principal.py +369 -0
- package/scripts/send-email-threaded.py +392 -0
- package/scripts/send-email-with-attachment.py +377 -0
- package/scripts/send-email.sh +131 -0
- package/scripts/send-sms.sh +175 -0
- package/scripts/send-whatsapp.sh +292 -0
- package/scripts/session-start.sh +106 -0
- package/scripts/setup/boot-claude-session.sh +94 -0
- package/scripts/setup/configure-macos.sh +674 -0
- package/scripts/setup/configure-twilio-sip-trunk.mjs +207 -0
- package/scripts/setup/configure-voice-tunnel.mjs +182 -0
- package/scripts/setup/generate-agent-env.mjs +92 -0
- package/scripts/setup/generate-agent-package-json.mjs +222 -0
- package/scripts/setup/generate-agent-package-json.test.mjs +143 -0
- package/scripts/setup/generate-autonomy.mjs +60 -0
- package/scripts/setup/generate-backlog.mjs +101 -0
- package/scripts/setup/generate-cadences.mjs +92 -0
- package/scripts/setup/generate-capability.mjs +162 -0
- package/scripts/setup/generate-charter.mjs +76 -0
- package/scripts/setup/generate-comms.mjs +59 -0
- package/scripts/setup/generate-company.mjs +92 -0
- package/scripts/setup/init-agent.sh +547 -0
- package/scripts/setup/init-agent.test.mjs +151 -0
- package/scripts/setup/init-archetype.mjs +74 -0
- package/scripts/setup/init-backup.mjs +54 -0
- package/scripts/setup/init-cadence-bus.mjs +60 -0
- package/scripts/setup/init-channel-bus.mjs +46 -0
- package/scripts/setup/init-cost-tracking.mjs +45 -0
- package/scripts/setup/init-decision-capture.mjs +66 -0
- package/scripts/setup/init-known-agents.mjs +57 -0
- package/scripts/setup/init-learning.mjs +70 -0
- package/scripts/setup/init-memory-executive.mjs +45 -0
- package/scripts/setup/init-model-router.mjs +124 -0
- package/scripts/setup/init-rag.mjs +174 -0
- package/scripts/setup/init-session-router.mjs +38 -0
- package/scripts/setup/init-slack-socket-mode.mjs +260 -0
- package/scripts/setup/init-telegram.mjs +165 -0
- package/scripts/setup/init-voice-realtime.mjs +204 -0
- package/scripts/setup/init-whatsapp-baileys.mjs +77 -0
- package/scripts/setup/install-dev-tools.sh +150 -0
- package/scripts/setup/lib/install-plist.mjs +95 -0
- package/scripts/setup/migrate-agent-to-sot.mjs +192 -0
- package/scripts/setup/render-environment-yaml.mjs +133 -0
- package/scripts/slack-events-ctl.sh +177 -0
- package/scripts/slack-events-server.mjs +1045 -0
- package/scripts/slack-react.mjs +89 -0
- package/scripts/slack-responded.sh +232 -0
- package/scripts/slack-send.sh +287 -0
- package/scripts/slack-typing.mjs +196 -0
- package/scripts/slack-upload-v2.py +95 -0
- package/scripts/sms-handler.mjs +450 -0
- package/scripts/spawn-session.sh +120 -0
- package/scripts/sync-protocol.mjs +217 -0
- package/scripts/system-verify.sh +184 -0
- package/scripts/test-email-thread-dedup.py +239 -0
- package/scripts/test-information-barriers.py +484 -0
- package/scripts/test-llm-email-dedup.py +251 -0
- package/scripts/test-pre-draft-integration.py +203 -0
- package/scripts/test-rag-phase2.sh +442 -0
- package/scripts/test-rag-search.sh +251 -0
- package/scripts/test-voice-parser.mjs +316 -0
- package/scripts/user-context-search.py +659 -0
- package/scripts/validate_outbound.py +1504 -0
- package/scripts/watchdog/ai.maestro.memory-watchdog.plist +41 -0
- package/scripts/watchdog/force-reboot.sh +157 -0
- package/scripts/watchdog/memory-watchdog.sh +473 -0
- package/scripts/whatsapp-handler.mjs +538 -0
- package/teams/desktop-operations.yaml +34 -0
- package/teams/executive-office.yaml +27 -0
- package/teams/legal-and-regulatory.yaml +24 -0
- package/teams/platform-and-engineering.yaml +23 -0
- package/teams/strategy-and-growth.yaml +29 -0
- package/workflows/continuous/backlog-executor.yaml +141 -0
- package/workflows/continuous/inbound-monitor.yaml +168 -0
- package/workflows/daily/applicant-triage.yaml +197 -0
- package/workflows/daily/comms-triage.yaml +80 -0
- package/workflows/daily/evening-wrap.yaml +105 -0
- package/workflows/daily/morning-brief.yaml +164 -0
- package/workflows/daily/slack-followup-sweep.yaml +87 -0
- package/workflows/event-driven/README.md +50 -0
- package/workflows/event-driven/agent-failure-investigation.yaml +137 -0
- package/workflows/event-driven/pr-review.yaml +107 -0
- package/workflows/monthly/board-readiness.yaml +76 -0
- package/workflows/quarterly/strategic-scenario-analysis.yaml +85 -0
- package/workflows/session-protocol.md +171 -0
- package/workflows/weekly/engineering-health.yaml +154 -0
- package/workflows/weekly/hiring-review.yaml +169 -0
- package/workflows/weekly/rollup-pipeline-review.yaml +76 -0
- 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); });
|