@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,543 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
Common path utilities for ATW workflow.
|
|
4
|
+
|
|
5
|
+
Provides:
|
|
6
|
+
get_repo_root - Get repository root directory
|
|
7
|
+
get_developer - Get developer name
|
|
8
|
+
get_workspace_dir - Get developer workspace directory
|
|
9
|
+
get_tasks_dir - Get tasks directory
|
|
10
|
+
get_active_journal_file - Get current journal file
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
from __future__ import annotations
|
|
14
|
+
|
|
15
|
+
import os
|
|
16
|
+
import re
|
|
17
|
+
from datetime import datetime
|
|
18
|
+
from pathlib import Path
|
|
19
|
+
|
|
20
|
+
from .git import main_worktree_root
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
# =============================================================================
|
|
24
|
+
# Path Constants (change here to rename directories)
|
|
25
|
+
# =============================================================================
|
|
26
|
+
|
|
27
|
+
# Directory names
|
|
28
|
+
DIR_WORKFLOW = ".atw"
|
|
29
|
+
DIR_WORKSPACE = "workspace"
|
|
30
|
+
DIR_TASKS = "tasks"
|
|
31
|
+
DIR_ARCHIVE = "archive"
|
|
32
|
+
DIR_SPEC = "spec"
|
|
33
|
+
DIR_SCRIPTS = "scripts"
|
|
34
|
+
|
|
35
|
+
# File names
|
|
36
|
+
FILE_DEVELOPER = ".developer"
|
|
37
|
+
FILE_CURRENT_TASK = ".current-task"
|
|
38
|
+
FILE_TASK_JSON = "task.json"
|
|
39
|
+
FILE_JOURNAL_PREFIX = "journal-"
|
|
40
|
+
|
|
41
|
+
# Environment override for the developer identity, ahead of the .developer file.
|
|
42
|
+
ENV_DEVELOPER = "ATW_DEVELOPER"
|
|
43
|
+
|
|
44
|
+
# Appended to every "no developer set" error so the two non-obvious sources are
|
|
45
|
+
# discoverable from the failure itself.
|
|
46
|
+
DEVELOPER_HINT = (
|
|
47
|
+
f" Or set {ENV_DEVELOPER}=<your-name> in the environment.\n"
|
|
48
|
+
f" A linked git worktree inherits {DIR_WORKFLOW}/{FILE_DEVELOPER} from its "
|
|
49
|
+
f"main checkout — run init_developer.py there to cover every worktree."
|
|
50
|
+
)
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
# =============================================================================
|
|
54
|
+
# Repository Root
|
|
55
|
+
# =============================================================================
|
|
56
|
+
|
|
57
|
+
def get_repo_root(start_path: Path | None = None) -> Path:
|
|
58
|
+
"""Find the nearest directory containing .atw/ folder.
|
|
59
|
+
|
|
60
|
+
This handles nested git repos correctly (e.g., test project inside another repo).
|
|
61
|
+
|
|
62
|
+
Args:
|
|
63
|
+
start_path: Starting directory to search from. Defaults to current directory.
|
|
64
|
+
|
|
65
|
+
Returns:
|
|
66
|
+
Path to repository root, or current directory if no .atw/ found.
|
|
67
|
+
"""
|
|
68
|
+
current = (start_path or Path.cwd()).resolve()
|
|
69
|
+
|
|
70
|
+
while current != current.parent:
|
|
71
|
+
if (current / DIR_WORKFLOW).is_dir():
|
|
72
|
+
return current
|
|
73
|
+
current = current.parent
|
|
74
|
+
|
|
75
|
+
# Fallback to current directory if no .atw/ found
|
|
76
|
+
return Path.cwd().resolve()
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
# =============================================================================
|
|
80
|
+
# Developer
|
|
81
|
+
# =============================================================================
|
|
82
|
+
|
|
83
|
+
def _read_developer_file(dev_file: Path) -> str | None:
|
|
84
|
+
"""Read the `name=` field out of a .developer file, or None."""
|
|
85
|
+
if not dev_file.is_file():
|
|
86
|
+
return None
|
|
87
|
+
|
|
88
|
+
try:
|
|
89
|
+
content = dev_file.read_text(encoding="utf-8")
|
|
90
|
+
except (OSError, IOError):
|
|
91
|
+
return None
|
|
92
|
+
|
|
93
|
+
for line in content.splitlines():
|
|
94
|
+
if line.startswith("name="):
|
|
95
|
+
return line.split("=", 1)[1].strip() or None
|
|
96
|
+
|
|
97
|
+
return None
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
def get_developer(repo_root: Path | None = None) -> str | None:
|
|
101
|
+
"""Get the developer name for this checkout.
|
|
102
|
+
|
|
103
|
+
Resolution order, first hit wins (a CLI `--assignee` flag overrides all of
|
|
104
|
+
it, before this function is ever called):
|
|
105
|
+
|
|
106
|
+
1. The ``ATW_DEVELOPER`` environment variable.
|
|
107
|
+
2. ``.atw/.developer`` in this checkout.
|
|
108
|
+
3. ``.atw/.developer`` in the main checkout, when this checkout is a
|
|
109
|
+
linked git worktree.
|
|
110
|
+
|
|
111
|
+
Step 3 exists because `.developer` is gitignored on purpose — it carries a
|
|
112
|
+
personal identity and no tracked file should. A fresh `git worktree add`
|
|
113
|
+
therefore starts with no identity file of its own, which used to make every
|
|
114
|
+
task.py command fail until init_developer.py was re-run per worktree. The
|
|
115
|
+
main checkout's file is read, never copied: a copy would go stale and shadow
|
|
116
|
+
later changes made in the main checkout.
|
|
117
|
+
|
|
118
|
+
Args:
|
|
119
|
+
repo_root: Repository root path. Defaults to auto-detected.
|
|
120
|
+
|
|
121
|
+
Returns:
|
|
122
|
+
Developer name or None if not initialized.
|
|
123
|
+
"""
|
|
124
|
+
env_name = os.environ.get(ENV_DEVELOPER, "").strip()
|
|
125
|
+
if env_name:
|
|
126
|
+
return env_name
|
|
127
|
+
|
|
128
|
+
if repo_root is None:
|
|
129
|
+
repo_root = get_repo_root()
|
|
130
|
+
|
|
131
|
+
local = _read_developer_file(repo_root / DIR_WORKFLOW / FILE_DEVELOPER)
|
|
132
|
+
if local:
|
|
133
|
+
return local
|
|
134
|
+
|
|
135
|
+
main_root = main_worktree_root(repo_root)
|
|
136
|
+
if main_root is None:
|
|
137
|
+
return None
|
|
138
|
+
|
|
139
|
+
return _read_developer_file(main_root / DIR_WORKFLOW / FILE_DEVELOPER)
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
def check_developer(repo_root: Path | None = None) -> bool:
|
|
143
|
+
"""Check if developer is initialized.
|
|
144
|
+
|
|
145
|
+
Args:
|
|
146
|
+
repo_root: Repository root path. Defaults to auto-detected.
|
|
147
|
+
|
|
148
|
+
Returns:
|
|
149
|
+
True if developer is initialized.
|
|
150
|
+
"""
|
|
151
|
+
return get_developer(repo_root) is not None
|
|
152
|
+
|
|
153
|
+
|
|
154
|
+
# =============================================================================
|
|
155
|
+
# Tasks Directory
|
|
156
|
+
# =============================================================================
|
|
157
|
+
|
|
158
|
+
def get_tasks_dir(repo_root: Path | None = None) -> Path:
|
|
159
|
+
"""Get tasks directory path.
|
|
160
|
+
|
|
161
|
+
Args:
|
|
162
|
+
repo_root: Repository root path. Defaults to auto-detected.
|
|
163
|
+
|
|
164
|
+
Returns:
|
|
165
|
+
Path to tasks directory.
|
|
166
|
+
"""
|
|
167
|
+
if repo_root is None:
|
|
168
|
+
repo_root = get_repo_root()
|
|
169
|
+
return repo_root / DIR_WORKFLOW / DIR_TASKS
|
|
170
|
+
|
|
171
|
+
|
|
172
|
+
# =============================================================================
|
|
173
|
+
# Workspace Directory
|
|
174
|
+
# =============================================================================
|
|
175
|
+
|
|
176
|
+
def get_workspace_dir(repo_root: Path | None = None) -> Path | None:
|
|
177
|
+
"""Get developer workspace directory.
|
|
178
|
+
|
|
179
|
+
Args:
|
|
180
|
+
repo_root: Repository root path. Defaults to auto-detected.
|
|
181
|
+
|
|
182
|
+
Returns:
|
|
183
|
+
Path to workspace directory or None if developer not set.
|
|
184
|
+
"""
|
|
185
|
+
if repo_root is None:
|
|
186
|
+
repo_root = get_repo_root()
|
|
187
|
+
|
|
188
|
+
developer = get_developer(repo_root)
|
|
189
|
+
if developer:
|
|
190
|
+
return repo_root / DIR_WORKFLOW / DIR_WORKSPACE / developer
|
|
191
|
+
return None
|
|
192
|
+
|
|
193
|
+
|
|
194
|
+
# =============================================================================
|
|
195
|
+
# Journal File
|
|
196
|
+
# =============================================================================
|
|
197
|
+
|
|
198
|
+
def get_active_journal_file(repo_root: Path | None = None) -> Path | None:
|
|
199
|
+
"""Get the current active journal file.
|
|
200
|
+
|
|
201
|
+
Args:
|
|
202
|
+
repo_root: Repository root path. Defaults to auto-detected.
|
|
203
|
+
|
|
204
|
+
Returns:
|
|
205
|
+
Path to active journal file or None if not found.
|
|
206
|
+
"""
|
|
207
|
+
if repo_root is None:
|
|
208
|
+
repo_root = get_repo_root()
|
|
209
|
+
|
|
210
|
+
workspace_dir = get_workspace_dir(repo_root)
|
|
211
|
+
if workspace_dir is None or not workspace_dir.is_dir():
|
|
212
|
+
return None
|
|
213
|
+
|
|
214
|
+
latest: Path | None = None
|
|
215
|
+
highest = 0
|
|
216
|
+
|
|
217
|
+
for f in workspace_dir.glob(f"{FILE_JOURNAL_PREFIX}*.md"):
|
|
218
|
+
if not f.is_file():
|
|
219
|
+
continue
|
|
220
|
+
|
|
221
|
+
# Extract number from filename
|
|
222
|
+
name = f.stem # e.g., "journal-1"
|
|
223
|
+
match = re.search(r"(\d+)$", name)
|
|
224
|
+
if match:
|
|
225
|
+
num = int(match.group(1))
|
|
226
|
+
if num > highest:
|
|
227
|
+
highest = num
|
|
228
|
+
latest = f
|
|
229
|
+
|
|
230
|
+
return latest
|
|
231
|
+
|
|
232
|
+
|
|
233
|
+
def count_lines(file_path: Path) -> int:
|
|
234
|
+
"""Count lines in a file.
|
|
235
|
+
|
|
236
|
+
Args:
|
|
237
|
+
file_path: Path to file.
|
|
238
|
+
|
|
239
|
+
Returns:
|
|
240
|
+
Number of lines, or 0 if file doesn't exist.
|
|
241
|
+
"""
|
|
242
|
+
if not file_path.is_file():
|
|
243
|
+
return 0
|
|
244
|
+
|
|
245
|
+
try:
|
|
246
|
+
return len(file_path.read_text(encoding="utf-8").splitlines())
|
|
247
|
+
except (OSError, IOError):
|
|
248
|
+
return 0
|
|
249
|
+
|
|
250
|
+
|
|
251
|
+
# =============================================================================
|
|
252
|
+
# Current Task Management
|
|
253
|
+
# =============================================================================
|
|
254
|
+
|
|
255
|
+
def normalize_task_ref(task_ref: str) -> str:
|
|
256
|
+
"""Normalize a task ref for stable runtime storage.
|
|
257
|
+
|
|
258
|
+
Stored refs should prefer repo-relative POSIX paths like
|
|
259
|
+
`.atw/tasks/03-27-my-task`, even on Windows. Absolute paths are preserved
|
|
260
|
+
unless they can later be converted back to repo-relative form by callers.
|
|
261
|
+
"""
|
|
262
|
+
normalized = task_ref.strip()
|
|
263
|
+
if not normalized:
|
|
264
|
+
return ""
|
|
265
|
+
|
|
266
|
+
path_obj = Path(normalized)
|
|
267
|
+
if path_obj.is_absolute():
|
|
268
|
+
return str(path_obj)
|
|
269
|
+
|
|
270
|
+
normalized = normalized.replace("\\", "/")
|
|
271
|
+
while normalized.startswith("./"):
|
|
272
|
+
normalized = normalized[2:]
|
|
273
|
+
|
|
274
|
+
if normalized.startswith(f"{DIR_TASKS}/"):
|
|
275
|
+
return f"{DIR_WORKFLOW}/{normalized}"
|
|
276
|
+
|
|
277
|
+
return normalized
|
|
278
|
+
|
|
279
|
+
|
|
280
|
+
def resolve_task_ref(task_ref: str, repo_root: Path | None = None) -> Path | None:
|
|
281
|
+
"""Resolve a task ref to an absolute task directory path inside the repo.
|
|
282
|
+
|
|
283
|
+
Returns None when the ref resolves outside `repo_root`. Every reader of the
|
|
284
|
+
active task — `task.py`, the shared hooks, the platform extensions — comes
|
|
285
|
+
through here, so containment is enforced at this one point rather than at
|
|
286
|
+
each call site.
|
|
287
|
+
|
|
288
|
+
It matters because a ref is not always something the user typed. It round
|
|
289
|
+
trips through the session pointer under `.atw/.runtime/sessions/`, and
|
|
290
|
+
`..` segments used to survive that trip intact: `_canonical_task_ref`
|
|
291
|
+
compares lexically, and a lexical `relative_to` accepts
|
|
292
|
+
`<root>/.atw/tasks/../../../elsewhere` because the string does start
|
|
293
|
+
with the root. The ref was then stored verbatim and replayed on every later
|
|
294
|
+
turn, so `task.py start .atw/tasks/../../../elsewhere` both rewrote that
|
|
295
|
+
directory's `task.json` and fed its files to the model.
|
|
296
|
+
|
|
297
|
+
Resolving here also normalises the path, so callers get a ref without `..`
|
|
298
|
+
to store.
|
|
299
|
+
"""
|
|
300
|
+
if repo_root is None:
|
|
301
|
+
repo_root = get_repo_root()
|
|
302
|
+
|
|
303
|
+
normalized = normalize_task_ref(task_ref)
|
|
304
|
+
if not normalized:
|
|
305
|
+
return None
|
|
306
|
+
|
|
307
|
+
try:
|
|
308
|
+
root = repo_root.resolve()
|
|
309
|
+
except OSError:
|
|
310
|
+
return None
|
|
311
|
+
|
|
312
|
+
path_obj = Path(normalized)
|
|
313
|
+
if path_obj.is_absolute():
|
|
314
|
+
candidate = path_obj
|
|
315
|
+
elif normalized.startswith(f"{DIR_WORKFLOW}/"):
|
|
316
|
+
candidate = root / path_obj
|
|
317
|
+
else:
|
|
318
|
+
candidate = root / DIR_WORKFLOW / DIR_TASKS / path_obj
|
|
319
|
+
|
|
320
|
+
# resolve() collapses `..` and follows symlinks, so a task directory that
|
|
321
|
+
# links outside the repo is refused too. Both sides are resolved because
|
|
322
|
+
# repo_root itself may sit behind a symlink (/tmp on macOS does).
|
|
323
|
+
try:
|
|
324
|
+
resolved = candidate.resolve()
|
|
325
|
+
workflow_real = (root / DIR_WORKFLOW).resolve()
|
|
326
|
+
except OSError:
|
|
327
|
+
return None
|
|
328
|
+
|
|
329
|
+
try:
|
|
330
|
+
resolved.relative_to(root)
|
|
331
|
+
return resolved
|
|
332
|
+
except ValueError:
|
|
333
|
+
pass
|
|
334
|
+
|
|
335
|
+
# `.atw` may itself be a symlink into a store outside the repo.
|
|
336
|
+
# The workflow dir's own real location is then a second legitimate
|
|
337
|
+
# containment base: a ref through that link never left the workflow tree.
|
|
338
|
+
# A ref that escapes BOTH bases (traversal, absolute path elsewhere, a
|
|
339
|
+
# task dir symlinked out of the tree) is still refused.
|
|
340
|
+
try:
|
|
341
|
+
rel = resolved.relative_to(workflow_real)
|
|
342
|
+
except ValueError:
|
|
343
|
+
return None
|
|
344
|
+
|
|
345
|
+
# Map back to the in-repo (lexical) form so callers store the same
|
|
346
|
+
# repo-relative ref as in the non-symlinked layout.
|
|
347
|
+
return root / DIR_WORKFLOW / rel
|
|
348
|
+
|
|
349
|
+
|
|
350
|
+
def get_current_task(
|
|
351
|
+
repo_root: Path | None = None,
|
|
352
|
+
platform_input: dict | None = None,
|
|
353
|
+
platform: str | None = None,
|
|
354
|
+
) -> str | None:
|
|
355
|
+
"""Get current task directory path (relative to repo_root).
|
|
356
|
+
|
|
357
|
+
Args:
|
|
358
|
+
repo_root: Repository root path. Defaults to auto-detected.
|
|
359
|
+
|
|
360
|
+
Returns:
|
|
361
|
+
Relative path to current task directory or None.
|
|
362
|
+
"""
|
|
363
|
+
if repo_root is None:
|
|
364
|
+
repo_root = get_repo_root()
|
|
365
|
+
|
|
366
|
+
from .active_task import resolve_active_task
|
|
367
|
+
|
|
368
|
+
return resolve_active_task(repo_root, platform_input, platform).task_path
|
|
369
|
+
|
|
370
|
+
|
|
371
|
+
def get_current_task_abs(
|
|
372
|
+
repo_root: Path | None = None,
|
|
373
|
+
platform_input: dict | None = None,
|
|
374
|
+
platform: str | None = None,
|
|
375
|
+
) -> Path | None:
|
|
376
|
+
"""Get current task directory absolute path.
|
|
377
|
+
|
|
378
|
+
Args:
|
|
379
|
+
repo_root: Repository root path. Defaults to auto-detected.
|
|
380
|
+
|
|
381
|
+
Returns:
|
|
382
|
+
Absolute path to current task directory or None.
|
|
383
|
+
"""
|
|
384
|
+
if repo_root is None:
|
|
385
|
+
repo_root = get_repo_root()
|
|
386
|
+
|
|
387
|
+
relative = get_current_task(repo_root, platform_input, platform)
|
|
388
|
+
if relative:
|
|
389
|
+
return resolve_task_ref(relative, repo_root)
|
|
390
|
+
return None
|
|
391
|
+
|
|
392
|
+
|
|
393
|
+
def get_current_task_source(
|
|
394
|
+
repo_root: Path | None = None,
|
|
395
|
+
platform_input: dict | None = None,
|
|
396
|
+
platform: str | None = None,
|
|
397
|
+
) -> tuple[str, str | None, str | None]:
|
|
398
|
+
"""Get active task source as (`source`, `context_key`, `task_path`)."""
|
|
399
|
+
if repo_root is None:
|
|
400
|
+
repo_root = get_repo_root()
|
|
401
|
+
|
|
402
|
+
from .active_task import get_current_task_source as _get_source
|
|
403
|
+
|
|
404
|
+
return _get_source(repo_root, platform_input, platform)
|
|
405
|
+
|
|
406
|
+
|
|
407
|
+
def set_current_task(
|
|
408
|
+
task_path: str,
|
|
409
|
+
repo_root: Path | None = None,
|
|
410
|
+
platform_input: dict | None = None,
|
|
411
|
+
platform: str | None = None,
|
|
412
|
+
) -> bool:
|
|
413
|
+
"""Set current task in session scope.
|
|
414
|
+
|
|
415
|
+
Args:
|
|
416
|
+
task_path: Task directory path (relative to repo_root).
|
|
417
|
+
repo_root: Repository root path. Defaults to auto-detected.
|
|
418
|
+
|
|
419
|
+
Returns:
|
|
420
|
+
True on success, False on error.
|
|
421
|
+
"""
|
|
422
|
+
if repo_root is None:
|
|
423
|
+
repo_root = get_repo_root()
|
|
424
|
+
|
|
425
|
+
from .active_task import set_active_task
|
|
426
|
+
|
|
427
|
+
return set_active_task(
|
|
428
|
+
task_path,
|
|
429
|
+
repo_root,
|
|
430
|
+
platform_input=platform_input,
|
|
431
|
+
platform=platform,
|
|
432
|
+
) is not None
|
|
433
|
+
|
|
434
|
+
|
|
435
|
+
def clear_current_task(
|
|
436
|
+
repo_root: Path | None = None,
|
|
437
|
+
platform_input: dict | None = None,
|
|
438
|
+
platform: str | None = None,
|
|
439
|
+
) -> bool:
|
|
440
|
+
"""Clear current task in session scope.
|
|
441
|
+
|
|
442
|
+
Args:
|
|
443
|
+
repo_root: Repository root path. Defaults to auto-detected.
|
|
444
|
+
|
|
445
|
+
Returns:
|
|
446
|
+
True on success.
|
|
447
|
+
"""
|
|
448
|
+
if repo_root is None:
|
|
449
|
+
repo_root = get_repo_root()
|
|
450
|
+
|
|
451
|
+
from .active_task import clear_active_task
|
|
452
|
+
|
|
453
|
+
clear_active_task(
|
|
454
|
+
repo_root,
|
|
455
|
+
platform_input=platform_input,
|
|
456
|
+
platform=platform,
|
|
457
|
+
)
|
|
458
|
+
return True
|
|
459
|
+
|
|
460
|
+
|
|
461
|
+
def has_current_task(repo_root: Path | None = None) -> bool:
|
|
462
|
+
"""Check if has current task.
|
|
463
|
+
|
|
464
|
+
Args:
|
|
465
|
+
repo_root: Repository root path. Defaults to auto-detected.
|
|
466
|
+
|
|
467
|
+
Returns:
|
|
468
|
+
True if current task is set.
|
|
469
|
+
"""
|
|
470
|
+
return get_current_task(repo_root) is not None
|
|
471
|
+
|
|
472
|
+
|
|
473
|
+
# =============================================================================
|
|
474
|
+
# Task ID Generation
|
|
475
|
+
# =============================================================================
|
|
476
|
+
|
|
477
|
+
def generate_task_date_prefix() -> str:
|
|
478
|
+
"""Generate task ID based on date (MM-DD format).
|
|
479
|
+
|
|
480
|
+
Returns:
|
|
481
|
+
Date prefix string (e.g., "01-21").
|
|
482
|
+
"""
|
|
483
|
+
return datetime.now().strftime("%m-%d")
|
|
484
|
+
|
|
485
|
+
|
|
486
|
+
# =============================================================================
|
|
487
|
+
# Monorepo / Package Paths
|
|
488
|
+
# =============================================================================
|
|
489
|
+
|
|
490
|
+
|
|
491
|
+
def get_spec_dir(package: str | None = None, repo_root: Path | None = None) -> Path:
|
|
492
|
+
"""Get the spec directory path.
|
|
493
|
+
|
|
494
|
+
Single-repo: .atw/spec
|
|
495
|
+
Monorepo with package: .atw/spec/<package>
|
|
496
|
+
|
|
497
|
+
Uses lazy import to avoid circular dependency with config.py.
|
|
498
|
+
"""
|
|
499
|
+
if repo_root is None:
|
|
500
|
+
repo_root = get_repo_root()
|
|
501
|
+
|
|
502
|
+
from .config import get_spec_base
|
|
503
|
+
|
|
504
|
+
base = get_spec_base(package, repo_root)
|
|
505
|
+
return repo_root / DIR_WORKFLOW / base
|
|
506
|
+
|
|
507
|
+
|
|
508
|
+
def get_package_path(package: str, repo_root: Path | None = None) -> Path | None:
|
|
509
|
+
"""Get a package's source directory absolute path from config.
|
|
510
|
+
|
|
511
|
+
Returns:
|
|
512
|
+
Absolute path to the package directory, or None if not found.
|
|
513
|
+
"""
|
|
514
|
+
if repo_root is None:
|
|
515
|
+
repo_root = get_repo_root()
|
|
516
|
+
|
|
517
|
+
from .config import get_packages
|
|
518
|
+
|
|
519
|
+
packages = get_packages(repo_root)
|
|
520
|
+
if not packages or package not in packages:
|
|
521
|
+
return None
|
|
522
|
+
|
|
523
|
+
info = packages[package]
|
|
524
|
+
if isinstance(info, dict):
|
|
525
|
+
rel_path = info.get("path", package)
|
|
526
|
+
else:
|
|
527
|
+
rel_path = str(info)
|
|
528
|
+
|
|
529
|
+
return repo_root / rel_path
|
|
530
|
+
|
|
531
|
+
|
|
532
|
+
# =============================================================================
|
|
533
|
+
# Main Entry (for testing)
|
|
534
|
+
# =============================================================================
|
|
535
|
+
|
|
536
|
+
if __name__ == "__main__":
|
|
537
|
+
repo = get_repo_root()
|
|
538
|
+
print(f"Repository root: {repo}")
|
|
539
|
+
print(f"Developer: {get_developer(repo)}")
|
|
540
|
+
print(f"Tasks dir: {get_tasks_dir(repo)}")
|
|
541
|
+
print(f"Workspace dir: {get_workspace_dir(repo)}")
|
|
542
|
+
print(f"Journal file: {get_active_journal_file(repo)}")
|
|
543
|
+
print(f"Current task: {get_current_task(repo)}")
|