@chinhae/atw-cli 0.1.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/COPYRIGHT +14 -0
- package/LICENSE +77 -0
- package/README.md +122 -0
- package/bin/atw.js +3 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +299 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/commands/ablate.d.ts +14 -0
- package/dist/commands/ablate.d.ts.map +1 -0
- package/dist/commands/ablate.js +307 -0
- package/dist/commands/ablate.js.map +1 -0
- package/dist/commands/channel/adapters/claude.d.ts +53 -0
- package/dist/commands/channel/adapters/claude.d.ts.map +1 -0
- package/dist/commands/channel/adapters/claude.js +225 -0
- package/dist/commands/channel/adapters/claude.js.map +1 -0
- package/dist/commands/channel/adapters/codex.d.ts +93 -0
- package/dist/commands/channel/adapters/codex.d.ts.map +1 -0
- package/dist/commands/channel/adapters/codex.js +573 -0
- package/dist/commands/channel/adapters/codex.js.map +1 -0
- package/dist/commands/channel/adapters/index.d.ts +94 -0
- package/dist/commands/channel/adapters/index.d.ts.map +1 -0
- package/dist/commands/channel/adapters/index.js +116 -0
- package/dist/commands/channel/adapters/index.js.map +1 -0
- package/dist/commands/channel/adapters/types.d.ts +33 -0
- package/dist/commands/channel/adapters/types.d.ts.map +1 -0
- package/dist/commands/channel/adapters/types.js +2 -0
- package/dist/commands/channel/adapters/types.js.map +1 -0
- package/dist/commands/channel/agent-loader.d.ts +32 -0
- package/dist/commands/channel/agent-loader.d.ts.map +1 -0
- package/dist/commands/channel/agent-loader.js +158 -0
- package/dist/commands/channel/agent-loader.js.map +1 -0
- package/dist/commands/channel/context-loader.d.ts +26 -0
- package/dist/commands/channel/context-loader.d.ts.map +1 -0
- package/dist/commands/channel/context-loader.js +311 -0
- package/dist/commands/channel/context-loader.js.map +1 -0
- package/dist/commands/channel/context-trust.d.ts +31 -0
- package/dist/commands/channel/context-trust.d.ts.map +1 -0
- package/dist/commands/channel/context-trust.js +139 -0
- package/dist/commands/channel/context-trust.js.map +1 -0
- package/dist/commands/channel/context.d.ts +16 -0
- package/dist/commands/channel/context.d.ts.map +1 -0
- package/dist/commands/channel/context.js +83 -0
- package/dist/commands/channel/context.js.map +1 -0
- package/dist/commands/channel/create.d.ts +27 -0
- package/dist/commands/channel/create.d.ts.map +1 -0
- package/dist/commands/channel/create.js +39 -0
- package/dist/commands/channel/create.js.map +1 -0
- package/dist/commands/channel/dev-parse-trace.d.ts +14 -0
- package/dist/commands/channel/dev-parse-trace.d.ts.map +1 -0
- package/dist/commands/channel/dev-parse-trace.js +70 -0
- package/dist/commands/channel/dev-parse-trace.js.map +1 -0
- package/dist/commands/channel/guard.d.ts +150 -0
- package/dist/commands/channel/guard.d.ts.map +1 -0
- package/dist/commands/channel/guard.js +479 -0
- package/dist/commands/channel/guard.js.map +1 -0
- package/dist/commands/channel/index.d.ts +3 -0
- package/dist/commands/channel/index.d.ts.map +1 -0
- package/dist/commands/channel/index.js +535 -0
- package/dist/commands/channel/index.js.map +1 -0
- package/dist/commands/channel/interrupt.d.ts +10 -0
- package/dist/commands/channel/interrupt.d.ts.map +1 -0
- package/dist/commands/channel/interrupt.js +22 -0
- package/dist/commands/channel/interrupt.js.map +1 -0
- package/dist/commands/channel/kill.d.ts +7 -0
- package/dist/commands/channel/kill.d.ts.map +1 -0
- package/dist/commands/channel/kill.js +130 -0
- package/dist/commands/channel/kill.js.map +1 -0
- package/dist/commands/channel/list.d.ts +17 -0
- package/dist/commands/channel/list.d.ts.map +1 -0
- package/dist/commands/channel/list.js +233 -0
- package/dist/commands/channel/list.js.map +1 -0
- package/dist/commands/channel/messages.d.ts +15 -0
- package/dist/commands/channel/messages.d.ts.map +1 -0
- package/dist/commands/channel/messages.js +245 -0
- package/dist/commands/channel/messages.js.map +1 -0
- package/dist/commands/channel/rm.d.ts +27 -0
- package/dist/commands/channel/rm.d.ts.map +1 -0
- package/dist/commands/channel/rm.js +216 -0
- package/dist/commands/channel/rm.js.map +1 -0
- package/dist/commands/channel/run.d.ts +30 -0
- package/dist/commands/channel/run.d.ts.map +1 -0
- package/dist/commands/channel/run.js +130 -0
- package/dist/commands/channel/run.js.map +1 -0
- package/dist/commands/channel/send.d.ts +11 -0
- package/dist/commands/channel/send.d.ts.map +1 -0
- package/dist/commands/channel/send.js +24 -0
- package/dist/commands/channel/send.js.map +1 -0
- package/dist/commands/channel/spawn.d.ts +43 -0
- package/dist/commands/channel/spawn.d.ts.map +1 -0
- package/dist/commands/channel/spawn.js +247 -0
- package/dist/commands/channel/spawn.js.map +1 -0
- package/dist/commands/channel/store/events.d.ts +22 -0
- package/dist/commands/channel/store/events.d.ts.map +1 -0
- package/dist/commands/channel/store/events.js +43 -0
- package/dist/commands/channel/store/events.js.map +1 -0
- package/dist/commands/channel/store/filter.d.ts +3 -0
- package/dist/commands/channel/store/filter.d.ts.map +1 -0
- package/dist/commands/channel/store/filter.js +2 -0
- package/dist/commands/channel/store/filter.js.map +1 -0
- package/dist/commands/channel/store/lock.d.ts +23 -0
- package/dist/commands/channel/store/lock.d.ts.map +1 -0
- package/dist/commands/channel/store/lock.js +99 -0
- package/dist/commands/channel/store/lock.js.map +1 -0
- package/dist/commands/channel/store/paths.d.ts +77 -0
- package/dist/commands/channel/store/paths.d.ts.map +1 -0
- package/dist/commands/channel/store/paths.js +272 -0
- package/dist/commands/channel/store/paths.js.map +1 -0
- package/dist/commands/channel/store/schema.d.ts +27 -0
- package/dist/commands/channel/store/schema.d.ts.map +1 -0
- package/dist/commands/channel/store/schema.js +34 -0
- package/dist/commands/channel/store/schema.js.map +1 -0
- package/dist/commands/channel/store/thread-state.d.ts +5 -0
- package/dist/commands/channel/store/thread-state.d.ts.map +1 -0
- package/dist/commands/channel/store/thread-state.js +16 -0
- package/dist/commands/channel/store/thread-state.js.map +1 -0
- package/dist/commands/channel/store/watch.d.ts +19 -0
- package/dist/commands/channel/store/watch.d.ts.map +1 -0
- package/dist/commands/channel/store/watch.js +153 -0
- package/dist/commands/channel/store/watch.js.map +1 -0
- package/dist/commands/channel/supervisor/idle.d.ts +45 -0
- package/dist/commands/channel/supervisor/idle.d.ts.map +1 -0
- package/dist/commands/channel/supervisor/idle.js +70 -0
- package/dist/commands/channel/supervisor/idle.js.map +1 -0
- package/dist/commands/channel/supervisor/inbox.d.ts +30 -0
- package/dist/commands/channel/supervisor/inbox.d.ts.map +1 -0
- package/dist/commands/channel/supervisor/inbox.js +160 -0
- package/dist/commands/channel/supervisor/inbox.js.map +1 -0
- package/dist/commands/channel/supervisor/shutdown.d.ts +68 -0
- package/dist/commands/channel/supervisor/shutdown.d.ts.map +1 -0
- package/dist/commands/channel/supervisor/shutdown.js +146 -0
- package/dist/commands/channel/supervisor/shutdown.js.map +1 -0
- package/dist/commands/channel/supervisor/stdout.d.ts +71 -0
- package/dist/commands/channel/supervisor/stdout.d.ts.map +1 -0
- package/dist/commands/channel/supervisor/stdout.js +229 -0
- package/dist/commands/channel/supervisor/stdout.js.map +1 -0
- package/dist/commands/channel/supervisor/turns.d.ts +31 -0
- package/dist/commands/channel/supervisor/turns.d.ts.map +1 -0
- package/dist/commands/channel/supervisor/turns.js +45 -0
- package/dist/commands/channel/supervisor/turns.js.map +1 -0
- package/dist/commands/channel/supervisor/warning.d.ts +48 -0
- package/dist/commands/channel/supervisor/warning.d.ts.map +1 -0
- package/dist/commands/channel/supervisor/warning.js +77 -0
- package/dist/commands/channel/supervisor/warning.js.map +1 -0
- package/dist/commands/channel/supervisor.d.ts +91 -0
- package/dist/commands/channel/supervisor.d.ts.map +1 -0
- package/dist/commands/channel/supervisor.js +463 -0
- package/dist/commands/channel/supervisor.js.map +1 -0
- package/dist/commands/channel/text-body.d.ts +13 -0
- package/dist/commands/channel/text-body.d.ts.map +1 -0
- package/dist/commands/channel/text-body.js +47 -0
- package/dist/commands/channel/text-body.js.map +1 -0
- package/dist/commands/channel/threads.d.ts +39 -0
- package/dist/commands/channel/threads.d.ts.map +1 -0
- package/dist/commands/channel/threads.js +106 -0
- package/dist/commands/channel/threads.js.map +1 -0
- package/dist/commands/channel/title.d.ts +12 -0
- package/dist/commands/channel/title.d.ts.map +1 -0
- package/dist/commands/channel/title.js +24 -0
- package/dist/commands/channel/title.js.map +1 -0
- package/dist/commands/channel/wait.d.ts +17 -0
- package/dist/commands/channel/wait.d.ts.map +1 -0
- package/dist/commands/channel/wait.js +75 -0
- package/dist/commands/channel/wait.js.map +1 -0
- package/dist/commands/init.d.ts +71 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +1612 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/mem.d.ts +30 -0
- package/dist/commands/mem.d.ts.map +1 -0
- package/dist/commands/mem.js +423 -0
- package/dist/commands/mem.js.map +1 -0
- package/dist/commands/uninstall.d.ts +36 -0
- package/dist/commands/uninstall.d.ts.map +1 -0
- package/dist/commands/uninstall.js +205 -0
- package/dist/commands/uninstall.js.map +1 -0
- package/dist/commands/update.d.ts +133 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +2255 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/commands/upgrade.d.ts +28 -0
- package/dist/commands/upgrade.d.ts.map +1 -0
- package/dist/commands/upgrade.js +84 -0
- package/dist/commands/upgrade.js.map +1 -0
- package/dist/commands/workflow.d.ts +35 -0
- package/dist/commands/workflow.d.ts.map +1 -0
- package/dist/commands/workflow.js +232 -0
- package/dist/commands/workflow.js.map +1 -0
- package/dist/configurators/antigravity.d.ts +7 -0
- package/dist/configurators/antigravity.d.ts.map +1 -0
- package/dist/configurators/antigravity.js +11 -0
- package/dist/configurators/antigravity.js.map +1 -0
- package/dist/configurators/claude.d.ts +23 -0
- package/dist/configurators/claude.d.ts.map +1 -0
- package/dist/configurators/claude.js +123 -0
- package/dist/configurators/claude.js.map +1 -0
- package/dist/configurators/codebuddy.d.ts +10 -0
- package/dist/configurators/codebuddy.d.ts.map +1 -0
- package/dist/configurators/codebuddy.js +24 -0
- package/dist/configurators/codebuddy.js.map +1 -0
- package/dist/configurators/codex.d.ts +57 -0
- package/dist/configurators/codex.d.ts.map +1 -0
- package/dist/configurators/codex.js +170 -0
- package/dist/configurators/codex.js.map +1 -0
- package/dist/configurators/copilot.d.ts +18 -0
- package/dist/configurators/copilot.d.ts.map +1 -0
- package/dist/configurators/copilot.js +50 -0
- package/dist/configurators/copilot.js.map +1 -0
- package/dist/configurators/cursor.d.ts +10 -0
- package/dist/configurators/cursor.d.ts.map +1 -0
- package/dist/configurators/cursor.js +23 -0
- package/dist/configurators/cursor.js.map +1 -0
- package/dist/configurators/devin.d.ts +8 -0
- package/dist/configurators/devin.d.ts.map +1 -0
- package/dist/configurators/devin.js +12 -0
- package/dist/configurators/devin.js.map +1 -0
- package/dist/configurators/droid.d.ts +10 -0
- package/dist/configurators/droid.d.ts.map +1 -0
- package/dist/configurators/droid.js +24 -0
- package/dist/configurators/droid.js.map +1 -0
- package/dist/configurators/dsh.d.ts +29 -0
- package/dist/configurators/dsh.d.ts.map +1 -0
- package/dist/configurators/dsh.js +64 -0
- package/dist/configurators/dsh.js.map +1 -0
- package/dist/configurators/gemini.d.ts +19 -0
- package/dist/configurators/gemini.d.ts.map +1 -0
- package/dist/configurators/gemini.js +40 -0
- package/dist/configurators/gemini.js.map +1 -0
- package/dist/configurators/grok.d.ts +17 -0
- package/dist/configurators/grok.d.ts.map +1 -0
- package/dist/configurators/grok.js +38 -0
- package/dist/configurators/grok.js.map +1 -0
- package/dist/configurators/index.d.ts +68 -0
- package/dist/configurators/index.d.ts.map +1 -0
- package/dist/configurators/index.js +191 -0
- package/dist/configurators/index.js.map +1 -0
- package/dist/configurators/kilo.d.ts +7 -0
- package/dist/configurators/kilo.d.ts.map +1 -0
- package/dist/configurators/kilo.js +11 -0
- package/dist/configurators/kilo.js.map +1 -0
- package/dist/configurators/kimi.d.ts +26 -0
- package/dist/configurators/kimi.d.ts.map +1 -0
- package/dist/configurators/kimi.js +74 -0
- package/dist/configurators/kimi.js.map +1 -0
- package/dist/configurators/kiro.d.ts +11 -0
- package/dist/configurators/kiro.d.ts.map +1 -0
- package/dist/configurators/kiro.js +30 -0
- package/dist/configurators/kiro.js.map +1 -0
- package/dist/configurators/omp.d.ts +6 -0
- package/dist/configurators/omp.d.ts.map +1 -0
- package/dist/configurators/omp.js +28 -0
- package/dist/configurators/omp.js.map +1 -0
- package/dist/configurators/opencode.d.ts +5 -0
- package/dist/configurators/opencode.d.ts.map +1 -0
- package/dist/configurators/opencode.js +80 -0
- package/dist/configurators/opencode.js.map +1 -0
- package/dist/configurators/pi.d.ts +5 -0
- package/dist/configurators/pi.d.ts.map +1 -0
- package/dist/configurators/pi.js +39 -0
- package/dist/configurators/pi.js.map +1 -0
- package/dist/configurators/qoder.d.ts +12 -0
- package/dist/configurators/qoder.d.ts.map +1 -0
- package/dist/configurators/qoder.js +30 -0
- package/dist/configurators/qoder.js.map +1 -0
- package/dist/configurators/reasonix.d.ts +17 -0
- package/dist/configurators/reasonix.d.ts.map +1 -0
- package/dist/configurators/reasonix.js +37 -0
- package/dist/configurators/reasonix.js.map +1 -0
- package/dist/configurators/shared.d.ts +196 -0
- package/dist/configurators/shared.d.ts.map +1 -0
- package/dist/configurators/shared.js +600 -0
- package/dist/configurators/shared.js.map +1 -0
- package/dist/configurators/snow.d.ts +25 -0
- package/dist/configurators/snow.d.ts.map +1 -0
- package/dist/configurators/snow.js +69 -0
- package/dist/configurators/snow.js.map +1 -0
- package/dist/configurators/trae.d.ts +16 -0
- package/dist/configurators/trae.d.ts.map +1 -0
- package/dist/configurators/trae.js +34 -0
- package/dist/configurators/trae.js.map +1 -0
- package/dist/configurators/workflow.d.ts +51 -0
- package/dist/configurators/workflow.d.ts.map +1 -0
- package/dist/configurators/workflow.js +210 -0
- package/dist/configurators/workflow.js.map +1 -0
- package/dist/configurators/zcode.d.ts +19 -0
- package/dist/configurators/zcode.d.ts.map +1 -0
- package/dist/configurators/zcode.js +51 -0
- package/dist/configurators/zcode.js.map +1 -0
- package/dist/constants/paths.d.ts +74 -0
- package/dist/constants/paths.d.ts.map +1 -0
- package/dist/constants/paths.js +83 -0
- package/dist/constants/paths.js.map +1 -0
- package/dist/constants/version.d.ts +9 -0
- package/dist/constants/version.d.ts.map +1 -0
- package/dist/constants/version.js +15 -0
- package/dist/constants/version.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/migrations/index.d.ts +65 -0
- package/dist/migrations/index.d.ts.map +1 -0
- package/dist/migrations/index.js +202 -0
- package/dist/migrations/index.js.map +1 -0
- package/dist/templates/atw/agents/implement-agent.md +69 -0
- package/dist/templates/atw/agents/review.md +68 -0
- package/dist/templates/atw/config.yaml +158 -0
- package/dist/templates/atw/gitattributes.txt +9 -0
- package/dist/templates/atw/gitignore.txt +32 -0
- package/dist/templates/atw/index.d.ts +70 -0
- package/dist/templates/atw/index.d.ts.map +1 -0
- package/dist/templates/atw/index.js +137 -0
- package/dist/templates/atw/index.js.map +1 -0
- package/dist/templates/atw/scripts/__init__.py +5 -0
- package/dist/templates/atw/scripts/add_session.py +1545 -0
- package/dist/templates/atw/scripts/common/__init__.py +94 -0
- package/dist/templates/atw/scripts/common/active_task.py +857 -0
- package/dist/templates/atw/scripts/common/atw_config.py +239 -0
- package/dist/templates/atw/scripts/common/cli_adapter.py +949 -0
- package/dist/templates/atw/scripts/common/config.py +482 -0
- package/dist/templates/atw/scripts/common/developer.py +192 -0
- package/dist/templates/atw/scripts/common/git.py +203 -0
- package/dist/templates/atw/scripts/common/git_context.py +106 -0
- package/dist/templates/atw/scripts/common/io.py +160 -0
- package/dist/templates/atw/scripts/common/log.py +45 -0
- package/dist/templates/atw/scripts/common/packages_context.py +238 -0
- package/dist/templates/atw/scripts/common/paths.py +543 -0
- package/dist/templates/atw/scripts/common/safe_commit.py +322 -0
- package/dist/templates/atw/scripts/common/session_context.py +892 -0
- package/dist/templates/atw/scripts/common/task_context.py +470 -0
- package/dist/templates/atw/scripts/common/task_queue.py +188 -0
- package/dist/templates/atw/scripts/common/task_store.py +1940 -0
- package/dist/templates/atw/scripts/common/task_utils.py +498 -0
- package/dist/templates/atw/scripts/common/tasks.py +122 -0
- package/dist/templates/atw/scripts/common/types.py +110 -0
- package/dist/templates/atw/scripts/common/workflow_phase.py +242 -0
- package/dist/templates/atw/scripts/get_context.py +16 -0
- package/dist/templates/atw/scripts/get_developer.py +26 -0
- package/dist/templates/atw/scripts/github_sync.py +391 -0
- package/dist/templates/atw/scripts/hooks/linear_sync.py +243 -0
- package/dist/templates/atw/scripts/init_developer.py +51 -0
- package/dist/templates/atw/scripts/task.py +833 -0
- package/dist/templates/atw/scripts/tickets.py +495 -0
- package/dist/templates/atw/tasks/.gitkeep +0 -0
- package/dist/templates/atw/workflow.md +754 -0
- package/dist/templates/claude/agents/atw-implement-agent.md +107 -0
- package/dist/templates/claude/agents/atw-review.md +113 -0
- package/dist/templates/claude/hooks/statusline.py +332 -0
- package/dist/templates/claude/index.d.ts +31 -0
- package/dist/templates/claude/index.d.ts.map +1 -0
- package/dist/templates/claude/index.js +57 -0
- package/dist/templates/claude/index.js.map +1 -0
- package/dist/templates/claude/settings.json +73 -0
- package/dist/templates/codebuddy/agents/atw-implement-agent.md +107 -0
- package/dist/templates/codebuddy/agents/atw-review.md +113 -0
- package/dist/templates/codebuddy/index.d.ts +15 -0
- package/dist/templates/codebuddy/index.d.ts.map +1 -0
- package/dist/templates/codebuddy/index.js +15 -0
- package/dist/templates/codebuddy/index.js.map +1 -0
- package/dist/templates/codebuddy/settings.json +69 -0
- package/dist/templates/codex/agents/atw-implement-agent.toml +37 -0
- package/dist/templates/codex/agents/atw-review.toml +56 -0
- package/dist/templates/codex/config.toml +39 -0
- package/dist/templates/codex/hooks/session-start.py +514 -0
- package/dist/templates/codex/hooks.json +27 -0
- package/dist/templates/codex/index.d.ts +35 -0
- package/dist/templates/codex/index.d.ts.map +1 -0
- package/dist/templates/codex/index.js +67 -0
- package/dist/templates/codex/index.js.map +1 -0
- package/dist/templates/common/bundled-skills/atw-askme/SKILL.md +7 -0
- package/dist/templates/common/bundled-skills/atw-askme/agents/openai.yaml +5 -0
- package/dist/templates/common/bundled-skills/atw-askme-with-docs/SKILL.md +7 -0
- package/dist/templates/common/bundled-skills/atw-askme-with-docs/agents/openai.yaml +5 -0
- package/dist/templates/common/bundled-skills/atw-channel/SKILL.md +67 -0
- package/dist/templates/common/bundled-skills/atw-channel/references/command-reference.md +480 -0
- package/dist/templates/common/bundled-skills/atw-channel/references/forum.md +233 -0
- package/dist/templates/common/bundled-skills/atw-channel/references/progress-debugging.md +226 -0
- package/dist/templates/common/bundled-skills/atw-channel/references/workers.md +274 -0
- package/dist/templates/common/bundled-skills/atw-channel/references/workflows.md +125 -0
- package/dist/templates/common/bundled-skills/atw-code-review/SKILL.md +113 -0
- package/dist/templates/common/bundled-skills/atw-code-review/agents/openai.yaml +3 -0
- package/dist/templates/common/bundled-skills/atw-codebase-design/DEEPENING.md +37 -0
- package/dist/templates/common/bundled-skills/atw-codebase-design/DESIGN-IT-TWICE.md +44 -0
- package/dist/templates/common/bundled-skills/atw-codebase-design/SKILL.md +114 -0
- package/dist/templates/common/bundled-skills/atw-codebase-design/agents/openai.yaml +3 -0
- package/dist/templates/common/bundled-skills/atw-diagnosing-bugs/SKILL.md +138 -0
- package/dist/templates/common/bundled-skills/atw-diagnosing-bugs/agents/openai.yaml +3 -0
- package/dist/templates/common/bundled-skills/atw-diagnosing-bugs/scripts/hitl-loop.template.sh +44 -0
- package/dist/templates/common/bundled-skills/atw-domain-modeling/ADR-FORMAT.md +47 -0
- package/dist/templates/common/bundled-skills/atw-domain-modeling/CONTEXT-FORMAT.md +60 -0
- package/dist/templates/common/bundled-skills/atw-domain-modeling/SKILL.md +74 -0
- package/dist/templates/common/bundled-skills/atw-domain-modeling/agents/openai.yaml +3 -0
- package/dist/templates/common/bundled-skills/atw-handoff/SKILL.md +16 -0
- package/dist/templates/common/bundled-skills/atw-handoff/agents/openai.yaml +5 -0
- package/dist/templates/common/bundled-skills/atw-implement/SKILL.md +21 -0
- package/dist/templates/common/bundled-skills/atw-implement/agents/openai.yaml +5 -0
- package/dist/templates/common/bundled-skills/atw-improve-codebase-architecture/HTML-REPORT.md +123 -0
- package/dist/templates/common/bundled-skills/atw-improve-codebase-architecture/SKILL.md +71 -0
- package/dist/templates/common/bundled-skills/atw-improve-codebase-architecture/agents/openai.yaml +5 -0
- package/dist/templates/common/bundled-skills/atw-init-repo/SKILL.md +130 -0
- package/dist/templates/common/bundled-skills/atw-init-repo/references/domain.md +51 -0
- package/dist/templates/common/bundled-skills/atw-init-repo/references/issue-tracker-atw-local.md +133 -0
- package/dist/templates/common/bundled-skills/atw-init-repo/references/issue-tracker-atw.md +109 -0
- package/dist/templates/common/bundled-skills/atw-init-repo/references/issue-tracker-github.md +45 -0
- package/dist/templates/common/bundled-skills/atw-init-repo/references/issue-tracker-gitlab.md +46 -0
- package/dist/templates/common/bundled-skills/atw-init-repo/references/issue-tracker-local.md +30 -0
- package/dist/templates/common/bundled-skills/atw-init-repo/references/triage-labels.md +15 -0
- package/dist/templates/common/bundled-skills/atw-interview/SKILL.md +22 -0
- package/dist/templates/common/bundled-skills/atw-interview/agents/openai.yaml +3 -0
- package/dist/templates/common/bundled-skills/atw-map/SKILL.md +128 -0
- package/dist/templates/common/bundled-skills/atw-map/agents/openai.yaml +5 -0
- package/dist/templates/common/bundled-skills/atw-merge/SKILL.md +14 -0
- package/dist/templates/common/bundled-skills/atw-merge/agents/openai.yaml +3 -0
- package/dist/templates/common/bundled-skills/atw-meta/SKILL.md +85 -0
- package/dist/templates/common/bundled-skills/atw-meta/references/customize-local/add-project-local-conventions.md +83 -0
- package/dist/templates/common/bundled-skills/atw-meta/references/customize-local/change-agents.md +55 -0
- package/dist/templates/common/bundled-skills/atw-meta/references/customize-local/change-context-loading.md +80 -0
- package/dist/templates/common/bundled-skills/atw-meta/references/customize-local/change-hooks.md +57 -0
- package/dist/templates/common/bundled-skills/atw-meta/references/customize-local/change-skills-or-commands.md +123 -0
- package/dist/templates/common/bundled-skills/atw-meta/references/customize-local/change-spec-structure.md +83 -0
- package/dist/templates/common/bundled-skills/atw-meta/references/customize-local/change-task-lifecycle.md +91 -0
- package/dist/templates/common/bundled-skills/atw-meta/references/customize-local/change-workflow.md +59 -0
- package/dist/templates/common/bundled-skills/atw-meta/references/customize-local/overview.md +55 -0
- package/dist/templates/common/bundled-skills/atw-meta/references/local-architecture/bundled-skills.md +159 -0
- package/dist/templates/common/bundled-skills/atw-meta/references/local-architecture/context-injection.md +68 -0
- package/dist/templates/common/bundled-skills/atw-meta/references/local-architecture/generated-files.md +80 -0
- package/dist/templates/common/bundled-skills/atw-meta/references/local-architecture/multi-agent-channel.md +69 -0
- package/dist/templates/common/bundled-skills/atw-meta/references/local-architecture/overview.md +51 -0
- package/dist/templates/common/bundled-skills/atw-meta/references/local-architecture/spec-system.md +102 -0
- package/dist/templates/common/bundled-skills/atw-meta/references/local-architecture/task-system.md +126 -0
- package/dist/templates/common/bundled-skills/atw-meta/references/local-architecture/workflow.md +79 -0
- package/dist/templates/common/bundled-skills/atw-meta/references/local-architecture/workspace-memory.md +71 -0
- package/dist/templates/common/bundled-skills/atw-meta/references/platform-files/agents.md +80 -0
- package/dist/templates/common/bundled-skills/atw-meta/references/platform-files/hooks-and-settings.md +72 -0
- package/dist/templates/common/bundled-skills/atw-meta/references/platform-files/overview.md +59 -0
- package/dist/templates/common/bundled-skills/atw-meta/references/platform-files/platform-map.md +112 -0
- package/dist/templates/common/bundled-skills/atw-meta/references/platform-files/skills-and-commands.md +86 -0
- package/dist/templates/common/bundled-skills/atw-prototype/LOGIC.md +67 -0
- package/dist/templates/common/bundled-skills/atw-prototype/SKILL.md +26 -0
- package/dist/templates/common/bundled-skills/atw-prototype/UI.md +112 -0
- package/dist/templates/common/bundled-skills/atw-prototype/agents/openai.yaml +3 -0
- package/dist/templates/common/bundled-skills/atw-research/SKILL.md +14 -0
- package/dist/templates/common/bundled-skills/atw-research/agents/openai.yaml +3 -0
- package/dist/templates/common/bundled-skills/atw-session-insight/SKILL.md +81 -0
- package/dist/templates/common/bundled-skills/atw-session-insight/references/cli-quick-reference.md +65 -0
- package/dist/templates/common/bundled-skills/atw-session-insight/references/triggering-patterns.md +93 -0
- package/dist/templates/common/bundled-skills/atw-spec/SKILL.md +75 -0
- package/dist/templates/common/bundled-skills/atw-spec/agents/openai.yaml +5 -0
- package/dist/templates/common/bundled-skills/atw-spec-bootstrap/SKILL.md +41 -0
- package/dist/templates/common/bundled-skills/atw-spec-bootstrap/references/mcp-setup.md +90 -0
- package/dist/templates/common/bundled-skills/atw-spec-bootstrap/references/repository-analysis.md +59 -0
- package/dist/templates/common/bundled-skills/atw-spec-bootstrap/references/spec-task-planning.md +61 -0
- package/dist/templates/common/bundled-skills/atw-spec-bootstrap/references/spec-writing.md +70 -0
- package/dist/templates/common/bundled-skills/atw-tdd/SKILL.md +38 -0
- package/dist/templates/common/bundled-skills/atw-tdd/agents/openai.yaml +3 -0
- package/dist/templates/common/bundled-skills/atw-tdd/mocking.md +59 -0
- package/dist/templates/common/bundled-skills/atw-tdd/tests.md +77 -0
- package/dist/templates/common/bundled-skills/atw-tickets/SKILL.md +105 -0
- package/dist/templates/common/bundled-skills/atw-tickets/agents/openai.yaml +5 -0
- package/dist/templates/common/bundled-skills/atw-triage/AGENT-BRIEF.md +207 -0
- package/dist/templates/common/bundled-skills/atw-triage/OUT-OF-SCOPE.md +105 -0
- package/dist/templates/common/bundled-skills/atw-triage/SKILL.md +112 -0
- package/dist/templates/common/bundled-skills/atw-triage/agents/openai.yaml +5 -0
- package/dist/templates/common/commands/continue.md +55 -0
- package/dist/templates/common/commands/finish-work.md +69 -0
- package/dist/templates/common/commands/start.md +68 -0
- package/dist/templates/common/index.d.ts +48 -0
- package/dist/templates/common/index.d.ts.map +1 -0
- package/dist/templates/common/index.js +104 -0
- package/dist/templates/common/index.js.map +1 -0
- package/dist/templates/common/skills/before-dev.md +44 -0
- package/dist/templates/common/skills/brainstorm.md +194 -0
- package/dist/templates/common/skills/update-spec.md +351 -0
- package/dist/templates/copilot/copilot-instructions.md +11 -0
- package/dist/templates/copilot/hooks/session-start.py +510 -0
- package/dist/templates/copilot/hooks.json +19 -0
- package/dist/templates/copilot/index.d.ts +23 -0
- package/dist/templates/copilot/index.d.ts.map +1 -0
- package/dist/templates/copilot/index.js +48 -0
- package/dist/templates/copilot/index.js.map +1 -0
- package/dist/templates/cursor/agents/atw-implement-agent.md +106 -0
- package/dist/templates/cursor/agents/atw-review.md +112 -0
- package/dist/templates/cursor/hooks.json +24 -0
- package/dist/templates/cursor/index.d.ts +13 -0
- package/dist/templates/cursor/index.d.ts.map +1 -0
- package/dist/templates/cursor/index.js +13 -0
- package/dist/templates/cursor/index.js.map +1 -0
- package/dist/templates/droid/droids/atw-implement-agent.md +99 -0
- package/dist/templates/droid/droids/atw-review.md +105 -0
- package/dist/templates/droid/index.d.ts +15 -0
- package/dist/templates/droid/index.d.ts.map +1 -0
- package/dist/templates/droid/index.js +15 -0
- package/dist/templates/droid/index.js.map +1 -0
- package/dist/templates/droid/settings.json +69 -0
- package/dist/templates/dsh/DSH.md +56 -0
- package/dist/templates/dsh/index.d.ts +21 -0
- package/dist/templates/dsh/index.d.ts.map +1 -0
- package/dist/templates/dsh/index.js +25 -0
- package/dist/templates/dsh/index.js.map +1 -0
- package/dist/templates/extract.d.ts +40 -0
- package/dist/templates/extract.d.ts.map +1 -0
- package/dist/templates/extract.js +106 -0
- package/dist/templates/extract.js.map +1 -0
- package/dist/templates/gemini/agents/atw-implement-agent.md +99 -0
- package/dist/templates/gemini/agents/atw-review.md +105 -0
- package/dist/templates/gemini/index.d.ts +13 -0
- package/dist/templates/gemini/index.d.ts.map +1 -0
- package/dist/templates/gemini/index.js +13 -0
- package/dist/templates/gemini/index.js.map +1 -0
- package/dist/templates/gemini/settings.json +40 -0
- package/dist/templates/grok/agents/atw-implement-agent.md +115 -0
- package/dist/templates/grok/agents/atw-review.md +105 -0
- package/dist/templates/grok/index.d.ts +15 -0
- package/dist/templates/grok/index.d.ts.map +1 -0
- package/dist/templates/grok/index.js +18 -0
- package/dist/templates/grok/index.js.map +1 -0
- package/dist/templates/kimi/agents/atw-implement-agent.md +114 -0
- package/dist/templates/kimi/agents/atw-review.md +103 -0
- package/dist/templates/kimi/index.d.ts +20 -0
- package/dist/templates/kimi/index.d.ts.map +1 -0
- package/dist/templates/kimi/index.js +23 -0
- package/dist/templates/kimi/index.js.map +1 -0
- package/dist/templates/kiro/agents/atw-implement-agent.json +26 -0
- package/dist/templates/kiro/agents/atw-review.json +26 -0
- package/dist/templates/kiro/agents/atw.json +34 -0
- package/dist/templates/kiro/hooks/atw-workflow-state.kiro.hook +14 -0
- package/dist/templates/kiro/index.d.ts +32 -0
- package/dist/templates/kiro/index.d.ts.map +1 -0
- package/dist/templates/kiro/index.js +28 -0
- package/dist/templates/kiro/index.js.map +1 -0
- package/dist/templates/markdown/agents.md +21 -0
- package/dist/templates/markdown/gitignore.txt +15 -0
- package/dist/templates/markdown/index.d.ts +27 -0
- package/dist/templates/markdown/index.d.ts.map +1 -0
- package/dist/templates/markdown/index.js +52 -0
- package/dist/templates/markdown/index.js.map +1 -0
- package/dist/templates/markdown/spec/backend/database-guidelines.md.txt +51 -0
- package/dist/templates/markdown/spec/backend/directory-structure.md.txt +54 -0
- package/dist/templates/markdown/spec/backend/error-handling.md.txt +51 -0
- package/dist/templates/markdown/spec/backend/index.md.txt +38 -0
- package/dist/templates/markdown/spec/backend/logging-guidelines.md.txt +51 -0
- package/dist/templates/markdown/spec/backend/quality-guidelines.md.txt +51 -0
- package/dist/templates/markdown/spec/frontend/component-guidelines.md.txt +59 -0
- package/dist/templates/markdown/spec/frontend/directory-structure.md.txt +54 -0
- package/dist/templates/markdown/spec/frontend/hook-guidelines.md.txt +51 -0
- package/dist/templates/markdown/spec/frontend/index.md.txt +39 -0
- package/dist/templates/markdown/spec/frontend/quality-guidelines.md.txt +51 -0
- package/dist/templates/markdown/spec/frontend/state-management.md.txt +51 -0
- package/dist/templates/markdown/spec/frontend/type-safety.md.txt +51 -0
- package/dist/templates/markdown/spec/guides/code-reuse-thinking-guide.md.txt +223 -0
- package/dist/templates/markdown/spec/guides/cross-layer-thinking-guide.md.txt +290 -0
- package/dist/templates/markdown/spec/guides/cross-platform-thinking-guide.md.txt +634 -0
- package/dist/templates/markdown/spec/guides/index.md.txt +97 -0
- package/dist/templates/markdown/workspace-index.md +125 -0
- package/dist/templates/markdown/worktree.yaml.txt +58 -0
- package/dist/templates/omp/agents/atw-implement-agent.md +45 -0
- package/dist/templates/omp/agents/atw-review.md +41 -0
- package/dist/templates/omp/extensions/atw/index.ts.txt +1109 -0
- package/dist/templates/omp/index.d.ts +4 -0
- package/dist/templates/omp/index.d.ts.map +1 -0
- package/dist/templates/omp/index.js +9 -0
- package/dist/templates/omp/index.js.map +1 -0
- package/dist/templates/opencode/agents/atw-implement-agent.md +115 -0
- package/dist/templates/opencode/agents/atw-review.md +120 -0
- package/dist/templates/opencode/lib/atw-context.js +637 -0
- package/dist/templates/opencode/lib/context-visibility.js +148 -0
- package/dist/templates/opencode/lib/session-utils.js +474 -0
- package/dist/templates/opencode/package.json +6 -0
- package/dist/templates/opencode/plugins/inject-subagent-context.js +390 -0
- package/dist/templates/opencode/plugins/inject-workflow-state.js +240 -0
- package/dist/templates/opencode/plugins/session-start.js +65 -0
- package/dist/templates/pi/agents/atw-implement-agent.md +42 -0
- package/dist/templates/pi/agents/atw-review.md +37 -0
- package/dist/templates/pi/extensions/atw/index.ts.txt +2014 -0
- package/dist/templates/pi/index.d.ts +5 -0
- package/dist/templates/pi/index.d.ts.map +1 -0
- package/dist/templates/pi/index.js +12 -0
- package/dist/templates/pi/index.js.map +1 -0
- package/dist/templates/pi/settings.json +9 -0
- package/dist/templates/qoder/agents/atw-implement-agent.md +100 -0
- package/dist/templates/qoder/agents/atw-review.md +106 -0
- package/dist/templates/qoder/index.d.ts +15 -0
- package/dist/templates/qoder/index.d.ts.map +1 -0
- package/dist/templates/qoder/index.js +15 -0
- package/dist/templates/qoder/index.js.map +1 -0
- package/dist/templates/qoder/settings.json +59 -0
- package/dist/templates/reasonix/agents/atw-implement-agent.md +41 -0
- package/dist/templates/reasonix/agents/atw-review.md +36 -0
- package/dist/templates/reasonix/index.d.ts +13 -0
- package/dist/templates/reasonix/index.d.ts.map +1 -0
- package/dist/templates/reasonix/index.js +16 -0
- package/dist/templates/reasonix/index.js.map +1 -0
- package/dist/templates/shared-hooks/index.d.ts +77 -0
- package/dist/templates/shared-hooks/index.d.ts.map +1 -0
- package/dist/templates/shared-hooks/index.js +140 -0
- package/dist/templates/shared-hooks/index.js.map +1 -0
- package/dist/templates/shared-hooks/inject-shell-session-context.py +292 -0
- package/dist/templates/shared-hooks/inject-subagent-context.py +1178 -0
- package/dist/templates/shared-hooks/inject-workflow-state.py +488 -0
- package/dist/templates/shared-hooks/session-start.py +889 -0
- package/dist/templates/snow/SNOW.md +86 -0
- package/dist/templates/snow/agents/atw-implement-agent.md +152 -0
- package/dist/templates/snow/agents/atw-review.md +135 -0
- package/dist/templates/snow/hooks/beforeSubAgentStart.json +15 -0
- package/dist/templates/snow/hooks/onSessionStart.json +15 -0
- package/dist/templates/snow/hooks/onUserMessage.json +15 -0
- package/dist/templates/snow/hooks/write-atw-context.py +637 -0
- package/dist/templates/snow/index.d.ts +25 -0
- package/dist/templates/snow/index.d.ts.map +1 -0
- package/dist/templates/snow/index.js +35 -0
- package/dist/templates/snow/index.js.map +1 -0
- package/dist/templates/template-utils.d.ts +26 -0
- package/dist/templates/template-utils.d.ts.map +1 -0
- package/dist/templates/template-utils.js +64 -0
- package/dist/templates/template-utils.js.map +1 -0
- package/dist/templates/trae/agents/atw-implement-agent.md +100 -0
- package/dist/templates/trae/agents/atw-review.md +106 -0
- package/dist/templates/trae/hooks.json +39 -0
- package/dist/templates/trae/index.d.ts +15 -0
- package/dist/templates/trae/index.d.ts.map +1 -0
- package/dist/templates/trae/index.js +15 -0
- package/dist/templates/trae/index.js.map +1 -0
- package/dist/templates/zcode/agents/atw-implement-agent.md +108 -0
- package/dist/templates/zcode/agents/atw-review.md +109 -0
- package/dist/templates/zcode/config.json +52 -0
- package/dist/templates/zcode/index.d.ts +22 -0
- package/dist/templates/zcode/index.d.ts.map +1 -0
- package/dist/templates/zcode/index.js +26 -0
- package/dist/templates/zcode/index.js.map +1 -0
- package/dist/types/ai-tools.d.ts +95 -0
- package/dist/types/ai-tools.d.ts.map +1 -0
- package/dist/types/ai-tools.js +494 -0
- package/dist/types/ai-tools.js.map +1 -0
- package/dist/types/migration.d.ts +125 -0
- package/dist/types/migration.d.ts.map +1 -0
- package/dist/types/migration.js +8 -0
- package/dist/types/migration.js.map +1 -0
- package/dist/utils/ablation-store.d.ts +123 -0
- package/dist/utils/ablation-store.d.ts.map +1 -0
- package/dist/utils/ablation-store.js +749 -0
- package/dist/utils/ablation-store.js.map +1 -0
- package/dist/utils/agent-refs.d.ts +31 -0
- package/dist/utils/agent-refs.d.ts.map +1 -0
- package/dist/utils/agent-refs.js +63 -0
- package/dist/utils/agent-refs.js.map +1 -0
- package/dist/utils/atomic-write.d.ts +12 -0
- package/dist/utils/atomic-write.d.ts.map +1 -0
- package/dist/utils/atomic-write.js +30 -0
- package/dist/utils/atomic-write.js.map +1 -0
- package/dist/utils/compare-versions.d.ts +12 -0
- package/dist/utils/compare-versions.d.ts.map +1 -0
- package/dist/utils/compare-versions.js +86 -0
- package/dist/utils/compare-versions.js.map +1 -0
- package/dist/utils/cwd-guard.d.ts +38 -0
- package/dist/utils/cwd-guard.d.ts.map +1 -0
- package/dist/utils/cwd-guard.js +62 -0
- package/dist/utils/cwd-guard.js.map +1 -0
- package/dist/utils/file-writer.d.ts +36 -0
- package/dist/utils/file-writer.d.ts.map +1 -0
- package/dist/utils/file-writer.js +204 -0
- package/dist/utils/file-writer.js.map +1 -0
- package/dist/utils/managed-paths.d.ts +5 -0
- package/dist/utils/managed-paths.d.ts.map +1 -0
- package/dist/utils/managed-paths.js +51 -0
- package/dist/utils/managed-paths.js.map +1 -0
- package/dist/utils/managed-removal.d.ts +74 -0
- package/dist/utils/managed-removal.d.ts.map +1 -0
- package/dist/utils/managed-removal.js +270 -0
- package/dist/utils/managed-removal.js.map +1 -0
- package/dist/utils/manifest-prune.d.ts +61 -0
- package/dist/utils/manifest-prune.d.ts.map +1 -0
- package/dist/utils/manifest-prune.js +135 -0
- package/dist/utils/manifest-prune.js.map +1 -0
- package/dist/utils/posix.d.ts +13 -0
- package/dist/utils/posix.d.ts.map +1 -0
- package/dist/utils/posix.js +15 -0
- package/dist/utils/posix.js.map +1 -0
- package/dist/utils/project-detector.d.ts +46 -0
- package/dist/utils/project-detector.d.ts.map +1 -0
- package/dist/utils/project-detector.js +666 -0
- package/dist/utils/project-detector.js.map +1 -0
- package/dist/utils/proxy.d.ts +25 -0
- package/dist/utils/proxy.d.ts.map +1 -0
- package/dist/utils/proxy.js +60 -0
- package/dist/utils/proxy.js.map +1 -0
- package/dist/utils/registry-config.d.ts +7 -0
- package/dist/utils/registry-config.d.ts.map +1 -0
- package/dist/utils/registry-config.js +172 -0
- package/dist/utils/registry-config.js.map +1 -0
- package/dist/utils/task-json.d.ts +13 -0
- package/dist/utils/task-json.d.ts.map +1 -0
- package/dist/utils/task-json.js +12 -0
- package/dist/utils/task-json.js.map +1 -0
- package/dist/utils/template-fetcher.d.ts +161 -0
- package/dist/utils/template-fetcher.d.ts.map +1 -0
- package/dist/utils/template-fetcher.js +994 -0
- package/dist/utils/template-fetcher.js.map +1 -0
- package/dist/utils/template-hash.d.ts +127 -0
- package/dist/utils/template-hash.d.ts.map +1 -0
- package/dist/utils/template-hash.js +335 -0
- package/dist/utils/template-hash.js.map +1 -0
- package/dist/utils/uninstall-scrubbers.d.ts +66 -0
- package/dist/utils/uninstall-scrubbers.d.ts.map +1 -0
- package/dist/utils/uninstall-scrubbers.js +417 -0
- package/dist/utils/uninstall-scrubbers.js.map +1 -0
- package/dist/utils/workflow-resolver.d.ts +86 -0
- package/dist/utils/workflow-resolver.d.ts.map +1 -0
- package/dist/utils/workflow-resolver.js +265 -0
- package/dist/utils/workflow-resolver.js.map +1 -0
- package/package.json +93 -0
|
@@ -0,0 +1,390 @@
|
|
|
1
|
+
/* global process */
|
|
2
|
+
/**
|
|
3
|
+
* ATW Context Injection Plugin
|
|
4
|
+
*
|
|
5
|
+
* Injects context when Task tool is called with supported subagent types.
|
|
6
|
+
* Uses OpenCode's tool.execute.before hook.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import { existsSync } from "fs"
|
|
10
|
+
import { join } from "path"
|
|
11
|
+
import {
|
|
12
|
+
AtwContext,
|
|
13
|
+
debugLog,
|
|
14
|
+
readContextInjectionLimits,
|
|
15
|
+
ContextBudget,
|
|
16
|
+
materializeArtifact,
|
|
17
|
+
} from "../lib/atw-context.js"
|
|
18
|
+
|
|
19
|
+
// Supported subagent types, `atw-` prefix stripped (see below). These must
|
|
20
|
+
// stay in step with AGENTS_ALL in shared-hooks/inject-subagent-context.py,
|
|
21
|
+
// which is the authority: this list drifted to the pre-M1 role names once and
|
|
22
|
+
// nothing raised — every dispatch simply fell through the whitelist and
|
|
23
|
+
// injection never fired. `research` is retired as a sub-agent (C5).
|
|
24
|
+
const AGENTS_ALL = ["implement-agent", "review"]
|
|
25
|
+
const AGENTS_REQUIRE_TASK = ["implement-agent", "review"]
|
|
26
|
+
|
|
27
|
+
// Match `Active task: <path>` on the first non-empty line of the dispatch
|
|
28
|
+
// prompt. Mirrors the contract in workflow.md's [workflow-state:implement]
|
|
29
|
+
// breadcrumb so multi-window users can disambiguate which task is targeted.
|
|
30
|
+
const ACTIVE_TASK_HINT_RE = /^\s*Active task:\s*(\S+)\s*$/m
|
|
31
|
+
|
|
32
|
+
function extractActiveTaskHint(prompt) {
|
|
33
|
+
if (typeof prompt !== "string" || !prompt) return null
|
|
34
|
+
const match = prompt.match(ACTIVE_TASK_HINT_RE)
|
|
35
|
+
return match ? match[1].trim() : null
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Get context for implement agent. `taskDir` may be relative
|
|
40
|
+
* (`.atw/tasks/foo`) or absolute; both are resolved via
|
|
41
|
+
* `ctx.resolveTaskDir`.
|
|
42
|
+
*
|
|
43
|
+
* Read order (mirrors Python `get_implement_context`):
|
|
44
|
+
* 1. All files in implement.jsonl (spec/research manifests)
|
|
45
|
+
* 2. prd.md (requirements)
|
|
46
|
+
* `design.md` / `implement.md` are not materialized (D32/C23): nothing writes
|
|
47
|
+
* them, and a reader that still reaches for them is what keeps the cut from
|
|
48
|
+
* landing. Mirrors Python `get_implement_context`.
|
|
49
|
+
* All blocks share one total budget.
|
|
50
|
+
*/
|
|
51
|
+
function getImplementContext(ctx, taskDir) {
|
|
52
|
+
const parts = []
|
|
53
|
+
const taskDirFull = ctx.resolveTaskDir(taskDir)
|
|
54
|
+
if (!taskDirFull) return ""
|
|
55
|
+
|
|
56
|
+
const limits = readContextInjectionLimits(ctx.directory)
|
|
57
|
+
const budget = new ContextBudget(limits.max_total_bytes)
|
|
58
|
+
|
|
59
|
+
// 1. Read implement.jsonl
|
|
60
|
+
const jsonlPath = join(taskDirFull, "implement.jsonl")
|
|
61
|
+
const blocks = ctx.readJsonlWithFiles(jsonlPath, limits, budget)
|
|
62
|
+
if (blocks.length > 0) {
|
|
63
|
+
parts.push(ctx.buildContextFromEntries(blocks))
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// 2. Requirements document
|
|
67
|
+
const prdBlock = materializeArtifact(
|
|
68
|
+
ctx.directory,
|
|
69
|
+
`${taskDir}/prd.md`,
|
|
70
|
+
`${taskDir}/prd.md (Requirements)`,
|
|
71
|
+
"Requirements document",
|
|
72
|
+
limits,
|
|
73
|
+
budget,
|
|
74
|
+
)
|
|
75
|
+
if (prdBlock) parts.push(prdBlock)
|
|
76
|
+
|
|
77
|
+
return parts.join("\n\n")
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Get context for check agent. `taskDir` may be relative or absolute.
|
|
82
|
+
* Same read order and shared budget as the implement context.
|
|
83
|
+
*/
|
|
84
|
+
function getCheckContext(ctx, taskDir) {
|
|
85
|
+
const parts = []
|
|
86
|
+
const taskDirFull = ctx.resolveTaskDir(taskDir)
|
|
87
|
+
if (!taskDirFull) return ""
|
|
88
|
+
|
|
89
|
+
const limits = readContextInjectionLimits(ctx.directory)
|
|
90
|
+
const budget = new ContextBudget(limits.max_total_bytes)
|
|
91
|
+
|
|
92
|
+
const jsonlPath = join(taskDirFull, "check.jsonl")
|
|
93
|
+
const blocks = ctx.readJsonlWithFiles(jsonlPath, limits, budget)
|
|
94
|
+
if (blocks.length > 0) {
|
|
95
|
+
parts.push(ctx.buildContextFromEntries(blocks))
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
const prdBlock = materializeArtifact(
|
|
99
|
+
ctx.directory,
|
|
100
|
+
`${taskDir}/prd.md`,
|
|
101
|
+
`${taskDir}/prd.md (Requirements)`,
|
|
102
|
+
"Requirements document",
|
|
103
|
+
limits,
|
|
104
|
+
budget,
|
|
105
|
+
)
|
|
106
|
+
if (prdBlock) parts.push(prdBlock)
|
|
107
|
+
|
|
108
|
+
return parts.join("\n\n")
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* Build enhanced prompt with context
|
|
113
|
+
*/
|
|
114
|
+
function buildPrompt(agentType, originalPrompt, context) {
|
|
115
|
+
const templates = {
|
|
116
|
+
"implement-agent": `<!-- atw-hook-injected -->
|
|
117
|
+
# Implement Agent Task
|
|
118
|
+
|
|
119
|
+
You are the Implement Agent in the Multi-Agent Pipeline.
|
|
120
|
+
|
|
121
|
+
## Your Context
|
|
122
|
+
|
|
123
|
+
${context}
|
|
124
|
+
|
|
125
|
+
---
|
|
126
|
+
|
|
127
|
+
## Your Task
|
|
128
|
+
|
|
129
|
+
${originalPrompt}
|
|
130
|
+
|
|
131
|
+
---
|
|
132
|
+
|
|
133
|
+
## Workflow
|
|
134
|
+
|
|
135
|
+
1. **Understand specs** - All dev specs are injected above
|
|
136
|
+
2. **Understand task artifacts** - Read requirements, technical design if present, and execution plan if present
|
|
137
|
+
3. **Implement feature** - Follow specs and task artifacts
|
|
138
|
+
4. **Self-check** - Ensure code quality
|
|
139
|
+
|
|
140
|
+
## Important Constraints
|
|
141
|
+
|
|
142
|
+
- Do NOT execute git commit
|
|
143
|
+
- Follow all dev specs injected above
|
|
144
|
+
- Report list of modified/created files when done`,
|
|
145
|
+
|
|
146
|
+
review: `<!-- atw-hook-injected -->
|
|
147
|
+
# Check Agent Task
|
|
148
|
+
|
|
149
|
+
You are the Check Agent in the Multi-Agent Pipeline.
|
|
150
|
+
|
|
151
|
+
## Your Context
|
|
152
|
+
|
|
153
|
+
${context}
|
|
154
|
+
|
|
155
|
+
---
|
|
156
|
+
|
|
157
|
+
## Your Task
|
|
158
|
+
|
|
159
|
+
${originalPrompt}
|
|
160
|
+
|
|
161
|
+
---
|
|
162
|
+
|
|
163
|
+
## Workflow
|
|
164
|
+
|
|
165
|
+
1. **Get changes** - Run \`git diff --name-only\` and \`git diff\`
|
|
166
|
+
2. **Check against specs** - Check item by item
|
|
167
|
+
3. **Self-fix** - Fix issues directly, don't just report
|
|
168
|
+
4. **Run verification** - Run lint and typecheck
|
|
169
|
+
|
|
170
|
+
## Important Constraints
|
|
171
|
+
|
|
172
|
+
- Fix issues yourself, don't just report
|
|
173
|
+
- Must execute complete checklist`,
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
return templates[agentType] || originalPrompt
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
function shellQuote(value) {
|
|
180
|
+
return `'${String(value).replace(/'/g, "'\\''")}'`
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
function powershellQuote(value) {
|
|
184
|
+
return `'${String(value).replace(/'/g, "''")}'`
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
function envValue(env, key) {
|
|
188
|
+
const value = env?.[key]
|
|
189
|
+
return typeof value === "string" && value.trim() ? value.trim() : null
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
function shellBasename(value) {
|
|
193
|
+
return value.replace(/\\/g, "/").split("/").pop()?.toLowerCase() || ""
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
function isWindowsPosixShell(env = process.env) {
|
|
197
|
+
if (envValue(env, "MSYSTEM")) return true
|
|
198
|
+
if (envValue(env, "MINGW_PREFIX")) return true
|
|
199
|
+
if (envValue(env, "OPENCODE_GIT_BASH_PATH")) return true
|
|
200
|
+
|
|
201
|
+
const ostype = envValue(env, "OSTYPE")?.toLowerCase() || ""
|
|
202
|
+
if (/(msys|mingw|cygwin)/.test(ostype)) return true
|
|
203
|
+
|
|
204
|
+
const shell = shellBasename(envValue(env, "SHELL") || "")
|
|
205
|
+
return /^(bash|sh|zsh)(\.exe)?$/.test(shell)
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
function buildAtwContextPrefix(contextKey, hostPlatform = process.platform, env = process.env) {
|
|
209
|
+
if (hostPlatform === "win32" && !isWindowsPosixShell(env)) {
|
|
210
|
+
return `$env:ATW_CONTEXT_ID = ${powershellQuote(contextKey)}; `
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
return `export ATW_CONTEXT_ID=${shellQuote(contextKey)}; `
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
function getBashCommandKey(args) {
|
|
217
|
+
if (!args || typeof args !== "object") return null
|
|
218
|
+
if (typeof args.command === "string") return "command"
|
|
219
|
+
if (typeof args.cmd === "string") return "cmd"
|
|
220
|
+
return null
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
function commandStartsWithAtwContext(command) {
|
|
224
|
+
const firstCommand = command.trimStart().split(/[;&|]/, 1)[0].trimStart()
|
|
225
|
+
return (
|
|
226
|
+
/^ATW_CONTEXT_ID\s*=/.test(firstCommand) ||
|
|
227
|
+
/^export\s+ATW_CONTEXT_ID\s*=/.test(firstCommand) ||
|
|
228
|
+
/^env\s+(?:(?:-\S+|[A-Za-z_][A-Za-z0-9_]*=\S*)\s+)*ATW_CONTEXT_ID\s*=/.test(firstCommand) ||
|
|
229
|
+
/^\$env:ATW_CONTEXT_ID\s*=/i.test(firstCommand)
|
|
230
|
+
)
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
/**
|
|
234
|
+
* OpenCode exposes no session identity to Bash at all — it sets no session env
|
|
235
|
+
* var in any process. The plugin hook does receive it, so inject it into Bash
|
|
236
|
+
* commands before execution; that prefix is the only channel by which an
|
|
237
|
+
* AI-run `task.py` sees the OpenCode session.
|
|
238
|
+
*/
|
|
239
|
+
function injectAtwContextIntoBash(ctx, input, output, hostPlatform, env) {
|
|
240
|
+
const args = output?.args
|
|
241
|
+
const commandKey = getBashCommandKey(args)
|
|
242
|
+
if (!commandKey) return false
|
|
243
|
+
|
|
244
|
+
const command = args[commandKey]
|
|
245
|
+
if (!command.trim()) return false
|
|
246
|
+
if (commandStartsWithAtwContext(command)) return false
|
|
247
|
+
|
|
248
|
+
const contextKey = ctx.getContextKey(input)
|
|
249
|
+
if (!contextKey) return false
|
|
250
|
+
|
|
251
|
+
args[commandKey] = `${buildAtwContextPrefix(contextKey, hostPlatform, env)}${command}`
|
|
252
|
+
return true
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
// OpenCode plugin factory: `export default async (input) => hooks`.
|
|
256
|
+
// OpenCode 1.2.x iterates every module export and invokes it as a function
|
|
257
|
+
// (packages/opencode/src/plugin/index.ts — `for ([_, fn] of Object.entries(mod)) await fn(input)`);
|
|
258
|
+
// the previous `{ id, server }` object shape failed with
|
|
259
|
+
// `TypeError: fn is not a function` in 1.2.x.
|
|
260
|
+
export default async ({ directory, platform: hostPlatform = process.platform, env = process.env }) => {
|
|
261
|
+
const ctx = new AtwContext(directory)
|
|
262
|
+
debugLog("inject", "Plugin loaded, directory:", directory)
|
|
263
|
+
|
|
264
|
+
return {
|
|
265
|
+
"tool.execute.before": async (input, output) => {
|
|
266
|
+
try {
|
|
267
|
+
if (process.env.ATW_HOOKS === "0" || process.env.ATW_DISABLE_HOOKS === "1") {
|
|
268
|
+
return
|
|
269
|
+
}
|
|
270
|
+
debugLog("inject", "tool.execute.before called, tool:", input?.tool)
|
|
271
|
+
|
|
272
|
+
const toolName = input?.tool?.toLowerCase()
|
|
273
|
+
if (toolName === "bash") {
|
|
274
|
+
if (injectAtwContextIntoBash(ctx, input, output, hostPlatform, env)) {
|
|
275
|
+
debugLog("inject", "Injected ATW_CONTEXT_ID into Bash command")
|
|
276
|
+
}
|
|
277
|
+
return
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
if (toolName !== "task") {
|
|
281
|
+
return
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
const args = output?.args
|
|
285
|
+
if (!args) return
|
|
286
|
+
|
|
287
|
+
const rawSubagentType = args.subagent_type
|
|
288
|
+
// Agent ids carry an "atw-" prefix; the dispatch table below does not.
|
|
289
|
+
const subagentType = (rawSubagentType || "").replace(/^atw-/, "")
|
|
290
|
+
const originalPrompt = args.prompt || ""
|
|
291
|
+
|
|
292
|
+
debugLog("inject", "Task tool called, subagent_type:", rawSubagentType)
|
|
293
|
+
|
|
294
|
+
if (!AGENTS_ALL.includes(subagentType)) {
|
|
295
|
+
debugLog("inject", "Skipping - unsupported subagent_type")
|
|
296
|
+
return
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
// Resolve active task in this priority order (only later steps
|
|
300
|
+
// run when earlier ones miss):
|
|
301
|
+
// 1. Exact session runtime context lookup for input.sessionID
|
|
302
|
+
// 2. `Active task: <path>` hint in the dispatch prompt
|
|
303
|
+
// (explicit per-dispatch override — beats single-session
|
|
304
|
+
// inference so multi-window users can disambiguate)
|
|
305
|
+
// 3. Single-session fallback — only when exactly 1 session
|
|
306
|
+
// runtime file exists locally
|
|
307
|
+
let taskDir = null
|
|
308
|
+
let taskSource = null
|
|
309
|
+
|
|
310
|
+
const contextKey = ctx.getContextKey(input)
|
|
311
|
+
if (contextKey) {
|
|
312
|
+
const context = ctx.readContext(contextKey)
|
|
313
|
+
const exactRef = ctx.normalizeTaskRef(context?.current_task || "")
|
|
314
|
+
if (exactRef) {
|
|
315
|
+
taskDir = exactRef
|
|
316
|
+
taskSource = `session:${contextKey}`
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
if (!taskDir) {
|
|
321
|
+
const hintRef = extractActiveTaskHint(originalPrompt)
|
|
322
|
+
if (hintRef) {
|
|
323
|
+
const hintNormalized = ctx.normalizeTaskRef(hintRef)
|
|
324
|
+
if (hintNormalized) {
|
|
325
|
+
const hintDir = ctx.resolveTaskDir(hintNormalized)
|
|
326
|
+
if (hintDir && existsSync(hintDir)) {
|
|
327
|
+
taskDir = hintNormalized
|
|
328
|
+
taskSource = "prompt-hint"
|
|
329
|
+
debugLog("inject", "Resolved task from Active task: hint:", hintNormalized)
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
if (!taskDir) {
|
|
336
|
+
const fallback = ctx._resolveSingleSessionFallback()
|
|
337
|
+
if (fallback?.taskPath) {
|
|
338
|
+
const fallbackDir = ctx.resolveTaskDir(fallback.taskPath)
|
|
339
|
+
if (fallbackDir && existsSync(fallbackDir)) {
|
|
340
|
+
taskDir = fallback.taskPath
|
|
341
|
+
taskSource = fallback.source
|
|
342
|
+
debugLog("inject", "Resolved task via single-session fallback:", taskDir, "source:", taskSource)
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
// Agents requiring task directory
|
|
348
|
+
if (AGENTS_REQUIRE_TASK.includes(subagentType)) {
|
|
349
|
+
// subagentType is already stripped of "atw-" prefix above
|
|
350
|
+
if (!taskDir) {
|
|
351
|
+
debugLog("inject", "Skipping - no current task")
|
|
352
|
+
return
|
|
353
|
+
}
|
|
354
|
+
const taskDirFull = ctx.resolveTaskDir(taskDir)
|
|
355
|
+
if (!taskDirFull || !existsSync(taskDirFull)) {
|
|
356
|
+
debugLog("inject", "Skipping - task directory not found")
|
|
357
|
+
return
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
// Get context based on agent type
|
|
362
|
+
let context = ""
|
|
363
|
+
switch (subagentType) {
|
|
364
|
+
case "implement-agent":
|
|
365
|
+
context = getImplementContext(ctx, taskDir)
|
|
366
|
+
break
|
|
367
|
+
case "review":
|
|
368
|
+
context = getCheckContext(ctx, taskDir)
|
|
369
|
+
break
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
if (!context) {
|
|
373
|
+
debugLog("inject", "No context to inject")
|
|
374
|
+
return
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
const newPrompt = buildPrompt(subagentType, originalPrompt, context)
|
|
378
|
+
|
|
379
|
+
// Mutate args in-place — whole-object replacement does NOT work for the task tool
|
|
380
|
+
// because the runtime holds a local reference to the same args object.
|
|
381
|
+
args.prompt = newPrompt
|
|
382
|
+
|
|
383
|
+
debugLog("inject", "Injected context for", subagentType, "prompt length:", newPrompt.length)
|
|
384
|
+
|
|
385
|
+
} catch (error) {
|
|
386
|
+
debugLog("inject", "Error in tool.execute.before:", error.message, error.stack)
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
}
|
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
/* global process */
|
|
2
|
+
/**
|
|
3
|
+
* ATW Workflow State Injection Plugin
|
|
4
|
+
*
|
|
5
|
+
* Per-turn UserPromptSubmit equivalent for OpenCode.
|
|
6
|
+
*
|
|
7
|
+
* On every model request, inject a short <workflow-state> breadcrumb
|
|
8
|
+
* into the in-memory copy of the latest user message via
|
|
9
|
+
* `experimental.chat.messages.transform`. Stored history and the TUI
|
|
10
|
+
* are not modified. Breadcrumb text is pulled exclusively
|
|
11
|
+
* from the project's workflow.md [workflow-state:STATUS] tag blocks —
|
|
12
|
+
* workflow.md is the single source of truth. There are no fallback
|
|
13
|
+
* tables in this plugin: when workflow.md is missing or a tag is
|
|
14
|
+
* absent, the breadcrumb degrades to a generic
|
|
15
|
+
* "Refer to workflow.md for current step." line so users see (and fix)
|
|
16
|
+
* the broken state instead of the plugin silently masking it.
|
|
17
|
+
*
|
|
18
|
+
* Silently skips when:
|
|
19
|
+
* - No .atw/ directory
|
|
20
|
+
* - No active task in the session runtime context
|
|
21
|
+
* - task.json malformed or missing status
|
|
22
|
+
*/
|
|
23
|
+
|
|
24
|
+
import { existsSync, readFileSync } from "fs"
|
|
25
|
+
import { join } from "path"
|
|
26
|
+
import {
|
|
27
|
+
MESSAGES_TRANSFORM_HOOK,
|
|
28
|
+
latestUserPromptText,
|
|
29
|
+
platformInputFromMessages,
|
|
30
|
+
prependEphemeralText,
|
|
31
|
+
} from "../lib/context-visibility.js"
|
|
32
|
+
import { AtwContext, debugLog, isAtwSubagent } from "../lib/atw-context.js"
|
|
33
|
+
|
|
34
|
+
// Supports STATUS values with letters, digits, underscores, hyphens
|
|
35
|
+
// (so "in-review" / "blocked-by-team" work alongside "task_error").
|
|
36
|
+
const TAG_RE = /\[workflow-state:([A-Za-z0-9_-]+)\]\s*\n([\s\S]*?)\n\s*\[\/workflow-state:\1\]/g
|
|
37
|
+
|
|
38
|
+
// Escape hatch for the per-turn breadcrumb. Mirrors
|
|
39
|
+
// `common.config.get_prompt_injection_config()` / the shared Python hook's
|
|
40
|
+
// `_resolve_skip_keyword()` + `prompt_has_skip_keyword()`.
|
|
41
|
+
const DEFAULT_PROMPT_INJECTION_SKIP_KEYWORD = "no-atw"
|
|
42
|
+
|
|
43
|
+
function stripInlineComment(value) {
|
|
44
|
+
let inQuote = null
|
|
45
|
+
for (let idx = 0; idx < value.length; idx++) {
|
|
46
|
+
const ch = value[idx]
|
|
47
|
+
if (inQuote) {
|
|
48
|
+
if (ch === inQuote) inQuote = null
|
|
49
|
+
continue
|
|
50
|
+
}
|
|
51
|
+
if (ch === '"' || ch === "'") {
|
|
52
|
+
inQuote = ch
|
|
53
|
+
continue
|
|
54
|
+
}
|
|
55
|
+
if (ch === "#" && (idx === 0 || /\s/.test(value[idx - 1]))) return value.slice(0, idx)
|
|
56
|
+
}
|
|
57
|
+
return value
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
function unquoteYaml(s) {
|
|
61
|
+
if (s.length >= 2 && s[0] === s[s.length - 1] && (s[0] === '"' || s[0] === "'")) return s.slice(1, -1)
|
|
62
|
+
return s
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Line-based parser for ONLY the `prompt_injection:` block of
|
|
67
|
+
* `.atw/config.yaml`. Not a general YAML parser — mirrors
|
|
68
|
+
* `common.config.get_prompt_injection_config()` semantics for this section
|
|
69
|
+
* only (missing key keeps the default; non-string value keeps the default).
|
|
70
|
+
*/
|
|
71
|
+
function readSkipKeyword(directory) {
|
|
72
|
+
const path = join(directory, ".atw", "config.yaml")
|
|
73
|
+
if (!existsSync(path)) return DEFAULT_PROMPT_INJECTION_SKIP_KEYWORD
|
|
74
|
+
let text
|
|
75
|
+
try {
|
|
76
|
+
text = readFileSync(path, "utf-8")
|
|
77
|
+
} catch {
|
|
78
|
+
return DEFAULT_PROMPT_INJECTION_SKIP_KEYWORD
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
let inSection = false
|
|
82
|
+
let sectionIndent = -1
|
|
83
|
+
for (const rawLine of text.split(/\r?\n/)) {
|
|
84
|
+
const trimmed = rawLine.trim()
|
|
85
|
+
if (!inSection) {
|
|
86
|
+
if (/^prompt_injection\s*:\s*(#.*)?$/.test(trimmed)) {
|
|
87
|
+
inSection = true
|
|
88
|
+
sectionIndent = rawLine.length - rawLine.trimStart().length
|
|
89
|
+
}
|
|
90
|
+
continue
|
|
91
|
+
}
|
|
92
|
+
if (!trimmed || trimmed.startsWith("#")) continue
|
|
93
|
+
const indent = rawLine.length - rawLine.trimStart().length
|
|
94
|
+
if (indent <= sectionIndent) break
|
|
95
|
+
const m = trimmed.match(/^skip_keyword\s*:\s*(.*)$/)
|
|
96
|
+
if (!m) continue
|
|
97
|
+
return unquoteYaml(stripInlineComment(m[1]).trim())
|
|
98
|
+
}
|
|
99
|
+
return DEFAULT_PROMPT_INJECTION_SKIP_KEYWORD
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* Case-insensitive, word-boundary match of `keyword` in `text`. Hyphen
|
|
104
|
+
* counts as a word char so "no-atwx" / "xno-atw" don't match, but
|
|
105
|
+
* punctuation/whitespace boundaries do. Empty keyword never matches.
|
|
106
|
+
*/
|
|
107
|
+
function promptHasSkipKeyword(text, keyword) {
|
|
108
|
+
if (!keyword || typeof text !== "string") return false
|
|
109
|
+
const escaped = keyword.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")
|
|
110
|
+
const pattern = new RegExp(`(?<![\\w-])${escaped}(?![\\w-])`, "i")
|
|
111
|
+
return pattern.test(text)
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* Parse workflow.md for [workflow-state:STATUS] blocks.
|
|
116
|
+
*
|
|
117
|
+
* Returns {status: body}. workflow.md is the single source of truth —
|
|
118
|
+
* there are no fallback tables here. Missing tags (or a missing /
|
|
119
|
+
* unreadable workflow.md) fall back to a generic line in
|
|
120
|
+
* buildBreadcrumb so users see the broken state and fix workflow.md
|
|
121
|
+
* rather than the plugin silently masking it.
|
|
122
|
+
*/
|
|
123
|
+
function loadBreadcrumbs(directory) {
|
|
124
|
+
const workflowPath = join(directory, ".atw", "workflow.md")
|
|
125
|
+
if (!existsSync(workflowPath)) return {}
|
|
126
|
+
let content
|
|
127
|
+
try {
|
|
128
|
+
content = readFileSync(workflowPath, "utf-8")
|
|
129
|
+
} catch {
|
|
130
|
+
return {}
|
|
131
|
+
}
|
|
132
|
+
const result = {}
|
|
133
|
+
for (const match of content.matchAll(TAG_RE)) {
|
|
134
|
+
const status = match[1]
|
|
135
|
+
const body = match[2].trim()
|
|
136
|
+
if (body) result[status] = body
|
|
137
|
+
}
|
|
138
|
+
return result
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/**
|
|
142
|
+
* Get (taskId, status) from active task, or null if no active task.
|
|
143
|
+
*/
|
|
144
|
+
function getActiveTask(ctx, platformInput = null) {
|
|
145
|
+
const active = ctx.getActiveTask(platformInput)
|
|
146
|
+
const taskRef = active.taskPath
|
|
147
|
+
if (!taskRef) return null
|
|
148
|
+
const taskDir = ctx.resolveTaskDir(taskRef)
|
|
149
|
+
if (active.stale || !taskDir || !existsSync(taskDir)) {
|
|
150
|
+
return { id: taskRef.split("/").pop(), status: "stale", source: active.source }
|
|
151
|
+
}
|
|
152
|
+
const taskJsonPath = join(taskDir, "task.json")
|
|
153
|
+
if (!existsSync(taskJsonPath)) return null
|
|
154
|
+
try {
|
|
155
|
+
const data = JSON.parse(readFileSync(taskJsonPath, "utf-8"))
|
|
156
|
+
const status = typeof data.status === "string" ? data.status : ""
|
|
157
|
+
if (!status) return null
|
|
158
|
+
const id = data.id || taskRef.split("/").pop()
|
|
159
|
+
return { id, status, source: active.source }
|
|
160
|
+
} catch {
|
|
161
|
+
return null
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
/**
|
|
166
|
+
* Build the <workflow-state>...</workflow-state> block.
|
|
167
|
+
* - Known status (tag present in workflow.md) → detailed body
|
|
168
|
+
* - Unknown status (no tag, or workflow.md missing) → generic
|
|
169
|
+
* "Refer to workflow.md for current step." line
|
|
170
|
+
* - no_task pseudo-status (id === null) → header omits task info
|
|
171
|
+
*/
|
|
172
|
+
function buildBreadcrumb(id, status, templates) {
|
|
173
|
+
let body = templates[status]
|
|
174
|
+
if (body === undefined) {
|
|
175
|
+
body = "Refer to workflow.md for current step."
|
|
176
|
+
}
|
|
177
|
+
let header = id === null ? `Status: ${status}` : `Task: ${id} (${status})`
|
|
178
|
+
return `<workflow-state>\n${header}\n${body}\n</workflow-state>`
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
// OpenCode 1.2.x expects plugins to be factory functions (see inject-subagent-context.js comment).
|
|
182
|
+
export default async ({ directory }) => {
|
|
183
|
+
const ctx = new AtwContext(directory)
|
|
184
|
+
debugLog("workflow-state", "Plugin loaded, directory:", directory)
|
|
185
|
+
|
|
186
|
+
return {
|
|
187
|
+
[MESSAGES_TRANSFORM_HOOK]: async (_input, output) => {
|
|
188
|
+
try {
|
|
189
|
+
const messages = output?.messages
|
|
190
|
+
const platformInput = platformInputFromMessages(messages)
|
|
191
|
+
// Skip ATW sub-agent turns — the per-turn breadcrumb is for the
|
|
192
|
+
// main session only; sub-agent context comes from the parent's
|
|
193
|
+
// tool.execute.before injection.
|
|
194
|
+
if (isAtwSubagent(platformInput)) {
|
|
195
|
+
debugLog("workflow-state", "Skipping atw subagent turn:", platformInput?.agent)
|
|
196
|
+
return
|
|
197
|
+
}
|
|
198
|
+
if (process.env.ATW_HOOKS === "0" || process.env.ATW_DISABLE_HOOKS === "1") {
|
|
199
|
+
return
|
|
200
|
+
}
|
|
201
|
+
if (process.env.OPENCODE_NON_INTERACTIVE === "1") {
|
|
202
|
+
return
|
|
203
|
+
}
|
|
204
|
+
if (!ctx.isAtwProject()) {
|
|
205
|
+
return
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
const originalText = latestUserPromptText(messages)
|
|
209
|
+
|
|
210
|
+
// Escape hatch: user prompt contains the skip keyword
|
|
211
|
+
// as a standalone word — emit nothing for this turn only.
|
|
212
|
+
if (promptHasSkipKeyword(originalText, readSkipKeyword(directory))) {
|
|
213
|
+
debugLog("workflow-state", "Skipping turn: skip keyword present in prompt")
|
|
214
|
+
return
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
const templates = loadBreadcrumbs(directory)
|
|
218
|
+
const task = getActiveTask(ctx, platformInput)
|
|
219
|
+
const breadcrumb = task
|
|
220
|
+
? buildBreadcrumb(task.id, task.status, templates, task.source)
|
|
221
|
+
: buildBreadcrumb(null, "no_task", templates)
|
|
222
|
+
|
|
223
|
+
prependEphemeralText(messages, breadcrumb)
|
|
224
|
+
debugLog(
|
|
225
|
+
"workflow-state",
|
|
226
|
+
"Injected breadcrumb for task",
|
|
227
|
+
task ? task.id : "none",
|
|
228
|
+
"status",
|
|
229
|
+
task ? task.status : "no_task",
|
|
230
|
+
)
|
|
231
|
+
} catch (error) {
|
|
232
|
+
debugLog(
|
|
233
|
+
"workflow-state",
|
|
234
|
+
"Error in messages.transform:",
|
|
235
|
+
error instanceof Error ? error.message : String(error),
|
|
236
|
+
)
|
|
237
|
+
}
|
|
238
|
+
},
|
|
239
|
+
}
|
|
240
|
+
}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/* global process */
|
|
2
|
+
/**
|
|
3
|
+
* ATW Session Start Plugin
|
|
4
|
+
*
|
|
5
|
+
* Injects compact SessionStart context into the copy of the latest user
|
|
6
|
+
* message that OpenCode sends to the model. Uses
|
|
7
|
+
* `experimental.chat.messages.transform` so TUI / Web / SQLite history
|
|
8
|
+
* stay untouched.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import { AtwContext, debugLog, isAtwSubagent } from "../lib/atw-context.js"
|
|
12
|
+
import {
|
|
13
|
+
MESSAGES_TRANSFORM_HOOK,
|
|
14
|
+
platformInputFromMessages,
|
|
15
|
+
prependEphemeralText,
|
|
16
|
+
transcriptHasAssistantMessage,
|
|
17
|
+
} from "../lib/context-visibility.js"
|
|
18
|
+
import { buildSessionContext } from "../lib/session-utils.js"
|
|
19
|
+
|
|
20
|
+
const FIRST_REPLY_NOTICE_RE = /<first-reply-notice>[\s\S]*?<\/first-reply-notice>\s*/g
|
|
21
|
+
|
|
22
|
+
function stripFirstReplyNotice(context) {
|
|
23
|
+
return context.replace(FIRST_REPLY_NOTICE_RE, "")
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
// OpenCode 1.2.x expects plugins to be factory functions (see inject-subagent-context.js comment).
|
|
27
|
+
export default async ({ directory }) => {
|
|
28
|
+
const ctx = new AtwContext(directory)
|
|
29
|
+
debugLog("session", "Plugin loaded, directory:", directory)
|
|
30
|
+
|
|
31
|
+
return {
|
|
32
|
+
[MESSAGES_TRANSFORM_HOOK]: async (_input, output) => {
|
|
33
|
+
try {
|
|
34
|
+
const messages = output?.messages
|
|
35
|
+
const platformInput = platformInputFromMessages(messages)
|
|
36
|
+
const agent = platformInput?.agent || "unknown"
|
|
37
|
+
debugLog("session", "messages.transform called, agent:", agent)
|
|
38
|
+
|
|
39
|
+
if (isAtwSubagent(platformInput)) {
|
|
40
|
+
debugLog("session", "Skipping atw subagent turn:", agent)
|
|
41
|
+
return
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
if (process.env.ATW_HOOKS === "0" || process.env.ATW_DISABLE_HOOKS === "1") {
|
|
45
|
+
debugLog("session", "Skipping - ATW_HOOKS disabled")
|
|
46
|
+
return
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
if (process.env.OPENCODE_NON_INTERACTIVE === "1") {
|
|
50
|
+
debugLog("session", "Skipping - non-interactive mode")
|
|
51
|
+
return
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
let context = buildSessionContext(ctx, platformInput)
|
|
55
|
+
if (transcriptHasAssistantMessage(messages)) {
|
|
56
|
+
context = stripFirstReplyNotice(context)
|
|
57
|
+
}
|
|
58
|
+
debugLog("session", "Built context, length:", context.length)
|
|
59
|
+
prependEphemeralText(messages, context)
|
|
60
|
+
} catch (error) {
|
|
61
|
+
debugLog("session", "Error in messages.transform:", error.message, error.stack)
|
|
62
|
+
}
|
|
63
|
+
},
|
|
64
|
+
}
|
|
65
|
+
}
|