zelari-code 1.25.0 → 1.27.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. package/README.md +3 -3
  2. package/dist/cli/app.js +5 -3
  3. package/dist/cli/app.js.map +1 -1
  4. package/dist/cli/buildPolicy.js +1 -1
  5. package/dist/cli/buildPolicy.js.map +1 -1
  6. package/dist/cli/companion/runManager.js +2 -2
  7. package/dist/cli/companion/runManager.js.map +1 -1
  8. package/dist/cli/companion/serve.js +1 -1
  9. package/dist/cli/companion/serve.js.map +1 -1
  10. package/dist/cli/components/StatusBar.js +10 -2
  11. package/dist/cli/components/StatusBar.js.map +1 -1
  12. package/dist/cli/headless.js +17 -6
  13. package/dist/cli/headless.js.map +1 -1
  14. package/dist/cli/hooks/useChatTurn.js +16 -12
  15. package/dist/cli/hooks/useChatTurn.js.map +1 -1
  16. package/dist/cli/hooks/useSlashDispatch.js +14 -1
  17. package/dist/cli/hooks/useSlashDispatch.js.map +1 -1
  18. package/dist/cli/kraken/executor.js +420 -0
  19. package/dist/cli/kraken/executor.js.map +1 -0
  20. package/dist/cli/kraken/graphStatus.js +114 -0
  21. package/dist/cli/kraken/graphStatus.js.map +1 -0
  22. package/dist/cli/kraken/planner.js +447 -0
  23. package/dist/cli/kraken/planner.js.map +1 -0
  24. package/dist/cli/kraken/tentacle.js +13 -0
  25. package/dist/cli/kraken/tentacle.js.map +1 -0
  26. package/dist/cli/main.bundled.js +10088 -8115
  27. package/dist/cli/main.bundled.js.map +4 -4
  28. package/dist/cli/main.js +1 -1
  29. package/dist/cli/main.js.map +1 -1
  30. package/dist/cli/missionSlice.js +7 -6
  31. package/dist/cli/missionSlice.js.map +1 -1
  32. package/dist/cli/mode.js +21 -7
  33. package/dist/cli/mode.js.map +1 -1
  34. package/dist/cli/phase.js +1 -1
  35. package/dist/cli/runHeadless.js +105 -6
  36. package/dist/cli/runHeadless.js.map +1 -1
  37. package/dist/cli/slashCommands.js +25 -6
  38. package/dist/cli/slashCommands.js.map +1 -1
  39. package/dist/cli/slashHandlers/krakenGraph.js +55 -0
  40. package/dist/cli/slashHandlers/krakenGraph.js.map +1 -0
  41. package/dist/cli/toolRegistry.js +49 -30
  42. package/dist/cli/toolRegistry.js.map +1 -1
  43. package/dist/cli/tools/krakenLive.js +109 -0
  44. package/dist/cli/tools/krakenLive.js.map +1 -0
  45. package/dist/cli/tools/krakenModel.js +115 -0
  46. package/dist/cli/tools/krakenModel.js.map +1 -0
  47. package/dist/cli/tools/krakenRadio.js +95 -0
  48. package/dist/cli/tools/krakenRadio.js.map +1 -0
  49. package/dist/cli/tools/krakenWorktree.js +245 -0
  50. package/dist/cli/tools/krakenWorktree.js.map +1 -0
  51. package/dist/cli/tools/taskTool.js +315 -54
  52. package/dist/cli/tools/taskTool.js.map +1 -1
  53. package/dist/cli/workspace/composeContext.js +2 -2
  54. package/dist/cli/workspace/composeContext.js.map +1 -1
  55. package/package.json +2 -2
