@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.
- package/README.md +17 -3
- package/dist/commands/drain.d.ts.map +1 -1
- package/dist/commands/drain.js +23 -1
- package/dist/commands/drain.js.map +1 -1
- package/dist/commands/run-stream.d.ts +3 -2
- package/dist/commands/run-stream.d.ts.map +1 -1
- package/dist/commands/run-stream.js +32 -37
- package/dist/commands/run-stream.js.map +1 -1
- package/dist/commands/run.d.ts.map +1 -1
- package/dist/commands/run.js +26 -24
- package/dist/commands/run.js.map +1 -1
- package/dist/config/load.d.ts +1 -1
- package/dist/config/load.d.ts.map +1 -1
- package/dist/config/load.js +3 -4
- package/dist/config/load.js.map +1 -1
- package/dist/doctor/checks/chain.d.ts +1 -1
- package/dist/doctor/checks/chain.d.ts.map +1 -1
- package/dist/doctor/checks/chain.js +2 -4
- package/dist/doctor/checks/chain.js.map +1 -1
- package/dist/integrations/files/attachment-store.d.ts.map +1 -1
- package/dist/integrations/files/attachment-store.js +3 -3
- package/dist/integrations/files/attachment-store.js.map +1 -1
- package/dist/integrations/plugins/runtime.d.ts.map +1 -1
- package/dist/integrations/plugins/runtime.js +4 -2
- package/dist/integrations/plugins/runtime.js.map +1 -1
- package/dist/integrations/providers/credential-store.d.ts.map +1 -1
- package/dist/integrations/providers/credential-store.js +13 -12
- package/dist/integrations/providers/credential-store.js.map +1 -1
- package/dist/integrations/providers/preferences.d.ts.map +1 -1
- package/dist/integrations/providers/preferences.js +5 -5
- package/dist/integrations/providers/preferences.js.map +1 -1
- package/dist/integrations/sessions/store.d.ts +31 -9
- package/dist/integrations/sessions/store.d.ts.map +1 -1
- package/dist/integrations/sessions/store.js +291 -69
- package/dist/integrations/sessions/store.js.map +1 -1
- package/dist/integrations/state/home.d.ts +25 -0
- package/dist/integrations/state/home.d.ts.map +1 -0
- package/dist/integrations/state/home.js +53 -0
- package/dist/integrations/state/home.js.map +1 -0
- package/dist/integrations/state/report.d.ts +8 -4
- package/dist/integrations/state/report.d.ts.map +1 -1
- package/dist/integrations/state/report.js +54 -7
- package/dist/integrations/state/report.js.map +1 -1
- package/dist/integrations/subagents/runtime.d.ts +3 -1
- package/dist/integrations/subagents/runtime.d.ts.map +1 -1
- package/dist/integrations/subagents/runtime.js +1 -0
- package/dist/integrations/subagents/runtime.js.map +1 -1
- package/dist/integrations/trust/store.d.ts.map +1 -1
- package/dist/integrations/trust/store.js +6 -6
- package/dist/integrations/trust/store.js.map +1 -1
- package/dist/memory/store.d.ts.map +1 -1
- package/dist/memory/store.js +7 -7
- package/dist/memory/store.js.map +1 -1
- package/dist/skills/store.d.ts +2 -1
- package/dist/skills/store.d.ts.map +1 -1
- package/dist/skills/store.js +11 -4
- package/dist/skills/store.js.map +1 -1
- package/dist/tui/App.d.ts.map +1 -1
- package/dist/tui/App.js +38 -37
- package/dist/tui/App.js.map +1 -1
- package/dist/tui/agent.d.ts +10 -2
- package/dist/tui/agent.d.ts.map +1 -1
- package/dist/tui/agent.js +76 -26
- package/dist/tui/agent.js.map +1 -1
- package/dist/user-commands/store.d.ts.map +1 -1
- package/dist/user-commands/store.js +4 -3
- package/dist/user-commands/store.js.map +1 -1
- package/package.json +2 -2
package/dist/skills/store.js
CHANGED
|
@@ -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
|
|
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
|
-
|
|
19
|
-
|
|
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));
|
package/dist/skills/store.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/skills/store.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/skills/store.ts"],"names":[],"mappings":"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"}
|
package/dist/tui/App.d.ts.map
CHANGED
|
@@ -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,
|
|
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
|
-
//
|
|
1342
|
-
//
|
|
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
|
-
|
|
1348
|
-
|
|
1349
|
-
|
|
1350
|
-
|
|
1351
|
-
|
|
1352
|
-
|
|
1353
|
-
|
|
1354
|
-
|
|
1355
|
-
|
|
1356
|
-
|
|
1357
|
-
|
|
1358
|
-
|
|
1359
|
-
|
|
1360
|
-
|
|
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,
|
|
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);
|