@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,495 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""票解析器 —— 安装到 .atw/scripts/tickets.py。
|
|
3
|
+
|
|
4
|
+
list 列出所有票 + Impl 状态
|
|
5
|
+
frontier 算出「Impl: ready + Blocked by 全部 done」的票
|
|
6
|
+
claim <NN> 校验在 frontier 里 → Impl: doing
|
|
7
|
+
→ 记 implementation_base_sha
|
|
8
|
+
→ 把该票路径写进 <task>/check.jsonl
|
|
9
|
+
done <NN> 标记 Impl: done,并撤掉 check.jsonl 里的那行
|
|
10
|
+
summary 汇总一行,给 workflow-state 用
|
|
11
|
+
selfcheck 跑内置断言,不依赖仓库状态
|
|
12
|
+
|
|
13
|
+
硬校验(直接拒绝,不是警告):
|
|
14
|
+
Blocker 引用不存在 → 失败
|
|
15
|
+
Blocker 形成环 → 失败
|
|
16
|
+
claim 不在 frontier 里的票 → 失败
|
|
17
|
+
已有别的票在 doing → 失败(票默认串行)
|
|
18
|
+
|
|
19
|
+
不要把这些函数塞进 task_utils.py / task.py:票是任务目录里的一层,任务目录和
|
|
20
|
+
meta 的读写一律走 task.py,本脚本不直接写 task.json。
|
|
21
|
+
"""
|
|
22
|
+
from __future__ import annotations
|
|
23
|
+
|
|
24
|
+
import argparse
|
|
25
|
+
import json
|
|
26
|
+
import re
|
|
27
|
+
import subprocess
|
|
28
|
+
import sys
|
|
29
|
+
import tempfile
|
|
30
|
+
from dataclasses import dataclass, field
|
|
31
|
+
from pathlib import Path
|
|
32
|
+
|
|
33
|
+
from common.paths import DIR_SCRIPTS, DIR_WORKFLOW, get_repo_root
|
|
34
|
+
|
|
35
|
+
IMPL_STATES = ("ready", "doing", "done")
|
|
36
|
+
|
|
37
|
+
# 票文件名形如 01-slug.md,编号即前缀
|
|
38
|
+
RE_TICKET_FILE = re.compile(r"^(\d+)-.+\.md$")
|
|
39
|
+
# Blocked by 里允许 "01"、"#01"、"1" 三种写法
|
|
40
|
+
RE_BLOCKER = re.compile(r"#?(\d+)")
|
|
41
|
+
|
|
42
|
+
# 当前票写进 check.jsonl —— 审查轴拿它当规格来对,实现轴也读得到。
|
|
43
|
+
# 我们只动带这个 reason 的行,用户手工加的条目原样保留。
|
|
44
|
+
MANAGED_REASON = "ATW current ticket"
|
|
45
|
+
MANIFEST_NAME = "check.jsonl"
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
def field_pattern(name: str) -> re.Pattern[str]:
|
|
49
|
+
"""匹配 `**Impl:** doing` 这类字段行。"""
|
|
50
|
+
return re.compile(rf"^\*\*{re.escape(name)}:\*\*[ \t]*(.*)$", re.MULTILINE)
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
RE_IMPL = field_pattern("Impl")
|
|
54
|
+
RE_BLOCKED_BY = field_pattern("Blocked by")
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
@dataclass
|
|
58
|
+
class Ticket:
|
|
59
|
+
num: int
|
|
60
|
+
path: Path
|
|
61
|
+
impl: str
|
|
62
|
+
blockers: list[int] = field(default_factory=list)
|
|
63
|
+
|
|
64
|
+
@property
|
|
65
|
+
def label(self) -> str:
|
|
66
|
+
return self.path.stem
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
class TicketError(Exception):
|
|
70
|
+
"""所有硬校验失败都走这里,main 统一转成退出码 1。"""
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
# ---------------------------------------------------------------------------
|
|
74
|
+
# 解析(纯函数,selfcheck 直接驱动这一层)
|
|
75
|
+
# ---------------------------------------------------------------------------
|
|
76
|
+
|
|
77
|
+
def parse_ticket(path: Path) -> Ticket:
|
|
78
|
+
m = RE_TICKET_FILE.match(path.name)
|
|
79
|
+
if not m:
|
|
80
|
+
raise TicketError(f"票文件名不是 NN-slug.md 形式:{path.name}")
|
|
81
|
+
text = path.read_text(encoding="utf-8")
|
|
82
|
+
|
|
83
|
+
impl_match = RE_IMPL.search(text)
|
|
84
|
+
if impl_match is None:
|
|
85
|
+
raise TicketError(
|
|
86
|
+
f"{path.name} 缺少 **Impl:** 字段。"
|
|
87
|
+
" 这个字段由票模板写入,缺了说明票不是按模板生成的。"
|
|
88
|
+
)
|
|
89
|
+
impl = impl_match.group(1).strip().lower()
|
|
90
|
+
if impl not in IMPL_STATES:
|
|
91
|
+
raise TicketError(
|
|
92
|
+
f"{path.name} 的 **Impl:** 是 {impl!r},只允许 {'/'.join(IMPL_STATES)}"
|
|
93
|
+
)
|
|
94
|
+
|
|
95
|
+
blocked_match = RE_BLOCKED_BY.search(text)
|
|
96
|
+
raw = blocked_match.group(1).strip() if blocked_match else ""
|
|
97
|
+
blockers = [] if raw.lower() in ("", "none", "-", "无") else [
|
|
98
|
+
int(x) for x in RE_BLOCKER.findall(raw)
|
|
99
|
+
]
|
|
100
|
+
return Ticket(num=int(m.group(1)), path=path, impl=impl, blockers=blockers)
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
def load_tickets(issues_dir: Path) -> list[Ticket]:
|
|
104
|
+
if not issues_dir.is_dir():
|
|
105
|
+
return []
|
|
106
|
+
tickets = [parse_ticket(p) for p in sorted(issues_dir.glob("*.md"))]
|
|
107
|
+
seen: dict[int, Path] = {}
|
|
108
|
+
for t in tickets:
|
|
109
|
+
if t.num in seen:
|
|
110
|
+
raise TicketError(f"票号 {t.num:02d} 重复:{seen[t.num].name} 和 {t.path.name}")
|
|
111
|
+
seen[t.num] = t.path
|
|
112
|
+
validate(tickets)
|
|
113
|
+
return tickets
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
def validate(tickets: list[Ticket]) -> None:
|
|
117
|
+
by_num = {t.num: t for t in tickets}
|
|
118
|
+
for t in tickets:
|
|
119
|
+
for b in t.blockers:
|
|
120
|
+
if b not in by_num:
|
|
121
|
+
raise TicketError(f"{t.label} 的 Blocked by 指向不存在的票 {b:02d}")
|
|
122
|
+
|
|
123
|
+
# 环检测:白=未访问 / 灰=在当前递归栈上 / 黑=已确认无环
|
|
124
|
+
color: dict[int, str] = {t.num: "white" for t in tickets}
|
|
125
|
+
stack: list[int] = []
|
|
126
|
+
|
|
127
|
+
def walk(num: int) -> None:
|
|
128
|
+
color[num] = "grey"
|
|
129
|
+
stack.append(num)
|
|
130
|
+
for nxt in by_num[num].blockers:
|
|
131
|
+
if color[nxt] == "grey":
|
|
132
|
+
cycle = stack[stack.index(nxt):] + [nxt]
|
|
133
|
+
raise TicketError(
|
|
134
|
+
"Blocker 形成环:" + " → ".join(f"{n:02d}" for n in cycle)
|
|
135
|
+
)
|
|
136
|
+
if color[nxt] == "white":
|
|
137
|
+
walk(nxt)
|
|
138
|
+
stack.pop()
|
|
139
|
+
color[num] = "black"
|
|
140
|
+
|
|
141
|
+
for t in tickets:
|
|
142
|
+
if color[t.num] == "white":
|
|
143
|
+
walk(t.num)
|
|
144
|
+
|
|
145
|
+
|
|
146
|
+
def frontier(tickets: list[Ticket]) -> list[Ticket]:
|
|
147
|
+
by_num = {t.num: t for t in tickets}
|
|
148
|
+
return [
|
|
149
|
+
t for t in tickets
|
|
150
|
+
if t.impl == "ready" and all(by_num[b].impl == "done" for b in t.blockers)
|
|
151
|
+
]
|
|
152
|
+
|
|
153
|
+
|
|
154
|
+
def set_impl(ticket: Ticket, state: str) -> None:
|
|
155
|
+
text = ticket.path.read_text(encoding="utf-8")
|
|
156
|
+
new_text, n = RE_IMPL.subn(f"**Impl:** {state}", text, count=1)
|
|
157
|
+
if n != 1:
|
|
158
|
+
raise TicketError(f"{ticket.label} 的 **Impl:** 字段写回失败")
|
|
159
|
+
ticket.path.write_text(new_text, encoding="utf-8")
|
|
160
|
+
ticket.impl = state
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
# ---------------------------------------------------------------------------
|
|
164
|
+
# task.py 交界面
|
|
165
|
+
# ---------------------------------------------------------------------------
|
|
166
|
+
|
|
167
|
+
def repo_root() -> Path:
|
|
168
|
+
"""仓库根一律走 paths.get_repo_root(认 .atw/),不问 git。
|
|
169
|
+
|
|
170
|
+
票在任务目录里,任务目录在 .atw/ 下——用 `git rev-parse` 会把一个还没
|
|
171
|
+
`git init` 的项目判成「不是仓库」,票循环跟着一起停摆。
|
|
172
|
+
"""
|
|
173
|
+
return get_repo_root().resolve()
|
|
174
|
+
|
|
175
|
+
|
|
176
|
+
def run(cmd: list[str], err: str, cwd: Path | None = None) -> str:
|
|
177
|
+
proc = subprocess.run(cmd, capture_output=True, text=True, cwd=cwd)
|
|
178
|
+
if proc.returncode != 0:
|
|
179
|
+
raise TicketError(f"{err}:{proc.stderr.strip() or proc.stdout.strip()}")
|
|
180
|
+
return proc.stdout.strip()
|
|
181
|
+
|
|
182
|
+
|
|
183
|
+
def task_py(root: Path) -> str:
|
|
184
|
+
return str(root / DIR_WORKFLOW / DIR_SCRIPTS / "task.py")
|
|
185
|
+
|
|
186
|
+
|
|
187
|
+
def task_dir(root: Path, override: str | None) -> Path:
|
|
188
|
+
"""任务目录一律问 task.py,不自己解析 Session Pointer。"""
|
|
189
|
+
if override:
|
|
190
|
+
return (root / override).resolve()
|
|
191
|
+
out = run(
|
|
192
|
+
[sys.executable, task_py(root), "current", "--json"],
|
|
193
|
+
"没有 Active Task —— 先 task.py start,不要退回 .scratch/",
|
|
194
|
+
cwd=root,
|
|
195
|
+
)
|
|
196
|
+
rel = (json.loads(out).get("current_task") or {}).get("dir")
|
|
197
|
+
if not rel:
|
|
198
|
+
raise TicketError("没有 Active Task")
|
|
199
|
+
return (root / rel).resolve()
|
|
200
|
+
|
|
201
|
+
|
|
202
|
+
def set_meta(root: Path, task: Path, key: str, value: str) -> None:
|
|
203
|
+
run(
|
|
204
|
+
[
|
|
205
|
+
sys.executable, task_py(root), "set-meta",
|
|
206
|
+
str(task.relative_to(root)), key, value,
|
|
207
|
+
],
|
|
208
|
+
f"写 meta.{key} 失败",
|
|
209
|
+
cwd=root,
|
|
210
|
+
)
|
|
211
|
+
|
|
212
|
+
|
|
213
|
+
def record_base_sha(root: Path, task: Path) -> None:
|
|
214
|
+
"""记下 claim 时刻的 HEAD —— code-review 拿它当 diff 基线。
|
|
215
|
+
|
|
216
|
+
仓库还没有 commit(新项目的第一张票)时 `git rev-parse HEAD` 必然失败。
|
|
217
|
+
那种情况下基线就是「空仓库」,本来也没有 diff 可对,所以警告一声继续,
|
|
218
|
+
不能让第一张票 claim 不动。
|
|
219
|
+
"""
|
|
220
|
+
proc = subprocess.run(
|
|
221
|
+
["git", "rev-parse", "HEAD"], capture_output=True, text=True, cwd=root
|
|
222
|
+
)
|
|
223
|
+
if proc.returncode != 0:
|
|
224
|
+
print(
|
|
225
|
+
"警告:取不到 HEAD(仓库还没有 commit?),"
|
|
226
|
+
"implementation_base_sha 未记录,code-review 需自行指定基线",
|
|
227
|
+
file=sys.stderr,
|
|
228
|
+
)
|
|
229
|
+
return
|
|
230
|
+
set_meta(root, task, "implementation_base_sha", proc.stdout.strip())
|
|
231
|
+
|
|
232
|
+
|
|
233
|
+
def rewrite_manifest(root: Path, task: Path, ticket: Ticket | None) -> None:
|
|
234
|
+
"""把当前票写进 check.jsonl —— 子代理拿到票的唯一通路。
|
|
235
|
+
|
|
236
|
+
task.py 只有 add-context,没有删除命令,所以切票必须自己重写:先滤掉我们
|
|
237
|
+
上一次写的那行(靠 MANAGED_REASON 认领),再按需追加新的。
|
|
238
|
+
"""
|
|
239
|
+
manifest = task / MANIFEST_NAME
|
|
240
|
+
lines: list[str] = []
|
|
241
|
+
if manifest.exists():
|
|
242
|
+
for line in manifest.read_text(encoding="utf-8").splitlines():
|
|
243
|
+
if not line.strip():
|
|
244
|
+
continue
|
|
245
|
+
try:
|
|
246
|
+
if json.loads(line).get("reason") == MANAGED_REASON:
|
|
247
|
+
continue
|
|
248
|
+
except json.JSONDecodeError:
|
|
249
|
+
raise TicketError(f"{MANIFEST_NAME} 有非法 JSON 行:{line[:60]}")
|
|
250
|
+
lines.append(line)
|
|
251
|
+
if ticket is not None:
|
|
252
|
+
rel = ticket.path.resolve().relative_to(root).as_posix()
|
|
253
|
+
lines.append(json.dumps(
|
|
254
|
+
{"file": rel, "reason": MANAGED_REASON}, ensure_ascii=False
|
|
255
|
+
))
|
|
256
|
+
manifest.write_text("".join(f"{l}\n" for l in lines), encoding="utf-8")
|
|
257
|
+
|
|
258
|
+
|
|
259
|
+
# ---------------------------------------------------------------------------
|
|
260
|
+
# 命令
|
|
261
|
+
# ---------------------------------------------------------------------------
|
|
262
|
+
|
|
263
|
+
def pick(tickets: list[Ticket], num: str) -> Ticket:
|
|
264
|
+
for t in tickets:
|
|
265
|
+
if t.num == int(num):
|
|
266
|
+
return t
|
|
267
|
+
raise TicketError(f"没有编号为 {num} 的票")
|
|
268
|
+
|
|
269
|
+
|
|
270
|
+
def cmd_list(tickets: list[Ticket], **_) -> int:
|
|
271
|
+
if not tickets:
|
|
272
|
+
print("(没有票)")
|
|
273
|
+
return 0
|
|
274
|
+
open_nums = {t.num for t in frontier(tickets)}
|
|
275
|
+
for t in tickets:
|
|
276
|
+
mark = " ←frontier" if t.num in open_nums else ""
|
|
277
|
+
blockers = ", ".join(f"{b:02d}" for b in t.blockers) or "-"
|
|
278
|
+
print(f"{t.num:02d} {t.impl:<5} blocked-by: {blockers:<12} {t.label}{mark}")
|
|
279
|
+
return 0
|
|
280
|
+
|
|
281
|
+
|
|
282
|
+
def cmd_frontier(tickets: list[Ticket], **_) -> int:
|
|
283
|
+
ready = frontier(tickets)
|
|
284
|
+
if not ready:
|
|
285
|
+
print("(frontier 为空)")
|
|
286
|
+
return 0
|
|
287
|
+
for t in ready:
|
|
288
|
+
print(f"{t.num:02d} {t.label}")
|
|
289
|
+
return 0
|
|
290
|
+
|
|
291
|
+
|
|
292
|
+
def cmd_claim(tickets: list[Ticket], root: Path, task: Path, num: str, **_) -> int:
|
|
293
|
+
target = pick(tickets, num)
|
|
294
|
+
if target.impl == "doing":
|
|
295
|
+
print(f"{target.label} 已经在 doing,无需重复 claim")
|
|
296
|
+
return 0
|
|
297
|
+
# 票默认串行:同一任务一次只推进一张
|
|
298
|
+
busy = [t for t in tickets if t.impl == "doing"]
|
|
299
|
+
if busy:
|
|
300
|
+
raise TicketError(
|
|
301
|
+
f"{busy[0].label} 还在 doing。票默认串行,先 done 它再 claim 下一张"
|
|
302
|
+
)
|
|
303
|
+
if target not in frontier(tickets):
|
|
304
|
+
blocked = [f"{b:02d}" for b in target.blockers
|
|
305
|
+
if pick(tickets, str(b)).impl != "done"]
|
|
306
|
+
reason = f"未完成的 Blocker:{', '.join(blocked)}" if blocked \
|
|
307
|
+
else f"Impl 是 {target.impl},不是 ready"
|
|
308
|
+
raise TicketError(f"{target.label} 不在 frontier 里({reason})")
|
|
309
|
+
|
|
310
|
+
set_impl(target, "doing")
|
|
311
|
+
record_base_sha(root, task)
|
|
312
|
+
rewrite_manifest(root, task, target)
|
|
313
|
+
print(f"claimed {target.label} → Impl: doing")
|
|
314
|
+
return 0
|
|
315
|
+
|
|
316
|
+
|
|
317
|
+
def cmd_done(tickets: list[Ticket], root: Path, task: Path, num: str, **_) -> int:
|
|
318
|
+
target = pick(tickets, num)
|
|
319
|
+
if target.impl == "done":
|
|
320
|
+
print(f"{target.label} 已经是 done")
|
|
321
|
+
return 0
|
|
322
|
+
# ready 直接跳 done 会绕过 claim,implementation_base_sha 停在上一张票,
|
|
323
|
+
# 之后的 code-review 会拿错基线去 diff —— 状态看着对,审的范围是错的。
|
|
324
|
+
if target.impl != "doing":
|
|
325
|
+
raise TicketError(
|
|
326
|
+
f"{target.label} 的 Impl 是 {target.impl},不是 doing。"
|
|
327
|
+
f"先 claim {num} 再 done —— 跳过 claim 会让 implementation_base_sha "
|
|
328
|
+
"停在上一张票,code-review 的 diff 基线就错了"
|
|
329
|
+
)
|
|
330
|
+
set_impl(target, "done")
|
|
331
|
+
rewrite_manifest(root, task, None)
|
|
332
|
+
left = frontier(tickets)
|
|
333
|
+
if not left and all(t.impl == "done" for t in tickets):
|
|
334
|
+
# 实测过一次:三张票全 done,但没人推挡位,归档门禁卡住且没人知道为什么
|
|
335
|
+
print(f"{target.label} → Impl: done。全部票已完成 —— "
|
|
336
|
+
f"下一步 `task.py set-status {task} accept`")
|
|
337
|
+
return 0
|
|
338
|
+
nxt = "、".join(f"{t.num:02d}" for t in left) or "无(全部完成或被阻塞)"
|
|
339
|
+
print(f"{target.label} → Impl: done。下一批可开工:{nxt}")
|
|
340
|
+
return 0
|
|
341
|
+
|
|
342
|
+
|
|
343
|
+
def cmd_summary(tickets: list[Ticket], **_) -> int:
|
|
344
|
+
if not tickets:
|
|
345
|
+
print("票 0 张")
|
|
346
|
+
return 0
|
|
347
|
+
doing = [t for t in tickets if t.impl == "doing"]
|
|
348
|
+
done = [t for t in tickets if t.impl == "done"]
|
|
349
|
+
parts = [f"票 {len(tickets)} 张", f"done {len(done)}"]
|
|
350
|
+
parts.append(f"doing {doing[0].label}" if doing else "doing -")
|
|
351
|
+
parts.append("frontier " + ("、".join(f"{t.num:02d}" for t in frontier(tickets)) or "-"))
|
|
352
|
+
print(" | ".join(parts))
|
|
353
|
+
return 0
|
|
354
|
+
|
|
355
|
+
|
|
356
|
+
# ---------------------------------------------------------------------------
|
|
357
|
+
# 自检:只驱动纯函数,不需要仓库、Active Task 或 git
|
|
358
|
+
# ---------------------------------------------------------------------------
|
|
359
|
+
|
|
360
|
+
TICKET_TMPL = """# {num:02d} — {slug}
|
|
361
|
+
|
|
362
|
+
**Status:** ready-for-agent
|
|
363
|
+
**Impl:** {impl}
|
|
364
|
+
**Blocked by:** {blocked}
|
|
365
|
+
**Issue:**
|
|
366
|
+
|
|
367
|
+
## What to build
|
|
368
|
+
略
|
|
369
|
+
"""
|
|
370
|
+
|
|
371
|
+
|
|
372
|
+
def cmd_selfcheck(**_) -> int:
|
|
373
|
+
def build(tmp: Path, specs) -> list[Ticket]:
|
|
374
|
+
for n, impl, blocked in specs:
|
|
375
|
+
(tmp / f"{n:02d}-t{n}.md").write_text(
|
|
376
|
+
TICKET_TMPL.format(num=n, slug=f"t{n}", impl=impl, blocked=blocked),
|
|
377
|
+
encoding="utf-8",
|
|
378
|
+
)
|
|
379
|
+
return load_tickets(tmp)
|
|
380
|
+
|
|
381
|
+
def fails(fn, needle: str) -> None:
|
|
382
|
+
try:
|
|
383
|
+
fn()
|
|
384
|
+
except TicketError as e:
|
|
385
|
+
assert needle in str(e), f"错误信息不含 {needle!r}:{e}"
|
|
386
|
+
return
|
|
387
|
+
raise AssertionError(f"本该失败却通过了(期望 {needle!r})")
|
|
388
|
+
|
|
389
|
+
with tempfile.TemporaryDirectory() as d:
|
|
390
|
+
tmp = Path(d)
|
|
391
|
+
|
|
392
|
+
# 01 无阻塞、02 被 01 挡、03 的阻塞已 done
|
|
393
|
+
ts = build(tmp, [(1, "ready", "none"), (2, "ready", "01"), (3, "ready", "04"),
|
|
394
|
+
(4, "done", "none")])
|
|
395
|
+
assert [t.num for t in frontier(ts)] == [1, 3], [t.num for t in frontier(ts)]
|
|
396
|
+
|
|
397
|
+
# 01 做完后 02 进入 frontier
|
|
398
|
+
set_impl(ts[0], "done")
|
|
399
|
+
assert [t.num for t in frontier(load_tickets(tmp))] == [2, 3]
|
|
400
|
+
|
|
401
|
+
# doing 的票不算 frontier —— 否则会被重复认领
|
|
402
|
+
set_impl(ts[1], "doing")
|
|
403
|
+
assert [t.num for t in frontier(load_tickets(tmp))] == [3]
|
|
404
|
+
|
|
405
|
+
with tempfile.TemporaryDirectory() as d:
|
|
406
|
+
tmp = Path(d)
|
|
407
|
+
# ready 直接 done 必须被拒 —— 绕过 claim 就没写 implementation_base_sha
|
|
408
|
+
ts = build(tmp, [(1, "ready", "none"), (2, "doing", "none")])
|
|
409
|
+
fails(lambda: cmd_done(ts, tmp, tmp, "01"), "不是 doing")
|
|
410
|
+
assert load_tickets(tmp)[0].impl == "ready", "被拒之后不该改动票"
|
|
411
|
+
# doing 的票正常收掉
|
|
412
|
+
assert cmd_done(ts, tmp, tmp, "02") == 0
|
|
413
|
+
assert load_tickets(tmp)[1].impl == "done"
|
|
414
|
+
# 重复 done 幂等,不报错
|
|
415
|
+
assert cmd_done(load_tickets(tmp), tmp, tmp, "02") == 0
|
|
416
|
+
|
|
417
|
+
with tempfile.TemporaryDirectory() as d:
|
|
418
|
+
tmp = Path(d)
|
|
419
|
+
fails(lambda: build(tmp, [(1, "ready", "09")]), "不存在的票")
|
|
420
|
+
|
|
421
|
+
with tempfile.TemporaryDirectory() as d:
|
|
422
|
+
tmp = Path(d)
|
|
423
|
+
fails(lambda: build(tmp, [(1, "ready", "02"), (2, "ready", "01")]), "形成环")
|
|
424
|
+
|
|
425
|
+
with tempfile.TemporaryDirectory() as d:
|
|
426
|
+
tmp = Path(d)
|
|
427
|
+
fails(lambda: build(tmp, [(1, "ready", "01")]), "形成环") # 自环
|
|
428
|
+
|
|
429
|
+
with tempfile.TemporaryDirectory() as d:
|
|
430
|
+
tmp = Path(d)
|
|
431
|
+
fails(lambda: build(tmp, [(1, "claimed", "none")]), "只允许")
|
|
432
|
+
|
|
433
|
+
with tempfile.TemporaryDirectory() as d:
|
|
434
|
+
tmp = Path(d)
|
|
435
|
+
(tmp / "01-t1.md").write_text("# 01\n\n**Status:** ready-for-agent\n",
|
|
436
|
+
encoding="utf-8")
|
|
437
|
+
fails(lambda: load_tickets(tmp), "缺少 **Impl:** 字段")
|
|
438
|
+
|
|
439
|
+
# check.jsonl:只换自己写的行,用户手工加的条目原样保留
|
|
440
|
+
with tempfile.TemporaryDirectory() as d:
|
|
441
|
+
root = Path(d).resolve() # macOS 的 /var 是 /private/var 的软链,两边都要 resolve
|
|
442
|
+
task = root / DIR_WORKFLOW / "tasks/demo"
|
|
443
|
+
issues = task / "issues"
|
|
444
|
+
issues.mkdir(parents=True)
|
|
445
|
+
ts = build(issues, [(1, "ready", "none"), (2, "ready", "none")])
|
|
446
|
+
manifest = task / MANIFEST_NAME
|
|
447
|
+
manifest.write_text(
|
|
448
|
+
json.dumps({"file": "docs/adr/0001.md", "reason": "手工加的"}) + "\n",
|
|
449
|
+
encoding="utf-8",
|
|
450
|
+
)
|
|
451
|
+
rewrite_manifest(root, task, ts[0])
|
|
452
|
+
rewrite_manifest(root, task, ts[1]) # 切票
|
|
453
|
+
rows = [json.loads(l) for l in manifest.read_text(encoding="utf-8").splitlines()]
|
|
454
|
+
assert len(rows) == 2, rows
|
|
455
|
+
assert rows[0]["reason"] == "手工加的"
|
|
456
|
+
assert rows[1]["file"].endswith("02-t2.md"), rows[1]
|
|
457
|
+
rewrite_manifest(root, task, None) # done 之后撤掉
|
|
458
|
+
rows = [json.loads(l) for l in manifest.read_text(encoding="utf-8").splitlines()]
|
|
459
|
+
assert len(rows) == 1 and rows[0]["reason"] == "手工加的", rows
|
|
460
|
+
|
|
461
|
+
print("selfcheck 通过")
|
|
462
|
+
return 0
|
|
463
|
+
|
|
464
|
+
|
|
465
|
+
COMMANDS = {
|
|
466
|
+
"list": cmd_list, "frontier": cmd_frontier, "claim": cmd_claim,
|
|
467
|
+
"done": cmd_done, "summary": cmd_summary, "selfcheck": cmd_selfcheck,
|
|
468
|
+
}
|
|
469
|
+
|
|
470
|
+
|
|
471
|
+
def main(argv: list[str] | None = None) -> int:
|
|
472
|
+
p = argparse.ArgumentParser(description="ATW 票解析器")
|
|
473
|
+
p.add_argument("command", choices=sorted(COMMANDS))
|
|
474
|
+
p.add_argument("num", nargs="?", help="票号,claim / done 用")
|
|
475
|
+
p.add_argument("--task-dir", help="仓库相对的任务目录,缺省问 task.py current")
|
|
476
|
+
args = p.parse_args(argv)
|
|
477
|
+
|
|
478
|
+
try:
|
|
479
|
+
if args.command == "selfcheck":
|
|
480
|
+
return cmd_selfcheck()
|
|
481
|
+
if args.command in ("claim", "done") and not args.num:
|
|
482
|
+
raise TicketError(f"{args.command} 需要票号")
|
|
483
|
+
root = repo_root()
|
|
484
|
+
task = task_dir(root, args.task_dir)
|
|
485
|
+
tickets = load_tickets(task / "issues")
|
|
486
|
+
return COMMANDS[args.command](
|
|
487
|
+
tickets=tickets, root=root, task=task, num=args.num
|
|
488
|
+
)
|
|
489
|
+
except TicketError as e:
|
|
490
|
+
print(f"错误:{e}", file=sys.stderr)
|
|
491
|
+
return 1
|
|
492
|
+
|
|
493
|
+
|
|
494
|
+
if __name__ == "__main__":
|
|
495
|
+
sys.exit(main())
|
|
File without changes
|