aiwcli 0.15.4 → 0.15.7
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/README.md +6 -3
- package/dist/capabilities/branch/adapters.d.ts +2 -0
- package/dist/capabilities/branch/adapters.js +21 -0
- package/dist/capabilities/branch/contracts.d.ts +57 -0
- package/dist/capabilities/branch/contracts.js +1 -0
- package/dist/capabilities/branch/control-plane.d.ts +2 -0
- package/dist/capabilities/branch/control-plane.js +343 -0
- package/dist/capabilities/branch/runtime-core.d.ts +5 -0
- package/dist/capabilities/branch/runtime-core.js +36 -0
- package/dist/capabilities/installation/control-plane/clean-command.d.ts +41 -0
- package/dist/capabilities/installation/control-plane/clean-command.js +196 -0
- package/dist/capabilities/installation/control-plane/clear-command.d.ts +160 -0
- package/dist/capabilities/installation/control-plane/clear-command.js +1220 -0
- package/dist/capabilities/installation/control-plane/init-command.d.ts +81 -0
- package/dist/capabilities/installation/control-plane/init-command.js +449 -0
- package/dist/capabilities/launch/contracts.d.ts +51 -0
- package/dist/capabilities/launch/contracts.js +1 -0
- package/dist/capabilities/launch/control-plane/execute-launch.d.ts +2 -0
- package/dist/capabilities/launch/control-plane/execute-launch.js +222 -0
- package/dist/capabilities/launch/runtime-core/launch-options.d.ts +14 -0
- package/dist/capabilities/launch/runtime-core/launch-options.js +69 -0
- package/dist/cli/base-command.d.ts +18 -0
- package/dist/cli/base-command.js +55 -0
- package/dist/commands/branch.d.ts +0 -20
- package/dist/commands/branch.js +24 -416
- package/dist/commands/clean.d.ts +1 -41
- package/dist/commands/clean.js +1 -196
- package/dist/commands/clear.d.ts +1 -161
- package/dist/commands/clear.js +1 -1121
- package/dist/commands/init/index.d.ts +1 -98
- package/dist/commands/init/index.js +4 -478
- package/dist/commands/launch.d.ts +36 -11
- package/dist/commands/launch.js +135 -159
- package/dist/lib/base-command.d.ts +1 -114
- package/dist/lib/base-command.js +1 -153
- package/dist/lib/claude-settings-types.d.ts +31 -19
- package/dist/lib/context/context-formatter.d.ts +74 -0
- package/dist/lib/context/context-formatter.js +493 -0
- package/dist/lib/context/context-selector.d.ts +42 -0
- package/dist/lib/context/context-selector.js +451 -0
- package/dist/lib/context/context-store.d.ts +100 -0
- package/dist/lib/context/context-store.js +618 -0
- package/dist/lib/context/plan-manager.d.ts +54 -0
- package/dist/lib/context/plan-manager.js +282 -0
- package/dist/lib/context/task-tracker.d.ts +44 -0
- package/dist/lib/context/task-tracker.js +146 -0
- package/dist/lib/core-ide-base.d.ts +4 -0
- package/dist/lib/core-ide-base.js +77 -0
- package/dist/lib/core-installer.d.ts +5 -0
- package/dist/lib/core-installer.js +54 -0
- package/dist/lib/git-exclude-manager.d.ts +2 -2
- package/dist/lib/git-exclude-manager.js +3 -3
- package/dist/lib/hooks/hook-utils.d.ts +143 -0
- package/dist/lib/hooks/hook-utils.js +609 -0
- package/dist/lib/hooks/session-end-logic.d.ts +5 -0
- package/dist/lib/hooks/session-end-logic.js +63 -0
- package/dist/lib/hooks-merger.js +25 -19
- package/dist/lib/ide-path-resolver.d.ts +19 -7
- package/dist/lib/ide-path-resolver.js +25 -9
- package/dist/lib/install-state.d.ts +34 -0
- package/dist/lib/install-state.js +161 -0
- package/dist/lib/launch-options.d.ts +1 -0
- package/dist/lib/launch-options.js +1 -0
- package/dist/lib/lsp-patch.d.ts +12 -0
- package/dist/lib/lsp-patch.js +156 -0
- package/dist/lib/multiplexer.d.ts +57 -0
- package/dist/lib/multiplexer.js +19 -0
- package/dist/lib/multiplexers/psmux.d.ts +75 -0
- package/dist/lib/multiplexers/psmux.js +384 -0
- package/dist/lib/multiplexers/tmux.d.ts +44 -0
- package/dist/lib/multiplexers/tmux.js +262 -0
- package/dist/lib/mux-utils.d.ts +5 -0
- package/dist/lib/mux-utils.js +42 -0
- package/dist/lib/paths.d.ts +2 -2
- package/dist/lib/paths.js +2 -2
- package/dist/lib/platform-commands.d.ts +27 -0
- package/dist/lib/platform-commands.js +49 -0
- package/dist/lib/runtime/aiw-cli.d.ts +37 -0
- package/dist/lib/runtime/aiw-cli.js +74 -0
- package/dist/lib/runtime/atomic-write.d.ts +19 -0
- package/dist/lib/runtime/atomic-write.js +121 -0
- package/dist/lib/runtime/cli-args.d.ts +55 -0
- package/dist/lib/runtime/cli-args.js +185 -0
- package/dist/lib/runtime/constants.d.ts +56 -0
- package/dist/lib/runtime/constants.js +230 -0
- package/dist/lib/runtime/executable-policy.d.ts +16 -0
- package/dist/lib/runtime/executable-policy.js +57 -0
- package/dist/lib/runtime/git-state.d.ts +9 -0
- package/dist/lib/runtime/git-state.js +59 -0
- package/dist/lib/runtime/inference.d.ts +37 -0
- package/dist/lib/runtime/inference.js +262 -0
- package/dist/lib/runtime/lint-dispatch.d.ts +40 -0
- package/dist/lib/runtime/lint-dispatch.js +285 -0
- package/dist/lib/runtime/logger.d.ts +66 -0
- package/dist/lib/runtime/logger.js +201 -0
- package/dist/lib/runtime/models.d.ts +14 -0
- package/dist/lib/runtime/models.js +14 -0
- package/dist/lib/runtime/platform-adapter.d.ts +7 -0
- package/dist/lib/runtime/platform-adapter.js +21 -0
- package/dist/lib/runtime/preflight.d.ts +24 -0
- package/dist/lib/runtime/preflight.js +65 -0
- package/dist/lib/runtime/sentinel-ipc.d.ts +14 -0
- package/dist/lib/runtime/sentinel-ipc.js +67 -0
- package/dist/lib/runtime/state-io.d.ts +30 -0
- package/dist/lib/runtime/state-io.js +174 -0
- package/dist/lib/runtime/stop-words.d.ts +20 -0
- package/dist/lib/runtime/stop-words.js +150 -0
- package/dist/lib/runtime/subprocess-utils.d.ts +29 -0
- package/dist/lib/runtime/subprocess-utils.js +96 -0
- package/dist/lib/runtime/tmux-preflight.d.ts +13 -0
- package/dist/lib/runtime/tmux-preflight.js +78 -0
- package/dist/lib/runtime/utils.d.ts +54 -0
- package/dist/lib/runtime/utils.js +162 -0
- package/dist/lib/sentinel-wrapper.d.ts +9 -0
- package/dist/lib/sentinel-wrapper.js +20 -0
- package/dist/lib/shell-quoting.d.ts +5 -0
- package/dist/lib/shell-quoting.js +17 -0
- package/dist/lib/spawn-errors.d.ts +6 -0
- package/dist/lib/spawn-errors.js +15 -0
- package/dist/lib/spawn.js +5 -11
- package/dist/lib/template-installer.d.ts +4 -5
- package/dist/lib/template-installer.js +36 -34
- package/dist/lib/template-resolver.d.ts +6 -7
- package/dist/lib/template-resolver.js +26 -21
- package/dist/lib/template-settings-reconstructor.d.ts +7 -2
- package/dist/lib/template-settings-reconstructor.js +76 -45
- package/dist/lib/terminal-strategy.d.ts +11 -0
- package/dist/lib/terminal-strategy.js +49 -0
- package/dist/lib/terminal.d.ts +28 -0
- package/dist/lib/terminal.js +162 -112
- package/dist/lib/tmux-pane-placement.d.ts +17 -0
- package/dist/lib/tmux-pane-placement.js +58 -0
- package/dist/lib/tmux-primitives.d.ts +5 -0
- package/dist/lib/tmux-primitives.js +15 -0
- package/dist/lib/tmux-session.d.ts +32 -0
- package/dist/lib/tmux-session.js +86 -0
- package/dist/lib/tty-detection.js +1 -1
- package/dist/lib/types.d.ts +168 -0
- package/dist/lib/types.js +6 -0
- package/dist/lib/version.d.ts +1 -1
- package/dist/lib/version.js +1 -1
- package/dist/platform/launch.d.ts +10 -0
- package/dist/platform/launch.js +10 -0
- package/dist/templates/CLAUDE.md +31 -40
- package/dist/templates/cc-native/.claude/settings.json +27 -27
- package/dist/templates/cc-native/CC-NATIVE-README.md +1 -1
- package/dist/templates/cc-native/TEMPLATE-SCHEMA.md +10 -9
- package/dist/templates/cc-native/_cc-native/CLAUDE.md +18 -18
- package/dist/templates/cc-native/_cc-native/artifacts/CLAUDE.md +3 -3
- package/dist/templates/cc-native/_cc-native/artifacts/lib/format.ts +14 -14
- package/dist/templates/cc-native/_cc-native/artifacts/lib/tracker.ts +1 -1
- package/dist/templates/cc-native/_cc-native/artifacts/lib/write.ts +3 -3
- package/dist/templates/cc-native/_cc-native/cc-native.config.json +3 -3
- package/dist/templates/cc-native/_cc-native/hooks/CLAUDE.md +16 -15
- package/dist/templates/cc-native/_cc-native/hooks/cc-native-plan-review.ts +3 -3
- package/dist/templates/cc-native/_cc-native/hooks/enhance_plan_post_subagent.ts +2 -2
- package/dist/templates/cc-native/_cc-native/hooks/enhance_plan_post_write.ts +2 -2
- package/dist/templates/cc-native/_cc-native/hooks/mark_questions_asked.ts +3 -3
- package/dist/templates/cc-native/_cc-native/hooks/plan_questions_early.ts +2 -2
- package/dist/templates/cc-native/_cc-native/hooks/validate_task_prompt.ts +3 -3
- package/dist/templates/cc-native/_cc-native/lib-ts/CLAUDE.md +8 -8
- package/dist/templates/cc-native/_cc-native/lib-ts/aggregate-agents.ts +1 -1
- package/dist/templates/cc-native/_cc-native/lib-ts/cc-native-state.ts +4 -4
- package/dist/templates/cc-native/_cc-native/lib-ts/cli-output-parser.ts +1 -1
- package/dist/templates/cc-native/_cc-native/lib-ts/config.ts +1 -1
- package/dist/templates/cc-native/_cc-native/lib-ts/debug.ts +1 -1
- package/dist/templates/cc-native/_cc-native/lib-ts/json-parser.ts +1 -1
- package/dist/templates/cc-native/_cc-native/lib-ts/plan-discovery.ts +2 -2
- package/dist/templates/cc-native/_cc-native/lib-ts/rlm/logger.ts +1 -1
- package/dist/templates/cc-native/_cc-native/lib-ts/rlm/retrieval-pipeline.ts +2 -2
- package/dist/templates/cc-native/_cc-native/lib-ts/rlm/types.ts +1 -1
- package/dist/templates/cc-native/_cc-native/lib-ts/settings.ts +8 -8
- package/dist/templates/cc-native/_cc-native/lib-ts/state.ts +3 -3
- package/dist/templates/cc-native/_cc-native/lib-ts/tsconfig.json +2 -2
- package/dist/templates/cc-native/_cc-native/lib-ts/types.ts +3 -3
- package/dist/templates/cc-native/_cc-native/plan-review/CLAUDE.md +3 -1
- package/dist/templates/cc-native/_cc-native/plan-review/lib/__tests__/agent-selection.test.ts +345 -0
- package/dist/templates/cc-native/_cc-native/plan-review/lib/__tests__/preflight.test.ts +344 -0
- package/dist/templates/cc-native/_cc-native/plan-review/lib/agent-selection.ts +37 -15
- package/dist/templates/cc-native/_cc-native/plan-review/lib/corroboration.ts +16 -69
- package/dist/templates/cc-native/_cc-native/plan-review/lib/orchestrator.ts +1 -1
- package/dist/templates/cc-native/_cc-native/plan-review/lib/output-builder.ts +1 -1
- package/dist/templates/cc-native/_cc-native/plan-review/lib/plan-questions.ts +2 -2
- package/dist/templates/cc-native/_cc-native/plan-review/lib/preflight.ts +56 -26
- package/dist/templates/cc-native/_cc-native/plan-review/lib/review-pipeline.ts +7 -7
- package/dist/templates/cc-native/_cc-native/plan-review/lib/reviewers/agent.ts +4 -4
- package/dist/templates/cc-native/_cc-native/plan-review/lib/reviewers/base/base-agent.ts +3 -3
- package/dist/templates/cc-native/_cc-native/plan-review/lib/reviewers/index.ts +1 -1
- package/dist/templates/cc-native/_cc-native/plan-review/lib/reviewers/providers/claude-agent.ts +2 -2
- package/dist/templates/cc-native/_cc-native/plan-review/lib/reviewers/providers/codex-agent.ts +4 -4
- package/dist/templates/cc-native/_cc-native/plan-review/lib/reviewers/providers/gemini-agent.ts +1 -1
- package/dist/templates/cc-native/_cc-native/plan-review/lib/reviewers/providers/orchestrator-claude-agent.ts +5 -6
- package/dist/templates/core/.codex/workflows/codex.md +17 -0
- package/dist/templates/core/.codex/workflows/handoff.md +5 -0
- package/dist/templates/core/.codex/workflows/meta-plan.md +7 -0
- package/dist/templates/core/.cognition/AGENTS.md +5 -0
- package/dist/templates/core/.cognition/config.json +12 -0
- package/dist/templates/{_shared → core}/.windsurf/workflows/handoff.md +1 -1
- package/dist/templates/{_shared → core}/.windsurf/workflows/meta-plan.md +1 -1
- package/dist/templates/core/hooks-ts/_utils/git-state.ts +2 -0
- package/dist/templates/{_shared → core}/hooks-ts/archive_plan.ts +14 -23
- package/dist/templates/core/hooks-ts/codex_explorer.ts +160 -0
- package/dist/templates/{_shared → core}/hooks-ts/context_monitor.ts +23 -55
- package/dist/templates/{_shared → core}/hooks-ts/file-suggestion.ts +4 -3
- package/dist/templates/{_shared → core}/hooks-ts/lint_after_edit.ts +7 -9
- package/dist/templates/{_shared → core}/hooks-ts/pre_compact.ts +5 -5
- package/dist/templates/{_shared → core}/hooks-ts/session_end.ts +38 -78
- package/dist/templates/{_shared → core}/hooks-ts/session_start.ts +5 -5
- package/dist/templates/core/hooks-ts/task_create_capture.ts +32 -0
- package/dist/templates/{_shared → core}/hooks-ts/task_update_capture.ts +9 -24
- package/dist/templates/core/hooks-ts/user_prompt_submit.ts +46 -0
- package/dist/templates/{_shared → core}/lib-ts/CLAUDE.md +27 -16
- package/dist/templates/{_shared → core}/lib-ts/agent-exec/backends/headless.ts +3 -2
- package/dist/templates/{_shared → core}/lib-ts/agent-exec/backends/tmux.ts +44 -15
- package/dist/templates/{_shared → core}/lib-ts/agent-exec/base-agent.ts +6 -4
- package/dist/templates/{_shared → core}/lib-ts/agent-exec/execution-backend.ts +1 -1
- package/dist/templates/{_shared → core}/lib-ts/agent-exec/index.ts +2 -2
- package/dist/templates/{_shared → core}/lib-ts/agent-exec/structured-output.ts +4 -5
- package/dist/templates/{_shared → core}/lib-ts/context/CLAUDE.md +9 -6
- package/dist/templates/{_shared → core}/lib-ts/context/context-formatter.ts +16 -21
- package/dist/templates/{_shared → core}/lib-ts/context/context-selector.ts +8 -6
- package/dist/templates/{_shared → core}/lib-ts/context/context-store.ts +32 -20
- package/dist/templates/{_shared → core}/lib-ts/context/plan-manager.ts +19 -15
- package/dist/templates/{_shared → core}/lib-ts/context/task-tracker.ts +3 -3
- package/dist/templates/core/lib-ts/hooks/context-monitor-logic.ts +32 -0
- package/dist/templates/{_shared/lib-ts/base → core/lib-ts/hooks}/hook-utils.ts +168 -41
- package/dist/templates/core/lib-ts/hooks/prompt-binding-logic.ts +80 -0
- package/dist/templates/core/lib-ts/hooks/session-end-logic.ts +93 -0
- package/dist/templates/core/lib-ts/package.json +19 -0
- package/dist/templates/core/lib-ts/runtime/agent-launcher.ts +295 -0
- package/dist/templates/core/lib-ts/runtime/aiw-cli.ts +106 -0
- package/dist/templates/{_shared/lib-ts/base → core/lib-ts/runtime}/atomic-write.ts +12 -7
- package/dist/templates/{_shared/lib-ts/base → core/lib-ts/runtime}/cli-args.ts +8 -6
- package/dist/templates/{_shared/lib-ts/base → core/lib-ts/runtime}/constants.ts +326 -324
- package/dist/templates/core/lib-ts/runtime/executable-policy.ts +89 -0
- package/dist/templates/{_shared/lib-ts/base → core/lib-ts/runtime}/git-state.ts +6 -4
- package/dist/templates/{_shared/lib-ts/base → core/lib-ts/runtime}/inference.ts +59 -10
- package/dist/templates/{_shared/lib-ts/base → core/lib-ts/runtime}/lint-dispatch.ts +25 -23
- package/dist/templates/{_shared/lib-ts/base → core/lib-ts/runtime}/logger.ts +32 -29
- package/dist/templates/{_shared/lib-ts/base → core/lib-ts/runtime}/models.ts +2 -2
- package/dist/templates/core/lib-ts/runtime/platform-adapter.ts +33 -0
- package/dist/templates/{_shared/lib-ts/base → core/lib-ts/runtime}/preflight.ts +4 -3
- package/dist/templates/core/lib-ts/runtime/sentinel-ipc.ts +91 -0
- package/dist/templates/{_shared/lib-ts/base → core/lib-ts/runtime}/state-io.ts +11 -7
- package/dist/templates/core/lib-ts/runtime/stop-words.ts +185 -0
- package/dist/templates/core/lib-ts/runtime/subprocess-utils.ts +147 -0
- package/dist/templates/core/lib-ts/runtime/tmux-preflight.ts +93 -0
- package/dist/templates/{_shared/lib-ts/base → core/lib-ts/runtime}/utils.ts +4 -3
- package/dist/templates/{_shared → core}/lib-ts/templates/formatters.ts +7 -5
- package/dist/templates/{_shared → core}/lib-ts/templates/plan-context.ts +2 -1
- package/dist/templates/{_shared → core}/lib-ts/tsconfig.json +3 -1
- package/dist/templates/{_shared → core}/lib-ts/types.ts +78 -77
- package/dist/templates/core/scripts/resolve-run.ts +61 -0
- package/dist/templates/{_shared → core}/scripts/resolve_context.ts +3 -3
- package/dist/templates/{_shared → core}/scripts/status_line.ts +25 -20
- package/dist/templates/core/skills/codex/CLAUDE.md +78 -0
- package/dist/templates/{_shared → core}/skills/codex/SKILL.md +21 -18
- package/dist/templates/{_shared → core}/skills/codex/lib/codex-watcher.ts +76 -103
- package/dist/templates/{_shared → core}/skills/codex/scripts/launch-codex.ts +119 -133
- package/dist/templates/{_shared → core}/skills/codex/scripts/watch-codex.ts +6 -4
- package/dist/templates/core/skills/devin/CLAUDE.md +65 -0
- package/dist/templates/core/skills/devin/SKILL.md +73 -0
- package/dist/templates/core/skills/devin/lib/devin-watcher.ts +280 -0
- package/dist/templates/core/skills/devin/scripts/launch-devin.ts +257 -0
- package/dist/templates/{_shared → core}/skills/handoff-system/CLAUDE.md +436 -433
- package/dist/templates/{_shared → core}/skills/handoff-system/lib/document-generator.ts +9 -7
- package/dist/templates/{_shared → core}/skills/handoff-system/lib/handoff-reader.ts +6 -4
- package/dist/templates/{_shared → core}/skills/handoff-system/scripts/resume_handoff.ts +10 -8
- package/dist/templates/{_shared → core}/skills/handoff-system/scripts/save_handoff.ts +12 -10
- package/dist/templates/{_shared → core}/skills/handoff-system/workflows/handoff-resume.md +2 -2
- package/dist/templates/{_shared → core}/skills/handoff-system/workflows/handoff.md +6 -5
- package/dist/templates/{_shared → core}/skills/meta-plan/CLAUDE.md +2 -1
- package/dist/templates/{_shared → core}/skills/meta-plan/workflows/meta-plan.md +8 -7
- package/oclif.manifest.json +89 -13
- package/package.json +13 -12
- package/dist/templates/_shared/.claude/settings.json +0 -120
- package/dist/templates/_shared/.claude/skills/codex/SKILL.md +0 -35
- package/dist/templates/_shared/.claude/skills/handoff/SKILL.md +0 -13
- package/dist/templates/_shared/.claude/skills/handoff-resume/SKILL.md +0 -13
- package/dist/templates/_shared/.claude/skills/meta-plan/SKILL.md +0 -43
- package/dist/templates/_shared/.codex/workflows/codex.md +0 -11
- package/dist/templates/_shared/.codex/workflows/handoff.md +0 -226
- package/dist/templates/_shared/.codex/workflows/meta-plan.md +0 -347
- package/dist/templates/_shared/hooks-ts/_utils/git-state.ts +0 -2
- package/dist/templates/_shared/hooks-ts/task_create_capture.ts +0 -48
- package/dist/templates/_shared/hooks-ts/user_prompt_submit.ts +0 -93
- package/dist/templates/_shared/lib-ts/base/launchers/tmux-launcher.ts +0 -173
- package/dist/templates/_shared/lib-ts/base/launchers/window-launcher.ts +0 -93
- package/dist/templates/_shared/lib-ts/base/launchers/wt-launcher.ts +0 -64
- package/dist/templates/_shared/lib-ts/base/pane-launcher.ts +0 -55
- package/dist/templates/_shared/lib-ts/base/sentinel-ipc.ts +0 -87
- package/dist/templates/_shared/lib-ts/base/stop-words.ts +0 -184
- package/dist/templates/_shared/lib-ts/base/subprocess-utils.ts +0 -249
- package/dist/templates/_shared/lib-ts/base/tmux-driver.ts +0 -341
- package/dist/templates/_shared/lib-ts/base/tmux-pane-placement.ts +0 -78
- package/dist/templates/_shared/lib-ts/package.json +0 -20
- package/dist/templates/_shared/scripts/resolve-run.ts +0 -62
- package/dist/templates/_shared/skills/codex/CLAUDE.md +0 -70
- /package/dist/templates/{_shared → core}/lib-ts/agent-exec/backends/index.ts +0 -0
|
@@ -11,7 +11,7 @@ import {
|
|
|
11
11
|
SUMMARY_UNAVAILABLE_MESSAGE,
|
|
12
12
|
summarizeFromSessionFileFallback,
|
|
13
13
|
summarizeViaResume,
|
|
14
|
-
|
|
14
|
+
summarizeViaSessionFile,
|
|
15
15
|
waitForPaneClose,
|
|
16
16
|
} from "../lib/codex-watcher.js";
|
|
17
17
|
|
|
@@ -27,7 +27,7 @@ async function main(): Promise<void> {
|
|
|
27
27
|
const sf = sessionFile ?? "";
|
|
28
28
|
const sid = sessionId ?? "";
|
|
29
29
|
const summary =
|
|
30
|
-
|
|
30
|
+
(await summarizeViaSessionFile(sf)) ??
|
|
31
31
|
(sid ? await summarizeViaResume(sid) : null) ??
|
|
32
32
|
summarizeFromSessionFileFallback(sf) ??
|
|
33
33
|
SUMMARY_UNAVAILABLE_MESSAGE;
|
|
@@ -36,7 +36,9 @@ async function main(): Promise<void> {
|
|
|
36
36
|
console.log(summary);
|
|
37
37
|
}
|
|
38
38
|
|
|
39
|
-
|
|
39
|
+
try {
|
|
40
|
+
await main();
|
|
41
|
+
} catch (error) {
|
|
40
42
|
console.error(`watch-codex error: ${String(error)}`);
|
|
41
43
|
console.log(SUMMARY_UNAVAILABLE_MESSAGE);
|
|
42
|
-
}
|
|
44
|
+
}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
# Devin Skill
|
|
2
|
+
|
|
3
|
+
Launch Devin CLI in a visible pane (tmux on Unix, fallback to exec mode) and pass the prompt at process start.
|
|
4
|
+
|
|
5
|
+
## Directory Structure
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
devin/
|
|
9
|
+
├── CLAUDE.md <- This file
|
|
10
|
+
├── SKILL.md <- Skill metadata (user-invocable)
|
|
11
|
+
├── lib/
|
|
12
|
+
│ └── devin-watcher.ts <- Watch/summarize library
|
|
13
|
+
└── scripts/
|
|
14
|
+
└── launch-devin.ts <- Single entry point (launch + optional watch)
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
## Script: launch-devin.ts
|
|
18
|
+
|
|
19
|
+
**Usage:**
|
|
20
|
+
```bash
|
|
21
|
+
bun ~/.aiwcli/bin/resolve-run.ts .aiwcli/_core/skills/devin/scripts/launch-devin.ts [--model <tier|id>] [--prompt <text>] [--no-watch] [--context <id>] plan
|
|
22
|
+
bun ~/.aiwcli/bin/resolve-run.ts .aiwcli/_core/skills/devin/scripts/launch-devin.ts [--model <tier|id>] [--prompt <text>] [--no-watch] [--context <id>] --file <path>
|
|
23
|
+
bun ~/.aiwcli/bin/resolve-run.ts .aiwcli/_core/skills/devin/scripts/launch-devin.ts [--model <tier|id>] [--prompt <text>] [--no-watch] [--context <id>] <inline text...>
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
**Args:**
|
|
27
|
+
- `plan` -- discover active plan via context system, build a bootstrap startup prompt
|
|
28
|
+
- `--file <path>` -- build a bootstrap startup prompt that includes the file path
|
|
29
|
+
- `<text...>` -- join remaining args as inline prompt
|
|
30
|
+
- `--model <name>` -- Models: `swe`, `gpt`, `opus`, `sonnet`. Tiers: `fast`/`standard`/`smart`. Or pass-through.
|
|
31
|
+
- `--prompt <text>` -- append extra instructions
|
|
32
|
+
- `--no-watch` -- Disable watch/summarize mode
|
|
33
|
+
|
|
34
|
+
**Plan discovery order:**
|
|
35
|
+
1. `--context` flag or `CLAUDE_SESSION_ID` env -> context -> `findLatestPlan(contextId)`
|
|
36
|
+
2. Fallback: scan `_output/contexts/*/plans/*.md` by mtime
|
|
37
|
+
|
|
38
|
+
**Dependencies:**
|
|
39
|
+
- `runtime/aiw-cli.ts` -- shells out to `aiw launch --devin`
|
|
40
|
+
- `runtime/agent-launcher.ts` -- shared plan discovery, prompt construction, pane watching
|
|
41
|
+
- `runtime/cli-args.ts` -- Devin model resolution and invocation building
|
|
42
|
+
- `context/*` -- context lookup, formatting, plan discovery
|
|
43
|
+
|
|
44
|
+
**Watch behavior:**
|
|
45
|
+
- Watch is enabled by default
|
|
46
|
+
- Uses `waitForPaneClose` from shared agent-launcher
|
|
47
|
+
- Summary cascade: (1) `devin list --format json` metadata, (2) tmux pane scrollback capture, (3) static unavailable message
|
|
48
|
+
- Summary persisted to temp file via `persistSummary("devin", ...)`
|
|
49
|
+
|
|
50
|
+
**Design decisions:**
|
|
51
|
+
- No sandbox/YOLO flags (Devin uses `--permission-mode` instead, defaulting to `auto`)
|
|
52
|
+
- Devin model short names are server-resolved (we store just the short names)
|
|
53
|
+
- Shared helpers from `agent-launcher.ts` (plan discovery, prompt files, pane watching)
|
|
54
|
+
- Session discovery uses `devin list --format json` + `~/.config/cognition/cli/` file scanning
|
|
55
|
+
|
|
56
|
+
## Library: lib/devin-watcher.ts
|
|
57
|
+
|
|
58
|
+
Session discovery and summarization:
|
|
59
|
+
- `findDevinSession(projectRoot, launchStartedAtMs)` -- discover session via `devin list` or file scanning
|
|
60
|
+
- `summarizeDevinSession(transcript)` -- AI inference summary
|
|
61
|
+
- `capturePaneScrollback(paneId)` -- tmux pane capture fallback
|
|
62
|
+
|
|
63
|
+
Re-exports `persistSummary`, `waitForPaneClose` from agent-launcher.
|
|
64
|
+
|
|
65
|
+
<!-- context-layer: generated=2026-03-06 | version=1 -->
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: devin
|
|
3
|
+
description: Delegate implementation to Devin sub-agents. USE WHEN devin OR send to devin OR devin implement OR hand off to devin OR launch devin OR run devin.
|
|
4
|
+
user-invocable: true
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# /devin
|
|
8
|
+
|
|
9
|
+
## Role
|
|
10
|
+
|
|
11
|
+
You are the orchestrator. Each Devin launch spawns an implementation sub-agent. Delegate implementation work to Devin, then review results when summaries arrive.
|
|
12
|
+
|
|
13
|
+
The script blocks until Devin exits and prints a session summary. Run with Bash `run_in_background: true` so you stay unblocked and receive the summary as a background task notification.
|
|
14
|
+
|
|
15
|
+
## Command
|
|
16
|
+
|
|
17
|
+
```
|
|
18
|
+
bun ~/.aiwcli/bin/resolve-run.ts .aiwcli/_core/skills/devin/scripts/launch-devin.ts [flags] <mode>
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
**Modes:** `plan` | `--file <path>` | `<inline text...>`
|
|
22
|
+
|
|
23
|
+
`plan` and `--file` modes pass a filepath-first bootstrap prompt so Devin reads the file from disk instead of relying on a pasted full document.
|
|
24
|
+
|
|
25
|
+
**Flags:**
|
|
26
|
+
- `--context <id>` -- Project orientation for the sub-agent. Pass when implementing a plan so Devin understands the project structure.
|
|
27
|
+
- `--prompt <text>` -- Add extra instructions. In `plan`/`--file` mode, this is embedded into the bootstrap temp file with the target path.
|
|
28
|
+
- `--model <name>` -- Models: `swe`, `gpt`, `opus`, `sonnet`. Tiers: `fast`, `standard`, `smart`. Or pass-through for server-side resolution.
|
|
29
|
+
- `--no-watch` -- Fire-and-forget: exit immediately after launch, skip waiting for summary.
|
|
30
|
+
|
|
31
|
+
## Retrieving Results
|
|
32
|
+
|
|
33
|
+
The script prints a summary to stdout and writes it to a temp file.
|
|
34
|
+
|
|
35
|
+
**Primary:** Check TaskOutput for the background task -- the summary and file path are inline.
|
|
36
|
+
|
|
37
|
+
**Fallback (if TaskOutput is empty):** Look for the `[summary_file:<path>]` line in the output. If found, read that file path directly.
|
|
38
|
+
|
|
39
|
+
## Delegation Patterns
|
|
40
|
+
|
|
41
|
+
### One-shot
|
|
42
|
+
|
|
43
|
+
For small or tightly coupled plans. One sub-agent implements the whole plan.
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
bun ~/.aiwcli/bin/resolve-run.ts .aiwcli/_core/skills/devin/scripts/launch-devin.ts --context <ctx-id> plan
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
Run with `run_in_background: true`. Wait for the summary. Review the changes.
|
|
50
|
+
|
|
51
|
+
### Parallel
|
|
52
|
+
|
|
53
|
+
For plans with independent sections, create small section-brief files and launch one sub-agent per brief with `--file`.
|
|
54
|
+
|
|
55
|
+
### Ad-hoc
|
|
56
|
+
|
|
57
|
+
For tasks outside a plan. Pass inline text or a file path.
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
bun ~/.aiwcli/bin/resolve-run.ts .aiwcli/_core/skills/devin/scripts/launch-devin.ts \
|
|
61
|
+
"Fix the failing test in auth.ts"
|
|
62
|
+
|
|
63
|
+
bun ~/.aiwcli/bin/resolve-run.ts .aiwcli/_core/skills/devin/scripts/launch-devin.ts \
|
|
64
|
+
--file path/to/task-description.md
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
## Orchestrator Checklist
|
|
68
|
+
|
|
69
|
+
- **Delegate implementation.** If the work involves writing code and Devin can handle it, send it to Devin.
|
|
70
|
+
- **Split independent sections** into parallel sub-agents for faster execution.
|
|
71
|
+
- **Pass `--context`** when implementing a plan -- Devin needs project orientation to make good decisions.
|
|
72
|
+
- **Scope parallel agents with separate `--file` briefs** so each sub-agent has an explicit task boundary.
|
|
73
|
+
- **Review results** when summaries arrive. Check for merge conflicts between parallel agents, then verify with `tsc --noEmit`, tests, or manual inspection.
|
|
@@ -0,0 +1,280 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Devin session discovery and summarization.
|
|
3
|
+
*
|
|
4
|
+
* Session discovery strategy (priority order):
|
|
5
|
+
* 1. `devin list --format json` — parse session metadata, match by cwd + timestamp
|
|
6
|
+
* 2. File scan of `~/.config/cognition/cli/` for session files
|
|
7
|
+
* 3. Tmux pane scrollback capture (`tmux capture-pane -p -t <paneId>`)
|
|
8
|
+
*
|
|
9
|
+
* If no session transcript is found, falls back to SUMMARY_UNAVAILABLE_MESSAGE.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import * as fs from "node:fs";
|
|
13
|
+
import * as os from "node:os";
|
|
14
|
+
import path from "node:path";
|
|
15
|
+
|
|
16
|
+
import { inference } from "../../../lib-ts/runtime/inference.js";
|
|
17
|
+
import { logDebug, logWarn } from "../../../lib-ts/runtime/logger.js";
|
|
18
|
+
import { execFileAsync, findExecutable } from "../../../lib-ts/runtime/subprocess-utils.js";
|
|
19
|
+
|
|
20
|
+
// Re-export shared symbols for consumers
|
|
21
|
+
export {
|
|
22
|
+
type PaneWatchTarget,
|
|
23
|
+
persistSummary,
|
|
24
|
+
waitForPaneClose,
|
|
25
|
+
} from "../../../lib-ts/runtime/agent-launcher.js";
|
|
26
|
+
|
|
27
|
+
export const SUMMARY_UNAVAILABLE_MESSAGE = "Devin session completed. Summary unavailable.";
|
|
28
|
+
|
|
29
|
+
const DEVIN_LIST_TIMEOUT_MS = 10_000;
|
|
30
|
+
const SUMMARY_TIMEOUT_SEC = 10;
|
|
31
|
+
const MAX_SCROLLBACK_LINES = 300;
|
|
32
|
+
const MAX_LINE_LENGTH = 500;
|
|
33
|
+
|
|
34
|
+
const TRANSCRIPT_SUMMARY_PROMPT = `Summarize this Devin session transcript excerpt.
|
|
35
|
+
Return 3-5 concise bullet points.
|
|
36
|
+
Focus on:
|
|
37
|
+
- what was accomplished
|
|
38
|
+
- files changed
|
|
39
|
+
- errors or blockers
|
|
40
|
+
Do not ask follow-up questions.
|
|
41
|
+
Do not request additional input.
|
|
42
|
+
If information is partial, provide best-effort summary from available text.`;
|
|
43
|
+
|
|
44
|
+
// ---------------------------------------------------------------------------
|
|
45
|
+
// Session Discovery via `devin list`
|
|
46
|
+
// ---------------------------------------------------------------------------
|
|
47
|
+
|
|
48
|
+
interface DevinSession {
|
|
49
|
+
id?: string;
|
|
50
|
+
session_id?: string;
|
|
51
|
+
cwd?: string;
|
|
52
|
+
created_at?: string;
|
|
53
|
+
status?: string;
|
|
54
|
+
title?: string;
|
|
55
|
+
model?: string;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
async function getDevinSessions(): Promise<DevinSession[]> {
|
|
59
|
+
try {
|
|
60
|
+
const result = await execFileAsync("devin", ["list", "--format", "json"], {
|
|
61
|
+
timeout: DEVIN_LIST_TIMEOUT_MS,
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
if (result.exitCode !== 0) {
|
|
65
|
+
logDebug("devin-watcher", `devin list failed: exit=${result.exitCode}`);
|
|
66
|
+
return [];
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
const parsed = JSON.parse(result.stdout.trim());
|
|
70
|
+
if (!Array.isArray(parsed)) return [];
|
|
71
|
+
return parsed as DevinSession[];
|
|
72
|
+
} catch (error) {
|
|
73
|
+
logDebug("devin-watcher", `devin list parse failed: ${String(error)}`);
|
|
74
|
+
return [];
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
function samePath(a: string, b: string): boolean {
|
|
79
|
+
const left = path.resolve(a);
|
|
80
|
+
const right = path.resolve(b);
|
|
81
|
+
if (process.platform === "win32") {
|
|
82
|
+
return left.toLowerCase() === right.toLowerCase();
|
|
83
|
+
}
|
|
84
|
+
return left === right;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
async function findDevinSessionViaList(
|
|
88
|
+
projectRoot: string,
|
|
89
|
+
launchStartedAtMs: number,
|
|
90
|
+
): Promise<DevinSession | null> {
|
|
91
|
+
const sessions = await getDevinSessions();
|
|
92
|
+
if (sessions.length === 0) return null;
|
|
93
|
+
|
|
94
|
+
// Find sessions matching cwd and started after launch
|
|
95
|
+
const candidates = sessions.filter((s) => {
|
|
96
|
+
if (s.cwd && !samePath(s.cwd, projectRoot)) return false;
|
|
97
|
+
if (s.created_at) {
|
|
98
|
+
const createdMs = Date.parse(s.created_at);
|
|
99
|
+
if (createdMs > 0 && createdMs < launchStartedAtMs - 5000) return false;
|
|
100
|
+
}
|
|
101
|
+
return true;
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
// Return the most recent matching session
|
|
105
|
+
if (candidates.length === 0) return null;
|
|
106
|
+
|
|
107
|
+
candidates.sort((a, b) => {
|
|
108
|
+
const aMs = a.created_at ? Date.parse(a.created_at) : 0;
|
|
109
|
+
const bMs = b.created_at ? Date.parse(b.created_at) : 0;
|
|
110
|
+
return bMs - aMs;
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
return candidates[0] ?? null;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
// ---------------------------------------------------------------------------
|
|
117
|
+
// Session Discovery via File System
|
|
118
|
+
// ---------------------------------------------------------------------------
|
|
119
|
+
|
|
120
|
+
function findDevinSessionFiles(launchStartedAtMs: number): string[] {
|
|
121
|
+
const cliDir = path.join(os.homedir(), ".config", "cognition", "cli");
|
|
122
|
+
if (!fs.existsSync(cliDir)) return [];
|
|
123
|
+
|
|
124
|
+
const files: string[] = [];
|
|
125
|
+
try {
|
|
126
|
+
const entries = fs.readdirSync(cliDir, { withFileTypes: true });
|
|
127
|
+
for (const entry of entries) {
|
|
128
|
+
if (!entry.isFile()) continue;
|
|
129
|
+
const fullPath = path.join(cliDir, entry.name);
|
|
130
|
+
try {
|
|
131
|
+
const stat = fs.statSync(fullPath);
|
|
132
|
+
// Only consider files modified after launch
|
|
133
|
+
if (stat.mtimeMs >= launchStartedAtMs - 5000) {
|
|
134
|
+
files.push(fullPath);
|
|
135
|
+
}
|
|
136
|
+
} catch { /* skip */ }
|
|
137
|
+
}
|
|
138
|
+
} catch {
|
|
139
|
+
logDebug("devin-watcher", "Failed to read ~/.config/cognition/cli/");
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
return files;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
function readSessionFileContent(filePath: string): string {
|
|
146
|
+
try {
|
|
147
|
+
return fs.readFileSync(filePath, "utf8").trim();
|
|
148
|
+
} catch {
|
|
149
|
+
return "";
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
// ---------------------------------------------------------------------------
|
|
154
|
+
// Tmux Pane Scrollback Capture
|
|
155
|
+
// ---------------------------------------------------------------------------
|
|
156
|
+
|
|
157
|
+
async function capturePaneScrollback(paneId: string | null | undefined): Promise<string | null> {
|
|
158
|
+
if (!paneId) return null;
|
|
159
|
+
|
|
160
|
+
const tmuxPath = findExecutable("tmux");
|
|
161
|
+
if (!tmuxPath) return null;
|
|
162
|
+
|
|
163
|
+
try {
|
|
164
|
+
const result = await execFileAsync(tmuxPath, [
|
|
165
|
+
"capture-pane", "-p", "-t", paneId, "-S", `-${MAX_SCROLLBACK_LINES}`,
|
|
166
|
+
], { timeout: 5000 });
|
|
167
|
+
|
|
168
|
+
if (result.exitCode !== 0 || !result.stdout.trim()) return null;
|
|
169
|
+
|
|
170
|
+
const lines = result.stdout.split(/\r?\n/)
|
|
171
|
+
.map((line) => {
|
|
172
|
+
const trimmed = line.trim();
|
|
173
|
+
return trimmed.length > MAX_LINE_LENGTH
|
|
174
|
+
? `${trimmed.slice(0, MAX_LINE_LENGTH)}...`
|
|
175
|
+
: trimmed;
|
|
176
|
+
})
|
|
177
|
+
.filter(Boolean);
|
|
178
|
+
|
|
179
|
+
return lines.length > 0 ? lines.join("\n") : null;
|
|
180
|
+
} catch {
|
|
181
|
+
return null;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
// ---------------------------------------------------------------------------
|
|
186
|
+
// Summarization
|
|
187
|
+
// ---------------------------------------------------------------------------
|
|
188
|
+
|
|
189
|
+
function looksLikeBadSummary(output: string): boolean {
|
|
190
|
+
const normalized = output.toLowerCase();
|
|
191
|
+
return (
|
|
192
|
+
normalized.includes("don't see") ||
|
|
193
|
+
normalized.includes("no output") ||
|
|
194
|
+
normalized.includes("could you provide") ||
|
|
195
|
+
normalized.includes("paste")
|
|
196
|
+
);
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
function buildTranscriptFromSession(session: DevinSession): string | null {
|
|
200
|
+
const parts: string[] = [];
|
|
201
|
+
if (session.title) parts.push(`Title: ${session.title}`);
|
|
202
|
+
if (session.status) parts.push(`Status: ${session.status}`);
|
|
203
|
+
if (session.model) parts.push(`Model: ${session.model}`);
|
|
204
|
+
if (session.id || session.session_id) parts.push(`Session: ${session.id ?? session.session_id}`);
|
|
205
|
+
return parts.length > 0 ? parts.join("\n") : null;
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
async function summarizeTranscript(transcript: string): Promise<string | null> {
|
|
209
|
+
const result = inference(
|
|
210
|
+
TRANSCRIPT_SUMMARY_PROMPT,
|
|
211
|
+
`Session transcript excerpt:\n\n${transcript}`,
|
|
212
|
+
"fast",
|
|
213
|
+
SUMMARY_TIMEOUT_SEC,
|
|
214
|
+
);
|
|
215
|
+
|
|
216
|
+
if (result.success && result.output?.trim() && !looksLikeBadSummary(result.output)) {
|
|
217
|
+
return result.output.trim();
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
logWarn("devin-watcher", `Transcript summary failed: ${result.error ?? "empty or low-signal output"}`);
|
|
221
|
+
return null;
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
// ---------------------------------------------------------------------------
|
|
225
|
+
// Main Entry Point
|
|
226
|
+
// ---------------------------------------------------------------------------
|
|
227
|
+
|
|
228
|
+
/**
|
|
229
|
+
* Discover and summarize a Devin session.
|
|
230
|
+
* Tries multiple sources in priority order:
|
|
231
|
+
* 1. devin list --format json → session metadata summary
|
|
232
|
+
* 2. ~/.config/cognition/cli/ session files → parse transcript
|
|
233
|
+
* 3. tmux pane scrollback → raw text summary
|
|
234
|
+
*/
|
|
235
|
+
export async function summarizeDevinSession(
|
|
236
|
+
projectRoot: string,
|
|
237
|
+
launchStartedAtMs: number,
|
|
238
|
+
paneId?: string | null,
|
|
239
|
+
): Promise<string | null> {
|
|
240
|
+
// Source 1: devin list metadata
|
|
241
|
+
const session = await findDevinSessionViaList(projectRoot, launchStartedAtMs);
|
|
242
|
+
if (session) {
|
|
243
|
+
logDebug("devin-watcher", `Found session via devin list: ${session.id ?? session.session_id ?? "unknown"}`);
|
|
244
|
+
const sessionMeta = buildTranscriptFromSession(session);
|
|
245
|
+
if (sessionMeta) {
|
|
246
|
+
const summary = await summarizeTranscript(sessionMeta);
|
|
247
|
+
if (summary) return summary;
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
// Source 2: session files in ~/.config/cognition/cli/
|
|
252
|
+
const sessionFiles = findDevinSessionFiles(launchStartedAtMs);
|
|
253
|
+
if (sessionFiles.length > 0) {
|
|
254
|
+
logDebug("devin-watcher", `Found ${sessionFiles.length} session file(s) in cognition cli dir`);
|
|
255
|
+
for (const filePath of sessionFiles) {
|
|
256
|
+
const content = readSessionFileContent(filePath);
|
|
257
|
+
if (content.length > 50) {
|
|
258
|
+
const summary = await summarizeTranscript(content);
|
|
259
|
+
if (summary) return summary;
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
// Source 3: tmux pane scrollback
|
|
265
|
+
const scrollback = await capturePaneScrollback(paneId);
|
|
266
|
+
if (scrollback) {
|
|
267
|
+
logDebug("devin-watcher", `Using tmux scrollback (${scrollback.length} chars)`);
|
|
268
|
+
const summary = await summarizeTranscript(scrollback);
|
|
269
|
+
if (summary) return summary;
|
|
270
|
+
|
|
271
|
+
// Raw fallback: return scrollback lines directly
|
|
272
|
+
const lines = scrollback.split("\n").slice(-12);
|
|
273
|
+
if (lines.length > 0) {
|
|
274
|
+
return `Devin session completed. Transcript fallback:\n- ${lines.join("\n- ")}`;
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
logWarn("devin-watcher", "No session data found from any source");
|
|
279
|
+
return null;
|
|
280
|
+
}
|