@namzu/cli 16.1.0 → 17.0.1

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 (75) hide show
  1. package/README.md +27 -5
  2. package/dist/commands/drain.d.ts.map +1 -1
  3. package/dist/commands/drain.js +23 -1
  4. package/dist/commands/drain.js.map +1 -1
  5. package/dist/commands/run-stream.d.ts +3 -2
  6. package/dist/commands/run-stream.d.ts.map +1 -1
  7. package/dist/commands/run-stream.js +32 -37
  8. package/dist/commands/run-stream.js.map +1 -1
  9. package/dist/commands/run.d.ts.map +1 -1
  10. package/dist/commands/run.js +26 -24
  11. package/dist/commands/run.js.map +1 -1
  12. package/dist/config/load.d.ts +1 -1
  13. package/dist/config/load.d.ts.map +1 -1
  14. package/dist/config/load.js +3 -4
  15. package/dist/config/load.js.map +1 -1
  16. package/dist/doctor/checks/chain.d.ts +1 -1
  17. package/dist/doctor/checks/chain.d.ts.map +1 -1
  18. package/dist/doctor/checks/chain.js +2 -4
  19. package/dist/doctor/checks/chain.js.map +1 -1
  20. package/dist/integrations/files/attachment-store.d.ts.map +1 -1
  21. package/dist/integrations/files/attachment-store.js +3 -3
  22. package/dist/integrations/files/attachment-store.js.map +1 -1
  23. package/dist/integrations/plugins/runtime.d.ts.map +1 -1
  24. package/dist/integrations/plugins/runtime.js +4 -2
  25. package/dist/integrations/plugins/runtime.js.map +1 -1
  26. package/dist/integrations/providers/credential-store.d.ts.map +1 -1
  27. package/dist/integrations/providers/credential-store.js +13 -12
  28. package/dist/integrations/providers/credential-store.js.map +1 -1
  29. package/dist/integrations/providers/preferences.d.ts.map +1 -1
  30. package/dist/integrations/providers/preferences.js +5 -5
  31. package/dist/integrations/providers/preferences.js.map +1 -1
  32. package/dist/integrations/sessions/store.d.ts +31 -9
  33. package/dist/integrations/sessions/store.d.ts.map +1 -1
  34. package/dist/integrations/sessions/store.js +291 -69
  35. package/dist/integrations/sessions/store.js.map +1 -1
  36. package/dist/integrations/state/home.d.ts +25 -0
  37. package/dist/integrations/state/home.d.ts.map +1 -0
  38. package/dist/integrations/state/home.js +53 -0
  39. package/dist/integrations/state/home.js.map +1 -0
  40. package/dist/integrations/state/report.d.ts +8 -4
  41. package/dist/integrations/state/report.d.ts.map +1 -1
  42. package/dist/integrations/state/report.js +54 -7
  43. package/dist/integrations/state/report.js.map +1 -1
  44. package/dist/integrations/subagents/runtime.d.ts +3 -1
  45. package/dist/integrations/subagents/runtime.d.ts.map +1 -1
  46. package/dist/integrations/subagents/runtime.js +1 -0
  47. package/dist/integrations/subagents/runtime.js.map +1 -1
  48. package/dist/integrations/trust/store.d.ts.map +1 -1
  49. package/dist/integrations/trust/store.js +6 -6
  50. package/dist/integrations/trust/store.js.map +1 -1
  51. package/dist/memory/store.d.ts.map +1 -1
  52. package/dist/memory/store.js +7 -7
  53. package/dist/memory/store.js.map +1 -1
  54. package/dist/skills/store.d.ts +2 -1
  55. package/dist/skills/store.d.ts.map +1 -1
  56. package/dist/skills/store.js +11 -4
  57. package/dist/skills/store.js.map +1 -1
  58. package/dist/tui/App.d.ts.map +1 -1
  59. package/dist/tui/App.js +69 -51
  60. package/dist/tui/App.js.map +1 -1
  61. package/dist/tui/LiveActivity.js +1 -1
  62. package/dist/tui/PermissionOverlay.d.ts.map +1 -1
  63. package/dist/tui/PermissionOverlay.js +4 -2
  64. package/dist/tui/PermissionOverlay.js.map +1 -1
  65. package/dist/tui/agent.d.ts +10 -2
  66. package/dist/tui/agent.d.ts.map +1 -1
  67. package/dist/tui/agent.js +76 -26
  68. package/dist/tui/agent.js.map +1 -1
  69. package/dist/tui/permission-review.d.ts.map +1 -1
  70. package/dist/tui/permission-review.js +47 -10
  71. package/dist/tui/permission-review.js.map +1 -1
  72. package/dist/user-commands/store.d.ts.map +1 -1
  73. package/dist/user-commands/store.js +4 -3
  74. package/dist/user-commands/store.js.map +1 -1
  75. package/package.json +3 -3
