agent-bober 0.18.0 → 0.19.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-plugin/plugin.json +1 -1
- package/CHANGELOG.md +11 -0
- package/README.md +245 -6
- package/agents/bober-art-director.md +100 -0
- package/agents/bober-design-critic.md +114 -0
- package/agents/bober-frontend-builder.md +101 -0
- package/agents/bober-security-auditor.md +193 -0
- package/agents/bober-security-verifier.md +104 -0
- package/agents/bober-seo-strategist.md +144 -0
- package/agents/bober-seo-verifier.md +103 -0
- package/dist/calendar/calendar-egress.d.ts +26 -0
- package/dist/calendar/calendar-egress.d.ts.map +1 -0
- package/dist/calendar/calendar-egress.js +35 -0
- package/dist/calendar/calendar-egress.js.map +1 -0
- package/dist/calendar/calendar-token.d.ts +34 -0
- package/dist/calendar/calendar-token.d.ts.map +1 -0
- package/dist/calendar/calendar-token.js +56 -0
- package/dist/calendar/calendar-token.js.map +1 -0
- package/dist/calendar/connector.d.ts +22 -0
- package/dist/calendar/connector.d.ts.map +1 -0
- package/dist/calendar/connector.js +3 -0
- package/dist/calendar/connector.js.map +1 -0
- package/dist/calendar/finding-source.d.ts +20 -0
- package/dist/calendar/finding-source.d.ts.map +1 -0
- package/dist/calendar/finding-source.js +35 -0
- package/dist/calendar/finding-source.js.map +1 -0
- package/dist/calendar/google-connector.d.ts +65 -0
- package/dist/calendar/google-connector.d.ts.map +1 -0
- package/dist/calendar/google-connector.js +129 -0
- package/dist/calendar/google-connector.js.map +1 -0
- package/dist/calendar/ics-connector.d.ts +12 -0
- package/dist/calendar/ics-connector.d.ts.map +1 -0
- package/dist/calendar/ics-connector.js +48 -0
- package/dist/calendar/ics-connector.js.map +1 -0
- package/dist/calendar/proposal-gate.d.ts +84 -0
- package/dist/calendar/proposal-gate.d.ts.map +1 -0
- package/dist/calendar/proposal-gate.js +126 -0
- package/dist/calendar/proposal-gate.js.map +1 -0
- package/dist/calendar/slotter.d.ts +34 -0
- package/dist/calendar/slotter.d.ts.map +1 -0
- package/dist/calendar/slotter.js +196 -0
- package/dist/calendar/slotter.js.map +1 -0
- package/dist/calendar/types.d.ts +162 -0
- package/dist/calendar/types.d.ts.map +1 -0
- package/dist/calendar/types.js +28 -0
- package/dist/calendar/types.js.map +1 -0
- package/dist/chat/chat-session.d.ts +27 -0
- package/dist/chat/chat-session.d.ts.map +1 -1
- package/dist/chat/chat-session.js +101 -1
- package/dist/chat/chat-session.js.map +1 -1
- package/dist/chat/slash-commands.d.ts +6 -2
- package/dist/chat/slash-commands.d.ts.map +1 -1
- package/dist/chat/slash-commands.js +22 -2
- package/dist/chat/slash-commands.js.map +1 -1
- package/dist/chat/turn-classifier.d.ts +3 -0
- package/dist/chat/turn-classifier.d.ts.map +1 -1
- package/dist/chat/turn-classifier.js +7 -0
- package/dist/chat/turn-classifier.js.map +1 -1
- package/dist/cli/commands/calendar.d.ts +75 -0
- package/dist/cli/commands/calendar.d.ts.map +1 -0
- package/dist/cli/commands/calendar.js +203 -0
- package/dist/cli/commands/calendar.js.map +1 -0
- package/dist/cli/commands/do.d.ts +52 -0
- package/dist/cli/commands/do.d.ts.map +1 -0
- package/dist/cli/commands/do.js +216 -0
- package/dist/cli/commands/do.js.map +1 -0
- package/dist/cli/commands/hub.d.ts +29 -0
- package/dist/cli/commands/hub.d.ts.map +1 -0
- package/dist/cli/commands/hub.js +233 -0
- package/dist/cli/commands/hub.js.map +1 -0
- package/dist/cli/commands/medical.d.ts +25 -0
- package/dist/cli/commands/medical.d.ts.map +1 -1
- package/dist/cli/commands/medical.js +233 -0
- package/dist/cli/commands/medical.js.map +1 -1
- package/dist/cli/commands/research.d.ts +41 -0
- package/dist/cli/commands/research.d.ts.map +1 -0
- package/dist/cli/commands/research.js +313 -0
- package/dist/cli/commands/research.js.map +1 -0
- package/dist/cli/commands/security-audit.d.ts +89 -0
- package/dist/cli/commands/security-audit.d.ts.map +1 -0
- package/dist/cli/commands/security-audit.js +238 -0
- package/dist/cli/commands/security-audit.js.map +1 -0
- package/dist/cli/commands/task.d.ts +64 -0
- package/dist/cli/commands/task.d.ts.map +1 -0
- package/dist/cli/commands/task.js +422 -0
- package/dist/cli/commands/task.js.map +1 -0
- package/dist/cli/commands/telegram.d.ts +10 -0
- package/dist/cli/commands/telegram.d.ts.map +1 -0
- package/dist/cli/commands/telegram.js +44 -0
- package/dist/cli/commands/telegram.js.map +1 -0
- package/dist/cli/commands/vault.d.ts +40 -0
- package/dist/cli/commands/vault.d.ts.map +1 -0
- package/dist/cli/commands/vault.js +122 -0
- package/dist/cli/commands/vault.js.map +1 -0
- package/dist/cli/index.js +33 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/config/role-providers.d.ts +15 -0
- package/dist/config/role-providers.d.ts.map +1 -1
- package/dist/config/role-providers.js +8 -1
- package/dist/config/role-providers.js.map +1 -1
- package/dist/config/schema.d.ts +3522 -171
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/schema.js +405 -2
- package/dist/config/schema.js.map +1 -1
- package/dist/do-bridge/coding-promoter.d.ts +19 -0
- package/dist/do-bridge/coding-promoter.d.ts.map +1 -0
- package/dist/do-bridge/coding-promoter.js +43 -0
- package/dist/do-bridge/coding-promoter.js.map +1 -0
- package/dist/do-bridge/finding-port.d.ts +88 -0
- package/dist/do-bridge/finding-port.d.ts.map +1 -0
- package/dist/do-bridge/finding-port.js +95 -0
- package/dist/do-bridge/finding-port.js.map +1 -0
- package/dist/do-bridge/launcher.d.ts +55 -0
- package/dist/do-bridge/launcher.d.ts.map +1 -0
- package/dist/do-bridge/launcher.js +37 -0
- package/dist/do-bridge/launcher.js.map +1 -0
- package/dist/do-bridge/promote.d.ts +50 -0
- package/dist/do-bridge/promote.d.ts.map +1 -0
- package/dist/do-bridge/promote.js +116 -0
- package/dist/do-bridge/promote.js.map +1 -0
- package/dist/do-bridge/reconcile.d.ts +50 -0
- package/dist/do-bridge/reconcile.d.ts.map +1 -0
- package/dist/do-bridge/reconcile.js +70 -0
- package/dist/do-bridge/reconcile.js.map +1 -0
- package/dist/do-bridge/registry.d.ts +23 -0
- package/dist/do-bridge/registry.d.ts.map +1 -0
- package/dist/do-bridge/registry.js +42 -0
- package/dist/do-bridge/registry.js.map +1 -0
- package/dist/do-bridge/types.d.ts +50 -0
- package/dist/do-bridge/types.d.ts.map +1 -0
- package/dist/do-bridge/types.js +17 -0
- package/dist/do-bridge/types.js.map +1 -0
- package/dist/fleet/child-config.d.ts.map +1 -1
- package/dist/fleet/child-config.js +7 -0
- package/dist/fleet/child-config.js.map +1 -1
- package/dist/fleet/coordinator.d.ts +27 -1
- package/dist/fleet/coordinator.d.ts.map +1 -1
- package/dist/fleet/coordinator.js +70 -0
- package/dist/fleet/coordinator.js.map +1 -1
- package/dist/fleet/critic-deep.d.ts +9 -1
- package/dist/fleet/critic-deep.d.ts.map +1 -1
- package/dist/fleet/critic-deep.js +5 -2
- package/dist/fleet/critic-deep.js.map +1 -1
- package/dist/fleet/decomposer-deep.d.ts +4 -11
- package/dist/fleet/decomposer-deep.d.ts.map +1 -1
- package/dist/fleet/decomposer-deep.js +5 -5
- package/dist/fleet/decomposer-deep.js.map +1 -1
- package/dist/fleet/index.d.ts +9 -0
- package/dist/fleet/index.d.ts.map +1 -1
- package/dist/fleet/index.js +87 -8
- package/dist/fleet/index.js.map +1 -1
- package/dist/fleet/manifest.d.ts +26 -0
- package/dist/fleet/manifest.d.ts.map +1 -1
- package/dist/fleet/manifest.js +8 -0
- package/dist/fleet/manifest.js.map +1 -1
- package/dist/fleet/reporter.d.ts +4 -1
- package/dist/fleet/reporter.d.ts.map +1 -1
- package/dist/fleet/reporter.js +2 -1
- package/dist/fleet/reporter.js.map +1 -1
- package/dist/fleet/scaffolder.d.ts +5 -1
- package/dist/fleet/scaffolder.d.ts.map +1 -1
- package/dist/fleet/scaffolder.js +11 -2
- package/dist/fleet/scaffolder.js.map +1 -1
- package/dist/graph/client.d.ts.map +1 -1
- package/dist/graph/client.js +115 -23
- package/dist/graph/client.js.map +1 -1
- package/dist/graph/mcp-client.d.ts +1 -0
- package/dist/graph/mcp-client.d.ts.map +1 -1
- package/dist/graph/mcp-client.js +58 -7
- package/dist/graph/mcp-client.js.map +1 -1
- package/dist/hub/collector.d.ts +12 -0
- package/dist/hub/collector.d.ts.map +1 -0
- package/dist/hub/collector.js +36 -0
- package/dist/hub/collector.js.map +1 -0
- package/dist/hub/finding-source.d.ts +22 -0
- package/dist/hub/finding-source.d.ts.map +1 -0
- package/dist/hub/finding-source.js +41 -0
- package/dist/hub/finding-source.js.map +1 -0
- package/dist/hub/finding-store.d.ts +68 -0
- package/dist/hub/finding-store.d.ts.map +1 -0
- package/dist/hub/finding-store.js +122 -0
- package/dist/hub/finding-store.js.map +1 -0
- package/dist/hub/finding.d.ts +54 -0
- package/dist/hub/finding.d.ts.map +1 -0
- package/dist/hub/finding.js +24 -0
- package/dist/hub/finding.js.map +1 -0
- package/dist/hub/gmail-to-task.d.ts +69 -0
- package/dist/hub/gmail-to-task.d.ts.map +1 -0
- package/dist/hub/gmail-to-task.js +102 -0
- package/dist/hub/gmail-to-task.js.map +1 -0
- package/dist/hub/hub-config.d.ts +18 -0
- package/dist/hub/hub-config.d.ts.map +1 -0
- package/dist/hub/hub-config.js +40 -0
- package/dist/hub/hub-config.js.map +1 -0
- package/dist/hub/judge.d.ts +30 -0
- package/dist/hub/judge.d.ts.map +1 -0
- package/dist/hub/judge.js +177 -0
- package/dist/hub/judge.js.map +1 -0
- package/dist/hub/lenses.d.ts +60 -0
- package/dist/hub/lenses.d.ts.map +1 -0
- package/dist/hub/lenses.js +123 -0
- package/dist/hub/lenses.js.map +1 -0
- package/dist/hub/priority-md.d.ts +21 -0
- package/dist/hub/priority-md.d.ts.map +1 -0
- package/dist/hub/priority-md.js +64 -0
- package/dist/hub/priority-md.js.map +1 -0
- package/dist/hub/repo-resolver.d.ts +11 -0
- package/dist/hub/repo-resolver.d.ts.map +1 -0
- package/dist/hub/repo-resolver.js +39 -0
- package/dist/hub/repo-resolver.js.map +1 -0
- package/dist/hub/scope.d.ts +39 -0
- package/dist/hub/scope.d.ts.map +1 -0
- package/dist/hub/scope.js +62 -0
- package/dist/hub/scope.js.map +1 -0
- package/dist/hub/task-inbox.d.ts +16 -0
- package/dist/hub/task-inbox.d.ts.map +1 -0
- package/dist/hub/task-inbox.js +39 -0
- package/dist/hub/task-inbox.js.map +1 -0
- package/dist/incident/resolution-verify.d.ts +2 -2
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/medical/adapters/apple-health.js +1 -1
- package/dist/medical/adapters/apple-health.js.map +1 -1
- package/dist/medical/analysis/cadence.d.ts +32 -0
- package/dist/medical/analysis/cadence.d.ts.map +1 -0
- package/dist/medical/analysis/cadence.js +72 -0
- package/dist/medical/analysis/cadence.js.map +1 -0
- package/dist/medical/analysis/cross-marker.d.ts +33 -0
- package/dist/medical/analysis/cross-marker.d.ts.map +1 -0
- package/dist/medical/analysis/cross-marker.js +79 -0
- package/dist/medical/analysis/cross-marker.js.map +1 -0
- package/dist/medical/analysis/finding-writer.d.ts +26 -0
- package/dist/medical/analysis/finding-writer.d.ts.map +1 -0
- package/dist/medical/analysis/finding-writer.js +60 -0
- package/dist/medical/analysis/finding-writer.js.map +1 -0
- package/dist/medical/analysis/finding.d.ts +63 -0
- package/dist/medical/analysis/finding.d.ts.map +1 -0
- package/dist/medical/analysis/finding.js +70 -0
- package/dist/medical/analysis/finding.js.map +1 -0
- package/dist/medical/analysis/review-pass.d.ts +76 -0
- package/dist/medical/analysis/review-pass.d.ts.map +1 -0
- package/dist/medical/analysis/review-pass.js +119 -0
- package/dist/medical/analysis/review-pass.js.map +1 -0
- package/dist/medical/analysis/trends.d.ts +36 -0
- package/dist/medical/analysis/trends.d.ts.map +1 -0
- package/dist/medical/analysis/trends.js +157 -0
- package/dist/medical/analysis/trends.js.map +1 -0
- package/dist/medical/health-store.d.ts +5 -0
- package/dist/medical/health-store.d.ts.map +1 -1
- package/dist/medical/health-store.js +10 -0
- package/dist/medical/health-store.js.map +1 -1
- package/dist/medical/lab-note.d.ts +72 -0
- package/dist/medical/lab-note.d.ts.map +1 -0
- package/dist/medical/lab-note.js +161 -0
- package/dist/medical/lab-note.js.map +1 -0
- package/dist/medical/lab-pdf-parser.d.ts +19 -0
- package/dist/medical/lab-pdf-parser.d.ts.map +1 -0
- package/dist/medical/lab-pdf-parser.js +57 -0
- package/dist/medical/lab-pdf-parser.js.map +1 -0
- package/dist/medical/lab-reindex.d.ts +24 -0
- package/dist/medical/lab-reindex.d.ts.map +1 -0
- package/dist/medical/lab-reindex.js +45 -0
- package/dist/medical/lab-reindex.js.map +1 -0
- package/dist/medical/lab-types.d.ts +75 -0
- package/dist/medical/lab-types.d.ts.map +1 -0
- package/dist/medical/lab-types.js +17 -0
- package/dist/medical/lab-types.js.map +1 -0
- package/dist/medical/profile.d.ts +96 -0
- package/dist/medical/profile.d.ts.map +1 -0
- package/dist/medical/profile.js +273 -0
- package/dist/medical/profile.js.map +1 -0
- package/dist/medical/recommend/context.d.ts +48 -0
- package/dist/medical/recommend/context.d.ts.map +1 -0
- package/dist/medical/recommend/context.js +109 -0
- package/dist/medical/recommend/context.js.map +1 -0
- package/dist/medical/recommend/judge-panel.d.ts +49 -0
- package/dist/medical/recommend/judge-panel.d.ts.map +1 -0
- package/dist/medical/recommend/judge-panel.js +164 -0
- package/dist/medical/recommend/judge-panel.js.map +1 -0
- package/dist/medical/recommend/lenses.d.ts +72 -0
- package/dist/medical/recommend/lenses.d.ts.map +1 -0
- package/dist/medical/recommend/lenses.js +220 -0
- package/dist/medical/recommend/lenses.js.map +1 -0
- package/dist/medical/recommend/recommend.d.ts +86 -0
- package/dist/medical/recommend/recommend.d.ts.map +1 -0
- package/dist/medical/recommend/recommend.js +211 -0
- package/dist/medical/recommend/recommend.js.map +1 -0
- package/dist/medical/recommend/types.d.ts +98 -0
- package/dist/medical/recommend/types.d.ts.map +1 -0
- package/dist/medical/recommend/types.js +20 -0
- package/dist/medical/recommend/types.js.map +1 -0
- package/dist/medical/recommend/urgency.d.ts +26 -0
- package/dist/medical/recommend/urgency.d.ts.map +1 -0
- package/dist/medical/recommend/urgency.js +124 -0
- package/dist/medical/recommend/urgency.js.map +1 -0
- package/dist/medical/research/online-research.d.ts +65 -0
- package/dist/medical/research/online-research.d.ts.map +1 -0
- package/dist/medical/research/online-research.js +101 -0
- package/dist/medical/research/online-research.js.map +1 -0
- package/dist/medical/research/research-note.d.ts +32 -0
- package/dist/medical/research/research-note.d.ts.map +1 -0
- package/dist/medical/research/research-note.js +55 -0
- package/dist/medical/research/research-note.js.map +1 -0
- package/dist/medical/supplements.d.ts +82 -0
- package/dist/medical/supplements.d.ts.map +1 -0
- package/dist/medical/supplements.js +173 -0
- package/dist/medical/supplements.js.map +1 -0
- package/dist/orchestrator/agentic-loop.d.ts +160 -1
- package/dist/orchestrator/agentic-loop.d.ts.map +1 -1
- package/dist/orchestrator/agentic-loop.js +350 -41
- package/dist/orchestrator/agentic-loop.js.map +1 -1
- package/dist/orchestrator/compaction.d.ts +47 -0
- package/dist/orchestrator/compaction.d.ts.map +1 -0
- package/dist/orchestrator/compaction.js +75 -0
- package/dist/orchestrator/compaction.js.map +1 -0
- package/dist/orchestrator/generator-agent.d.ts +19 -0
- package/dist/orchestrator/generator-agent.d.ts.map +1 -1
- package/dist/orchestrator/generator-agent.js +27 -1
- package/dist/orchestrator/generator-agent.js.map +1 -1
- package/dist/orchestrator/loop-events.d.ts +98 -0
- package/dist/orchestrator/loop-events.d.ts.map +1 -0
- package/dist/orchestrator/loop-events.js +2 -0
- package/dist/orchestrator/loop-events.js.map +1 -0
- package/dist/orchestrator/model-resolver.d.ts.map +1 -1
- package/dist/orchestrator/model-resolver.js +10 -6
- package/dist/orchestrator/model-resolver.js.map +1 -1
- package/dist/orchestrator/pipeline.d.ts +10 -1
- package/dist/orchestrator/pipeline.d.ts.map +1 -1
- package/dist/orchestrator/pipeline.js +102 -4
- package/dist/orchestrator/pipeline.js.map +1 -1
- package/dist/orchestrator/security-audit-types.d.ts +53 -0
- package/dist/orchestrator/security-audit-types.d.ts.map +1 -0
- package/dist/orchestrator/security-audit-types.js +10 -0
- package/dist/orchestrator/security-audit-types.js.map +1 -0
- package/dist/orchestrator/security-auditor-agent.d.ts +68 -0
- package/dist/orchestrator/security-auditor-agent.d.ts.map +1 -0
- package/dist/orchestrator/security-auditor-agent.js +482 -0
- package/dist/orchestrator/security-auditor-agent.js.map +1 -0
- package/dist/orchestrator/security-gate.d.ts +73 -0
- package/dist/orchestrator/security-gate.d.ts.map +1 -0
- package/dist/orchestrator/security-gate.js +174 -0
- package/dist/orchestrator/security-gate.js.map +1 -0
- package/dist/orchestrator/security-hub.d.ts +45 -0
- package/dist/orchestrator/security-hub.d.ts.map +1 -0
- package/dist/orchestrator/security-hub.js +147 -0
- package/dist/orchestrator/security-hub.js.map +1 -0
- package/dist/orchestrator/security-knowledge/benchmark/harness.d.ts +43 -0
- package/dist/orchestrator/security-knowledge/benchmark/harness.d.ts.map +1 -0
- package/dist/orchestrator/security-knowledge/benchmark/harness.js +13 -0
- package/dist/orchestrator/security-knowledge/benchmark/harness.js.map +1 -0
- package/dist/orchestrator/security-knowledge/diff-provider.d.ts +79 -0
- package/dist/orchestrator/security-knowledge/diff-provider.d.ts.map +1 -0
- package/dist/orchestrator/security-knowledge/diff-provider.js +320 -0
- package/dist/orchestrator/security-knowledge/diff-provider.js.map +1 -0
- package/dist/orchestrator/security-knowledge/index.d.ts +22 -0
- package/dist/orchestrator/security-knowledge/index.d.ts.map +1 -0
- package/dist/orchestrator/security-knowledge/index.js +66 -0
- package/dist/orchestrator/security-knowledge/index.js.map +1 -0
- package/dist/orchestrator/security-knowledge/parser.d.ts +9 -0
- package/dist/orchestrator/security-knowledge/parser.d.ts.map +1 -0
- package/dist/orchestrator/security-knowledge/parser.js +137 -0
- package/dist/orchestrator/security-knowledge/parser.js.map +1 -0
- package/dist/orchestrator/security-knowledge/registry.d.ts +25 -0
- package/dist/orchestrator/security-knowledge/registry.d.ts.map +1 -0
- package/dist/orchestrator/security-knowledge/registry.js +114 -0
- package/dist/orchestrator/security-knowledge/registry.js.map +1 -0
- package/dist/orchestrator/security-knowledge/resolver.d.ts +48 -0
- package/dist/orchestrator/security-knowledge/resolver.d.ts.map +1 -0
- package/dist/orchestrator/security-knowledge/resolver.js +63 -0
- package/dist/orchestrator/security-knowledge/resolver.js.map +1 -0
- package/dist/orchestrator/security-knowledge/selector.d.ts +18 -0
- package/dist/orchestrator/security-knowledge/selector.d.ts.map +1 -0
- package/dist/orchestrator/security-knowledge/selector.js +46 -0
- package/dist/orchestrator/security-knowledge/selector.js.map +1 -0
- package/dist/orchestrator/security-knowledge/signature.d.ts +37 -0
- package/dist/orchestrator/security-knowledge/signature.d.ts.map +1 -0
- package/dist/orchestrator/security-knowledge/signature.js +2 -0
- package/dist/orchestrator/security-knowledge/signature.js.map +1 -0
- package/dist/orchestrator/security-knowledge/supply-chain-inspector.d.ts +29 -0
- package/dist/orchestrator/security-knowledge/supply-chain-inspector.d.ts.map +1 -0
- package/dist/orchestrator/security-knowledge/supply-chain-inspector.js +211 -0
- package/dist/orchestrator/security-knowledge/supply-chain-inspector.js.map +1 -0
- package/dist/orchestrator/security-scanners.d.ts +126 -0
- package/dist/orchestrator/security-scanners.d.ts.map +1 -0
- package/dist/orchestrator/security-scanners.js +501 -0
- package/dist/orchestrator/security-scanners.js.map +1 -0
- package/dist/orchestrator/security-verifier-agent.d.ts +62 -0
- package/dist/orchestrator/security-verifier-agent.d.ts.map +1 -0
- package/dist/orchestrator/security-verifier-agent.js +230 -0
- package/dist/orchestrator/security-verifier-agent.js.map +1 -0
- package/dist/orchestrator/session-store.d.ts +95 -0
- package/dist/orchestrator/session-store.d.ts.map +1 -0
- package/dist/orchestrator/session-store.js +186 -0
- package/dist/orchestrator/session-store.js.map +1 -0
- package/dist/orchestrator/stack-knowledge.d.ts +17 -0
- package/dist/orchestrator/stack-knowledge.d.ts.map +1 -0
- package/dist/orchestrator/stack-knowledge.js +35 -0
- package/dist/orchestrator/stack-knowledge.js.map +1 -0
- package/dist/orchestrator/subagents.d.ts +62 -0
- package/dist/orchestrator/subagents.d.ts.map +1 -0
- package/dist/orchestrator/subagents.js +143 -0
- package/dist/orchestrator/subagents.js.map +1 -0
- package/dist/orchestrator/tools/executor.d.ts +68 -0
- package/dist/orchestrator/tools/executor.d.ts.map +1 -0
- package/dist/orchestrator/tools/executor.js +104 -0
- package/dist/orchestrator/tools/executor.js.map +1 -0
- package/dist/orchestrator/tools/mcp-bridge.d.ts +76 -0
- package/dist/orchestrator/tools/mcp-bridge.d.ts.map +1 -0
- package/dist/orchestrator/tools/mcp-bridge.js +154 -0
- package/dist/orchestrator/tools/mcp-bridge.js.map +1 -0
- package/dist/orchestrator/tools/schemas.d.ts.map +1 -1
- package/dist/orchestrator/tools/schemas.js +3 -0
- package/dist/orchestrator/tools/schemas.js.map +1 -1
- package/dist/orchestrator/workflow/budget.d.ts +24 -2
- package/dist/orchestrator/workflow/budget.d.ts.map +1 -1
- package/dist/orchestrator/workflow/budget.js +39 -1
- package/dist/orchestrator/workflow/budget.js.map +1 -1
- package/dist/orchestrator/workflow/engine.d.ts +1 -1
- package/dist/orchestrator/workflow/engine.d.ts.map +1 -1
- package/dist/orchestrator/workflow/selector.d.ts.map +1 -1
- package/dist/orchestrator/workflow/selector.js +10 -0
- package/dist/orchestrator/workflow/selector.js.map +1 -1
- package/dist/providers/anthropic.d.ts.map +1 -1
- package/dist/providers/anthropic.js +116 -26
- package/dist/providers/anthropic.js.map +1 -1
- package/dist/providers/claude-code.d.ts.map +1 -1
- package/dist/providers/claude-code.js +17 -0
- package/dist/providers/claude-code.js.map +1 -1
- package/dist/providers/cost-meter.d.ts +52 -0
- package/dist/providers/cost-meter.d.ts.map +1 -0
- package/dist/providers/cost-meter.js +81 -0
- package/dist/providers/cost-meter.js.map +1 -0
- package/dist/providers/factory.d.ts +6 -1
- package/dist/providers/factory.d.ts.map +1 -1
- package/dist/providers/factory.js +24 -5
- package/dist/providers/factory.js.map +1 -1
- package/dist/providers/google.d.ts.map +1 -1
- package/dist/providers/google.js +29 -0
- package/dist/providers/google.js.map +1 -1
- package/dist/providers/grounded-search.d.ts +128 -0
- package/dist/providers/grounded-search.d.ts.map +1 -0
- package/dist/providers/grounded-search.js +160 -0
- package/dist/providers/grounded-search.js.map +1 -0
- package/dist/providers/openai-compat.d.ts +15 -1
- package/dist/providers/openai-compat.d.ts.map +1 -1
- package/dist/providers/openai-compat.js +24 -0
- package/dist/providers/openai-compat.js.map +1 -1
- package/dist/providers/openai.d.ts +7 -0
- package/dist/providers/openai.d.ts.map +1 -1
- package/dist/providers/openai.js +95 -4
- package/dist/providers/openai.js.map +1 -1
- package/dist/providers/types.d.ts +88 -0
- package/dist/providers/types.d.ts.map +1 -1
- package/dist/research/cadence.d.ts +33 -0
- package/dist/research/cadence.d.ts.map +1 -0
- package/dist/research/cadence.js +55 -0
- package/dist/research/cadence.js.map +1 -0
- package/dist/research/digest.d.ts +80 -0
- package/dist/research/digest.d.ts.map +1 -0
- package/dist/research/digest.js +119 -0
- package/dist/research/digest.js.map +1 -0
- package/dist/research/egress.d.ts +28 -0
- package/dist/research/egress.d.ts.map +1 -0
- package/dist/research/egress.js +41 -0
- package/dist/research/egress.js.map +1 -0
- package/dist/research/job-store.d.ts +30 -0
- package/dist/research/job-store.d.ts.map +1 -0
- package/dist/research/job-store.js +100 -0
- package/dist/research/job-store.js.map +1 -0
- package/dist/research/model-diversity.d.ts +27 -0
- package/dist/research/model-diversity.d.ts.map +1 -0
- package/dist/research/model-diversity.js +52 -0
- package/dist/research/model-diversity.js.map +1 -0
- package/dist/research/note-writer.d.ts +36 -0
- package/dist/research/note-writer.d.ts.map +1 -0
- package/dist/research/note-writer.js +53 -0
- package/dist/research/note-writer.js.map +1 -0
- package/dist/research/online-retrieval.d.ts +27 -0
- package/dist/research/online-retrieval.d.ts.map +1 -0
- package/dist/research/online-retrieval.js +22 -0
- package/dist/research/online-retrieval.js.map +1 -0
- package/dist/research/runner.d.ts +80 -0
- package/dist/research/runner.d.ts.map +1 -0
- package/dist/research/runner.js +115 -0
- package/dist/research/runner.js.map +1 -0
- package/dist/research/scheduler.d.ts +61 -0
- package/dist/research/scheduler.d.ts.map +1 -0
- package/dist/research/scheduler.js +58 -0
- package/dist/research/scheduler.js.map +1 -0
- package/dist/research/types.d.ts +81 -0
- package/dist/research/types.d.ts.map +1 -0
- package/dist/research/types.js +57 -0
- package/dist/research/types.js.map +1 -0
- package/dist/seo/adapters/http.d.ts +43 -0
- package/dist/seo/adapters/http.d.ts.map +1 -0
- package/dist/seo/adapters/http.js +35 -0
- package/dist/seo/adapters/http.js.map +1 -0
- package/dist/seo/ai-visibility-provider.d.ts +171 -0
- package/dist/seo/ai-visibility-provider.d.ts.map +1 -0
- package/dist/seo/ai-visibility-provider.js +165 -0
- package/dist/seo/ai-visibility-provider.js.map +1 -0
- package/dist/seo/ai-visibility-scorer.d.ts +43 -0
- package/dist/seo/ai-visibility-scorer.d.ts.map +1 -0
- package/dist/seo/ai-visibility-scorer.js +102 -0
- package/dist/seo/ai-visibility-scorer.js.map +1 -0
- package/dist/seo/analyzer.d.ts +58 -0
- package/dist/seo/analyzer.d.ts.map +1 -0
- package/dist/seo/analyzer.js +265 -0
- package/dist/seo/analyzer.js.map +1 -0
- package/dist/seo/benchmark/harness.d.ts +56 -0
- package/dist/seo/benchmark/harness.d.ts.map +1 -0
- package/dist/seo/benchmark/harness.js +172 -0
- package/dist/seo/benchmark/harness.js.map +1 -0
- package/dist/seo/builder/approved-finding.d.ts +115 -0
- package/dist/seo/builder/approved-finding.d.ts.map +1 -0
- package/dist/seo/builder/approved-finding.js +145 -0
- package/dist/seo/builder/approved-finding.js.map +1 -0
- package/dist/seo/builder/build-runner.d.ts +41 -0
- package/dist/seo/builder/build-runner.d.ts.map +1 -0
- package/dist/seo/builder/build-runner.js +156 -0
- package/dist/seo/builder/build-runner.js.map +1 -0
- package/dist/seo/builder/draft-generators.d.ts +32 -0
- package/dist/seo/builder/draft-generators.d.ts.map +1 -0
- package/dist/seo/builder/draft-generators.js +31 -0
- package/dist/seo/builder/draft-generators.js.map +1 -0
- package/dist/seo/builder/draft-store.d.ts +30 -0
- package/dist/seo/builder/draft-store.d.ts.map +1 -0
- package/dist/seo/builder/draft-store.js +76 -0
- package/dist/seo/builder/draft-store.js.map +1 -0
- package/dist/seo/builder/draft-types.d.ts +36 -0
- package/dist/seo/builder/draft-types.d.ts.map +1 -0
- package/dist/seo/builder/draft-types.js +14 -0
- package/dist/seo/builder/draft-types.js.map +1 -0
- package/dist/seo/builder/hub-approved-source.d.ts +11 -0
- package/dist/seo/builder/hub-approved-source.d.ts.map +1 -0
- package/dist/seo/builder/hub-approved-source.js +48 -0
- package/dist/seo/builder/hub-approved-source.js.map +1 -0
- package/dist/seo/builder/seo-builder.d.ts +72 -0
- package/dist/seo/builder/seo-builder.d.ts.map +1 -0
- package/dist/seo/builder/seo-builder.js +72 -0
- package/dist/seo/builder/seo-builder.js.map +1 -0
- package/dist/seo/citation-gate.d.ts +36 -0
- package/dist/seo/citation-gate.d.ts.map +1 -0
- package/dist/seo/citation-gate.js +59 -0
- package/dist/seo/citation-gate.js.map +1 -0
- package/dist/seo/command.d.ts +11 -0
- package/dist/seo/command.d.ts.map +1 -0
- package/dist/seo/command.js +90 -0
- package/dist/seo/command.js.map +1 -0
- package/dist/seo/content-sanitizer.d.ts +56 -0
- package/dist/seo/content-sanitizer.d.ts.map +1 -0
- package/dist/seo/content-sanitizer.js +55 -0
- package/dist/seo/content-sanitizer.js.map +1 -0
- package/dist/seo/crawl-engine.d.ts +35 -0
- package/dist/seo/crawl-engine.d.ts.map +1 -0
- package/dist/seo/crawl-engine.js +2 -0
- package/dist/seo/crawl-engine.js.map +1 -0
- package/dist/seo/data-source.d.ts +156 -0
- package/dist/seo/data-source.d.ts.map +1 -0
- package/dist/seo/data-source.js +2 -0
- package/dist/seo/data-source.js.map +1 -0
- package/dist/seo/egress.d.ts +39 -0
- package/dist/seo/egress.d.ts.map +1 -0
- package/dist/seo/egress.js +64 -0
- package/dist/seo/egress.js.map +1 -0
- package/dist/seo/hub-emitter.d.ts +28 -0
- package/dist/seo/hub-emitter.d.ts.map +1 -0
- package/dist/seo/hub-emitter.js +95 -0
- package/dist/seo/hub-emitter.js.map +1 -0
- package/dist/seo/index.d.ts +42 -0
- package/dist/seo/index.d.ts.map +1 -0
- package/dist/seo/index.js +19 -0
- package/dist/seo/index.js.map +1 -0
- package/dist/seo/never-encode-filter.d.ts +45 -0
- package/dist/seo/never-encode-filter.d.ts.map +1 -0
- package/dist/seo/never-encode-filter.js +51 -0
- package/dist/seo/never-encode-filter.js.map +1 -0
- package/dist/seo/parser.d.ts +46 -0
- package/dist/seo/parser.d.ts.map +1 -0
- package/dist/seo/parser.js +113 -0
- package/dist/seo/parser.js.map +1 -0
- package/dist/seo/playbook-index.d.ts +19 -0
- package/dist/seo/playbook-index.d.ts.map +1 -0
- package/dist/seo/playbook-index.js +74 -0
- package/dist/seo/playbook-index.js.map +1 -0
- package/dist/seo/quota-governor.d.ts +100 -0
- package/dist/seo/quota-governor.d.ts.map +1 -0
- package/dist/seo/quota-governor.js +199 -0
- package/dist/seo/quota-governor.js.map +1 -0
- package/dist/seo/quota-ledger.d.ts +50 -0
- package/dist/seo/quota-ledger.d.ts.map +1 -0
- package/dist/seo/quota-ledger.js +95 -0
- package/dist/seo/quota-ledger.js.map +1 -0
- package/dist/seo/report-store.d.ts +30 -0
- package/dist/seo/report-store.d.ts.map +1 -0
- package/dist/seo/report-store.js +94 -0
- package/dist/seo/report-store.js.map +1 -0
- package/dist/seo/retriever.d.ts +34 -0
- package/dist/seo/retriever.d.ts.map +1 -0
- package/dist/seo/retriever.js +95 -0
- package/dist/seo/retriever.js.map +1 -0
- package/dist/seo/runner.d.ts +108 -0
- package/dist/seo/runner.d.ts.map +1 -0
- package/dist/seo/runner.js +512 -0
- package/dist/seo/runner.js.map +1 -0
- package/dist/seo/scrape-throttle.d.ts +84 -0
- package/dist/seo/scrape-throttle.d.ts.map +1 -0
- package/dist/seo/scrape-throttle.js +149 -0
- package/dist/seo/scrape-throttle.js.map +1 -0
- package/dist/seo/serp-provider.d.ts +52 -0
- package/dist/seo/serp-provider.d.ts.map +1 -0
- package/dist/seo/serp-provider.js +17 -0
- package/dist/seo/serp-provider.js.map +1 -0
- package/dist/seo/sources/ai-visibility-adapter.d.ts +87 -0
- package/dist/seo/sources/ai-visibility-adapter.d.ts.map +1 -0
- package/dist/seo/sources/ai-visibility-adapter.js +85 -0
- package/dist/seo/sources/ai-visibility-adapter.js.map +1 -0
- package/dist/seo/sources/api-spine-provider.d.ts +66 -0
- package/dist/seo/sources/api-spine-provider.d.ts.map +1 -0
- package/dist/seo/sources/api-spine-provider.js +68 -0
- package/dist/seo/sources/api-spine-provider.js.map +1 -0
- package/dist/seo/sources/citation-verifier.d.ts +95 -0
- package/dist/seo/sources/citation-verifier.d.ts.map +1 -0
- package/dist/seo/sources/citation-verifier.js +106 -0
- package/dist/seo/sources/citation-verifier.js.map +1 -0
- package/dist/seo/sources/crawl-source.d.ts +62 -0
- package/dist/seo/sources/crawl-source.d.ts.map +1 -0
- package/dist/seo/sources/crawl-source.js +87 -0
- package/dist/seo/sources/crawl-source.js.map +1 -0
- package/dist/seo/sources/damcrawler-crawl-engine.d.ts +151 -0
- package/dist/seo/sources/damcrawler-crawl-engine.d.ts.map +1 -0
- package/dist/seo/sources/damcrawler-crawl-engine.js +154 -0
- package/dist/seo/sources/damcrawler-crawl-engine.js.map +1 -0
- package/dist/seo/sources/damcrawler-serp-provider.d.ts +75 -0
- package/dist/seo/sources/damcrawler-serp-provider.d.ts.map +1 -0
- package/dist/seo/sources/damcrawler-serp-provider.js +60 -0
- package/dist/seo/sources/damcrawler-serp-provider.js.map +1 -0
- package/dist/seo/sources/dataforseo-adapter.d.ts +46 -0
- package/dist/seo/sources/dataforseo-adapter.d.ts.map +1 -0
- package/dist/seo/sources/dataforseo-adapter.js +335 -0
- package/dist/seo/sources/dataforseo-adapter.js.map +1 -0
- package/dist/seo/sources/dataforseo-serp-provider.d.ts +30 -0
- package/dist/seo/sources/dataforseo-serp-provider.d.ts.map +1 -0
- package/dist/seo/sources/dataforseo-serp-provider.js +20 -0
- package/dist/seo/sources/dataforseo-serp-provider.js.map +1 -0
- package/dist/seo/sources/engine-scrape-parser-chatgpt.d.ts +62 -0
- package/dist/seo/sources/engine-scrape-parser-chatgpt.d.ts.map +1 -0
- package/dist/seo/sources/engine-scrape-parser-chatgpt.js +72 -0
- package/dist/seo/sources/engine-scrape-parser-chatgpt.js.map +1 -0
- package/dist/seo/sources/engine-scrape-parser-perplexity.d.ts +10 -0
- package/dist/seo/sources/engine-scrape-parser-perplexity.d.ts.map +1 -0
- package/dist/seo/sources/engine-scrape-parser-perplexity.js +72 -0
- package/dist/seo/sources/engine-scrape-parser-perplexity.js.map +1 -0
- package/dist/seo/sources/gsc-adapter.d.ts +64 -0
- package/dist/seo/sources/gsc-adapter.d.ts.map +1 -0
- package/dist/seo/sources/gsc-adapter.js +221 -0
- package/dist/seo/sources/gsc-adapter.js.map +1 -0
- package/dist/seo/sources/local-export.d.ts +53 -0
- package/dist/seo/sources/local-export.d.ts.map +1 -0
- package/dist/seo/sources/local-export.js +307 -0
- package/dist/seo/sources/local-export.js.map +1 -0
- package/dist/seo/sources/mention-citation-extractor.d.ts +136 -0
- package/dist/seo/sources/mention-citation-extractor.d.ts.map +1 -0
- package/dist/seo/sources/mention-citation-extractor.js +272 -0
- package/dist/seo/sources/mention-citation-extractor.js.map +1 -0
- package/dist/seo/sources/scrape-arm-provider.d.ts +109 -0
- package/dist/seo/sources/scrape-arm-provider.d.ts.map +1 -0
- package/dist/seo/sources/scrape-arm-provider.js +129 -0
- package/dist/seo/sources/scrape-arm-provider.js.map +1 -0
- package/dist/seo/tracked-prompt-store.d.ts +33 -0
- package/dist/seo/tracked-prompt-store.d.ts.map +1 -0
- package/dist/seo/tracked-prompt-store.js +68 -0
- package/dist/seo/tracked-prompt-store.js.map +1 -0
- package/dist/seo/types.d.ts +128 -0
- package/dist/seo/types.d.ts.map +1 -0
- package/dist/seo/types.js +14 -0
- package/dist/seo/types.js.map +1 -0
- package/dist/seo/verifier.d.ts +34 -0
- package/dist/seo/verifier.d.ts.map +1 -0
- package/dist/seo/verifier.js +204 -0
- package/dist/seo/verifier.js.map +1 -0
- package/dist/seo/workflow-capabilities.d.ts +26 -0
- package/dist/seo/workflow-capabilities.d.ts.map +1 -0
- package/dist/seo/workflow-capabilities.js +12 -0
- package/dist/seo/workflow-capabilities.js.map +1 -0
- package/dist/state/facts.d.ts +5 -1
- package/dist/state/facts.d.ts.map +1 -1
- package/dist/state/facts.js +29 -19
- package/dist/state/facts.js.map +1 -1
- package/dist/state/index.d.ts +1 -1
- package/dist/state/index.d.ts.map +1 -1
- package/dist/state/index.js +1 -1
- package/dist/state/index.js.map +1 -1
- package/dist/state/outline-state.d.ts +0 -12
- package/dist/state/outline-state.d.ts.map +1 -1
- package/dist/state/outline-state.js +1 -18
- package/dist/state/outline-state.js.map +1 -1
- package/dist/state/security-audit-state.d.ts +20 -0
- package/dist/state/security-audit-state.d.ts.map +1 -0
- package/dist/state/security-audit-state.js +59 -0
- package/dist/state/security-audit-state.js.map +1 -0
- package/dist/teams/registry.d.ts.map +1 -1
- package/dist/teams/registry.js +17 -0
- package/dist/teams/registry.js.map +1 -1
- package/dist/telegram/bot.d.ts +137 -0
- package/dist/telegram/bot.d.ts.map +1 -0
- package/dist/telegram/bot.js +323 -0
- package/dist/telegram/bot.js.map +1 -0
- package/dist/telegram/digest.d.ts +19 -0
- package/dist/telegram/digest.d.ts.map +1 -0
- package/dist/telegram/digest.js +23 -0
- package/dist/telegram/digest.js.map +1 -0
- package/dist/telegram/fleet-view.d.ts +38 -0
- package/dist/telegram/fleet-view.d.ts.map +1 -0
- package/dist/telegram/fleet-view.js +98 -0
- package/dist/telegram/fleet-view.js.map +1 -0
- package/dist/telegram/handlers/approvals.d.ts +61 -0
- package/dist/telegram/handlers/approvals.d.ts.map +1 -0
- package/dist/telegram/handlers/approvals.js +122 -0
- package/dist/telegram/handlers/approvals.js.map +1 -0
- package/dist/telegram/handlers/capture.d.ts +43 -0
- package/dist/telegram/handlers/capture.d.ts.map +1 -0
- package/dist/telegram/handlers/capture.js +51 -0
- package/dist/telegram/handlers/capture.js.map +1 -0
- package/dist/telegram/handlers/prioritize.d.ts +50 -0
- package/dist/telegram/handlers/prioritize.d.ts.map +1 -0
- package/dist/telegram/handlers/prioritize.js +99 -0
- package/dist/telegram/handlers/prioritize.js.map +1 -0
- package/dist/telegram/handlers/upload.d.ts +105 -0
- package/dist/telegram/handlers/upload.d.ts.map +1 -0
- package/dist/telegram/handlers/upload.js +149 -0
- package/dist/telegram/handlers/upload.js.map +1 -0
- package/dist/telegram/keyboard.d.ts +48 -0
- package/dist/telegram/keyboard.d.ts.map +1 -0
- package/dist/telegram/keyboard.js +81 -0
- package/dist/telegram/keyboard.js.map +1 -0
- package/dist/telegram/outbound.d.ts +77 -0
- package/dist/telegram/outbound.d.ts.map +1 -0
- package/dist/telegram/outbound.js +45 -0
- package/dist/telegram/outbound.js.map +1 -0
- package/dist/telegram/router.d.ts +46 -0
- package/dist/telegram/router.d.ts.map +1 -0
- package/dist/telegram/router.js +63 -0
- package/dist/telegram/router.js.map +1 -0
- package/dist/telegram/streaming.d.ts +36 -0
- package/dist/telegram/streaming.d.ts.map +1 -0
- package/dist/telegram/streaming.js +55 -0
- package/dist/telegram/streaming.js.map +1 -0
- package/dist/telegram/whitelist.d.ts +20 -0
- package/dist/telegram/whitelist.d.ts.map +1 -0
- package/dist/telegram/whitelist.js +34 -0
- package/dist/telegram/whitelist.js.map +1 -0
- package/dist/utils/git.d.ts +0 -6
- package/dist/utils/git.d.ts.map +1 -1
- package/dist/utils/git.js +0 -19
- package/dist/utils/git.js.map +1 -1
- package/dist/utils/index.d.ts +1 -1
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +1 -1
- package/dist/utils/index.js.map +1 -1
- package/dist/vault/conventions.d.ts +23 -0
- package/dist/vault/conventions.d.ts.map +1 -0
- package/dist/vault/conventions.js +22 -0
- package/dist/vault/conventions.js.map +1 -0
- package/dist/vault/frontmatter.d.ts +47 -0
- package/dist/vault/frontmatter.d.ts.map +1 -0
- package/dist/vault/frontmatter.js +149 -0
- package/dist/vault/frontmatter.js.map +1 -0
- package/dist/vault/index-map.d.ts +35 -0
- package/dist/vault/index-map.d.ts.map +1 -0
- package/dist/vault/index-map.js +67 -0
- package/dist/vault/index-map.js.map +1 -0
- package/dist/vault/mcp-adapter.d.ts +96 -0
- package/dist/vault/mcp-adapter.d.ts.map +1 -0
- package/dist/vault/mcp-adapter.js +176 -0
- package/dist/vault/mcp-adapter.js.map +1 -0
- package/dist/vault/note-io.d.ts +29 -0
- package/dist/vault/note-io.d.ts.map +1 -0
- package/dist/vault/note-io.js +44 -0
- package/dist/vault/note-io.js.map +1 -0
- package/dist/vault/profile.d.ts +35 -0
- package/dist/vault/profile.d.ts.map +1 -0
- package/dist/vault/profile.js +50 -0
- package/dist/vault/profile.js.map +1 -0
- package/dist/vault/reindex.d.ts +55 -0
- package/dist/vault/reindex.d.ts.map +1 -0
- package/dist/vault/reindex.js +69 -0
- package/dist/vault/reindex.js.map +1 -0
- package/dist/vault/types.d.ts +25 -0
- package/dist/vault/types.d.ts.map +1 -0
- package/dist/vault/types.js +9 -0
- package/dist/vault/types.js.map +1 -0
- package/package.json +20 -4
- package/scripts/sync-targets.json +2 -1
- package/skills/bober.design/SKILL.md +190 -0
- package/skills/bober.design/references/1-anti-slop.md +102 -0
- package/skills/bober.design/references/2-design-brief.md +84 -0
- package/skills/bober.design/references/3-critique-rubric.md +62 -0
- package/skills/bober.design/references/4-copy-guide.md +43 -0
- package/skills/bober.plan/SKILL.md +15 -1
- package/skills/bober.run/SKILL.md +7 -4
- package/skills/bober.security-anchor/SKILL.md +172 -0
- package/skills/bober.security-audit/SKILL.md +288 -0
- package/skills/bober.security-dex-backend/SKILL.md +306 -0
- package/skills/bober.security-generic/SKILL.md +295 -0
- package/skills/bober.security-igaming/SKILL.md +290 -0
- package/skills/bober.security-node/SKILL.md +267 -0
- package/skills/bober.security-payments/SKILL.md +249 -0
- package/skills/bober.security-react/SKILL.md +194 -0
- package/skills/bober.security-solidity/SKILL.md +306 -0
- package/skills/bober.seo/SKILL.md +132 -0
- package/skills/bober.seo-ai-visibility/SKILL.md +110 -0
- package/skills/bober.seo-content-decay/SKILL.md +99 -0
- package/skills/bober.seo-generic/SKILL.md +173 -0
- package/skills/bober.seo-internal-linking/SKILL.md +87 -0
- package/skills/bober.seo-parasite-watch/SKILL.md +121 -0
- package/skills/bober.seo-rank-track/SKILL.md +98 -0
- package/skills/bober.seo-schema-audit/SKILL.md +97 -0
- package/skills/bober.seo-technical-audit/SKILL.md +113 -0
- package/skills/bober.seo-topical-map/SKILL.md +100 -0
- package/skills/bober.seo-verticals/SKILL.md +133 -0
- package/skills/bober.using-bober/SKILL.md +1 -0
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
// ── Coding domains ────────────────────────────────────────────────────
|
|
2
|
+
/**
|
|
3
|
+
* Domains the coding promoter handles.
|
|
4
|
+
* Finding.domain is a free string (not an enum), so we match literals here.
|
|
5
|
+
* Contract assumption 3: coding/projects Findings are promoted to bober-run tasks.
|
|
6
|
+
*/
|
|
7
|
+
const CODING_DOMAINS = new Set(["coding", "projects"]);
|
|
8
|
+
// ── codingPromoter ────────────────────────────────────────────────────
|
|
9
|
+
/**
|
|
10
|
+
* Converts a coding or projects Finding into a bober-run PromotionPlan.
|
|
11
|
+
*
|
|
12
|
+
* task derivation (one-line, non-empty):
|
|
13
|
+
* 1. Base: finding.title (always present and non-empty per FindingSchema).
|
|
14
|
+
* 2. Evidence: up to 2 evidence lines appended as context (dash-separated).
|
|
15
|
+
* 3. teamId: extracted from the first "team:<id>" tag, or undefined (default team).
|
|
16
|
+
*
|
|
17
|
+
* PURE: no I/O, no clock read, no side effects.
|
|
18
|
+
*/
|
|
19
|
+
export function codingPromoter(finding) {
|
|
20
|
+
// Extract optional teamId from a "team:<id>" tag
|
|
21
|
+
const teamTag = finding.tags.find((t) => t.startsWith("team:"));
|
|
22
|
+
const teamId = teamTag !== undefined ? teamTag.slice("team:".length) : undefined;
|
|
23
|
+
// Build the one-line task from title + optional evidence context
|
|
24
|
+
let task = finding.title;
|
|
25
|
+
if (finding.evidence.length > 0) {
|
|
26
|
+
const evidenceSummary = finding.evidence.slice(0, 2).join("; ");
|
|
27
|
+
task = `${task} — ${evidenceSummary}`;
|
|
28
|
+
}
|
|
29
|
+
return {
|
|
30
|
+
kind: "bober-run",
|
|
31
|
+
task,
|
|
32
|
+
teamId,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
// ── Domain guard ──────────────────────────────────────────────────────
|
|
36
|
+
/**
|
|
37
|
+
* Returns true when the finding's domain is one the coding promoter handles.
|
|
38
|
+
* Used by the CLI registration to register the promoter under all applicable domains.
|
|
39
|
+
*/
|
|
40
|
+
export function isCodingDomain(domain) {
|
|
41
|
+
return CODING_DOMAINS.has(domain);
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=coding-promoter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coding-promoter.js","sourceRoot":"","sources":["../../src/do-bridge/coding-promoter.ts"],"names":[],"mappings":"AAGA,yEAAyE;AAEzE;;;;GAIG;AACH,MAAM,cAAc,GAAG,IAAI,GAAG,CAAS,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC;AAE/D,yEAAyE;AAEzE;;;;;;;;;GASG;AACH,MAAM,UAAU,cAAc,CAAC,OAAgB;IAC7C,iDAAiD;IACjD,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC;IAChE,MAAM,MAAM,GAAG,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAEjF,iEAAiE;IACjE,IAAI,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC;IACzB,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChC,MAAM,eAAe,GAAG,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChE,IAAI,GAAG,GAAG,IAAI,MAAM,eAAe,EAAE,CAAC;IACxC,CAAC;IAED,OAAO;QACL,IAAI,EAAE,WAAW;QACjB,IAAI;QACJ,MAAM;KACP,CAAC;AACJ,CAAC;AAED,yEAAyE;AAEzE;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,MAAc;IAC3C,OAAO,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;AACpC,CAAC"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import type { Finding } from "../hub/finding.js";
|
|
2
|
+
import type { FactStore } from "../state/facts.js";
|
|
3
|
+
import type { PromotionRef } from "./types.js";
|
|
4
|
+
/**
|
|
5
|
+
* Do-bridge view of a Finding where promotesTo is a parsed PromotionRef
|
|
6
|
+
* object rather than the raw string stored on disk.
|
|
7
|
+
*
|
|
8
|
+
* FindingSchema.promotesTo is z.string().optional() — the hub schema is NOT
|
|
9
|
+
* modified. This type is owned by the do-bridge port layer; serialization
|
|
10
|
+
* and deserialization happen inside the adapters below.
|
|
11
|
+
*/
|
|
12
|
+
export type DoFinding = Omit<Finding, "promotesTo"> & {
|
|
13
|
+
promotesTo?: PromotionRef;
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* Narrow port for finding lookup and promotion state writes.
|
|
17
|
+
* Returns DoFinding (promotesTo as structured object) so callers never
|
|
18
|
+
* touch the raw JSON string stored on disk.
|
|
19
|
+
*/
|
|
20
|
+
export interface FindingStore {
|
|
21
|
+
/** Read a finding by id. Returns null if not found. */
|
|
22
|
+
readFinding(id: string): Promise<DoFinding | null>;
|
|
23
|
+
/**
|
|
24
|
+
* Set promotesTo = ref AND transition status open->in-progress in one call.
|
|
25
|
+
* Returns the updated DoFinding, or null if the id does not exist.
|
|
26
|
+
*/
|
|
27
|
+
setPromotion(id: string, ref: PromotionRef, opts: {
|
|
28
|
+
now: string;
|
|
29
|
+
}): Promise<DoFinding | null>;
|
|
30
|
+
/** Return all findings that currently carry a PromotionRef (promotesTo defined). */
|
|
31
|
+
listPromoted(): Promise<DoFinding[]>;
|
|
32
|
+
/**
|
|
33
|
+
* Transition a finding to an arbitrary status AND overwrite its promotesTo ref,
|
|
34
|
+
* in one supersede-aware write. Used by reconcile for done/open outcomes.
|
|
35
|
+
* Returns the updated DoFinding, or null if the id does not exist.
|
|
36
|
+
*/
|
|
37
|
+
applyOutcome(id: string, status: Finding["status"], ref: PromotionRef, opts: {
|
|
38
|
+
now: string;
|
|
39
|
+
}): Promise<DoFinding | null>;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* FactStore-backed adapter for FindingStore.
|
|
43
|
+
*
|
|
44
|
+
* readFinding: delegates to readFindings() (hub's canonical read path) and
|
|
45
|
+
* converts the string promotesTo to a PromotionRef object.
|
|
46
|
+
*
|
|
47
|
+
* setPromotion: serializes the ref to a JSON string, delegates to
|
|
48
|
+
* transitionFinding() (hub's supersede-aware UPDATE path) so bitemporal
|
|
49
|
+
* history is preserved, then converts the result back to DoFinding.
|
|
50
|
+
*/
|
|
51
|
+
export declare class FactStoreFindingStore implements FindingStore {
|
|
52
|
+
private readonly store;
|
|
53
|
+
constructor(store: FactStore);
|
|
54
|
+
readFinding(id: string): Promise<DoFinding | null>;
|
|
55
|
+
setPromotion(id: string, ref: PromotionRef, { now }: {
|
|
56
|
+
now: string;
|
|
57
|
+
}): Promise<DoFinding | null>;
|
|
58
|
+
listPromoted(): Promise<DoFinding[]>;
|
|
59
|
+
applyOutcome(id: string, status: Finding["status"], ref: PromotionRef, { now }: {
|
|
60
|
+
now: string;
|
|
61
|
+
}): Promise<DoFinding | null>;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* In-memory fake for tests — backed by a Map<string, DoFinding>.
|
|
65
|
+
*
|
|
66
|
+
* setPromotion stores the PromotionRef OBJECT directly (no serialization)
|
|
67
|
+
* so tests can assert promotesTo.runId / promotesTo.status on the result of
|
|
68
|
+
* readFinding without JSON.parse.
|
|
69
|
+
*
|
|
70
|
+
* `writes` records every setPromotion call:
|
|
71
|
+
* - sc-2-2/2-3: assert writes.length === 1 on approve
|
|
72
|
+
* - sc-2-4: assert writes.length === 0 on reject
|
|
73
|
+
*/
|
|
74
|
+
export declare class InMemoryFindingStore implements FindingStore {
|
|
75
|
+
private readonly map;
|
|
76
|
+
/** Records every setPromotion write. Tests assert .length for mutation count. */
|
|
77
|
+
readonly writes: DoFinding[];
|
|
78
|
+
constructor(seed?: Finding[]);
|
|
79
|
+
readFinding(id: string): Promise<DoFinding | null>;
|
|
80
|
+
setPromotion(id: string, ref: PromotionRef, _opts: {
|
|
81
|
+
now: string;
|
|
82
|
+
}): Promise<DoFinding | null>;
|
|
83
|
+
listPromoted(): Promise<DoFinding[]>;
|
|
84
|
+
applyOutcome(id: string, status: Finding["status"], ref: PromotionRef, _opts: {
|
|
85
|
+
now: string;
|
|
86
|
+
}): Promise<DoFinding | null>;
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=finding-port.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"finding-port.d.ts","sourceRoot":"","sources":["../../src/do-bridge/finding-port.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAEnD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAK/C;;;;;;;GAOG;AACH,MAAM,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,GAAG;IACpD,UAAU,CAAC,EAAE,YAAY,CAAC;CAC3B,CAAC;AAgBF;;;;GAIG;AACH,MAAM,WAAW,YAAY;IAC3B,uDAAuD;IACvD,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC;IAEnD;;;OAGG;IACH,YAAY,CACV,EAAE,EAAE,MAAM,EACV,GAAG,EAAE,YAAY,EACjB,IAAI,EAAE;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,GACpB,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC;IAE7B,oFAAoF;IACpF,YAAY,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;IAErC;;;;OAIG;IACH,YAAY,CACV,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,OAAO,CAAC,QAAQ,CAAC,EACzB,GAAG,EAAE,YAAY,EACjB,IAAI,EAAE;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,GACpB,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC;CAC9B;AAID;;;;;;;;;GASG;AACH,qBAAa,qBAAsB,YAAW,YAAY;IAC5C,OAAO,CAAC,QAAQ,CAAC,KAAK;gBAAL,KAAK,EAAE,SAAS;IAEvC,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;IAKlD,YAAY,CAChB,EAAE,EAAE,MAAM,EACV,GAAG,EAAE,YAAY,EACjB,EAAE,GAAG,EAAE,EAAE;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,GACvB,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;IAStB,YAAY,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IAIpC,YAAY,CAChB,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,OAAO,CAAC,QAAQ,CAAC,EACzB,GAAG,EAAE,YAAY,EACjB,EAAE,GAAG,EAAE,EAAE;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,GACvB,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;CAO7B;AAID;;;;;;;;;;GAUG;AACH,qBAAa,oBAAqB,YAAW,YAAY;IACvD,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAyB;IAE7C,iFAAiF;IACjF,QAAQ,CAAC,MAAM,EAAE,SAAS,EAAE,CAAM;gBAEtB,IAAI,GAAE,OAAO,EAAO;IAI1B,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;IAIlD,YAAY,CAChB,EAAE,EAAE,MAAM,EACV,GAAG,EAAE,YAAY,EACjB,KAAK,EAAE;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,GACrB,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;IAStB,YAAY,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IAIpC,YAAY,CAChB,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,OAAO,CAAC,QAAQ,CAAC,EACzB,GAAG,EAAE,YAAY,EACjB,KAAK,EAAE;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,GACrB,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;CAQ7B"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { readFindings, transitionFinding } from "../hub/finding-store.js";
|
|
2
|
+
import { serializePromotionRef, parsePromotionRef } from "./types.js";
|
|
3
|
+
// ── Internal helpers ──────────────────────────────────────────────────
|
|
4
|
+
/**
|
|
5
|
+
* Convert a hub Finding (string promotesTo) to a DoFinding (object promotesTo).
|
|
6
|
+
* If promotesTo is present but unparseable, it is dropped (undefined).
|
|
7
|
+
*/
|
|
8
|
+
function toDoFinding(f) {
|
|
9
|
+
const ref = f.promotesTo !== undefined ? (parsePromotionRef(f.promotesTo) ?? undefined) : undefined;
|
|
10
|
+
return { ...f, promotesTo: ref };
|
|
11
|
+
}
|
|
12
|
+
// ── FactStoreFindingStore ─────────────────────────────────────────────
|
|
13
|
+
/**
|
|
14
|
+
* FactStore-backed adapter for FindingStore.
|
|
15
|
+
*
|
|
16
|
+
* readFinding: delegates to readFindings() (hub's canonical read path) and
|
|
17
|
+
* converts the string promotesTo to a PromotionRef object.
|
|
18
|
+
*
|
|
19
|
+
* setPromotion: serializes the ref to a JSON string, delegates to
|
|
20
|
+
* transitionFinding() (hub's supersede-aware UPDATE path) so bitemporal
|
|
21
|
+
* history is preserved, then converts the result back to DoFinding.
|
|
22
|
+
*/
|
|
23
|
+
export class FactStoreFindingStore {
|
|
24
|
+
store;
|
|
25
|
+
constructor(store) {
|
|
26
|
+
this.store = store;
|
|
27
|
+
}
|
|
28
|
+
async readFinding(id) {
|
|
29
|
+
const f = readFindings(this.store).find((f) => f.id === id);
|
|
30
|
+
return f !== undefined ? toDoFinding(f) : null;
|
|
31
|
+
}
|
|
32
|
+
async setPromotion(id, ref, { now }) {
|
|
33
|
+
// Serialize the object ref to the string the hub schema expects on disk.
|
|
34
|
+
const result = await transitionFinding(this.store, id, "in-progress", {
|
|
35
|
+
now,
|
|
36
|
+
mutate: { promotesTo: serializePromotionRef(ref) },
|
|
37
|
+
});
|
|
38
|
+
return result !== null ? toDoFinding(result) : null;
|
|
39
|
+
}
|
|
40
|
+
async listPromoted() {
|
|
41
|
+
return readFindings(this.store).map(toDoFinding).filter((f) => f.promotesTo !== undefined);
|
|
42
|
+
}
|
|
43
|
+
async applyOutcome(id, status, ref, { now }) {
|
|
44
|
+
const result = await transitionFinding(this.store, id, status, {
|
|
45
|
+
now,
|
|
46
|
+
mutate: { promotesTo: serializePromotionRef(ref) },
|
|
47
|
+
});
|
|
48
|
+
return result !== null ? toDoFinding(result) : null;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
// ── InMemoryFindingStore ──────────────────────────────────────────────
|
|
52
|
+
/**
|
|
53
|
+
* In-memory fake for tests — backed by a Map<string, DoFinding>.
|
|
54
|
+
*
|
|
55
|
+
* setPromotion stores the PromotionRef OBJECT directly (no serialization)
|
|
56
|
+
* so tests can assert promotesTo.runId / promotesTo.status on the result of
|
|
57
|
+
* readFinding without JSON.parse.
|
|
58
|
+
*
|
|
59
|
+
* `writes` records every setPromotion call:
|
|
60
|
+
* - sc-2-2/2-3: assert writes.length === 1 on approve
|
|
61
|
+
* - sc-2-4: assert writes.length === 0 on reject
|
|
62
|
+
*/
|
|
63
|
+
export class InMemoryFindingStore {
|
|
64
|
+
map;
|
|
65
|
+
/** Records every setPromotion write. Tests assert .length for mutation count. */
|
|
66
|
+
writes = [];
|
|
67
|
+
constructor(seed = []) {
|
|
68
|
+
this.map = new Map(seed.map((f) => [f.id, toDoFinding(f)]));
|
|
69
|
+
}
|
|
70
|
+
async readFinding(id) {
|
|
71
|
+
return this.map.get(id) ?? null;
|
|
72
|
+
}
|
|
73
|
+
async setPromotion(id, ref, _opts) {
|
|
74
|
+
const cur = this.map.get(id);
|
|
75
|
+
if (cur === undefined)
|
|
76
|
+
return null;
|
|
77
|
+
const next = { ...cur, status: "in-progress", promotesTo: ref };
|
|
78
|
+
this.map.set(id, next);
|
|
79
|
+
this.writes.push(next);
|
|
80
|
+
return next;
|
|
81
|
+
}
|
|
82
|
+
async listPromoted() {
|
|
83
|
+
return [...this.map.values()].filter((f) => f.promotesTo !== undefined);
|
|
84
|
+
}
|
|
85
|
+
async applyOutcome(id, status, ref, _opts) {
|
|
86
|
+
const cur = this.map.get(id);
|
|
87
|
+
if (cur === undefined)
|
|
88
|
+
return null;
|
|
89
|
+
const next = { ...cur, status, promotesTo: ref };
|
|
90
|
+
this.map.set(id, next);
|
|
91
|
+
this.writes.push(next);
|
|
92
|
+
return next;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=finding-port.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"finding-port.js","sourceRoot":"","sources":["../../src/do-bridge/finding-port.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Launcher port and default RunSpawner-backed adapter.
|
|
3
|
+
*
|
|
4
|
+
* HARD BOUNDARY: `src/cli/commands/do.ts` MUST NOT import RunSpawner or
|
|
5
|
+
* execa directly. The RunSpawner import lives here; do.ts imports from
|
|
6
|
+
* this file instead.
|
|
7
|
+
*/
|
|
8
|
+
import { RunSpawner } from "../chat/run-spawner.js";
|
|
9
|
+
import type { PromotionPlan } from "./types.js";
|
|
10
|
+
/**
|
|
11
|
+
* Port for launching the work behind an approved PromotionPlan.
|
|
12
|
+
* Injected into runDo so unit tests use a fake and never spawn a real process.
|
|
13
|
+
*/
|
|
14
|
+
export interface Launcher {
|
|
15
|
+
/** Launch the work described by plan. Returns the runId used + optional pid. */
|
|
16
|
+
launch(plan: PromotionPlan): Promise<{
|
|
17
|
+
runId: string;
|
|
18
|
+
pid?: number;
|
|
19
|
+
}>;
|
|
20
|
+
}
|
|
21
|
+
/** Options for the RunSpawnerLauncher adapter. */
|
|
22
|
+
export interface RunSpawnerLauncherOptions {
|
|
23
|
+
/** Absolute project root, passed to RunSpawner. */
|
|
24
|
+
projectRoot: string;
|
|
25
|
+
/** The finding id — embedded in the generated runId: `do-<findingId>-<ts>`. */
|
|
26
|
+
findingId: string;
|
|
27
|
+
/** Session id for the RunSpawner sidecar. Defaults to `do-<findingId>`. */
|
|
28
|
+
sessionId?: string;
|
|
29
|
+
/** Clock injection. Defaults to () => new Date().toISOString(). */
|
|
30
|
+
now?: () => string;
|
|
31
|
+
/**
|
|
32
|
+
* Pre-built RunSpawner to use instead of constructing one.
|
|
33
|
+
* Inject a RunSpawner with a fake spawn fn in launcher.test.ts so no real
|
|
34
|
+
* process is ever started in unit tests.
|
|
35
|
+
*/
|
|
36
|
+
spawner?: RunSpawner;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Default Launcher adapter — wraps RunSpawner to spawn a detached
|
|
40
|
+
* `agent-bober run <task> --run-id <id>` child.
|
|
41
|
+
*
|
|
42
|
+
* runId format: `do-<findingId>-<timestamp>` — stable prefix for identifying
|
|
43
|
+
* do-bridge runs in roster state.json files.
|
|
44
|
+
*/
|
|
45
|
+
export declare class RunSpawnerLauncher implements Launcher {
|
|
46
|
+
private readonly spawner;
|
|
47
|
+
private readonly findingId;
|
|
48
|
+
private readonly now;
|
|
49
|
+
constructor(opts: RunSpawnerLauncherOptions);
|
|
50
|
+
launch(plan: PromotionPlan): Promise<{
|
|
51
|
+
runId: string;
|
|
52
|
+
pid?: number;
|
|
53
|
+
}>;
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=launcher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"launcher.d.ts","sourceRoot":"","sources":["../../src/do-bridge/launcher.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAEpD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAIhD;;;GAGG;AACH,MAAM,WAAW,QAAQ;IACvB,gFAAgF;IAChF,MAAM,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACvE;AAID,kDAAkD;AAClD,MAAM,WAAW,yBAAyB;IACxC,mDAAmD;IACnD,WAAW,EAAE,MAAM,CAAC;IACpB,+EAA+E;IAC/E,SAAS,EAAE,MAAM,CAAC;IAClB,2EAA2E;IAC3E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mEAAmE;IACnE,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB;;;;OAIG;IACH,OAAO,CAAC,EAAE,UAAU,CAAC;CACtB;AAED;;;;;;GAMG;AACH,qBAAa,kBAAmB,YAAW,QAAQ;IACjD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAa;IACrC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAe;gBAEvB,IAAI,EAAE,yBAAyB;IAarC,MAAM,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAK5E"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Launcher port and default RunSpawner-backed adapter.
|
|
3
|
+
*
|
|
4
|
+
* HARD BOUNDARY: `src/cli/commands/do.ts` MUST NOT import RunSpawner or
|
|
5
|
+
* execa directly. The RunSpawner import lives here; do.ts imports from
|
|
6
|
+
* this file instead.
|
|
7
|
+
*/
|
|
8
|
+
import { RunSpawner } from "../chat/run-spawner.js";
|
|
9
|
+
/**
|
|
10
|
+
* Default Launcher adapter — wraps RunSpawner to spawn a detached
|
|
11
|
+
* `agent-bober run <task> --run-id <id>` child.
|
|
12
|
+
*
|
|
13
|
+
* runId format: `do-<findingId>-<timestamp>` — stable prefix for identifying
|
|
14
|
+
* do-bridge runs in roster state.json files.
|
|
15
|
+
*/
|
|
16
|
+
export class RunSpawnerLauncher {
|
|
17
|
+
spawner;
|
|
18
|
+
findingId;
|
|
19
|
+
now;
|
|
20
|
+
constructor(opts) {
|
|
21
|
+
this.findingId = opts.findingId;
|
|
22
|
+
this.now = opts.now ?? (() => new Date().toISOString());
|
|
23
|
+
// bober: builds a fresh RunSpawner per CLI invocation; swap for a pre-built
|
|
24
|
+
// injected spawner in tests so no real execa ever runs.
|
|
25
|
+
const spawnerOpts = {
|
|
26
|
+
projectRoot: opts.projectRoot,
|
|
27
|
+
sessionId: opts.sessionId ?? `do-${opts.findingId}`,
|
|
28
|
+
};
|
|
29
|
+
this.spawner = opts.spawner ?? new RunSpawner(spawnerOpts);
|
|
30
|
+
}
|
|
31
|
+
async launch(plan) {
|
|
32
|
+
const runId = `do-${this.findingId}-${this.now()}`;
|
|
33
|
+
const ack = await this.spawner.spawn(plan.task, runId);
|
|
34
|
+
return { runId, pid: ack.pid };
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=launcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"launcher.js","sourceRoot":"","sources":["../../src/do-bridge/launcher.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAmCpD;;;;;;GAMG;AACH,MAAM,OAAO,kBAAkB;IACZ,OAAO,CAAa;IACpB,SAAS,CAAS;IAClB,GAAG,CAAe;IAEnC,YAAY,IAA+B;QACzC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;QAChC,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;QAExD,4EAA4E;QAC5E,wDAAwD;QACxD,MAAM,WAAW,GAAsB;YACrC,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,SAAS,EAAE,IAAI,CAAC,SAAS,IAAI,MAAM,IAAI,CAAC,SAAS,EAAE;SACpD,CAAC;QACF,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,IAAI,UAAU,CAAC,WAAW,CAAC,CAAC;IAC7D,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,IAAmB;QAC9B,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;QACnD,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACvD,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC;IACjC,CAAC;CACF"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Promotion gate orchestration — write pending marker, resolve approve/reject,
|
|
3
|
+
* then on approval call launch; on rejection clean up and return.
|
|
4
|
+
*
|
|
5
|
+
* PURE-ish DI core: all I/O via injected projectRoot paths + approval-state.ts
|
|
6
|
+
* functions + injected confirm / now / launcher. Never reads the real clock
|
|
7
|
+
* (now is injected). Never throws — failures propagate as Promise rejections
|
|
8
|
+
* which the caller (runDo) converts to process.exitCode = 1.
|
|
9
|
+
*/
|
|
10
|
+
import type { PromotionPlan } from "./types.js";
|
|
11
|
+
/** Result returned by runPromotionGate after the approve/reject decision. */
|
|
12
|
+
export interface GateOutcome {
|
|
13
|
+
approved: boolean;
|
|
14
|
+
}
|
|
15
|
+
/** Arguments for runPromotionGate — all I/O dependencies are injected. */
|
|
16
|
+
export interface PromotionGateArgs {
|
|
17
|
+
/** Absolute project root (used to build .bober/approvals paths). */
|
|
18
|
+
projectRoot: string;
|
|
19
|
+
/** Finding id — used to derive checkpointId `promote-<findingId>`. */
|
|
20
|
+
findingId: string;
|
|
21
|
+
/** The promotion plan to summarize in the pending marker. */
|
|
22
|
+
plan: PromotionPlan;
|
|
23
|
+
/** When true, bypass interactive prompt and auto-approve. */
|
|
24
|
+
yes?: boolean;
|
|
25
|
+
/**
|
|
26
|
+
* Whether stdout is a TTY. When true and not --yes, calls the injected
|
|
27
|
+
* confirm() and waits for a synchronous answer. When false, polls the
|
|
28
|
+
* approvals directory until an external approve/reject marker appears.
|
|
29
|
+
*/
|
|
30
|
+
isTTY: boolean;
|
|
31
|
+
/** Injected interactive confirm. TTY path only; must return true/false. */
|
|
32
|
+
confirm: () => Promise<boolean>;
|
|
33
|
+
/** Clock injection — returns an ISO string. */
|
|
34
|
+
now: () => string;
|
|
35
|
+
/** Non-TTY poll interval in ms. Default 2000ms; use small values in tests. */
|
|
36
|
+
pollMs?: number;
|
|
37
|
+
/** Non-TTY timeout in ms. Default 24 hours. */
|
|
38
|
+
timeoutMs?: number;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Write promote-<findingId>.pending.json, gate on it
|
|
42
|
+
* (--yes → auto-approve; TTY → prompts(); non-TTY → poll directory),
|
|
43
|
+
* and return { approved }.
|
|
44
|
+
*
|
|
45
|
+
* Writes/deletes markers via approval-state.ts only — no new format.
|
|
46
|
+
* checkpointId is always `promote-${findingId}` so external
|
|
47
|
+
* `bober approve promote-<id>` resolves it (sc-2-5).
|
|
48
|
+
*/
|
|
49
|
+
export declare function runPromotionGate(args: PromotionGateArgs): Promise<GateOutcome>;
|
|
50
|
+
//# sourceMappingURL=promote.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"promote.d.ts","sourceRoot":"","sources":["../../src/do-bridge/promote.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAWH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAIhD,6EAA6E;AAC7E,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,OAAO,CAAC;CACnB;AAID,0EAA0E;AAC1E,MAAM,WAAW,iBAAiB;IAChC,oEAAoE;IACpE,WAAW,EAAE,MAAM,CAAC;IACpB,sEAAsE;IACtE,SAAS,EAAE,MAAM,CAAC;IAClB,6DAA6D;IAC7D,IAAI,EAAE,aAAa,CAAC;IACpB,6DAA6D;IAC7D,GAAG,CAAC,EAAE,OAAO,CAAC;IACd;;;;OAIG;IACH,KAAK,EAAE,OAAO,CAAC;IACf,2EAA2E;IAC3E,OAAO,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;IAChC,+CAA+C;IAC/C,GAAG,EAAE,MAAM,MAAM,CAAC;IAClB,8EAA8E;IAC9E,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,+CAA+C;IAC/C,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;GAQG;AACH,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC,WAAW,CAAC,CAiHpF"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Promotion gate orchestration — write pending marker, resolve approve/reject,
|
|
3
|
+
* then on approval call launch; on rejection clean up and return.
|
|
4
|
+
*
|
|
5
|
+
* PURE-ish DI core: all I/O via injected projectRoot paths + approval-state.ts
|
|
6
|
+
* functions + injected confirm / now / launcher. Never reads the real clock
|
|
7
|
+
* (now is injected). Never throws — failures propagate as Promise rejections
|
|
8
|
+
* which the caller (runDo) converts to process.exitCode = 1.
|
|
9
|
+
*/
|
|
10
|
+
import { readdir } from "node:fs/promises";
|
|
11
|
+
import { join } from "node:path";
|
|
12
|
+
import { savePending, saveApproved, saveRejected, deletePending, } from "../state/approval-state.js";
|
|
13
|
+
/**
|
|
14
|
+
* Write promote-<findingId>.pending.json, gate on it
|
|
15
|
+
* (--yes → auto-approve; TTY → prompts(); non-TTY → poll directory),
|
|
16
|
+
* and return { approved }.
|
|
17
|
+
*
|
|
18
|
+
* Writes/deletes markers via approval-state.ts only — no new format.
|
|
19
|
+
* checkpointId is always `promote-${findingId}` so external
|
|
20
|
+
* `bober approve promote-<id>` resolves it (sc-2-5).
|
|
21
|
+
*/
|
|
22
|
+
export async function runPromotionGate(args) {
|
|
23
|
+
const { projectRoot, findingId, plan, yes = false, isTTY, confirm, now, pollMs = 2_000, timeoutMs = 24 * 60 * 60 * 1_000, } = args;
|
|
24
|
+
const checkpointId = `promote-${findingId}`;
|
|
25
|
+
const requestedAt = now();
|
|
26
|
+
const requestedAtMs = Date.parse(requestedAt);
|
|
27
|
+
const timeoutAt = new Date(requestedAtMs + timeoutMs).toISOString();
|
|
28
|
+
// 1. Write the pending marker
|
|
29
|
+
await savePending(projectRoot, {
|
|
30
|
+
checkpointId,
|
|
31
|
+
artifact: { type: "bober-run", summary: plan.task },
|
|
32
|
+
prompt: `Promote to bober run: "${plan.task}"`,
|
|
33
|
+
requestedAt,
|
|
34
|
+
timeoutAt,
|
|
35
|
+
});
|
|
36
|
+
// 2. --yes: auto-approve without prompting
|
|
37
|
+
if (yes) {
|
|
38
|
+
await saveApproved(projectRoot, checkpointId, {
|
|
39
|
+
approvedAt: now(),
|
|
40
|
+
approverId: "auto",
|
|
41
|
+
});
|
|
42
|
+
await deletePending(projectRoot, checkpointId);
|
|
43
|
+
return { approved: true };
|
|
44
|
+
}
|
|
45
|
+
// 3. TTY: interactive confirm
|
|
46
|
+
if (isTTY) {
|
|
47
|
+
const confirmed = await confirm();
|
|
48
|
+
if (confirmed) {
|
|
49
|
+
await saveApproved(projectRoot, checkpointId, {
|
|
50
|
+
approvedAt: now(),
|
|
51
|
+
approverId: "tty",
|
|
52
|
+
});
|
|
53
|
+
await deletePending(projectRoot, checkpointId);
|
|
54
|
+
return { approved: true };
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
await saveRejected(projectRoot, checkpointId, {
|
|
58
|
+
rejectedAt: now(),
|
|
59
|
+
rejecterId: "tty",
|
|
60
|
+
feedback: "User declined at TTY prompt",
|
|
61
|
+
});
|
|
62
|
+
await deletePending(projectRoot, checkpointId);
|
|
63
|
+
return { approved: false };
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
// 4. Non-TTY: poll the approvals directory until resolved or timeout
|
|
67
|
+
// Mirror: src/orchestrator/checkpoints/mechanisms/disk.ts:104-175
|
|
68
|
+
// Use Date.now() for elapsed-time tracking (not the injected `now` which is
|
|
69
|
+
// for file timestamps only and may be frozen in tests).
|
|
70
|
+
const approvalsDir = join(projectRoot, ".bober", "approvals");
|
|
71
|
+
const startedAtMs = Date.now();
|
|
72
|
+
let pollHandle;
|
|
73
|
+
try {
|
|
74
|
+
return await new Promise((resolve, reject) => {
|
|
75
|
+
const tick = async () => {
|
|
76
|
+
try {
|
|
77
|
+
const entries = new Set(await readdir(approvalsDir).catch(() => []));
|
|
78
|
+
if (entries.has(`${checkpointId}.approved.json`)) {
|
|
79
|
+
await deletePending(projectRoot, checkpointId);
|
|
80
|
+
resolve({ approved: true });
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
if (entries.has(`${checkpointId}.rejected.json`)) {
|
|
84
|
+
await deletePending(projectRoot, checkpointId);
|
|
85
|
+
resolve({ approved: false });
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
// Timeout check (wall clock — not the injected now() which is for file timestamps)
|
|
89
|
+
if (Date.now() - startedAtMs >= timeoutMs) {
|
|
90
|
+
await deletePending(projectRoot, checkpointId);
|
|
91
|
+
resolve({ approved: false });
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
// Schedule next tick — never leak timers (disk.ts:170-175)
|
|
95
|
+
pollHandle = setTimeout(() => {
|
|
96
|
+
tick().catch(reject);
|
|
97
|
+
}, pollMs);
|
|
98
|
+
}
|
|
99
|
+
catch (err) {
|
|
100
|
+
reject(err);
|
|
101
|
+
}
|
|
102
|
+
};
|
|
103
|
+
// Kick off the first tick
|
|
104
|
+
pollHandle = setTimeout(() => {
|
|
105
|
+
tick().catch(reject);
|
|
106
|
+
}, pollMs);
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
finally {
|
|
110
|
+
// Always clear the handle — covers the resolved-before-tick case
|
|
111
|
+
if (pollHandle !== undefined) {
|
|
112
|
+
clearTimeout(pollHandle);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=promote.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"promote.js","sourceRoot":"","sources":["../../src/do-bridge/promote.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC3C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EACL,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,aAAa,GACd,MAAM,4BAA4B,CAAC;AAsCpC;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,IAAuB;IAC5D,MAAM,EACJ,WAAW,EACX,SAAS,EACT,IAAI,EACJ,GAAG,GAAG,KAAK,EACX,KAAK,EACL,OAAO,EACP,GAAG,EACH,MAAM,GAAG,KAAK,EACd,SAAS,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,KAAK,GACjC,GAAG,IAAI,CAAC;IAET,MAAM,YAAY,GAAG,WAAW,SAAS,EAAE,CAAC;IAC5C,MAAM,WAAW,GAAG,GAAG,EAAE,CAAC;IAC1B,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IAC9C,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,aAAa,GAAG,SAAS,CAAC,CAAC,WAAW,EAAE,CAAC;IAEpE,8BAA8B;IAC9B,MAAM,WAAW,CAAC,WAAW,EAAE;QAC7B,YAAY;QACZ,QAAQ,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE;QACnD,MAAM,EAAE,0BAA0B,IAAI,CAAC,IAAI,GAAG;QAC9C,WAAW;QACX,SAAS;KACV,CAAC,CAAC;IAEH,2CAA2C;IAC3C,IAAI,GAAG,EAAE,CAAC;QACR,MAAM,YAAY,CAAC,WAAW,EAAE,YAAY,EAAE;YAC5C,UAAU,EAAE,GAAG,EAAE;YACjB,UAAU,EAAE,MAAM;SACnB,CAAC,CAAC;QACH,MAAM,aAAa,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;QAC/C,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IAC5B,CAAC;IAED,8BAA8B;IAC9B,IAAI,KAAK,EAAE,CAAC;QACV,MAAM,SAAS,GAAG,MAAM,OAAO,EAAE,CAAC;QAClC,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,YAAY,CAAC,WAAW,EAAE,YAAY,EAAE;gBAC5C,UAAU,EAAE,GAAG,EAAE;gBACjB,UAAU,EAAE,KAAK;aAClB,CAAC,CAAC;YACH,MAAM,aAAa,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;YAC/C,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;QAC5B,CAAC;aAAM,CAAC;YACN,MAAM,YAAY,CAAC,WAAW,EAAE,YAAY,EAAE;gBAC5C,UAAU,EAAE,GAAG,EAAE;gBACjB,UAAU,EAAE,KAAK;gBACjB,QAAQ,EAAE,6BAA6B;aACxC,CAAC,CAAC;YACH,MAAM,aAAa,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;YAC/C,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;QAC7B,CAAC;IACH,CAAC;IAED,qEAAqE;IACrE,qEAAqE;IACrE,+EAA+E;IAC/E,2DAA2D;IAC3D,MAAM,YAAY,GAAG,IAAI,CAAC,WAAW,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC;IAC9D,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC/B,IAAI,UAAqD,CAAC;IAE1D,IAAI,CAAC;QACH,OAAO,MAAM,IAAI,OAAO,CAAc,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACxD,MAAM,IAAI,GAAG,KAAK,IAAmB,EAAE;gBACrC,IAAI,CAAC;oBACH,MAAM,OAAO,GAAG,IAAI,GAAG,CACrB,MAAM,OAAO,CAAC,YAAY,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAc,CAAC,CACxD,CAAC;oBAEF,IAAI,OAAO,CAAC,GAAG,CAAC,GAAG,YAAY,gBAAgB,CAAC,EAAE,CAAC;wBACjD,MAAM,aAAa,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;wBAC/C,OAAO,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;wBAC5B,OAAO;oBACT,CAAC;oBAED,IAAI,OAAO,CAAC,GAAG,CAAC,GAAG,YAAY,gBAAgB,CAAC,EAAE,CAAC;wBACjD,MAAM,aAAa,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;wBAC/C,OAAO,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;wBAC7B,OAAO;oBACT,CAAC;oBAED,mFAAmF;oBACnF,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,WAAW,IAAI,SAAS,EAAE,CAAC;wBAC1C,MAAM,aAAa,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;wBAC/C,OAAO,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;wBAC7B,OAAO;oBACT,CAAC;oBAED,2DAA2D;oBAC3D,UAAU,GAAG,UAAU,CAAC,GAAG,EAAE;wBAC3B,IAAI,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;oBACvB,CAAC,EAAE,MAAM,CAAC,CAAC;gBACb,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,MAAM,CAAC,GAAG,CAAC,CAAC;gBACd,CAAC;YACH,CAAC,CAAC;YAEF,0BAA0B;YAC1B,UAAU,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC3B,IAAI,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YACvB,CAAC,EAAE,MAAM,CAAC,CAAC;QACb,CAAC,CAAC,CAAC;IACL,CAAC;YAAS,CAAC;QACT,iEAAiE;QACjE,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;YAC7B,YAAY,CAAC,UAAU,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import type { FindingStore } from "./finding-port.js";
|
|
2
|
+
import type { RunState } from "../mcp/run-manager.js";
|
|
3
|
+
/**
|
|
4
|
+
* Injected dependencies for reconcilePromotions.
|
|
5
|
+
* Keeps the core pure so tests can inject a run-state fake without a real run.
|
|
6
|
+
*/
|
|
7
|
+
export interface ReconcileDeps {
|
|
8
|
+
store: FindingStore;
|
|
9
|
+
/**
|
|
10
|
+
* Injected run-state reader.
|
|
11
|
+
* CLI passes `(runId) => readRunState(projectRoot, runId)`.
|
|
12
|
+
* Tests inject a fake that returns a predetermined RunState or null.
|
|
13
|
+
*/
|
|
14
|
+
readState: (runId: string) => Promise<RunState | null>;
|
|
15
|
+
/** Clock injection — never call new Date() inside the core. */
|
|
16
|
+
now: () => string;
|
|
17
|
+
}
|
|
18
|
+
/** Counts of findings advanced in a single reconcilePromotions pass. */
|
|
19
|
+
export interface ReconcileSummary {
|
|
20
|
+
/** Findings transitioned to 'done' (run completed). */
|
|
21
|
+
completed: number;
|
|
22
|
+
/** Findings returned to 'open' (run aborted or failed). */
|
|
23
|
+
aborted: number;
|
|
24
|
+
/** Findings left unchanged (run still running, missing, or unrecognised). */
|
|
25
|
+
unchanged: number;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* For each Finding whose promotesTo.status is 'launched', read the linked
|
|
29
|
+
* run's state.json snapshot and advance the Finding to its terminal status.
|
|
30
|
+
*
|
|
31
|
+
* Transition table:
|
|
32
|
+
* run 'completed' → finding 'done', promotesTo.status 'completed'
|
|
33
|
+
* run 'aborted'|'failed' → finding 'open', promotesTo.status 'aborted'
|
|
34
|
+
* run 'running' (or null) → finding unchanged (no write)
|
|
35
|
+
*
|
|
36
|
+
* PURE-ish: all I/O is injected. Never throws — per-finding failures are
|
|
37
|
+
* swallowed internally. Reads the current snapshot and returns immediately;
|
|
38
|
+
* does NOT poll or block waiting for an in-flight run to finish.
|
|
39
|
+
*/
|
|
40
|
+
export declare function reconcilePromotions(deps: ReconcileDeps): Promise<ReconcileSummary>;
|
|
41
|
+
/**
|
|
42
|
+
* Thin wrapper around reconcilePromotions that injects the real readRunState
|
|
43
|
+
* adapter for a given project root. Called by the `bober do` CLI handler.
|
|
44
|
+
*
|
|
45
|
+
* Caller is responsible for wrapping this in try/catch so a reconcile failure
|
|
46
|
+
* can never abort the enclosing command (mirrors seedProjectFacts in
|
|
47
|
+
* src/orchestrator/pipeline.ts:981).
|
|
48
|
+
*/
|
|
49
|
+
export declare function reconcilePromotionsForRoot(projectRoot: string, store: FindingStore, now: () => string): Promise<ReconcileSummary>;
|
|
50
|
+
//# sourceMappingURL=reconcile.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reconcile.d.ts","sourceRoot":"","sources":["../../src/do-bridge/reconcile.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAGtD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAItD;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,YAAY,CAAC;IACpB;;;;OAIG;IACH,SAAS,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC;IACvD,+DAA+D;IAC/D,GAAG,EAAE,MAAM,MAAM,CAAC;CACnB;AAID,wEAAwE;AACxE,MAAM,WAAW,gBAAgB;IAC/B,uDAAuD;IACvD,SAAS,EAAE,MAAM,CAAC;IAClB,2DAA2D;IAC3D,OAAO,EAAE,MAAM,CAAC;IAChB,6EAA6E;IAC7E,SAAS,EAAE,MAAM,CAAC;CACnB;AAID;;;;;;;;;;;;GAYG;AACH,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAuCxF;AAID;;;;;;;GAOG;AACH,wBAAsB,0BAA0B,CAC9C,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,YAAY,EACnB,GAAG,EAAE,MAAM,MAAM,GAChB,OAAO,CAAC,gBAAgB,CAAC,CAM3B"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { readRunState } from "../state/run-state.js";
|
|
2
|
+
// ── reconcilePromotions (DI core) ─────────────────────────────────────
|
|
3
|
+
/**
|
|
4
|
+
* For each Finding whose promotesTo.status is 'launched', read the linked
|
|
5
|
+
* run's state.json snapshot and advance the Finding to its terminal status.
|
|
6
|
+
*
|
|
7
|
+
* Transition table:
|
|
8
|
+
* run 'completed' → finding 'done', promotesTo.status 'completed'
|
|
9
|
+
* run 'aborted'|'failed' → finding 'open', promotesTo.status 'aborted'
|
|
10
|
+
* run 'running' (or null) → finding unchanged (no write)
|
|
11
|
+
*
|
|
12
|
+
* PURE-ish: all I/O is injected. Never throws — per-finding failures are
|
|
13
|
+
* swallowed internally. Reads the current snapshot and returns immediately;
|
|
14
|
+
* does NOT poll or block waiting for an in-flight run to finish.
|
|
15
|
+
*/
|
|
16
|
+
export async function reconcilePromotions(deps) {
|
|
17
|
+
const { store, readState, now } = deps;
|
|
18
|
+
const summary = { completed: 0, aborted: 0, unchanged: 0 };
|
|
19
|
+
const promoted = await store.listPromoted();
|
|
20
|
+
const launched = promoted.filter((f) => f.promotesTo?.status === "launched");
|
|
21
|
+
for (const finding of launched) {
|
|
22
|
+
try {
|
|
23
|
+
// promotesTo is guaranteed non-undefined by the filter above
|
|
24
|
+
const ref = finding.promotesTo;
|
|
25
|
+
const state = await readState(ref.runId);
|
|
26
|
+
if (state === null) {
|
|
27
|
+
// Missing or corrupt run-state file → treat as "still running"
|
|
28
|
+
summary.unchanged++;
|
|
29
|
+
continue;
|
|
30
|
+
}
|
|
31
|
+
if (state.status === "completed") {
|
|
32
|
+
const updatedRef = { ...ref, status: "completed" };
|
|
33
|
+
await store.applyOutcome(finding.id, "done", updatedRef, { now: now() });
|
|
34
|
+
summary.completed++;
|
|
35
|
+
}
|
|
36
|
+
else if (state.status === "aborted" || state.status === "failed") {
|
|
37
|
+
const updatedRef = { ...ref, status: "aborted" };
|
|
38
|
+
await store.applyOutcome(finding.id, "open", updatedRef, { now: now() });
|
|
39
|
+
summary.aborted++;
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
// 'running', 'input-required', 'paused' — leave unchanged
|
|
43
|
+
summary.unchanged++;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
// Per-finding error: swallow and count as unchanged (belt and suspenders).
|
|
48
|
+
// reconcilePromotions MUST NOT throw.
|
|
49
|
+
summary.unchanged++;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return summary;
|
|
53
|
+
}
|
|
54
|
+
// ── reconcilePromotionsForRoot (CLI wrapper) ──────────────────────────
|
|
55
|
+
/**
|
|
56
|
+
* Thin wrapper around reconcilePromotions that injects the real readRunState
|
|
57
|
+
* adapter for a given project root. Called by the `bober do` CLI handler.
|
|
58
|
+
*
|
|
59
|
+
* Caller is responsible for wrapping this in try/catch so a reconcile failure
|
|
60
|
+
* can never abort the enclosing command (mirrors seedProjectFacts in
|
|
61
|
+
* src/orchestrator/pipeline.ts:981).
|
|
62
|
+
*/
|
|
63
|
+
export async function reconcilePromotionsForRoot(projectRoot, store, now) {
|
|
64
|
+
return reconcilePromotions({
|
|
65
|
+
store,
|
|
66
|
+
readState: (runId) => readRunState(projectRoot, runId),
|
|
67
|
+
now,
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=reconcile.js.map
|