@sleepy-ai/cli 0.1.6 → 0.1.8
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/{src/skill/compose/LICENSE-superpowers → LICENSE} +3 -6
- package/README.md +139 -6
- package/package.json +35 -199
- package/postinstall.mjs +102 -0
- package/.sleepycode-test-fixtures-50158/sleepycode-test-eqsxv84ythu/.watcher-b67v64k2mnv +0 -1
- package/Dockerfile +0 -18
- package/drizzle.config.ts +0 -10
- package/git +0 -0
- package/migration/20260127222353_familiar_lady_ursula/migration.sql +0 -90
- package/migration/20260127222353_familiar_lady_ursula/snapshot.json +0 -796
- package/migration/20260211171708_add_project_commands/migration.sql +0 -1
- package/migration/20260211171708_add_project_commands/snapshot.json +0 -806
- package/migration/20260213144116_wakeful_the_professor/migration.sql +0 -11
- package/migration/20260213144116_wakeful_the_professor/snapshot.json +0 -897
- package/migration/20260225215848_workspace/migration.sql +0 -7
- package/migration/20260225215848_workspace/snapshot.json +0 -959
- package/migration/20260227213759_add_session_workspace_id/migration.sql +0 -2
- package/migration/20260227213759_add_session_workspace_id/snapshot.json +0 -983
- package/migration/20260228203230_blue_harpoon/migration.sql +0 -17
- package/migration/20260228203230_blue_harpoon/snapshot.json +0 -1102
- package/migration/20260303231226_add_workspace_fields/migration.sql +0 -5
- package/migration/20260303231226_add_workspace_fields/snapshot.json +0 -1013
- package/migration/20260309230000_move_org_to_state/migration.sql +0 -3
- package/migration/20260309230000_move_org_to_state/snapshot.json +0 -1156
- package/migration/20260312043431_session_message_cursor/migration.sql +0 -4
- package/migration/20260312043431_session_message_cursor/snapshot.json +0 -1168
- package/migration/20260323234822_events/migration.sql +0 -13
- package/migration/20260323234822_events/snapshot.json +0 -1271
- package/migration/20260410174513_workspace-name/migration.sql +0 -16
- package/migration/20260410174513_workspace-name/snapshot.json +0 -1271
- package/migration/20260413175956_chief_energizer/migration.sql +0 -13
- package/migration/20260413175956_chief_energizer/snapshot.json +0 -1399
- package/migration/20260422160000_context_inheritance/migration.sql +0 -3
- package/migration/20260422170000_task_registry/migration.sql +0 -18
- package/migration/20260423145421_remove_session_entry/migration.sql +0 -4
- package/migration/20260515000000_actor_rename/migration.sql +0 -7
- package/migration/20260515010000_memory_fts/migration.sql +0 -33
- package/migration/20260515020000_user_task/migration.sql +0 -29
- package/migration/20260519000000_last_checkpoint_message_id/migration.sql +0 -1
- package/migration/20260521000000_message_agent_id/migration.sql +0 -2
- package/migration/20260521000100_actor_registry_v6/migration.sql +0 -25
- package/migration/20260521010000_memory_fts_v6/migration.sql +0 -33
- package/migration/20260521020000_memory_fts_triggers/migration.sql +0 -17
- package/migration/20260526000000_agent_id_main/migration.sql +0 -14
- package/migration/20260527000000_actor_lifecycle/migration.sql +0 -8
- package/migration/20260527000100_inbox/migration.sql +0 -12
- package/migration/20260529000000_task_todo_redesign/migration.sql +0 -16
- package/migration/20260603000000_task_in_progress_owner/migration.sql +0 -1
- package/migration/20260603000000_workflow_run/migration.sql +0 -17
- package/migration/20260604000000_workflow_script_sha/migration.sql +0 -1
- package/migration/20260608000000_claude_import/migration.sql +0 -7
- package/migration/20260608010000_claude_import_message_ids/migration.sql +0 -1
- package/migration/20260609000000_history_fts/migration.sql +0 -29
- package/migration/20260609230000_workflow_agent_timeout/migration.sql +0 -1
- package/migration/20260612000000_external_import/migration.sql +0 -16
- package/parsers-config.ts +0 -290
- package/src/account/account.sql.ts +0 -39
- package/src/account/account.ts +0 -456
- package/src/account/repo.ts +0 -166
- package/src/account/schema.ts +0 -99
- package/src/account/url.ts +0 -8
- package/src/acp/README.md +0 -174
- package/src/acp/agent.ts +0 -1787
- package/src/acp/session.ts +0 -116
- package/src/acp/types.ts +0 -24
- package/src/actor/actor.sql.ts +0 -38
- package/src/actor/events.ts +0 -67
- package/src/actor/index.ts +0 -2
- package/src/actor/registry.ts +0 -412
- package/src/actor/return-header.ts +0 -24
- package/src/actor/schema.ts +0 -47
- package/src/actor/spawn-ref.ts +0 -16
- package/src/actor/spawn.ts +0 -756
- package/src/actor/turn.ts +0 -49
- package/src/actor/waiter.ts +0 -166
- package/src/agent/agent.ts +0 -574
- package/src/agent/config.ts +0 -5
- package/src/agent/generate.txt +0 -75
- package/src/agent/prompt/checkpoint-writer.txt +0 -167
- package/src/agent/prompt/compaction.txt +0 -9
- package/src/agent/prompt/distill.txt +0 -199
- package/src/agent/prompt/dream.txt +0 -155
- package/src/agent/prompt/explore.txt +0 -18
- package/src/agent/prompt/summary.txt +0 -11
- package/src/agent/prompt/title.txt +0 -44
- package/src/audio.d.ts +0 -9
- package/src/auth/index.ts +0 -97
- package/src/bus/bus-event.ts +0 -33
- package/src/bus/global.ts +0 -12
- package/src/bus/index.ts +0 -193
- package/src/cli/bootstrap.ts +0 -33
- package/src/cli/cmd/account.ts +0 -258
- package/src/cli/cmd/acp.ts +0 -70
- package/src/cli/cmd/agent.ts +0 -248
- package/src/cli/cmd/cmd.ts +0 -7
- package/src/cli/cmd/db.ts +0 -120
- package/src/cli/cmd/debug/agent.ts +0 -192
- package/src/cli/cmd/debug/config.ts +0 -17
- package/src/cli/cmd/debug/file.ts +0 -100
- package/src/cli/cmd/debug/index.ts +0 -48
- package/src/cli/cmd/debug/lsp.ts +0 -61
- package/src/cli/cmd/debug/ripgrep.ts +0 -105
- package/src/cli/cmd/debug/scrap.ts +0 -16
- package/src/cli/cmd/debug/skill.ts +0 -23
- package/src/cli/cmd/debug/snapshot.ts +0 -53
- package/src/cli/cmd/doctor.ts +0 -116
- package/src/cli/cmd/export.ts +0 -306
- package/src/cli/cmd/generate.ts +0 -50
- package/src/cli/cmd/github.ts +0 -1647
- package/src/cli/cmd/import.ts +0 -208
- package/src/cli/cmd/init.ts +0 -97
- package/src/cli/cmd/login.ts +0 -402
- package/src/cli/cmd/mcp.ts +0 -812
- package/src/cli/cmd/models.ts +0 -88
- package/src/cli/cmd/plug.ts +0 -233
- package/src/cli/cmd/pr.ts +0 -138
- package/src/cli/cmd/providers.ts +0 -713
- package/src/cli/cmd/run-completion.ts +0 -77
- package/src/cli/cmd/run.ts +0 -694
- package/src/cli/cmd/serve.ts +0 -30
- package/src/cli/cmd/session.ts +0 -181
- package/src/cli/cmd/stats.ts +0 -413
- package/src/cli/cmd/tui/app.tsx +0 -1181
- package/src/cli/cmd/tui/asset/TEN_VAD_LICENSE +0 -12
- package/src/cli/cmd/tui/asset/charge.wav +0 -0
- package/src/cli/cmd/tui/asset/pulse-a.wav +0 -0
- package/src/cli/cmd/tui/asset/pulse-b.wav +0 -0
- package/src/cli/cmd/tui/asset/pulse-c.wav +0 -0
- package/src/cli/cmd/tui/asset/ten_vad.wasm +0 -0
- package/src/cli/cmd/tui/asset/ten_vad_loader.js +0 -30
- package/src/cli/cmd/tui/attach.ts +0 -84
- package/src/cli/cmd/tui/component/background-image.tsx +0 -150
- package/src/cli/cmd/tui/component/banner-session-expired.tsx +0 -48
- package/src/cli/cmd/tui/component/bg-pulse.tsx +0 -130
- package/src/cli/cmd/tui/component/border.tsx +0 -21
- package/src/cli/cmd/tui/component/dialog-agent.tsx +0 -31
- package/src/cli/cmd/tui/component/dialog-agreement.tsx +0 -111
- package/src/cli/cmd/tui/component/dialog-command.tsx +0 -219
- package/src/cli/cmd/tui/component/dialog-console-org.tsx +0 -103
- package/src/cli/cmd/tui/component/dialog-go-upsell.tsx +0 -157
- package/src/cli/cmd/tui/component/dialog-image-list.tsx +0 -111
- package/src/cli/cmd/tui/component/dialog-logo-design.tsx +0 -37
- package/src/cli/cmd/tui/component/dialog-mcp.tsx +0 -86
- package/src/cli/cmd/tui/component/dialog-model.tsx +0 -299
- package/src/cli/cmd/tui/component/dialog-provider.tsx +0 -449
- package/src/cli/cmd/tui/component/dialog-session-delete-failed.tsx +0 -101
- package/src/cli/cmd/tui/component/dialog-session-list.tsx +0 -269
- package/src/cli/cmd/tui/component/dialog-session-rename.tsx +0 -31
- package/src/cli/cmd/tui/component/dialog-skill.tsx +0 -42
- package/src/cli/cmd/tui/component/dialog-sleepy-login.tsx +0 -288
- package/src/cli/cmd/tui/component/dialog-stash.tsx +0 -87
- package/src/cli/cmd/tui/component/dialog-status.tsx +0 -170
- package/src/cli/cmd/tui/component/dialog-tag.tsx +0 -44
- package/src/cli/cmd/tui/component/dialog-theme-list.tsx +0 -50
- package/src/cli/cmd/tui/component/dialog-token-plan.tsx +0 -77
- package/src/cli/cmd/tui/component/dialog-variant.tsx +0 -39
- package/src/cli/cmd/tui/component/dialog-workflows.tsx +0 -51
- package/src/cli/cmd/tui/component/dialog-workspace-create.tsx +0 -289
- package/src/cli/cmd/tui/component/dialog-workspace-unavailable.tsx +0 -81
- package/src/cli/cmd/tui/component/dialog-worktree.tsx +0 -90
- package/src/cli/cmd/tui/component/error-component.tsx +0 -92
- package/src/cli/cmd/tui/component/logo.tsx +0 -961
- package/src/cli/cmd/tui/component/plugin-route-missing.tsx +0 -14
- package/src/cli/cmd/tui/component/prompt/autocomplete-detect.ts +0 -34
- package/src/cli/cmd/tui/component/prompt/autocomplete.tsx +0 -668
- package/src/cli/cmd/tui/component/prompt/cwd.ts +0 -0
- package/src/cli/cmd/tui/component/prompt/frecency.tsx +0 -90
- package/src/cli/cmd/tui/component/prompt/history.tsx +0 -108
- package/src/cli/cmd/tui/component/prompt/index.tsx +0 -1869
- package/src/cli/cmd/tui/component/prompt/offset.ts +0 -45
- package/src/cli/cmd/tui/component/prompt/part.ts +0 -36
- package/src/cli/cmd/tui/component/prompt/stash.tsx +0 -101
- package/src/cli/cmd/tui/component/spinner.tsx +0 -24
- package/src/cli/cmd/tui/component/starry-background.tsx +0 -305
- package/src/cli/cmd/tui/component/startup-loading.tsx +0 -67
- package/src/cli/cmd/tui/component/task-item.tsx +0 -63
- package/src/cli/cmd/tui/component/textarea-keybindings.ts +0 -73
- package/src/cli/cmd/tui/component/todo-item.tsx +0 -32
- package/src/cli/cmd/tui/component/workflow-tree.tsx +0 -177
- package/src/cli/cmd/tui/config/cwd.ts +0 -5
- package/src/cli/cmd/tui/config/tui-migrate.ts +0 -151
- package/src/cli/cmd/tui/config/tui-schema.ts +0 -38
- package/src/cli/cmd/tui/config/tui.ts +0 -219
- package/src/cli/cmd/tui/context/args.tsx +0 -16
- package/src/cli/cmd/tui/context/directory.ts +0 -15
- package/src/cli/cmd/tui/context/event.ts +0 -45
- package/src/cli/cmd/tui/context/exit.tsx +0 -65
- package/src/cli/cmd/tui/context/helper.tsx +0 -25
- package/src/cli/cmd/tui/context/keybind.tsx +0 -105
- package/src/cli/cmd/tui/context/kv.tsx +0 -86
- package/src/cli/cmd/tui/context/language.tsx +0 -91
- package/src/cli/cmd/tui/context/local.tsx +0 -469
- package/src/cli/cmd/tui/context/plugin-keybinds.ts +0 -41
- package/src/cli/cmd/tui/context/project.tsx +0 -109
- package/src/cli/cmd/tui/context/prompt.tsx +0 -18
- package/src/cli/cmd/tui/context/route.tsx +0 -68
- package/src/cli/cmd/tui/context/sdk.tsx +0 -150
- package/src/cli/cmd/tui/context/sync.tsx +0 -884
- package/src/cli/cmd/tui/context/theme/aura.json +0 -69
- package/src/cli/cmd/tui/context/theme/ayu.json +0 -80
- package/src/cli/cmd/tui/context/theme/carbonfox.json +0 -248
- package/src/cli/cmd/tui/context/theme/catppuccin-frappe.json +0 -230
- package/src/cli/cmd/tui/context/theme/catppuccin-macchiato.json +0 -230
- package/src/cli/cmd/tui/context/theme/catppuccin.json +0 -112
- package/src/cli/cmd/tui/context/theme/cobalt2.json +0 -225
- package/src/cli/cmd/tui/context/theme/cursor.json +0 -249
- package/src/cli/cmd/tui/context/theme/dracula.json +0 -219
- package/src/cli/cmd/tui/context/theme/everforest.json +0 -241
- package/src/cli/cmd/tui/context/theme/flexoki.json +0 -237
- package/src/cli/cmd/tui/context/theme/github.json +0 -233
- package/src/cli/cmd/tui/context/theme/gruvbox.json +0 -242
- package/src/cli/cmd/tui/context/theme/kanagawa.json +0 -77
- package/src/cli/cmd/tui/context/theme/lucent-orng.json +0 -234
- package/src/cli/cmd/tui/context/theme/material.json +0 -235
- package/src/cli/cmd/tui/context/theme/matrix.json +0 -77
- package/src/cli/cmd/tui/context/theme/mercury.json +0 -252
- package/src/cli/cmd/tui/context/theme/monokai.json +0 -221
- package/src/cli/cmd/tui/context/theme/nightowl.json +0 -221
- package/src/cli/cmd/tui/context/theme/nord.json +0 -223
- package/src/cli/cmd/tui/context/theme/one-dark.json +0 -84
- package/src/cli/cmd/tui/context/theme/orng.json +0 -249
- package/src/cli/cmd/tui/context/theme/osaka-jade.json +0 -93
- package/src/cli/cmd/tui/context/theme/palenight.json +0 -222
- package/src/cli/cmd/tui/context/theme/rosepine.json +0 -234
- package/src/cli/cmd/tui/context/theme/sleepycode.json +0 -245
- package/src/cli/cmd/tui/context/theme/solarized.json +0 -223
- package/src/cli/cmd/tui/context/theme/synthwave84.json +0 -226
- package/src/cli/cmd/tui/context/theme/tokyonight.json +0 -243
- package/src/cli/cmd/tui/context/theme/vercel.json +0 -245
- package/src/cli/cmd/tui/context/theme/vesper.json +0 -218
- package/src/cli/cmd/tui/context/theme/zenburn.json +0 -223
- package/src/cli/cmd/tui/context/theme.tsx +0 -1298
- package/src/cli/cmd/tui/context/thinking.ts +0 -48
- package/src/cli/cmd/tui/context/tui-config.tsx +0 -9
- package/src/cli/cmd/tui/event.ts +0 -62
- package/src/cli/cmd/tui/feature-plugins/home/footer.tsx +0 -93
- package/src/cli/cmd/tui/feature-plugins/home/tips-view.tsx +0 -193
- package/src/cli/cmd/tui/feature-plugins/home/tips.tsx +0 -54
- package/src/cli/cmd/tui/feature-plugins/sidebar/context.tsx +0 -267
- package/src/cli/cmd/tui/feature-plugins/sidebar/cwd.tsx +0 -45
- package/src/cli/cmd/tui/feature-plugins/sidebar/files.tsx +0 -62
- package/src/cli/cmd/tui/feature-plugins/sidebar/footer.tsx +0 -93
- package/src/cli/cmd/tui/feature-plugins/sidebar/goal.tsx +0 -84
- package/src/cli/cmd/tui/feature-plugins/sidebar/instructions.tsx +0 -54
- package/src/cli/cmd/tui/feature-plugins/sidebar/lsp.tsx +0 -66
- package/src/cli/cmd/tui/feature-plugins/sidebar/mascot.tsx +0 -69
- package/src/cli/cmd/tui/feature-plugins/sidebar/mcp.tsx +0 -98
- package/src/cli/cmd/tui/feature-plugins/sidebar/task.tsx +0 -95
- package/src/cli/cmd/tui/feature-plugins/sidebar/todo.tsx +0 -51
- package/src/cli/cmd/tui/feature-plugins/sidebar/tps.ts +0 -31
- package/src/cli/cmd/tui/feature-plugins/system/plugins.tsx +0 -274
- package/src/cli/cmd/tui/i18n/en.ts +0 -465
- package/src/cli/cmd/tui/i18n/es.ts +0 -508
- package/src/cli/cmd/tui/i18n/fr.ts +0 -515
- package/src/cli/cmd/tui/i18n/ja.ts +0 -463
- package/src/cli/cmd/tui/i18n/locales.ts +0 -82
- package/src/cli/cmd/tui/i18n/ru.ts +0 -527
- package/src/cli/cmd/tui/i18n/slash-command.ts +0 -11
- package/src/cli/cmd/tui/i18n/zh.ts +0 -454
- package/src/cli/cmd/tui/i18n/zht.ts +0 -430
- package/src/cli/cmd/tui/layer.ts +0 -6
- package/src/cli/cmd/tui/plugin/api.tsx +0 -402
- package/src/cli/cmd/tui/plugin/index.ts +0 -3
- package/src/cli/cmd/tui/plugin/internal.ts +0 -37
- package/src/cli/cmd/tui/plugin/runtime.ts +0 -1057
- package/src/cli/cmd/tui/plugin/slots.tsx +0 -60
- package/src/cli/cmd/tui/routes/home.tsx +0 -165
- package/src/cli/cmd/tui/routes/session/dialog-fork-from-timeline.tsx +0 -76
- package/src/cli/cmd/tui/routes/session/dialog-message.tsx +0 -116
- package/src/cli/cmd/tui/routes/session/dialog-subagent.tsx +0 -47
- package/src/cli/cmd/tui/routes/session/dialog-timeline.tsx +0 -47
- package/src/cli/cmd/tui/routes/session/footer.tsx +0 -91
- package/src/cli/cmd/tui/routes/session/index.tsx +0 -3073
- package/src/cli/cmd/tui/routes/session/permission.tsx +0 -697
- package/src/cli/cmd/tui/routes/session/question.tsx +0 -488
- package/src/cli/cmd/tui/routes/session/sidebar.tsx +0 -97
- package/src/cli/cmd/tui/routes/session/subagent-footer.tsx +0 -143
- package/src/cli/cmd/tui/thread.ts +0 -324
- package/src/cli/cmd/tui/ui/dialog-alert.tsx +0 -61
- package/src/cli/cmd/tui/ui/dialog-confirm.tsx +0 -95
- package/src/cli/cmd/tui/ui/dialog-export-options.tsx +0 -223
- package/src/cli/cmd/tui/ui/dialog-help.tsx +0 -42
- package/src/cli/cmd/tui/ui/dialog-prompt.tsx +0 -123
- package/src/cli/cmd/tui/ui/dialog-select.tsx +0 -467
- package/src/cli/cmd/tui/ui/dialog.tsx +0 -207
- package/src/cli/cmd/tui/ui/link.tsx +0 -28
- package/src/cli/cmd/tui/ui/spinner.ts +0 -378
- package/src/cli/cmd/tui/ui/toast.tsx +0 -102
- package/src/cli/cmd/tui/util/clipboard.ts +0 -203
- package/src/cli/cmd/tui/util/editor.ts +0 -36
- package/src/cli/cmd/tui/util/image-protocol.ts +0 -35
- package/src/cli/cmd/tui/util/index.ts +0 -6
- package/src/cli/cmd/tui/util/model.ts +0 -23
- package/src/cli/cmd/tui/util/pinyin.ts +0 -20
- package/src/cli/cmd/tui/util/provider-origin.ts +0 -7
- package/src/cli/cmd/tui/util/revert-diff.ts +0 -18
- package/src/cli/cmd/tui/util/scroll.ts +0 -23
- package/src/cli/cmd/tui/util/selection.ts +0 -23
- package/src/cli/cmd/tui/util/signal.ts +0 -41
- package/src/cli/cmd/tui/util/sound.ts +0 -154
- package/src/cli/cmd/tui/util/system-locale.ts +0 -209
- package/src/cli/cmd/tui/util/terminal.ts +0 -110
- package/src/cli/cmd/tui/util/transcript.ts +0 -112
- package/src/cli/cmd/tui/util/vad.ts +0 -229
- package/src/cli/cmd/tui/util/voice.ts +0 -450
- package/src/cli/cmd/tui/win32.ts +0 -130
- package/src/cli/cmd/tui/worker.ts +0 -104
- package/src/cli/cmd/uninstall.ts +0 -351
- package/src/cli/cmd/upgrade.ts +0 -79
- package/src/cli/cmd/web.ts +0 -96
- package/src/cli/effect/prompt.ts +0 -25
- package/src/cli/error.ts +0 -82
- package/src/cli/heap.ts +0 -59
- package/src/cli/i18n.ts +0 -15
- package/src/cli/logo.ts +0 -53
- package/src/cli/network.ts +0 -68
- package/src/cli/ui.ts +0 -133
- package/src/cli/upgrade.ts +0 -41
- package/src/command/index.ts +0 -276
- package/src/command/template/initialize.txt +0 -66
- package/src/command/template/review.txt +0 -101
- package/src/config/agent.ts +0 -197
- package/src/config/command.ts +0 -69
- package/src/config/compose.ts +0 -26
- package/src/config/config.ts +0 -1047
- package/src/config/console-state.ts +0 -16
- package/src/config/entry-name.ts +0 -16
- package/src/config/error.ts +0 -21
- package/src/config/formatter.ts +0 -17
- package/src/config/history.ts +0 -21
- package/src/config/index.ts +0 -17
- package/src/config/keybinds.ts +0 -127
- package/src/config/layout.ts +0 -10
- package/src/config/lsp.ts +0 -45
- package/src/config/managed.ts +0 -70
- package/src/config/markdown.ts +0 -97
- package/src/config/mcp.ts +0 -172
- package/src/config/model-id.ts +0 -14
- package/src/config/parse.ts +0 -44
- package/src/config/paths.ts +0 -85
- package/src/config/permission.ts +0 -76
- package/src/config/plugin.ts +0 -88
- package/src/config/provider.ts +0 -118
- package/src/config/server.ts +0 -20
- package/src/config/skills.ts +0 -16
- package/src/config/variable.ts +0 -90
- package/src/control-plane/adaptors/index.ts +0 -52
- package/src/control-plane/adaptors/worktree.ts +0 -47
- package/src/control-plane/dev/debug-workspace-plugin.ts +0 -73
- package/src/control-plane/schema.ts +0 -19
- package/src/control-plane/sse.ts +0 -66
- package/src/control-plane/types.ts +0 -34
- package/src/control-plane/util.ts +0 -37
- package/src/control-plane/workspace-context.ts +0 -26
- package/src/control-plane/workspace.sql.ts +0 -17
- package/src/control-plane/workspace.ts +0 -615
- package/src/effect/app-runtime.ts +0 -146
- package/src/effect/bootstrap-runtime.ts +0 -33
- package/src/effect/bridge.ts +0 -48
- package/src/effect/cross-spawn-spawner.ts +0 -514
- package/src/effect/index.ts +0 -5
- package/src/effect/instance-ref.ts +0 -11
- package/src/effect/instance-registry.ts +0 -12
- package/src/effect/instance-state.ts +0 -81
- package/src/effect/logger.ts +0 -73
- package/src/effect/memo-map.ts +0 -3
- package/src/effect/observability.ts +0 -107
- package/src/effect/run-service.ts +0 -52
- package/src/effect/runner.ts +0 -210
- package/src/effect/runtime.ts +0 -19
- package/src/env/index.ts +0 -37
- package/src/file/ignore.ts +0 -81
- package/src/file/index.ts +0 -664
- package/src/file/protected.ts +0 -59
- package/src/file/ripgrep.ts +0 -485
- package/src/file/watcher.ts +0 -163
- package/src/flag/flag.ts +0 -185
- package/src/format/formatter.ts +0 -403
- package/src/format/index.ts +0 -203
- package/src/git/index.ts +0 -260
- package/src/global/index.ts +0 -54
- package/src/history/backfill.ts +0 -162
- package/src/history/extract.ts +0 -67
- package/src/history/fts-query.ts +0 -15
- package/src/history/fts.sql.ts +0 -20
- package/src/history/index.ts +0 -10
- package/src/history/resolve.ts +0 -65
- package/src/history/service.ts +0 -258
- package/src/history/writer.ts +0 -112
- package/src/id/id.ts +0 -87
- package/src/ide/index.ts +0 -73
- package/src/inbox/inbox-ref.ts +0 -38
- package/src/inbox/inbox.sql.ts +0 -26
- package/src/inbox/inbox.ts +0 -223
- package/src/inbox/index.ts +0 -3
- package/src/inbox/render.ts +0 -40
- package/src/index.ts +0 -268
- package/src/installation/index.ts +0 -362
- package/src/installation/version.ts +0 -8
- package/src/lsp/client.ts +0 -249
- package/src/lsp/diagnostic.ts +0 -29
- package/src/lsp/index.ts +0 -3
- package/src/lsp/language.ts +0 -120
- package/src/lsp/launch.ts +0 -21
- package/src/lsp/lsp.ts +0 -519
- package/src/lsp/server.ts +0 -1956
- package/src/mcp/auth.ts +0 -144
- package/src/mcp/index.ts +0 -939
- package/src/mcp/oauth-callback.ts +0 -236
- package/src/mcp/oauth-provider.ts +0 -214
- package/src/memory/fts-query.ts +0 -37
- package/src/memory/fts.sql.ts +0 -19
- package/src/memory/index.ts +0 -1
- package/src/memory/paths.ts +0 -116
- package/src/memory/reconcile.ts +0 -144
- package/src/memory/service.ts +0 -144
- package/src/metrics/client.ts +0 -40
- package/src/metrics/event.ts +0 -43
- package/src/metrics/index.ts +0 -5
- package/src/metrics/installation.ts +0 -18
- package/src/metrics/subscriber.ts +0 -58
- package/src/metrics/util.ts +0 -9
- package/src/node.ts +0 -6
- package/src/npm/config.ts +0 -0
- package/src/npm/index.ts +0 -293
- package/src/npmcli-config.d.ts +0 -43
- package/src/patch/index.ts +0 -680
- package/src/permission/arity.ts +0 -163
- package/src/permission/evaluate.ts +0 -15
- package/src/permission/index.ts +0 -382
- package/src/permission/schema.ts +0 -17
- package/src/plugin/checkpoint-splitover.ts +0 -60
- package/src/plugin/cloudflare.ts +0 -76
- package/src/plugin/codex.ts +0 -611
- package/src/plugin/github-copilot/copilot.ts +0 -368
- package/src/plugin/github-copilot/models.ts +0 -153
- package/src/plugin/index.ts +0 -637
- package/src/plugin/install.ts +0 -439
- package/src/plugin/loader.ts +0 -216
- package/src/plugin/matcher.ts +0 -33
- package/src/plugin/meta.ts +0 -188
- package/src/plugin/shared.ts +0 -323
- package/src/plugin/sleepy.ts +0 -244
- package/src/plugin/subagent-progress-checker.ts +0 -147
- package/src/project/bootstrap.ts +0 -59
- package/src/project/index.ts +0 -2
- package/src/project/instance.ts +0 -215
- package/src/project/project-id.ts +0 -48
- package/src/project/project.sql.ts +0 -16
- package/src/project/project.ts +0 -522
- package/src/project/schema.ts +0 -15
- package/src/project/vcs.ts +0 -227
- package/src/project/workspace-trust.ts +0 -67
- package/src/provider/auth.ts +0 -234
- package/src/provider/error.ts +0 -216
- package/src/provider/index.ts +0 -5
- package/src/provider/models-snapshot.d.ts +0 -2
- package/src/provider/models-snapshot.js +0 -3
- package/src/provider/models.ts +0 -180
- package/src/provider/provider.ts +0 -2098
- package/src/provider/schema.ts +0 -36
- package/src/provider/sdk/copilot/README.md +0 -5
- package/src/provider/sdk/copilot/chat/convert-to-openai-compatible-chat-messages.ts +0 -170
- package/src/provider/sdk/copilot/chat/get-response-metadata.ts +0 -15
- package/src/provider/sdk/copilot/chat/map-openai-compatible-finish-reason.ts +0 -19
- package/src/provider/sdk/copilot/chat/openai-compatible-api-types.ts +0 -64
- package/src/provider/sdk/copilot/chat/openai-compatible-chat-language-model.ts +0 -815
- package/src/provider/sdk/copilot/chat/openai-compatible-chat-options.ts +0 -28
- package/src/provider/sdk/copilot/chat/openai-compatible-metadata-extractor.ts +0 -44
- package/src/provider/sdk/copilot/chat/openai-compatible-prepare-tools.ts +0 -83
- package/src/provider/sdk/copilot/copilot-provider.ts +0 -100
- package/src/provider/sdk/copilot/index.ts +0 -2
- package/src/provider/sdk/copilot/openai-compatible-error.ts +0 -27
- package/src/provider/sdk/copilot/responses/convert-to-openai-responses-input.ts +0 -335
- package/src/provider/sdk/copilot/responses/map-openai-responses-finish-reason.ts +0 -22
- package/src/provider/sdk/copilot/responses/openai-config.ts +0 -18
- package/src/provider/sdk/copilot/responses/openai-error.ts +0 -22
- package/src/provider/sdk/copilot/responses/openai-responses-api-types.ts +0 -214
- package/src/provider/sdk/copilot/responses/openai-responses-language-model.ts +0 -1770
- package/src/provider/sdk/copilot/responses/openai-responses-prepare-tools.ts +0 -173
- package/src/provider/sdk/copilot/responses/openai-responses-settings.ts +0 -1
- package/src/provider/sdk/copilot/responses/tool/code-interpreter.ts +0 -87
- package/src/provider/sdk/copilot/responses/tool/file-search.ts +0 -127
- package/src/provider/sdk/copilot/responses/tool/image-generation.ts +0 -114
- package/src/provider/sdk/copilot/responses/tool/local-shell.ts +0 -64
- package/src/provider/sdk/copilot/responses/tool/web-search-preview.ts +0 -103
- package/src/provider/sdk/copilot/responses/tool/web-search.ts +0 -102
- package/src/provider/session-check.ts +0 -163
- package/src/provider/transform.ts +0 -1376
- package/src/pty/index.ts +0 -364
- package/src/pty/pty.bun.ts +0 -26
- package/src/pty/pty.node.ts +0 -27
- package/src/pty/pty.ts +0 -25
- package/src/pty/schema.ts +0 -17
- package/src/question/index.ts +0 -252
- package/src/question/schema.ts +0 -17
- package/src/server/adapter.bun.ts +0 -40
- package/src/server/adapter.node.ts +0 -66
- package/src/server/adapter.ts +0 -21
- package/src/server/auth.ts +0 -16
- package/src/server/error.ts +0 -53
- package/src/server/event.ts +0 -7
- package/src/server/fence.ts +0 -81
- package/src/server/mdns.ts +0 -60
- package/src/server/middleware.ts +0 -94
- package/src/server/projectors.ts +0 -28
- package/src/server/proxy.ts +0 -171
- package/src/server/pty-ticket.ts +0 -42
- package/src/server/rate-limit.ts +0 -38
- package/src/server/routes/control/index.ts +0 -160
- package/src/server/routes/control/workspace.ts +0 -203
- package/src/server/routes/global.ts +0 -367
- package/src/server/routes/instance/bash-interactive.ts +0 -82
- package/src/server/routes/instance/config.ts +0 -89
- package/src/server/routes/instance/event.ts +0 -108
- package/src/server/routes/instance/experimental.ts +0 -408
- package/src/server/routes/instance/file.ts +0 -190
- package/src/server/routes/instance/httpapi/config.ts +0 -51
- package/src/server/routes/instance/httpapi/permission.ts +0 -72
- package/src/server/routes/instance/httpapi/project.ts +0 -62
- package/src/server/routes/instance/httpapi/provider.ts +0 -142
- package/src/server/routes/instance/httpapi/question.ts +0 -121
- package/src/server/routes/instance/httpapi/server.ts +0 -153
- package/src/server/routes/instance/index.ts +0 -301
- package/src/server/routes/instance/mcp.ts +0 -260
- package/src/server/routes/instance/middleware.ts +0 -44
- package/src/server/routes/instance/permission.ts +0 -73
- package/src/server/routes/instance/project.ts +0 -122
- package/src/server/routes/instance/provider.ts +0 -158
- package/src/server/routes/instance/pty.ts +0 -302
- package/src/server/routes/instance/question.ts +0 -162
- package/src/server/routes/instance/session.ts +0 -1328
- package/src/server/routes/instance/sync.ts +0 -143
- package/src/server/routes/instance/trace.ts +0 -59
- package/src/server/routes/instance/tui.ts +0 -384
- package/src/server/routes/instance/workflows.ts +0 -142
- package/src/server/routes/ui.ts +0 -37
- package/src/server/server.ts +0 -146
- package/src/server/workspace.ts +0 -122
- package/src/session/auto-dream.ts +0 -123
- package/src/session/boundary.ts +0 -77
- package/src/session/budgeted-read.ts +0 -118
- package/src/session/checkpoint-align.ts +0 -29
- package/src/session/checkpoint-context.ts +0 -36
- package/src/session/checkpoint-paths.ts +0 -86
- package/src/session/checkpoint-progress-reconcile.ts +0 -111
- package/src/session/checkpoint-retry.ts +0 -192
- package/src/session/checkpoint-templates.ts +0 -114
- package/src/session/checkpoint-validator.ts +0 -259
- package/src/session/checkpoint.ts +0 -1560
- package/src/session/classify.ts +0 -117
- package/src/session/claude-import.ts +0 -381
- package/src/session/codex-import.ts +0 -416
- package/src/session/compaction.ts +0 -545
- package/src/session/external-import.sql.ts +0 -18
- package/src/session/external-import.ts +0 -136
- package/src/session/goal.ts +0 -232
- package/src/session/index.ts +0 -1
- package/src/session/instruction.ts +0 -276
- package/src/session/last-message-info.ts +0 -32
- package/src/session/llm-request-prefix.ts +0 -82
- package/src/session/llm.ts +0 -737
- package/src/session/max-mode.ts +0 -410
- package/src/session/message-v2.ts +0 -1138
- package/src/session/message.ts +0 -191
- package/src/session/opencode-import.ts +0 -281
- package/src/session/overflow.ts +0 -53
- package/src/session/prefix-capture-ref.ts +0 -48
- package/src/session/processor.ts +0 -983
- package/src/session/projectors.ts +0 -137
- package/src/session/prompt/anthropic.txt +0 -154
- package/src/session/prompt/beast.txt +0 -155
- package/src/session/prompt/build-switch.txt +0 -5
- package/src/session/prompt/codex.txt +0 -79
- package/src/session/prompt/compose.txt +0 -119
- package/src/session/prompt/copilot-gpt-5.txt +0 -143
- package/src/session/prompt/deepseek.txt +0 -131
- package/src/session/prompt/default.old.txt +0 -151
- package/src/session/prompt/default.txt +0 -172
- package/src/session/prompt/gemini.txt +0 -155
- package/src/session/prompt/glm.txt +0 -51
- package/src/session/prompt/gpt.txt +0 -107
- package/src/session/prompt/kimi.txt +0 -95
- package/src/session/prompt/max-steps.txt +0 -16
- package/src/session/prompt/minimax.txt +0 -140
- package/src/session/prompt/text-loop-recovery.ts +0 -40
- package/src/session/prompt/text-ngram-detection.ts +0 -87
- package/src/session/prompt/trinity.txt +0 -97
- package/src/session/prompt.ts +0 -3878
- package/src/session/prune.ts +0 -481
- package/src/session/retry.ts +0 -178
- package/src/session/revert.ts +0 -161
- package/src/session/run-state.ts +0 -135
- package/src/session/schema.ts +0 -36
- package/src/session/session.sql.ts +0 -110
- package/src/session/session.ts +0 -908
- package/src/session/status.ts +0 -89
- package/src/session/summary.ts +0 -163
- package/src/session/system.ts +0 -96
- package/src/session/todo.ts +0 -77
- package/src/session/trajectory.ts +0 -98
- package/src/share/index.ts +0 -2
- package/src/share/session.ts +0 -57
- package/src/share/share-next.ts +0 -381
- package/src/share/share.sql.ts +0 -13
- package/src/shell/shell.ts +0 -124
- package/src/skill/builtin/.bundle/self-extend/SKILL.md +0 -131
- package/src/skill/builtin/.bundle/self-extend/reference/hook-api.md +0 -242
- package/src/skill/builtin/.bundle/self-extend/reference/skill-api.md +0 -114
- package/src/skill/builtin/.bundle/self-extend/reference/tool-api.md +0 -115
- package/src/skill/builtin/.bundle/self-extend/reference/tui-api.md +0 -258
- package/src/skill/builtin/bundle.macro.ts +0 -30
- package/src/skill/builtin/extract.ts +0 -41
- package/src/skill/compose/.bundle/ask/SKILL.md +0 -58
- package/src/skill/compose/.bundle/brainstorm/SKILL.md +0 -200
- package/src/skill/compose/.bundle/brainstorm/scripts/frame-template.html +0 -214
- package/src/skill/compose/.bundle/brainstorm/scripts/helper.js +0 -88
- package/src/skill/compose/.bundle/brainstorm/scripts/server.cjs +0 -354
- package/src/skill/compose/.bundle/brainstorm/scripts/start-server.sh +0 -148
- package/src/skill/compose/.bundle/brainstorm/scripts/stop-server.sh +0 -56
- package/src/skill/compose/.bundle/brainstorm/spec-document-reviewer-prompt.md +0 -50
- package/src/skill/compose/.bundle/brainstorm/visual-companion.md +0 -258
- package/src/skill/compose/.bundle/debug/CREATION-LOG.md +0 -119
- package/src/skill/compose/.bundle/debug/SKILL.md +0 -297
- package/src/skill/compose/.bundle/debug/condition-based-waiting-example.ts +0 -158
- package/src/skill/compose/.bundle/debug/condition-based-waiting.md +0 -106
- package/src/skill/compose/.bundle/debug/defense-in-depth.md +0 -122
- package/src/skill/compose/.bundle/debug/find-polluter.sh +0 -63
- package/src/skill/compose/.bundle/debug/root-cause-tracing.md +0 -144
- package/src/skill/compose/.bundle/debug/test-academic.md +0 -14
- package/src/skill/compose/.bundle/debug/test-pressure-1.md +0 -58
- package/src/skill/compose/.bundle/debug/test-pressure-2.md +0 -68
- package/src/skill/compose/.bundle/debug/test-pressure-3.md +0 -69
- package/src/skill/compose/.bundle/execute/SKILL.md +0 -71
- package/src/skill/compose/.bundle/feedback/SKILL.md +0 -214
- package/src/skill/compose/.bundle/merge/SKILL.md +0 -252
- package/src/skill/compose/.bundle/new-skill/SKILL.md +0 -211
- package/src/skill/compose/.bundle/parallel/SKILL.md +0 -168
- package/src/skill/compose/.bundle/plan/SKILL.md +0 -183
- package/src/skill/compose/.bundle/plan/plan-document-reviewer-prompt.md +0 -50
- package/src/skill/compose/.bundle/report/SKILL.md +0 -180
- package/src/skill/compose/.bundle/review/SKILL.md +0 -104
- package/src/skill/compose/.bundle/review/code-reviewer.md +0 -178
- package/src/skill/compose/.bundle/subagent/SKILL.md +0 -325
- package/src/skill/compose/.bundle/subagent/code-quality-reviewer-prompt.md +0 -26
- package/src/skill/compose/.bundle/subagent/implementer-prompt.md +0 -128
- package/src/skill/compose/.bundle/subagent/spec-reviewer-prompt.md +0 -118
- package/src/skill/compose/.bundle/tdd/SKILL.md +0 -360
- package/src/skill/compose/.bundle/tdd/testing-anti-patterns.md +0 -299
- package/src/skill/compose/.bundle/verify/SKILL.md +0 -140
- package/src/skill/compose/.bundle/worktree/SKILL.md +0 -234
- package/src/skill/compose/LICENSE-karpathy +0 -28
- package/src/skill/compose/bundle.macro.ts +0 -30
- package/src/skill/compose/extract.ts +0 -85
- package/src/skill/discovery.ts +0 -114
- package/src/skill/index.ts +0 -328
- package/src/snapshot/index.ts +0 -777
- package/src/sql.d.ts +0 -4
- package/src/storage/db.bun.ts +0 -8
- package/src/storage/db.node.ts +0 -8
- package/src/storage/db.ts +0 -172
- package/src/storage/index.ts +0 -26
- package/src/storage/json-migration.ts +0 -426
- package/src/storage/read-sqlite.bun.ts +0 -11
- package/src/storage/read-sqlite.node.ts +0 -13
- package/src/storage/read-sqlite.ts +0 -10
- package/src/storage/schema.sql.ts +0 -10
- package/src/storage/schema.ts +0 -7
- package/src/storage/storage.ts +0 -331
- package/src/sync/README.md +0 -179
- package/src/sync/event.sql.ts +0 -16
- package/src/sync/index.ts +0 -278
- package/src/sync/schema.ts +0 -14
- package/src/task/events.ts +0 -28
- package/src/task/gate-state.ts +0 -54
- package/src/task/gate.ts +0 -116
- package/src/task/index.ts +0 -1
- package/src/task/registry.ts +0 -394
- package/src/task/schema.ts +0 -43
- package/src/task/task.sql.ts +0 -50
- package/src/team/events.ts +0 -22
- package/src/team/index.ts +0 -113
- package/src/team/schema.ts +0 -31
- package/src/temporary.ts +0 -33
- package/src/tool/actor.shell.txt +0 -72
- package/src/tool/actor.ts +0 -804
- package/src/tool/actor.txt +0 -103
- package/src/tool/apply_patch.ts +0 -308
- package/src/tool/apply_patch.txt +0 -33
- package/src/tool/bash-interactive.ts +0 -183
- package/src/tool/bash.ts +0 -704
- package/src/tool/bash.txt +0 -123
- package/src/tool/change-directory.ts +0 -91
- package/src/tool/codesearch.ts +0 -63
- package/src/tool/codesearch.txt +0 -12
- package/src/tool/edit.ts +0 -693
- package/src/tool/edit.txt +0 -10
- package/src/tool/external-directory.ts +0 -132
- package/src/tool/glob.ts +0 -100
- package/src/tool/glob.txt +0 -6
- package/src/tool/grep.ts +0 -145
- package/src/tool/grep.txt +0 -8
- package/src/tool/history.ts +0 -146
- package/src/tool/history.txt +0 -17
- package/src/tool/index.ts +0 -4
- package/src/tool/invalid.ts +0 -20
- package/src/tool/invocation-style.ts +0 -17
- package/src/tool/lsp.ts +0 -91
- package/src/tool/lsp.txt +0 -19
- package/src/tool/mcp-exa.ts +0 -78
- package/src/tool/memory-path-guard.ts +0 -162
- package/src/tool/memory.ts +0 -81
- package/src/tool/memory.txt +0 -69
- package/src/tool/multiedit.ts +0 -54
- package/src/tool/multiedit.txt +0 -41
- package/src/tool/notebook-edit.ts +0 -225
- package/src/tool/notebook-edit.txt +0 -10
- package/src/tool/plan-enter.txt +0 -16
- package/src/tool/plan-exit.txt +0 -14
- package/src/tool/plan.ts +0 -179
- package/src/tool/question.ts +0 -67
- package/src/tool/question.txt +0 -10
- package/src/tool/read-state.ts +0 -44
- package/src/tool/read.ts +0 -327
- package/src/tool/read.txt +0 -14
- package/src/tool/recoverable.ts +0 -35
- package/src/tool/registry.ts +0 -429
- package/src/tool/schema.ts +0 -17
- package/src/tool/session-cwd.ts +0 -35
- package/src/tool/shell-tokenize.ts +0 -374
- package/src/tool/shell-wrap.ts +0 -235
- package/src/tool/skill.ts +0 -76
- package/src/tool/skill.txt +0 -5
- package/src/tool/task.shell.txt +0 -57
- package/src/tool/task.ts +0 -456
- package/src/tool/task.txt +0 -56
- package/src/tool/tool.ts +0 -166
- package/src/tool/truncate.ts +0 -201
- package/src/tool/truncation-dir.ts +0 -4
- package/src/tool/webfetch.ts +0 -208
- package/src/tool/webfetch.txt +0 -13
- package/src/tool/websearch/index.ts +0 -104
- package/src/tool/websearch/sleepy.ts +0 -118
- package/src/tool/websearch/websearch.txt +0 -14
- package/src/tool/workflow.ts +0 -357
- package/src/tool/workflow.txt +0 -25
- package/src/tool/write.ts +0 -88
- package/src/tool/write.txt +0 -10
- package/src/util/abort.ts +0 -35
- package/src/util/archive.ts +0 -15
- package/src/util/color.ts +0 -17
- package/src/util/data-url.ts +0 -9
- package/src/util/defer.ts +0 -10
- package/src/util/effect-http-client.ts +0 -11
- package/src/util/effect-zod.ts +0 -367
- package/src/util/env-info.ts +0 -62
- package/src/util/error.ts +0 -78
- package/src/util/filesystem.ts +0 -243
- package/src/util/fn.ts +0 -21
- package/src/util/format.ts +0 -20
- package/src/util/iife.ts +0 -3
- package/src/util/index.ts +0 -14
- package/src/util/keybind.ts +0 -101
- package/src/util/lazy.ts +0 -18
- package/src/util/local-context.ts +0 -23
- package/src/util/locale.ts +0 -79
- package/src/util/lock.ts +0 -96
- package/src/util/log.ts +0 -234
- package/src/util/media.ts +0 -26
- package/src/util/network.ts +0 -9
- package/src/util/process.ts +0 -174
- package/src/util/provider-priority.ts +0 -48
- package/src/util/queue.ts +0 -60
- package/src/util/record.ts +0 -3
- package/src/util/rpc.ts +0 -64
- package/src/util/schema.ts +0 -53
- package/src/util/scrap.ts +0 -10
- package/src/util/signal.ts +0 -12
- package/src/util/sleepy-process.ts +0 -24
- package/src/util/ssrf.ts +0 -116
- package/src/util/timeout.ts +0 -14
- package/src/util/token.ts +0 -5
- package/src/util/tool-compat.ts +0 -144
- package/src/util/update-schema.ts +0 -13
- package/src/util/which.ts +0 -14
- package/src/util/wildcard.ts +0 -57
- package/src/workflow/builtin/compose.js +0 -749
- package/src/workflow/builtin/deep-research.js +0 -398
- package/src/workflow/builtin.ts +0 -59
- package/src/workflow/events.ts +0 -72
- package/src/workflow/meta.ts +0 -335
- package/src/workflow/persistence.ts +0 -312
- package/src/workflow/resolve.ts +0 -45
- package/src/workflow/runtime-ref.ts +0 -18
- package/src/workflow/runtime.ts +0 -1447
- package/src/workflow/sandbox.ts +0 -286
- package/src/workflow/workflow.sql.ts +0 -31
- package/src/workflow/workspace.ts +0 -69
- package/src/worktree/index.ts +0 -629
|
@@ -1,749 +0,0 @@
|
|
|
1
|
-
export const meta = {
|
|
2
|
-
name: "compose",
|
|
3
|
-
description:
|
|
4
|
-
"Autonomous compose pipeline — brainstorms context, designs (spec/plan), implements via parallel per-task worktrees with TDD, verifies, reviews, reports, and merges. Bounded retry, never-ask mode.",
|
|
5
|
-
whenToUse:
|
|
6
|
-
"Use to drive a feature, bugfix, refactor, or review-feedback task through the full compose flow without user prompting. Pass args.task = the user's request. Optionally args.type to set the task type (feature/bugfix/refactor/feedback; otherwise inferred), args.feature_name for the report filename, args.skip_brainstorm / args.skip_report to drop those phases, args.maxConcurrent to bound per-batch parallelism. Independent tasks auto-run in parallel, each in its own worktree, then merge back; pass args.isolate_worktrees=false to force all-sequential or =true to force isolation.",
|
|
7
|
-
phases: [
|
|
8
|
-
{ title: "Brainstorm", detail: "Context recon (never-ask): conventions, recent changes, relevant files" },
|
|
9
|
-
{ title: "Design", detail: "Apply compose:plan, compose:debug, or compose:feedback; emit task list with deps" },
|
|
10
|
-
{ title: "Implement", detail: "Topo-sorted batches; independent tasks parallelize in per-task worktrees, then integrate" },
|
|
11
|
-
{ title: "Verify", detail: "Run project verify commands; structured pass/fail" },
|
|
12
|
-
{ title: "Review", detail: "compose:review for critical/important/minor issues" },
|
|
13
|
-
{ title: "Report", detail: "compose:report per-iteration + final consolidated report" },
|
|
14
|
-
{ title: "Merge", detail: "compose:merge to commit (and optionally push/PR)" },
|
|
15
|
-
],
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
const MAX_TDD_ATTEMPTS = 3
|
|
19
|
-
const MAX_REVIEW_FIX_ATTEMPTS = 2
|
|
20
|
-
const DEFAULT_MAX_CONCURRENT = 8
|
|
21
|
-
|
|
22
|
-
const BRAINSTORM_SHAPE = {
|
|
23
|
-
type: "object",
|
|
24
|
-
required: ["context"],
|
|
25
|
-
properties: {
|
|
26
|
-
context: {
|
|
27
|
-
type: "object",
|
|
28
|
-
required: ["projectType", "conventions", "recentChanges", "relevantFiles"],
|
|
29
|
-
properties: {
|
|
30
|
-
projectType: { type: "string" },
|
|
31
|
-
conventions: { type: "array", items: { type: "string" } },
|
|
32
|
-
recentChanges: { type: "array", items: { type: "string" } },
|
|
33
|
-
relevantFiles: { type: "array", items: { type: "string" } },
|
|
34
|
-
},
|
|
35
|
-
},
|
|
36
|
-
assumptions: { type: "array", items: { type: "string" } },
|
|
37
|
-
selfQA: { type: "array", items: { type: "object", properties: { question: { type: "string" }, answer: { type: "string" } } } },
|
|
38
|
-
approaches: { type: "array", items: { type: "object", properties: { name: { type: "string" }, tradeoffs: { type: "string" } } } },
|
|
39
|
-
chosenApproach: { type: "string" },
|
|
40
|
-
chosenRationale: { type: "string" },
|
|
41
|
-
openQuestions: { type: "array", items: { type: "string" } },
|
|
42
|
-
amends: { type: "string" },
|
|
43
|
-
existingDocs: { type: "array", items: { type: "string" } },
|
|
44
|
-
notes: { type: "string" },
|
|
45
|
-
},
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
const DESIGN_SHAPE = {
|
|
49
|
-
type: "object",
|
|
50
|
-
required: ["tasks"],
|
|
51
|
-
properties: {
|
|
52
|
-
tasks: {
|
|
53
|
-
type: "array",
|
|
54
|
-
minItems: 1,
|
|
55
|
-
items: {
|
|
56
|
-
type: "object",
|
|
57
|
-
required: ["id", "description", "acceptance"],
|
|
58
|
-
properties: {
|
|
59
|
-
id: { type: "string" },
|
|
60
|
-
description: { type: "string" },
|
|
61
|
-
acceptance: { type: "string" },
|
|
62
|
-
files: { type: "array", items: { type: "string" } },
|
|
63
|
-
dependsOn: { type: "array", items: { type: "string" } },
|
|
64
|
-
},
|
|
65
|
-
},
|
|
66
|
-
},
|
|
67
|
-
notes: { type: "string" },
|
|
68
|
-
},
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
const INTEGRATE_SHAPE = {
|
|
72
|
-
type: "object",
|
|
73
|
-
required: ["merged", "conflicts", "skipped_pristine"],
|
|
74
|
-
properties: {
|
|
75
|
-
merged: {
|
|
76
|
-
type: "array",
|
|
77
|
-
items: { type: "object", properties: { taskId: { type: "string" }, branch: { type: "string" }, sha: { type: "string" } } },
|
|
78
|
-
},
|
|
79
|
-
conflicts: {
|
|
80
|
-
type: "array",
|
|
81
|
-
items: { type: "object", properties: { taskId: { type: "string" }, branch: { type: "string" }, error: { type: "string" } } },
|
|
82
|
-
},
|
|
83
|
-
skipped_pristine: { type: "array", items: { type: "string" } },
|
|
84
|
-
},
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
const VERIFY_SHAPE = {
|
|
88
|
-
type: "object",
|
|
89
|
-
required: ["typecheck", "tests", "build", "allPassed"],
|
|
90
|
-
properties: {
|
|
91
|
-
typecheck: { enum: ["ok", "fail", "skipped"] },
|
|
92
|
-
tests: {
|
|
93
|
-
type: "object",
|
|
94
|
-
required: ["passed", "failed"],
|
|
95
|
-
properties: {
|
|
96
|
-
passed: { type: "number" },
|
|
97
|
-
failed: { type: "number" },
|
|
98
|
-
output: { type: "string" },
|
|
99
|
-
},
|
|
100
|
-
},
|
|
101
|
-
build: { enum: ["ok", "fail", "skipped"] },
|
|
102
|
-
allPassed: { type: "boolean" },
|
|
103
|
-
failures: { type: "string" },
|
|
104
|
-
},
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
const REVIEW_SHAPE = {
|
|
108
|
-
type: "object",
|
|
109
|
-
required: ["critical", "important", "minor", "readyToMerge"],
|
|
110
|
-
properties: {
|
|
111
|
-
critical: { type: "array", items: { type: "string" } },
|
|
112
|
-
important: { type: "array", items: { type: "string" } },
|
|
113
|
-
minor: { type: "array", items: { type: "string" } },
|
|
114
|
-
readyToMerge: { type: "boolean" },
|
|
115
|
-
},
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
const MERGE_SHAPE = {
|
|
119
|
-
type: "object",
|
|
120
|
-
required: ["committed", "action"],
|
|
121
|
-
properties: {
|
|
122
|
-
committed: { type: "boolean" },
|
|
123
|
-
sha: { type: "string" },
|
|
124
|
-
prUrl: { type: "string" },
|
|
125
|
-
action: { enum: ["commit", "commit+push", "commit+pr", "none"] },
|
|
126
|
-
},
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
// Accept args as either an object {task,type?,...} OR a JSON string OR a bare task
|
|
130
|
-
// string, because the AI-SDK tool boundary often serializes nested args as strings.
|
|
131
|
-
let _argsObj
|
|
132
|
-
if (typeof args === "object" && args !== null) {
|
|
133
|
-
_argsObj = args
|
|
134
|
-
} else if (typeof args === "string") {
|
|
135
|
-
try { _argsObj = JSON.parse(args) } catch (_) { _argsObj = { task: args } }
|
|
136
|
-
if (typeof _argsObj !== "object" || _argsObj === null) _argsObj = { task: args }
|
|
137
|
-
} else {
|
|
138
|
-
_argsObj = {}
|
|
139
|
-
}
|
|
140
|
-
const TASK = typeof _argsObj.task === "string" ? _argsObj.task : ""
|
|
141
|
-
if (!TASK) {
|
|
142
|
-
return { error: "no-task", message: "Pass args.task = '<request>'." }
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
const VALID_TYPES = ["feature", "bugfix", "refactor", "feedback"]
|
|
146
|
-
const argType = typeof _argsObj.type === "string" ? _argsObj.type : ""
|
|
147
|
-
const SKIP_BRAINSTORM = _argsObj.skip_brainstorm === true
|
|
148
|
-
const SKIP_REPORT = _argsObj.skip_report === true
|
|
149
|
-
// Per-batch worktree isolation. Independent tasks that would run concurrently MUST
|
|
150
|
-
// be isolated (parallel writes to one workspace conflict) — the runtime creates a
|
|
151
|
-
// worktree per task, the agent works in it, and an integrate agent merges it back.
|
|
152
|
-
// Decision is per batch: auto-isolate a batch iff it runs >1 task; a single-task
|
|
153
|
-
// batch stays sequential in the main workspace. args.isolate_worktrees forces it:
|
|
154
|
-
// true = always isolate, false = never. (Runtime worktree path verified by
|
|
155
|
-
// test/workflow/runtime-worktree.test.ts; not opt-in-off anymore.)
|
|
156
|
-
const ISOLATE_OVERRIDE =
|
|
157
|
-
_argsObj.isolate_worktrees === true ? true : _argsObj.isolate_worktrees === false ? false : undefined
|
|
158
|
-
const isolateBatch = (batchIds) =>
|
|
159
|
-
ISOLATE_OVERRIDE === true ? true : ISOLATE_OVERRIDE === false ? false : batchIds.length > 1
|
|
160
|
-
const MAX_CONCURRENT =
|
|
161
|
-
typeof _argsObj.maxConcurrent === "number" && _argsObj.maxConcurrent > 0 ? _argsObj.maxConcurrent : DEFAULT_MAX_CONCURRENT
|
|
162
|
-
|
|
163
|
-
// Docs dir injected by the host (workflow.ts) from ConfigCompose.resolveDocsDir,
|
|
164
|
-
// mirroring the <compose_docs_dir> block prompt.ts gives the interactive compose
|
|
165
|
-
// agent. Default keeps the workflow self-sufficient if the host didn't inject.
|
|
166
|
-
const DOCS_DIR = typeof _argsObj._composeDocsDir === "string" && _argsObj._composeDocsDir ? _argsObj._composeDocsDir : "docs/compose"
|
|
167
|
-
const SPECS_DIR = DOCS_DIR + "/specs"
|
|
168
|
-
const PLANS_DIR = DOCS_DIR + "/plans"
|
|
169
|
-
const REPORTS_DIR = DOCS_DIR + "/reports"
|
|
170
|
-
const docsBlock =
|
|
171
|
-
"<compose_docs_dir>\n" +
|
|
172
|
-
"Save compose skill outputs: specs in `" + SPECS_DIR + "`, plans in `" + PLANS_DIR + "`, reports in `" + REPORTS_DIR + "`.\n" +
|
|
173
|
-
"</compose_docs_dir>"
|
|
174
|
-
|
|
175
|
-
// Slug for the per-run report filename. feature_name overrides; else slugify task.
|
|
176
|
-
// Strip trailing dashes AFTER the length cap too, so a 60-char cut that lands on a
|
|
177
|
-
// separator doesn't leave an ugly trailing "-" in the filename.
|
|
178
|
-
const FEATURE_NAME =
|
|
179
|
-
((typeof _argsObj.feature_name === "string" && _argsObj.feature_name ? _argsObj.feature_name : TASK)
|
|
180
|
-
.toLowerCase()
|
|
181
|
-
.replace(/[^a-z0-9]+/g, "-")
|
|
182
|
-
.replace(/^-+|-+$/g, "")
|
|
183
|
-
.slice(0, 60)
|
|
184
|
-
.replace(/-+$/, "")) || "compose-run"
|
|
185
|
-
const REPORT_PATH = REPORTS_DIR + "/" + FEATURE_NAME + ".md"
|
|
186
|
-
|
|
187
|
-
// ---------------------------------------------------------------------------
|
|
188
|
-
// Phase 0 — Brainstorm (autonomous-mode contract: context recon only, never-ask)
|
|
189
|
-
// ---------------------------------------------------------------------------
|
|
190
|
-
phase("Brainstorm")
|
|
191
|
-
const SYNTHETIC_CONTEXT = { projectType: "unknown", conventions: [], recentChanges: [], relevantFiles: [] }
|
|
192
|
-
// Surface any prior compose artifacts so brainstorm can detect an AMENDMENT (a
|
|
193
|
-
// change to an existing feature) vs new work — enabling incremental re-runs that
|
|
194
|
-
// reuse the existing spec/plan instead of regenerating everything. The workflow
|
|
195
|
-
// only lists the files; the agent reads + judges.
|
|
196
|
-
const _globArr = async (pat) => { const r = await glob(pat); return Array.isArray(r) ? r : [] }
|
|
197
|
-
const existingDocs = [
|
|
198
|
-
...(await _globArr(SPECS_DIR + "/*.md")),
|
|
199
|
-
...(await _globArr(PLANS_DIR + "/*.md")),
|
|
200
|
-
...(await _globArr(REPORTS_DIR + "/*.md")),
|
|
201
|
-
]
|
|
202
|
-
const existingDocsBlock = existingDocs.length
|
|
203
|
-
? "\n## Existing compose artifacts (this project has prior compose work)\n" +
|
|
204
|
-
existingDocs.map((p) => "- " + p).join("\n") + "\n" +
|
|
205
|
-
"If the task below is a CHANGE/ADDITION to a feature documented above, READ the relevant spec/plan (use the `read` tool) " +
|
|
206
|
-
"and treat this as an AMENDMENT: set `amends` to that feature's name and list the docs you used in `existingDocs`. " +
|
|
207
|
-
"If the task is unrelated/new, leave `amends` empty.\n"
|
|
208
|
-
: ""
|
|
209
|
-
let brainstorm
|
|
210
|
-
if (SKIP_BRAINSTORM) {
|
|
211
|
-
brainstorm = { context: SYNTHETIC_CONTEXT, assumptions: [] }
|
|
212
|
-
} else {
|
|
213
|
-
brainstorm = await agent(
|
|
214
|
-
"Apply the `compose:brainstorm` skill in AUTONOMOUS mode — no user is available to answer. Use the `skill` tool to load it first.\n\n" +
|
|
215
|
-
"## Autonomous brainstorming — self-conduct the dialogue (do NOT stop at context recon)\n" +
|
|
216
|
-
"'No user' means you ask and answer the questions YOURSELF; it does NOT mean skip the thinking. Run the real brainstorm:\n" +
|
|
217
|
-
"1. Explore project context (files, docs, recent commits, layout) and note assumptions.\n" +
|
|
218
|
-
"2. Pose the clarifying questions you WOULD ask a user, and answer each from the context/your best judgment (record as selfQA).\n" +
|
|
219
|
-
"3. Propose 2-3 distinct approaches with trade-offs (record as approaches).\n" +
|
|
220
|
-
"4. Pick ONE and justify it (chosenApproach + chosenRationale). Note any unresolved openQuestions.\n" +
|
|
221
|
-
"Do NOT present a design to a user, do NOT wait for approval, do NOT write a spec here — that is Design's job. " +
|
|
222
|
-
"This reasoning is the KEY input Design consumes, so capture it fully in the structured output.\n\n" +
|
|
223
|
-
"## Task\n" + TASK + "\n\n" +
|
|
224
|
-
existingDocsBlock +
|
|
225
|
-
"## Context to gather\n" +
|
|
226
|
-
"- Read AGENTS.md / CLAUDE.md / README.md if present\n" +
|
|
227
|
-
"- Skim recent commits (`git log --oneline -20`)\n" +
|
|
228
|
-
"- Map top-level directory layout; identify files relevant to the task\n\n" +
|
|
229
|
-
"Return structured output only.",
|
|
230
|
-
{ label: "brainstorm", phase: "Brainstorm", schema: BRAINSTORM_SHAPE }
|
|
231
|
-
)
|
|
232
|
-
if (!brainstorm || !brainstorm.context) brainstorm = { context: SYNTHETIC_CONTEXT, assumptions: [] }
|
|
233
|
-
}
|
|
234
|
-
const _arr = (v) => (Array.isArray(v) ? v : [])
|
|
235
|
-
const contextDigest =
|
|
236
|
-
"Project: " + brainstorm.context.projectType + "\n" +
|
|
237
|
-
"Conventions:\n" + _arr(brainstorm.context.conventions).map((c) => "- " + c).join("\n") + "\n" +
|
|
238
|
-
"Recent changes:\n" + _arr(brainstorm.context.recentChanges).map((c) => "- " + c).join("\n") + "\n" +
|
|
239
|
-
"Relevant files:\n" + _arr(brainstorm.context.relevantFiles).map((f) => "- " + f).join("\n") +
|
|
240
|
-
(_arr(brainstorm.assumptions).length ? "\nAssumptions:\n" + _arr(brainstorm.assumptions).map((a) => "- " + a).join("\n") : "") +
|
|
241
|
-
(_arr(brainstorm.selfQA).length ? "\nSelf-Q&A (brainstorm reasoning):\n" + _arr(brainstorm.selfQA).map((q) => "- Q: " + (q && q.question) + "\n A: " + (q && q.answer)).join("\n") : "") +
|
|
242
|
-
(_arr(brainstorm.approaches).length ? "\nApproaches considered:\n" + _arr(brainstorm.approaches).map((a) => "- " + (a && a.name) + " — " + (a && a.tradeoffs)).join("\n") : "") +
|
|
243
|
-
((brainstorm.chosenApproach && typeof brainstorm.chosenApproach === "string") ? "\nChosen approach: " + brainstorm.chosenApproach + (brainstorm.chosenRationale ? " (because: " + brainstorm.chosenRationale + ")" : "") : "") +
|
|
244
|
-
(_arr(brainstorm.openQuestions).length ? "\nOpen questions:\n" + _arr(brainstorm.openQuestions).map((q) => "- " + q).join("\n") : "") +
|
|
245
|
-
((brainstorm.amends && typeof brainstorm.amends === "string") ? "\nAmends existing feature: " + brainstorm.amends : "")
|
|
246
|
-
|
|
247
|
-
// ---------------------------------------------------------------------------
|
|
248
|
-
// Type resolution (no separate Classify phase)
|
|
249
|
-
// ---------------------------------------------------------------------------
|
|
250
|
-
// First-principles: picking the design skill is a low-risk, reversible routing
|
|
251
|
-
// decision the later Design/Implement phases can self-correct — it does NOT
|
|
252
|
-
// warrant its own LLM phase (the original compose flow has no classifier; it goes
|
|
253
|
-
// brainstorm → compose:plan). So: honor an explicit args.type; otherwise default
|
|
254
|
-
// to "feature" (→ compose:plan) and let a cheap keyword heuristic divert obvious
|
|
255
|
-
// bugfix / PR-feedback tasks. The design agent re-judges with full context anyway.
|
|
256
|
-
let type
|
|
257
|
-
if (VALID_TYPES.indexOf(argType) >= 0) {
|
|
258
|
-
type = argType
|
|
259
|
-
} else {
|
|
260
|
-
const t = TASK.toLowerCase()
|
|
261
|
-
if (/\b(pr|review)\b.*\b(feedback|comment|address)\b|address .*\bfeedback\b/.test(t)) type = "feedback"
|
|
262
|
-
else if (/\b(bug|broken|regression|crash|fails?|incorrect|wrong|error)\b/.test(t)) type = "bugfix"
|
|
263
|
-
else type = "feature"
|
|
264
|
-
log("Task type: " + type)
|
|
265
|
-
}
|
|
266
|
-
|
|
267
|
-
const SKILL_BY_TYPE = {
|
|
268
|
-
feature: "compose:plan",
|
|
269
|
-
refactor: "compose:plan",
|
|
270
|
-
bugfix: "compose:debug",
|
|
271
|
-
feedback: "compose:feedback",
|
|
272
|
-
}
|
|
273
|
-
|
|
274
|
-
// ---------------------------------------------------------------------------
|
|
275
|
-
// Phase 2 — Design (spec/plan, context-grounded, dependency-aware)
|
|
276
|
-
// ---------------------------------------------------------------------------
|
|
277
|
-
phase("Design")
|
|
278
|
-
const designSkill = SKILL_BY_TYPE[type] || "compose:plan"
|
|
279
|
-
const SPEC_PATH = SPECS_DIR + "/" + FEATURE_NAME + ".md"
|
|
280
|
-
const PLAN_PATH = PLANS_DIR + "/" + FEATURE_NAME + ".md"
|
|
281
|
-
// Amendment: brainstorm flagged this as a change to an existing feature. Design
|
|
282
|
-
// edits the existing spec/plan in place and re-runs only the affected tasks,
|
|
283
|
-
// instead of regenerating everything.
|
|
284
|
-
const AMENDS = brainstorm && typeof brainstorm.amends === "string" ? brainstorm.amends.trim() : ""
|
|
285
|
-
|
|
286
|
-
// Step 1 — the AGENT writes (or amends) the spec + plan files. The workflow does
|
|
287
|
-
// NOT write them; it only gates on existence and re-dispatches if skipped. No
|
|
288
|
-
// `schema` here so the agent is free to use its write/skill tools.
|
|
289
|
-
const runDesignWrite = (sharpen) => agent(
|
|
290
|
-
"Apply the `" + designSkill + "` skill to the task below. Use the `skill` tool to load the skill FIRST, then follow it.\n\n" +
|
|
291
|
-
docsBlock + "\n\n" +
|
|
292
|
-
"## Task\n" + TASK + "\n\n" +
|
|
293
|
-
"## Project context (from brainstorm)\n" + contextDigest + "\n\n" +
|
|
294
|
-
(AMENDS
|
|
295
|
-
? "## This is an AMENDMENT to an existing feature: " + AMENDS + "\n" +
|
|
296
|
-
"Use `glob`/`read` to find that feature's existing spec under `" + SPECS_DIR + "` and plan under `" + PLANS_DIR + "`. " +
|
|
297
|
-
"EDIT them IN PLACE (write back to the SAME file paths) to reflect ONLY the change in the task above — do NOT rewrite from scratch. " +
|
|
298
|
-
"In the plan, the task list must then contain ONLY the tasks that need to be (re-)implemented for this change, PLUS any tasks that " +
|
|
299
|
-
"depend on them. Tasks unaffected by the change MUST be omitted from the actionable list — they are reused as-is.\n\n" +
|
|
300
|
-
"## Scope the work to the actual change (CRITICAL)\n" +
|
|
301
|
-
"First assess the MAGNITUDE of this change: small (one spot / a few lines), medium (a few related tasks), " +
|
|
302
|
-
"or large (a foundational refactor touching many modules). Make the plan's actionable task list MATCH that magnitude:\n" +
|
|
303
|
-
"- Small change → ONE task (or zero, if the code already satisfies it). Do NOT split one small change into multiple tasks.\n" +
|
|
304
|
-
"- Medium → only the genuinely distinct tasks the change requires, plus their dependents.\n" +
|
|
305
|
-
"- Large refactor → re-decompose into as many independent tasks as the work truly needs.\n" +
|
|
306
|
-
"NEVER emit two near-identical or duplicate tasks for the same change. One distinct unit of work = exactly one task. " +
|
|
307
|
-
"The number of tasks must reflect the real scope — it is not fixed.\n\n" +
|
|
308
|
-
"Write the updated files with the `write` tool. Do not just describe them.\n"
|
|
309
|
-
: "## Your deliverable (REQUIRED — this is the whole job)\n" +
|
|
310
|
-
"Use the `write` tool to create BOTH of these files on disk:\n" +
|
|
311
|
-
"1. Spec: `" + SPEC_PATH + "`\n" +
|
|
312
|
-
"2. Plan: `" + PLAN_PATH + "` — a bite-sized task list per the skill, each task with id, description, acceptance, optional files, and `dependsOn` (empty for independent tasks; a prerequisite task id otherwise; no cycles).\n\n" +
|
|
313
|
-
(sharpen ? "## You did NOT write the required files last time. Write them NOW with the write tool before finishing.\n\n" : "") +
|
|
314
|
-
"Do the writes with the `write` tool. Do not just describe them."),
|
|
315
|
-
{ label: "design:" + type, phase: "Design" }
|
|
316
|
-
)
|
|
317
|
-
await runDesignWrite(false)
|
|
318
|
-
// Gate: the agent owns the writes; the workflow only verifies they happened and
|
|
319
|
-
// re-dispatches the agent once if not. The workflow itself never writes the files.
|
|
320
|
-
// Robustness: the agent may write under a slightly different leaf name than our
|
|
321
|
-
// computed slug (model-chosen filename, trailing-dash drift, etc.). So treat the
|
|
322
|
-
// gate as "did ANY .md land in the specs and plans dirs", not an exact-path match —
|
|
323
|
-
// this avoids a redundant, expensive re-dispatch when the files are actually there.
|
|
324
|
-
const docsPresent = async () => {
|
|
325
|
-
const specs = await glob(SPECS_DIR + "/*.md")
|
|
326
|
-
const plans = await glob(PLANS_DIR + "/*.md")
|
|
327
|
-
return specs.length > 0 && plans.length > 0
|
|
328
|
-
}
|
|
329
|
-
if (!(await docsPresent())) {
|
|
330
|
-
await runDesignWrite(true)
|
|
331
|
-
}
|
|
332
|
-
const specWritten = (await glob(SPECS_DIR + "/*.md")).length > 0
|
|
333
|
-
const planWritten = (await glob(PLANS_DIR + "/*.md")).length > 0
|
|
334
|
-
|
|
335
|
-
// Step 2 — structured extraction: a separate agent reads the plan the previous
|
|
336
|
-
// agent wrote and returns the machine-usable task list. Schema lives here, where
|
|
337
|
-
// JSON-only is exactly what we want — no file work expected in this call. The
|
|
338
|
-
// prompt FORCES a direct StructuredOutput tool call: the model otherwise tends to
|
|
339
|
-
// answer with prose/markdown/XML, which fails schema validation and triggers a
|
|
340
|
-
// slow retry loop (each round-trip is a full model call).
|
|
341
|
-
const design = await agent(
|
|
342
|
-
"Read the implementation plan markdown in `" + PLANS_DIR + "` (use the `read` tool; if multiple files, read the most recent) and extract its task list.\n\n" +
|
|
343
|
-
(planWritten ? "" : "## No plan file found — derive the task list from the task below instead.\n## Task\n" + TASK + "\n\n") +
|
|
344
|
-
(AMENDS ? "## Amendment\nThis run amends the existing feature \"" + AMENDS + "\". Return the SMALLEST set of tasks that covers the actual change (plus their dependents). One distinct unit of work = exactly one task — do NOT return duplicate or near-identical tasks, and do NOT split a single small change across multiple tasks. OMIT every task unaffected by this change — they are reused as-is.\n\n" : "") +
|
|
345
|
-
"## Output contract (STRICT)\n" +
|
|
346
|
-
"Call the `StructuredOutput` tool EXACTLY ONCE with a JSON object matching the schema. " +
|
|
347
|
-
"Do NOT reply with prose, markdown, XML, or a code block — those do not count and will be rejected. " +
|
|
348
|
-
"The JSON has a `tasks` array; each task: id, description, acceptance, optional files[], and dependsOn[] " +
|
|
349
|
-
"(empty for independent tasks; a prerequisite task id otherwise; no cycles).",
|
|
350
|
-
{ label: "design-extract:" + type, phase: "Design", schema: DESIGN_SHAPE }
|
|
351
|
-
)
|
|
352
|
-
if (!design || !Array.isArray(design.tasks) || design.tasks.length === 0) {
|
|
353
|
-
return { error: "design-failed", type, brainstorm, docs: { specWritten, planWritten } }
|
|
354
|
-
}
|
|
355
|
-
// Normalize task ids: the extract agent sometimes returns tasks with a missing or
|
|
356
|
-
// blank `id` (schema validation can let an empty string through), which then shows
|
|
357
|
-
// up as "implement:undefined" in labels and breaks dependsOn wiring. Backfill any
|
|
358
|
-
// missing/duplicate id with a synthetic Tn so labels, topo-sort, and deps are stable.
|
|
359
|
-
{
|
|
360
|
-
const seen = Object.create(null)
|
|
361
|
-
let n = 0
|
|
362
|
-
for (const t of design.tasks) {
|
|
363
|
-
n++
|
|
364
|
-
const raw = typeof t.id === "string" ? t.id.trim() : ""
|
|
365
|
-
t.id = raw && !seen[raw] ? raw : "T" + n
|
|
366
|
-
seen[t.id] = true
|
|
367
|
-
}
|
|
368
|
-
}
|
|
369
|
-
log("Designed " + design.tasks.length + " task(s) using " + designSkill + " (spec=" + specWritten + " plan=" + planWritten + ")")
|
|
370
|
-
|
|
371
|
-
// Topo-sort (Kahn) over design.tasks by dependsOn → ordered batches.
|
|
372
|
-
const topoSort = (tasks) => {
|
|
373
|
-
const byId = Object.create(null)
|
|
374
|
-
for (const t of tasks) byId[t.id] = t
|
|
375
|
-
const indeg = Object.create(null)
|
|
376
|
-
const deps = Object.create(null)
|
|
377
|
-
for (const t of tasks) {
|
|
378
|
-
deps[t.id] = (t.dependsOn || []).filter((d) => byId[d])
|
|
379
|
-
indeg[t.id] = deps[t.id].length
|
|
380
|
-
}
|
|
381
|
-
const batches = []
|
|
382
|
-
let remaining = tasks.map((t) => t.id)
|
|
383
|
-
while (remaining.length) {
|
|
384
|
-
const ready = remaining.filter((id) => indeg[id] === 0)
|
|
385
|
-
if (!ready.length) return { error: "design-cycle", cycleNodes: remaining }
|
|
386
|
-
batches.push(ready)
|
|
387
|
-
const readySet = Object.create(null)
|
|
388
|
-
for (const id of ready) readySet[id] = true
|
|
389
|
-
remaining = remaining.filter((id) => !readySet[id])
|
|
390
|
-
for (const id of remaining) {
|
|
391
|
-
indeg[id] = deps[id].filter((d) => !readySet[d] && remaining.indexOf(d) >= 0).length
|
|
392
|
-
}
|
|
393
|
-
}
|
|
394
|
-
return { batches }
|
|
395
|
-
}
|
|
396
|
-
const topo = topoSort(design.tasks)
|
|
397
|
-
if (topo.error) {
|
|
398
|
-
return { error: "design-cycle", cycleNodes: topo.cycleNodes, type, brainstorm, design }
|
|
399
|
-
}
|
|
400
|
-
const batches = topo.batches
|
|
401
|
-
const taskById = Object.create(null)
|
|
402
|
-
for (const t of design.tasks) taskById[t.id] = t
|
|
403
|
-
|
|
404
|
-
// Intent carried from brainstorm/design into each implementer so it builds toward
|
|
405
|
-
// the CHOSEN approach, not its own re-derivation. Plan path lets it read the spec.
|
|
406
|
-
const intentBlock =
|
|
407
|
-
((brainstorm.chosenApproach && typeof brainstorm.chosenApproach === "string")
|
|
408
|
-
? "## Intent (from design — build toward THIS approach)\n" + brainstorm.chosenApproach +
|
|
409
|
-
(brainstorm.chosenRationale ? "\nRationale: " + brainstorm.chosenRationale : "") + "\n" +
|
|
410
|
-
"Spec/plan for the whole feature: `" + SPEC_PATH + "` / `" + PLAN_PATH + "` (read if you need fuller context).\n\n"
|
|
411
|
-
: "")
|
|
412
|
-
|
|
413
|
-
// ---------------------------------------------------------------------------
|
|
414
|
-
// Helpers: implement (per-task, worktree), integrate, verify, debug, report
|
|
415
|
-
// ---------------------------------------------------------------------------
|
|
416
|
-
const runImplementTask = (task, failuresOrEmpty, isolate) => agent(
|
|
417
|
-
"Apply the `compose:tdd` skill. Use the `skill` tool to load it before working.\n\n" +
|
|
418
|
-
"## Overall task\n" + TASK + "\n\n" +
|
|
419
|
-
intentBlock +
|
|
420
|
-
"## Your work item (" + task.id + ")\n" + task.description + "\nAcceptance: " + task.acceptance +
|
|
421
|
-
(task.files && task.files.length ? "\nFiles: " + task.files.join(", ") : "") + "\n\n" +
|
|
422
|
-
(failuresOrEmpty ? "## Verify failures from previous attempt — focus on these\n" + failuresOrEmpty + "\n\n" : "") +
|
|
423
|
-
"Write the failing test first (use the `write` tool), then the minimal code to pass, then refactor. " +
|
|
424
|
-
"Actually create the source and test files on disk with the `write` tool — do not just describe them. " +
|
|
425
|
-
(isolate ? "Commit your work inside this worktree." : "Commit your work in the workspace."),
|
|
426
|
-
isolate
|
|
427
|
-
? { label: "implement:" + task.id, phase: "Implement", isolation: "worktree" }
|
|
428
|
-
: { label: "implement:" + task.id, phase: "Implement" }
|
|
429
|
-
)
|
|
430
|
-
|
|
431
|
-
const runIntegrate = (kept) => agent(
|
|
432
|
-
"Integrate the per-task worktrees below into the main workspace.\n\n" +
|
|
433
|
-
"## Worktrees to merge\n" + JSON.stringify(kept) + "\n\n" +
|
|
434
|
-
"For each `_worktree`, fetch its branch into the main workspace and merge (or fast-forward) it onto current HEAD. " +
|
|
435
|
-
"Resolve trivial conflicts (whitespace, import order, formatting) automatically. Surface real conflicts unmodified. " +
|
|
436
|
-
"Then `git worktree remove` each integrated worktree.\n\n" +
|
|
437
|
-
"Return structured output only.",
|
|
438
|
-
{ label: "integrate", phase: "Implement", schema: INTEGRATE_SHAPE }
|
|
439
|
-
)
|
|
440
|
-
|
|
441
|
-
const runVerify = () => agent(
|
|
442
|
-
"Apply the `compose:verify` skill. Use the `skill` tool to load it FIRST, then follow its discipline " +
|
|
443
|
-
"(the Iron Law: no completion claim without fresh verification evidence — run the real commands, read the full output, " +
|
|
444
|
-
"never trust 'should pass' or an agent's self-report).\n\n" +
|
|
445
|
-
"## Run the project's verification commands and report the outcome\n" +
|
|
446
|
-
"1. First run `pwd` and `ls` to confirm your working directory and that the project's source/test files are actually present here. The implemented code lives in THIS workspace — verify from the workspace root (or the package subdir AGENTS.md specifies), never from a stale or temp cwd.\n" +
|
|
447
|
-
"2. Inspect AGENTS.md / CLAUDE.md / package.json for the project's verify commands (typecheck, test, build).\n" +
|
|
448
|
-
"3. Run them via the Bash tool from the correct directory. If a command reports 'file not found' or 0 tests, you are in the wrong directory — `cd` to where the files are and re-run before reporting.\n" +
|
|
449
|
-
"4. Capture passed/failed test counts from the ACTUAL command output. Summarize failures concisely if any.\n\n" +
|
|
450
|
-
"Return structured output only — and it must reflect the real command output, not an assumption.",
|
|
451
|
-
{ label: "verify", phase: "Verify", schema: VERIFY_SHAPE }
|
|
452
|
-
)
|
|
453
|
-
|
|
454
|
-
const runDebug = (failures) => agent(
|
|
455
|
-
"Apply the `compose:debug` skill. Use the `skill` tool to load it before working.\n\n" +
|
|
456
|
-
"## Verify failures / integrate conflicts\n" + failures + "\n\n" +
|
|
457
|
-
"Identify the root cause and fix it. Do not paper over symptoms.",
|
|
458
|
-
{ label: "debug", phase: "Implement" }
|
|
459
|
-
)
|
|
460
|
-
|
|
461
|
-
const runIterationReport = async (iteration, verifyResult) => {
|
|
462
|
-
if (SKIP_REPORT) return null
|
|
463
|
-
// The agent writes the markdown report file. No schema — a schema would bias the
|
|
464
|
-
// agent into emitting JSON instead of doing the write. The workflow only verifies
|
|
465
|
-
// the file exists afterward.
|
|
466
|
-
await agent(
|
|
467
|
-
"Apply the `compose:report` skill in per-iteration mode. Use the `skill` tool to load it first.\n\n" +
|
|
468
|
-
docsBlock + "\n\n" +
|
|
469
|
-
"## Report file you MUST write (overwrite-in-place, accumulate Journey Log)\n" + REPORT_PATH + "\n\n" +
|
|
470
|
-
"## Iteration\n" + iteration + "\n\n" +
|
|
471
|
-
"## Overall task\n" + TASK + "\n\n" +
|
|
472
|
-
"## Verify result\n" + JSON.stringify(verifyResult) + "\n\n" +
|
|
473
|
-
"Read the existing report if present (use `read`), update sections, append a Journey Log entry for this iteration, " +
|
|
474
|
-
"and write the file with the `write` tool. Keep it brief. Writing the file is the deliverable — do not just describe it.",
|
|
475
|
-
{ label: "iteration-report:" + iteration, phase: "Report" }
|
|
476
|
-
)
|
|
477
|
-
return { iteration, written: await exists(REPORT_PATH) }
|
|
478
|
-
}
|
|
479
|
-
|
|
480
|
-
// Dispatch a batch of tasks in parallel, each isolated in its own worktree, then
|
|
481
|
-
// integrate the kept worktrees. Returns { perTaskResults, integrate }.
|
|
482
|
-
const runBatch = async (batchIds, failuresOrEmpty) => {
|
|
483
|
-
const tasks = batchIds.map((id) => taskById[id])
|
|
484
|
-
const perTaskResults = []
|
|
485
|
-
const kept = []
|
|
486
|
-
// Per-batch isolation: a batch with >1 independent task auto-isolates (worktree
|
|
487
|
-
// per task) so they can run CONCURRENTLY without clobbering the shared workspace;
|
|
488
|
-
// a single-task batch stays sequential in the main workspace. args.isolate_worktrees
|
|
489
|
-
// forces either way. parallel() is gated on ISOLATE for exactly this reason.
|
|
490
|
-
const ISOLATE = isolateBatch(batchIds)
|
|
491
|
-
const limit = ISOLATE ? Math.min(MAX_CONCURRENT, tasks.length) : 1
|
|
492
|
-
for (let i = 0; i < tasks.length; i += limit) {
|
|
493
|
-
const chunk = tasks.slice(i, i + limit)
|
|
494
|
-
const results = await parallel(chunk.map((t) => () => runImplementTask(t, failuresOrEmpty, ISOLATE)))
|
|
495
|
-
for (let j = 0; j < chunk.length; j++) {
|
|
496
|
-
const t = chunk[j]
|
|
497
|
-
const r = results[j]
|
|
498
|
-
if (ISOLATE) {
|
|
499
|
-
const wt = r && typeof r === "object" ? r._worktree : null
|
|
500
|
-
if (wt && wt.changed) {
|
|
501
|
-
kept.push({ taskId: t.id, _worktree: wt })
|
|
502
|
-
perTaskResults.push({ taskId: t.id, status: "ok", branch: wt.branch })
|
|
503
|
-
} else if (r === null) {
|
|
504
|
-
perTaskResults.push({ taskId: t.id, status: "failed" })
|
|
505
|
-
} else {
|
|
506
|
-
perTaskResults.push({ taskId: t.id, status: "pristine" })
|
|
507
|
-
}
|
|
508
|
-
} else {
|
|
509
|
-
// Non-isolated: the agent wrote directly into the main workspace. A non-null
|
|
510
|
-
// result means it ran; failure surfaces as null. No worktree to integrate.
|
|
511
|
-
perTaskResults.push({ taskId: t.id, status: r === null ? "failed" : "ok" })
|
|
512
|
-
}
|
|
513
|
-
}
|
|
514
|
-
}
|
|
515
|
-
// Integrate only when isolated worktrees were kept. In non-isolated mode the work
|
|
516
|
-
// already lives in the main workspace, so there is nothing to merge.
|
|
517
|
-
const integrate = kept.length
|
|
518
|
-
? await runIntegrate(kept)
|
|
519
|
-
: { merged: [], conflicts: [], skipped_pristine: perTaskResults.filter((r) => r.status !== "ok").map((r) => r.taskId) }
|
|
520
|
-
return { perTaskResults, integrate: integrate || { merged: [], conflicts: [], skipped_pristine: [] } }
|
|
521
|
-
}
|
|
522
|
-
|
|
523
|
-
// ---------------------------------------------------------------------------
|
|
524
|
-
// Phase 3 — Implement (TDD outer loop, ≤3 attempts)
|
|
525
|
-
// ---------------------------------------------------------------------------
|
|
526
|
-
phase("Implement")
|
|
527
|
-
const verifyHistory = []
|
|
528
|
-
const implementHistory = []
|
|
529
|
-
let verify = null
|
|
530
|
-
let tddAttempts = 0
|
|
531
|
-
for (let attempt = 0; attempt < MAX_TDD_ATTEMPTS; attempt++) {
|
|
532
|
-
tddAttempts = attempt + 1
|
|
533
|
-
const failures = attempt === 0 ? "" : (verify && verify.failures ? verify.failures : "")
|
|
534
|
-
let attemptConflicts = []
|
|
535
|
-
const perTaskResults = []
|
|
536
|
-
const integrateHistory = []
|
|
537
|
-
for (const batchIds of batches) {
|
|
538
|
-
const batchOut = await runBatch(batchIds, failures)
|
|
539
|
-
for (const r of batchOut.perTaskResults) perTaskResults.push(r)
|
|
540
|
-
integrateHistory.push(batchOut.integrate)
|
|
541
|
-
if (batchOut.integrate.conflicts && batchOut.integrate.conflicts.length) {
|
|
542
|
-
attemptConflicts = attemptConflicts.concat(batchOut.integrate.conflicts)
|
|
543
|
-
}
|
|
544
|
-
}
|
|
545
|
-
|
|
546
|
-
phase("Verify")
|
|
547
|
-
verify = await runVerify()
|
|
548
|
-
if (verify) verifyHistory.push(verify)
|
|
549
|
-
const conflictText = attemptConflicts.length ? "\nIntegrate conflicts: " + JSON.stringify(attemptConflicts) : ""
|
|
550
|
-
const passed = verify && verify.allPassed && attemptConflicts.length === 0
|
|
551
|
-
|
|
552
|
-
implementHistory.push({
|
|
553
|
-
attempt: tddAttempts,
|
|
554
|
-
perTaskResults,
|
|
555
|
-
integrate: { batches: integrateHistory },
|
|
556
|
-
verify: verify || null,
|
|
557
|
-
})
|
|
558
|
-
|
|
559
|
-
if (passed) {
|
|
560
|
-
log("Verify passed on attempt " + tddAttempts)
|
|
561
|
-
phase("Report")
|
|
562
|
-
await runIterationReport(tddAttempts, verify)
|
|
563
|
-
break
|
|
564
|
-
}
|
|
565
|
-
if (attempt + 1 === MAX_TDD_ATTEMPTS) {
|
|
566
|
-
return { error: "verify-exhausted", type, brainstorm, design, batches, verifyHistory, implementHistory, attempts: MAX_TDD_ATTEMPTS }
|
|
567
|
-
}
|
|
568
|
-
phase("Implement")
|
|
569
|
-
await runDebug((verify ? (verify.failures || "verify returned no detail") : "verify agent failed (null)") + conflictText)
|
|
570
|
-
}
|
|
571
|
-
|
|
572
|
-
// ---------------------------------------------------------------------------
|
|
573
|
-
// Phase 4 — Review + Phase 5 — Fix loop (≤2 attempts)
|
|
574
|
-
// ---------------------------------------------------------------------------
|
|
575
|
-
const IMPLEMENTED_DIGEST = design.tasks.map((t) => "- " + t.id + ": " + t.description + " (acceptance: " + t.acceptance + ")").join("\n")
|
|
576
|
-
const runReview = () => agent(
|
|
577
|
-
"Apply the `compose:review` skill. Use the `skill` tool to load it FIRST, then follow it.\n\n" +
|
|
578
|
-
"Review the implemented change in TWO STAGES, spec-compliance BEFORE code-quality (this mirrors compose:subagent's two-stage gate):\n" +
|
|
579
|
-
"### Stage 1 — Spec compliance (evidence-gated)\n" +
|
|
580
|
-
"Run `git diff` (e.g. `git diff HEAD~<n>..HEAD`, or against the run's base) to see EXACTLY what changed, and read the changed files. " +
|
|
581
|
-
"For each acceptance criterion below, confirm with evidence from the diff/tests that it is met. Anything unmet or unverifiable is a CRITICAL finding. " +
|
|
582
|
-
"Do this from the diff + spec ALONE first — do not assume the implementer's claims are correct.\n" +
|
|
583
|
-
"### Stage 2 — Code quality\n" +
|
|
584
|
-
"Only once spec compliance holds, review the diff for quality: correctness bugs, missing error handling at real boundaries, tests that don't test, dead code, simplification.\n\n" +
|
|
585
|
-
"## Overall task\n" + TASK + "\n\n" +
|
|
586
|
-
intentBlock +
|
|
587
|
-
"## What was implemented (acceptance criteria to verify)\n" + IMPLEMENTED_DIGEST + "\n\n" +
|
|
588
|
-
"## What to produce\n" +
|
|
589
|
-
"Triage findings into critical (must fix before merge — includes ANY unmet spec/acceptance), important (should fix), and minor (nits). " +
|
|
590
|
-
"Set readyToMerge=true ONLY if critical is empty AND every acceptance criterion is met with evidence.\n\n" +
|
|
591
|
-
"Return structured output only.",
|
|
592
|
-
{ label: "review", phase: "Review", schema: REVIEW_SHAPE }
|
|
593
|
-
)
|
|
594
|
-
|
|
595
|
-
const runFixTask = (finding, i, isolate) => agent(
|
|
596
|
-
"Address the CRITICAL review finding below. Apply the `compose:tdd` skill to fix it with tests where possible. " +
|
|
597
|
-
"Use the `skill` tool to load it first.\n\n" +
|
|
598
|
-
"## Critical finding (" + (i + 1) + ")\n" + finding + "\n\n" +
|
|
599
|
-
"Fix it with the `write`/`edit` tools and commit " + (isolate ? "inside this worktree." : "in the workspace."),
|
|
600
|
-
isolate ? { label: "fix:" + i, phase: "Fix", isolation: "worktree" } : { label: "fix:" + i, phase: "Fix" }
|
|
601
|
-
)
|
|
602
|
-
|
|
603
|
-
phase("Review")
|
|
604
|
-
let review = await runReview()
|
|
605
|
-
if (!review) review = { critical: [], important: [], minor: [], readyToMerge: true }
|
|
606
|
-
let reviewFixAttempts = 0
|
|
607
|
-
const fixHistory = []
|
|
608
|
-
|
|
609
|
-
if (review.critical && review.critical.length > 0) {
|
|
610
|
-
phase("Fix")
|
|
611
|
-
for (let attempt = 0; attempt < MAX_REVIEW_FIX_ATTEMPTS; attempt++) {
|
|
612
|
-
reviewFixAttempts = attempt + 1
|
|
613
|
-
// Same per-batch rule as implement: isolate (worktree per fix) when >1 critical
|
|
614
|
-
// fix would run concurrently, or when forced; otherwise sequential in main workspace.
|
|
615
|
-
const ISOLATE = isolateBatch(review.critical.map((_, i) => "fix-" + i))
|
|
616
|
-
const limit = ISOLATE ? Math.min(MAX_CONCURRENT, review.critical.length) : 1
|
|
617
|
-
const perTaskResults = []
|
|
618
|
-
const kept = []
|
|
619
|
-
const criticals = review.critical
|
|
620
|
-
for (let i = 0; i < criticals.length; i += limit) {
|
|
621
|
-
const chunk = criticals.slice(i, i + limit)
|
|
622
|
-
const results = await parallel(chunk.map((finding, k) => () => runFixTask(finding, i + k, ISOLATE)))
|
|
623
|
-
for (let j = 0; j < chunk.length; j++) {
|
|
624
|
-
const r = results[j]
|
|
625
|
-
if (ISOLATE) {
|
|
626
|
-
const wt = r && typeof r === "object" ? r._worktree : null
|
|
627
|
-
if (wt && wt.changed) {
|
|
628
|
-
kept.push({ taskId: "fix-" + (i + j), _worktree: wt })
|
|
629
|
-
perTaskResults.push({ taskId: "fix-" + (i + j), status: "ok", branch: wt.branch })
|
|
630
|
-
} else {
|
|
631
|
-
perTaskResults.push({ taskId: "fix-" + (i + j), status: r === null ? "failed" : "pristine" })
|
|
632
|
-
}
|
|
633
|
-
} else {
|
|
634
|
-
perTaskResults.push({ taskId: "fix-" + (i + j), status: r === null ? "failed" : "ok" })
|
|
635
|
-
}
|
|
636
|
-
}
|
|
637
|
-
}
|
|
638
|
-
const integrate = kept.length ? (await runIntegrate(kept)) || { merged: [], conflicts: [], skipped_pristine: [] } : { merged: [], conflicts: [], skipped_pristine: [] }
|
|
639
|
-
|
|
640
|
-
phase("Verify")
|
|
641
|
-
const reverify = await runVerify()
|
|
642
|
-
if (reverify) verifyHistory.push(reverify)
|
|
643
|
-
|
|
644
|
-
phase("Review")
|
|
645
|
-
review = await runReview()
|
|
646
|
-
if (!review) review = { critical: [], important: [], minor: [], readyToMerge: false }
|
|
647
|
-
|
|
648
|
-
fixHistory.push({ attempt: reviewFixAttempts, perTaskResults, integrate, verify: reverify || null, review })
|
|
649
|
-
|
|
650
|
-
phase("Report")
|
|
651
|
-
await runIterationReport(MAX_TDD_ATTEMPTS + reviewFixAttempts, reverify)
|
|
652
|
-
|
|
653
|
-
if (!review.critical || review.critical.length === 0) {
|
|
654
|
-
log("Critical issues cleared on fix attempt " + reviewFixAttempts)
|
|
655
|
-
break
|
|
656
|
-
}
|
|
657
|
-
}
|
|
658
|
-
if (review.critical && review.critical.length > 0) {
|
|
659
|
-
return {
|
|
660
|
-
readyToMerge: false,
|
|
661
|
-
type, brainstorm, design, batches, verifyHistory, implementHistory, fixHistory, review,
|
|
662
|
-
attempts: { tdd: tddAttempts, reviewFix: reviewFixAttempts },
|
|
663
|
-
}
|
|
664
|
-
}
|
|
665
|
-
}
|
|
666
|
-
|
|
667
|
-
// ---------------------------------------------------------------------------
|
|
668
|
-
// Phase 6 — Final Report (consolidate, committed before merge)
|
|
669
|
-
// ---------------------------------------------------------------------------
|
|
670
|
-
let finalReport = null
|
|
671
|
-
if (!SKIP_REPORT) {
|
|
672
|
-
phase("Report")
|
|
673
|
-
// The agent writes the consolidated final report file; the workflow only gates
|
|
674
|
-
// on existence. No schema — writing the markdown is the deliverable.
|
|
675
|
-
await agent(
|
|
676
|
-
"Apply the `compose:report` skill in FINAL consolidation mode. Use the `skill` tool to load it first.\n\n" +
|
|
677
|
-
docsBlock + "\n\n" +
|
|
678
|
-
"## Report file you MUST write (read the in-progress per-iteration file, overwrite with canonical final state)\n" + REPORT_PATH + "\n\n" +
|
|
679
|
-
"## Overall task\n" + TASK + "\n\n" +
|
|
680
|
-
"## Run history\n" +
|
|
681
|
-
"verifyHistory: " + JSON.stringify(verifyHistory) + "\n" +
|
|
682
|
-
"implementHistory: " + JSON.stringify(implementHistory) + "\n" +
|
|
683
|
-
"reviewFixAttempts: " + reviewFixAttempts + "\n" +
|
|
684
|
-
"review: " + JSON.stringify(review) + "\n\n" +
|
|
685
|
-
"Produce the final-state report (What Was Built / Architecture / Design Decisions / Usage / Verification / Journey Log / Source Materials). " +
|
|
686
|
-
"Distill the Journey Log to at most 5 entries. Write the file with the `write` tool, then commit it. " +
|
|
687
|
-
"Writing the file is the deliverable — do not just describe it.",
|
|
688
|
-
{ label: "final-report", phase: "Report" }
|
|
689
|
-
)
|
|
690
|
-
// Re-dispatch once if the agent skipped the write.
|
|
691
|
-
if (!(await exists(REPORT_PATH))) {
|
|
692
|
-
await agent(
|
|
693
|
-
"The final report file `" + REPORT_PATH + "` does not exist yet. Apply `compose:report` and WRITE it now with the `write` tool " +
|
|
694
|
-
"(What Was Built / Architecture / Design Decisions / Usage / Verification / Journey Log / Source Materials) for the task: " + TASK,
|
|
695
|
-
{ label: "final-report-retry", phase: "Report" }
|
|
696
|
-
)
|
|
697
|
-
}
|
|
698
|
-
finalReport = { path: REPORT_PATH, written: await exists(REPORT_PATH) }
|
|
699
|
-
}
|
|
700
|
-
|
|
701
|
-
// ---------------------------------------------------------------------------
|
|
702
|
-
// Phase 7 — Merge
|
|
703
|
-
// ---------------------------------------------------------------------------
|
|
704
|
-
phase("Merge")
|
|
705
|
-
const merge = await agent(
|
|
706
|
-
"Apply the `compose:merge` skill. Use the `skill` tool to load it before working.\n\n" +
|
|
707
|
-
"## Task\n" + TASK + "\n\n" +
|
|
708
|
-
"## What was built (use this for the commit/PR message)\n" + IMPLEMENTED_DIGEST + "\n\n" +
|
|
709
|
-
((review && (_arr(review.important).length || _arr(review.minor).length))
|
|
710
|
-
? "## Review outcome (critical cleared; note any deferred items)\n" +
|
|
711
|
-
(_arr(review.important).length ? "Important (should follow up):\n" + _arr(review.important).map((x) => "- " + x).join("\n") + "\n" : "") +
|
|
712
|
-
(_arr(review.minor).length ? "Minor (nits):\n" + _arr(review.minor).map((x) => "- " + x).join("\n") + "\n" : "") + "\n"
|
|
713
|
-
: "") +
|
|
714
|
-
"Commit the changes. If the branch tracks a remote and a PR is appropriate, push and open one.\n" +
|
|
715
|
-
"Pick the smallest action that satisfies the goal:\n" +
|
|
716
|
-
"- `commit`: just record locally\n" +
|
|
717
|
-
"- `commit+push`: also push to the existing remote branch\n" +
|
|
718
|
-
"- `commit+pr`: push and open a PR\n\n" +
|
|
719
|
-
"Return structured output only.",
|
|
720
|
-
{ label: "merge", phase: "Merge", schema: MERGE_SHAPE }
|
|
721
|
-
)
|
|
722
|
-
if (!merge || !merge.committed) {
|
|
723
|
-
return {
|
|
724
|
-
error: "merge-failed",
|
|
725
|
-
type, brainstorm, design, batches, verifyHistory, implementHistory, review, finalReport,
|
|
726
|
-
merge: merge || { committed: false, action: "none" },
|
|
727
|
-
attempts: { tdd: tddAttempts, reviewFix: reviewFixAttempts },
|
|
728
|
-
}
|
|
729
|
-
}
|
|
730
|
-
|
|
731
|
-
return {
|
|
732
|
-
brainstorm,
|
|
733
|
-
type,
|
|
734
|
-
design,
|
|
735
|
-
batches,
|
|
736
|
-
implementHistory,
|
|
737
|
-
verifyHistory,
|
|
738
|
-
review,
|
|
739
|
-
fixHistory: fixHistory.length ? fixHistory : undefined,
|
|
740
|
-
reviewFixes: reviewFixAttempts,
|
|
741
|
-
finalReport,
|
|
742
|
-
merge,
|
|
743
|
-
stats: {
|
|
744
|
-
agents: verifyHistory.length + tddAttempts + reviewFixAttempts + 4, // brainstorm + design-write + design-extract + review + merge (approx)
|
|
745
|
-
phases: 7,
|
|
746
|
-
parallelBatches: batches.length,
|
|
747
|
-
durationMs: 0, // QuickJS guest has no Date; host can compute from journal if needed
|
|
748
|
-
},
|
|
749
|
-
}
|