@@ -5,20 +5,24 @@
5
5
  * (`name`, `description`) and a markdown body. Skills are discovered from
6
6
  * two roots:
7
7
  * - user: `~/.namzu/skills/<name>/SKILL.md`
8
- * - project: `<cwd>/skills/<name>/SKILL.md`
8
+ * - project: `<cwd>/.namzu/skills/<name>/SKILL.md`
9
+ * - legacy project: `<cwd>/skills/<name>/SKILL.md`
9
10
  *
10
11
  * Project skills shadow user skills with the same name. The TUI lists them
11
12
  * (`/skills`) and activates one (`/skill <name>`) by injecting its body
12
13
  * into the agent's system prompt for subsequent turns.
13
14
  */
14
15
  import { readFileSync, readdirSync } from 'node:fs';
15
- import { homedir } from 'node:os';
16
16
  import { join } from 'node:path';
17
17
  import { parseFrontmatter } from '@namzu/sdk';
18
- export function userSkillsDir(home = homedir()) {
19
- return join(home, '.namzu', 'skills');
18
+ import { namzuHomePath } from '../integrations/state/home.js';
19
+ export function userSkillsDir(home) {
20
+ return join(namzuHomePath(home), 'skills');
20
21
  }
21
22
  export function projectSkillsDir(cwd = process.cwd()) {
23
+ return join(cwd, '.namzu', 'skills');
24
+ }
25
+ function legacyProjectSkillsDir(cwd = process.cwd()) {
22
26
  return join(cwd, 'skills');
23
27
  }
24
28
  /**
@@ -114,10 +118,13 @@ function readSkillsFrom(dir, source) {
114
118
  */
115
119
  export function discoverSkills(opts = {}) {
116
120
  const user = readSkillsFrom(userSkillsDir(opts.home), 'user');
121
+ const legacyProject = readSkillsFrom(legacyProjectSkillsDir(opts.cwd), 'project');
117
122
  const project = readSkillsFrom(projectSkillsDir(opts.cwd), 'project');
118
123
  const byName = new Map();
119
124
  for (const s of user)
120
125
  byName.set(s.name, s);
126
+ for (const s of legacyProject)
127
+ byName.set(s.name, s);
121
128
  for (const s of project)
122
129
  byName.set(s.name, s); // project wins
123
130
  return [...byName.values()].sort((a, b) => a.name.localeCompare(b.name));
@@ -1 +1 @@
1
- {"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/skills/store.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/skills/store.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"App.d.ts","sourceRoot":"","sources":["../../src/tui/App.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,EAON,KAAK,OAAO,EAiBZ,MAAM,YAAY,CAAA;AA+GnB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AA2CvD,OAAO,KAAK,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAU/D,MAAM,WAAW,QAAQ;IACxB,QAAQ,CAAC,GAAG,EAAE,UAAU,CAAA;IACxB,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,IAAI,CAAA;IAC1D,0EAA0E;IAC1E,QAAQ,CAAC,cAAc,CAAC,EAAE,qBAAqB,CAAA;CAC/C;AAOD,MAAM,MAAM,qBAAqB,GAAG,CAAC,OAAO,EAAE;IAC7C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAA;CAC5B,KAAK,OAAO,CAAC,MAAM,CAAC,CAAA;AAuKrB,6EAA6E;AAC7E,wBAAgB,6BAA6B,CAAC,QAAQ,EAAE,SAAS,OAAO,EAAE,GAAG,SAAS,MAAM,EAAE,CAM7F;AAED,sEAAsE;AACtE,wBAAgB,mBAAmB,CAClC,QAAQ,EAAE,SAAS,OAAO,EAAE,EAC5B,MAAM,EAAE,MAAM,MAAM,EACpB,iBAAiB,GAAE,SAAS,MAAM,EAAO,GACvC,SAAS,iBAAiB,EAAE,CAuE9B;AA8GD,wBAAgB,GAAG,CAAC,EACnB,GAAG,EAAE,UAAU,EACf,aAAa,EACb,cAAsC,GACtC,EAAE,QAAQ,2CA8mKV"}
1
+ {"version":3,"file":"App.d.ts","sourceRoot":"","sources":["../../src/tui/App.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,EAON,KAAK,OAAO,EAiBZ,MAAM,YAAY,CAAA;AA+GnB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AA2CvD,OAAO,KAAK,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAU/D,MAAM,WAAW,QAAQ;IACxB,QAAQ,CAAC,GAAG,EAAE,UAAU,CAAA;IACxB,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,IAAI,CAAA;IAC1D,0EAA0E;IAC1E,QAAQ,CAAC,cAAc,CAAC,EAAE,qBAAqB,CAAA;CAC/C;AAOD,MAAM,MAAM,qBAAqB,GAAG,CAAC,OAAO,EAAE;IAC7C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAA;CAC5B,KAAK,OAAO,CAAC,MAAM,CAAC,CAAA;AAuKrB,6EAA6E;AAC7E,wBAAgB,6BAA6B,CAAC,QAAQ,EAAE,SAAS,OAAO,EAAE,GAAG,SAAS,MAAM,EAAE,CAM7F;AAED,sEAAsE;AACtE,wBAAgB,mBAAmB,CAClC,QAAQ,EAAE,SAAS,OAAO,EAAE,EAC5B,MAAM,EAAE,MAAM,MAAM,EACpB,iBAAiB,GAAE,SAAS,MAAM,EAAO,GACvC,SAAS,iBAAiB,EAAE,CAuE9B;AA8GD,wBAAgB,GAAG,CAAC,EACnB,GAAG,EAAE,UAAU,EACf,aAAa,EACb,cAAsC,GACtC,EAAE,QAAQ,2CAkoKV"}
package/dist/tui/App.js CHANGED
@@ -478,6 +478,20 @@ export function App({ ctx: initialCtx, onExitSummary, externalEditor = defaultEx
478
478
  focus: surface.kind === 'cockpit' ? surface.focus : surface.returnFocus,
479
479
  });
480
480
  }, [setAgentSurface]);
481
+ const openAgentCockpit = useCallback(() => {
482
+ const agents = subagentsRef.current;
483
+ const firstPhase = agentPhases(agents)[0];
484
+ const firstAgent = firstPhase?.agents[0];
485
+ if (!firstPhase || !firstAgent)
486
+ return false;
487
+ setAgentSurface({
488
+ kind: 'cockpit',
489
+ selectedPhaseId: firstPhase.id,
490
+ selectedId: firstAgent.viewId,
491
+ focus: 'agents',
492
+ });
493
+ return true;
494
+ }, [setAgentSurface]);
481
495
  /** One git-backed review choice may be resolving while its visible picker remains authoritative. */
482
496
  const reviewChoiceInFlightRef = useRef(null);
483
497
  const exitArmedRef = useRef(false);
@@ -1338,47 +1352,41 @@ export function App({ ctx: initialCtx, onExitSummary, externalEditor = defaultEx
1338
1352
  setMessages((prev) => prev.map((m) => m.id === id ? { ...m, content: finalContent ?? m.content, pending: false } : m));
1339
1353
  }, []);
1340
1354
  // Open the SDK session store and select the durable conversation once.
1341
- // Ordinary startup remains best-effort; an explicit `namzu resume <id>` is
1342
- // exact and therefore refuses instead of silently widening to a fresh chat.
1355
+ // This is an admission gate for every startup, not optional persistence: a
1356
+ // corrupt or split estate must not silently widen into cwd-local state and
1357
+ // let the model run against a different history than the operator selected.
1343
1358
  const ensureSessions = useCallback(async () => {
1344
1359
  if (scopeRef.current)
1345
1360
  return scopeRef.current;
1346
1361
  const requestedConversationId = initialConversationIdRef.current;
1347
- try {
1348
- const sessions = await openSessions(ctxRef.current.cwd);
1349
- let sessionId;
1350
- if (requestedConversationId) {
1351
- const restored = await loadResumableConversation(sessions, requestedConversationId);
1352
- sessionId = asSessionId(requestedConversationId);
1353
- modelHistoryRef.current = restored;
1354
- setMessages(projectConversation(restored, nextId));
1355
- setHistory(promptHistoryFromConversation(restored));
1356
- const persistedOutput = latestAssistantOutput(restored);
1357
- lastCompletedOutputRef.current = persistedOutput
1358
- ? { text: persistedOutput, provenance: 'persisted' }
1359
- : null;
1360
- initialConversationIdRef.current = undefined;
1361
- conversationMaterializedRef.current = true;
1362
- }
1363
- else {
1364
- // Provider/tool startup needs stable project/tenant/topic ids, not a
1365
- // durable conversation. The cursor is replaced on first admitted use.
1366
- sessionId = generateSessionId();
1367
- }
1368
- sessionsRef.current = sessions;
1369
- scopeRef.current = {
1370
- sessionId,
1371
- topicId: sessions.topicId,
1372
- projectId: sessions.projectId,
1373
- tenantId: sessions.tenantId,
1374
- };
1375
- return scopeRef.current;
1376
- }
1377
- catch (error) {
1378
- if (requestedConversationId)
1379
- throw error;
1380
- return undefined;
1362
+ const sessions = await openSessions(ctxRef.current.cwd);
1363
+ let sessionId;
1364
+ if (requestedConversationId) {
1365
+ const restored = await loadResumableConversation(sessions, requestedConversationId);
1366
+ sessionId = asSessionId(requestedConversationId);
1367
+ modelHistoryRef.current = restored;
1368
+ setMessages(projectConversation(restored, nextId));
1369
+ setHistory(promptHistoryFromConversation(restored));
1370
+ const persistedOutput = latestAssistantOutput(restored);
1371
+ lastCompletedOutputRef.current = persistedOutput
1372
+ ? { text: persistedOutput, provenance: 'persisted' }
1373
+ : null;
1374
+ initialConversationIdRef.current = undefined;
1375
+ conversationMaterializedRef.current = true;
1381
1376
  }
1377
+ else {
1378
+ // Provider/tool startup needs stable project/tenant/topic ids, not a
1379
+ // durable conversation. The cursor is replaced on first admitted use.
1380
+ sessionId = generateSessionId();
1381
+ }
1382
+ sessionsRef.current = sessions;
1383
+ scopeRef.current = {
1384
+ sessionId,
1385
+ topicId: sessions.topicId,
1386
+ projectId: sessions.projectId,
1387
+ tenantId: sessions.tenantId,
1388
+ };
1389
+ return scopeRef.current;
1382
1390
  }, [nextId]);
1383
1391
  /** Publish the provisional conversation exactly once, at first durable use. */
1384
1392
  const materializeConversation = useCallback(async () => {
@@ -1429,6 +1437,9 @@ export function App({ ctx: initialCtx, onExitSummary, externalEditor = defaultEx
1429
1437
  const s = await createAgentSession(prefs, detectedNow, {
1430
1438
  scope,
1431
1439
  cwd: activeCtx.cwd,
1440
+ ...(sessionsRef.current?.backend === 'central'
1441
+ ? { stateRoot: sessionsRef.current.root }
1442
+ : {}),
1432
1443
  enableComputerUse: true,
1433
1444
  rules: activeCtx.rules,
1434
1445
  ...(sessionsRef.current ? { sessionGoals: sessionsRef.current.goals } : {}),
@@ -1940,8 +1951,16 @@ export function App({ ctx: initialCtx, onExitSummary, externalEditor = defaultEx
1940
1951
  setPermissionReviewOffset(0);
1941
1952
  setPermissionDetailsOpen(false);
1942
1953
  setPermission(null);
1943
- if (resolve)
1954
+ if (resolve) {
1955
+ // The provider resumes asynchronously after the decision. Leaving the
1956
+ // old state in place during that hand-off painted an empty `…` row and
1957
+ // the now-invalid approval footer, so a four-agent batch looked frozen
1958
+ // precisely while its children were starting. The turn is working from
1959
+ // the instant consent resolves; the next tool event will refine this to
1960
+ // `tool`, and the ordinary turn finalizer owns the transition to idle.
1961
+ setState('thinking');
1944
1962
  resolve(decision);
1963
+ }
1945
1964
  }, [setPermissionDetailsOpen, setPermissionReviewOffset]);
1946
1965
  /**
1947
1966
  * Stop the running turn, and hand the screen back in a usable state.
@@ -2526,7 +2545,11 @@ export function App({ ctx: initialCtx, onExitSummary, externalEditor = defaultEx
2526
2545
  activeToolsRef.current = [...running.slice(0, i), ...running.slice(i + 1)];
2527
2546
  setActiveTools(activeToolsRef.current);
2528
2547
  }
2529
- pushMessage('tool', done?.label ?? formatToolCall(event.toolName, event.summary), false, event.isError ? '✗' : '✓', done?.detail, event.isError ? theme.status.error : theme.status.ok, done ? formatElapsed(Date.now() - done.startedAt) : undefined);
2548
+ pushMessage('tool', done?.label ?? formatToolCall(event.toolName, event.summary), false, event.isError ? '✗' : '✓', done?.detail, event.isError ? theme.status.error : theme.status.ok, event.durationMs !== undefined
2549
+ ? formatElapsed(event.durationMs)
2550
+ : done
2551
+ ? formatElapsed(Date.now() - done.startedAt)
2552
+ : undefined);
2530
2553
  if (event.isError ||
2531
2554
  (!event.hidden && (event.summary.length > 0 || (event.detail?.length ?? 0) > 0))) {
2532
2555
  pushMessage('tool', event.isError ? `failed: ${event.summary}` : event.summary, false, '⎿', event.detail);
@@ -3077,21 +3100,9 @@ export function App({ ctx: initialCtx, onExitSummary, externalEditor = defaultEx
3077
3100
  return;
3078
3101
  }
3079
3102
  case 'agent-cockpit': {
3080
- const agents = subagentsRef.current;
3081
- if (agents.length === 0) {
3103
+ if (!openAgentCockpit()) {
3082
3104
  pushMessage('system', 'No delegated agents are available in this conversation yet. When an Agent tool starts one, /agent opens its live activity and retained transcript.');
3083
- return;
3084
3105
  }
3085
- const firstPhase = agentPhases(agents)[0];
3086
- const firstAgent = firstPhase?.agents[0];
3087
- if (!firstPhase || !firstAgent)
3088
- return;
3089
- setAgentSurface({
3090
- kind: 'cockpit',
3091
- selectedPhaseId: firstPhase.id,
3092
- selectedId: firstAgent.viewId,
3093
- focus: 'agents',
3094
- });
3095
3106
  return;
3096
3107
  }
3097
3108
  case 'clear-screen':
@@ -3754,6 +3765,7 @@ export function App({ ctx: initialCtx, onExitSummary, externalEditor = defaultEx
3754
3765
  exitWithSummary,
3755
3766
  hasUnsettledTurn,
3756
3767
  nextId,
3768
+ openAgentCockpit,
3757
3769
  pushMessage,
3758
3770
  rawOutput,
3759
3771
  removeStoredCredential,
@@ -4225,6 +4237,12 @@ export function App({ ctx: initialCtx, onExitSummary, externalEditor = defaultEx
4225
4237
  resolvePermission({ kind: 'approve-all' });
4226
4238
  return;
4227
4239
  }
4240
+ // The active child count already advertises this key beside Working.
4241
+ // Open the same retained cockpit as `/agent`; Enter then drills into a
4242
+ // child's transcript. Keep the shortcut below consent so it can never
4243
+ // hide an approval that owns the keyboard.
4244
+ if (key.ctrl && input === 't' && openAgentCockpit())
4245
+ return;
4228
4246
  // Child observation owns navigation, but never outranks consent: the
4229
4247
  // permission branch above preempts it if a child or parent call asks.
4230
4248
  const agentView = agentSurfaceRef.current;