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.
- package/dist/cli.js +83 -3
- package/dist/cli.js.map +1 -1
- package/dist/commands/allowProd.d.ts +3 -0
- package/dist/commands/allowProd.js +18 -0
- package/dist/commands/allowProd.js.map +1 -0
- package/dist/commands/clear.js +1 -1
- package/dist/commands/clear.js.map +1 -1
- package/dist/commands/help.js +3 -0
- package/dist/commands/help.js.map +1 -1
- package/dist/commands/index.d.ts +2 -0
- package/dist/commands/index.js +6 -0
- package/dist/commands/index.js.map +1 -1
- package/dist/commands/init.js +15 -17
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/mcp.js +1 -1
- package/dist/commands/mcp.js.map +1 -1
- package/dist/commands/profile.d.ts +3 -0
- package/dist/commands/profile.js +16 -0
- package/dist/commands/profile.js.map +1 -0
- package/dist/commands/rename.js +1 -1
- package/dist/commands/rename.js.map +1 -1
- package/dist/commands/resume.js +1 -1
- package/dist/commands/resume.js.map +1 -1
- package/dist/commands/workspace.d.ts +3 -0
- package/dist/commands/workspace.js +8 -0
- package/dist/commands/workspace.js.map +1 -0
- package/dist/d360/authCli.d.ts +10 -0
- package/dist/d360/authCli.js +106 -0
- package/dist/d360/authCli.js.map +1 -0
- package/dist/d360/profileCli.d.ts +3 -0
- package/dist/d360/profileCli.js +54 -0
- package/dist/d360/profileCli.js.map +1 -0
- package/dist/d360/workspaceCli.d.ts +15 -0
- package/dist/d360/workspaceCli.js +72 -0
- package/dist/d360/workspaceCli.js.map +1 -0
- package/dist/oneShot.d.ts +2 -2
- package/dist/oneShot.js +59 -59
- package/dist/oneShot.js.map +1 -1
- package/dist/repl.d.ts +2 -2
- package/dist/repl.js +72 -82
- package/dist/repl.js.map +1 -1
- package/dist/tui/App.d.ts +9 -0
- package/dist/tui/App.js +439 -0
- package/dist/tui/App.js.map +1 -0
- package/dist/tui/catalog.d.ts +8 -0
- package/dist/tui/catalog.js +21 -0
- package/dist/tui/catalog.js.map +1 -0
- package/dist/tui/index.d.ts +3 -0
- package/dist/tui/index.js +24 -0
- package/dist/tui/index.js.map +1 -0
- package/dist/tui/markdown.d.ts +4 -0
- package/dist/tui/markdown.js +139 -0
- package/dist/tui/markdown.js.map +1 -0
- package/package.json +8 -5
- package/dist/agent.d.ts +0 -6
- package/dist/agent.js +0 -94
- package/dist/agent.js.map +0 -1
- package/dist/config.d.ts +0 -40
- package/dist/config.js +0 -42
- package/dist/config.js.map +0 -1
- package/dist/lib/auth.d.ts +0 -14
- package/dist/lib/auth.js +0 -25
- package/dist/lib/auth.js.map +0 -1
- package/dist/lib/messageQueue.d.ts +0 -9
- package/dist/lib/messageQueue.js +0 -40
- package/dist/lib/messageQueue.js.map +0 -1
- package/dist/lib/paths.d.ts +0 -9
- package/dist/lib/paths.js +0 -35
- package/dist/lib/paths.js.map +0 -1
- package/dist/lib/sessionStore.d.ts +0 -24
- package/dist/lib/sessionStore.js +0 -100
- package/dist/lib/sessionStore.js.map +0 -1
- package/dist/lib/titleGen.d.ts +0 -7
- package/dist/lib/titleGen.js +0 -64
- package/dist/lib/titleGen.js.map +0 -1
- package/skills/CLAUDE.md +0 -92
- package/skills/analyze-codebase/SKILL.md +0 -35
- package/skills/audit-docs/SKILL.md +0 -48
- package/skills/emit-screenshot-spec/SKILL.md +0 -82
- package/skills/gather-context-from-mcp/SKILL.md +0 -29
- package/skills/propose-structure/SKILL.md +0 -51
- package/skills/publish-to-d360/SKILL.md +0 -39
- package/skills/write-article/SKILL.md +0 -95
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { readProjectConfig, writeProjectConfig, resolveActiveProfile, loadTokens, isExpired } from 'document360-engine';
|
|
2
|
+
import { accent, dim, error, ok, warn } from '../lib/colors.js';
|
|
3
|
+
export function runProfileList(cwd) {
|
|
4
|
+
const cfg = readProjectConfig(cwd);
|
|
5
|
+
if (!cfg?.profiles || Object.keys(cfg.profiles).length === 0) {
|
|
6
|
+
console.log(error('No profiles in .d360-writer.json. Run: d360-writer init'));
|
|
7
|
+
process.exitCode = 1;
|
|
8
|
+
return;
|
|
9
|
+
}
|
|
10
|
+
console.log('');
|
|
11
|
+
for (const [name, profile] of Object.entries(cfg.profiles)) {
|
|
12
|
+
const active = name === cfg.defaultProfile ? accent('● ') : ' ';
|
|
13
|
+
const prod = profile.production ? warn(' ⚠ PRODUCTION') : '';
|
|
14
|
+
const envName = profile.connection.environment ?? '(inline)';
|
|
15
|
+
const tokens = loadTokens(name);
|
|
16
|
+
const auth = !tokens ? dim('not logged in') : isExpired(tokens) && !tokens.refreshToken ? warn('expired') : dim('logged in');
|
|
17
|
+
console.log(`${active}${accent(name)} → ${envName}${prod} [${auth}]`);
|
|
18
|
+
}
|
|
19
|
+
console.log('');
|
|
20
|
+
console.log(dim('● = default. Switch with: d360-writer profile use <name>'));
|
|
21
|
+
console.log('');
|
|
22
|
+
}
|
|
23
|
+
export function runProfileUse(cwd, name) {
|
|
24
|
+
const cfg = readProjectConfig(cwd);
|
|
25
|
+
if (!cfg?.profiles?.[name]) {
|
|
26
|
+
const avail = cfg?.profiles ? Object.keys(cfg.profiles).join(', ') : '(none — run init)';
|
|
27
|
+
console.log(error(`Unknown profile "${name}". Available: ${avail}`));
|
|
28
|
+
process.exitCode = 1;
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
cfg.defaultProfile = name;
|
|
32
|
+
writeProjectConfig(cfg, cwd);
|
|
33
|
+
const prod = cfg.profiles[name].production ? warn(' ⚠ PRODUCTION') : '';
|
|
34
|
+
console.log(ok(`✓ Default profile is now "${name}"${prod}`));
|
|
35
|
+
}
|
|
36
|
+
export function runProfileShow(cwd, name) {
|
|
37
|
+
try {
|
|
38
|
+
const active = resolveActiveProfile(cwd, name);
|
|
39
|
+
console.log('');
|
|
40
|
+
console.log(`Profile ${accent(active.name)}${active.production ? warn(' ⚠ PRODUCTION') : ''}`);
|
|
41
|
+
console.log(dim(` api: ${active.connection.apiUrl}`));
|
|
42
|
+
console.log(dim(` identity: ${active.connection.authorizationUrl}`));
|
|
43
|
+
console.log(dim(` clientId: ${active.connection.clientId}`));
|
|
44
|
+
console.log(dim(` scopes: ${active.connection.scopes.join(' ')}`));
|
|
45
|
+
console.log(dim(` project: ${active.project.projectId ?? '(set at login)'}`));
|
|
46
|
+
console.log(dim(` workspace:${active.project.workspaceId ? ' ' + active.project.workspaceId : ' (none)'}`));
|
|
47
|
+
console.log('');
|
|
48
|
+
}
|
|
49
|
+
catch (e) {
|
|
50
|
+
console.log(error(e.message));
|
|
51
|
+
process.exitCode = 1;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=profileCli.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profileCli.js","sourceRoot":"","sources":["../../src/d360/profileCli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { type D360Workspace } from 'document360-engine';
|
|
2
|
+
/** Fetch workspaces for the active profile's project. Throws on auth/API errors. */
|
|
3
|
+
export declare function fetchWorkspaces(cwd: string, profileName?: string): Promise<{
|
|
4
|
+
workspaces: D360Workspace[];
|
|
5
|
+
projectId: string;
|
|
6
|
+
profile: string;
|
|
7
|
+
current?: string;
|
|
8
|
+
}>;
|
|
9
|
+
/** Match a workspace by exact name, name-prefix, or id-prefix (for `/workspace <name>`). */
|
|
10
|
+
export declare function matchWorkspace(workspaces: D360Workspace[], query: string): D360Workspace | undefined;
|
|
11
|
+
export declare function setWorkspace(cwd: string, profileName: string, projectId: string, workspaceId: string): void;
|
|
12
|
+
/** Non-interactive set-by-name (scriptable): `d360-writer workspace use <name>`. */
|
|
13
|
+
export declare function runWorkspaceUse(cwd: string, query: string, profileName?: string): Promise<number>;
|
|
14
|
+
/** CLI / login path: list workspaces and prompt (interactive TTY). Persists the choice. */
|
|
15
|
+
export declare function runWorkspacePicker(cwd: string, profileName?: string): Promise<void>;
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { select } from '@inquirer/prompts';
|
|
2
|
+
import { resolveActiveProfile, setProfileProject, resolveProjectId, listWorkspaces, } from 'document360-engine';
|
|
3
|
+
import { accent, dim, error, ok } from '../lib/colors.js';
|
|
4
|
+
/** Fetch workspaces for the active profile's project. Throws on auth/API errors. */
|
|
5
|
+
export async function fetchWorkspaces(cwd, profileName) {
|
|
6
|
+
const active = resolveActiveProfile(cwd, profileName);
|
|
7
|
+
const ctx = { profile: active.name, connection: active.connection };
|
|
8
|
+
const projectId = active.project.projectId ?? resolveProjectId(ctx);
|
|
9
|
+
const workspaces = await listWorkspaces(ctx, projectId);
|
|
10
|
+
return { workspaces, projectId, profile: active.name, current: active.project.workspaceId };
|
|
11
|
+
}
|
|
12
|
+
const label = (w) => `${w.name ?? w.id}${w.workspace_type ? ` · ${w.workspace_type}` : ''}`;
|
|
13
|
+
/** Match a workspace by exact name, name-prefix, or id-prefix (for `/workspace <name>`). */
|
|
14
|
+
export function matchWorkspace(workspaces, query) {
|
|
15
|
+
const q = query.toLowerCase();
|
|
16
|
+
return (workspaces.find(w => (w.name ?? '').toLowerCase() === q) ??
|
|
17
|
+
workspaces.find(w => (w.name ?? '').toLowerCase().startsWith(q)) ??
|
|
18
|
+
workspaces.find(w => w.id.startsWith(query)));
|
|
19
|
+
}
|
|
20
|
+
export function setWorkspace(cwd, profileName, projectId, workspaceId) {
|
|
21
|
+
setProfileProject(cwd, profileName, { projectId, workspaceId });
|
|
22
|
+
}
|
|
23
|
+
/** Non-interactive set-by-name (scriptable): `d360-writer workspace use <name>`. */
|
|
24
|
+
export async function runWorkspaceUse(cwd, query, profileName) {
|
|
25
|
+
let data;
|
|
26
|
+
try {
|
|
27
|
+
data = await fetchWorkspaces(cwd, profileName);
|
|
28
|
+
}
|
|
29
|
+
catch (e) {
|
|
30
|
+
console.log(error(`Could not list workspaces: ${e.message}`));
|
|
31
|
+
return 1;
|
|
32
|
+
}
|
|
33
|
+
const w = matchWorkspace(data.workspaces, query);
|
|
34
|
+
if (!w) {
|
|
35
|
+
console.log(error(`No workspace matches "${query}". Available: ${data.workspaces.map(x => x.name ?? x.id).join(', ')}`));
|
|
36
|
+
return 1;
|
|
37
|
+
}
|
|
38
|
+
setWorkspace(cwd, data.profile, data.projectId, w.id);
|
|
39
|
+
console.log(ok(`✓ Workspace set to "${w.name ?? w.id}" for profile "${data.profile}".`));
|
|
40
|
+
return 0;
|
|
41
|
+
}
|
|
42
|
+
/** CLI / login path: list workspaces and prompt (interactive TTY). Persists the choice. */
|
|
43
|
+
export async function runWorkspacePicker(cwd, profileName) {
|
|
44
|
+
let data;
|
|
45
|
+
try {
|
|
46
|
+
data = await fetchWorkspaces(cwd, profileName);
|
|
47
|
+
}
|
|
48
|
+
catch (e) {
|
|
49
|
+
console.log(error(`Could not list workspaces: ${e.message}`));
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
const { workspaces, projectId, profile, current } = data;
|
|
53
|
+
if (workspaces.length === 0) {
|
|
54
|
+
console.log(dim('No workspaces found in this project.'));
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
if (!process.stdin.isTTY) {
|
|
58
|
+
console.log('');
|
|
59
|
+
for (const w of workspaces)
|
|
60
|
+
console.log(` ${w.id === current ? accent('●') : ' '} ${label(w)} ${dim(w.id)}`);
|
|
61
|
+
console.log(dim('Run: d360-writer workspace use <name>'));
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
const choice = await select({
|
|
65
|
+
message: 'Select the Document360 workspace for this repo:',
|
|
66
|
+
choices: workspaces.map(w => ({ name: `${label(w)}${w.id === current ? ' (current)' : ''}`, value: w.id })),
|
|
67
|
+
});
|
|
68
|
+
setWorkspace(cwd, profile, projectId, choice);
|
|
69
|
+
const picked = workspaces.find(w => w.id === choice);
|
|
70
|
+
console.log(ok(`✓ Workspace set to "${picked?.name ?? choice}" for profile "${profile}".`));
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=workspaceCli.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspaceCli.js","sourceRoot":"","sources":["../../src/d360/workspaceCli.ts"],"names":[],"mappings":"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"}
|
package/dist/oneShot.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { type AuthMode } from '
|
|
1
|
+
import { type AuthMode } from 'document360-engine';
|
|
2
2
|
/**
|
|
3
3
|
* Headless one-shot mode (`d360-writer --prompt "..."`), the writer's `claude -p`.
|
|
4
4
|
* Answer text streams to STDOUT (pipeable); banner, auth notice, tool indicators,
|
|
5
5
|
* and token counts go to STDERR. Exit codes: 0 success, 1 agent error, 2 usage.
|
|
6
6
|
*/
|
|
7
|
-
export declare function runOnce(cwd: string, prompt: string, authMode: AuthMode, resumeName?: string): Promise<never>;
|
|
7
|
+
export declare function runOnce(cwd: string, prompt: string, authMode: AuthMode, resumeName?: string, profileName?: string, yes?: boolean): Promise<never>;
|
package/dist/oneShot.js
CHANGED
|
@@ -1,13 +1,11 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import { findByName, slugify, touchSession, upsertSession } from './lib/sessionStore.js';
|
|
4
|
-
import { accent, dim, error, muted } from './lib/colors.js';
|
|
1
|
+
import { createSession, resolveAuth, findByName, slugify, touchSession, upsertSession, resolveActiveProfile, } from 'document360-engine';
|
|
2
|
+
import { accent, dim, error, muted, warn } from './lib/colors.js';
|
|
5
3
|
/**
|
|
6
4
|
* Headless one-shot mode (`d360-writer --prompt "..."`), the writer's `claude -p`.
|
|
7
5
|
* Answer text streams to STDOUT (pipeable); banner, auth notice, tool indicators,
|
|
8
6
|
* and token counts go to STDERR. Exit codes: 0 success, 1 agent error, 2 usage.
|
|
9
7
|
*/
|
|
10
|
-
export async function runOnce(cwd, prompt, authMode, resumeName) {
|
|
8
|
+
export async function runOnce(cwd, prompt, authMode, resumeName, profileName, yes) {
|
|
11
9
|
const auth = resolveAuth(authMode);
|
|
12
10
|
if (auth.kind === 'none') {
|
|
13
11
|
console.error('');
|
|
@@ -19,6 +17,25 @@ export async function runOnce(cwd, prompt, authMode, resumeName) {
|
|
|
19
17
|
if (auth.kind === 'subscription') {
|
|
20
18
|
console.error(dim('Using your Claude subscription (no API key set).'));
|
|
21
19
|
}
|
|
20
|
+
// Production-profile guard: headless mode has no interactive confirm, so writes to a
|
|
21
|
+
// production profile require --yes. A config that EXISTS but is invalid must fail loud
|
|
22
|
+
// here — never silently skip the guard (a broken prod profile must not slip through).
|
|
23
|
+
let active = null;
|
|
24
|
+
try {
|
|
25
|
+
active = resolveActiveProfile(cwd, profileName);
|
|
26
|
+
}
|
|
27
|
+
catch (e) {
|
|
28
|
+
console.error(error(`Document360 profile error: ${e.message}`));
|
|
29
|
+
process.exit(2);
|
|
30
|
+
}
|
|
31
|
+
if (active.production) {
|
|
32
|
+
console.error(warn(`⚠ Profile "${active.name}" is PRODUCTION.`));
|
|
33
|
+
if (!yes) {
|
|
34
|
+
console.error(error('Refusing to run against a production profile without --yes.'));
|
|
35
|
+
process.exit(2);
|
|
36
|
+
}
|
|
37
|
+
console.error(dim(' --yes given — proceeding against production.'));
|
|
38
|
+
}
|
|
22
39
|
let resumeUuid;
|
|
23
40
|
if (resumeName) {
|
|
24
41
|
const rec = findByName(cwd, resumeName);
|
|
@@ -30,62 +47,45 @@ export async function runOnce(cwd, prompt, authMode, resumeName) {
|
|
|
30
47
|
resumeUuid = rec.uuid;
|
|
31
48
|
console.error(dim(`Resuming "${rec.name}"`));
|
|
32
49
|
}
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
session
|
|
50
|
+
// On a production profile we only reach here with --yes (gated above), so writes
|
|
51
|
+
// are authorized; non-production profiles always allow writes.
|
|
52
|
+
const session = createSession({ cwd, resume: resumeUuid, profileName, allowProdWrites: yes === true });
|
|
36
53
|
let uuid = resumeUuid ?? null;
|
|
37
54
|
let exitCode = 1;
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
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;
|
|
55
|
+
for await (const ev of session.send(prompt)) {
|
|
56
|
+
switch (ev.type) {
|
|
57
|
+
case 'session':
|
|
58
|
+
if (!uuid) {
|
|
59
|
+
uuid = ev.sessionId;
|
|
60
|
+
const now = new Date().toISOString();
|
|
61
|
+
upsertSession({
|
|
62
|
+
uuid,
|
|
63
|
+
name: slugify(prompt),
|
|
64
|
+
renamed: false,
|
|
65
|
+
titled: false, // one-shots skip LLM titling — nothing should delay exit
|
|
66
|
+
cwd,
|
|
67
|
+
firstPrompt: prompt,
|
|
68
|
+
createdAt: now,
|
|
69
|
+
updatedAt: now,
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
break;
|
|
73
|
+
case 'text':
|
|
74
|
+
process.stdout.write(ev.delta);
|
|
75
|
+
break;
|
|
76
|
+
case 'tool':
|
|
77
|
+
console.error(muted(` ⚙ ${ev.name}`));
|
|
78
|
+
break;
|
|
79
|
+
case 'result':
|
|
80
|
+
exitCode = ev.ok ? 0 : 1;
|
|
81
|
+
console.error(dim(`(${ev.inputTokens}→${ev.outputTokens} tokens)`));
|
|
82
|
+
if (!ev.ok)
|
|
83
|
+
console.error(error('agent finished with an error result'));
|
|
84
|
+
break;
|
|
85
|
+
case 'error':
|
|
86
|
+
console.error('');
|
|
87
|
+
console.error(error(`agent error: ${ev.message}`));
|
|
88
|
+
process.exit(1);
|
|
89
89
|
}
|
|
90
90
|
}
|
|
91
91
|
if (uuid)
|
package/dist/oneShot.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oneShot.js","sourceRoot":"","sources":["../src/oneShot.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"oneShot.js","sourceRoot":"","sources":["../src/oneShot.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,WAAW,EAEX,UAAU,EACV,OAAO,EACP,YAAY,EACZ,aAAa,EACb,oBAAoB,GACrB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAElE;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,OAAO,CAC3B,GAAW,EACX,MAAc,EACd,QAAkB,EAClB,UAAmB,EACnB,WAAoB,EACpB,GAAa;IAEb,MAAM,IAAI,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;IAEnC,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QACzB,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAClB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,yDAAyD,CAAC,CAAC,CAAC;QAChF,OAAO,CAAC,KAAK,CAAC,gBAAgB,MAAM,CAAC,6CAA6C,CAAC,EAAE,CAAC,CAAC;QACvF,OAAO,CAAC,KAAK,CAAC,4CAA4C,MAAM,CAAC,iCAAiC,CAAC,EAAE,CAAC,CAAC;QACvG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,IAAI,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;QACjC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,kDAAkD,CAAC,CAAC,CAAC;IACzE,CAAC;IAED,qFAAqF;IACrF,uFAAuF;IACvF,sFAAsF;IACtF,IAAI,MAAM,GAAmD,IAAI,CAAC;IAClE,IAAI,CAAC;QACH,MAAM,GAAG,oBAAoB,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;IAClD,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,8BAA+B,CAAW,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAC3E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;QACtB,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,MAAM,CAAC,IAAI,kBAAkB,CAAC,CAAC,CAAC;QACjE,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,6DAA6D,CAAC,CAAC,CAAC;YACpF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,gDAAgD,CAAC,CAAC,CAAC;IACvE,CAAC;IAED,IAAI,UAA8B,CAAC;IACnC,IAAI,UAAU,EAAE,CAAC;QACf,MAAM,GAAG,GAAG,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;QACxC,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,6BAA6B,UAAU,iBAAiB,CAAC,CAAC,CAAC;YAC/E,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,6CAA6C,CAAC,CAAC,CAAC;YAClE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,UAAU,GAAG,GAAG,CAAC,IAAI,CAAC;QACtB,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,aAAa,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;IAC/C,CAAC;IAED,iFAAiF;IACjF,+DAA+D;IAC/D,MAAM,OAAO,GAAG,aAAa,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,eAAe,EAAE,GAAG,KAAK,IAAI,EAAE,CAAC,CAAC;IAEvG,IAAI,IAAI,GAAkB,UAAU,IAAI,IAAI,CAAC;IAC7C,IAAI,QAAQ,GAAG,CAAC,CAAC;IAEjB,IAAI,KAAK,EAAE,MAAM,EAAE,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QAC5C,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC;YAChB,KAAK,SAAS;gBACZ,IAAI,CAAC,IAAI,EAAE,CAAC;oBACV,IAAI,GAAG,EAAE,CAAC,SAAS,CAAC;oBACpB,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;oBACrC,aAAa,CAAC;wBACZ,IAAI;wBACJ,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC;wBACrB,OAAO,EAAE,KAAK;wBACd,MAAM,EAAE,KAAK,EAAE,yDAAyD;wBACxE,GAAG;wBACH,WAAW,EAAE,MAAM;wBACnB,SAAS,EAAE,GAAG;wBACd,SAAS,EAAE,GAAG;qBACf,CAAC,CAAC;gBACL,CAAC;gBACD,MAAM;YACR,KAAK,MAAM;gBACT,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;gBAC/B,MAAM;YACR,KAAK,MAAM;gBACT,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;gBACvC,MAAM;YACR,KAAK,QAAQ;gBACX,QAAQ,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBACzB,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,WAAW,IAAI,EAAE,CAAC,YAAY,UAAU,CAAC,CAAC,CAAC;gBACpE,IAAI,CAAC,EAAE,CAAC,EAAE;oBAAE,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAC,CAAC;gBACxE,MAAM;YACR,KAAK,OAAO;gBACV,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;gBAClB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,gBAAgB,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;gBACnD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,CAAC;IACH,CAAC;IAED,IAAI,IAAI;QAAE,YAAY,CAAC,IAAI,CAAC,CAAC;IAC7B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC3B,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AACzB,CAAC"}
|
package/dist/repl.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type AuthMode } from '
|
|
1
|
+
import { type AuthMode } from 'document360-engine';
|
|
2
2
|
export type ReplContext = {
|
|
3
3
|
cwd: string;
|
|
4
4
|
restartAgent: () => void;
|
|
@@ -7,4 +7,4 @@ export type ReplContext = {
|
|
|
7
7
|
/** Pause the REPL's readline while another stdin consumer (e.g. the /resume picker) runs. */
|
|
8
8
|
withPausedInput: <T>(fn: () => Promise<T>) => Promise<T>;
|
|
9
9
|
};
|
|
10
|
-
export declare function runRepl(cwd?: string, authMode?: AuthMode): Promise<void>;
|
|
10
|
+
export declare function runRepl(cwd?: string, authMode?: AuthMode, profileName?: string): Promise<void>;
|
package/dist/repl.js
CHANGED
|
@@ -1,11 +1,8 @@
|
|
|
1
1
|
import { createInterface } from 'node:readline/promises';
|
|
2
|
-
import {
|
|
2
|
+
import { createSession, resolveAuth, getSession, setTitle, slugify, touchSession, upsertSession, generateTitle, resolveActiveProfile, decodeJwtClaims, isExpired, loadTokens, } from 'document360-engine';
|
|
3
3
|
import { slashCommands, parseSlash } from './commands/index.js';
|
|
4
|
-
import {
|
|
5
|
-
|
|
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') {
|
|
4
|
+
import { accent, banner, dim, error, muted, ok, warn } from './lib/colors.js';
|
|
5
|
+
export async function runRepl(cwd = process.cwd(), authMode = 'auto', profileName) {
|
|
9
6
|
const auth = resolveAuth(authMode);
|
|
10
7
|
if (auth.kind === 'none') {
|
|
11
8
|
console.error('');
|
|
@@ -19,7 +16,7 @@ export async function runRepl(cwd = process.cwd(), authMode = 'auto') {
|
|
|
19
16
|
console.error('');
|
|
20
17
|
process.exit(2);
|
|
21
18
|
}
|
|
22
|
-
printWelcome(cwd);
|
|
19
|
+
printWelcome(cwd, profileName);
|
|
23
20
|
if (auth.kind === 'subscription') {
|
|
24
21
|
if (auth.stored) {
|
|
25
22
|
console.log(dim(' Using your Claude subscription (no API key set).'));
|
|
@@ -29,7 +26,8 @@ export async function runRepl(cwd = process.cwd(), authMode = 'auto') {
|
|
|
29
26
|
}
|
|
30
27
|
console.log('');
|
|
31
28
|
}
|
|
32
|
-
let
|
|
29
|
+
let allowProdWrites = false; // armed by /allow-prod for production profiles
|
|
30
|
+
let session = createSession({ cwd, profileName, allowProdWrites });
|
|
33
31
|
let tracker = { uuid: null, firstPrompt: null, titleFired: false };
|
|
34
32
|
const rl = createInterface({ input: process.stdin, output: process.stdout });
|
|
35
33
|
// Buffering line reader: readline's promise API drops lines that arrive while
|
|
@@ -69,8 +67,8 @@ export async function runRepl(cwd = process.cwd(), authMode = 'auto') {
|
|
|
69
67
|
const ctx = {
|
|
70
68
|
cwd,
|
|
71
69
|
restartAgent: () => {
|
|
72
|
-
session.
|
|
73
|
-
session =
|
|
70
|
+
session.close();
|
|
71
|
+
session = createSession({ cwd, profileName, allowProdWrites });
|
|
74
72
|
tracker = { uuid: null, firstPrompt: null, titleFired: false };
|
|
75
73
|
},
|
|
76
74
|
currentUuid: () => tracker.uuid,
|
|
@@ -109,9 +107,16 @@ export async function runRepl(cwd = process.cwd(), authMode = 'auto') {
|
|
|
109
107
|
ctx.restartAgent();
|
|
110
108
|
continue;
|
|
111
109
|
}
|
|
110
|
+
if (result.kind === 'allow-prod') {
|
|
111
|
+
allowProdWrites = true;
|
|
112
|
+
ctx.restartAgent();
|
|
113
|
+
console.log(ok('✓ Production writes authorized for this session.'));
|
|
114
|
+
console.log('');
|
|
115
|
+
continue;
|
|
116
|
+
}
|
|
112
117
|
if (result.kind === 'resume') {
|
|
113
|
-
session.
|
|
114
|
-
session =
|
|
118
|
+
session.close();
|
|
119
|
+
session = createSession({ cwd, resume: result.uuid, profileName, allowProdWrites });
|
|
115
120
|
const rec = getSession(result.uuid);
|
|
116
121
|
tracker = { uuid: result.uuid, firstPrompt: rec?.firstPrompt ?? null, titleFired: true };
|
|
117
122
|
touchSession(result.uuid);
|
|
@@ -122,30 +127,48 @@ export async function runRepl(cwd = process.cwd(), authMode = 'auto') {
|
|
|
122
127
|
if (result.kind === 'forward-to-agent') {
|
|
123
128
|
if (!tracker.firstPrompt)
|
|
124
129
|
tracker.firstPrompt = result.prompt;
|
|
125
|
-
session
|
|
126
|
-
await consumeUntilResult(session.iterator, auth, tracker, cwd);
|
|
130
|
+
await runTurn(session, result.prompt, auth, tracker, cwd);
|
|
127
131
|
}
|
|
128
132
|
continue;
|
|
129
133
|
}
|
|
130
134
|
if (!tracker.firstPrompt)
|
|
131
135
|
tracker.firstPrompt = trimmed;
|
|
132
|
-
session
|
|
133
|
-
await consumeUntilResult(session.iterator, auth, tracker, cwd);
|
|
136
|
+
await runTurn(session, trimmed, auth, tracker, cwd);
|
|
134
137
|
}
|
|
135
138
|
}
|
|
136
139
|
finally {
|
|
137
|
-
session.
|
|
140
|
+
session.close();
|
|
138
141
|
rl.close();
|
|
139
142
|
}
|
|
140
143
|
}
|
|
141
|
-
function printWelcome(cwd) {
|
|
144
|
+
function printWelcome(cwd, profileName) {
|
|
142
145
|
console.log('');
|
|
143
146
|
console.log(banner('document360-writer'));
|
|
144
147
|
console.log(dim(` cwd: ${cwd}`));
|
|
148
|
+
console.log(d360StatusLine(cwd, profileName));
|
|
145
149
|
console.log(dim(' Type a prompt, or /help for slash commands. /exit to quit.'));
|
|
146
150
|
console.log('');
|
|
147
151
|
}
|
|
148
|
-
|
|
152
|
+
function d360StatusLine(cwd, profileName) {
|
|
153
|
+
try {
|
|
154
|
+
const active = resolveActiveProfile(cwd, profileName);
|
|
155
|
+
const prod = active.production ? warn(' ⚠ PRODUCTION') : '';
|
|
156
|
+
const tokens = loadTokens(active.name);
|
|
157
|
+
if (!tokens) {
|
|
158
|
+
return dim(` Document360: profile "${active.name}"${prod} — not logged in (d360-writer login)`);
|
|
159
|
+
}
|
|
160
|
+
const claims = { ...(decodeJwtClaims(tokens.idToken) ?? {}), ...(decodeJwtClaims(tokens.accessToken) ?? {}) };
|
|
161
|
+
const who = (claims['email'] ?? claims['preferred_username'] ?? 'signed in');
|
|
162
|
+
if (isExpired(tokens) && !tokens.refreshToken) {
|
|
163
|
+
return warn(` Document360: profile "${active.name}"${prod} — session expired (d360-writer login)`);
|
|
164
|
+
}
|
|
165
|
+
return dim(` Document360: ${who} · profile "${active.name}"${prod}`);
|
|
166
|
+
}
|
|
167
|
+
catch (e) {
|
|
168
|
+
// Old-shape/invalid config — surface the migration hint.
|
|
169
|
+
return dim(` Document360: ${e.message.split('.')[0]}`);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
149
172
|
function printSignInHelp() {
|
|
150
173
|
console.error('');
|
|
151
174
|
console.error(`Sign in with your Claude subscription: run ${accent('claude')} once, then retry.`);
|
|
@@ -181,74 +204,41 @@ function fireTitleGeneration(tracker, cwd) {
|
|
|
181
204
|
})
|
|
182
205
|
.catch(() => { });
|
|
183
206
|
}
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
if (
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
207
|
+
/** Drive one user turn through the engine, rendering EngineEvents to the terminal. */
|
|
208
|
+
async function runTurn(session, text, auth, tracker, cwd) {
|
|
209
|
+
for await (const ev of session.send(text)) {
|
|
210
|
+
renderEvent(ev, tracker, cwd, auth);
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
function renderEvent(ev, tracker, cwd, auth) {
|
|
214
|
+
switch (ev.type) {
|
|
215
|
+
case 'session':
|
|
216
|
+
if (!tracker.uuid)
|
|
217
|
+
registerSession(tracker, ev.sessionId, cwd);
|
|
218
|
+
break;
|
|
219
|
+
case 'text':
|
|
220
|
+
process.stdout.write(ev.delta);
|
|
221
|
+
break;
|
|
222
|
+
case 'tool':
|
|
223
|
+
process.stdout.write('\n');
|
|
224
|
+
console.log(muted(` ⚙ ${ev.name}`));
|
|
225
|
+
break;
|
|
226
|
+
case 'result':
|
|
227
|
+
process.stdout.write('\n');
|
|
228
|
+
console.log(dim(` (${ev.inputTokens}→${ev.outputTokens} tokens)`));
|
|
229
|
+
console.log('');
|
|
205
230
|
if (tracker.uuid) {
|
|
206
231
|
touchSession(tracker.uuid);
|
|
207
232
|
if (!tracker.titleFired)
|
|
208
233
|
fireTitleGeneration(tracker, cwd);
|
|
209
234
|
}
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
const msg = raw;
|
|
218
|
-
if (msg.type === 'stream_event') {
|
|
219
|
-
const event = msg.event;
|
|
220
|
-
if (event?.delta && typeof event.delta.text === 'string') {
|
|
221
|
-
process.stdout.write(event.delta.text);
|
|
222
|
-
}
|
|
223
|
-
return false;
|
|
224
|
-
}
|
|
225
|
-
if (msg.type === 'assistant') {
|
|
226
|
-
const message = msg.message;
|
|
227
|
-
const blocks = message?.content ?? [];
|
|
228
|
-
let printedNewline = false;
|
|
229
|
-
for (const block of blocks) {
|
|
230
|
-
const b = block;
|
|
231
|
-
if (b.type === 'tool_use') {
|
|
232
|
-
if (!printedNewline) {
|
|
233
|
-
process.stdout.write('\n');
|
|
234
|
-
printedNewline = true;
|
|
235
|
-
}
|
|
236
|
-
console.log(muted(` ⚙ ${b.name ?? 'tool'}`));
|
|
237
|
-
}
|
|
238
|
-
}
|
|
239
|
-
return false;
|
|
240
|
-
}
|
|
241
|
-
if (msg.type === 'result') {
|
|
242
|
-
const result = msg;
|
|
243
|
-
process.stdout.write('\n');
|
|
244
|
-
if (result.usage) {
|
|
245
|
-
const inT = result.usage.input_tokens ?? 0;
|
|
246
|
-
const outT = result.usage.output_tokens ?? 0;
|
|
247
|
-
console.log(dim(` (${inT}→${outT} tokens)`));
|
|
248
|
-
}
|
|
249
|
-
console.log('');
|
|
250
|
-
return true;
|
|
235
|
+
break;
|
|
236
|
+
case 'error':
|
|
237
|
+
console.error('');
|
|
238
|
+
console.error(error(`agent error: ${ev.message}`));
|
|
239
|
+
if (auth.kind === 'subscription' && ev.kind === 'auth')
|
|
240
|
+
printSignInHelp();
|
|
241
|
+
break;
|
|
251
242
|
}
|
|
252
|
-
return false;
|
|
253
243
|
}
|
|
254
244
|
//# sourceMappingURL=repl.js.map
|
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,
|
|
1
|
+
{"version":3,"file":"repl.js","sourceRoot":"","sources":["../src/repl.ts"],"names":[],"mappings":"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"}
|