elanous 0.2.9 → 0.2.11
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/apps/pwa/out/404/index.html +1 -1
- package/apps/pwa/out/404.html +1 -1
- package/apps/pwa/out/_next/static/Y4zKzL62sakG5momz3SoQ/_buildManifest.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1159-0c5ef8bc21cb6afb.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1394-556de6d71bbdb0fb.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1452.93700483b9d4fc61.js +9 -0
- package/apps/pwa/out/_next/static/chunks/{6062-73e68343a9814f6a.js → 1829-b453a1b22d3999bb.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/2176-c379e3ebce874151.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2310-7a59f043f6db207e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2426.8c6ee0c668d53def.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2548-6e316138d347cefe.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3170-7ec60a56fa0e4728.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3278-ae6ef084769f6195.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3454-988a53dac60a1763.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3638-aa80b4641ea439db.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3735-fe3402553ac1c9c6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3869-a39d1d9921e10d43.js +1 -0
- package/apps/pwa/out/_next/static/chunks/390.c373e31b3b9d0c41.js +5 -0
- package/apps/pwa/out/_next/static/chunks/3992-2e522a8ac5f2afde.js +25 -0
- package/apps/pwa/out/_next/static/chunks/4215-c9d91dd644ec1719.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4508-5d0161d1e724d735.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4685-c3c1c625b71accd1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4733-623a79345b171e1c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4883.3bd969ea1d3aaaff.js +2 -0
- package/apps/pwa/out/_next/static/chunks/507-5acd98bd6dab2d8a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5445-745eb795c5963d79.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5532.6899a12958a89b72.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5845-e6c003ce8d5fd36a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5978-b27004c677119115.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{8046cadf-211ca3c0e00f2b72.js → 5cd7e3a9-404fd6b8d0ecd44c.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/6048-4c5c33579bc4ef78.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6303-422dbf0f67c72aac.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6751-bb3595948b2e311b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7274-19b7279f18b47ab3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{4323.c5dfb6f503304775.js → 7334.a6679d9168f37aa8.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/7551-a0e0707b79164ddd.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7777-79f845045aa1ed86.js +1 -0
- package/apps/pwa/out/_next/static/chunks/79f8be9e-957d68913b590b08.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8025-cc24ee5d8f2fb6f8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8039-df92e08fede5de8f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8206-c6684dcde12be721.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8421-1c4acfb1395a0edf.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8605-ea5bee9dfae512c7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8725.bf46bb1395dd0fa2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8734-252d511cd276c0dc.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8834-ca1cb09c1cb1a6bf.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{2415.ed6428ff334c7ce2.js → 9269.d2a4795bc6812717.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/9538-2816b90923606459.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9656-c1540088f5859c80.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9906-482c6619b3fdda20.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/_not-found/page-d16993889b125c42.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-1dcdc58fc2de2454.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-6a061bd97f0b9398.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/board/page-cb95a7432c9ee744.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/botlab/{page-f972fc1c00a62e88.js → page-b12b6d2f8d2d1aea.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/bots/page-b9efe868bfd36255.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/chat/page-7c97dcdfe2e37a60.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/consult/page-8fd36984f549270a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/control/page-5721537ca8a3598c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-b654240a572e4c48.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/editor/page-b9750abc897508c3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/exec/page-4cd1de371f8ad048.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/field/page-d99f89657828421c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/healthz/route-d16993889b125c42.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/inside/page-50cb2a0eb15e6c83.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/intake/page-c8b1ccda6ba7ae98.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/layout-d6b1d156fb95e74b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/live/page-2a9932ddb62d76bd.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/market/page-9688f5b4f1ff950f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-6b15dd6456c5df09.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/morning/{page-adfbd2ba9598e59a.js → page-35414e0a007b4082.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/not-found-e7a529e0507ac86c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-e001823c35c9dd67.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-371423d1a573d64b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/release/page-4b764b125339ac17.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-cdf8e4b01067bcf1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/outputs/page-3a24072b35470157.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/page-94c82eb0ae5abb32.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-0be8d4b2ced75ba0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-d37cb0d52f9b6bd5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-686da0df9bf23e5c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-4dc614f3ce043e63.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/settings/page-53f80edc6b8dc07c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-d02c782fc792e2af.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/layout-d16993889b125c42.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/page-239c17b911b84e72.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/share/page-dc6a79fb003f746c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-0fffb84cafdc9da6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-1218753c82d585f6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/term/page-4b5935e67531efb5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/today/page-3285bc87caf1eaa5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/trace/page-ad553b0e06505ecd.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/vault/page-fca096e3e860306f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-9ebfa78f0d9885c3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-3dc5f21f7e39622d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-c6da2b468454532d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-93bc70e36f595414.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{2ea96958-e8c7e112de50b067.js → f48170cc-d05d28bf87a43bf4.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/framework-172630e6aa5e2d7f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/main-app-f0fe2d7477845181.js +1 -0
- package/apps/pwa/out/_next/static/chunks/main-fc98ac70b44eccb0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/pages/_app-5bd7f10271f72413.js +1 -0
- package/apps/pwa/out/_next/static/chunks/pages/_error-97d0d85ea05fef9b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/webpack-9e4d02d567b98240.js +1 -0
- package/apps/pwa/out/_next/static/css/543f56bcb1f79fca.css +1 -0
- package/apps/pwa/out/approvals/index.html +1 -1
- package/apps/pwa/out/approvals/index.txt +23 -23
- package/apps/pwa/out/autopilot/index.html +1 -1
- package/apps/pwa/out/autopilot/index.txt +23 -23
- package/apps/pwa/out/board/index.html +1 -1
- package/apps/pwa/out/board/index.txt +23 -23
- package/apps/pwa/out/botlab/index.html +1 -1
- package/apps/pwa/out/botlab/index.txt +22 -22
- package/apps/pwa/out/bots/index.html +1 -1
- package/apps/pwa/out/bots/index.txt +22 -22
- package/apps/pwa/out/chat/index.html +1 -1
- package/apps/pwa/out/chat/index.txt +22 -22
- package/apps/pwa/out/consult/index.html +1 -1
- package/apps/pwa/out/consult/index.txt +23 -23
- package/apps/pwa/out/control/index.html +1 -1
- package/apps/pwa/out/control/index.txt +23 -23
- package/apps/pwa/out/design-check/index.html +1 -1
- package/apps/pwa/out/design-check/index.txt +23 -23
- package/apps/pwa/out/editor/index.html +1 -1
- package/apps/pwa/out/editor/index.txt +23 -23
- package/apps/pwa/out/exec/index.html +1 -1
- package/apps/pwa/out/exec/index.txt +23 -23
- package/apps/pwa/out/field/index.html +1 -1
- package/apps/pwa/out/field/index.txt +23 -23
- package/apps/pwa/out/healthz +1 -1
- package/apps/pwa/out/index.html +1 -1
- package/apps/pwa/out/index.txt +22 -22
- package/apps/pwa/out/inside/index.html +1 -0
- package/apps/pwa/out/inside/index.txt +31 -0
- package/apps/pwa/out/intake/index.html +1 -1
- package/apps/pwa/out/intake/index.txt +23 -23
- package/apps/pwa/out/live/index.html +1 -1
- package/apps/pwa/out/live/index.txt +23 -23
- package/apps/pwa/out/market/index.html +1 -1
- package/apps/pwa/out/market/index.txt +22 -22
- package/apps/pwa/out/missions/placeholder/index.html +1 -1
- package/apps/pwa/out/missions/placeholder/index.txt +22 -22
- package/apps/pwa/out/morning/index.html +1 -1
- package/apps/pwa/out/morning/index.txt +23 -23
- package/apps/pwa/out/observatory/index.html +1 -1
- package/apps/pwa/out/observatory/index.txt +23 -23
- package/apps/pwa/out/ops/checklist/index.html +1 -1
- package/apps/pwa/out/ops/checklist/index.txt +22 -22
- package/apps/pwa/out/ops/release/index.html +1 -1
- package/apps/pwa/out/ops/release/index.txt +22 -22
- package/apps/pwa/out/ops/seats/index.html +1 -0
- package/apps/pwa/out/ops/seats/index.txt +30 -0
- package/apps/pwa/out/outputs/index.html +1 -0
- package/apps/pwa/out/outputs/index.txt +30 -0
- package/apps/pwa/out/reflection/index.html +1 -1
- package/apps/pwa/out/reflection/index.txt +23 -23
- package/apps/pwa/out/scheduler/index.html +1 -1
- package/apps/pwa/out/scheduler/index.txt +23 -23
- package/apps/pwa/out/sessions/index.html +1 -1
- package/apps/pwa/out/sessions/index.txt +22 -22
- package/apps/pwa/out/settings/devices/index.html +1 -1
- package/apps/pwa/out/settings/devices/index.txt +23 -23
- package/apps/pwa/out/settings/index.html +1 -1
- package/apps/pwa/out/settings/index.txt +23 -23
- package/apps/pwa/out/setup/done/index.html +1 -1
- package/apps/pwa/out/setup/done/index.txt +23 -23
- package/apps/pwa/out/setup/index.html +1 -1
- package/apps/pwa/out/setup/index.txt +23 -23
- package/apps/pwa/out/share/index.html +1 -1
- package/apps/pwa/out/share/index.txt +23 -23
- package/apps/pwa/out/showroom/index.html +1 -1
- package/apps/pwa/out/showroom/index.txt +22 -22
- package/apps/pwa/out/tasks/index.html +1 -1
- package/apps/pwa/out/tasks/index.txt +23 -23
- package/apps/pwa/out/term/index.html +1 -1
- package/apps/pwa/out/term/index.txt +23 -24
- package/apps/pwa/out/today/index.html +1 -0
- package/apps/pwa/out/today/index.txt +33 -0
- package/apps/pwa/out/trace/index.html +1 -1
- package/apps/pwa/out/trace/index.txt +23 -23
- package/apps/pwa/out/vault/index.html +1 -1
- package/apps/pwa/out/vault/index.txt +23 -23
- package/apps/pwa/out/workflows/chat-ui/index.html +1 -1
- package/apps/pwa/out/workflows/chat-ui/index.txt +23 -23
- package/apps/pwa/out/workflows/index.html +1 -1
- package/apps/pwa/out/workflows/index.txt +23 -23
- package/apps/pwa/out/workspace/index.html +1 -1
- package/apps/pwa/out/workspace/index.txt +23 -24
- package/apps/pwa/out/worktrees/index.html +1 -1
- package/apps/pwa/out/worktrees/index.txt +23 -23
- package/graphs/drafts/draft-cleanup.yaml +19 -0
- package/graphs/drafts/recipes.yaml +23 -0
- package/graphs/field/field-feed.yaml +2 -0
- package/graphs/implement-loop.yaml +1 -1
- package/graphs/intake/intake-daily.yaml +2 -1
- package/graphs/ops/recipes.yaml +3 -0
- package/graphs/ops/secret-exposure.yaml +24 -0
- package/graphs/release/recipes.yaml +3 -0
- package/graphs/release/release-loop.yaml +4 -1
- package/graphs/video/explainer-line.yaml +2 -2
- package/package.json +2 -1
- package/plugins/card-followup/graphs/run-step.ts +48 -13
- package/plugins/doc-draft/graphs/doc-draft.yaml +3 -3
- package/plugins/doc-draft/graphs/run-step.ts +13 -6
- package/plugins/elanous-hwp/README.md +25 -0
- package/plugins/elanous-hwp/cli.ts +22 -0
- package/plugins/elanous-hwp/converter.ts +237 -0
- package/plugins/elanous-hwp/fixtures/fixed-controls.hwpx +0 -0
- package/plugins/elanous-hwp/fixtures/fixed-table-controls.hwpx +0 -0
- package/plugins/elanous-hwp/fixtures/fixed.hwpx +0 -0
- package/plugins/elanous-hwp/plugin.json +16 -0
- package/plugins/elanous-hwp/plugin.ts +40 -0
- package/scripts/ci-public-export-leak-gate.ts +75 -14
- package/scripts/ci-public-leak-gate.ts +44 -9
- package/scripts/ci-pwa-build-gate.ts +160 -0
- package/scripts/context-hooks/claude-stop.sh +4 -0
- package/scripts/context-hooks/emit.ts +24 -0
- package/scripts/context-hooks/post-tool-use.sh +4 -0
- package/scripts/coord-channel-watch.sh +54 -8
- package/scripts/coord-digest.ts +199 -0
- package/scripts/coord-post.sh +60 -3
- package/scripts/coord-requests-bridge.ts +143 -0
- package/scripts/field-feed/lib.ts +4 -0
- package/scripts/fleet/node-setup.sh +20 -3
- package/scripts/homebrew-formula-bump.ts +69 -0
- package/scripts/install.ps1 +68 -9
- package/scripts/install.sh +39 -12
- package/scripts/lib/pwa-scenarios/scenarios.ts +20 -0
- package/scripts/lib/tui-regress-checks.ts +146 -0
- package/scripts/marketing/measure-site-numbers.ts +169 -0
- package/scripts/measure-gate-shards.ts +309 -0
- package/scripts/memory-lifecycle-cycle.ts +2 -2
- package/scripts/mission-request-judge.ts +31 -1
- package/scripts/morning-report.ts +2 -2
- package/scripts/opportunity-scan.ts +1 -1
- package/scripts/ops-now-probe.ts +327 -0
- package/scripts/publish-internal-dist.ts +11 -1
- package/scripts/release-loop/auto-approve-node.ts +21 -4
- package/scripts/release-loop/cut-branch.ts +84 -0
- package/scripts/release-loop/cutoff.ts +19 -8
- package/scripts/release-loop/gate-node.ts +14 -13
- package/scripts/release-loop/mac-smoke-node.ts +229 -0
- package/scripts/release-loop/node-verdict.ts +3 -3
- package/scripts/release-loop/ops-upgrade-node.ts +72 -16
- package/scripts/release-loop/release-readiness.ts +9 -0
- package/scripts/release-loop/tui-node-checks.ts +42 -0
- package/scripts/release-loop/tui-sim-node.ts +32 -8
- package/scripts/release-loop/unattended-release.ts +5 -3
- package/scripts/release-loop/version-node.ts +112 -13
- package/scripts/repo-watch-cycle.ts +1 -1
- package/scripts/retro-cycle.ts +2 -2
- package/scripts/schedule-health-report.ts +1 -1
- package/scripts/signal-digest-cycle.ts +2 -7
- package/scripts/signal-digest-photo.ts +11 -0
- package/scripts/storyboard/storyboard.ts +5 -161
- package/scripts/tech1-public-measure.ts +94 -0
- package/scripts/test-diet/lib.ts +30 -1
- package/scripts/test-diet/node.ts +83 -8
- package/scripts/test-timeout-audit.ts +114 -0
- package/scripts/tree-sync-alert.ts +1 -1
- package/scripts/tui-regress.ts +71 -0
- package/scripts/ux/demo-rehearsal.ts +243 -0
- package/scripts/ux/lib/rehearsal-verdict.ts +73 -0
- package/scripts/waitlist-daily-digest.ts +1 -1
- package/skills/diagram-master/SKILL.md +366 -0
- package/skills/diagram-master/references/engines/excalidraw/color-palette.md +67 -0
- package/skills/diagram-master/references/engines/excalidraw/element-templates.md +182 -0
- package/skills/diagram-master/references/engines/excalidraw/json-schema.md +71 -0
- package/skills/diagram-master/references/engines/excalidraw/render_excalidraw.py +189 -0
- package/skills/diagram-master/references/engines/excalidraw/render_template.html +57 -0
- package/skills/diagram-master/references/engines/matplotlib/matplotlib-patterns.md +235 -0
- package/skills/diagram-master/references/engines/matplotlib/render_matplotlib.py +184 -0
- package/skills/diagram-master/references/engines/mermaid/domain-templates.md +435 -0
- package/skills/diagram-master/references/engines/mermaid/render_mermaid.py +116 -0
- package/skills/diagram-master/references/engines/mermaid/syntax-reference.md +2247 -0
- package/skills/diagram-master/references/engines/nanobannana/render_nanobannana2.py +168 -0
- package/skills/diagram-master/references/engines/svg/color-palette.md +188 -0
- package/skills/diagram-master/references/engines/svg/html-base-template.html +332 -0
- package/skills/diagram-master/references/engines/svg/interactivity-patterns.md +435 -0
- package/skills/diagram-master/references/engines/svg/render_interactive_svg.py +212 -0
- package/skills/diagram-master/references/engines/svg/svg-element-templates.md +349 -0
- package/skills/diagram-master/references/examples/README.md +69 -0
- package/skills/diagram-master/references/examples/ref_grid_architecture.png +0 -0
- package/skills/diagram-master/references/examples/ref_layered_flow.png +0 -0
- package/skills/diagram-master/references/pyproject.toml +16 -0
- package/skills/diagram-master/references/quality-checklist.md +33 -0
- package/skills/diagram-master/references/routing-guide.md +164 -0
- package/skills/diagram-master/references/uv.lock +1356 -0
- package/skills/explainer-video/SKILL.md +4 -0
- package/skills/explainer-video/engine/reel.mjs +18 -13
- package/skills/explainer-video/engine/reel.sh +24 -5
- package/skills/explainer-video/engine/stitch.mjs +145 -0
- package/skills/google-workspace/SKILL.md +33 -0
- package/skills/google-workspace/scripts/gws-safe.sh +177 -0
- package/skills/grill-me/SKILL.md +1 -1
- package/skills/lecture-note-digitizer/SKILL.md +926 -0
- package/skills/lecture-note-digitizer/references/convert_to_pdf.py +30 -0
- package/skills/lecture-note-digitizer/references/extract_slide_diagram.py +73 -0
- package/skills/lecture-note-digitizer/references/html-template.md +167 -0
- package/skills/lecture-note-digitizer/references/katex-style-guide.md +165 -0
- package/skills/omni-crawl/SKILL.md +21 -11
- package/skills/omni-crawl/scripts/main.ts +6 -6
- package/skills/omni-crawl/src/router.ts +3 -3
- package/skills/omni-digest/SKILL.md +17 -9
- package/skills/omni-digest/digest.md +2 -2
- package/skills/omni-digest/src/fetch.ts +30 -3
- package/skills/pitch-deck/SKILL.md +36 -0
- package/skills/pitch-deck/template.html +80 -0
- package/skills/youtube-master/SKILL.md +163 -0
- package/skills/youtube-master/package-lock.json +558 -0
- package/skills/youtube-master/package.json +13 -0
- package/skills/youtube-master/references/study-note-template.md +124 -0
- package/skills/youtube-master/scripts/main.ts +435 -0
- package/skills/youtube-master/scripts/transcribe-local.ts +24 -0
- package/skills/youtube-master/src/audio.ts +63 -0
- package/skills/youtube-master/src/domain-staging.ts +50 -0
- package/skills/youtube-master/src/env.ts +36 -0
- package/skills/youtube-master/src/obsidian.ts +155 -0
- package/skills/youtube-master/src/router.ts +110 -0
- package/skills/youtube-master/src/stt.ts +199 -0
- package/skills/youtube-master/src/study-note.ts +175 -0
- package/skills/youtube-master/src/summarize.ts +358 -0
- package/skills/youtube-master/src/transcript.ts +76 -0
- package/skills/youtube-master/src/types.ts +91 -0
- package/skills/youtube-master/src/util.ts +93 -0
- package/skills/youtube-master/src/youtube.ts +70 -0
- package/skills/youtube-master/tsconfig.json +13 -0
- package/src/acp/codex-approval-adapter.ts +9 -3
- package/src/acp/core-turn-bridge.ts +117 -18
- package/src/acp/fact-question.ts +11 -0
- package/src/acp/server.ts +53 -9
- package/src/acp/tool-approval.ts +126 -0
- package/src/acp/turn-runner.ts +36 -0
- package/src/agent/monad-agent-turn.ts +8 -0
- package/src/agent-mission/driver.ts +80 -10
- package/src/agent-mission/pty-decision.ts +71 -0
- package/src/agent-mission/review-loop.ts +30 -0
- package/src/ask-user-question/pending-questions.ts +25 -10
- package/src/ask-user-question/types.ts +9 -0
- package/src/auth/setup-link-tokens.ts +16 -5
- package/src/autopilot/build/integrity-gate.ts +12 -0
- package/src/autopilot/build/llm-conflict-merge.ts +16 -3
- package/src/autopilot/tool-registry.ts +2 -0
- package/src/boot/daemon-prompt-turn.ts +8 -0
- package/src/boot/daemon-runtime.ts +9 -3
- package/src/boot/daemon-tools/index.ts +8 -0
- package/src/boot/daemon-tools/types.ts +2 -0
- package/src/boot/daemon-tools/web-search.ts +4 -0
- package/src/card-followup/core.ts +109 -0
- package/src/chat/ctrl-c-in-input.ts +14 -0
- package/src/chat/index.ts +53 -0
- package/src/chat/pickers/state.ts +6 -2
- package/src/cli/agent-cli.ts +7 -0
- package/src/cli/decisions-cli.ts +25 -3
- package/src/cli/doctor-bundle-upload.ts +68 -0
- package/src/cli/doctor-cli.ts +38 -4
- package/src/cli/drive-input-jail.ts +101 -0
- package/src/cli/hooks-cli.ts +17 -3
- package/src/cli/make-cli.ts +43 -0
- package/src/cli/ops-cli.ts +20 -0
- package/src/cli/persona-cli.ts +90 -4
- package/src/cli/plugin-cli.ts +31 -22
- package/src/cli/pod-cli.ts +61 -2
- package/src/cli/pr-cli.ts +82 -17
- package/src/cli/pty-drive-cli.ts +41 -7
- package/src/cli/pty-drive-verdict.ts +40 -0
- package/src/cli/pwa-stop.ts +163 -13
- package/src/cli/pwa-test.ts +3 -0
- package/src/cli/release-cli.ts +80 -24
- package/src/cli/self-update.ts +14 -0
- package/src/cli/setup-cli.ts +43 -1
- package/src/cli/skills-cli.ts +17 -1
- package/src/cli/storyboard-cli.ts +37 -0
- package/src/cli/test-state-dir-flag.ts +11 -4
- package/src/connectors/linear.ts +146 -0
- package/src/context-bus/claude-hooks-install.ts +10 -0
- package/src/context-bus/context-now-surfaces.ts +48 -0
- package/src/context-bus/context-now.ts +104 -0
- package/src/context-bus/coord-events.ts +115 -0
- package/src/context-bus/external-events.ts +52 -0
- package/src/context-bus/long-term-memory.ts +108 -0
- package/src/dashboard/dashboard-boot-fixture.ts +23 -0
- package/src/dashboard/index.ts +63 -21
- package/src/dashboard/slash-runtime/dashboard-handlers.ts +14 -1
- package/src/dashboard/slash-runtime/help-from-registry.ts +43 -28
- package/src/decisions/decision-cards.ts +58 -3
- package/src/decisions/decision-ledger.ts +85 -6
- package/src/decisions/decision-linear-projection.ts +157 -0
- package/src/decisions/web-push-decision-cards.ts +50 -0
- package/src/directive/interpretation-card.ts +36 -0
- package/src/discord/sprint21-runtime.ts +5 -1
- package/src/discord-self-message.ts +32 -0
- package/src/discord-slash-wire.ts +5 -1
- package/src/discord.ts +19 -2
- package/src/domains/coo-admin-tool.ts +62 -0
- package/src/domains/core-tools.ts +13 -4
- package/src/domains/elanous-card.ts +29 -0
- package/src/domains/ops-facts-tool.ts +76 -0
- package/src/domains/outbound-alert.ts +46 -13
- package/src/domains/release-tool.ts +168 -0
- package/src/domains/telegram-kind-route.ts +65 -9
- package/src/exec-requests/default-outputs.ts +25 -0
- package/src/exec-requests/planner.ts +106 -28
- package/src/exec-requests/runner.ts +123 -12
- package/src/exec-requests/store.ts +11 -2
- package/src/execution-loop/launch-gate.ts +100 -0
- package/src/field/field-media.ts +10 -7
- package/src/field/field-reel.ts +19 -5
- package/src/field-note/index.ts +201 -0
- package/src/field-note/transcribe.ts +248 -0
- package/src/git-fs/worktree.ts +45 -6
- package/src/graph-kinds/registry.ts +3 -3
- package/src/graph-runner/graph-approval-card.ts +113 -0
- package/src/graph-runner/graph-cli.ts +189 -4
- package/src/graph-runner/graph-grow-llm.ts +37 -0
- package/src/graph-runner/graph-grow.ts +47 -0
- package/src/graph-runner/graph-notify.ts +25 -3
- package/src/graph-runner/runner.ts +453 -35
- package/src/grok/agent-search.ts +8 -2
- package/src/guardian/secret-exposure-scan.ts +101 -0
- package/src/harness/browser-verify.ts +25 -2
- package/src/harness/harness-cli-command.ts +478 -42
- package/src/harness/harness-incidents-writer.fixture.ts +24 -0
- package/src/harness/harness-incidents.ts +129 -0
- package/src/harness/harness-pod-dispatch.ts +43 -23
- package/src/harness/harness-seams.ts +38 -4
- package/src/harness/harness-stop.ts +75 -6
- package/src/harness/launch-registry.ts +91 -0
- package/src/harness/process-garbage.ts +5 -3
- package/src/hitl/clarification-policy.ts +3 -1
- package/src/hooks/dispatch.ts +82 -0
- package/src/hooks/expose.ts +254 -0
- package/src/hooks/github-shadow.ts +108 -0
- package/src/hooks/providers.ts +71 -5
- package/src/hooks/queue.ts +1 -1
- package/src/hooks/receiver.ts +21 -20
- package/src/index.ts +206 -49
- package/src/intake-plane/author-goals.ts +37 -4
- package/src/intake-plane/categorize.ts +18 -46
- package/src/intake-plane/check.ts +3 -0
- package/src/intake-plane/discord-seat-work.ts +57 -2
- package/src/intake-plane/front-route-classifier.ts +33 -39
- package/src/intake-plane/persona-answer.ts +30 -0
- package/src/intake-plane/runtime-callables.ts +8 -1
- package/src/intake-plane/seat-doc-route.ts +170 -6
- package/src/intake-plane/telegram-seat-work.ts +80 -4
- package/src/intake-plane/telegram-work.ts +1 -0
- package/src/intake-plane/wish-folder.ts +67 -0
- package/src/intent-gate/gate.ts +30 -10
- package/src/live/detail-switch.ts +5 -0
- package/src/llm/difficulty.ts +57 -0
- package/src/llm/judge-layer.ts +101 -0
- package/src/llm/mission-router.ts +33 -19
- package/src/loops/contract/examples/cmo-seat.loop.yaml +51 -0
- package/src/loops/contract/examples/orchestrator.loop.yaml +57 -0
- package/src/loops/contract/examples/steward.loop.yaml +50 -0
- package/src/loops/contract/loop-agent.schema.json +138 -0
- package/src/loops/contract/validate.ts +64 -0
- package/src/loops/registry.ts +20 -6
- package/src/market/signed-index.ts +4 -0
- package/src/maturity/bot-command-maturity.ts +45 -0
- package/src/maturity/cli-maturity.ts +34 -0
- package/src/maturity/feature-maturity.ts +120 -1
- package/src/maturity/tui-slash-maturity.ts +31 -0
- package/src/memory.ts +32 -4
- package/src/model-tier/index.ts +2 -2
- package/src/model-tier/tier-resolver.ts +20 -20
- package/src/model-tier/types.ts +6 -6
- package/src/mss/logging/log-store.ts +15 -0
- package/src/nexus/api/config-model-tier.ts +5 -4
- package/src/nexus/api/exec-requests.ts +33 -3
- package/src/nexus/api/fabric-plans.ts +53 -0
- package/src/nexus/api/harness-api.ts +5 -1
- package/src/nexus/api/health.ts +2 -0
- package/src/nexus/api/http-server.ts +89 -1
- package/src/nexus/api/inside-events.ts +226 -0
- package/src/nexus/api/meta-api.ts +32 -8
- package/src/nexus/api/missions.ts +6 -1
- package/src/nexus/api/ops-api.ts +10 -1
- package/src/nexus/api/ops-seats-sources.ts +37 -7
- package/src/nexus/api/ops-seats.ts +49 -6
- package/src/nexus/api/outputs-route.ts +44 -0
- package/src/nexus/api/seat-requests.ts +132 -10
- package/src/nexus/api/sessions-store.ts +42 -0
- package/src/nexus/api/setup-codex-login.ts +160 -0
- package/src/nexus/api/sub-seat-charters.ts +34 -0
- package/src/nexus/api/tabs-mutations.ts +3 -1
- package/src/nexus/api/trace.ts +18 -6
- package/src/nexus/api/usage-api.ts +102 -0
- package/src/nexus/api/workflow-run-event-bridge.ts +1 -0
- package/src/nexus/api/workflows.ts +80 -6
- package/src/nexus/index.ts +47 -4
- package/src/nexus/kinds/webterm.ts +2 -1
- package/src/nexus/webterm/pty.ts +6 -2
- package/src/onboarding/cli-auth-status.ts +80 -0
- package/src/onboarding/first-run.ts +89 -0
- package/src/onboarding/lan-address.ts +45 -0
- package/src/onboarding/voice-ai.ts +3 -3
- package/src/onboarding/web-first.ts +119 -24
- package/src/onboarding.ts +4 -0
- package/src/ops-now/ops-now-refresh.ts +100 -0
- package/src/org/seat-budget.ts +48 -0
- package/src/org/stall-escalation.ts +63 -0
- package/src/outputs/ledger.ts +120 -0
- package/src/persona/persona-todo.ts +79 -0
- package/src/persona/presets.ts +116 -2
- package/src/persona/team-set.ts +155 -0
- package/src/plugins/install/plugin-install.ts +14 -0
- package/src/plugins/maker/market-bundle.ts +109 -0
- package/src/plugins/maker/plugin-maker.ts +254 -11
- package/src/plugins/maker/wizard-generate.ts +103 -0
- package/src/pod-lease/admission.ts +150 -0
- package/src/pod-lease/dependency-state.ts +85 -0
- package/src/pod-lease/host-lease.ts +127 -0
- package/src/project/project-store.ts +115 -0
- package/src/project/project-suggestion.ts +16 -0
- package/src/project/session-context.ts +24 -0
- package/src/release-loop/checklist.ts +79 -5
- package/src/release-loop/feature-store.ts +159 -24
- package/src/release-loop/next-md-merge.ts +58 -0
- package/src/release-loop/release-note.ts +59 -4
- package/src/release-loop/release-schedule.ts +53 -0
- package/src/repl/index.ts +7 -0
- package/src/seat-dispatch/ceo-commands.ts +41 -8
- package/src/seat-dispatch/ceo-intent.ts +38 -0
- package/src/seat-dispatch/seat-ask.ts +130 -0
- package/src/seat-dispatch/seat-questions.ts +100 -0
- package/src/seat-loop/seat-loop.ts +750 -0
- package/src/seat-loop/seat-report.ts +99 -0
- package/src/self-dev/decompose.ts +66 -11
- package/src/self-dev/dev-cli.ts +4 -1
- package/src/self-dev/dev-pipeline.ts +37 -1
- package/src/self-dev/draft-sweep.ts +38 -33
- package/src/self-dev/draft-triage-rules.ts +8 -5
- package/src/self-dev/fabric-plan-core.ts +297 -0
- package/src/self-dev/orchestrate.ts +36 -4
- package/src/self-dev/release-path-guard.ts +62 -0
- package/src/self-dev/run-store.ts +10 -1
- package/src/self-dev/shard-aggregate.ts +230 -0
- package/src/self-dev/shard-placement.ts +60 -0
- package/src/self-dev/shard-plan.ts +48 -0
- package/src/self-dev/shard-pod-run.ts +77 -0
- package/src/self-dev/shard-run.ts +105 -0
- package/src/self-implement/execution-clarification.ts +115 -0
- package/src/self-implement/gate-baseline.ts +1 -1
- package/src/self-implement/gate-cli.ts +46 -4
- package/src/self-implement/gate-scope.ts +37 -7
- package/src/self-implement/graph-variant.ts +171 -0
- package/src/self-implement/harness-policy-gates.ts +1 -1
- package/src/self-implement/headless-elanous-driver.ts +22 -3
- package/src/self-implement/host-regate.ts +22 -1
- package/src/self-implement/importer-test-index.ts +2 -1
- package/src/self-implement/l8-merge-queue.ts +130 -0
- package/src/self-implement/orchestrator.ts +279 -12
- package/src/self-implement/pipeline-shape.ts +1 -1
- package/src/self-implement/route-consumer-test-index.ts +122 -0
- package/src/self-implement/run-status-mapping.ts +5 -3
- package/src/self-implement/seams.ts +72 -11
- package/src/self-implement/test-seams.ts +1 -0
- package/src/self-implement/uncommitted-work.ts +59 -0
- package/src/session/chat.ts +2 -0
- package/src/session/index.ts +45 -13
- package/src/shell-env-bootstrap.ts +17 -0
- package/src/skills/gift-install.ts +215 -0
- package/src/skills/tools/web-search.ts +4 -1
- package/src/steward/directive.ts +51 -2
- package/src/steward/launch.ts +266 -0
- package/src/steward/outcome-notify.ts +115 -0
- package/src/steward/steward-cards.ts +25 -11
- package/src/steward/triage-plan.ts +32 -4
- package/src/steward/triage.ts +129 -13
- package/src/steward/working-backwards.ts +64 -0
- package/src/storyboard/storyboard.ts +141 -0
- package/src/task-cards/card-cli.ts +25 -1
- package/src/task-cards/card-store.ts +2 -2
- package/src/task-orchestrator/mission.ts +5 -0
- package/src/task-orchestrator/store.ts +12 -3
- package/src/task-orchestrator/surfaces/pod-command-job.ts +29 -7
- package/src/task-orchestrator/surfaces/pod-lease.ts +397 -0
- package/src/task-orchestrator/surfaces/pod-pool.ts +127 -26
- package/src/task-orchestrator/surfaces/self-implement-pod.ts +214 -40
- package/src/task-orchestrator/surfaces/self-implement.ts +15 -2
- package/src/task-orchestrator/types.ts +2 -0
- package/src/telegram-card-followup.ts +153 -0
- package/src/telegram-commands.ts +10 -1
- package/src/telegram-project-command.ts +71 -0
- package/src/telegram-report.ts +29 -19
- package/src/telegram-run.ts +7 -0
- package/src/telegram.ts +58 -11
- package/src/tool-runtime/self-cognition-runtimes.ts +13 -3
- package/src/tool-runtime/types.ts +4 -0
- package/src/tui-client/dashboard-session.ts +2 -0
- package/src/user-config.ts +216 -27
- package/src/version/packed-revision.json +1 -1
- package/src/web-push/notify-exec-request.ts +32 -0
- package/src/web-search/grok.ts +7 -1
- package/src/web-search/index.ts +28 -1
- package/src/web-search/provider.ts +4 -0
- package/src/web-search/x-intent.ts +5 -0
- package/src/workflow-runtime/executor.ts +277 -47
- package/src/workflow-runtime/index.ts +1 -0
- package/src/workflow-runtime/nodes/subworkflow.ts +60 -0
- package/src/workflow-runtime/plugin-kind-node.ts +1 -1
- package/src/workflow-runtime/schema.ts +79 -4
- package/src/workflow-runtime/types.ts +35 -4
- package/apps/pwa/out/_next/static/bFI5EEwg7T6aG88ibX4Zq/_buildManifest.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1105-c473ed46272fba79.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1201-09613bce624467c0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1377-1efeffbbac0963ff.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1470.98a6ab61ccb4131c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/216-5acd01cbde4acda7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2330-c2f07246c8788af1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2375-cb6debea56cce4fb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2929-617f1e66a55be184.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2977-e38442e86289f1d3.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2982-2a2df543be3d2e5a.js +0 -25
- package/apps/pwa/out/_next/static/chunks/3403.4bc97b4066945a94.js +0 -5
- package/apps/pwa/out/_next/static/chunks/3441-a1dd4acfeda14488.js +0 -1
- package/apps/pwa/out/_next/static/chunks/371-4ad6af55dad02ced.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4114-3e63117452378807.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5080-1613752891fcadb4.js +0 -10
- package/apps/pwa/out/_next/static/chunks/5609-012bb3557211f07e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5791-bb82743fa6299562.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6090-85a3f05f954e5697.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6284-69db415193d5f8bd.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6320-baac91d68843a9a6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6416-505ba707cacafbba.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6725-68ab7cc0b1faf00d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6998-a654fe5c58271600.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7032-f4ef698518fba61c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7647.2fcd30d894d5ee30.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7673-2eda1507d38dadb8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7990-e12efba616f46e03.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8067-d976b441a104ab74.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8142-744998d65d7bb17e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8519-5632377cce994f86.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8619-4365e03a2862830f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8630-cdfc61e82c653ffc.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8894-e263b332208e3957.js +0 -1
- package/apps/pwa/out/_next/static/chunks/920-f7dceb78f1c585ef.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9454-139040d37c79dbc9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9651-3cd291a6fa1370d2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9740-8f5ff96c522b5f55.js +0 -1
- package/apps/pwa/out/_next/static/chunks/ae787e4c-f2998de7f1ba72a4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/_not-found/page-859cea1570b6227a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-fb7c2d458f32fcad.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-35e2713597dd24d1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/board/page-918b656f064577ba.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/bots/page-5f30e00693527ebd.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/chat/page-7fbae173b3c103a7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/consult/page-3b4edcce364062ea.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/control/page-c5794f484c251f44.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-1130d8eefcd87e76.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/editor/page-973996d584f008c1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/exec/page-016e2bda04eecb1f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/field/page-b4d6d9a3b56f2940.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/healthz/route-859cea1570b6227a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/intake/page-ec49a466121233ba.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/layout-f72db356744ceade.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live/page-a6fd9b50d1b85378.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/market/page-8b0402a46a749a3d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-037f83e2a1edc8e2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/not-found-46fedff57d4bec67.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-0cf318e9dcee2bbf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-899b327cb8b6845c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/release/page-6c1e6ba743a29dfe.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/page-1a8e4807292f6b17.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-28deba6bcb834916.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-de68e2205794037d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-c71c33a573230672.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-0df30e0c7e50148a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/page-4fc56790fe0d2682.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-59df2aebb38a7c1e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/layout-859cea1570b6227a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/page-4647be5dbcbd0795.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/share/page-e025892bda74b743.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-a0955de73b89f078.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-369846d2921af584.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/term/page-72cbc1c8cdd0f65d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/trace/page-77b28bfb0996d5ea.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/vault/page-3220c4934f49c6c2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-90670589b87abea8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-7df9243ed021a4cc.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-4498c3853f4f688d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-35bedde6d885f08f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/framework-ea806bb57f2b8923.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-8d2302399c2c8f87.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-app-6870f30ea99f8346.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_app-b10928c60f0b8488.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_error-689039227d443fab.js +0 -1
- package/apps/pwa/out/_next/static/chunks/webpack-e5bea36f183b25e6.js +0 -1
- package/apps/pwa/out/_next/static/css/f92f63a5df0ba229.css +0 -1
- package/src/dashboard/turn-typeahead-echo.ts +0 -23
- /package/apps/pwa/out/_next/static/{bFI5EEwg7T6aG88ibX4Zq → Y4zKzL62sakG5momz3SoQ}/_ssgManifest.js +0 -0
package/src/hooks/receiver.ts
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import { debug } from '../debug/log.js';
|
|
2
2
|
import { readFileSync } from 'node:fs';
|
|
3
|
-
import { userConfigPath } from '../user-config.js';
|
|
3
|
+
import { getUserConfig, parseEventsConfig, userConfigPath, type EventsConfig } from '../user-config.js';
|
|
4
|
+
import { dispatchHook, type HookWake } from './dispatch.js';
|
|
4
5
|
import { getSecretAsync } from '../nexus/config/secrets/index.js';
|
|
5
6
|
import { HookQueue, type QueuedHook } from './queue.js';
|
|
7
|
+
import { recordGithubShadow } from './github-shadow.js';
|
|
6
8
|
import { toExternalTask, verifyWebhook, type HookProvider } from './providers.js';
|
|
7
9
|
import { drainReports, handleReportPost, ReportLimiter, ReportQueue, type ReceivedReport } from './error-report.js';
|
|
8
10
|
import { effectiveInstanceRoot } from '../instance/resolve.js';
|
|
@@ -10,6 +12,7 @@ import { effectiveInstanceRoot } from '../instance/resolve.js';
|
|
|
10
12
|
export interface HookSecrets {
|
|
11
13
|
linear?: string;
|
|
12
14
|
asana?: string;
|
|
15
|
+
github?: string;
|
|
13
16
|
saveAsana?: (secret: string) => Promise<void>;
|
|
14
17
|
}
|
|
15
18
|
export interface HookReceiverOptions {
|
|
@@ -20,8 +23,12 @@ export interface HookReceiverOptions {
|
|
|
20
23
|
now?: () => number;
|
|
21
24
|
root?: string;
|
|
22
25
|
retryBaseMs?: number;
|
|
26
|
+
events?: EventsConfig;
|
|
27
|
+
wakeSeat?: HookWake;
|
|
23
28
|
/** ER2 — forward one queued error report to the Primary; default = POST /v1/reports/ingest over the tailnet. */
|
|
24
29
|
forwardReport?: (item: ReceivedReport) => Promise<boolean>;
|
|
30
|
+
/** GET-only public metadata lookup; failure forces human review. */
|
|
31
|
+
githubFetch?: typeof fetch;
|
|
25
32
|
}
|
|
26
33
|
|
|
27
34
|
/** `/v1/tasks` lives on the Primary's nexus API, not on the control plane — so the address is its own setting. */
|
|
@@ -33,19 +40,6 @@ export function hooksPrimaryUrl(config: { hooks?: { primaryUrl?: unknown } }): U
|
|
|
33
40
|
return url;
|
|
34
41
|
}
|
|
35
42
|
|
|
36
|
-
async function forwardToPrimary(event: QueuedHook): Promise<Response> {
|
|
37
|
-
const config = JSON.parse(readFileSync(userConfigPath(), 'utf8')) as { hooks?: { primaryTokenRef?: string; primaryUrl?: unknown } };
|
|
38
|
-
const ref = config.hooks?.primaryTokenRef;
|
|
39
|
-
if (!ref) throw new Error('primary token reference missing');
|
|
40
|
-
const token = await getSecretAsync(ref);
|
|
41
|
-
if (!token) throw new Error('primary token missing');
|
|
42
|
-
return fetch(new URL('/v1/tasks', hooksPrimaryUrl(config)), {
|
|
43
|
-
method: 'POST', headers: { 'content-type': 'application/json', authorization: `Bearer ${token}`,
|
|
44
|
-
'x-elanous-trace-id': `${event.provider}:${event.eventId}` },
|
|
45
|
-
body: JSON.stringify({ ...event.task, eventId: `${event.provider}:${event.eventId}` }), signal: AbortSignal.timeout(10_000),
|
|
46
|
-
});
|
|
47
|
-
}
|
|
48
|
-
|
|
49
43
|
async function forwardReportToPrimary(item: ReceivedReport): Promise<boolean> {
|
|
50
44
|
const config = JSON.parse(readFileSync(userConfigPath(), 'utf8')) as { hooks?: { primaryTokenRef?: string; primaryUrl?: unknown } };
|
|
51
45
|
const ref = config.hooks?.primaryTokenRef;
|
|
@@ -81,7 +75,12 @@ export function startHookReceiver(options: HookReceiverOptions): { url: string;
|
|
|
81
75
|
} finally { reportsDraining = false; }
|
|
82
76
|
}
|
|
83
77
|
const now = options.now ?? Date.now;
|
|
84
|
-
const
|
|
78
|
+
const events = options.events ?? getUserConfig().events ?? parseEventsConfig(undefined);
|
|
79
|
+
// L14: public-repository intake events take the shadow ledger path; every other event keeps the seat dispatch path.
|
|
80
|
+
const dispatch = options.forward ?? ((event: QueuedHook) => dispatchHook(event, options.root ?? effectiveInstanceRoot(), events, options.wakeSeat).then(() => 204));
|
|
81
|
+
const forward = (event: QueuedHook) => event.provider === 'github' && event.task.github
|
|
82
|
+
? recordGithubShadow(event, options.root ?? effectiveInstanceRoot(), options.githubFetch).then(() => 204)
|
|
83
|
+
: dispatch(event);
|
|
85
84
|
const attempts = new Map<string, { next: number; failures: number }>();
|
|
86
85
|
const pending = new Set<string>();
|
|
87
86
|
let stopped = false;
|
|
@@ -124,7 +123,7 @@ export function startHookReceiver(options: HookReceiverOptions): { url: string;
|
|
|
124
123
|
if (request.method === 'POST' && url.pathname === '/v1/reports')
|
|
125
124
|
return handleReportPost(request, { limiter: reportLimiter, queue: reportQueue, ...(options.now ? { now: options.now } : {}),
|
|
126
125
|
log: (event, data) => debug.log('hooks.reports', event, data), wake: () => { reportNextAt = 0; void drainReportQueue(); } });
|
|
127
|
-
if (request.method !== 'POST' || !/^\/hooks\/(linear|asana)$/.test(url.pathname)) return new Response('Not Found', { status: 404 });
|
|
126
|
+
if (request.method !== 'POST' || !/^\/hooks\/(linear|asana|github)$/.test(url.pathname)) return new Response('Not Found', { status: 404 });
|
|
128
127
|
const provider = url.pathname.slice('/hooks/'.length) as HookProvider;
|
|
129
128
|
const reject = (reason: string) => {
|
|
130
129
|
debug.log('hooks.receiver', 'rejected', { provider, reason });
|
|
@@ -150,13 +149,15 @@ export function startHookReceiver(options: HookReceiverOptions): { url: string;
|
|
|
150
149
|
debug.log('hooks.receiver', 'ignored', { provider, kind: verified.ignored });
|
|
151
150
|
return new Response(null, { status: 200 });
|
|
152
151
|
}
|
|
153
|
-
if (provider === 'linear') {
|
|
152
|
+
if (provider === 'linear' || provider === 'github') {
|
|
154
153
|
const eventId = verified.eventIds[0]!;
|
|
155
|
-
|
|
154
|
+
const body = verified.body as { type?: string; action: string; githubEvent?: string };
|
|
155
|
+
const kind = provider === 'linear' ? `${body.type}:${body.action}` : `${body.githubEvent}:${body.action}`;
|
|
156
|
+
queue.enqueue({ provider, eventId, kind, task: toExternalTask(provider, { ...body, eventId }) });
|
|
156
157
|
} else {
|
|
157
158
|
const body = verified.body as { events: unknown[] };
|
|
158
|
-
const tasks = body.events.map(event => toExternalTask(provider, { event, task: (event as { task?: unknown }).task }));
|
|
159
|
-
for (const task of tasks) queue.enqueue({ provider, eventId: task.eventId, task });
|
|
159
|
+
const tasks = body.events.map(event => ({ event: event as { action?: string }, task: toExternalTask(provider, { event, task: (event as { task?: unknown }).task }) }));
|
|
160
|
+
for (const { event, task } of tasks) queue.enqueue({ provider, eventId: task.eventId, kind: `task:${event.action ?? 'unknown'}`, task });
|
|
160
161
|
}
|
|
161
162
|
if (!draining) {
|
|
162
163
|
if (timer) clearTimeout(timer);
|
package/src/index.ts
CHANGED
|
@@ -9,6 +9,7 @@ import { LOGS_SINCE_OPTION, registerLogsCommands } from './cli/logs-cli.js';
|
|
|
9
9
|
import { registerDocsCommands } from './cli/docs-cli.js';
|
|
10
10
|
import { registerA2ACommands } from './cli/a2a-cli.js';
|
|
11
11
|
import { registerPluginCommands } from './cli/plugin-cli.js';
|
|
12
|
+
import { registerMakeCommand } from './cli/make-cli.js';
|
|
12
13
|
import { registerConnectCommand, registerSkillsCommands } from './cli/skills-cli.js';
|
|
13
14
|
import { registerImportCommand } from './cli/import-cli.js';
|
|
14
15
|
import { registerPersonaCommands } from './cli/persona-cli.js';
|
|
@@ -96,6 +97,7 @@ applyTestFlagFromArgv();
|
|
|
96
97
|
applyConfigDirFlagFromArgv();
|
|
97
98
|
|
|
98
99
|
import { Command, Option } from 'commander';
|
|
100
|
+
import { filterCliRootHelp } from './maturity/cli-maturity.js';
|
|
99
101
|
import type { AdPipelinePlan, AdPipelineResult } from './ad-pipeline/run.js';
|
|
100
102
|
import type { AcpPermissionApprover } from './acp/client.js';
|
|
101
103
|
import { runGitCommand } from './git-fs/runner.js';
|
|
@@ -122,7 +124,7 @@ import { DEFAULT_REVIEW_BACKEND } from './agent-substrate/acp-reviewer.js';
|
|
|
122
124
|
import type { ReviewResult } from './agent-substrate/pr-reviewer.js';
|
|
123
125
|
import type { ReviewVerdict } from './agent-mission/review-loop.js';
|
|
124
126
|
import type { SyncMode } from './types.js';
|
|
125
|
-
import { runOnboarding, runOnboardingStep, runOnboardingNonInteractive, needsOnboarding, handleOnboardingRefusal, type OnboardingStepId } from './onboarding.js';
|
|
127
|
+
import { runOnboarding, runOnboardingStep, runOnboardingNonInteractive, needsOnboarding, needsFirstRun, handleOnboardingRefusal, type OnboardingStepId } from './onboarding.js';
|
|
126
128
|
import {
|
|
127
129
|
getUserConfig, reloadUserConfig, userConfigPath, saveUserConfig,
|
|
128
130
|
backupUserConfig, backupConfigPath, addRotationEntry, type RotationEntry,
|
|
@@ -137,6 +139,7 @@ import {
|
|
|
137
139
|
} from './session/index.js';
|
|
138
140
|
import { requestSessionTurnControl } from './session/session-turn-control.js';
|
|
139
141
|
import { ensureCliSession, sessionBudget } from './session/chat.js';
|
|
142
|
+
import { suggestProjectForFolder } from './project/project-store.js';
|
|
140
143
|
import { botFromConfig, TelegramBot } from './telegram.js';
|
|
141
144
|
import { acquireTelegramLock, TelegramLockError, defaultLockPath, safeReadLock } from './telegram-lock.js';
|
|
142
145
|
import { basename, join as _joinPath, resolve } from 'node:path';
|
|
@@ -865,6 +868,31 @@ registerUsageCommand(program);
|
|
|
865
868
|
registerLiveCommands(program);
|
|
866
869
|
registerResearchCommand(program);
|
|
867
870
|
registerReleaseCommands(program);
|
|
871
|
+
const seatCmd = program.command('seat').description('분배된 자리의 하루 루프와 보고');
|
|
872
|
+
seatCmd.command('loop').requiredOption('--seat <SEAT>', 'MK|OP|TC|UX')
|
|
873
|
+
.requiredOption('--once', '한 번 실행')
|
|
874
|
+
.option('--json', 'JSON 출력')
|
|
875
|
+
.action(async (opts: { seat: string; once: boolean; json?: boolean }) => {
|
|
876
|
+
try {
|
|
877
|
+
// V3 F5: without the sink, the seat loop's judgment lines (seat.loop) never reach the log store when cron runs it.
|
|
878
|
+
await (await import('./domains/standalone-log-sink.js')).registerStandaloneLogSink('seat-loop');
|
|
879
|
+
const { runSeatLoopTurn } = await import('./seat-loop/seat-loop.js');
|
|
880
|
+
const result = await runSeatLoopTurn(opts.seat);
|
|
881
|
+
if (opts.json) await writeStdoutJson(`${JSON.stringify(result)}\n`);
|
|
882
|
+
else console.log(`seat loop ${opts.seat}: ${result.status}${'runId' in result && result.runId ? ` ${result.runId}` : ''}`);
|
|
883
|
+
} catch (error) { console.error(`seat loop: ${error instanceof Error ? error.message : String(error)}`); process.exitCode = 1; }
|
|
884
|
+
});
|
|
885
|
+
seatCmd.command('report').requiredOption('--seat <SEAT>', 'MK|OP|TC|UX')
|
|
886
|
+
.option('--post', '설정된 채널에 게시')
|
|
887
|
+
.option('--json', 'JSON 출력')
|
|
888
|
+
.action(async (opts: { seat: string; post?: boolean; json?: boolean }) => {
|
|
889
|
+
try {
|
|
890
|
+
const { seatReport } = await import('./seat-loop/seat-report.js');
|
|
891
|
+
const result = await seatReport(opts.seat, { post: opts.post });
|
|
892
|
+
if (opts.json) await writeStdoutJson(`${JSON.stringify(result)}\n`);
|
|
893
|
+
else console.log(result.body);
|
|
894
|
+
} catch (error) { console.error(`seat report: ${error instanceof Error ? error.message : String(error)}`); process.exitCode = 1; }
|
|
895
|
+
});
|
|
868
896
|
registerModelWatchCommand(program);
|
|
869
897
|
registerDoctorCommand(program);
|
|
870
898
|
// runCli() → main() → program.parseAsync() dispatches control serve and resources where|list.
|
|
@@ -888,6 +916,7 @@ registerCardCommand(program);
|
|
|
888
916
|
registerLaunchHeadCommands(program);
|
|
889
917
|
registerA2ACommands(program);
|
|
890
918
|
registerPluginCommands(program);
|
|
919
|
+
registerMakeCommand(program);
|
|
891
920
|
registerSkillsCommands(program);
|
|
892
921
|
registerConnectCommand(program);
|
|
893
922
|
registerImportCommand(program);
|
|
@@ -986,6 +1015,18 @@ linearCmd.command('set-key').description('Read Linear API key from stdin and sto
|
|
|
986
1015
|
catch { console.error('connector.linear.apiKey: could not save key'); process.exitCode = 1; }
|
|
987
1016
|
});
|
|
988
1017
|
|
|
1018
|
+
const storyboardCmd = program.command('storyboard').description('스토리보드 정본 검사 · MD 생성');
|
|
1019
|
+
storyboardCmd.command('lint').description('스토리보드 검사').argument('[files...]').option('--json', 'JSON 출력')
|
|
1020
|
+
.action(async (paths: string[], opts: { json?: boolean }) => {
|
|
1021
|
+
const { runStoryboard } = await import('./cli/storyboard-cli.js');
|
|
1022
|
+
process.exitCode = runStoryboard('lint', paths, opts.json);
|
|
1023
|
+
});
|
|
1024
|
+
storyboardCmd.command('render').description('스토리보드 검사 후 MD 생성').argument('[files...]')
|
|
1025
|
+
.action(async (paths: string[]) => {
|
|
1026
|
+
const { runStoryboard } = await import('./cli/storyboard-cli.js');
|
|
1027
|
+
process.exitCode = runStoryboard('render', paths);
|
|
1028
|
+
});
|
|
1029
|
+
|
|
989
1030
|
const pythonCmd = program.command('python').description('elanous 가 쓰는 파이썬(해석 · 점검 · elanous venv 셋업) — RFC-doctor-fix-build-toolchain-and-python-by-distro');
|
|
990
1031
|
pythonCmd.command('where').description('어느 파이썬을 쓰나(ELANOUS_PYTHON > elanous venv > pyenv .python-version > PATH)').option('--json').option('--path', '경로만 한 줄(스크립트·스킬용)').action(async (o: { json?: boolean; path?: boolean }) => {
|
|
991
1032
|
const { runPythonWhere } = await import('./cli/python-cli.js'); process.exitCode = runPythonWhere(console, o.json, o.path);
|
|
@@ -1050,7 +1091,8 @@ program
|
|
|
1050
1091
|
.option(
|
|
1051
1092
|
'--test',
|
|
1052
1093
|
'격리 테스트 인스턴스로 실행 — cwd 의 git 트리(worktree 포함)에서 `<트리>/.elanous-test` 를 루트로 잡고 state·config 두 축을 함께 격리한다. config 사본이 없으면 자동 물질화. `--test=<dir>` 로 루트 직접 지정 가능(값 문법은 `=` 형태 하나 — 모호함 없음). ELANOUS_STATE_DIR/--config-dir 을 손으로 줄 필요가 없다.',
|
|
1053
|
-
)
|
|
1094
|
+
)
|
|
1095
|
+
.option('--help-all', '시스템 명령을 제외한 모든 최상위 명령 표시');
|
|
1054
1096
|
program.addHelpText('after', acpServerHelpText());
|
|
1055
1097
|
|
|
1056
1098
|
program
|
|
@@ -2120,13 +2162,13 @@ harnessCmd
|
|
|
2120
2162
|
.option('--json', 'JSON 출력')
|
|
2121
2163
|
.option('--dry-run', '프로세스 후보만 보고 신호·Pod Job 삭제는 하지 않는다')
|
|
2122
2164
|
.action(async (runId: string, opts: { context?: string[]; json?: boolean; dryRun?: boolean }) => {
|
|
2123
|
-
const { stopHarnessRun, defaultHarnessStopDeps, formatHarnessStop } = await import('./harness/harness-stop.js');
|
|
2165
|
+
const { stopHarnessRun, defaultHarnessStopDeps, formatHarnessStop, AmbiguousHarnessStopRunIdError } = await import('./harness/harness-stop.js');
|
|
2124
2166
|
try {
|
|
2125
2167
|
const result = await stopHarnessRun(runId, defaultHarnessStopDeps(), opts.context, opts.dryRun === true);
|
|
2126
2168
|
process.stdout.write(`${opts.json ? JSON.stringify(result) : formatHarnessStop(result)}\n`);
|
|
2127
2169
|
} catch (error) {
|
|
2128
2170
|
process.stderr.write(`${error instanceof Error ? error.message : String(error)}\n`);
|
|
2129
|
-
process.exitCode = 2;
|
|
2171
|
+
process.exitCode = error instanceof AmbiguousHarnessStopRunIdError ? 1 : 2;
|
|
2130
2172
|
}
|
|
2131
2173
|
});
|
|
2132
2174
|
harnessCmd
|
|
@@ -2556,11 +2598,18 @@ harnessCmd
|
|
|
2556
2598
|
const { verifyDeployedPage, formatVerifyUrlReport } = await import('./harness/browser-verify.js');
|
|
2557
2599
|
const { writeFileSync } = await import('node:fs');
|
|
2558
2600
|
let shotWritten = false;
|
|
2601
|
+
let shotWriteError: string | undefined;
|
|
2559
2602
|
const r = await verifyDeployedPage(url, {
|
|
2560
2603
|
backend: opts.backend,
|
|
2561
2604
|
...(opts.port ? { port: Number(opts.port) } : {}),
|
|
2562
2605
|
// ⛔ 「썼다」를 «셋»으로 — 안 시켰다 / 썼다 / 못 썼다. 뭉치면 없는 파일을 있다고 말한다.
|
|
2563
|
-
...(opts.shot ? { onScreenshot: (b: Buffer) => {
|
|
2606
|
+
...(opts.shot ? { onScreenshot: (b: Buffer) => {
|
|
2607
|
+
try { writeFileSync(opts.shot!, b); shotWritten = true; }
|
|
2608
|
+
catch (error) {
|
|
2609
|
+
shotWriteError = error instanceof Error ? error.message : String(error);
|
|
2610
|
+
if (opts.backend === 'aside') throw error;
|
|
2611
|
+
}
|
|
2612
|
+
} } : {}),
|
|
2564
2613
|
});
|
|
2565
2614
|
if (r.skipped === 'no-cdp') {
|
|
2566
2615
|
console.log(`⚠️ CDP 엔드포인트 없음(9222) — 검증 skip. browser-debug 스킬로 브라우저를 9222 에 먼저 띄우세요.`);
|
|
@@ -2571,8 +2620,11 @@ harnessCmd
|
|
|
2571
2620
|
return;
|
|
2572
2621
|
}
|
|
2573
2622
|
const L = formatVerifyUrlReport(url, r, opts.shot === undefined ? undefined : { path: opts.shot, written: shotWritten });
|
|
2623
|
+
if (opts.shot && !shotWritten && !r.skipped) {
|
|
2624
|
+
L.push(` - 스크린샷을 ${opts.shot} 에 못 썼다 — ${shotWriteError ?? (r.unmeasured?.includes('screenshot') ? '스크린샷을 못 쟀다' : '스크린샷 데이터가 오지 않았다')}`);
|
|
2625
|
+
}
|
|
2574
2626
|
console.log(L.join('\n'));
|
|
2575
|
-
if (!r.ok) process.exitCode = 1;
|
|
2627
|
+
if (!r.ok || (opts.shot && !shotWritten && !r.skipped)) process.exitCode = 1;
|
|
2576
2628
|
} catch (e: any) {
|
|
2577
2629
|
ui.error(`harness verify-url 실패: ${String(e?.message ?? e).slice(0, 200)}`);
|
|
2578
2630
|
process.exitCode = 1;
|
|
@@ -2976,6 +3028,46 @@ const harnessOrchestrateCmd = registerHarnessOrchestrateCapabilityOptions(
|
|
|
2976
3028
|
await runHarnessOrchestrateExecution(plan, parts);
|
|
2977
3029
|
});
|
|
2978
3030
|
|
|
3031
|
+
const contextCmd = program.command('context').description('외부 에이전트 맥락 이벤트');
|
|
3032
|
+
contextCmd.command('hooks').description('Claude Code 맥락 훅 설정').command('install')
|
|
3033
|
+
.requiredOption('--print', '설정 조각만 출력하고 설정 파일은 수정하지 않음')
|
|
3034
|
+
.action(async () => {
|
|
3035
|
+
const { claudeHooksSettings } = await import('./context-bus/claude-hooks-install.js');
|
|
3036
|
+
console.log(claudeHooksSettings(REPOSITORY_ROOT));
|
|
3037
|
+
});
|
|
3038
|
+
contextCmd.command('emit')
|
|
3039
|
+
.requiredOption('--kind <kind>', 'claimed|done|asked|guide-changed')
|
|
3040
|
+
.requiredOption('--summary <line>', '한 줄 요약')
|
|
3041
|
+
.requiredOption('--source <link>', '출처 링크')
|
|
3042
|
+
.action(async (opts: { kind: string; summary: string; source: string }) => {
|
|
3043
|
+
if (!['claimed', 'done', 'asked', 'guide-changed'].includes(opts.kind)) throw new Error('context emit --kind must be claimed|done|asked|guide-changed');
|
|
3044
|
+
const { recordExternalEvent } = await import('./context-bus/external-events.js');
|
|
3045
|
+
recordExternalEvent({ origin: 'claude-code', kind: opts.kind as import('./context-bus/external-events.js').ContextHookKind,
|
|
3046
|
+
summary: opts.summary, source: opts.source });
|
|
3047
|
+
});
|
|
3048
|
+
|
|
3049
|
+
const coordCmd = program.command('coord').description('조율 채널 맥락 원장');
|
|
3050
|
+
coordCmd.command('event').command('record')
|
|
3051
|
+
.requiredOption('--seat <ID>', '발신 자리')
|
|
3052
|
+
.requiredOption('--header <line>', '채널 글 첫 줄')
|
|
3053
|
+
.option('--url <url>', '채널 코멘트 URL')
|
|
3054
|
+
.action(async (opts: { seat: string; header: string; url?: string }) => {
|
|
3055
|
+
const { parseCoordHeader, recordCoordEvent } = await import('./context-bus/coord-events.js');
|
|
3056
|
+
recordCoordEvent({ ...parseCoordHeader(opts.seat, opts.header), url: opts.url || null });
|
|
3057
|
+
});
|
|
3058
|
+
coordCmd.command('events')
|
|
3059
|
+
.option('--since <ISO|2h>', '조회 시작', '2h')
|
|
3060
|
+
.option('--seat <ID>', '발신 자리')
|
|
3061
|
+
.option('--json', 'JSON 출력')
|
|
3062
|
+
.action(async (opts: { since: string; seat?: string; json?: boolean }) => {
|
|
3063
|
+
const { listCoordEvents } = await import('./context-bus/coord-events.js');
|
|
3064
|
+
const relative = /^(\d+)h$/.exec(opts.since);
|
|
3065
|
+
const since = relative ? new Date(Date.now() - Number(relative[1]) * 3_600_000).toISOString() : new Date(opts.since).toISOString();
|
|
3066
|
+
const rows = listCoordEvents({ since, ...(opts.seat ? { seat: opts.seat } : {}) });
|
|
3067
|
+
if (opts.json) await writeStdoutJson(JSON.stringify(rows) + '\n');
|
|
3068
|
+
else for (const row of rows) console.log(`${row.at} [${row.refs.seat}] ${row.text}`);
|
|
3069
|
+
});
|
|
3070
|
+
|
|
2979
3071
|
const selfCmd = program.command('self').description('Self-awareness memory — 외부 도구(Claude Code/Codex)가 구현/변경 이력을 elanous 기억에 주입·회상');
|
|
2980
3072
|
|
|
2981
3073
|
// M12 Claude Code 의존도 계기판 — `elanous self dependence [--since] [--until] [--json]`(읽기만).
|
|
@@ -3905,11 +3997,12 @@ selfCmd
|
|
|
3905
3997
|
.option('--changed', '변경 파일 범위 게이트임을 명시한다')
|
|
3906
3998
|
.option('--base <ref>', '커밋됐지만 PR 없는 변경의 비교 기준(ref...HEAD)')
|
|
3907
3999
|
.option('--pr <number>', '열린 PR 번호에서 gh pr view files로 변경 파일을 읽는다')
|
|
3908
|
-
.
|
|
3909
|
-
|
|
4000
|
+
.option('--shards [number]', '메모리 예산에 맞춰 시험을 별도 프로세스로 분할한다 (기본 2)')
|
|
4001
|
+
.action((opts: { changed?: boolean; base?: string; pr?: string; shards?: string | boolean }) => {
|
|
4002
|
+
if (!opts.changed && opts.shards === undefined) { ui.error('self gate requires --changed or --shards'); process.exitCode = 2; return; }
|
|
3910
4003
|
try {
|
|
3911
4004
|
const { runSelfGateCli } = require('./self-implement/gate-cli.js') as typeof import('./self-implement/gate-cli.js');
|
|
3912
|
-
const result = runSelfGateCli(process.cwd(), { base: opts.base, pr: opts.pr });
|
|
4005
|
+
const result = runSelfGateCli(process.cwd(), { base: opts.base, pr: opts.pr, shards: opts.shards === undefined ? undefined : opts.shards === true ? 2 : Number(opts.shards) });
|
|
3913
4006
|
console.log(result.lines.join('\n'));
|
|
3914
4007
|
process.exitCode = result.exitCode;
|
|
3915
4008
|
} catch (error) {
|
|
@@ -3941,7 +4034,8 @@ selfCmd
|
|
|
3941
4034
|
// runSelfImplement(내부 SelfImplement 툴과 동일 코어)를 감싼다: fork→worktree→헤드리스 goal-loop
|
|
3942
4035
|
// (+클린빌드 앵커)→gate(bun test)→PR(HITL). PR-open 은 --open-pr(명시 승인)일 때만·기본 fail-closed.
|
|
3943
4036
|
selfCmd
|
|
3944
|
-
.command('implement
|
|
4037
|
+
.command('implement [feature...]')
|
|
4038
|
+
.option('--feature-file <path>', 'feature 문면을 파일에서 읽는다 (문면을 argv 에 싣지 않음)')
|
|
3945
4039
|
.description('자율 구현(self-build) — feature 를 격리 worktree 에서 goal-loop + 클린빌드 앵커로 끝까지 구현하고 gate(bun test) 통과까지. --config-dir 의 provider 로 모델 선택(gemma 등). PR-open 은 --open-pr(HITL 명시승인)일 때만. 수분 소요.')
|
|
3946
4040
|
.option('--base <branch>', 'PR base 브랜치(생략 시 provider 기본)')
|
|
3947
4041
|
.option('--no-draft', 'non-draft PR (기본 draft)')
|
|
@@ -3959,8 +4053,11 @@ selfCmd
|
|
|
3959
4053
|
.option('--no-supervise', '⛔ 런 슈퍼바이저를 «끈다»(대표 2026-08-22: ***기본 ON***) — 켜져 있으면 실행이 끝나면 실패를 «트리아지»해서 다시 걸 수 있으면 스스로 재개한다(끝까지). 정지 사유는 converged|needs-human|max-rounds|no-progress 로 각각 «다른 값». 관측=elanous logs --category self-dev.supervisor')
|
|
3960
4054
|
.option('--supervise-rounds <n>', '슈퍼바이저 재개 라운드 상한 (기본 3 · 끄려면 --no-supervise)')
|
|
3961
4055
|
.option('--json', '구조화 출력 {stage, ok, branch, worktree, prUrl?, merged?}')
|
|
3962
|
-
.action(async (parts: string[], opts: { base?: string; draft?: boolean; openPr?: boolean; autoMerge?: boolean; autoReview?: boolean; maxWait?: string; json?: boolean; plan?: boolean; enhance?: boolean; ground?: boolean; observeOnly?: boolean }) => {
|
|
3963
|
-
|
|
4056
|
+
.action(async (parts: string[], opts: { featureFile?: string; base?: string; draft?: boolean; openPr?: boolean; autoMerge?: boolean; autoReview?: boolean; maxWait?: string; json?: boolean; plan?: boolean; enhance?: boolean; ground?: boolean; observeOnly?: boolean }) => {
|
|
4057
|
+
if (opts.featureFile && parts.length > 0) { ui.error('--feature-file 과 위치 인자 feature 는 함께 줄 수 없다'); process.exit(2); }
|
|
4058
|
+
let feature: string;
|
|
4059
|
+
try { feature = (opts.featureFile ? readFileSync(opts.featureFile, 'utf8') : parts.join(' ')).trim(); }
|
|
4060
|
+
catch (error) { ui.error(`--feature-file 읽기 실패: ${String(error)}`); process.exit(2); return; }
|
|
3964
4061
|
if (!feature) { ui.error('feature 필요: elanous self implement "<무엇을 구현할지>"'); process.exit(2); }
|
|
3965
4062
|
// Retired entry points must fail before run identity or log-sink setup creates observable execution state.
|
|
3966
4063
|
if (opts.plan) { ui.error('self implement --plan is retired and rejected'); process.exit(1); return; }
|
|
@@ -4058,8 +4155,14 @@ export function setSelfOrchestrateSpawnForTesting(spawn: typeof selfOrchestrateS
|
|
|
4058
4155
|
selfOrchestrateSpawnForTesting = spawn;
|
|
4059
4156
|
}
|
|
4060
4157
|
|
|
4158
|
+
export function readSelfOrchestrateGoals(parts: string[], goalFiles: readonly string[] = []): { request: string; goals: string[] } {
|
|
4159
|
+
const fileGoals = goalFiles.map((path) => readFileSync(path, 'utf8'));
|
|
4160
|
+
return { request: [...parts, ...fileGoals].join(' '), goals: [...splitOrchestrateGoalTexts(parts), ...fileGoals] };
|
|
4161
|
+
}
|
|
4162
|
+
|
|
4061
4163
|
const selfOrchestrateCmd = selfCmd
|
|
4062
4164
|
.command('orchestrate [goals...]')
|
|
4165
|
+
.option('--goal-file <path>', '골 문면을 파일에서 읽는다 (반복 가능)', (value: string, acc: string[]) => [...acc, value], [] as string[])
|
|
4063
4166
|
.description('병렬 self-dev — 여러 goal 을 각자 격리 worktree self-implement 서브프로세스로 동시성캡 병렬 실행. goal 은 `;;` 로 구분(또는 각 인자 1 goal). --concurrency 로 동시 잡 수(기본 2).')
|
|
4064
4167
|
.option('--concurrency <n>', '동시 실행 잡 수 (기본 2)')
|
|
4065
4168
|
.option('--auto-merge', '각 잡: 리뷰 clean 시 자동 병합(각 self-implement 에 --auto-merge 전달·리뷰노드 경유)')
|
|
@@ -4068,7 +4171,7 @@ const selfOrchestrateCmd = selfCmd
|
|
|
4068
4171
|
.option('--base <branch>', '각 잡 PR base 브랜치')
|
|
4069
4172
|
.option('--decompose', 'S2 — goal 1개를 LLM 으로 의존성 서브-DAG(위상 병렬 + hot-file 직렬)로 분해 후 실행')
|
|
4070
4173
|
.addOption(new Option('--pod-skill-env', 'pod: 필수 스킬(설정 pod-skills.txt)의 키(.env)를 이 런의 Secret 으로 넘긴다 — 명시 opt-in(유료 크레딧) · 이미지엔 안 들어간다').hideHelp())
|
|
4071
|
-
.addOption(new Option('--pod-pool <spec>', 'pod 풀 — 컨텍스트[@ssh호스트][:상한]
|
|
4174
|
+
.addOption(new Option('--pod-pool <spec>', 'pod 풀 — 컨텍스트[@ssh호스트][:상한][#k3d-레지스트리:포트] 쉼표, 앞이 우선(예 pool-node-b@node-b:12#k3d-elanous-registry:5051,pool-node-c@node-c:3#k3d-elanous-registry:5052) · 없으면 ELANOUS_POD_POOL · 그것도 없으면 현재 컨텍스트 하나').hideHelp())
|
|
4072
4175
|
.addOption(new Option('--reduce', '끝에 PR 을 연 조각들을 통합 브랜치 하나로 모아(게이트 한 번) PR 하나 — `--open-pr` 과 짝 · `--auto-merge` 와는 함께 못 쓴다(elanous self reduce)').hideHelp())
|
|
4073
4176
|
.option('--substrate <kind>', '실행 칸: local(기본 · 격리 워크트리) | pod(k8s Job · docker/harness 이미지 · MANUAL-pods-for-elanous-ops-and-dev)')
|
|
4074
4177
|
.option('--pod-account <name>', 'pod: codex 계정(~/.elanous/auth.json openai-codex:<name> · refresh 제외 사본) · 없으면 브로커가 Job 마다 잔량 많은 계정을 돌려 준다')
|
|
@@ -4076,11 +4179,14 @@ const selfOrchestrateCmd = selfCmd
|
|
|
4076
4179
|
.option('--pod-pass-env <keys>', 'pod: 호스트 env 에서 Pod 로 넘길 키(쉼표) — 예 OPENROUTER_API_KEY,ANTHROPIC_API_KEY(벤치마크 과금 경로)')
|
|
4077
4180
|
.option('--bench-arms <spec>', 'pod 벤치마크: 골 1개를 팔마다 «라벨 한 줄만 다르게» 복제해 동시에 — "id=provider[:model][@KEY+KEY];…" (예 codex=openai-codex;or-kimi=openrouter:openrouter/moonshotai/kimi-k3@OPENROUTER_API_KEY) · --auto-merge 거부 · RFC fleet 슈퍼바이저 §A3')
|
|
4078
4181
|
.option('--help-all', '모든 orchestrate 옵션 표시')
|
|
4079
|
-
.action(function (this: Command, parts: string[], opts: { concurrency?: string; autoMerge?: boolean; autoReview?: boolean; openPr?: boolean; base?: string; teardown?: boolean; resume?: string; board?: boolean; decompose?: boolean; fabricDecompose?: boolean; maxTasks?: string; supervise?: boolean; superviseRounds?: string; json?: boolean }) {
|
|
4182
|
+
.action(function (this: Command, parts: string[], opts: { goalFile?: string[]; concurrency?: string; autoMerge?: boolean; autoReview?: boolean; openPr?: boolean; base?: string; teardown?: boolean; resume?: string; board?: boolean; decompose?: boolean; fabricDecompose?: boolean; maxTasks?: string; supervise?: boolean; superviseRounds?: string; json?: boolean }) {
|
|
4080
4183
|
return (async () => {
|
|
4081
|
-
//
|
|
4082
|
-
|
|
4083
|
-
|
|
4184
|
+
// 위치 인자는 종전처럼 분리하고 파일 입력은 파일당 한 골이다.
|
|
4185
|
+
let inputGoals: ReturnType<typeof readSelfOrchestrateGoals>;
|
|
4186
|
+
try { inputGoals = readSelfOrchestrateGoals(parts, opts.goalFile); }
|
|
4187
|
+
catch (error) { ui.error(`--goal-file 읽기 실패: ${String(error)}`); process.exit(2); return; }
|
|
4188
|
+
const joined = inputGoals.request;
|
|
4189
|
+
let goalTexts = inputGoals.goals;
|
|
4084
4190
|
if ((opts as { reduce?: boolean }).reduce && opts.autoMerge) { ui.error('--reduce 는 --auto-merge 와 함께 못 쓴다 — 조각을 하나씩 main 에 병합하는 것과 하나로 모으는 것은 반대다(--open-pr 과 짝)'); process.exit(2); }
|
|
4085
4191
|
// ☸️ 벤치 팔 — 골 1개를 팔마다 라벨 한 줄만 다르게(A/B 매뉴얼 ②) · pod 전용 · 자동 머지 금지(한 팔이 머지되면 다른 팔의 밑 땅이 바뀐다).
|
|
4086
4192
|
const benchSpec = (opts as { benchArms?: string }).benchArms;
|
|
@@ -6228,7 +6334,7 @@ const selfDevCmd = program
|
|
|
6228
6334
|
// `drive --help` 에도 그대로 보이고 자식이 그것을 계약으로 읽는다.
|
|
6229
6335
|
// ⇒ 별칭을 없애지 않는다([[RFC-two-command-convergence-dev-and-pty-2026-07-28]] §6-2 = 층이 다르니
|
|
6230
6336
|
// `drive` 는 프리미티브로 **유지**한다) — 대신 **도움말이 그 갈림을 먼저 말하게** 한다.
|
|
6231
|
-
.description('⛔ `drive` 별칭으로 부르면 옵션은
|
|
6337
|
+
.description('⛔ `drive` 별칭으로 부르면 옵션은 아홉뿐 (--goal · --attach · --max-steps · --poll-ms · --model · --cwd · --worktree · --json · --jail-home) — `--attach <ref>` 는 이미 있는 PTY 를 몬다(생략하면 셸 명령을 새로 띄운다). 나머지는 전부 `dev` 전용이고 `drive` 에서는 거부된다. dev 와 drive 는 한 명령이라 이 도움말을 공유하므로, 아래 목록은 `dev` 기준이다. ⚠️ 실험 — 통합 self-dev 파이프라인 runDevPipeline. --backend self(디폴트·elanous-chat 자체구현)|codex/claude/gemini/grok(외부). --transport pty(디폴트·worktree·--branch 필수)|acp(cwd 세션·U6·capability 미검증). 미배선 조합은 NotYetUnified 명시 거부. ★self 는 무인 완결이 기본(PR 개설→auto-review 라벨→리뷰 clean 시 병합) — 끄려면 --no-open-pr/--no-auto-review/--no-auto-merge. 관측=elanous logs --category dev-pipeline · 상세=docs/manual/MANUAL-frontdoor-selfdev-dogfood-mechanism-2026-07-25.md')
|
|
6232
6338
|
.option('--file <path>', 'input 파일(verbatim 바이트·<text...> 대신)')
|
|
6233
6339
|
// ⭐ 대표 2026-08-11 — 발사 절차 «넷»을 한 명령으로. ask 파일을 주면 ⑴저작 → ⑵열린 PR ⊕ ⑶도는 런 검사 → ⑷발사.
|
|
6234
6340
|
// ⛔ 걸리면 «이름을 대며» 멈춘다(조용히 진행하지 않는다). 우회는 --force-preflight 이고 그 사실이 관측에 남는다.
|
|
@@ -6254,6 +6360,7 @@ const selfDevCmd = program
|
|
|
6254
6360
|
.option('-n, --max-steps <n>', 'elanous 또는 셸 drive: 최대 제어 스텝(기본 30)')
|
|
6255
6361
|
.option('-p, --poll-ms <ms>', 'elanous 또는 셸 drive: 제어 스텝 간 폴 간격(ms·0 허용·기본 800)')
|
|
6256
6362
|
.option('--attach <ref>', 'drive: 이미 있는 PTY 를 몬다(생략하면 셸 명령을 새로 띄운다·pty auto 와 같은 루프)')
|
|
6363
|
+
.option('--jail-home <dir>', 'drive: DRIVE-JAIL — 두뇌 입력에 이 디렉터리 밖 경로가 있으면 PTY 로 보내지 않는다')
|
|
6257
6364
|
.option('-m, --model <id>', 'elanous 또는 셸 drive: 제어 brain LLM 모델(기본 config)')
|
|
6258
6365
|
.option('--observe-only', 'elanous: child boot부터 SelfImplement 호출을 기록만 한다')
|
|
6259
6366
|
.option('--isolated-root <path>', 'elanous: child config/state 격리 루트(설정 실패 시 fail-closed)')
|
|
@@ -6498,8 +6605,21 @@ const selfDevCmd = program
|
|
|
6498
6605
|
if (devAskSubstrate?.substrate === 'pod') {
|
|
6499
6606
|
const { dispatchHarnessOnPod } = await import('./harness/harness-pod-dispatch.js');
|
|
6500
6607
|
const { devAskPodDispatchInput } = await import('./harness/harness-substrate-default.js');
|
|
6501
|
-
const
|
|
6502
|
-
|
|
6608
|
+
const { classifyHarnessPodExit, harnessPodRunId, recordClassifiedHarnessPodExit, warnRecentIncidentBurst } = await import('./harness/harness-cli-command.js');
|
|
6609
|
+
warnRecentIncidentBurst();
|
|
6610
|
+
let podOutput = '';
|
|
6611
|
+
let podRunId: string | undefined;
|
|
6612
|
+
const status = await dispatchHarnessOnPod(devAskPodDispatchInput(opts, askAuthoredFile!, devAskSubstrate.pool!), {
|
|
6613
|
+
onOutput: (text) => {
|
|
6614
|
+
podRunId ??= harnessPodRunId(podOutput + text);
|
|
6615
|
+
podOutput = (podOutput + text).slice(-16_000);
|
|
6616
|
+
},
|
|
6617
|
+
});
|
|
6618
|
+
if (status !== 0) {
|
|
6619
|
+
const classified = classifyHarnessPodExit({ status }, podOutput, { ...(podRunId ? { runId: podRunId } : {}) });
|
|
6620
|
+
recordClassifiedHarnessPodExit(podRunId ?? harnessPodRunId(podOutput), classified.reason, status);
|
|
6621
|
+
for (const line of classified.lines) console.error(line);
|
|
6622
|
+
}
|
|
6503
6623
|
completionGuard.conclude();
|
|
6504
6624
|
process.exit(status);
|
|
6505
6625
|
}
|
|
@@ -6537,6 +6657,7 @@ const selfDevCmd = program
|
|
|
6537
6657
|
...(devOpts.worktree === true ? { worktree: true } : {}),
|
|
6538
6658
|
...(opts.json === true ? { json: true } : {}),
|
|
6539
6659
|
attach: devOpts.attach,
|
|
6660
|
+
...(devOpts.jailHome ? { jailHome: devOpts.jailHome } : {}),
|
|
6540
6661
|
}, {
|
|
6541
6662
|
exit: ((code: number): never => {
|
|
6542
6663
|
completionGuard.conclude();
|
|
@@ -7499,6 +7620,10 @@ sessionCmd
|
|
|
7499
7620
|
const s = ensureCliSession(cfg);
|
|
7500
7621
|
setActiveSessionId(s.id);
|
|
7501
7622
|
ui.info(`Created session ${s.id.slice(0, 8)} (marked active).`);
|
|
7623
|
+
try {
|
|
7624
|
+
const project = suggestProjectForFolder(process.cwd());
|
|
7625
|
+
if (project) ui.info(`Project suggestion: ${project.name} (${project.id})`);
|
|
7626
|
+
} catch { /* suggestions must not interrupt session creation */ }
|
|
7502
7627
|
});
|
|
7503
7628
|
|
|
7504
7629
|
sessionCmd
|
|
@@ -7929,7 +8054,7 @@ sessionCmd
|
|
|
7929
8054
|
});
|
|
7930
8055
|
|
|
7931
8056
|
async function runFirstSetupForCli(cfg: ReturnType<typeof getUserConfig>, announceFallback = false): Promise<boolean> {
|
|
7932
|
-
if (cfg.onboarding.webFirst
|
|
8057
|
+
if (cfg.onboarding.webFirst !== false) {
|
|
7933
8058
|
const { runWebFirstSetup } = await import('./onboarding/web-first.js');
|
|
7934
8059
|
if (await runWebFirstSetup({ config: cfg }) === 'link-shown') return false;
|
|
7935
8060
|
if (announceFallback) ui.info('No config yet — launching setup wizard first.');
|
|
@@ -7972,7 +8097,7 @@ program
|
|
|
7972
8097
|
if (opts.tools) announceChatToolsCompatibility();
|
|
7973
8098
|
const cfg = getUserConfig();
|
|
7974
8099
|
if (needsOnboarding(cfg)) {
|
|
7975
|
-
if (cfg.onboarding.webFirst
|
|
8100
|
+
if (cfg.onboarding.webFirst === false) ui.info('No config yet — launching setup wizard first.');
|
|
7976
8101
|
if (!await runFirstSetupForCli(cfg, true)) return;
|
|
7977
8102
|
}
|
|
7978
8103
|
const refreshed = reloadUserConfig();
|
|
@@ -8039,7 +8164,7 @@ program
|
|
|
8039
8164
|
}
|
|
8040
8165
|
const cfg = getUserConfig();
|
|
8041
8166
|
if (needsOnboarding(cfg)) {
|
|
8042
|
-
if (cfg.onboarding.webFirst
|
|
8167
|
+
if (cfg.onboarding.webFirst === false) ui.info('No config yet — launching setup wizard first.');
|
|
8043
8168
|
if (!await runFirstSetupForCli(cfg, true)) return;
|
|
8044
8169
|
}
|
|
8045
8170
|
const refreshed = reloadUserConfig();
|
|
@@ -9281,24 +9406,50 @@ const nexusRunCmd = nexusCmd
|
|
|
9281
9406
|
process.once('exit', () => releaseTestPort(resolvedPort, process.pid));
|
|
9282
9407
|
}
|
|
9283
9408
|
const { runNexus } = await import('./nexus/index.js');
|
|
9284
|
-
|
|
9285
|
-
|
|
9286
|
-
|
|
9287
|
-
|
|
9288
|
-
|
|
9289
|
-
|
|
9290
|
-
|
|
9291
|
-
|
|
9292
|
-
|
|
9293
|
-
|
|
9294
|
-
|
|
9295
|
-
|
|
9296
|
-
|
|
9297
|
-
|
|
9298
|
-
|
|
9299
|
-
|
|
9300
|
-
|
|
9301
|
-
|
|
9409
|
+
// Only isolated daemons force exit after SIGINT cleanup; production and
|
|
9410
|
+
// SIGTERM keep their existing service-manager lifecycle contracts.
|
|
9411
|
+
const isolatedDaemon = (await import('./instance/current.js')).resolveCurrentInstance().kind === 'test';
|
|
9412
|
+
let stoppedBySigint = false;
|
|
9413
|
+
let cleanupTimer: ReturnType<typeof setTimeout> | undefined;
|
|
9414
|
+
const onStop = () => {
|
|
9415
|
+
if (!isolatedDaemon) return;
|
|
9416
|
+
stoppedBySigint = true;
|
|
9417
|
+
cleanupTimer = setTimeout(() => {
|
|
9418
|
+
console.error('elanous nexus: SIGINT cleanup exceeded 8s; exiting');
|
|
9419
|
+
process.exit(1);
|
|
9420
|
+
}, 8_000);
|
|
9421
|
+
};
|
|
9422
|
+
if (isolatedDaemon) process.once('SIGINT', onStop);
|
|
9423
|
+
try {
|
|
9424
|
+
await runNexus({
|
|
9425
|
+
headless: true,
|
|
9426
|
+
tools: toolsKind ?? 'webterm',
|
|
9427
|
+
autoMountShare: !bgChild,
|
|
9428
|
+
// bg-launch child reads `--watch` from forwardArgs (set by
|
|
9429
|
+
// runPwaStart). External !TTY launches (launchd / Docker /
|
|
9430
|
+
// nohup) get watch only when the user explicitly didn't disable
|
|
9431
|
+
// it — service-manager production posture stays watch-off.
|
|
9432
|
+
...((bgChild ? opts.watch === true : watchOn) ? { pwaWatch: true } : {}),
|
|
9433
|
+
...(opts.mcp === false ? { mcpEnabled: false } : {}),
|
|
9434
|
+
...(opts.auth === false ? { noAuth: true } : {}),
|
|
9435
|
+
...(opts.force ? { force: true } : {}),
|
|
9436
|
+
...(opts.dispatch ? { dispatch: true } : {}),
|
|
9437
|
+
...(opts.toolCwd ? { toolCwd: opts.toolCwd } : {}),
|
|
9438
|
+
...(opts.historyDir ? { historyDir: opts.historyDir } : {}),
|
|
9439
|
+
...(resolvedHttpHost ? { httpHost: resolvedHttpHost } : {}),
|
|
9440
|
+
...(resolvedPort !== undefined ? { httpStartPort: resolvedPort } : {}),
|
|
9441
|
+
});
|
|
9442
|
+
} catch (error) {
|
|
9443
|
+
if (stoppedBySigint) {
|
|
9444
|
+
console.error(`elanous nexus: SIGINT cleanup failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
9445
|
+
process.exit(1);
|
|
9446
|
+
}
|
|
9447
|
+
throw error;
|
|
9448
|
+
} finally {
|
|
9449
|
+
process.removeListener('SIGINT', onStop);
|
|
9450
|
+
if (cleanupTimer) clearTimeout(cleanupTimer);
|
|
9451
|
+
}
|
|
9452
|
+
if (stoppedBySigint) process.exit(0);
|
|
9302
9453
|
return;
|
|
9303
9454
|
}
|
|
9304
9455
|
|
|
@@ -10739,18 +10890,24 @@ async function main(): Promise<void> {
|
|
|
10739
10890
|
program.error(`error: unknown command '${firstCommand}'`);
|
|
10740
10891
|
return;
|
|
10741
10892
|
}
|
|
10742
|
-
|
|
10893
|
+
const showAll = args[0] === '--help-all';
|
|
10894
|
+
const role = getUserConfig().cli?.helpRole ?? 'owner';
|
|
10895
|
+
const { shown, hidden } = filterCliRootHelp(program.commands, role, showAll);
|
|
10896
|
+
debug.log('cli.maturity', 'help-filtered', { role, shown, hidden });
|
|
10897
|
+
await program.parseAsync(['node', 'elanous', ...(showAll ? ['--help'] : args)]);
|
|
10743
10898
|
return;
|
|
10744
10899
|
}
|
|
10745
10900
|
|
|
10746
|
-
//
|
|
10747
|
-
|
|
10748
|
-
// TUI chrome. Subsequent launches skip straight to the dashboard.
|
|
10749
|
-
// (Bare `elanous` always lands on the dashboard now, so the wizard just
|
|
10750
|
-
// gates on config completeness — no entry-mode branch.)
|
|
10901
|
+
// Bare entry only requires an LLM; detailed setup stays behind `eln setup`.
|
|
10902
|
+
const firstRunStartedAt = Date.now();
|
|
10751
10903
|
const cfg = getUserConfig();
|
|
10752
|
-
if (
|
|
10753
|
-
if (
|
|
10904
|
+
if (needsFirstRun(cfg)) {
|
|
10905
|
+
if (cfg.onboarding.webFirst !== false) {
|
|
10906
|
+
const { runWebFirstSetup } = await import('./onboarding/web-first.js');
|
|
10907
|
+
if (await runWebFirstSetup({ config: cfg, startedAt: firstRunStartedAt }) === 'link-shown') return;
|
|
10908
|
+
}
|
|
10909
|
+
const { runFirstRun } = await import('./onboarding/first-run.js');
|
|
10910
|
+
if ((await runFirstRun({ config: cfg })).outcome !== 'ready') return;
|
|
10754
10911
|
}
|
|
10755
10912
|
|
|
10756
10913
|
// Active-provider banner so users know WHICH model/auth is about to
|