orbitmap 0.1.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/LICENSE +21 -0
- package/README.md +200 -0
- package/dist/api-client.d.ts +234 -0
- package/dist/api-client.js +401 -0
- package/dist/api-client.js.map +1 -0
- package/dist/commands/agents.d.ts +3 -0
- package/dist/commands/agents.js +44 -0
- package/dist/commands/agents.js.map +1 -0
- package/dist/commands/assign.d.ts +5 -0
- package/dist/commands/assign.js +44 -0
- package/dist/commands/assign.js.map +1 -0
- package/dist/commands/context.d.ts +4 -0
- package/dist/commands/context.js +37 -0
- package/dist/commands/context.js.map +1 -0
- package/dist/commands/create.d.ts +12 -0
- package/dist/commands/create.js +54 -0
- package/dist/commands/create.js.map +1 -0
- package/dist/commands/dep.d.ts +11 -0
- package/dist/commands/dep.js +56 -0
- package/dist/commands/dep.js.map +1 -0
- package/dist/commands/doc-import.d.ts +9 -0
- package/dist/commands/doc-import.js +97 -0
- package/dist/commands/doc-import.js.map +1 -0
- package/dist/commands/doc-patch.d.ts +16 -0
- package/dist/commands/doc-patch.js +142 -0
- package/dist/commands/doc-patch.js.map +1 -0
- package/dist/commands/doc-share.d.ts +14 -0
- package/dist/commands/doc-share.js +60 -0
- package/dist/commands/doc-share.js.map +1 -0
- package/dist/commands/doc-update.d.ts +6 -0
- package/dist/commands/doc-update.js +64 -0
- package/dist/commands/doc-update.js.map +1 -0
- package/dist/commands/doc.d.ts +6 -0
- package/dist/commands/doc.js +108 -0
- package/dist/commands/doc.js.map +1 -0
- package/dist/commands/docs-cache.d.ts +11 -0
- package/dist/commands/docs-cache.js +119 -0
- package/dist/commands/docs-cache.js.map +1 -0
- package/dist/commands/docs.d.ts +6 -0
- package/dist/commands/docs.js +35 -0
- package/dist/commands/docs.js.map +1 -0
- package/dist/commands/get.d.ts +8 -0
- package/dist/commands/get.js +102 -0
- package/dist/commands/get.js.map +1 -0
- package/dist/commands/ideas.d.ts +23 -0
- package/dist/commands/ideas.js +155 -0
- package/dist/commands/ideas.js.map +1 -0
- package/dist/commands/init.d.ts +7 -0
- package/dist/commands/init.js +175 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/issues.d.ts +32 -0
- package/dist/commands/issues.js +206 -0
- package/dist/commands/issues.js.map +1 -0
- package/dist/commands/log.d.ts +6 -0
- package/dist/commands/log.js +47 -0
- package/dist/commands/log.js.map +1 -0
- package/dist/commands/login.d.ts +3 -0
- package/dist/commands/login.js +48 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/logout.d.ts +1 -0
- package/dist/commands/logout.js +13 -0
- package/dist/commands/logout.js.map +1 -0
- package/dist/commands/orbit.d.ts +18 -0
- package/dist/commands/orbit.js +159 -0
- package/dist/commands/orbit.js.map +1 -0
- package/dist/commands/overview.d.ts +4 -0
- package/dist/commands/overview.js +56 -0
- package/dist/commands/overview.js.map +1 -0
- package/dist/commands/projects.d.ts +3 -0
- package/dist/commands/projects.js +28 -0
- package/dist/commands/projects.js.map +1 -0
- package/dist/commands/setup-agent.d.ts +3 -0
- package/dist/commands/setup-agent.js +178 -0
- package/dist/commands/setup-agent.js.map +1 -0
- package/dist/commands/start.d.ts +4 -0
- package/dist/commands/start.js +38 -0
- package/dist/commands/start.js.map +1 -0
- package/dist/commands/status.d.ts +5 -0
- package/dist/commands/status.js +54 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/subtask.d.ts +7 -0
- package/dist/commands/subtask.js +26 -0
- package/dist/commands/subtask.js.map +1 -0
- package/dist/commands/task-edit-content.d.ts +7 -0
- package/dist/commands/task-edit-content.js +45 -0
- package/dist/commands/task-edit-content.js.map +1 -0
- package/dist/commands/task.d.ts +66 -0
- package/dist/commands/task.js +92 -0
- package/dist/commands/task.js.map +1 -0
- package/dist/commands/tasks.d.ts +7 -0
- package/dist/commands/tasks.js +35 -0
- package/dist/commands/tasks.js.map +1 -0
- package/dist/commands/vibes.d.ts +27 -0
- package/dist/commands/vibes.js +142 -0
- package/dist/commands/vibes.js.map +1 -0
- package/dist/config.d.ts +14 -0
- package/dist/config.js +34 -0
- package/dist/config.js.map +1 -0
- package/dist/doc-cache.d.ts +24 -0
- package/dist/doc-cache.js +116 -0
- package/dist/doc-cache.js.map +1 -0
- package/dist/errors.d.ts +16 -0
- package/dist/errors.js +26 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +705 -0
- package/dist/index.js.map +1 -0
- package/dist/oauth.d.ts +42 -0
- package/dist/oauth.js +207 -0
- package/dist/oauth.js.map +1 -0
- package/dist/output.d.ts +4 -0
- package/dist/output.js +66 -0
- package/dist/output.js.map +1 -0
- package/package.json +50 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create.js","sourceRoot":"","sources":["../../src/commands/create.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAsBtE,SAAS,cAAc,CAAC,EAAU;IAChC,OAAO,2BAA2B,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAC9C,CAAC;AAED,SAAS,WAAW,CAAC,EAAU;IAC7B,OAAO,EAAE,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;AACtC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,KAAa,EACb,OAWC;IAED,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAEnD,IAAI,aAAiC,CAAC;QACtC,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;YACtB,IAAI,cAAc,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;gBACtC,MAAM,SAAS,GAAG,CAAC,MAAM,MAAM,CAAC,gBAAgB,CAAC,WAAW,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAwB,CAAC;gBACzG,aAAa,GAAG,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;YACpC,CAAC;iBAAM,CAAC;gBACN,aAAa,GAAG,OAAO,CAAC,SAAS,CAAC;YACpC,CAAC;QACH,CAAC;QAED,MAAM,QAAQ,GAAG,CAAC,MAAM,MAAM,CAAC,UAAU,CAAC;YACxC,KAAK;YACL,WAAW,EAAE,OAAO,CAAC,IAAI;YACzB,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,gBAAgB,EAAE,OAAO,CAAC,MAAM;YAChC,QAAQ,EAAE,OAAO,CAAC,OAAO;YACzB,WAAW,EAAE,OAAO,CAAC,MAAM;YAC3B,kBAAkB,EAAE,OAAO,CAAC,YAAY;YACxC,eAAe,EAAE,aAAa;SAC/B,CAAC,CAAmB,CAAC;QAEtB,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC;YAC1C,OAAO;QACT,CAAC;QAED,MAAM,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC;QACxB,IAAI,GAAG,GAAG,iBAAiB,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,cAAc,IAAI,CAAC,CAAC,WAAW,MAAM,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,QAAQ,GAAG,CAAC;QACzG,IAAI,aAAa,EAAE,CAAC;YAClB,GAAG,IAAI,qBAAqB,OAAO,CAAC,SAAS,sBAAsB,CAAC;QACtE,CAAC;QACD,IAAI,CAAC,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC;YACxB,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,CAAC;gBAC5B,GAAG,IAAI,cAAc,CAAC,EAAE,CAAC;YAC3B,CAAC;QACH,CAAC;QACD,YAAY,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC3B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,UAAU,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;QAChC,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export declare function depAddCommand(taskId: string, targetTaskId: string, options: {
|
|
2
|
+
json: boolean;
|
|
3
|
+
project?: string;
|
|
4
|
+
type?: string;
|
|
5
|
+
note?: string;
|
|
6
|
+
}): Promise<void>;
|
|
7
|
+
export declare function depRemoveCommand(taskId: string, targetTaskId: string, options: {
|
|
8
|
+
json: boolean;
|
|
9
|
+
project?: string;
|
|
10
|
+
type?: string;
|
|
11
|
+
}): Promise<void>;
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { createClient } from '../api-client.js';
|
|
2
|
+
import { formatOutput, printError, printSuccess } from '../output.js';
|
|
3
|
+
const VALID_DEP_TYPES = ['depends_on', 'related'];
|
|
4
|
+
// ── Commands ──
|
|
5
|
+
export async function depAddCommand(taskId, targetTaskId, options) {
|
|
6
|
+
const depType = options.type ?? 'depends_on';
|
|
7
|
+
if (!VALID_DEP_TYPES.includes(depType)) {
|
|
8
|
+
const msg = `Invalid dependency type "${depType}". Valid: ${VALID_DEP_TYPES.join(', ')}`;
|
|
9
|
+
if (options.json) {
|
|
10
|
+
console.error(JSON.stringify({ error: { message: msg } }));
|
|
11
|
+
}
|
|
12
|
+
else {
|
|
13
|
+
console.error(`Error: ${msg}`);
|
|
14
|
+
}
|
|
15
|
+
process.exitCode = 1;
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
try {
|
|
19
|
+
const client = await createClient(options.project);
|
|
20
|
+
const response = (await client.addTaskDependency(taskId, {
|
|
21
|
+
target_task_id: targetTaskId,
|
|
22
|
+
type: depType,
|
|
23
|
+
note: options.note,
|
|
24
|
+
}));
|
|
25
|
+
if (options.json) {
|
|
26
|
+
console.log(formatOutput(response, true));
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
printSuccess(`Added ${response.data.type} dependency: ${response.data.task_id ?? taskId} → ${response.data.target_task_id ?? targetTaskId}.`, false);
|
|
30
|
+
}
|
|
31
|
+
catch (error) {
|
|
32
|
+
printError(error, options.json);
|
|
33
|
+
process.exitCode = 1;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
export async function depRemoveCommand(taskId, targetTaskId, options) {
|
|
37
|
+
try {
|
|
38
|
+
const client = await createClient(options.project);
|
|
39
|
+
const response = await client.removeTaskDependency(taskId, targetTaskId, options.type);
|
|
40
|
+
if (options.json) {
|
|
41
|
+
console.log(formatOutput(response ?? { data: { removed: true } }, true));
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
if (response?.data) {
|
|
45
|
+
printSuccess(`Removed dependency: ${response.data.task_id} → ${response.data.target_task_id}.`, false);
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
printSuccess(`Removed dependency: ${taskId} → ${targetTaskId}.`, false);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
catch (error) {
|
|
52
|
+
printError(error, options.json);
|
|
53
|
+
process.exitCode = 1;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=dep.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dep.js","sourceRoot":"","sources":["../../src/commands/dep.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { readFileSync, statSync } from 'node:fs';
|
|
2
|
+
import { createClient } from '../api-client.js';
|
|
3
|
+
import { formatOutput, printError, printSuccess } from '../output.js';
|
|
4
|
+
const VALID_DOC_TYPES = [
|
|
5
|
+
'spec',
|
|
6
|
+
'architecture',
|
|
7
|
+
'api',
|
|
8
|
+
'guide',
|
|
9
|
+
'decision',
|
|
10
|
+
'changelog',
|
|
11
|
+
'other',
|
|
12
|
+
];
|
|
13
|
+
function formatBytes(bytes) {
|
|
14
|
+
if (bytes < 1024)
|
|
15
|
+
return `${bytes} B`;
|
|
16
|
+
if (bytes < 1024 * 1024)
|
|
17
|
+
return `${(bytes / 1024).toFixed(1)} KB`;
|
|
18
|
+
return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
|
|
19
|
+
}
|
|
20
|
+
export async function docImportCommand(title, options) {
|
|
21
|
+
if (!VALID_DOC_TYPES.includes(options.type)) {
|
|
22
|
+
const msg = `Invalid document type "${options.type}". Valid: ${VALID_DOC_TYPES.join(', ')}`;
|
|
23
|
+
if (options.json) {
|
|
24
|
+
console.error(JSON.stringify({ error: { message: msg } }));
|
|
25
|
+
}
|
|
26
|
+
else {
|
|
27
|
+
console.error(`Error: ${msg}`);
|
|
28
|
+
}
|
|
29
|
+
process.exitCode = 1;
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
// Verify file is readable before doing anything
|
|
33
|
+
try {
|
|
34
|
+
statSync(options.file);
|
|
35
|
+
}
|
|
36
|
+
catch (err) {
|
|
37
|
+
const msg = `Cannot read file "${options.file}": ${err instanceof Error ? err.message : String(err)}`;
|
|
38
|
+
if (options.json) {
|
|
39
|
+
console.error(JSON.stringify({ error: { message: msg } }));
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
console.error(`Error: ${msg}`);
|
|
43
|
+
}
|
|
44
|
+
process.exitCode = 1;
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
try {
|
|
48
|
+
const client = await createClient(options.project);
|
|
49
|
+
// Try presigned URL upload first
|
|
50
|
+
const presignedResult = await client.presignedImport(options.file, {
|
|
51
|
+
title,
|
|
52
|
+
type: options.type,
|
|
53
|
+
source_path: options.sourcePath,
|
|
54
|
+
context: options.context,
|
|
55
|
+
workspace_id: options.workspaceId,
|
|
56
|
+
}, options.json
|
|
57
|
+
? undefined
|
|
58
|
+
: (uploaded, total) => {
|
|
59
|
+
process.stderr.write(`\rUploading: ${formatBytes(uploaded)} / ${formatBytes(total)}`);
|
|
60
|
+
});
|
|
61
|
+
if (presignedResult) {
|
|
62
|
+
if (!options.json) {
|
|
63
|
+
process.stderr.write('\n');
|
|
64
|
+
}
|
|
65
|
+
if (options.json) {
|
|
66
|
+
console.log(formatOutput({ ...presignedResult, upload_method: 'presigned' }, true));
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
printSuccess(`Document imported: "${title}" (slug: ${presignedResult.data.slug}) [presigned upload]`, false);
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
// Fallback: read file into memory and send as JSON body
|
|
73
|
+
const content = readFileSync(options.file, 'utf-8');
|
|
74
|
+
const response = (await client.importDocument({
|
|
75
|
+
title,
|
|
76
|
+
type: options.type,
|
|
77
|
+
content,
|
|
78
|
+
source_path: options.sourcePath,
|
|
79
|
+
context: options.context,
|
|
80
|
+
workspace_id: options.workspaceId,
|
|
81
|
+
}));
|
|
82
|
+
if (options.json) {
|
|
83
|
+
console.log(formatOutput({ ...response, upload_method: 'direct' }, true));
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
printSuccess(`Document imported: "${title}" (slug: ${response.data.slug})`, false);
|
|
87
|
+
}
|
|
88
|
+
catch (error) {
|
|
89
|
+
if (!options.json) {
|
|
90
|
+
// Clear progress line if present
|
|
91
|
+
process.stderr.write('\n');
|
|
92
|
+
}
|
|
93
|
+
printError(error, options.json);
|
|
94
|
+
process.exitCode = 1;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=doc-import.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doc-import.js","sourceRoot":"","sources":["../../src/commands/doc-import.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export declare function docPatchCommand(idOrSlug: string, options: {
|
|
2
|
+
json: boolean;
|
|
3
|
+
project?: string;
|
|
4
|
+
operations?: string;
|
|
5
|
+
baseVersion: string;
|
|
6
|
+
changelog?: string;
|
|
7
|
+
replaceSection?: string;
|
|
8
|
+
insertSection?: boolean;
|
|
9
|
+
deleteSection?: string;
|
|
10
|
+
append?: boolean;
|
|
11
|
+
after?: string;
|
|
12
|
+
content?: string;
|
|
13
|
+
replaceLines?: string;
|
|
14
|
+
insertAfterLine?: string;
|
|
15
|
+
deleteLines?: string;
|
|
16
|
+
}): Promise<void>;
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
import { createClient } from '../api-client.js';
|
|
2
|
+
import { formatOutput, printError, printSuccess } from '../output.js';
|
|
3
|
+
import { OrbitMapAPIError } from '../errors.js';
|
|
4
|
+
const FRIENDLY_ERRORS = {
|
|
5
|
+
CONTENT_UNAVAILABLE: 'Storage unavailable — patch aborted to prevent data loss. Try again later.',
|
|
6
|
+
PATCH_RESULT_EMPTY: 'Patch would result in an empty document — aborted.',
|
|
7
|
+
};
|
|
8
|
+
const DEPRECATED_FLAGS = ['replaceLines', 'insertAfterLine', 'deleteLines'];
|
|
9
|
+
export async function docPatchCommand(idOrSlug, options) {
|
|
10
|
+
// Check for deprecated line-based flags
|
|
11
|
+
for (const flag of DEPRECATED_FLAGS) {
|
|
12
|
+
if (options[flag] !== undefined) {
|
|
13
|
+
const kebab = flag.replace(/([A-Z])/g, '-$1').toLowerCase();
|
|
14
|
+
console.error(`Warning: --${kebab} is deprecated. Use section-based operations instead (--replace-section, --insert-section, --delete-section).`);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
let operations;
|
|
18
|
+
if (options.operations) {
|
|
19
|
+
// Raw JSON operations mode
|
|
20
|
+
try {
|
|
21
|
+
operations = JSON.parse(options.operations);
|
|
22
|
+
if (!Array.isArray(operations)) {
|
|
23
|
+
throw new Error('Operations must be a JSON array');
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
catch (err) {
|
|
27
|
+
const msg = `Invalid --operations JSON: ${err instanceof Error ? err.message : String(err)}`;
|
|
28
|
+
if (options.json) {
|
|
29
|
+
console.error(JSON.stringify({ error: { message: msg } }));
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
console.error(`Error: ${msg}`);
|
|
33
|
+
}
|
|
34
|
+
process.exitCode = 1;
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
else if (options.replaceSection) {
|
|
39
|
+
if (!options.content) {
|
|
40
|
+
const msg = '--replace-section requires --content with the new section body';
|
|
41
|
+
if (options.json) {
|
|
42
|
+
console.error(JSON.stringify({ error: { message: msg } }));
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
console.error(`Error: ${msg}`);
|
|
46
|
+
}
|
|
47
|
+
process.exitCode = 1;
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
operations = [{ op: 'replace_section', heading: options.replaceSection, content: options.content }];
|
|
51
|
+
}
|
|
52
|
+
else if (options.insertSection) {
|
|
53
|
+
if (!options.content) {
|
|
54
|
+
const msg = '--insert-section requires --content with the section to insert';
|
|
55
|
+
if (options.json) {
|
|
56
|
+
console.error(JSON.stringify({ error: { message: msg } }));
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
console.error(`Error: ${msg}`);
|
|
60
|
+
}
|
|
61
|
+
process.exitCode = 1;
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
operations = [{ op: 'insert_section', after_heading: options.after, content: options.content }];
|
|
65
|
+
}
|
|
66
|
+
else if (options.deleteSection) {
|
|
67
|
+
operations = [{ op: 'delete_section', heading: options.deleteSection }];
|
|
68
|
+
}
|
|
69
|
+
else if (options.append) {
|
|
70
|
+
if (!options.content) {
|
|
71
|
+
const msg = '--append requires --content with the text to append';
|
|
72
|
+
if (options.json) {
|
|
73
|
+
console.error(JSON.stringify({ error: { message: msg } }));
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
console.error(`Error: ${msg}`);
|
|
77
|
+
}
|
|
78
|
+
process.exitCode = 1;
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
operations = [{ op: 'append', content: options.content }];
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
const msg = 'Provide --operations JSON, or use --replace-section, --insert-section, --delete-section, or --append';
|
|
85
|
+
if (options.json) {
|
|
86
|
+
console.error(JSON.stringify({ error: { message: msg } }));
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
console.error(`Error: ${msg}`);
|
|
90
|
+
}
|
|
91
|
+
process.exitCode = 1;
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
const baseVersion = parseInt(options.baseVersion, 10);
|
|
95
|
+
if (isNaN(baseVersion) || baseVersion < 1) {
|
|
96
|
+
const msg = '--base-version must be a positive integer';
|
|
97
|
+
if (options.json) {
|
|
98
|
+
console.error(JSON.stringify({ error: { message: msg } }));
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
console.error(`Error: ${msg}`);
|
|
102
|
+
}
|
|
103
|
+
process.exitCode = 1;
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
try {
|
|
107
|
+
const client = await createClient(options.project);
|
|
108
|
+
const response = (await client.patchDocument(idOrSlug, operations, baseVersion, options.changelog));
|
|
109
|
+
if (options.json) {
|
|
110
|
+
console.log(formatOutput(response, true));
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
const d = response.data;
|
|
114
|
+
let msg = `Document "${idOrSlug}" patched to version ${d.version}.`;
|
|
115
|
+
if (d.lines_before !== undefined && d.lines_after !== undefined) {
|
|
116
|
+
msg += ` ${d.lines_before} → ${d.lines_after} lines.`;
|
|
117
|
+
}
|
|
118
|
+
printSuccess(msg, false);
|
|
119
|
+
if (d.warnings && d.warnings.length > 0) {
|
|
120
|
+
for (const warning of d.warnings) {
|
|
121
|
+
console.log(` Warning: ${warning}`);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
catch (error) {
|
|
126
|
+
if (error instanceof OrbitMapAPIError && FRIENDLY_ERRORS[error.code]) {
|
|
127
|
+
if (options.json) {
|
|
128
|
+
console.error(JSON.stringify({
|
|
129
|
+
error: { code: error.code, message: FRIENDLY_ERRORS[error.code], status: error.status },
|
|
130
|
+
}, null, 2));
|
|
131
|
+
}
|
|
132
|
+
else {
|
|
133
|
+
console.error(`Error: ${FRIENDLY_ERRORS[error.code]}`);
|
|
134
|
+
}
|
|
135
|
+
process.exitCode = 1;
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
printError(error, options.json);
|
|
139
|
+
process.exitCode = 1;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
//# sourceMappingURL=doc-patch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doc-patch.js","sourceRoot":"","sources":["../../src/commands/doc-patch.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export declare function docShareCommand(documentId: string, projectId: string, options: {
|
|
2
|
+
json: boolean;
|
|
3
|
+
project?: string;
|
|
4
|
+
agents?: string;
|
|
5
|
+
}): Promise<void>;
|
|
6
|
+
export declare function docUnshareCommand(documentId: string, projectId: string, options: {
|
|
7
|
+
json: boolean;
|
|
8
|
+
project?: string;
|
|
9
|
+
}): Promise<void>;
|
|
10
|
+
export declare function docVisibilityCommand(documentId: string, projectId: string, options: {
|
|
11
|
+
json: boolean;
|
|
12
|
+
project?: string;
|
|
13
|
+
agents?: string;
|
|
14
|
+
}): Promise<void>;
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { createClient } from '../api-client.js';
|
|
2
|
+
import { formatOutput, printError, printSuccess } from '../output.js';
|
|
3
|
+
export async function docShareCommand(documentId, projectId, options) {
|
|
4
|
+
const agentIds = options.agents
|
|
5
|
+
? options.agents.split(',').map((s) => s.trim())
|
|
6
|
+
: undefined;
|
|
7
|
+
try {
|
|
8
|
+
const client = await createClient(options.project);
|
|
9
|
+
const response = (await client.shareDocument(documentId, projectId, agentIds));
|
|
10
|
+
if (options.json) {
|
|
11
|
+
console.log(formatOutput(response, true));
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
const restriction = response.data.restricted_to_agents.length > 0
|
|
15
|
+
? ` (restricted to ${response.data.restricted_to_agents.length} agent(s))`
|
|
16
|
+
: '';
|
|
17
|
+
printSuccess(`Document ${documentId} shared with project ${projectId}${restriction}.`, false);
|
|
18
|
+
}
|
|
19
|
+
catch (error) {
|
|
20
|
+
printError(error, options.json);
|
|
21
|
+
process.exitCode = 1;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
export async function docUnshareCommand(documentId, projectId, options) {
|
|
25
|
+
try {
|
|
26
|
+
const client = await createClient(options.project);
|
|
27
|
+
const response = (await client.unshareDocument(documentId, projectId));
|
|
28
|
+
if (options.json) {
|
|
29
|
+
console.log(formatOutput(response, true));
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
printSuccess(`Document ${documentId} unshared from project ${projectId}.`, false);
|
|
33
|
+
}
|
|
34
|
+
catch (error) {
|
|
35
|
+
printError(error, options.json);
|
|
36
|
+
process.exitCode = 1;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
export async function docVisibilityCommand(documentId, projectId, options) {
|
|
40
|
+
const agentIds = options.agents
|
|
41
|
+
? options.agents.split(',').map((s) => s.trim())
|
|
42
|
+
: [];
|
|
43
|
+
try {
|
|
44
|
+
const client = await createClient(options.project);
|
|
45
|
+
const response = (await client.setDocumentVisibility(documentId, projectId, agentIds));
|
|
46
|
+
if (options.json) {
|
|
47
|
+
console.log(formatOutput(response, true));
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
const restriction = response.data.restricted_to_agents.length > 0
|
|
51
|
+
? `Restricted to ${response.data.restricted_to_agents.length} agent(s).`
|
|
52
|
+
: 'All agents can access.';
|
|
53
|
+
printSuccess(`Visibility updated for document ${documentId} in project ${projectId}. ${restriction}`, false);
|
|
54
|
+
}
|
|
55
|
+
catch (error) {
|
|
56
|
+
printError(error, options.json);
|
|
57
|
+
process.exitCode = 1;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=doc-share.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doc-share.js","sourceRoot":"","sources":["../../src/commands/doc-share.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { readFileSync, statSync } from 'node:fs';
|
|
2
|
+
import { createClient } from '../api-client.js';
|
|
3
|
+
import { formatOutput, printError, printSuccess } from '../output.js';
|
|
4
|
+
function formatBytes(bytes) {
|
|
5
|
+
if (bytes < 1024)
|
|
6
|
+
return `${bytes} B`;
|
|
7
|
+
if (bytes < 1024 * 1024)
|
|
8
|
+
return `${(bytes / 1024).toFixed(1)} KB`;
|
|
9
|
+
return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
|
|
10
|
+
}
|
|
11
|
+
export async function docUpdateCommand(idOrSlug, options) {
|
|
12
|
+
// Verify file is readable before doing anything
|
|
13
|
+
try {
|
|
14
|
+
statSync(options.file);
|
|
15
|
+
}
|
|
16
|
+
catch (err) {
|
|
17
|
+
const msg = `Cannot read file "${options.file}": ${err instanceof Error ? err.message : String(err)}`;
|
|
18
|
+
if (options.json) {
|
|
19
|
+
console.error(JSON.stringify({ error: { message: msg } }));
|
|
20
|
+
}
|
|
21
|
+
else {
|
|
22
|
+
console.error(`Error: ${msg}`);
|
|
23
|
+
}
|
|
24
|
+
process.exitCode = 1;
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
try {
|
|
28
|
+
const client = await createClient(options.project);
|
|
29
|
+
// Try presigned URL upload first
|
|
30
|
+
const presignedResult = await client.presignedUpdate(idOrSlug, options.file, options.changelog, options.json
|
|
31
|
+
? undefined
|
|
32
|
+
: (uploaded, total) => {
|
|
33
|
+
process.stderr.write(`\rUploading: ${formatBytes(uploaded)} / ${formatBytes(total)}`);
|
|
34
|
+
});
|
|
35
|
+
if (presignedResult) {
|
|
36
|
+
if (!options.json) {
|
|
37
|
+
process.stderr.write('\n');
|
|
38
|
+
}
|
|
39
|
+
if (options.json) {
|
|
40
|
+
console.log(formatOutput({ ...presignedResult, upload_method: 'presigned' }, true));
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
printSuccess(`Document "${idOrSlug}" updated to version ${presignedResult.data.version}. [presigned upload]`, false);
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
// Fallback: read file into memory and send as JSON body
|
|
47
|
+
const content = readFileSync(options.file, 'utf-8');
|
|
48
|
+
const response = (await client.updateDocument(idOrSlug, content, options.changelog));
|
|
49
|
+
if (options.json) {
|
|
50
|
+
console.log(formatOutput({ ...response, upload_method: 'direct' }, true));
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
printSuccess(`Document "${idOrSlug}" updated to version ${response.data.version}.`, false);
|
|
54
|
+
}
|
|
55
|
+
catch (error) {
|
|
56
|
+
if (!options.json) {
|
|
57
|
+
// Clear progress line if present
|
|
58
|
+
process.stderr.write('\n');
|
|
59
|
+
}
|
|
60
|
+
printError(error, options.json);
|
|
61
|
+
process.exitCode = 1;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=doc-update.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doc-update.js","sourceRoot":"","sources":["../../src/commands/doc-update.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { readFileSync } from 'node:fs';
|
|
2
|
+
import { createClient } from '../api-client.js';
|
|
3
|
+
import { formatOutput, printError } from '../output.js';
|
|
4
|
+
import { downloadDocument, readManifest, writeManifest } from '../doc-cache.js';
|
|
5
|
+
export async function docCommand(idOrSlug, options) {
|
|
6
|
+
try {
|
|
7
|
+
const client = await createClient(options.project);
|
|
8
|
+
// Determine fetch mode based on flags
|
|
9
|
+
const wantsFull = options.full === true;
|
|
10
|
+
const wantsSection = options.section !== undefined;
|
|
11
|
+
if (wantsFull && wantsSection) {
|
|
12
|
+
const msg = 'Cannot use --full and --section together. Use one or the other.';
|
|
13
|
+
if (options.json) {
|
|
14
|
+
console.error(JSON.stringify({ error: { message: msg } }));
|
|
15
|
+
}
|
|
16
|
+
else {
|
|
17
|
+
console.error(`Error: ${msg}`);
|
|
18
|
+
}
|
|
19
|
+
process.exitCode = 1;
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
if (wantsFull) {
|
|
23
|
+
// Full content mode — same as legacy behavior
|
|
24
|
+
const response = (await client.getDocument(idOrSlug, 'file', { full: true }));
|
|
25
|
+
const doc = response.data;
|
|
26
|
+
let content;
|
|
27
|
+
let fromCache = false;
|
|
28
|
+
if (doc.download_url) {
|
|
29
|
+
const result = await downloadDocument(client, idOrSlug);
|
|
30
|
+
content = readFileSync(result.filePath, 'utf-8');
|
|
31
|
+
fromCache = result.cached;
|
|
32
|
+
}
|
|
33
|
+
else if (doc.content !== undefined) {
|
|
34
|
+
content = doc.content;
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
throw new Error(`API returned neither download_url nor content for ${idOrSlug}`);
|
|
38
|
+
}
|
|
39
|
+
// Update last_accessed in manifest
|
|
40
|
+
const manifest = readManifest();
|
|
41
|
+
if (manifest[doc.slug]) {
|
|
42
|
+
manifest[doc.slug].last_accessed = new Date().toISOString();
|
|
43
|
+
writeManifest(manifest);
|
|
44
|
+
}
|
|
45
|
+
if (options.json) {
|
|
46
|
+
console.log(formatOutput({ data: { ...doc, content } }, true));
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
console.log(`Title: ${doc.title}`);
|
|
50
|
+
console.log(`Type: ${doc.type} Version: ${doc.version} Slug: ${doc.slug}`);
|
|
51
|
+
if (doc.context)
|
|
52
|
+
console.log(`Context: ${doc.context}`);
|
|
53
|
+
if (doc.source_path)
|
|
54
|
+
console.log(`Source: ${doc.source_path}`);
|
|
55
|
+
if (doc._shared)
|
|
56
|
+
console.log(`Shared: yes`);
|
|
57
|
+
if (fromCache)
|
|
58
|
+
console.log(`Cache: hit`);
|
|
59
|
+
console.log(`Updated: ${doc.updated_at}`);
|
|
60
|
+
console.log(`\n${content}`);
|
|
61
|
+
}
|
|
62
|
+
else if (wantsSection) {
|
|
63
|
+
// Section mode — fetch specific section content
|
|
64
|
+
const response = (await client.getDocument(idOrSlug, undefined, { section: options.section }));
|
|
65
|
+
const doc = response.data;
|
|
66
|
+
if (options.json) {
|
|
67
|
+
console.log(formatOutput(response, true));
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
console.log(`Title: ${doc.title}`);
|
|
71
|
+
console.log(`Type: ${doc.type} Version: ${doc.version} Slug: ${doc.slug}`);
|
|
72
|
+
console.log(`Section: ${options.section}`);
|
|
73
|
+
if (doc.content !== undefined) {
|
|
74
|
+
console.log(`\n${doc.content}`);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
// Default mode — TOC view (context + table of contents)
|
|
79
|
+
const response = (await client.getDocument(idOrSlug));
|
|
80
|
+
const doc = response.data;
|
|
81
|
+
if (options.json) {
|
|
82
|
+
console.log(formatOutput(response, true));
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
console.log(`${doc.title} (${doc.slug}) v${doc.version}`);
|
|
86
|
+
if (doc.context)
|
|
87
|
+
console.log(`Context: ${doc.context}`);
|
|
88
|
+
if (doc._shared)
|
|
89
|
+
console.log(`Shared: yes`);
|
|
90
|
+
if (doc.toc && doc.toc.length > 0) {
|
|
91
|
+
console.log(`\nTable of Contents:`);
|
|
92
|
+
for (const entry of doc.toc) {
|
|
93
|
+
const indent = ' '.repeat(entry.level - 1);
|
|
94
|
+
console.log(` ${indent}${entry.heading}`);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
else if (doc.sections_count !== undefined) {
|
|
98
|
+
console.log(`\nSections: ${doc.sections_count}`);
|
|
99
|
+
}
|
|
100
|
+
console.log(`\nUse --full to see full content, or --section "## Heading" for a specific section.`);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
catch (error) {
|
|
104
|
+
printError(error, options.json);
|
|
105
|
+
process.exitCode = 1;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=doc.js.map
|