@@ -0,0 +1,109 @@
1
+ /**
2
+ * krakenLive — in-process live tentacle tracker for StatusBar / Desktop (K10).
3
+ *
4
+ * Complements file radio (.zelari/radio): this is ephemeral, per process,
5
+ * ideal for "tentacles 1 running · 2 done" chips during a parent turn.
6
+ */
7
+ function store() {
8
+ const g = globalThis;
9
+ if (!g.__zelariKrakenLive)
10
+ g.__zelariKrakenLive = [];
11
+ return g.__zelariKrakenLive;
12
+ }
13
+ function nextId() {
14
+ const g = globalThis;
15
+ g.__zelariKrakenLiveSeq = (g.__zelariKrakenLiveSeq ?? 0) + 1;
16
+ return `t${g.__zelariKrakenLiveSeq}`;
17
+ }
18
+ /** Clear finished tentacles (keep running). Call on new parent turn if desired. */
19
+ export function resetKrakenLive(opts = {}) {
20
+ const g = globalThis;
21
+ if (opts.keepRunning) {
22
+ g.__zelariKrakenLive = store().filter((t) => t.status === 'running');
23
+ }
24
+ else {
25
+ g.__zelariKrakenLive = [];
26
+ }
27
+ }
28
+ export function krakenTentacleStart(info) {
29
+ const id = nextId();
30
+ const row = {
31
+ id,
32
+ agent: info.agent,
33
+ description: info.description.slice(0, 80),
34
+ status: 'running',
35
+ startedAt: Date.now(),
36
+ model: info.model,
37
+ worktree: info.worktree ?? null,
38
+ ...(info.graphId ? { graphId: info.graphId } : {}),
39
+ ...(info.nodeId ? { nodeId: info.nodeId } : {}),
40
+ };
41
+ const list = store();
42
+ list.push(row);
43
+ if (list.length > 40) {
44
+ list.splice(0, list.length - 40);
45
+ }
46
+ return id;
47
+ }
48
+ export function krakenTentacleEnd(id, info) {
49
+ const row = store().find((t) => t.id === id);
50
+ if (!row)
51
+ return;
52
+ row.status = info.ok ? 'done' : 'error';
53
+ row.endedAt = Date.now();
54
+ row.durationMs = info.durationMs ?? row.endedAt - row.startedAt;
55
+ row.ok = info.ok;
56
+ if (info.model)
57
+ row.model = info.model;
58
+ if (info.detail)
59
+ row.detail = info.detail.slice(0, 160);
60
+ }
61
+ export function listKrakenLive() {
62
+ return [...store()];
63
+ }
64
+ /** One-line chip for StatusBar: "tentacles 1↑ 2✓" or null if empty. */
65
+ export function formatKrakenLiveSummary(list = store()) {
66
+ if (list.length === 0)
67
+ return null;
68
+ const running = list.filter((t) => t.status === 'running').length;
69
+ const done = list.filter((t) => t.status === 'done').length;
70
+ const err = list.filter((t) => t.status === 'error').length;
71
+ const parts = [];
72
+ if (running)
73
+ parts.push(`${running}↑`);
74
+ if (done)
75
+ parts.push(`${done}✓`);
76
+ if (err)
77
+ parts.push(`${err}✗`);
78
+ if (parts.length === 0)
79
+ return null;
80
+ return `tentacles ${parts.join(' ')}`;
81
+ }
82
+ /** Multi-line block for slash / desktop panel. */
83
+ export function formatKrakenLiveStatus(list = store(), limit = 12) {
84
+ if (list.length === 0) {
85
+ return 'Kraken live: no tentacles in this process yet.';
86
+ }
87
+ const slice = list.slice(-limit);
88
+ const lines = slice.map((t) => {
89
+ const flag = t.status === 'running' ? '…' : t.status === 'done' ? '✓' : '✗';
90
+ const ms = t.durationMs != null ? ` ${t.durationMs}ms` : '';
91
+ const model = t.model ? ` [${t.model}]` : '';
92
+ return `${flag} ${t.agent} "${t.description}"${model}${ms}`;
93
+ });
94
+ const summary = formatKrakenLiveSummary(list);
95
+ return [`Kraken live (${summary ?? list.length}):`, ...lines].join('\n');
96
+ }
97
+ /** Desktop-friendly rows (JSON-serializable). */
98
+ export function krakenLiveForUi(list = store()) {
99
+ return list.map((t) => ({
100
+ id: t.id,
101
+ agent: t.agent,
102
+ description: t.description,
103
+ status: t.status,
104
+ ...(t.model ? { model: t.model } : {}),
105
+ ...(t.durationMs != null ? { durationMs: t.durationMs } : {}),
106
+ ...(t.ok != null ? { ok: t.ok } : {}),
107
+ }));
108
+ }
109
+ //# sourceMappingURL=krakenLive.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"krakenLive.js","sourceRoot":"","sources":["../../../src/cli/tools/krakenLive.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,115 @@
1
+ /**
2
+ * krakenModel — cheap/strong model routing for Kraken tentacles (K5 + auto-pick).
3
+ *
4
+ * Priority per tentacle:
5
+ * 1. Kind-specific env (ZELARI_KRAKEN_EXPLORE_MODEL / _VERIFY_ / _GENERAL_)
6
+ * 2. Shared ZELARI_KRAKEN_SUB_MODEL (general only if GENERAL_USES_SUB=1)
7
+ * 3. Auto-pick cheap model from discovered list (explore/verify) when enabled
8
+ * 4. Parent model
9
+ *
10
+ * Auto-pick (no manual env required for cheap tentacles):
11
+ * - Default ON for explore/verify when no explicit model env is set
12
+ * - Disable with ZELARI_KRAKEN_AUTO_MODEL=0
13
+ * - Uses model discovery cache via getDiscoveredModelIds(provider) (async path)
14
+ * - Heuristic: mini|fast|flash|lite|small|haiku|air|nano|instant|...
15
+ */
16
+ /** Heuristic: model ids that look cheaper / faster than flagship. */
17
+ const CHEAP_RE = /mini|fast|flash|lite|small|haiku|air|nano|instant|quick|turbo|low|3\.5|4o-mini|grok-3-mini|glm-4-flash|glm-4\.5-flash|gemini-.*-flash|claude-.*-haiku|deepseek-chat/i;
18
+ /** Flagship-ish ids we should not auto-select as "cheap". */
19
+ const FLAGSHIP_RE = /opus|ultra|reason|thinking|pro(?!-mini)|heavy|max(?!-)/i;
20
+ export function isCheapModelId(id) {
21
+ if (!id)
22
+ return false;
23
+ if (FLAGSHIP_RE.test(id) && !/mini|fast|flash|lite|haiku/i.test(id))
24
+ return false;
25
+ return CHEAP_RE.test(id);
26
+ }
27
+ /**
28
+ * Pick a cheaper model from candidates, different from parent when possible.
29
+ * Prefers ids with mini/flash/fast; stable sort by score then name.
30
+ */
31
+ export function pickCheapModel(parentModel, candidates) {
32
+ const parent = parentModel.trim();
33
+ const uniq = [...new Set(candidates.map((c) => c.trim()).filter(Boolean))];
34
+ const cheap = uniq.filter((id) => isCheapModelId(id));
35
+ if (cheap.length === 0)
36
+ return null;
37
+ const score = (id) => {
38
+ let s = 0;
39
+ if (/mini/i.test(id))
40
+ s += 5;
41
+ if (/flash/i.test(id))
42
+ s += 4;
43
+ if (/fast/i.test(id))
44
+ s += 3;
45
+ if (/lite|haiku|nano|air/i.test(id))
46
+ s += 3;
47
+ if (/small|instant|quick/i.test(id))
48
+ s += 2;
49
+ if (id === parent)
50
+ s -= 10;
51
+ s -= Math.min(id.length, 40) / 100;
52
+ return s;
53
+ };
54
+ cheap.sort((a, b) => score(b) - score(a) || a.localeCompare(b));
55
+ const notParent = cheap.find((id) => id !== parent);
56
+ return notParent ?? cheap[0] ?? null;
57
+ }
58
+ export function isKrakenAutoModelEnabled(env = process.env) {
59
+ const v = (env.ZELARI_KRAKEN_AUTO_MODEL ?? '1').trim().toLowerCase();
60
+ if (v === '0' || v === 'false' || v === 'no' || v === 'off')
61
+ return false;
62
+ return true;
63
+ }
64
+ /** Resolve model id for a tentacle given the parent/active model. */
65
+ export function resolveKrakenSubModel(agent, parentModel, env = process.env, opts = {}) {
66
+ const kindKey = agent === 'explore'
67
+ ? 'ZELARI_KRAKEN_EXPLORE_MODEL'
68
+ : agent === 'verify'
69
+ ? 'ZELARI_KRAKEN_VERIFY_MODEL'
70
+ : 'ZELARI_KRAKEN_GENERAL_MODEL';
71
+ const specific = env[kindKey]?.trim();
72
+ if (specific)
73
+ return specific;
74
+ const shared = env.ZELARI_KRAKEN_SUB_MODEL?.trim();
75
+ if (shared) {
76
+ if (agent === 'general' && !env.ZELARI_KRAKEN_GENERAL_MODEL) {
77
+ if (env.ZELARI_KRAKEN_GENERAL_USES_SUB === '1')
78
+ return shared;
79
+ return parentModel;
80
+ }
81
+ return shared;
82
+ }
83
+ // Auto-pick cheap model for explore/verify (not general — keep strong writer).
84
+ if ((agent === 'explore' || agent === 'verify') &&
85
+ isKrakenAutoModelEnabled(env) &&
86
+ opts.candidates &&
87
+ opts.candidates.length > 0) {
88
+ const picked = pickCheapModel(parentModel, opts.candidates);
89
+ if (picked)
90
+ return picked;
91
+ }
92
+ return parentModel;
93
+ }
94
+ /**
95
+ * Async resolve that loads discovery cache (ESM). Prefer this from toolRegistry.
96
+ */
97
+ export async function resolveKrakenSubModelAsync(agent, parentModel, env = process.env, opts = {}) {
98
+ let candidates = [];
99
+ if (opts.provider) {
100
+ try {
101
+ const mod = await import('../modelDiscovery.js');
102
+ const ids = mod.getDiscoveredModelIds(opts.provider);
103
+ if (Array.isArray(ids))
104
+ candidates = ids;
105
+ }
106
+ catch {
107
+ candidates = [];
108
+ }
109
+ }
110
+ return resolveKrakenSubModel(agent, parentModel, env, {
111
+ provider: opts.provider,
112
+ candidates,
113
+ });
114
+ }
115
+ //# sourceMappingURL=krakenModel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"krakenModel.js","sourceRoot":"","sources":["../../../src/cli/tools/krakenModel.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,95 @@
1
+ /**
2
+ * krakenRadio — lightweight parent↔tentacle progress bus (Fractal-inspired).
3
+ *
4
+ * File-backed JSONL under `.zelari/radio/<sessionId>.jsonl`.
5
+ * No SQLite. Best-effort; never throws to callers of append.
6
+ *
7
+ * @since Kraken v1.x slice 2
8
+ */
9
+ import { appendFileSync, existsSync, mkdirSync, readFileSync, readdirSync } from 'node:fs';
10
+ import path from 'node:path';
11
+ function radioDir(cwd) {
12
+ return path.join(cwd, '.zelari', 'radio');
13
+ }
14
+ function radioPath(cwd, sessionId) {
15
+ const safe = (sessionId || 'default').replace(/[^a-zA-Z0-9._-]/g, '_').slice(0, 80);
16
+ return path.join(radioDir(cwd), `${safe}.jsonl`);
17
+ }
18
+ /** Append one radio event (best-effort, sync — sub-agent exit path). */
19
+ export function appendKrakenRadio(cwd, sessionId, event) {
20
+ try {
21
+ const dir = radioDir(cwd);
22
+ if (!existsSync(dir))
23
+ mkdirSync(dir, { recursive: true });
24
+ const row = {
25
+ ts: event.ts ?? new Date().toISOString(),
26
+ kind: event.kind,
27
+ agent: event.agent,
28
+ description: event.description,
29
+ ...(event.thoroughness !== undefined ? { thoroughness: event.thoroughness } : {}),
30
+ ...(event.detail !== undefined ? { detail: event.detail } : {}),
31
+ ...(event.model !== undefined ? { model: event.model } : {}),
32
+ ...(event.worktree !== undefined ? { worktree: event.worktree } : {}),
33
+ ...(event.durationMs !== undefined ? { durationMs: event.durationMs } : {}),
34
+ ...(event.ok !== undefined ? { ok: event.ok } : {}),
35
+ };
36
+ appendFileSync(radioPath(cwd, sessionId), `${JSON.stringify(row)}\n`, 'utf8');
37
+ }
38
+ catch {
39
+ // never break the agent loop for telemetry
40
+ }
41
+ }
42
+ /** Read recent radio events (newest last). */
43
+ export function readKrakenRadio(cwd, sessionId, limit = 50) {
44
+ try {
45
+ const file = radioPath(cwd, sessionId);
46
+ if (!existsSync(file))
47
+ return [];
48
+ const lines = readFileSync(file, 'utf8').split(/\r?\n/).filter(Boolean);
49
+ const slice = lines.slice(-Math.max(1, limit));
50
+ const out = [];
51
+ for (const line of slice) {
52
+ try {
53
+ out.push(JSON.parse(line));
54
+ }
55
+ catch {
56
+ // skip bad lines
57
+ }
58
+ }
59
+ return out;
60
+ }
61
+ catch {
62
+ return [];
63
+ }
64
+ }
65
+ /** List session radio files under .zelari/radio. */
66
+ export function listKrakenRadioSessions(cwd) {
67
+ try {
68
+ const dir = radioDir(cwd);
69
+ if (!existsSync(dir))
70
+ return [];
71
+ return readdirSync(dir)
72
+ .filter((f) => f.endsWith('.jsonl'))
73
+ .map((f) => f.replace(/\.jsonl$/, ''));
74
+ }
75
+ catch {
76
+ return [];
77
+ }
78
+ }
79
+ /** Human-readable status block for slash / doctor. */
80
+ export function formatKrakenRadioStatus(cwd, sessionId, limit = 12) {
81
+ const events = readKrakenRadio(cwd, sessionId, limit);
82
+ if (events.length === 0) {
83
+ return `Kraken radio: no events yet for session "${sessionId}" (path .zelari/radio/).`;
84
+ }
85
+ const lines = events.map((e) => {
86
+ const flag = e.ok === false ? '✗' : e.ok === true ? '✓' : '·';
87
+ const ms = e.durationMs != null ? ` ${e.durationMs}ms` : '';
88
+ const model = e.model ? ` [${e.model}]` : '';
89
+ const wt = e.worktree ? ` wt=${path.basename(e.worktree)}` : '';
90
+ const detail = e.detail ? ` — ${e.detail.slice(0, 120)}` : '';
91
+ return `${flag} ${e.ts.slice(11, 19)} ${e.kind} ${e.agent} "${e.description}"${model}${wt}${ms}${detail}`;
92
+ });
93
+ return [`Kraken radio (last ${events.length}) session=${sessionId}:`, ...lines].join('\n');
94
+ }
95
+ //# sourceMappingURL=krakenRadio.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"krakenRadio.js","sourceRoot":"","sources":["../../../src/cli/tools/krakenRadio.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,245 @@
1
+ /**
2
+ * krakenWorktree — opt-in git worktree isolation for Kraken general tentacles (K7).
3
+ *
4
+ * Enable with ZELARI_KRAKEN_WORKTREE=1 (or "true").
5
+ *
6
+ * Flow:
7
+ * 1. git worktree add <repo>/.zelari/worktrees/kraken-<id> -b kraken/<id>
8
+ * 2. Run sub-agent with cwd = worktree path
9
+ * 3. On success (default): squash-merge branch into parent HEAD, then cleanup
10
+ * - ZELARI_KRAKEN_WORKTREE_AUTO_MERGE=0 → skip merge (still cleanup unless KEEP)
11
+ * - ZELARI_KRAKEN_WORKTREE_KEEP=1 → never merge/cleanup (manual)
12
+ * 4. On merge conflict: keep worktree + branch, report error in footer
13
+ *
14
+ * Windows: Git for Windows worktree. Paths are absolute.
15
+ */
16
+ import { execFile } from 'node:child_process';
17
+ import { existsSync, mkdirSync, rmSync } from 'node:fs';
18
+ import path from 'node:path';
19
+ import { promisify } from 'node:util';
20
+ import { randomBytes } from 'node:crypto';
21
+ const execFileAsync = promisify(execFile);
22
+ export function isKrakenWorktreeEnabled(env = process.env) {
23
+ const v = (env.ZELARI_KRAKEN_WORKTREE ?? '').trim().toLowerCase();
24
+ return v === '1' || v === 'true' || v === 'yes' || v === 'on';
25
+ }
26
+ export function shouldKeepWorktree(env = process.env) {
27
+ const v = (env.ZELARI_KRAKEN_WORKTREE_KEEP ?? '').trim().toLowerCase();
28
+ return v === '1' || v === 'true' || v === 'yes' || v === 'on';
29
+ }
30
+ /**
31
+ * Auto-merge after a successful general tentacle.
32
+ * Default ON when worktree is enabled and KEEP is off.
33
+ * Set ZELARI_KRAKEN_WORKTREE_AUTO_MERGE=0 to disable.
34
+ */
35
+ export function isKrakenWorktreeAutoMergeEnabled(env = process.env) {
36
+ if (shouldKeepWorktree(env))
37
+ return false;
38
+ const v = (env.ZELARI_KRAKEN_WORKTREE_AUTO_MERGE ?? '1').trim().toLowerCase();
39
+ if (v === '0' || v === 'false' || v === 'no' || v === 'off')
40
+ return false;
41
+ return true;
42
+ }
43
+ async function git(cwd, args) {
44
+ try {
45
+ const { stdout, stderr } = await execFileAsync('git', ['-C', cwd, ...args], {
46
+ maxBuffer: 16 * 1024 * 1024,
47
+ windowsHide: true,
48
+ });
49
+ return { ok: true, stdout: stdout ?? '', stderr: stderr ?? '', code: 0 };
50
+ }
51
+ catch (err) {
52
+ const e = err;
53
+ return {
54
+ ok: false,
55
+ stdout: e.stdout ?? '',
56
+ stderr: e.stderr ?? e.message ?? String(err),
57
+ code: typeof e.code === 'number' ? e.code : 1,
58
+ };
59
+ }
60
+ }
61
+ /** Resolve git toplevel for worktree add. */
62
+ export async function resolveGitRoot(cwd) {
63
+ const r = await git(cwd, ['rev-parse', '--show-toplevel']);
64
+ if (!r.ok)
65
+ return null;
66
+ const root = r.stdout.trim();
67
+ return root || null;
68
+ }
69
+ /**
70
+ * Create an isolated worktree for a general tentacle.
71
+ * Returns null if git unavailable or worktree add fails (caller falls back to shared cwd).
72
+ */
73
+ export async function createKrakenWorktree(cwd, label) {
74
+ const repoRoot = await resolveGitRoot(cwd);
75
+ if (!repoRoot)
76
+ return null;
77
+ const head = await git(repoRoot, ['rev-parse', 'HEAD']);
78
+ const baseSha = head.ok ? head.stdout.trim() : undefined;
79
+ const id = `${Date.now().toString(36)}-${randomBytes(3).toString('hex')}`;
80
+ const slug = (label ?? 'task')
81
+ .toLowerCase()
82
+ .replace(/[^a-z0-9]+/g, '-')
83
+ .replace(/^-|-$/g, '')
84
+ .slice(0, 24) || 'task';
85
+ const branch = `kraken/${slug}-${id}`;
86
+ const wtRoot = path.join(repoRoot, '.zelari', 'worktrees');
87
+ const wtPath = path.join(wtRoot, `kraken-${id}`);
88
+ try {
89
+ if (!existsSync(wtRoot))
90
+ mkdirSync(wtRoot, { recursive: true });
91
+ }
92
+ catch {
93
+ return null;
94
+ }
95
+ const add = await git(repoRoot, ['worktree', 'add', '-b', branch, wtPath, 'HEAD']);
96
+ if (!add.ok) {
97
+ const add2 = await git(repoRoot, ['worktree', 'add', wtPath, 'HEAD']);
98
+ if (!add2.ok)
99
+ return null;
100
+ return { id, branch: 'HEAD', path: wtPath, repoRoot, baseSha };
101
+ }
102
+ return { id, branch, path: wtPath, repoRoot, baseSha };
103
+ }
104
+ /**
105
+ * Commit dirty files inside the worktree (best-effort).
106
+ */
107
+ export async function commitWorktreeChanges(handle, message) {
108
+ const st = await git(handle.path, ['status', '--porcelain']);
109
+ if (!st.ok)
110
+ return { ok: false, committed: false, detail: st.stderr || 'status failed' };
111
+ if (st.stdout.trim()) {
112
+ const add = await git(handle.path, ['add', '-A']);
113
+ if (!add.ok)
114
+ return { ok: false, committed: false, detail: add.stderr || 'add failed' };
115
+ const msg = message.slice(0, 200) || `kraken tentacle ${handle.id}`;
116
+ const commit = await git(handle.path, [
117
+ 'commit',
118
+ '-m',
119
+ msg,
120
+ '--author',
121
+ 'Kraken Tentacle <kraken@zelari.local>',
122
+ ]);
123
+ if (!commit.ok) {
124
+ const st2 = await git(handle.path, ['status', '--porcelain']);
125
+ if (st2.ok && !st2.stdout.trim()) {
126
+ return { ok: true, committed: false, detail: 'clean after add' };
127
+ }
128
+ return { ok: false, committed: false, detail: commit.stderr || 'commit failed' };
129
+ }
130
+ return { ok: true, committed: true, detail: 'committed in worktree' };
131
+ }
132
+ return { ok: true, committed: false, detail: 'worktree clean' };
133
+ }
134
+ /**
135
+ * Squash-merge tentacle branch into the parent repo HEAD, then optionally cleanup.
136
+ */
137
+ export async function mergeKrakenWorktree(handle, opts = {}, env = process.env) {
138
+ if (!handle.branch || handle.branch === 'HEAD') {
139
+ return {
140
+ ok: false,
141
+ merged: false,
142
+ committed: false,
143
+ message: 'worktree has no named branch to merge',
144
+ };
145
+ }
146
+ const commitMsg = (opts.message ?? `kraken: merge ${handle.branch}`).slice(0, 200);
147
+ const pre = await commitWorktreeChanges(handle, commitMsg);
148
+ if (!pre.ok) {
149
+ return {
150
+ ok: false,
151
+ merged: false,
152
+ committed: false,
153
+ message: `pre-merge commit failed: ${pre.detail}`,
154
+ };
155
+ }
156
+ const range = handle.baseSha
157
+ ? `${handle.baseSha}..${handle.branch}`
158
+ : handle.branch;
159
+ const log = await git(handle.repoRoot, ['log', '--oneline', range]);
160
+ const ahead = log.ok ? log.stdout.trim() : '';
161
+ if (!ahead && !pre.committed) {
162
+ if (opts.cleanup !== false && !shouldKeepWorktree(env)) {
163
+ await cleanupKrakenWorktree(handle, env);
164
+ }
165
+ return {
166
+ ok: true,
167
+ merged: false,
168
+ committed: false,
169
+ message: 'no changes to merge (worktree empty)',
170
+ };
171
+ }
172
+ const merge = await git(handle.repoRoot, ['merge', '--squash', handle.branch]);
173
+ if (!merge.ok) {
174
+ const conflict = /conflict/i.test(merge.stderr) || /conflict/i.test(merge.stdout);
175
+ if (conflict) {
176
+ await git(handle.repoRoot, ['reset', '--merge']);
177
+ }
178
+ return {
179
+ ok: false,
180
+ merged: false,
181
+ committed: false,
182
+ conflict: true,
183
+ message: `merge conflict or failed: ${(merge.stderr || merge.stdout).trim().slice(0, 300)}`,
184
+ };
185
+ }
186
+ const stParent = await git(handle.repoRoot, ['status', '--porcelain']);
187
+ let committed = false;
188
+ if (stParent.ok && stParent.stdout.trim()) {
189
+ const c = await git(handle.repoRoot, ['commit', '-m', commitMsg]);
190
+ if (!c.ok) {
191
+ return {
192
+ ok: false,
193
+ merged: true,
194
+ committed: false,
195
+ message: `squash staged but commit failed: ${c.stderr.slice(0, 200)}`,
196
+ };
197
+ }
198
+ committed = true;
199
+ }
200
+ if (opts.cleanup !== false && !shouldKeepWorktree(env)) {
201
+ await cleanupKrakenWorktree(handle, env);
202
+ }
203
+ return {
204
+ ok: true,
205
+ merged: true,
206
+ committed,
207
+ message: committed
208
+ ? `squash-merged ${handle.branch} into HEAD`
209
+ : `squash-merge ${handle.branch} (no parent commit — already applied?)`,
210
+ };
211
+ }
212
+ /**
213
+ * Remove worktree + delete branch (best-effort).
214
+ * Skipped when ZELARI_KRAKEN_WORKTREE_KEEP=1.
215
+ */
216
+ export async function cleanupKrakenWorktree(handle, env = process.env) {
217
+ if (shouldKeepWorktree(env))
218
+ return;
219
+ await git(handle.repoRoot, ['worktree', 'remove', '--force', handle.path]);
220
+ try {
221
+ if (existsSync(handle.path)) {
222
+ rmSync(handle.path, { recursive: true, force: true });
223
+ }
224
+ }
225
+ catch {
226
+ // ignore
227
+ }
228
+ await git(handle.repoRoot, ['worktree', 'prune']);
229
+ if (handle.branch.startsWith('kraken/')) {
230
+ await git(handle.repoRoot, ['branch', '-D', handle.branch]);
231
+ }
232
+ }
233
+ /** One-line status for task result footer. */
234
+ export function formatWorktreeFooter(handle, opts = {}) {
235
+ const merge = opts.merge;
236
+ if (merge) {
237
+ const flag = merge.ok ? 'ok' : merge.conflict ? 'CONFLICT' : 'fail';
238
+ return `worktree merge [${flag}]: ${merge.message} (branch=${handle.branch})`;
239
+ }
240
+ if (opts.kept) {
241
+ return `worktree kept: branch=${handle.branch} path=${handle.path} (merge manually, then git worktree remove)`;
242
+ }
243
+ return `worktree used: branch=${handle.branch} path=${handle.path}`;
244
+ }
245
+ //# sourceMappingURL=krakenWorktree.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"krakenWorktree.js","sourceRoot":"","sources":["../../../src/cli/tools/krakenWorktree.ts"],"names":[],"mappings":"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"}