document360-writer 0.2.1 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (83) hide show
  1. package/dist/cli.js +83 -3
  2. package/dist/cli.js.map +1 -1
  3. package/dist/commands/allowProd.d.ts +3 -0
  4. package/dist/commands/allowProd.js +18 -0
  5. package/dist/commands/allowProd.js.map +1 -0
  6. package/dist/commands/clear.js +1 -1
  7. package/dist/commands/clear.js.map +1 -1
  8. package/dist/commands/help.js +3 -0
  9. package/dist/commands/help.js.map +1 -1
  10. package/dist/commands/index.d.ts +2 -0
  11. package/dist/commands/index.js +6 -0
  12. package/dist/commands/index.js.map +1 -1
  13. package/dist/commands/init.js +15 -17
  14. package/dist/commands/init.js.map +1 -1
  15. package/dist/commands/mcp.js +1 -1
  16. package/dist/commands/mcp.js.map +1 -1
  17. package/dist/commands/profile.d.ts +3 -0
  18. package/dist/commands/profile.js +16 -0
  19. package/dist/commands/profile.js.map +1 -0
  20. package/dist/commands/rename.js +1 -1
  21. package/dist/commands/rename.js.map +1 -1
  22. package/dist/commands/resume.js +1 -1
  23. package/dist/commands/resume.js.map +1 -1
  24. package/dist/commands/workspace.d.ts +3 -0
  25. package/dist/commands/workspace.js +8 -0
  26. package/dist/commands/workspace.js.map +1 -0
  27. package/dist/d360/authCli.d.ts +10 -0
  28. package/dist/d360/authCli.js +106 -0
  29. package/dist/d360/authCli.js.map +1 -0
  30. package/dist/d360/profileCli.d.ts +3 -0
  31. package/dist/d360/profileCli.js +54 -0
  32. package/dist/d360/profileCli.js.map +1 -0
  33. package/dist/d360/workspaceCli.d.ts +15 -0
  34. package/dist/d360/workspaceCli.js +72 -0
  35. package/dist/d360/workspaceCli.js.map +1 -0
  36. package/dist/oneShot.d.ts +2 -2
  37. package/dist/oneShot.js +59 -59
  38. package/dist/oneShot.js.map +1 -1
  39. package/dist/repl.d.ts +2 -2
  40. package/dist/repl.js +72 -82
  41. package/dist/repl.js.map +1 -1
  42. package/dist/tui/App.d.ts +9 -0
  43. package/dist/tui/App.js +439 -0
  44. package/dist/tui/App.js.map +1 -0
  45. package/dist/tui/catalog.d.ts +8 -0
  46. package/dist/tui/catalog.js +21 -0
  47. package/dist/tui/catalog.js.map +1 -0
  48. package/dist/tui/index.d.ts +3 -0
  49. package/dist/tui/index.js +24 -0
  50. package/dist/tui/index.js.map +1 -0
  51. package/dist/tui/markdown.d.ts +4 -0
  52. package/dist/tui/markdown.js +139 -0
  53. package/dist/tui/markdown.js.map +1 -0
  54. package/package.json +8 -5
  55. package/dist/agent.d.ts +0 -6
  56. package/dist/agent.js +0 -94
  57. package/dist/agent.js.map +0 -1
  58. package/dist/config.d.ts +0 -40
  59. package/dist/config.js +0 -42
  60. package/dist/config.js.map +0 -1
  61. package/dist/lib/auth.d.ts +0 -14
  62. package/dist/lib/auth.js +0 -25
  63. package/dist/lib/auth.js.map +0 -1
  64. package/dist/lib/messageQueue.d.ts +0 -9
  65. package/dist/lib/messageQueue.js +0 -40
  66. package/dist/lib/messageQueue.js.map +0 -1
  67. package/dist/lib/paths.d.ts +0 -9
  68. package/dist/lib/paths.js +0 -35
  69. package/dist/lib/paths.js.map +0 -1
  70. package/dist/lib/sessionStore.d.ts +0 -24
  71. package/dist/lib/sessionStore.js +0 -100
  72. package/dist/lib/sessionStore.js.map +0 -1
  73. package/dist/lib/titleGen.d.ts +0 -7
  74. package/dist/lib/titleGen.js +0 -64
  75. package/dist/lib/titleGen.js.map +0 -1
  76. package/skills/CLAUDE.md +0 -92
  77. package/skills/analyze-codebase/SKILL.md +0 -35
  78. package/skills/audit-docs/SKILL.md +0 -48
  79. package/skills/emit-screenshot-spec/SKILL.md +0 -82
  80. package/skills/gather-context-from-mcp/SKILL.md +0 -29
  81. package/skills/propose-structure/SKILL.md +0 -51
  82. package/skills/publish-to-d360/SKILL.md +0 -39
  83. package/skills/write-article/SKILL.md +0 -95
