document360-writer 0.1.0 → 0.2.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/dist/agent.d.ts +1 -1
- package/dist/agent.js +3 -1
- package/dist/agent.js.map +1 -1
- package/dist/cli.js +15 -2
- package/dist/cli.js.map +1 -1
- package/dist/commands/clear.d.ts +2 -1
- package/dist/commands/clear.js +10 -2
- package/dist/commands/clear.js.map +1 -1
- package/dist/commands/help.js +2 -2
- package/dist/commands/help.js.map +1 -1
- package/dist/commands/index.d.ts +4 -0
- package/dist/commands/index.js +4 -4
- package/dist/commands/index.js.map +1 -1
- package/dist/commands/rename.d.ts +3 -0
- package/dist/commands/rename.js +22 -0
- package/dist/commands/rename.js.map +1 -0
- package/dist/commands/resume.d.ts +3 -0
- package/dist/commands/resume.js +58 -0
- package/dist/commands/resume.js.map +1 -0
- package/dist/lib/auth.d.ts +14 -0
- package/dist/lib/auth.js +25 -0
- package/dist/lib/auth.js.map +1 -0
- package/dist/lib/paths.d.ts +1 -2
- package/dist/lib/paths.js +2 -5
- package/dist/lib/paths.js.map +1 -1
- package/dist/lib/sessionStore.d.ts +24 -0
- package/dist/lib/sessionStore.js +100 -0
- package/dist/lib/sessionStore.js.map +1 -0
- package/dist/lib/titleGen.d.ts +7 -0
- package/dist/lib/titleGen.js +64 -0
- package/dist/lib/titleGen.js.map +1 -0
- package/dist/oneShot.d.ts +7 -0
- package/dist/oneShot.js +96 -0
- package/dist/oneShot.js.map +1 -0
- package/dist/repl.d.ts +6 -1
- package/dist/repl.js +135 -13
- package/dist/repl.js.map +1 -1
- package/package.json +1 -1
- package/skills/write-article/SKILL.md +2 -0
- package/dist/commands/load.d.ts +0 -2
- package/dist/commands/load.js +0 -20
- package/dist/commands/load.js.map +0 -1
- package/dist/commands/save.d.ts +0 -2
- package/dist/commands/save.js +0 -29
- package/dist/commands/save.js.map +0 -1
package/dist/agent.d.ts
CHANGED
package/dist/agent.js
CHANGED
|
@@ -72,7 +72,7 @@ function toSdkMcpServers() {
|
|
|
72
72
|
}
|
|
73
73
|
return out;
|
|
74
74
|
}
|
|
75
|
-
export function startAgent(cwd = process.cwd()) {
|
|
75
|
+
export function startAgent(cwd = process.cwd(), resume) {
|
|
76
76
|
const cfg = readProjectConfig(cwd);
|
|
77
77
|
const systemPrompt = buildSystemPrompt(cwd, cfg);
|
|
78
78
|
const mcpServers = toSdkMcpServers();
|
|
@@ -83,8 +83,10 @@ export function startAgent(cwd = process.cwd()) {
|
|
|
83
83
|
mcpServers,
|
|
84
84
|
permissionMode: 'bypassPermissions',
|
|
85
85
|
allowDangerouslySkipPermissions: true,
|
|
86
|
+
includePartialMessages: true,
|
|
86
87
|
settingSources: [],
|
|
87
88
|
model: cfg?.defaultModel,
|
|
89
|
+
resume,
|
|
88
90
|
};
|
|
89
91
|
const q = query({ prompt: queue, options });
|
|
90
92
|
return { queue, iterator: q[Symbol.asyncIterator]() };
|
package/dist/agent.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent.js","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"agent.js","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.js
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { Command } from 'commander';
|
|
3
3
|
import { createRequire } from 'node:module';
|
|
4
|
+
import { AUTH_MODES } from './lib/auth.js';
|
|
5
|
+
import { runOnce } from './oneShot.js';
|
|
4
6
|
import { runRepl } from './repl.js';
|
|
5
7
|
const require = createRequire(import.meta.url);
|
|
6
8
|
const pkg = require('../package.json');
|
|
@@ -10,13 +12,24 @@ program
|
|
|
10
12
|
.description('Standalone documentation agent CLI. Reads your code, writes your docs.')
|
|
11
13
|
.version(pkg.version, '-v, --version')
|
|
12
14
|
.option('-p, --prompt <text>', 'One-shot prompt mode (non-interactive)')
|
|
15
|
+
.option('-r, --resume <name>', 'Resume a saved session (with --prompt; use /resume inside the REPL)')
|
|
13
16
|
.option('-C, --cwd <dir>', 'Working directory', process.cwd())
|
|
17
|
+
.option('--auth <mode>', 'Auth mode: auto | api | subscription', 'auto')
|
|
14
18
|
.action(async (opts) => {
|
|
19
|
+
if (!AUTH_MODES.includes(opts.auth)) {
|
|
20
|
+
console.error(`✗ Invalid --auth mode: ${opts.auth}`);
|
|
21
|
+
console.error('Run: d360-writer --auth auto | api | subscription');
|
|
22
|
+
process.exit(2);
|
|
23
|
+
}
|
|
15
24
|
if (opts.prompt) {
|
|
16
|
-
|
|
25
|
+
await runOnce(opts.cwd, opts.prompt, opts.auth, opts.resume);
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
if (opts.resume) {
|
|
29
|
+
console.error('✗ --resume requires --prompt. In the interactive REPL, use /resume instead.');
|
|
17
30
|
process.exit(2);
|
|
18
31
|
}
|
|
19
|
-
await runRepl(opts.cwd);
|
|
32
|
+
await runRepl(opts.cwd, opts.auth);
|
|
20
33
|
});
|
|
21
34
|
program.parseAsync(process.argv).catch(err => {
|
|
22
35
|
console.error('');
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,GAAG,GAAG,OAAO,CAAC,iBAAiB,CAAwB,CAAC;AAE9D,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,aAAa,CAAC;KACnB,WAAW,CAAC,wEAAwE,CAAC;KACrF,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,eAAe,CAAC;KACrC,MAAM,CAAC,qBAAqB,EAAE,wCAAwC,CAAC;KACvE,MAAM,CAAC,iBAAiB,EAAE,mBAAmB,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC;KAC7D,MAAM,CAAC,KAAK,EAAC,IAAI,EAAC,EAAE;IACnB,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAChB,OAAO,CAAC,KAAK,CAAC
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAiB,MAAM,eAAe,CAAC;AAC1D,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,GAAG,GAAG,OAAO,CAAC,iBAAiB,CAAwB,CAAC;AAE9D,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,aAAa,CAAC;KACnB,WAAW,CAAC,wEAAwE,CAAC;KACrF,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,eAAe,CAAC;KACrC,MAAM,CAAC,qBAAqB,EAAE,wCAAwC,CAAC;KACvE,MAAM,CAAC,qBAAqB,EAAE,qEAAqE,CAAC;KACpG,MAAM,CAAC,iBAAiB,EAAE,mBAAmB,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC;KAC7D,MAAM,CAAC,eAAe,EAAE,sCAAsC,EAAE,MAAM,CAAC;KACvE,MAAM,CAAC,KAAK,EAAC,IAAI,EAAC,EAAE;IACnB,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAgB,CAAC,EAAE,CAAC;QAChD,OAAO,CAAC,KAAK,CAAC,0BAA0B,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QACrD,OAAO,CAAC,KAAK,CAAC,mDAAmD,CAAC,CAAC;QACnE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAChB,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,IAAgB,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QACzE,OAAO;IACT,CAAC;IACD,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAChB,OAAO,CAAC,KAAK,CAAC,6EAA6E,CAAC,CAAC;QAC7F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,IAAgB,CAAC,CAAC;AACjD,CAAC,CAAC,CAAC;AAEL,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE;IAC3C,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAClB,OAAO,CAAC,KAAK,CAAC,KAAM,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;IAC7C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
package/dist/commands/clear.d.ts
CHANGED
|
@@ -1,2 +1,3 @@
|
|
|
1
1
|
import type { SlashCommandResult } from './index.js';
|
|
2
|
-
|
|
2
|
+
import type { ReplContext } from '../repl.js';
|
|
3
|
+
export declare function clearCommand(_args: string[], ctx: ReplContext): Promise<SlashCommandResult>;
|
package/dist/commands/clear.js
CHANGED
|
@@ -1,6 +1,14 @@
|
|
|
1
1
|
import { dim } from '../lib/colors.js';
|
|
2
|
-
|
|
3
|
-
|
|
2
|
+
import { getSession } from '../lib/sessionStore.js';
|
|
3
|
+
export async function clearCommand(_args, ctx) {
|
|
4
|
+
const uuid = ctx.currentUuid();
|
|
5
|
+
const prev = uuid ? getSession(uuid) : undefined;
|
|
6
|
+
if (prev) {
|
|
7
|
+
console.log(dim(`\n(conversation reset — "${prev.name}" is still available via /resume)\n`));
|
|
8
|
+
}
|
|
9
|
+
else {
|
|
10
|
+
console.log(dim('\n(conversation reset — agent will start fresh on the next prompt)\n'));
|
|
11
|
+
}
|
|
4
12
|
return { kind: 'clear' };
|
|
5
13
|
}
|
|
6
14
|
//# sourceMappingURL=clear.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"clear.js","sourceRoot":"","sources":["../../src/commands/clear.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"clear.js","sourceRoot":"","sources":["../../src/commands/clear.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAIpD,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,KAAe,EAAE,GAAgB;IAClE,MAAM,IAAI,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC;IAC/B,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACjD,IAAI,IAAI,EAAE,CAAC;QACT,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,4BAA4B,IAAI,CAAC,IAAI,qCAAqC,CAAC,CAAC,CAAC;IAC/F,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,sEAAsE,CAAC,CAAC,CAAC;IAC3F,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;AAC3B,CAAC"}
|
package/dist/commands/help.js
CHANGED
|
@@ -12,8 +12,8 @@ export async function helpCommand() {
|
|
|
12
12
|
` ${accent('/publish <article-path>')} ${dim('Publish one article to Document360')}`,
|
|
13
13
|
` ${accent('/audit')} ${dim('Diff code vs existing docs, flag gaps')}`,
|
|
14
14
|
` ${accent('/screenshot <id>')} ${dim('Emit a document360-capture-compatible spec')}`,
|
|
15
|
-
` ${accent('/
|
|
16
|
-
` ${accent('/
|
|
15
|
+
` ${accent('/resume [name]')} ${dim('Resume a session (no arg: searchable picker)')}`,
|
|
16
|
+
` ${accent('/rename <name>')} ${dim('Name the current session')}`,
|
|
17
17
|
` ${accent('/clear')} ${dim('Reset conversation')}`,
|
|
18
18
|
` ${accent('/exit')} ${dim('Quit')}`,
|
|
19
19
|
'',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"help.js","sourceRoot":"","sources":["../../src/commands/help.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AAGrD,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,MAAM,KAAK,GAAG;QACZ,EAAE;QACF,IAAI,CAAC,qCAAqC,CAAC;QAC3C,EAAE;QACF,KAAK,MAAM,CAAC,OAAO,CAAC,iCAAiC,GAAG,CAAC,gBAAgB,CAAC,EAAE;QAC5E,KAAK,MAAM,CAAC,OAAO,CAAC,iCAAiC,GAAG,CAAC,yCAAyC,CAAC,EAAE;QACrG,KAAK,MAAM,CAAC,8BAA8B,CAAC,UAAU,GAAG,CAAC,yCAAyC,CAAC,EAAE;QACrG,KAAK,MAAM,CAAC,WAAW,CAAC,6BAA6B,GAAG,CAAC,6BAA6B,CAAC,EAAE;QACzF,KAAK,MAAM,CAAC,oBAAoB,CAAC,oBAAoB,GAAG,CAAC,0BAA0B,CAAC,EAAE;QACtF,KAAK,MAAM,CAAC,yBAAyB,CAAC,eAAe,GAAG,CAAC,oCAAoC,CAAC,EAAE;QAChG,KAAK,MAAM,CAAC,QAAQ,CAAC,gCAAgC,GAAG,CAAC,uCAAuC,CAAC,EAAE;QACnG,KAAK,MAAM,CAAC,kBAAkB,CAAC,sBAAsB,GAAG,CAAC,4CAA4C,CAAC,EAAE;QACxG,KAAK,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"help.js","sourceRoot":"","sources":["../../src/commands/help.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AAGrD,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,MAAM,KAAK,GAAG;QACZ,EAAE;QACF,IAAI,CAAC,qCAAqC,CAAC;QAC3C,EAAE;QACF,KAAK,MAAM,CAAC,OAAO,CAAC,iCAAiC,GAAG,CAAC,gBAAgB,CAAC,EAAE;QAC5E,KAAK,MAAM,CAAC,OAAO,CAAC,iCAAiC,GAAG,CAAC,yCAAyC,CAAC,EAAE;QACrG,KAAK,MAAM,CAAC,8BAA8B,CAAC,UAAU,GAAG,CAAC,yCAAyC,CAAC,EAAE;QACrG,KAAK,MAAM,CAAC,WAAW,CAAC,6BAA6B,GAAG,CAAC,6BAA6B,CAAC,EAAE;QACzF,KAAK,MAAM,CAAC,oBAAoB,CAAC,oBAAoB,GAAG,CAAC,0BAA0B,CAAC,EAAE;QACtF,KAAK,MAAM,CAAC,yBAAyB,CAAC,eAAe,GAAG,CAAC,oCAAoC,CAAC,EAAE;QAChG,KAAK,MAAM,CAAC,QAAQ,CAAC,gCAAgC,GAAG,CAAC,uCAAuC,CAAC,EAAE;QACnG,KAAK,MAAM,CAAC,kBAAkB,CAAC,sBAAsB,GAAG,CAAC,4CAA4C,CAAC,EAAE;QACxG,KAAK,MAAM,CAAC,gBAAgB,CAAC,wBAAwB,GAAG,CAAC,8CAA8C,CAAC,EAAE;QAC1G,KAAK,MAAM,CAAC,gBAAgB,CAAC,wBAAwB,GAAG,CAAC,0BAA0B,CAAC,EAAE;QACtF,KAAK,MAAM,CAAC,QAAQ,CAAC,gCAAgC,GAAG,CAAC,oBAAoB,CAAC,EAAE;QAChF,KAAK,MAAM,CAAC,OAAO,CAAC,iCAAiC,GAAG,CAAC,MAAM,CAAC,EAAE;QAClE,EAAE;QACF,GAAG,CAAC,oDAAoD,CAAC;QACzD,EAAE;KACH,CAAC;IACF,KAAK,MAAM,CAAC,IAAI,KAAK;QAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACtC,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;AAC9B,CAAC"}
|
package/dist/commands/index.d.ts
CHANGED
package/dist/commands/index.js
CHANGED
|
@@ -5,8 +5,8 @@ import { initCommand } from './init.js';
|
|
|
5
5
|
import { mcpCommand } from './mcp.js';
|
|
6
6
|
import { publishCommand } from './publish.js';
|
|
7
7
|
import { auditCommand } from './audit.js';
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
8
|
+
import { resumeCommand } from './resume.js';
|
|
9
|
+
import { renameCommand } from './rename.js';
|
|
10
10
|
import { screenshotCommand } from './screenshot.js';
|
|
11
11
|
export const slashCommands = {
|
|
12
12
|
help: helpCommand,
|
|
@@ -18,8 +18,8 @@ export const slashCommands = {
|
|
|
18
18
|
mcp: mcpCommand,
|
|
19
19
|
publish: publishCommand,
|
|
20
20
|
audit: auditCommand,
|
|
21
|
-
|
|
22
|
-
|
|
21
|
+
resume: resumeCommand,
|
|
22
|
+
rename: renameCommand,
|
|
23
23
|
screenshot: screenshotCommand,
|
|
24
24
|
};
|
|
25
25
|
export function isSlashCommand(line) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAYpD,MAAM,CAAC,MAAM,aAAa,GAAiC;IACzD,IAAI,EAAE,WAAW;IACjB,GAAG,EAAE,WAAW;IAChB,KAAK,EAAE,YAAY;IACnB,IAAI,EAAE,WAAW;IACjB,IAAI,EAAE,WAAW;IACjB,IAAI,EAAE,WAAW;IACjB,GAAG,EAAE,UAAU;IACf,OAAO,EAAE,cAAc;IACvB,KAAK,EAAE,YAAY;IACnB,MAAM,EAAE,aAAa;IACrB,MAAM,EAAE,aAAa;IACrB,UAAU,EAAE,iBAAiB;CAC9B,CAAC;AAEF,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,IAAY;IACrC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAC5B,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAC1C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC5C,MAAM,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IAC5C,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IACvB,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;AACxC,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { error, ok } from '../lib/colors.js';
|
|
2
|
+
import { renameSession } from '../lib/sessionStore.js';
|
|
3
|
+
export async function renameCommand(args, ctx) {
|
|
4
|
+
const name = args.join(' ').trim();
|
|
5
|
+
if (!name) {
|
|
6
|
+
console.log(error('Usage: /rename <new name>'));
|
|
7
|
+
return { kind: 'continue' };
|
|
8
|
+
}
|
|
9
|
+
const uuid = ctx.currentUuid();
|
|
10
|
+
if (!uuid) {
|
|
11
|
+
console.log(error('Nothing to rename yet — send a message first; sessions auto-save once the agent replies.'));
|
|
12
|
+
return { kind: 'continue' };
|
|
13
|
+
}
|
|
14
|
+
if (renameSession(uuid, name)) {
|
|
15
|
+
console.log(ok(`✓ Session renamed to "${name}"`));
|
|
16
|
+
}
|
|
17
|
+
else {
|
|
18
|
+
console.log(error('Could not find the current session record.'));
|
|
19
|
+
}
|
|
20
|
+
return { kind: 'continue' };
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=rename.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rename.js","sourceRoot":"","sources":["../../src/commands/rename.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAIvD,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,IAAc,EAAE,GAAgB;IAClE,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IACnC,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC,CAAC;QAChD,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;IAC9B,CAAC;IACD,MAAM,IAAI,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC;IAC/B,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,0FAA0F,CAAC,CAAC,CAAC;QAC/G,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;IAC9B,CAAC;IACD,IAAI,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC;QAC9B,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,yBAAyB,IAAI,GAAG,CAAC,CAAC,CAAC;IACpD,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,4CAA4C,CAAC,CAAC,CAAC;IACnE,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;AAC9B,CAAC"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { search } from '@inquirer/prompts';
|
|
2
|
+
import { accent, dim, error } from '../lib/colors.js';
|
|
3
|
+
import { findByName, getSession, listSessions, relativeTime } from '../lib/sessionStore.js';
|
|
4
|
+
export async function resumeCommand(args, ctx) {
|
|
5
|
+
const sessions = listSessions(ctx.cwd).filter(s => s.uuid !== ctx.currentUuid());
|
|
6
|
+
if (sessions.length === 0) {
|
|
7
|
+
console.log(dim('No saved sessions for this repo yet — sessions auto-save as you work.'));
|
|
8
|
+
return { kind: 'continue' };
|
|
9
|
+
}
|
|
10
|
+
if (args.length > 0) {
|
|
11
|
+
const name = args.join(' ');
|
|
12
|
+
const rec = findByName(ctx.cwd, name);
|
|
13
|
+
if (!rec) {
|
|
14
|
+
console.log(error(`No session matches "${name}".`));
|
|
15
|
+
printList(sessions);
|
|
16
|
+
return { kind: 'continue' };
|
|
17
|
+
}
|
|
18
|
+
return { kind: 'resume', uuid: rec.uuid, name: rec.name };
|
|
19
|
+
}
|
|
20
|
+
if (!process.stdin.isTTY) {
|
|
21
|
+
printList(sessions);
|
|
22
|
+
console.log(dim('Run: /resume <name>'));
|
|
23
|
+
return { kind: 'continue' };
|
|
24
|
+
}
|
|
25
|
+
try {
|
|
26
|
+
const uuid = await ctx.withPausedInput(() => search({
|
|
27
|
+
message: 'Resume session (type to filter, ↑↓ to navigate):',
|
|
28
|
+
source: async (input) => {
|
|
29
|
+
const f = (input ?? '').toLowerCase();
|
|
30
|
+
return sessions
|
|
31
|
+
.filter(s => !f || s.name.toLowerCase().includes(f) || s.firstPrompt.toLowerCase().includes(f))
|
|
32
|
+
.map(s => ({
|
|
33
|
+
name: `${s.name} ${relativeTime(s.updatedAt)}`,
|
|
34
|
+
value: s.uuid,
|
|
35
|
+
description: s.firstPrompt.slice(0, 100),
|
|
36
|
+
}));
|
|
37
|
+
},
|
|
38
|
+
}));
|
|
39
|
+
const rec = getSession(uuid);
|
|
40
|
+
if (!rec)
|
|
41
|
+
return { kind: 'continue' };
|
|
42
|
+
return { kind: 'resume', uuid: rec.uuid, name: rec.name };
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
// Ctrl+C / escape inside the picker — back to the REPL.
|
|
46
|
+
console.log('');
|
|
47
|
+
return { kind: 'continue' };
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
function printList(sessions) {
|
|
51
|
+
console.log('');
|
|
52
|
+
for (const s of sessions.slice(0, 15)) {
|
|
53
|
+
console.log(` ${accent(s.name)} ${dim(relativeTime(s.updatedAt))}`);
|
|
54
|
+
console.log(` ${dim(s.firstPrompt.slice(0, 80))}`);
|
|
55
|
+
}
|
|
56
|
+
console.log('');
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=resume.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resume.js","sourceRoot":"","sources":["../../src/commands/resume.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export type AuthMode = 'auto' | 'api' | 'subscription';
|
|
2
|
+
export declare const AUTH_MODES: readonly AuthMode[];
|
|
3
|
+
export type ResolvedAuth = {
|
|
4
|
+
kind: 'api';
|
|
5
|
+
}
|
|
6
|
+
/** stored=false means no credentials file/token was found, but the engine may
|
|
7
|
+
still authenticate (macOS stores Claude Code logins in the Keychain). */
|
|
8
|
+
| {
|
|
9
|
+
kind: 'subscription';
|
|
10
|
+
stored: boolean;
|
|
11
|
+
} | {
|
|
12
|
+
kind: 'none';
|
|
13
|
+
};
|
|
14
|
+
export declare function resolveAuth(mode: AuthMode): ResolvedAuth;
|
package/dist/lib/auth.js
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { existsSync } from 'node:fs';
|
|
2
|
+
import { homedir } from 'node:os';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
export const AUTH_MODES = ['auto', 'api', 'subscription'];
|
|
5
|
+
function hasStoredLogin() {
|
|
6
|
+
if (process.env.CLAUDE_CODE_OAUTH_TOKEN)
|
|
7
|
+
return true;
|
|
8
|
+
return existsSync(join(homedir(), '.claude', '.credentials.json'));
|
|
9
|
+
}
|
|
10
|
+
export function resolveAuth(mode) {
|
|
11
|
+
const hasKey = Boolean(process.env.ANTHROPIC_API_KEY);
|
|
12
|
+
if (mode === 'api') {
|
|
13
|
+
return hasKey ? { kind: 'api' } : { kind: 'none' };
|
|
14
|
+
}
|
|
15
|
+
if (mode === 'subscription') {
|
|
16
|
+
// The SDK-spawned engine inherits our env; drop the key so it can't win.
|
|
17
|
+
delete process.env.ANTHROPIC_API_KEY;
|
|
18
|
+
return { kind: 'subscription', stored: hasStoredLogin() };
|
|
19
|
+
}
|
|
20
|
+
// auto
|
|
21
|
+
if (hasKey)
|
|
22
|
+
return { kind: 'api' };
|
|
23
|
+
return { kind: 'subscription', stored: hasStoredLogin() };
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/lib/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAIjC,MAAM,CAAC,MAAM,UAAU,GAAwB,CAAC,MAAM,EAAE,KAAK,EAAE,cAAc,CAAC,CAAC;AAS/E,SAAS,cAAc;IACrB,IAAI,OAAO,CAAC,GAAG,CAAC,uBAAuB;QAAE,OAAO,IAAI,CAAC;IACrD,OAAO,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,mBAAmB,CAAC,CAAC,CAAC;AACrE,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,IAAc;IACxC,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;IAEtD,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;QACnB,OAAO,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IACrD,CAAC;IAED,IAAI,IAAI,KAAK,cAAc,EAAE,CAAC;QAC5B,yEAAyE;QACzE,OAAO,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;QACrC,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,cAAc,EAAE,EAAE,CAAC;IAC5D,CAAC;IAED,OAAO;IACP,IAAI,MAAM;QAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;IACnC,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,cAAc,EAAE,EAAE,CAAC;AAC5D,CAAC"}
|
package/dist/lib/paths.d.ts
CHANGED
|
@@ -3,8 +3,7 @@ export declare function packageSkillsDir(): string;
|
|
|
3
3
|
export declare function userDir(): string;
|
|
4
4
|
export declare function userConfigPath(): string;
|
|
5
5
|
export declare function userMcpConfigPath(): string;
|
|
6
|
-
export declare function
|
|
7
|
-
export declare function sessionPath(name: string): string;
|
|
6
|
+
export declare function sessionsFilePath(): string;
|
|
8
7
|
export declare function projectConfigPath(cwd?: string): string;
|
|
9
8
|
export declare function projectSkillsDir(cwd?: string): string;
|
|
10
9
|
export declare function ensureDir(path: string): void;
|
package/dist/lib/paths.js
CHANGED
|
@@ -19,11 +19,8 @@ export function userConfigPath() {
|
|
|
19
19
|
export function userMcpConfigPath() {
|
|
20
20
|
return join(userDir(), 'mcp.json');
|
|
21
21
|
}
|
|
22
|
-
export function
|
|
23
|
-
return join(userDir(), 'sessions');
|
|
24
|
-
}
|
|
25
|
-
export function sessionPath(name) {
|
|
26
|
-
return join(sessionsDir(), `${name}.jsonl`);
|
|
22
|
+
export function sessionsFilePath() {
|
|
23
|
+
return join(userDir(), 'sessions.json');
|
|
27
24
|
}
|
|
28
25
|
export function projectConfigPath(cwd = process.cwd()) {
|
|
29
26
|
return join(cwd, '.d360-writer.json');
|
package/dist/lib/paths.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/lib/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAEhD,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AAEtC,MAAM,UAAU,WAAW;IACzB,OAAO,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,OAAO,IAAI,CAAC,WAAW,EAAE,EAAE,QAAQ,CAAC,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,OAAO;IACrB,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,qBAAqB,CAAC,CAAC;AAChD,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,aAAa,CAAC,CAAC;AACxC,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,UAAU,CAAC,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,
|
|
1
|
+
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/lib/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAEhD,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AAEtC,MAAM,UAAU,WAAW;IACzB,OAAO,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,OAAO,IAAI,CAAC,WAAW,EAAE,EAAE,QAAQ,CAAC,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,OAAO;IACrB,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,qBAAqB,CAAC,CAAC;AAChD,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,aAAa,CAAC,CAAC;AACxC,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,UAAU,CAAC,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,eAAe,CAAC,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,MAAc,OAAO,CAAC,GAAG,EAAE;IAC3D,OAAO,IAAI,CAAC,GAAG,EAAE,mBAAmB,CAAC,CAAC;AACxC,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,MAAc,OAAO,CAAC,GAAG,EAAE;IAC1D,OAAO,IAAI,CAAC,GAAG,EAAE,cAAc,EAAE,QAAQ,CAAC,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,IAAY;IACpC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,SAAS,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AAC9D,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export type SessionRecord = {
|
|
2
|
+
uuid: string;
|
|
3
|
+
name: string;
|
|
4
|
+
/** User named it via /rename — auto-titling must never overwrite. */
|
|
5
|
+
renamed: boolean;
|
|
6
|
+
/** LLM title was applied (or attempted-and-kept-slug). */
|
|
7
|
+
titled: boolean;
|
|
8
|
+
cwd: string;
|
|
9
|
+
firstPrompt: string;
|
|
10
|
+
createdAt: string;
|
|
11
|
+
updatedAt: string;
|
|
12
|
+
};
|
|
13
|
+
export declare function loadSessions(): SessionRecord[];
|
|
14
|
+
export declare function upsertSession(rec: SessionRecord): void;
|
|
15
|
+
export declare function getSession(uuid: string): SessionRecord | undefined;
|
|
16
|
+
export declare function listSessions(cwd: string): SessionRecord[];
|
|
17
|
+
/** Exact name match first, then unique name-prefix, then unique uuid-prefix. */
|
|
18
|
+
export declare function findByName(cwd: string, name: string): SessionRecord | undefined;
|
|
19
|
+
export declare function touchSession(uuid: string): void;
|
|
20
|
+
export declare function renameSession(uuid: string, name: string): boolean;
|
|
21
|
+
/** Apply an auto-generated title. No-op if the user already renamed the session. */
|
|
22
|
+
export declare function setTitle(uuid: string, title: string): void;
|
|
23
|
+
export declare function slugify(text: string, maxWords?: number): string;
|
|
24
|
+
export declare function relativeTime(iso: string): string;
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { existsSync, readFileSync, writeFileSync } from 'node:fs';
|
|
2
|
+
import { sessionsFilePath, userDir, ensureDir } from './paths.js';
|
|
3
|
+
const MAX_RECORDS = 100;
|
|
4
|
+
export function loadSessions() {
|
|
5
|
+
const path = sessionsFilePath();
|
|
6
|
+
if (!existsSync(path))
|
|
7
|
+
return [];
|
|
8
|
+
try {
|
|
9
|
+
const parsed = JSON.parse(readFileSync(path, 'utf8'));
|
|
10
|
+
return Array.isArray(parsed) ? parsed : [];
|
|
11
|
+
}
|
|
12
|
+
catch {
|
|
13
|
+
return [];
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
function saveSessions(records) {
|
|
17
|
+
ensureDir(userDir());
|
|
18
|
+
const sorted = [...records].sort((a, b) => b.updatedAt.localeCompare(a.updatedAt)).slice(0, MAX_RECORDS);
|
|
19
|
+
writeFileSync(sessionsFilePath(), JSON.stringify(sorted, null, 2));
|
|
20
|
+
}
|
|
21
|
+
export function upsertSession(rec) {
|
|
22
|
+
const records = loadSessions().filter(r => r.uuid !== rec.uuid);
|
|
23
|
+
records.push(rec);
|
|
24
|
+
saveSessions(records);
|
|
25
|
+
}
|
|
26
|
+
export function getSession(uuid) {
|
|
27
|
+
return loadSessions().find(r => r.uuid === uuid);
|
|
28
|
+
}
|
|
29
|
+
export function listSessions(cwd) {
|
|
30
|
+
return loadSessions()
|
|
31
|
+
.filter(r => r.cwd === cwd)
|
|
32
|
+
.sort((a, b) => b.updatedAt.localeCompare(a.updatedAt));
|
|
33
|
+
}
|
|
34
|
+
/** Exact name match first, then unique name-prefix, then unique uuid-prefix. */
|
|
35
|
+
export function findByName(cwd, name) {
|
|
36
|
+
const sessions = listSessions(cwd);
|
|
37
|
+
const lower = name.toLowerCase();
|
|
38
|
+
const exact = sessions.find(r => r.name.toLowerCase() === lower);
|
|
39
|
+
if (exact)
|
|
40
|
+
return exact;
|
|
41
|
+
const prefix = sessions.filter(r => r.name.toLowerCase().startsWith(lower));
|
|
42
|
+
if (prefix.length === 1)
|
|
43
|
+
return prefix[0];
|
|
44
|
+
const byUuid = sessions.filter(r => r.uuid.startsWith(name));
|
|
45
|
+
if (byUuid.length === 1)
|
|
46
|
+
return byUuid[0];
|
|
47
|
+
return undefined;
|
|
48
|
+
}
|
|
49
|
+
export function touchSession(uuid) {
|
|
50
|
+
const records = loadSessions();
|
|
51
|
+
const rec = records.find(r => r.uuid === uuid);
|
|
52
|
+
if (!rec)
|
|
53
|
+
return;
|
|
54
|
+
rec.updatedAt = new Date().toISOString();
|
|
55
|
+
saveSessions(records);
|
|
56
|
+
}
|
|
57
|
+
export function renameSession(uuid, name) {
|
|
58
|
+
const records = loadSessions();
|
|
59
|
+
const rec = records.find(r => r.uuid === uuid);
|
|
60
|
+
if (!rec)
|
|
61
|
+
return false;
|
|
62
|
+
rec.name = name;
|
|
63
|
+
rec.renamed = true;
|
|
64
|
+
rec.updatedAt = new Date().toISOString();
|
|
65
|
+
saveSessions(records);
|
|
66
|
+
return true;
|
|
67
|
+
}
|
|
68
|
+
/** Apply an auto-generated title. No-op if the user already renamed the session. */
|
|
69
|
+
export function setTitle(uuid, title) {
|
|
70
|
+
const records = loadSessions();
|
|
71
|
+
const rec = records.find(r => r.uuid === uuid);
|
|
72
|
+
if (!rec || rec.renamed)
|
|
73
|
+
return;
|
|
74
|
+
rec.name = title;
|
|
75
|
+
rec.titled = true;
|
|
76
|
+
saveSessions(records);
|
|
77
|
+
}
|
|
78
|
+
export function slugify(text, maxWords = 6) {
|
|
79
|
+
const words = text
|
|
80
|
+
.toLowerCase()
|
|
81
|
+
.replace(/[^a-z0-9\s-]/g, '')
|
|
82
|
+
.split(/\s+/)
|
|
83
|
+
.filter(Boolean)
|
|
84
|
+
.slice(0, maxWords);
|
|
85
|
+
return words.join('-') || 'session';
|
|
86
|
+
}
|
|
87
|
+
export function relativeTime(iso) {
|
|
88
|
+
const ms = Date.now() - new Date(iso).getTime();
|
|
89
|
+
const min = Math.floor(ms / 60_000);
|
|
90
|
+
if (min < 1)
|
|
91
|
+
return 'just now';
|
|
92
|
+
if (min < 60)
|
|
93
|
+
return `${min}m ago`;
|
|
94
|
+
const hr = Math.floor(min / 60);
|
|
95
|
+
if (hr < 24)
|
|
96
|
+
return `${hr}h ago`;
|
|
97
|
+
const day = Math.floor(hr / 24);
|
|
98
|
+
return `${day}d ago`;
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=sessionStore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sessionStore.js","sourceRoot":"","sources":["../../src/lib/sessionStore.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* One-shot background Haiku call to title a session, Claude Code-style.
|
|
3
|
+
* Goes through the Agent SDK (not the raw API) so it works in both API-key
|
|
4
|
+
* and subscription auth modes. Returns null on any failure — callers keep
|
|
5
|
+
* the slug fallback.
|
|
6
|
+
*/
|
|
7
|
+
export declare function generateTitle(firstPrompt: string, cwd: string): Promise<string | null>;
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { query } from '@anthropic-ai/claude-agent-sdk';
|
|
2
|
+
const TIMEOUT_MS = 60_000;
|
|
3
|
+
/**
|
|
4
|
+
* One-shot background Haiku call to title a session, Claude Code-style.
|
|
5
|
+
* Goes through the Agent SDK (not the raw API) so it works in both API-key
|
|
6
|
+
* and subscription auth modes. Returns null on any failure — callers keep
|
|
7
|
+
* the slug fallback.
|
|
8
|
+
*/
|
|
9
|
+
export async function generateTitle(firstPrompt, cwd) {
|
|
10
|
+
try {
|
|
11
|
+
const result = await Promise.race([run(firstPrompt, cwd), timeout()]);
|
|
12
|
+
return result;
|
|
13
|
+
}
|
|
14
|
+
catch {
|
|
15
|
+
return null;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
async function run(firstPrompt, cwd) {
|
|
19
|
+
const q = query({
|
|
20
|
+
prompt: [
|
|
21
|
+
'Generate a short session title for a documentation-writing session that started with this request:',
|
|
22
|
+
'',
|
|
23
|
+
firstPrompt.slice(0, 500),
|
|
24
|
+
'',
|
|
25
|
+
'Reply with ONLY the title: 3-6 words, lowercase, kebab-case, no quotes, no punctuation.',
|
|
26
|
+
].join('\n'),
|
|
27
|
+
options: {
|
|
28
|
+
cwd,
|
|
29
|
+
model: 'haiku',
|
|
30
|
+
maxTurns: 1,
|
|
31
|
+
settingSources: [],
|
|
32
|
+
systemPrompt: 'You generate terse kebab-case session titles. Output only the title, nothing else.',
|
|
33
|
+
allowedTools: [],
|
|
34
|
+
},
|
|
35
|
+
});
|
|
36
|
+
for await (const msg of q) {
|
|
37
|
+
const m = msg;
|
|
38
|
+
if (m.type === 'result') {
|
|
39
|
+
if (m.subtype === 'success' && typeof m.result === 'string') {
|
|
40
|
+
return sanitize(m.result);
|
|
41
|
+
}
|
|
42
|
+
return null;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return null;
|
|
46
|
+
}
|
|
47
|
+
function timeout() {
|
|
48
|
+
return new Promise(resolve => setTimeout(() => resolve(null), TIMEOUT_MS).unref());
|
|
49
|
+
}
|
|
50
|
+
function sanitize(raw) {
|
|
51
|
+
const title = raw
|
|
52
|
+
.trim()
|
|
53
|
+
.toLowerCase()
|
|
54
|
+
.replace(/[^a-z0-9\s-]/g, '')
|
|
55
|
+
.replace(/\s+/g, '-')
|
|
56
|
+
.replace(/-+/g, '-')
|
|
57
|
+
.replace(/^-|-$/g, '')
|
|
58
|
+
.split('-')
|
|
59
|
+
.slice(0, 8)
|
|
60
|
+
.join('-')
|
|
61
|
+
.slice(0, 60);
|
|
62
|
+
return title.length >= 3 ? title : null;
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=titleGen.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"titleGen.js","sourceRoot":"","sources":["../../src/lib/titleGen.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,gCAAgC,CAAC;AAEvD,MAAM,UAAU,GAAG,MAAM,CAAC;AAE1B;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,WAAmB,EAAE,GAAW;IAClE,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,WAAW,EAAE,GAAG,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;QACtE,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,KAAK,UAAU,GAAG,CAAC,WAAmB,EAAE,GAAW;IACjD,MAAM,CAAC,GAAG,KAAK,CAAC;QACd,MAAM,EAAE;YACN,oGAAoG;YACpG,EAAE;YACF,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;YACzB,EAAE;YACF,yFAAyF;SAC1F,CAAC,IAAI,CAAC,IAAI,CAAC;QACZ,OAAO,EAAE;YACP,GAAG;YACH,KAAK,EAAE,OAAO;YACd,QAAQ,EAAE,CAAC;YACX,cAAc,EAAE,EAAE;YAClB,YAAY,EAAE,oFAAoF;YAClG,YAAY,EAAE,EAAE;SACjB;KACF,CAAC,CAAC;IACH,IAAI,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC;QAC1B,MAAM,CAAC,GAAG,GAA2D,CAAC;QACtE,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACxB,IAAI,CAAC,CAAC,OAAO,KAAK,SAAS,IAAI,OAAO,CAAC,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;gBAC5D,OAAO,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;YAC5B,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,OAAO;IACd,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,UAAU,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;AACrF,CAAC;AAED,SAAS,QAAQ,CAAC,GAAW;IAC3B,MAAM,KAAK,GAAG,GAAG;SACd,IAAI,EAAE;SACN,WAAW,EAAE;SACb,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC;SAC5B,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;SACpB,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;SACnB,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC;SACrB,KAAK,CAAC,GAAG,CAAC;SACV,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;SACX,IAAI,CAAC,GAAG,CAAC;SACT,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAChB,OAAO,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;AAC1C,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { type AuthMode } from './lib/auth.js';
|
|
2
|
+
/**
|
|
3
|
+
* Headless one-shot mode (`d360-writer --prompt "..."`), the writer's `claude -p`.
|
|
4
|
+
* Answer text streams to STDOUT (pipeable); banner, auth notice, tool indicators,
|
|
5
|
+
* and token counts go to STDERR. Exit codes: 0 success, 1 agent error, 2 usage.
|
|
6
|
+
*/
|
|
7
|
+
export declare function runOnce(cwd: string, prompt: string, authMode: AuthMode, resumeName?: string): Promise<never>;
|
package/dist/oneShot.js
ADDED
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { startAgent } from './agent.js';
|
|
2
|
+
import { resolveAuth } from './lib/auth.js';
|
|
3
|
+
import { findByName, slugify, touchSession, upsertSession } from './lib/sessionStore.js';
|
|
4
|
+
import { accent, dim, error, muted } from './lib/colors.js';
|
|
5
|
+
/**
|
|
6
|
+
* Headless one-shot mode (`d360-writer --prompt "..."`), the writer's `claude -p`.
|
|
7
|
+
* Answer text streams to STDOUT (pipeable); banner, auth notice, tool indicators,
|
|
8
|
+
* and token counts go to STDERR. Exit codes: 0 success, 1 agent error, 2 usage.
|
|
9
|
+
*/
|
|
10
|
+
export async function runOnce(cwd, prompt, authMode, resumeName) {
|
|
11
|
+
const auth = resolveAuth(authMode);
|
|
12
|
+
if (auth.kind === 'none') {
|
|
13
|
+
console.error('');
|
|
14
|
+
console.error(error('ANTHROPIC_API_KEY is not set (required for --auth api).'));
|
|
15
|
+
console.error(`Get a key at ${accent('https://console.anthropic.com/settings/keys')}`);
|
|
16
|
+
console.error(`Or use your Claude subscription instead: ${accent('d360-writer --auth subscription')}`);
|
|
17
|
+
process.exit(2);
|
|
18
|
+
}
|
|
19
|
+
if (auth.kind === 'subscription') {
|
|
20
|
+
console.error(dim('Using your Claude subscription (no API key set).'));
|
|
21
|
+
}
|
|
22
|
+
let resumeUuid;
|
|
23
|
+
if (resumeName) {
|
|
24
|
+
const rec = findByName(cwd, resumeName);
|
|
25
|
+
if (!rec) {
|
|
26
|
+
console.error(error(`No saved session matches "${resumeName}" in this repo.`));
|
|
27
|
+
console.error(dim('List sessions inside the REPL with /resume.'));
|
|
28
|
+
process.exit(2);
|
|
29
|
+
}
|
|
30
|
+
resumeUuid = rec.uuid;
|
|
31
|
+
console.error(dim(`Resuming "${rec.name}"`));
|
|
32
|
+
}
|
|
33
|
+
const session = startAgent(cwd, resumeUuid);
|
|
34
|
+
session.queue.push(prompt);
|
|
35
|
+
session.queue.close(); // single prompt — the engine exits after its result
|
|
36
|
+
let uuid = resumeUuid ?? null;
|
|
37
|
+
let exitCode = 1;
|
|
38
|
+
while (true) {
|
|
39
|
+
let next;
|
|
40
|
+
try {
|
|
41
|
+
next = await session.iterator.next();
|
|
42
|
+
}
|
|
43
|
+
catch (err) {
|
|
44
|
+
console.error('');
|
|
45
|
+
console.error(error(`agent error: ${err.message}`));
|
|
46
|
+
process.exit(1);
|
|
47
|
+
}
|
|
48
|
+
if (next.done)
|
|
49
|
+
break;
|
|
50
|
+
const msg = next.value;
|
|
51
|
+
if (msg?.session_id && !uuid) {
|
|
52
|
+
uuid = msg.session_id;
|
|
53
|
+
const now = new Date().toISOString();
|
|
54
|
+
upsertSession({
|
|
55
|
+
uuid,
|
|
56
|
+
name: slugify(prompt),
|
|
57
|
+
renamed: false,
|
|
58
|
+
titled: false, // one-shots skip LLM titling — nothing should delay exit
|
|
59
|
+
cwd,
|
|
60
|
+
firstPrompt: prompt,
|
|
61
|
+
createdAt: now,
|
|
62
|
+
updatedAt: now,
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
if (msg.type === 'stream_event') {
|
|
66
|
+
const event = msg.event;
|
|
67
|
+
if (event?.delta && typeof event.delta.text === 'string') {
|
|
68
|
+
process.stdout.write(event.delta.text);
|
|
69
|
+
}
|
|
70
|
+
continue;
|
|
71
|
+
}
|
|
72
|
+
if (msg.type === 'assistant') {
|
|
73
|
+
const message = msg.message;
|
|
74
|
+
for (const block of message?.content ?? []) {
|
|
75
|
+
const b = block;
|
|
76
|
+
if (b.type === 'tool_use')
|
|
77
|
+
console.error(muted(` ⚙ ${b.name ?? 'tool'}`));
|
|
78
|
+
}
|
|
79
|
+
continue;
|
|
80
|
+
}
|
|
81
|
+
if (msg.type === 'result') {
|
|
82
|
+
exitCode = msg.subtype === 'success' ? 0 : 1;
|
|
83
|
+
const usage = msg.usage;
|
|
84
|
+
if (usage)
|
|
85
|
+
console.error(dim(`(${usage.input_tokens ?? 0}→${usage.output_tokens ?? 0} tokens)`));
|
|
86
|
+
if (exitCode !== 0)
|
|
87
|
+
console.error(error(`agent finished with: ${msg.subtype}`));
|
|
88
|
+
break;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
if (uuid)
|
|
92
|
+
touchSession(uuid);
|
|
93
|
+
process.stdout.write('\n');
|
|
94
|
+
process.exit(exitCode);
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=oneShot.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oneShot.js","sourceRoot":"","sources":["../src/oneShot.ts"],"names":[],"mappings":"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"}
|
package/dist/repl.d.ts
CHANGED
|
@@ -1,5 +1,10 @@
|
|
|
1
|
+
import { type AuthMode } from './lib/auth.js';
|
|
1
2
|
export type ReplContext = {
|
|
2
3
|
cwd: string;
|
|
3
4
|
restartAgent: () => void;
|
|
5
|
+
/** UUID of the live session record, once the first exchange has registered it. */
|
|
6
|
+
currentUuid: () => string | null;
|
|
7
|
+
/** Pause the REPL's readline while another stdin consumer (e.g. the /resume picker) runs. */
|
|
8
|
+
withPausedInput: <T>(fn: () => Promise<T>) => Promise<T>;
|
|
4
9
|
};
|
|
5
|
-
export declare function runRepl(cwd?: string): Promise<void>;
|
|
10
|
+
export declare function runRepl(cwd?: string, authMode?: AuthMode): Promise<void>;
|
package/dist/repl.js
CHANGED
|
@@ -1,34 +1,94 @@
|
|
|
1
1
|
import { createInterface } from 'node:readline/promises';
|
|
2
2
|
import { startAgent } from './agent.js';
|
|
3
3
|
import { slashCommands, parseSlash } from './commands/index.js';
|
|
4
|
-
import {
|
|
5
|
-
|
|
6
|
-
|
|
4
|
+
import { resolveAuth } from './lib/auth.js';
|
|
5
|
+
import { getSession, setTitle, slugify, touchSession, upsertSession } from './lib/sessionStore.js';
|
|
6
|
+
import { generateTitle } from './lib/titleGen.js';
|
|
7
|
+
import { accent, banner, dim, error, muted, ok } from './lib/colors.js';
|
|
8
|
+
export async function runRepl(cwd = process.cwd(), authMode = 'auto') {
|
|
9
|
+
const auth = resolveAuth(authMode);
|
|
10
|
+
if (auth.kind === 'none') {
|
|
7
11
|
console.error('');
|
|
8
|
-
console.error(error('ANTHROPIC_API_KEY is not set.'));
|
|
9
|
-
console.error('');
|
|
10
|
-
console.error('Set it before running document360-writer:');
|
|
12
|
+
console.error(error('ANTHROPIC_API_KEY is not set (required for --auth api).'));
|
|
11
13
|
console.error('');
|
|
12
14
|
console.error(` ${accent('export ANTHROPIC_API_KEY=sk-ant-...')} (macOS / Linux)`);
|
|
13
15
|
console.error(` ${accent('$env:ANTHROPIC_API_KEY="sk-ant-..."')} (PowerShell)`);
|
|
14
16
|
console.error('');
|
|
15
17
|
console.error(`Get a key at ${accent('https://console.anthropic.com/settings/keys')}`);
|
|
18
|
+
console.error(`Or use your Claude subscription instead: ${accent('d360-writer --auth subscription')}`);
|
|
16
19
|
console.error('');
|
|
17
20
|
process.exit(2);
|
|
18
21
|
}
|
|
19
22
|
printWelcome(cwd);
|
|
23
|
+
if (auth.kind === 'subscription') {
|
|
24
|
+
if (auth.stored) {
|
|
25
|
+
console.log(dim(' Using your Claude subscription (no API key set).'));
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
console.log(dim(' No API key or stored Claude Code login found — trying your Claude session anyway.'));
|
|
29
|
+
}
|
|
30
|
+
console.log('');
|
|
31
|
+
}
|
|
20
32
|
let session = startAgent(cwd);
|
|
33
|
+
let tracker = { uuid: null, firstPrompt: null, titleFired: false };
|
|
34
|
+
const rl = createInterface({ input: process.stdin, output: process.stdout });
|
|
35
|
+
// Buffering line reader: readline's promise API drops lines that arrive while
|
|
36
|
+
// no question is pending, which breaks piped/scripted input. Buffer every line;
|
|
37
|
+
// null = stdin closed.
|
|
38
|
+
const pendingLines = [];
|
|
39
|
+
let waiter = null;
|
|
40
|
+
let stdinClosed = false;
|
|
41
|
+
rl.on('line', l => {
|
|
42
|
+
if (waiter) {
|
|
43
|
+
const w = waiter;
|
|
44
|
+
waiter = null;
|
|
45
|
+
w(l);
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
pendingLines.push(l);
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
rl.on('close', () => {
|
|
52
|
+
stdinClosed = true;
|
|
53
|
+
if (waiter) {
|
|
54
|
+
const w = waiter;
|
|
55
|
+
waiter = null;
|
|
56
|
+
w(null);
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
function nextLine() {
|
|
60
|
+
if (pendingLines.length > 0)
|
|
61
|
+
return Promise.resolve(pendingLines.shift());
|
|
62
|
+
if (stdinClosed)
|
|
63
|
+
return Promise.resolve(null);
|
|
64
|
+
process.stdout.write(accent('> '));
|
|
65
|
+
return new Promise(resolve => {
|
|
66
|
+
waiter = resolve;
|
|
67
|
+
});
|
|
68
|
+
}
|
|
21
69
|
const ctx = {
|
|
22
70
|
cwd,
|
|
23
71
|
restartAgent: () => {
|
|
24
72
|
session.queue.close();
|
|
25
73
|
session = startAgent(cwd);
|
|
74
|
+
tracker = { uuid: null, firstPrompt: null, titleFired: false };
|
|
75
|
+
},
|
|
76
|
+
currentUuid: () => tracker.uuid,
|
|
77
|
+
withPausedInput: async (fn) => {
|
|
78
|
+
rl.pause();
|
|
79
|
+
try {
|
|
80
|
+
return await fn();
|
|
81
|
+
}
|
|
82
|
+
finally {
|
|
83
|
+
rl.resume();
|
|
84
|
+
}
|
|
26
85
|
},
|
|
27
86
|
};
|
|
28
|
-
const rl = createInterface({ input: process.stdin, output: process.stdout });
|
|
29
87
|
try {
|
|
30
88
|
while (true) {
|
|
31
|
-
const line = await
|
|
89
|
+
const line = await nextLine();
|
|
90
|
+
if (line === null)
|
|
91
|
+
break; // stdin closed (Ctrl+D or piped input exhausted)
|
|
32
92
|
const trimmed = line.trim();
|
|
33
93
|
if (!trimmed)
|
|
34
94
|
continue;
|
|
@@ -49,14 +109,28 @@ export async function runRepl(cwd = process.cwd()) {
|
|
|
49
109
|
ctx.restartAgent();
|
|
50
110
|
continue;
|
|
51
111
|
}
|
|
112
|
+
if (result.kind === 'resume') {
|
|
113
|
+
session.queue.close();
|
|
114
|
+
session = startAgent(cwd, result.uuid);
|
|
115
|
+
const rec = getSession(result.uuid);
|
|
116
|
+
tracker = { uuid: result.uuid, firstPrompt: rec?.firstPrompt ?? null, titleFired: true };
|
|
117
|
+
touchSession(result.uuid);
|
|
118
|
+
console.log(ok(`✓ Resumed "${result.name}"`));
|
|
119
|
+
console.log('');
|
|
120
|
+
continue;
|
|
121
|
+
}
|
|
52
122
|
if (result.kind === 'forward-to-agent') {
|
|
123
|
+
if (!tracker.firstPrompt)
|
|
124
|
+
tracker.firstPrompt = result.prompt;
|
|
53
125
|
session.queue.push(result.prompt);
|
|
54
|
-
await consumeUntilResult(session.iterator);
|
|
126
|
+
await consumeUntilResult(session.iterator, auth, tracker, cwd);
|
|
55
127
|
}
|
|
56
128
|
continue;
|
|
57
129
|
}
|
|
130
|
+
if (!tracker.firstPrompt)
|
|
131
|
+
tracker.firstPrompt = trimmed;
|
|
58
132
|
session.queue.push(trimmed);
|
|
59
|
-
await consumeUntilResult(session.iterator);
|
|
133
|
+
await consumeUntilResult(session.iterator, auth, tracker, cwd);
|
|
60
134
|
}
|
|
61
135
|
}
|
|
62
136
|
finally {
|
|
@@ -71,7 +145,43 @@ function printWelcome(cwd) {
|
|
|
71
145
|
console.log(dim(' Type a prompt, or /help for slash commands. /exit to quit.'));
|
|
72
146
|
console.log('');
|
|
73
147
|
}
|
|
74
|
-
|
|
148
|
+
const AUTH_ERROR_PATTERN = /auth|api key|login|credential|401|forbidden/i;
|
|
149
|
+
function printSignInHelp() {
|
|
150
|
+
console.error('');
|
|
151
|
+
console.error(`Sign in with your Claude subscription: run ${accent('claude')} once, then retry.`);
|
|
152
|
+
console.error(` (No Claude Code? ${accent('npm install -g @anthropic-ai/claude-code')})`);
|
|
153
|
+
console.error(`Or set an API key: ${accent('https://console.anthropic.com/settings/keys')}`);
|
|
154
|
+
}
|
|
155
|
+
/** Register the session record the first time the engine reveals its session UUID. */
|
|
156
|
+
function registerSession(tracker, sessionId, cwd) {
|
|
157
|
+
tracker.uuid = sessionId;
|
|
158
|
+
const now = new Date().toISOString();
|
|
159
|
+
upsertSession({
|
|
160
|
+
uuid: sessionId,
|
|
161
|
+
name: slugify(tracker.firstPrompt ?? 'session'),
|
|
162
|
+
renamed: false,
|
|
163
|
+
titled: false,
|
|
164
|
+
cwd,
|
|
165
|
+
firstPrompt: tracker.firstPrompt ?? '',
|
|
166
|
+
createdAt: now,
|
|
167
|
+
updatedAt: now,
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
/** Fire-and-forget Claude Code-style title generation after the first exchange. */
|
|
171
|
+
function fireTitleGeneration(tracker, cwd) {
|
|
172
|
+
tracker.titleFired = true;
|
|
173
|
+
const uuid = tracker.uuid;
|
|
174
|
+
const firstPrompt = tracker.firstPrompt;
|
|
175
|
+
if (!uuid || !firstPrompt)
|
|
176
|
+
return;
|
|
177
|
+
void generateTitle(firstPrompt, cwd)
|
|
178
|
+
.then(title => {
|
|
179
|
+
if (title)
|
|
180
|
+
setTitle(uuid, title);
|
|
181
|
+
})
|
|
182
|
+
.catch(() => { });
|
|
183
|
+
}
|
|
184
|
+
async function consumeUntilResult(iterator, auth, tracker, cwd) {
|
|
75
185
|
while (true) {
|
|
76
186
|
let next;
|
|
77
187
|
try {
|
|
@@ -80,20 +190,32 @@ async function consumeUntilResult(iterator) {
|
|
|
80
190
|
catch (err) {
|
|
81
191
|
console.error('');
|
|
82
192
|
console.error(error(`agent error: ${err.message}`));
|
|
193
|
+
if (auth.kind === 'subscription' && AUTH_ERROR_PATTERN.test(err.message)) {
|
|
194
|
+
printSignInHelp();
|
|
195
|
+
}
|
|
83
196
|
return;
|
|
84
197
|
}
|
|
85
198
|
if (next.done)
|
|
86
199
|
return;
|
|
200
|
+
const sessionId = next.value?.session_id;
|
|
201
|
+
if (sessionId && !tracker.uuid)
|
|
202
|
+
registerSession(tracker, sessionId, cwd);
|
|
87
203
|
const stop = renderMessage(next.value);
|
|
88
|
-
if (stop)
|
|
204
|
+
if (stop) {
|
|
205
|
+
if (tracker.uuid) {
|
|
206
|
+
touchSession(tracker.uuid);
|
|
207
|
+
if (!tracker.titleFired)
|
|
208
|
+
fireTitleGeneration(tracker, cwd);
|
|
209
|
+
}
|
|
89
210
|
return;
|
|
211
|
+
}
|
|
90
212
|
}
|
|
91
213
|
}
|
|
92
214
|
function renderMessage(raw) {
|
|
93
215
|
if (!raw || typeof raw !== 'object')
|
|
94
216
|
return false;
|
|
95
217
|
const msg = raw;
|
|
96
|
-
if (msg.type === '
|
|
218
|
+
if (msg.type === 'stream_event') {
|
|
97
219
|
const event = msg.event;
|
|
98
220
|
if (event?.delta && typeof event.delta.text === 'string') {
|
|
99
221
|
process.stdout.write(event.delta.text);
|
package/dist/repl.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"repl.js","sourceRoot":"","sources":["../src/repl.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,UAAU,EAAqB,MAAM,YAAY,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"repl.js","sourceRoot":"","sources":["../src/repl.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -35,6 +35,8 @@
|
|
|
35
35
|
|
|
36
36
|
## Screenshot placeholders
|
|
37
37
|
|
|
38
|
+
**Screenshots apply only to browser-reachable UIs.** If the product has none (CLI, console app, library, API-only service), emit NO screenshot placeholders and do not invoke `emit-screenshot-spec` — show behavior as fenced code blocks instead: the exact command, then its real terminal output (run it or quote it from source/tests; never invent output). Never fabricate a UI to screenshot.
|
|
39
|
+
|
|
38
40
|
When the article describes a UI flow that benefits from a visual, embed one or more screenshot placeholders. Each placeholder is two parts:
|
|
39
41
|
|
|
40
42
|
1. An HTML comment block with capture instructions (stripped before D360 publish).
|
package/dist/commands/load.d.ts
DELETED
package/dist/commands/load.js
DELETED
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import { error, warn, dim } from '../lib/colors.js';
|
|
2
|
-
import { existsSync } from 'node:fs';
|
|
3
|
-
import { sessionPath } from '../lib/paths.js';
|
|
4
|
-
export async function loadCommand(args) {
|
|
5
|
-
const name = args[0];
|
|
6
|
-
if (!name) {
|
|
7
|
-
console.log(error('Usage: /load <name>'));
|
|
8
|
-
return { kind: 'continue' };
|
|
9
|
-
}
|
|
10
|
-
const path = sessionPath(name);
|
|
11
|
-
if (!existsSync(path)) {
|
|
12
|
-
console.log(error(`No saved session at ${path}`));
|
|
13
|
-
return { kind: 'continue' };
|
|
14
|
-
}
|
|
15
|
-
console.log(warn(`/load is a v1.1 capability — the Agent SDK's resume flow requires a session UUID, which v1 does not capture yet.`));
|
|
16
|
-
console.log(dim(`Saved transcript at: ${path}`));
|
|
17
|
-
console.log(dim('Open it manually to inspect the conversation history.'));
|
|
18
|
-
return { kind: 'continue' };
|
|
19
|
-
}
|
|
20
|
-
//# sourceMappingURL=load.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"load.js","sourceRoot":"","sources":["../../src/commands/load.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAG9C,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAAc;IAC9C,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACrB,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC,CAAC;QAC1C,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;IAC9B,CAAC;IACD,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;IAC/B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACtB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,uBAAuB,IAAI,EAAE,CAAC,CAAC,CAAC;QAClD,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;IAC9B,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,kHAAkH,CAAC,CAAC,CAAC;IACtI,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,wBAAwB,IAAI,EAAE,CAAC,CAAC,CAAC;IACjD,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,uDAAuD,CAAC,CAAC,CAAC;IAC1E,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;AAC9B,CAAC"}
|
package/dist/commands/save.d.ts
DELETED
package/dist/commands/save.js
DELETED
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
import { error, ok, warn } from '../lib/colors.js';
|
|
2
|
-
import { sessionPath, sessionsDir, ensureDir } from '../lib/paths.js';
|
|
3
|
-
import { existsSync, copyFileSync } from 'node:fs';
|
|
4
|
-
export async function saveCommand(args) {
|
|
5
|
-
const name = args[0];
|
|
6
|
-
if (!name) {
|
|
7
|
-
console.log(error('Usage: /save <name>'));
|
|
8
|
-
return { kind: 'continue' };
|
|
9
|
-
}
|
|
10
|
-
ensureDir(sessionsDir());
|
|
11
|
-
const dest = sessionPath(name);
|
|
12
|
-
const transcript = locateActiveTranscript();
|
|
13
|
-
if (!transcript) {
|
|
14
|
-
console.log(warn('No active session transcript was found to copy.'));
|
|
15
|
-
console.log(warn('The Agent SDK is configured with settingSources: [] for SDK isolation, so transcripts are not persisted automatically in this build.'));
|
|
16
|
-
console.log(warn(`Manual save target: ${dest}`));
|
|
17
|
-
return { kind: 'continue' };
|
|
18
|
-
}
|
|
19
|
-
copyFileSync(transcript, dest);
|
|
20
|
-
console.log(ok(`✓ Saved session to ${dest}`));
|
|
21
|
-
return { kind: 'continue' };
|
|
22
|
-
}
|
|
23
|
-
function locateActiveTranscript() {
|
|
24
|
-
const candidate = process.env.D360_WRITER_TRANSCRIPT;
|
|
25
|
-
if (candidate && existsSync(candidate))
|
|
26
|
-
return candidate;
|
|
27
|
-
return null;
|
|
28
|
-
}
|
|
29
|
-
//# sourceMappingURL=save.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"save.js","sourceRoot":"","sources":["../../src/commands/save.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAEnD,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACtE,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEnD,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAAc;IAC9C,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACrB,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC,CAAC;QAC1C,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;IAC9B,CAAC;IAED,SAAS,CAAC,WAAW,EAAE,CAAC,CAAC;IACzB,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;IAE/B,MAAM,UAAU,GAAG,sBAAsB,EAAE,CAAC;IAC5C,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAC,CAAC;QACrE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,sIAAsI,CAAC,CAAC,CAAC;QAC1J,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,uBAAuB,IAAI,EAAE,CAAC,CAAC,CAAC;QACjD,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;IAC9B,CAAC;IAED,YAAY,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;IAC/B,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,sBAAsB,IAAI,EAAE,CAAC,CAAC,CAAC;IAC9C,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;AAC9B,CAAC;AAED,SAAS,sBAAsB;IAC7B,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC;IACrD,IAAI,SAAS,IAAI,UAAU,CAAC,SAAS,CAAC;QAAE,OAAO,SAAS,CAAC;IACzD,OAAO,IAAI,CAAC;AACd,CAAC"}
|