@namzu/cli 16.1.0 → 17.0.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 (68) hide show
  1. package/README.md +17 -3
  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 +38 -37
  60. package/dist/tui/App.js.map +1 -1
  61. package/dist/tui/agent.d.ts +10 -2
  62. package/dist/tui/agent.d.ts.map +1 -1
  63. package/dist/tui/agent.js +76 -26
  64. package/dist/tui/agent.js.map +1 -1
  65. package/dist/user-commands/store.d.ts.map +1 -1
  66. package/dist/user-commands/store.js +4 -3
  67. package/dist/user-commands/store.js.map +1 -1
  68. package/package.json +2 -2
@@ -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,2CAinKV"}
package/dist/tui/App.js CHANGED
@@ -1338,47 +1338,41 @@ export function App({ ctx: initialCtx, onExitSummary, externalEditor = defaultEx
1338
1338
  setMessages((prev) => prev.map((m) => m.id === id ? { ...m, content: finalContent ?? m.content, pending: false } : m));
1339
1339
  }, []);
1340
1340
  // 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.
1341
+ // This is an admission gate for every startup, not optional persistence: a
1342
+ // corrupt or split estate must not silently widen into cwd-local state and
1343
+ // let the model run against a different history than the operator selected.
1343
1344
  const ensureSessions = useCallback(async () => {
1344
1345
  if (scopeRef.current)
1345
1346
  return scopeRef.current;
1346
1347
  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;
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;
1381
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;
1382
1376
  }, [nextId]);
1383
1377
  /** Publish the provisional conversation exactly once, at first durable use. */
1384
1378
  const materializeConversation = useCallback(async () => {
@@ -1429,6 +1423,9 @@ export function App({ ctx: initialCtx, onExitSummary, externalEditor = defaultEx
1429
1423
  const s = await createAgentSession(prefs, detectedNow, {
1430
1424
  scope,
1431
1425
  cwd: activeCtx.cwd,
1426
+ ...(sessionsRef.current?.backend === 'central'
1427
+ ? { stateRoot: sessionsRef.current.root }
1428
+ : {}),
1432
1429
  enableComputerUse: true,
1433
1430
  rules: activeCtx.rules,
1434
1431
  ...(sessionsRef.current ? { sessionGoals: sessionsRef.current.goals } : {}),
@@ -2526,7 +2523,11 @@ export function App({ ctx: initialCtx, onExitSummary, externalEditor = defaultEx
2526
2523
  activeToolsRef.current = [...running.slice(0, i), ...running.slice(i + 1)];
2527
2524
  setActiveTools(activeToolsRef.current);
2528
2525
  }
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);
2526
+ 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
2527
+ ? formatElapsed(event.durationMs)
2528
+ : done
2529
+ ? formatElapsed(Date.now() - done.startedAt)
2530
+ : undefined);
2530
2531
  if (event.isError ||
2531
2532
  (!event.hidden && (event.summary.length > 0 || (event.detail?.length ?? 0) > 0))) {
2532
2533
  pushMessage('tool', event.isError ? `failed: ${event.summary}` : event.summary, false, '⎿', event.detail);