@@ -0,0 +1,139 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Box, Text, useStdout } from 'ink';
3
+ const isTableSep = (line) => /^\s*\|?[\s:|-]*-[\s:|-]*\|?\s*$/.test(line) && line.includes('-');
4
+ const splitCells = (line) => line.replace(/^\s*\|/, '').replace(/\|\s*$/, '').split('|').map(c => c.trim());
5
+ function parseBlocks(md) {
6
+ const lines = md.replace(/\r/g, '').split('\n');
7
+ const blocks = [];
8
+ let i = 0;
9
+ while (i < lines.length) {
10
+ const line = lines[i];
11
+ // fenced code
12
+ if (/^\s*```/.test(line)) {
13
+ const code = [];
14
+ i++;
15
+ while (i < lines.length && !/^\s*```/.test(lines[i]))
16
+ code.push(lines[i++]);
17
+ i++; // closing fence
18
+ blocks.push({ kind: 'code', lines: code });
19
+ continue;
20
+ }
21
+ // table: a `| … |`-ish line followed by a separator row
22
+ if (line.includes('|') && i + 1 < lines.length && isTableSep(lines[i + 1])) {
23
+ const header = splitCells(line);
24
+ i += 2;
25
+ const rows = [];
26
+ while (i < lines.length && lines[i].includes('|') && lines[i].trim() !== '') {
27
+ rows.push(splitCells(lines[i++]));
28
+ }
29
+ blocks.push({ kind: 'table', header, rows });
30
+ continue;
31
+ }
32
+ // heading
33
+ const h = line.match(/^(#{1,6})\s+(.*)$/);
34
+ if (h) {
35
+ blocks.push({ kind: 'heading', level: h[1].length, text: h[2] });
36
+ i++;
37
+ continue;
38
+ }
39
+ // list (consecutive bullet / numbered lines)
40
+ if (/^\s*([-*]|\d+\.)\s+/.test(line)) {
41
+ const items = [];
42
+ while (i < lines.length && /^\s*([-*]|\d+\.)\s+/.test(lines[i])) {
43
+ items.push(lines[i++].replace(/^\s*([-*]|\d+\.)\s+/, ''));
44
+ }
45
+ blocks.push({ kind: 'list', items });
46
+ continue;
47
+ }
48
+ // blank
49
+ if (line.trim() === '') {
50
+ i++;
51
+ continue;
52
+ }
53
+ // paragraph (gather until blank / block boundary)
54
+ const para = [];
55
+ while (i < lines.length &&
56
+ lines[i].trim() !== '' &&
57
+ !/^\s*```/.test(lines[i]) &&
58
+ !/^(#{1,6})\s/.test(lines[i]) &&
59
+ !/^\s*([-*]|\d+\.)\s+/.test(lines[i]) &&
60
+ !(lines[i].includes('|') && i + 1 < lines.length && isTableSep(lines[i + 1]))) {
61
+ para.push(lines[i++]);
62
+ }
63
+ blocks.push({ kind: 'para', text: para.join(' ') });
64
+ }
65
+ return blocks;
66
+ }
67
+ /** Render inline **bold**, *italic*, `code` as styled spans. */
68
+ function Inline({ text }) {
69
+ const parts = [];
70
+ const re = /(\*\*[^*]+\*\*|`[^`]+`|\*[^*]+\*)/g;
71
+ let last = 0;
72
+ let m;
73
+ let k = 0;
74
+ while ((m = re.exec(text)) !== null) {
75
+ if (m.index > last)
76
+ parts.push(_jsx(Text, { children: text.slice(last, m.index) }, k++));
77
+ const tok = m[0];
78
+ if (tok.startsWith('**'))
79
+ parts.push(_jsx(Text, { bold: true, children: tok.slice(2, -2) }, k++));
80
+ else if (tok.startsWith('`'))
81
+ parts.push(_jsx(Text, { color: "cyan", children: tok.slice(1, -1) }, k++));
82
+ else
83
+ parts.push(_jsx(Text, { italic: true, children: tok.slice(1, -1) }, k++));
84
+ last = m.index + tok.length;
85
+ }
86
+ if (last < text.length)
87
+ parts.push(_jsx(Text, { children: text.slice(last) }, k++));
88
+ return _jsx(Text, { children: parts });
89
+ }
90
+ const GAP = 2;
91
+ function MdTable({ header, rows }) {
92
+ const { stdout } = useStdout();
93
+ const cols = header.length;
94
+ // Natural width = widest cell per column. If the table exceeds the terminal, scale
95
+ // columns down proportionally (min 6) and let cells WRAP inside their fixed-width box,
96
+ // so columns stay aligned no matter how long a cell's content is.
97
+ const natural = header.map((h, c) => Math.max(h.length, ...rows.map(r => (r[c] ?? '').length)));
98
+ const avail = Math.max(24, (stdout.columns ?? 80) - 2);
99
+ const gaps = GAP * (cols - 1);
100
+ const widths = [...natural];
101
+ const total = () => widths.reduce((a, b) => a + b, 0) + gaps;
102
+ // Shrink the WIDEST column by 1 until the table fits — narrow columns keep their
103
+ // natural width (so short labels don't wrap), only the offenders get squeezed.
104
+ let guard = 0;
105
+ while (total() > avail && guard++ < 10000) {
106
+ let idx = -1;
107
+ let max = 6; // floor
108
+ for (let c = 0; c < cols; c++) {
109
+ if (widths[c] > max) {
110
+ max = widths[c];
111
+ idx = c;
112
+ }
113
+ }
114
+ if (idx === -1)
115
+ break; // all at floor
116
+ widths[idx] -= 1;
117
+ }
118
+ const ruleWidth = Math.min(avail, widths.reduce((a, b) => a + b, 0) + gaps);
119
+ const cell = (text, c, header) => (_jsx(Box, { width: widths[c], marginRight: c < cols - 1 ? GAP : 0, children: _jsx(Text, { wrap: "wrap", bold: header, color: header ? 'cyan' : undefined, children: text }) }, c));
120
+ return (_jsxs(Box, { flexDirection: "column", marginY: 1, children: [_jsx(Box, { children: header.map((h, c) => cell(h, c, true)) }), _jsx(Text, { color: "gray", children: '─'.repeat(ruleWidth) }), rows.map((r, ri) => (_jsx(Box, { children: widths.map((_w, c) => cell(r[c] ?? '', c, false)) }, ri)))] }));
121
+ }
122
+ export function Markdown({ text }) {
123
+ const blocks = parseBlocks(text);
124
+ return (_jsx(Box, { flexDirection: "column", children: blocks.map((b, i) => {
125
+ switch (b.kind) {
126
+ case 'heading':
127
+ return (_jsx(Box, { marginTop: b.level <= 2 ? 1 : 0, children: _jsx(Text, { color: "cyan", bold: true, children: b.text }) }, i));
128
+ case 'para':
129
+ return (_jsx(Box, { children: _jsx(Inline, { text: b.text }) }, i));
130
+ case 'list':
131
+ return (_jsx(Box, { flexDirection: "column", children: b.items.map((it, j) => (_jsxs(Box, { children: [_jsx(Text, { color: "cyan", children: ' • ' }), _jsx(Inline, { text: it })] }, j))) }, i));
132
+ case 'code':
133
+ return (_jsx(Box, { flexDirection: "column", marginY: 1, paddingLeft: 2, children: b.lines.map((l, j) => (_jsx(Text, { color: "gray", children: l || ' ' }, j))) }, i));
134
+ case 'table':
135
+ return _jsx(MdTable, { header: b.header, rows: b.rows }, i);
136
+ }
137
+ }) }));
138
+ }
139
+ //# sourceMappingURL=markdown.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown.js","sourceRoot":"","sources":["../../src/tui/markdown.tsx"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "document360-writer",
3
- "version": "0.2.1",
3
+ "version": "0.3.1",
4
4
  "description": "Standalone documentation agent CLI. Reads your code, writes your docs. Specialized for Document360 publishing.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -9,14 +9,14 @@
9
9
  },
10
10
  "files": [
11
11
  "dist",
12
- "skills",
13
12
  "README.md",
14
13
  "LICENSE"
15
14
  ],
16
15
  "scripts": {
17
16
  "build": "tsc -b",
18
17
  "clean": "rimraf dist",
19
- "prepublishOnly": "npm run build"
18
+ "prepublishOnly": "npm run build",
19
+ "test": "vitest run --passWithNoTests"
20
20
  },
21
21
  "engines": {
22
22
  "node": ">=20"
@@ -31,13 +31,16 @@
31
31
  "url": "https://github.com/saravana-mv/document360-writer/issues"
32
32
  },
33
33
  "dependencies": {
34
- "@anthropic-ai/claude-agent-sdk": "^0.3.150",
35
34
  "@inquirer/prompts": "^8.4.3",
36
35
  "commander": "^14.0.3",
37
- "picocolors": "^1.1.1"
36
+ "document360-engine": "^0.1.0",
37
+ "ink": "^5.2.1",
38
+ "picocolors": "^1.1.1",
39
+ "react": "^18.3.1"
38
40
  },
39
41
  "devDependencies": {
40
42
  "@types/node": "^22.10.0",
43
+ "@types/react": "^18.3.31",
41
44
  "rimraf": "^6.0.1",
42
45
  "typescript": "~5.6.0"
43
46
  },
package/dist/agent.d.ts DELETED
@@ -1,6 +0,0 @@
1
- import { UserMessageQueue } from './lib/messageQueue.js';
2
- export type AgentSession = {
3
- queue: UserMessageQueue;
4
- iterator: AsyncIterator<unknown>;
5
- };
6
- export declare function startAgent(cwd?: string, resume?: string): AgentSession;
package/dist/agent.js DELETED
@@ -1,94 +0,0 @@
1
- import { readdirSync, readFileSync, existsSync, statSync } from 'node:fs';
2
- import { join } from 'node:path';
3
- import { query } from '@anthropic-ai/claude-agent-sdk';
4
- import { packageSkillsDir, projectSkillsDir } from './lib/paths.js';
5
- import { readMcpConfig, readProjectConfig } from './config.js';
6
- import { UserMessageQueue } from './lib/messageQueue.js';
7
- const MASTER_PROMPT_FILE = 'CLAUDE.md';
8
- function readSkillFiles(dir) {
9
- if (!existsSync(dir))
10
- return [];
11
- const out = [];
12
- for (const entry of readdirSync(dir)) {
13
- const sub = join(dir, entry);
14
- if (entry === MASTER_PROMPT_FILE)
15
- continue;
16
- if (!statSync(sub).isDirectory())
17
- continue;
18
- const skillFile = join(sub, 'SKILL.md');
19
- if (!existsSync(skillFile))
20
- continue;
21
- out.push({ name: entry, body: readFileSync(skillFile, 'utf8') });
22
- }
23
- return out;
24
- }
25
- function readMasterPrompt(dir) {
26
- const path = join(dir, MASTER_PROMPT_FILE);
27
- return existsSync(path) ? readFileSync(path, 'utf8') : null;
28
- }
29
- function buildSystemPrompt(cwd, cfg) {
30
- const packageDir = packageSkillsDir();
31
- const projectDir = projectSkillsDir(cwd);
32
- const masterPackage = readMasterPrompt(packageDir);
33
- const masterProject = readMasterPrompt(projectDir);
34
- const packageSkills = readSkillFiles(packageDir);
35
- const projectSkills = readSkillFiles(projectDir);
36
- const projectSkillNames = new Set(projectSkills.map(s => s.name));
37
- const merged = [...packageSkills.filter(s => !projectSkillNames.has(s.name)), ...projectSkills];
38
- const parts = [];
39
- if (masterPackage)
40
- parts.push(masterPackage);
41
- if (masterProject)
42
- parts.push(`# Project addendum\n\n${masterProject}`);
43
- if (cfg) {
44
- parts.push('# Project configuration');
45
- parts.push('```json');
46
- parts.push(JSON.stringify(cfg, null, 2));
47
- parts.push('```');
48
- }
49
- if (merged.length > 0) {
50
- parts.push('# Capabilities');
51
- parts.push('You have the following specialized documentation skills. Activate the one whose preconditions match the user request. If multiple match, run them in order.');
52
- for (const s of merged) {
53
- parts.push(`## Skill: ${s.name}`);
54
- parts.push(s.body);
55
- }
56
- }
57
- return parts.join('\n\n');
58
- }
59
- function toSdkMcpServers() {
60
- const mcp = readMcpConfig();
61
- const out = {};
62
- for (const [name, entry] of Object.entries(mcp.servers)) {
63
- if (entry.type === 'stdio') {
64
- out[name] = { type: 'stdio', command: entry.command, args: entry.args, env: entry.env };
65
- }
66
- else if (entry.type === 'http') {
67
- out[name] = { type: 'http', url: entry.url, headers: entry.headers };
68
- }
69
- else if (entry.type === 'sse') {
70
- out[name] = { type: 'sse', url: entry.url, headers: entry.headers };
71
- }
72
- }
73
- return out;
74
- }
75
- export function startAgent(cwd = process.cwd(), resume) {
76
- const cfg = readProjectConfig(cwd);
77
- const systemPrompt = buildSystemPrompt(cwd, cfg);
78
- const mcpServers = toSdkMcpServers();
79
- const queue = new UserMessageQueue();
80
- const options = {
81
- cwd,
82
- systemPrompt,
83
- mcpServers,
84
- permissionMode: 'bypassPermissions',
85
- allowDangerouslySkipPermissions: true,
86
- includePartialMessages: true,
87
- settingSources: [],
88
- model: cfg?.defaultModel,
89
- resume,
90
- };
91
- const q = query({ prompt: queue, options });
92
- return { queue, iterator: q[Symbol.asyncIterator]() };
93
- }
94
- //# sourceMappingURL=agent.js.map
package/dist/agent.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"agent.js","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"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"}
package/dist/config.d.ts DELETED
@@ -1,40 +0,0 @@
1
- export type ProjectConfig = {
2
- projectId: string;
3
- d360?: {
4
- projectId?: string;
5
- projectVersionId?: string;
6
- helpCenterBaseUrl?: string;
7
- };
8
- captureDir?: string;
9
- outputDir?: string;
10
- authoritativeSourceFiles?: string[];
11
- terminologyGlossary?: Record<string, string>;
12
- defaultModel?: string;
13
- };
14
- export type UserConfig = {
15
- defaultModel?: string;
16
- autoUpdate?: boolean;
17
- };
18
- export type McpServerEntry = {
19
- type: 'stdio';
20
- command: string;
21
- args?: string[];
22
- env?: Record<string, string>;
23
- } | {
24
- type: 'http';
25
- url: string;
26
- headers?: Record<string, string>;
27
- } | {
28
- type: 'sse';
29
- url: string;
30
- headers?: Record<string, string>;
31
- };
32
- export type UserMcpConfig = {
33
- servers: Record<string, McpServerEntry>;
34
- };
35
- export declare function readProjectConfig(cwd?: string): ProjectConfig | null;
36
- export declare function writeProjectConfig(cfg: ProjectConfig, cwd?: string): void;
37
- export declare function readUserConfig(): UserConfig;
38
- export declare function writeUserConfig(cfg: UserConfig): void;
39
- export declare function readMcpConfig(): UserMcpConfig;
40
- export declare function writeMcpConfig(cfg: UserMcpConfig): void;
package/dist/config.js DELETED
@@ -1,42 +0,0 @@
1
- import { readFileSync, writeFileSync, existsSync } from 'node:fs';
2
- import { projectConfigPath, userConfigPath, userMcpConfigPath, userDir, ensureDir, } from './lib/paths.js';
3
- export function readProjectConfig(cwd = process.cwd()) {
4
- const path = projectConfigPath(cwd);
5
- if (!existsSync(path))
6
- return null;
7
- return JSON.parse(readFileSync(path, 'utf8'));
8
- }
9
- export function writeProjectConfig(cfg, cwd = process.cwd()) {
10
- writeFileSync(projectConfigPath(cwd), JSON.stringify(cfg, null, 2) + '\n', 'utf8');
11
- }
12
- export function readUserConfig() {
13
- const path = userConfigPath();
14
- if (!existsSync(path))
15
- return {};
16
- try {
17
- return JSON.parse(readFileSync(path, 'utf8'));
18
- }
19
- catch {
20
- return {};
21
- }
22
- }
23
- export function writeUserConfig(cfg) {
24
- ensureDir(userDir());
25
- writeFileSync(userConfigPath(), JSON.stringify(cfg, null, 2) + '\n', 'utf8');
26
- }
27
- export function readMcpConfig() {
28
- const path = userMcpConfigPath();
29
- if (!existsSync(path))
30
- return { servers: {} };
31
- try {
32
- return JSON.parse(readFileSync(path, 'utf8'));
33
- }
34
- catch {
35
- return { servers: {} };
36
- }
37
- }
38
- export function writeMcpConfig(cfg) {
39
- ensureDir(userDir());
40
- writeFileSync(userMcpConfigPath(), JSON.stringify(cfg, null, 2) + '\n', 'utf8');
41
- }
42
- //# sourceMappingURL=config.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAClE,OAAO,EACL,iBAAiB,EACjB,cAAc,EACd,iBAAiB,EACjB,OAAO,EACP,SAAS,GACV,MAAM,gBAAgB,CAAC;AA8BxB,MAAM,UAAU,iBAAiB,CAAC,MAAc,OAAO,CAAC,GAAG,EAAE;IAC3D,MAAM,IAAI,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC;IACpC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACnC,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAkB,CAAC;AACjE,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,GAAkB,EAAE,MAAc,OAAO,CAAC,GAAG,EAAE;IAChF,aAAa,CAAC,iBAAiB,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,MAAM,CAAC,CAAC;AACrF,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,MAAM,IAAI,GAAG,cAAc,EAAE,CAAC;IAC9B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,CAAC;IACjC,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAe,CAAC;IAC9D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,GAAe;IAC7C,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC;IACrB,aAAa,CAAC,cAAc,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,MAAM,CAAC,CAAC;AAC/E,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,MAAM,IAAI,GAAG,iBAAiB,EAAE,CAAC;IACjC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IAC9C,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAkB,CAAC;IACjE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IACzB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,GAAkB;IAC/C,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC;IACrB,aAAa,CAAC,iBAAiB,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,MAAM,CAAC,CAAC;AAClF,CAAC"}
@@ -1,14 +0,0 @@
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 DELETED
@@ -1,25 +0,0 @@
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
@@ -1 +0,0 @@
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"}
@@ -1,9 +0,0 @@
1
- import type { SDKUserMessage } from '@anthropic-ai/claude-agent-sdk';
2
- export declare class UserMessageQueue implements AsyncIterable<SDKUserMessage> {
3
- private resolvers;
4
- private buffer;
5
- private closed;
6
- push(content: string): void;
7
- close(): void;
8
- [Symbol.asyncIterator](): AsyncIterator<SDKUserMessage>;
9
- }
@@ -1,40 +0,0 @@
1
- export class UserMessageQueue {
2
- resolvers = [];
3
- buffer = [];
4
- closed = false;
5
- push(content) {
6
- if (this.closed)
7
- return;
8
- const msg = {
9
- type: 'user',
10
- message: { role: 'user', content },
11
- parent_tool_use_id: null,
12
- };
13
- const resolver = this.resolvers.shift();
14
- if (resolver)
15
- resolver(msg);
16
- else
17
- this.buffer.push(msg);
18
- }
19
- close() {
20
- this.closed = true;
21
- for (const r of this.resolvers)
22
- r(null);
23
- this.resolvers = [];
24
- }
25
- async *[Symbol.asyncIterator]() {
26
- while (true) {
27
- if (this.buffer.length > 0) {
28
- yield this.buffer.shift();
29
- continue;
30
- }
31
- if (this.closed)
32
- return;
33
- const next = await new Promise(r => this.resolvers.push(r));
34
- if (next === null)
35
- return;
36
- yield next;
37
- }
38
- }
39
- }
40
- //# sourceMappingURL=messageQueue.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"messageQueue.js","sourceRoot":"","sources":["../../src/lib/messageQueue.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,gBAAgB;IACnB,SAAS,GAAgD,EAAE,CAAC;IAC5D,MAAM,GAAqB,EAAE,CAAC;IAC9B,MAAM,GAAG,KAAK,CAAC;IAEvB,IAAI,CAAC,OAAe;QAClB,IAAI,IAAI,CAAC,MAAM;YAAE,OAAO;QACxB,MAAM,GAAG,GAAmB;YAC1B,IAAI,EAAE,MAAM;YACZ,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE;YAClC,kBAAkB,EAAE,IAAI;SACzB,CAAC;QACF,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;QACxC,IAAI,QAAQ;YAAE,QAAQ,CAAC,GAAG,CAAC,CAAC;;YACvB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC7B,CAAC;IAED,KAAK;QACH,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,SAAS;YAAE,CAAC,CAAC,IAAI,CAAC,CAAC;QACxC,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;IACtB,CAAC;IAED,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC;QAC3B,OAAO,IAAI,EAAE,CAAC;YACZ,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC3B,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,EAAG,CAAC;gBAC3B,SAAS;YACX,CAAC;YACD,IAAI,IAAI,CAAC,MAAM;gBAAE,OAAO;YACxB,MAAM,IAAI,GAAG,MAAM,IAAI,OAAO,CAAwB,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;YACnF,IAAI,IAAI,KAAK,IAAI;gBAAE,OAAO;YAC1B,MAAM,IAAI,CAAC;QACb,CAAC;IACH,CAAC;CACF"}
@@ -1,9 +0,0 @@
1
- export declare function packageRoot(): string;
2
- export declare function packageSkillsDir(): string;
3
- export declare function userDir(): string;
4
- export declare function userConfigPath(): string;
5
- export declare function userMcpConfigPath(): string;
6
- export declare function sessionsFilePath(): string;
7
- export declare function projectConfigPath(cwd?: string): string;
8
- export declare function projectSkillsDir(cwd?: string): string;
9
- export declare function ensureDir(path: string): void;
package/dist/lib/paths.js DELETED
@@ -1,35 +0,0 @@
1
- import { homedir } from 'node:os';
2
- import { join, dirname } from 'node:path';
3
- import { fileURLToPath } from 'node:url';
4
- import { existsSync, mkdirSync } from 'node:fs';
5
- const __filename = fileURLToPath(import.meta.url);
6
- const __dirname = dirname(__filename);
7
- export function packageRoot() {
8
- return join(__dirname, '..', '..');
9
- }
10
- export function packageSkillsDir() {
11
- return join(packageRoot(), 'skills');
12
- }
13
- export function userDir() {
14
- return join(homedir(), '.document360-writer');
15
- }
16
- export function userConfigPath() {
17
- return join(userDir(), 'config.json');
18
- }
19
- export function userMcpConfigPath() {
20
- return join(userDir(), 'mcp.json');
21
- }
22
- export function sessionsFilePath() {
23
- return join(userDir(), 'sessions.json');
24
- }
25
- export function projectConfigPath(cwd = process.cwd()) {
26
- return join(cwd, '.d360-writer.json');
27
- }
28
- export function projectSkillsDir(cwd = process.cwd()) {
29
- return join(cwd, '.d360-writer', 'skills');
30
- }
31
- export function ensureDir(path) {
32
- if (!existsSync(path))
33
- mkdirSync(path, { recursive: true });
34
- }
35
- //# sourceMappingURL=paths.js.map
@@ -1 +0,0 @@
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"}
@@ -1,24 +0,0 @@
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;