document360-writer 0.2.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.js +65 -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 -1
- package/dist/commands/help.js.map +1 -1
- package/dist/commands/index.d.ts +2 -0
- package/dist/commands/index.js +4 -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 +24 -4
- 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/d360/authCli.d.ts +10 -0
- package/dist/d360/authCli.js +91 -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/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 +413 -0
- package/dist/tui/App.js.map +1 -0
- package/dist/tui/catalog.d.ts +8 -0
- package/dist/tui/catalog.js +20 -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
package/dist/cli.js
CHANGED
|
@@ -1,12 +1,65 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { Command } from 'commander';
|
|
3
3
|
import { createRequire } from 'node:module';
|
|
4
|
-
import { AUTH_MODES } from '
|
|
4
|
+
import { AUTH_MODES } from 'document360-engine';
|
|
5
|
+
import { runLogin, runLogout, runWhoami } from './d360/authCli.js';
|
|
6
|
+
import { runProfileList, runProfileShow, runProfileUse } from './d360/profileCli.js';
|
|
5
7
|
import { runOnce } from './oneShot.js';
|
|
6
8
|
import { runRepl } from './repl.js';
|
|
9
|
+
import { runTui } from './tui/index.js';
|
|
7
10
|
const require = createRequire(import.meta.url);
|
|
8
11
|
const pkg = require('../package.json');
|
|
9
12
|
const program = new Command();
|
|
13
|
+
// --env was the old per-environment flag; it's now --profile. Catch it with a clear nudge.
|
|
14
|
+
function rejectLegacyEnv(opts) {
|
|
15
|
+
if (opts.env) {
|
|
16
|
+
console.error('✗ --env was replaced by --profile (connection profiles). Use: --profile <name>');
|
|
17
|
+
process.exit(2);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
program
|
|
21
|
+
.command('login')
|
|
22
|
+
.description('Sign in to Document360 (browser OAuth; project chosen during login)')
|
|
23
|
+
.option('--profile <name>', 'Connection profile (defaults to the repo\'s defaultProfile)')
|
|
24
|
+
.option('--env <name>', false) // hidden legacy catch
|
|
25
|
+
.option('--manual', 'No local listener — paste the redirect URL instead (SSH/locked-down setups)')
|
|
26
|
+
.action(async (opts) => {
|
|
27
|
+
rejectLegacyEnv(opts);
|
|
28
|
+
await runLogin({ profile: opts.profile, manual: opts.manual });
|
|
29
|
+
});
|
|
30
|
+
program
|
|
31
|
+
.command('logout')
|
|
32
|
+
.description('Remove the stored Document360 session')
|
|
33
|
+
.option('--profile <name>', 'Connection profile')
|
|
34
|
+
.option('--env <name>', false)
|
|
35
|
+
.action(async (opts) => {
|
|
36
|
+
rejectLegacyEnv(opts);
|
|
37
|
+
await runLogout({ profile: opts.profile });
|
|
38
|
+
});
|
|
39
|
+
program
|
|
40
|
+
.command('whoami')
|
|
41
|
+
.description('Show the current Document360 identity (refreshes if expired)')
|
|
42
|
+
.option('--profile <name>', 'Connection profile')
|
|
43
|
+
.option('--env <name>', false)
|
|
44
|
+
.action(async (opts) => {
|
|
45
|
+
rejectLegacyEnv(opts);
|
|
46
|
+
await runWhoami({ profile: opts.profile });
|
|
47
|
+
});
|
|
48
|
+
// Profile subcommands act on the current repo (like `git config`). No --cwd: commander's
|
|
49
|
+
// default-subcommand option routing is unreliable, and these are always run in-repo.
|
|
50
|
+
const profileCmd = program.command('profile').description('Manage connection profiles for the current repo');
|
|
51
|
+
profileCmd
|
|
52
|
+
.command('list', { isDefault: true })
|
|
53
|
+
.description('List profiles (● = default)')
|
|
54
|
+
.action(() => runProfileList(process.cwd()));
|
|
55
|
+
profileCmd
|
|
56
|
+
.command('use <name>')
|
|
57
|
+
.description('Set the default profile for this repo')
|
|
58
|
+
.action(name => runProfileUse(process.cwd(), name));
|
|
59
|
+
profileCmd
|
|
60
|
+
.command('show [name]')
|
|
61
|
+
.description('Print the resolved profile (connection + project)')
|
|
62
|
+
.action(name => runProfileShow(process.cwd(), name));
|
|
10
63
|
program
|
|
11
64
|
.name('d360-writer')
|
|
12
65
|
.description('Standalone documentation agent CLI. Reads your code, writes your docs.')
|
|
@@ -15,6 +68,9 @@ program
|
|
|
15
68
|
.option('-r, --resume <name>', 'Resume a saved session (with --prompt; use /resume inside the REPL)')
|
|
16
69
|
.option('-C, --cwd <dir>', 'Working directory', process.cwd())
|
|
17
70
|
.option('--auth <mode>', 'Auth mode: auto | api | subscription', 'auto')
|
|
71
|
+
.option('--profile <name>', 'Connection profile (defaults to the repo\'s defaultProfile)')
|
|
72
|
+
.option('--yes', 'Skip the production write confirmation (for one-shot/CI)')
|
|
73
|
+
.option('--classic', 'Use the plain readline REPL instead of the Ink TUI')
|
|
18
74
|
.action(async (opts) => {
|
|
19
75
|
if (!AUTH_MODES.includes(opts.auth)) {
|
|
20
76
|
console.error(`✗ Invalid --auth mode: ${opts.auth}`);
|
|
@@ -22,14 +78,20 @@ program
|
|
|
22
78
|
process.exit(2);
|
|
23
79
|
}
|
|
24
80
|
if (opts.prompt) {
|
|
25
|
-
await runOnce(opts.cwd, opts.prompt, opts.auth, opts.resume);
|
|
81
|
+
await runOnce(opts.cwd, opts.prompt, opts.auth, opts.resume, opts.profile, opts.yes);
|
|
26
82
|
return;
|
|
27
83
|
}
|
|
28
84
|
if (opts.resume) {
|
|
29
85
|
console.error('✗ --resume requires --prompt. In the interactive REPL, use /resume instead.');
|
|
30
86
|
process.exit(2);
|
|
31
87
|
}
|
|
32
|
-
|
|
88
|
+
// Interactive TTY → Ink TUI; non-TTY (piped) or --classic → readline REPL.
|
|
89
|
+
if (opts.classic || !process.stdin.isTTY) {
|
|
90
|
+
await runRepl(opts.cwd, opts.auth, opts.profile);
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
await runTui(opts.cwd, opts.auth, opts.profile, pkg.version);
|
|
94
|
+
}
|
|
33
95
|
});
|
|
34
96
|
program.parseAsync(process.argv).catch(err => {
|
|
35
97
|
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,UAAU,EAAiB,MAAM,
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { resolveActiveProfile } from 'document360-engine';
|
|
2
|
+
import { dim, warn } from '../lib/colors.js';
|
|
3
|
+
export async function allowProdCommand(_args, ctx) {
|
|
4
|
+
let production = false;
|
|
5
|
+
try {
|
|
6
|
+
production = resolveActiveProfile(ctx.cwd).production;
|
|
7
|
+
}
|
|
8
|
+
catch {
|
|
9
|
+
/* no profile — nothing to allow */
|
|
10
|
+
}
|
|
11
|
+
if (!production) {
|
|
12
|
+
console.log(dim('Current profile is not a production profile — writes are already allowed.'));
|
|
13
|
+
return { kind: 'continue' };
|
|
14
|
+
}
|
|
15
|
+
console.log(warn('⚠ Authorizing writes to the PRODUCTION profile for this session.'));
|
|
16
|
+
return { kind: 'allow-prod' };
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=allowProd.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"allowProd.js","sourceRoot":"","sources":["../../src/commands/allowProd.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAI7C,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,KAAe,EAAE,GAAgB;IACtE,IAAI,UAAU,GAAG,KAAK,CAAC;IACvB,IAAI,CAAC;QACH,UAAU,GAAG,oBAAoB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,UAAU,CAAC;IACxD,CAAC;IAAC,MAAM,CAAC;QACP,mCAAmC;IACrC,CAAC;IACD,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,2EAA2E,CAAC,CAAC,CAAC;QAC9F,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;IAC9B,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,kEAAkE,CAAC,CAAC,CAAC;IACtF,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;AAChC,CAAC"}
|
package/dist/commands/clear.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { dim } from '../lib/colors.js';
|
|
2
|
-
import { getSession } from '
|
|
2
|
+
import { getSession } from 'document360-engine';
|
|
3
3
|
export async function clearCommand(_args, ctx) {
|
|
4
4
|
const uuid = ctx.currentUuid();
|
|
5
5
|
const prev = uuid ? getSession(uuid) : undefined;
|
|
@@ -1 +1 @@
|
|
|
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,
|
|
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,oBAAoB,CAAC;AAIhD,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,KAAe,EAAE,GAAgB;IAClE,MAAM,IAAI,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC;IAC/B,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACjD,IAAI,IAAI,EAAE,CAAC;QACT,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,4BAA4B,IAAI,CAAC,IAAI,qCAAqC,CAAC,CAAC,CAAC;IAC/F,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,sEAAsE,CAAC,CAAC,CAAC;IAC3F,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;AAC3B,CAAC"}
|
package/dist/commands/help.js
CHANGED
|
@@ -6,7 +6,7 @@ export async function helpCommand() {
|
|
|
6
6
|
'',
|
|
7
7
|
` ${accent('/help')} ${dim('Show this help')}`,
|
|
8
8
|
` ${accent('/init')} ${dim('Scaffold .d360-writer.json in this repo')}`,
|
|
9
|
-
` ${accent('/mcp add <name> <type> <ref>')} ${dim('Register an MCP server (stdio|http|sse)')}`,
|
|
9
|
+
` ${accent('/mcp add <name> <type> <ref>')} ${dim('Register an MCP server (stdio|http|sse; -H key:value for auth)')}`,
|
|
10
10
|
` ${accent('/mcp list')} ${dim('Show registered MCP servers')}`,
|
|
11
11
|
` ${accent('/mcp remove <name>')} ${dim('Unregister an MCP server')}`,
|
|
12
12
|
` ${accent('/publish <article-path>')} ${dim('Publish one article to Document360')}`,
|
|
@@ -14,6 +14,8 @@ export async function helpCommand() {
|
|
|
14
14
|
` ${accent('/screenshot <id>')} ${dim('Emit a document360-capture-compatible spec')}`,
|
|
15
15
|
` ${accent('/resume [name]')} ${dim('Resume a session (no arg: searchable picker)')}`,
|
|
16
16
|
` ${accent('/rename <name>')} ${dim('Name the current session')}`,
|
|
17
|
+
` ${accent('/profile [name]')} ${dim('Show profiles, or switch + restart agent')}`,
|
|
18
|
+
` ${accent('/allow-prod')} ${dim('Authorize writes to a production profile (this session)')}`,
|
|
17
19
|
` ${accent('/clear')} ${dim('Reset conversation')}`,
|
|
18
20
|
` ${accent('/exit')} ${dim('Quit')}`,
|
|
19
21
|
'',
|
|
@@ -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,
|
|
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,gEAAgE,CAAC,EAAE;QAC5H,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,iBAAiB,CAAC,uBAAuB,GAAG,CAAC,0CAA0C,CAAC,EAAE;QACtG,KAAK,MAAM,CAAC,aAAa,CAAC,2BAA2B,GAAG,CAAC,yDAAyD,CAAC,EAAE;QACrH,KAAK,MAAM,CAAC,QAAQ,CAAC,gCAAgC,GAAG,CAAC,oBAAoB,CAAC,EAAE;QAChF,KAAK,MAAM,CAAC,OAAO,CAAC,iCAAiC,GAAG,CAAC,MAAM,CAAC,EAAE;QAClE,EAAE;QACF,GAAG,CAAC,oDAAoD,CAAC;QACzD,EAAE;KACH,CAAC;IACF,KAAK,MAAM,CAAC,IAAI,KAAK;QAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACtC,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;AAC9B,CAAC"}
|
package/dist/commands/index.d.ts
CHANGED
package/dist/commands/index.js
CHANGED
|
@@ -7,6 +7,8 @@ import { publishCommand } from './publish.js';
|
|
|
7
7
|
import { auditCommand } from './audit.js';
|
|
8
8
|
import { resumeCommand } from './resume.js';
|
|
9
9
|
import { renameCommand } from './rename.js';
|
|
10
|
+
import { profileCommand } from './profile.js';
|
|
11
|
+
import { allowProdCommand } from './allowProd.js';
|
|
10
12
|
import { screenshotCommand } from './screenshot.js';
|
|
11
13
|
export const slashCommands = {
|
|
12
14
|
help: helpCommand,
|
|
@@ -20,6 +22,8 @@ export const slashCommands = {
|
|
|
20
22
|
audit: auditCommand,
|
|
21
23
|
resume: resumeCommand,
|
|
22
24
|
rename: renameCommand,
|
|
25
|
+
profile: profileCommand,
|
|
26
|
+
'allow-prod': allowProdCommand,
|
|
23
27
|
screenshot: screenshotCommand,
|
|
24
28
|
};
|
|
25
29
|
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,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,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,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAapD,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,OAAO,EAAE,cAAc;IACvB,YAAY,EAAE,gBAAgB;IAC9B,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"}
|
package/dist/commands/init.js
CHANGED
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
import { input, confirm } from '@inquirer/prompts';
|
|
2
2
|
import { basename, join } from 'node:path';
|
|
3
3
|
import { existsSync, readFileSync } from 'node:fs';
|
|
4
|
-
import { writeProjectConfig, readProjectConfig } from '
|
|
5
|
-
import { projectConfigPath } from '../lib/paths.js';
|
|
4
|
+
import { writeProjectConfig, readProjectConfig, projectConfigPath } from 'document360-engine';
|
|
6
5
|
import { ok, dim, accent } from '../lib/colors.js';
|
|
7
6
|
export async function initCommand() {
|
|
8
7
|
const cwd = process.cwd();
|
|
@@ -30,27 +29,26 @@ export async function initCommand() {
|
|
|
30
29
|
message: 'Screenshot output directory:',
|
|
31
30
|
default: 'user-docs/_screenshots',
|
|
32
31
|
});
|
|
33
|
-
const
|
|
34
|
-
message: '
|
|
35
|
-
default: '',
|
|
32
|
+
const profileName = await input({
|
|
33
|
+
message: 'Default connection profile name:',
|
|
34
|
+
default: 'berlin',
|
|
36
35
|
});
|
|
37
|
-
const
|
|
38
|
-
message: 'Document360
|
|
39
|
-
default: '',
|
|
40
|
-
});
|
|
41
|
-
const helpCenterBaseUrl = await input({
|
|
42
|
-
message: 'Document360 help-center base URL (e.g. https://<tenant>.document360.io/docs/):',
|
|
43
|
-
default: '',
|
|
36
|
+
const environment = await input({
|
|
37
|
+
message: 'Document360 environment for this profile (baked preset):',
|
|
38
|
+
default: 'berlin',
|
|
44
39
|
});
|
|
45
40
|
const cfg = {
|
|
46
41
|
projectId,
|
|
47
42
|
captureDir,
|
|
48
43
|
outputDir,
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
44
|
+
profiles: {
|
|
45
|
+
[profileName]: {
|
|
46
|
+
connection: { environment },
|
|
47
|
+
// project.projectId is auto-filled by `d360-writer login` (project_select).
|
|
48
|
+
production: false,
|
|
49
|
+
},
|
|
53
50
|
},
|
|
51
|
+
defaultProfile: profileName,
|
|
54
52
|
authoritativeSourceFiles: defaultSourceFiles(cwd),
|
|
55
53
|
};
|
|
56
54
|
const existing = readProjectConfig(cwd);
|
|
@@ -61,7 +59,7 @@ export async function initCommand() {
|
|
|
61
59
|
console.log(ok(`✓ Wrote ${path}`));
|
|
62
60
|
console.log('');
|
|
63
61
|
console.log('Next:');
|
|
64
|
-
console.log(` ${accent('
|
|
62
|
+
console.log(` ${accent(`d360-writer login --profile ${profileName}`)} ${dim('(sign in; pick the project)')}`);
|
|
65
63
|
console.log(` Then ask the agent: "analyze this repo and propose a docs structure"`);
|
|
66
64
|
console.log('');
|
|
67
65
|
return { kind: 'continue' };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/mcp.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { readMcpConfig, writeMcpConfig } from '
|
|
1
|
+
import { readMcpConfig, writeMcpConfig } from 'document360-engine';
|
|
2
2
|
import { accent, dim, error, ok, warn } from '../lib/colors.js';
|
|
3
3
|
export async function mcpCommand(args) {
|
|
4
4
|
const sub = (args[0] ?? '').toLowerCase();
|
|
@@ -33,7 +33,9 @@ function listServers() {
|
|
|
33
33
|
console.log(` ${accent(name)} ${dim('(stdio)')} ${e.command} ${(e.args ?? []).join(' ')}`);
|
|
34
34
|
}
|
|
35
35
|
else {
|
|
36
|
-
|
|
36
|
+
const headerNames = Object.keys(e.headers ?? {});
|
|
37
|
+
const headerNote = headerNames.length > 0 ? dim(` [headers: ${headerNames.join(', ')}]`) : '';
|
|
38
|
+
console.log(` ${accent(name)} ${dim(`(${e.type})`)} ${e.url}${headerNote}`);
|
|
37
39
|
}
|
|
38
40
|
}
|
|
39
41
|
console.log('');
|
|
@@ -41,7 +43,7 @@ function listServers() {
|
|
|
41
43
|
function addServer(args) {
|
|
42
44
|
const [name, type, ...rest] = args;
|
|
43
45
|
if (!name || !type || rest.length === 0) {
|
|
44
|
-
console.log(error('Usage: /mcp add <name> <stdio|http|sse> <command-or-url> [args...]'));
|
|
46
|
+
console.log(error('Usage: /mcp add <name> <stdio|http|sse> <command-or-url> [args...] [-H key:value ...]'));
|
|
45
47
|
return;
|
|
46
48
|
}
|
|
47
49
|
if (type !== 'stdio' && type !== 'http' && type !== 'sse') {
|
|
@@ -54,7 +56,25 @@ function addServer(args) {
|
|
|
54
56
|
entry = { type: 'stdio', command: rest[0], args: rest.slice(1) };
|
|
55
57
|
}
|
|
56
58
|
else {
|
|
57
|
-
|
|
59
|
+
// Headers: -H key:value (or key=value), repeatable. Must be a single token —
|
|
60
|
+
// the REPL splits on whitespace, so no spaces around the separator.
|
|
61
|
+
const headers = {};
|
|
62
|
+
for (let i = 1; i < rest.length; i++) {
|
|
63
|
+
if (rest[i] === '-H' || rest[i] === '--header') {
|
|
64
|
+
const kv = rest[++i];
|
|
65
|
+
const m = kv?.match(/^([^:=]+)[:=](.+)$/);
|
|
66
|
+
if (!m) {
|
|
67
|
+
console.log(error(`-H expects key:value (no spaces). Got: ${kv ?? '(nothing)'}`));
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
headers[m[1].trim()] = m[2].trim();
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
console.log(error(`Unexpected argument: ${rest[i]}. After the URL, only -H key:value is allowed.`));
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
entry = { type, url: rest[0], headers: Object.keys(headers).length > 0 ? headers : undefined };
|
|
58
78
|
}
|
|
59
79
|
cfg.servers[name] = entry;
|
|
60
80
|
writeMcpConfig(cfg);
|
package/dist/commands/mcp.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../src/commands/mcp.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,cAAc,EAAuB,MAAM,
|
|
1
|
+
{"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../src/commands/mcp.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { runProfileList, runProfileUse, runProfileShow } from '../d360/profileCli.js';
|
|
2
|
+
import { dim } from '../lib/colors.js';
|
|
3
|
+
export async function profileCommand(args, ctx) {
|
|
4
|
+
const name = args[0];
|
|
5
|
+
if (!name) {
|
|
6
|
+
runProfileList(ctx.cwd);
|
|
7
|
+
return { kind: 'continue' };
|
|
8
|
+
}
|
|
9
|
+
// /profile <name> switches the default profile and restarts the agent so the
|
|
10
|
+
// in-process D360 tools rebind to the new connection/project.
|
|
11
|
+
runProfileUse(ctx.cwd, name);
|
|
12
|
+
runProfileShow(ctx.cwd, name);
|
|
13
|
+
console.log(dim(' Restarting agent for the new profile…'));
|
|
14
|
+
return { kind: 'clear' }; // clear → restartAgent in the REPL loop
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=profile.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profile.js","sourceRoot":"","sources":["../../src/commands/profile.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACtF,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AAIvC,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAAc,EAAE,GAAgB;IACnE,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACrB,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACxB,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;IAC9B,CAAC;IACD,6EAA6E;IAC7E,8DAA8D;IAC9D,aAAa,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAC7B,cAAc,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAC9B,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC,CAAC;IAC5D,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,wCAAwC;AACpE,CAAC"}
|
package/dist/commands/rename.js
CHANGED
|
@@ -1 +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,
|
|
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,oBAAoB,CAAC;AAInD,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"}
|
package/dist/commands/resume.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { search } from '@inquirer/prompts';
|
|
2
2
|
import { accent, dim, error } from '../lib/colors.js';
|
|
3
|
-
import { findByName, getSession, listSessions, relativeTime } from '
|
|
3
|
+
import { findByName, getSession, listSessions, relativeTime } from 'document360-engine';
|
|
4
4
|
export async function resumeCommand(args, ctx) {
|
|
5
5
|
const sessions = listSessions(ctx.cwd).filter(s => s.uuid !== ctx.currentUuid());
|
|
6
6
|
if (sessions.length === 0) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resume.js","sourceRoot":"","sources":["../../src/commands/resume.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,YAAY,EAAE,YAAY,EAAsB,MAAM,
|
|
1
|
+
{"version":3,"file":"resume.js","sourceRoot":"","sources":["../../src/commands/resume.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export declare function runLogin(opts: {
|
|
2
|
+
profile?: string;
|
|
3
|
+
manual?: boolean;
|
|
4
|
+
}): Promise<void>;
|
|
5
|
+
export declare function runWhoami(opts: {
|
|
6
|
+
profile?: string;
|
|
7
|
+
}): Promise<void>;
|
|
8
|
+
export declare function runLogout(opts: {
|
|
9
|
+
profile?: string;
|
|
10
|
+
}): Promise<void>;
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { input } from '@inquirer/prompts';
|
|
2
|
+
import { loginPkce, refreshTokens, toStoredTokens, clearTokens, decodeJwtClaims, isExpired, loadTokens, saveTokens, resolveActiveProfile, setProfileProject, } from 'document360-engine';
|
|
3
|
+
import { accent, dim, error, ok, warn } from '../lib/colors.js';
|
|
4
|
+
function allClaims(tokens) {
|
|
5
|
+
// Merge id + access claims — email/name may live in either (berlin puts them in both,
|
|
6
|
+
// but the access token is the one guaranteed present).
|
|
7
|
+
return { ...(decodeJwtClaims(tokens.idToken) ?? {}), ...(decodeJwtClaims(tokens.accessToken) ?? {}) };
|
|
8
|
+
}
|
|
9
|
+
function identityLine(tokens) {
|
|
10
|
+
const claims = allClaims(tokens);
|
|
11
|
+
const who = (claims['email'] ?? claims['preferred_username'] ?? claims['sub'] ?? 'unknown');
|
|
12
|
+
const project = claims['doc360_project_id'] ? ` · project ${claims['doc360_project_id']}` : '';
|
|
13
|
+
return `${who}${project}`;
|
|
14
|
+
}
|
|
15
|
+
export async function runLogin(opts) {
|
|
16
|
+
const active = resolveActiveProfile(process.cwd(), opts.profile);
|
|
17
|
+
const env = active.connection;
|
|
18
|
+
console.log(dim(`Profile "${active.name}" → ${env.name} (${env.apiUrl})${active.production ? ' ⚠ PRODUCTION' : ''}`));
|
|
19
|
+
const tokenResponse = await loginPkce(env, { manual: opts.manual, promptForRedirect: msg => input({ message: msg }) }, line => console.log(line));
|
|
20
|
+
const tokens = toStoredTokens(active.name, tokenResponse);
|
|
21
|
+
saveTokens(tokens);
|
|
22
|
+
// Auto-fill the project chosen during login into the active profile (only when a
|
|
23
|
+
// config exists and the profile doesn't already pin a project).
|
|
24
|
+
maybePersistProject(tokens, active.name);
|
|
25
|
+
console.log('');
|
|
26
|
+
console.log(ok(`✓ Logged in to "${active.name}" as ${identityLine(tokens)}`));
|
|
27
|
+
console.log(dim(` access token expires: ${tokens.expiresAt}`));
|
|
28
|
+
console.log(dim(` refresh token: ${tokens.refreshToken ? 'yes' : 'NO — session ends at expiry'}`));
|
|
29
|
+
}
|
|
30
|
+
function maybePersistProject(tokens, profileName) {
|
|
31
|
+
const claims = allClaims(tokens);
|
|
32
|
+
const projectId = claims['doc360_project_id'];
|
|
33
|
+
if (typeof projectId !== 'string' || !projectId)
|
|
34
|
+
return;
|
|
35
|
+
// setProfileProject is a no-op when there's no config or the profile is unknown,
|
|
36
|
+
// and we only fill when the slot is empty — never clobber an explicit choice.
|
|
37
|
+
try {
|
|
38
|
+
const active = resolveActiveProfile(process.cwd(), profileName);
|
|
39
|
+
if (active.project.projectId)
|
|
40
|
+
return;
|
|
41
|
+
setProfileProject(process.cwd(), profileName, { projectId });
|
|
42
|
+
console.log(dim(` Project ${projectId} written to profile "${profileName}".`));
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
/* no config / old-shape — nothing to persist into */
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
export async function runWhoami(opts) {
|
|
49
|
+
const active = resolveActiveProfile(process.cwd(), opts.profile);
|
|
50
|
+
const env = active.connection;
|
|
51
|
+
const tokens = loadTokens(active.name);
|
|
52
|
+
if (!tokens) {
|
|
53
|
+
console.log(error(`Not logged in to Document360 (profile "${active.name}").`));
|
|
54
|
+
console.log(dim(`Run: d360-writer login --profile ${active.name}`));
|
|
55
|
+
process.exitCode = 1;
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
console.log(`Profile ${accent(active.name)}${active.production ? ' ⚠ PRODUCTION' : ''}: ${identityLine(tokens)}`);
|
|
59
|
+
if (isExpired(tokens)) {
|
|
60
|
+
if (tokens.refreshToken) {
|
|
61
|
+
try {
|
|
62
|
+
const refreshed = toStoredTokens(active.name, await refreshTokens(env, tokens.refreshToken));
|
|
63
|
+
saveTokens(refreshed);
|
|
64
|
+
console.log(ok(`✓ Session refreshed — expires ${refreshed.expiresAt}`));
|
|
65
|
+
}
|
|
66
|
+
catch (err) {
|
|
67
|
+
console.log(warn(`Session expired and refresh failed (${err.message.slice(0, 120)})`));
|
|
68
|
+
console.log(dim(`Run: d360-writer login --profile ${active.name}`));
|
|
69
|
+
process.exitCode = 1;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
console.log(warn('Session expired (no refresh token).'));
|
|
74
|
+
console.log(dim(`Run: d360-writer login --profile ${active.name}`));
|
|
75
|
+
process.exitCode = 1;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
console.log(dim(` expires: ${tokens.expiresAt}`));
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
export async function runLogout(opts) {
|
|
83
|
+
const active = resolveActiveProfile(process.cwd(), opts.profile);
|
|
84
|
+
if (clearTokens(active.name)) {
|
|
85
|
+
console.log(ok(`✓ Logged out of Document360 (profile "${active.name}").`));
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
console.log(dim(`No Document360 session for profile "${active.name}" — nothing to do.`));
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=authCli.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authCli.js","sourceRoot":"","sources":["../../src/d360/authCli.ts"],"names":[],"mappings":"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"}
|
|
@@ -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
|