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.
Files changed (45) hide show
  1. package/dist/agent.d.ts +1 -1
  2. package/dist/agent.js +3 -1
  3. package/dist/agent.js.map +1 -1
  4. package/dist/cli.js +15 -2
  5. package/dist/cli.js.map +1 -1
  6. package/dist/commands/clear.d.ts +2 -1
  7. package/dist/commands/clear.js +10 -2
  8. package/dist/commands/clear.js.map +1 -1
  9. package/dist/commands/help.js +2 -2
  10. package/dist/commands/help.js.map +1 -1
  11. package/dist/commands/index.d.ts +4 -0
  12. package/dist/commands/index.js +4 -4
  13. package/dist/commands/index.js.map +1 -1
  14. package/dist/commands/rename.d.ts +3 -0
  15. package/dist/commands/rename.js +22 -0
  16. package/dist/commands/rename.js.map +1 -0
  17. package/dist/commands/resume.d.ts +3 -0
  18. package/dist/commands/resume.js +58 -0
  19. package/dist/commands/resume.js.map +1 -0
  20. package/dist/lib/auth.d.ts +14 -0
  21. package/dist/lib/auth.js +25 -0
  22. package/dist/lib/auth.js.map +1 -0
  23. package/dist/lib/paths.d.ts +1 -2
  24. package/dist/lib/paths.js +2 -5
  25. package/dist/lib/paths.js.map +1 -1
  26. package/dist/lib/sessionStore.d.ts +24 -0
  27. package/dist/lib/sessionStore.js +100 -0
  28. package/dist/lib/sessionStore.js.map +1 -0
  29. package/dist/lib/titleGen.d.ts +7 -0
  30. package/dist/lib/titleGen.js +64 -0
  31. package/dist/lib/titleGen.js.map +1 -0
  32. package/dist/oneShot.d.ts +7 -0
  33. package/dist/oneShot.js +96 -0
  34. package/dist/oneShot.js.map +1 -0
  35. package/dist/repl.d.ts +6 -1
  36. package/dist/repl.js +135 -13
  37. package/dist/repl.js.map +1 -1
  38. package/package.json +1 -1
  39. package/skills/write-article/SKILL.md +2 -0
  40. package/dist/commands/load.d.ts +0 -2
  41. package/dist/commands/load.js +0 -20
  42. package/dist/commands/load.js.map +0 -1
  43. package/dist/commands/save.d.ts +0 -2
  44. package/dist/commands/save.js +0 -29
  45. package/dist/commands/save.js.map +0 -1
package/dist/agent.d.ts CHANGED
@@ -3,4 +3,4 @@ export type AgentSession = {
3
3
  queue: UserMessageQueue;
4
4
  iterator: AsyncIterator<unknown>;
5
5
  };
6
- export declare function startAgent(cwd?: string): AgentSession;
6
+ export declare function startAgent(cwd?: string, resume?: string): AgentSession;
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
- console.error('One-shot --prompt mode not yet implemented (v1.1). Run without --prompt for interactive REPL.');
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,+FAA+F,CAAC,CAAC;QAC/G,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC1B,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"}
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"}
@@ -1,2 +1,3 @@
1
1
  import type { SlashCommandResult } from './index.js';
2
- export declare function clearCommand(): Promise<SlashCommandResult>;
2
+ import type { ReplContext } from '../repl.js';
3
+ export declare function clearCommand(_args: string[], ctx: ReplContext): Promise<SlashCommandResult>;
@@ -1,6 +1,14 @@
1
1
  import { dim } from '../lib/colors.js';
2
- export async function clearCommand() {
3
- console.log(dim('\n(conversation reset agent will start fresh on the next prompt)\n'));
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;AAGvC,MAAM,CAAC,KAAK,UAAU,YAAY;IAChC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,sEAAsE,CAAC,CAAC,CAAC;IACzF,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;AAC3B,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"}
@@ -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('/save <name>')} ${dim('Checkpoint current session')}`,
16
- ` ${accent('/load <name>')} ${dim('Resume a saved session')}`,
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,cAAc,CAAC,0BAA0B,GAAG,CAAC,4BAA4B,CAAC,EAAE;QACxF,KAAK,MAAM,CAAC,cAAc,CAAC,0BAA0B,GAAG,CAAC,wBAAwB,CAAC,EAAE;QACpF,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"}
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"}
@@ -5,6 +5,10 @@ export type SlashCommandResult = {
5
5
  kind: 'exit';
6
6
  } | {
7
7
  kind: 'clear';
8
+ } | {
9
+ kind: 'resume';
10
+ uuid: string;
11
+ name: string;
8
12
  } | {
9
13
  kind: 'forward-to-agent';
10
14
  prompt: string;
@@ -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 { saveCommand } from './save.js';
9
- import { loadCommand } from './load.js';
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
- save: saveCommand,
22
- load: loadCommand,
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,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAWpD,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,IAAI,EAAE,WAAW;IACjB,IAAI,EAAE,WAAW;IACjB,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"}
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,3 @@
1
+ import type { SlashCommandResult } from './index.js';
2
+ import type { ReplContext } from '../repl.js';
3
+ export declare function renameCommand(args: string[], ctx: ReplContext): Promise<SlashCommandResult>;
@@ -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,3 @@
1
+ import type { SlashCommandResult } from './index.js';
2
+ import type { ReplContext } from '../repl.js';
3
+ export declare function resumeCommand(args: string[], ctx: ReplContext): Promise<SlashCommandResult>;
@@ -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;
@@ -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"}
@@ -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 sessionsDir(): string;
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 sessionsDir() {
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');
@@ -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,WAAW;IACzB,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,UAAU,CAAC,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,OAAO,IAAI,CAAC,WAAW,EAAE,EAAE,GAAG,IAAI,QAAQ,CAAC,CAAC;AAC9C,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"}
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>;
@@ -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 { accent, banner, dim, error, muted } from './lib/colors.js';
5
- export async function runRepl(cwd = process.cwd()) {
6
- if (!process.env.ANTHROPIC_API_KEY) {
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 rl.question(accent('> '));
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
- async function consumeUntilResult(iterator) {
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 === 'partial_assistant') {
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":"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"}
1
+ {"version":3,"file":"repl.js","sourceRoot":"","sources":["../src/repl.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "document360-writer",
3
- "version": "0.1.0",
3
+ "version": "0.2.0",
4
4
  "description": "Standalone documentation agent CLI. Reads your code, writes your docs. Specialized for Document360 publishing.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -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).
@@ -1,2 +0,0 @@
1
- import type { SlashCommandResult } from './index.js';
2
- export declare function loadCommand(args: string[]): Promise<SlashCommandResult>;
@@ -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"}
@@ -1,2 +0,0 @@
1
- import type { SlashCommandResult } from './index.js';
2
- export declare function saveCommand(args: string[]): Promise<SlashCommandResult>;
@@ -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"}