orbitmap 0.8.0 → 0.9.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/README.md +25 -6
- package/dist/adapters/cloud.d.ts +5 -2
- package/dist/adapters/cloud.js +50 -4
- package/dist/adapters/cloud.js.map +1 -1
- package/dist/adapters/local/adapter.d.ts +5 -2
- package/dist/adapters/local/adapter.js +8 -1
- package/dist/adapters/local/adapter.js.map +1 -1
- package/dist/adapters/types.d.ts +29 -1
- package/dist/agent-instructions.d.ts +1 -1
- package/dist/agent-instructions.js +5 -3
- package/dist/agent-instructions.js.map +1 -1
- package/dist/commands/doc-errors.d.ts +43 -0
- package/dist/commands/doc-errors.js +77 -0
- package/dist/commands/doc-errors.js.map +1 -0
- package/dist/commands/doc-import.d.ts +9 -0
- package/dist/commands/doc-import.js +36 -3
- package/dist/commands/doc-import.js.map +1 -1
- package/dist/commands/doc-patch.js +8 -13
- package/dist/commands/doc-patch.js.map +1 -1
- package/dist/commands/doc-share.d.ts +1 -0
- package/dist/commands/doc-share.js +17 -8
- package/dist/commands/doc-share.js.map +1 -1
- package/dist/commands/doc-update.js +20 -2
- package/dist/commands/doc-update.js.map +1 -1
- package/dist/index.js +25 -10
- package/dist/index.js.map +1 -1
- package/dist/list-options.d.ts +33 -0
- package/dist/list-options.js +55 -0
- package/dist/list-options.js.map +1 -1
- package/dist/write-target.d.ts +15 -4
- package/dist/write-target.js +2 -1
- package/dist/write-target.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The document surface's refusal vocabulary, in ONE place (IN-jnz64x / S10).
|
|
3
|
+
*
|
|
4
|
+
* Every document command can now be refused for a reason that is about *scope* rather than
|
|
5
|
+
* about the reference the caller typed: the document exists, but it lives at a scope the
|
|
6
|
+
* caller did not address, or in an area the caller cannot write to. The intent's binding
|
|
7
|
+
* decision is that such a refusal must name the real cause — "wrong slug" was exactly the
|
|
8
|
+
* lie that made IS-fzczuw and IS-2psuq5 undiagnosable — so the wire codes are translated
|
|
9
|
+
* once, here, instead of once per command file.
|
|
10
|
+
*
|
|
11
|
+
* The map was born inside `doc-patch.ts`; the patch-only entries stay there and are merged
|
|
12
|
+
* on top of these by {@link printDocumentError}'s caller.
|
|
13
|
+
*/
|
|
14
|
+
import { OrbitMapAPIError } from '../errors.js';
|
|
15
|
+
/**
|
|
16
|
+
* A write the server acknowledged as NOT having happened (`updated: false` / `imported:
|
|
17
|
+
* false` in an otherwise successful envelope).
|
|
18
|
+
*
|
|
19
|
+
* It is not a server error code: a server that knows a write failed answers
|
|
20
|
+
* `STORAGE_WRITE_FAILED` 503. This code exists for the contract violation in between — a
|
|
21
|
+
* 2xx whose own acknowledgement says the write did not land. Reporting success off the
|
|
22
|
+
* version number alone (what the CLI did before) is the one outcome that must not survive.
|
|
23
|
+
*/
|
|
24
|
+
export declare const WRITE_NOT_ACKNOWLEDGED = "WRITE_NOT_ACKNOWLEDGED";
|
|
25
|
+
/** Friendly text for the server codes the document commands can be refused with. */
|
|
26
|
+
export declare const DOCUMENT_FRIENDLY_ERRORS: Record<string, string>;
|
|
27
|
+
/**
|
|
28
|
+
* Print an error, replacing the server's text with the friendly one when we have it.
|
|
29
|
+
*
|
|
30
|
+
* The lookup goes through the CANONICAL code (`ERROR_CODE_ALIASES` in `errors.ts`) while
|
|
31
|
+
* the reported code stays the wire one, so nothing a user sees changes across the API's
|
|
32
|
+
* `PROJECT_*` → `AREA_*` rename. Exit code is the caller's business — every command sets
|
|
33
|
+
* `process.exitCode = 1` in its catch, as it always did.
|
|
34
|
+
*
|
|
35
|
+
* @param extra Command-specific entries (e.g. `doc-patch`'s), merged over the shared map.
|
|
36
|
+
*/
|
|
37
|
+
export declare function printDocumentError(error: unknown, jsonMode: boolean, extra?: Record<string, string>): void;
|
|
38
|
+
/**
|
|
39
|
+
* The error a command raises when the server's own acknowledgement says the write did not
|
|
40
|
+
* land. `subject` is what the user typed (title or reference), so the message names the
|
|
41
|
+
* thing that was NOT written.
|
|
42
|
+
*/
|
|
43
|
+
export declare function writeNotAcknowledged(operation: string, subject: string, details?: Record<string, unknown>): OrbitMapAPIError;
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The document surface's refusal vocabulary, in ONE place (IN-jnz64x / S10).
|
|
3
|
+
*
|
|
4
|
+
* Every document command can now be refused for a reason that is about *scope* rather than
|
|
5
|
+
* about the reference the caller typed: the document exists, but it lives at a scope the
|
|
6
|
+
* caller did not address, or in an area the caller cannot write to. The intent's binding
|
|
7
|
+
* decision is that such a refusal must name the real cause — "wrong slug" was exactly the
|
|
8
|
+
* lie that made IS-fzczuw and IS-2psuq5 undiagnosable — so the wire codes are translated
|
|
9
|
+
* once, here, instead of once per command file.
|
|
10
|
+
*
|
|
11
|
+
* The map was born inside `doc-patch.ts`; the patch-only entries stay there and are merged
|
|
12
|
+
* on top of these by {@link printDocumentError}'s caller.
|
|
13
|
+
*/
|
|
14
|
+
import { OrbitMapAPIError } from '../errors.js';
|
|
15
|
+
import { printError } from '../output.js';
|
|
16
|
+
/**
|
|
17
|
+
* A write the server acknowledged as NOT having happened (`updated: false` / `imported:
|
|
18
|
+
* false` in an otherwise successful envelope).
|
|
19
|
+
*
|
|
20
|
+
* It is not a server error code: a server that knows a write failed answers
|
|
21
|
+
* `STORAGE_WRITE_FAILED` 503. This code exists for the contract violation in between — a
|
|
22
|
+
* 2xx whose own acknowledgement says the write did not land. Reporting success off the
|
|
23
|
+
* version number alone (what the CLI did before) is the one outcome that must not survive.
|
|
24
|
+
*/
|
|
25
|
+
export const WRITE_NOT_ACKNOWLEDGED = 'WRITE_NOT_ACKNOWLEDGED';
|
|
26
|
+
/** Friendly text for the server codes the document commands can be refused with. */
|
|
27
|
+
export const DOCUMENT_FRIENDLY_ERRORS = {
|
|
28
|
+
DOCUMENT_NOT_REACHABLE: 'The document exists, but none of the areas it is linked to are areas you reach — ' +
|
|
29
|
+
'this is a scope refusal, not a wrong reference. Ask for access to one of its areas, ' +
|
|
30
|
+
'or have it shared into an area you belong to (`orbitmap doc-share`).',
|
|
31
|
+
DOCUMENT_NOT_WRITABLE: 'The document exists and you can read it, but your role in its area(s) is too low to ' +
|
|
32
|
+
'write to it. A workspace-level document (linked to no area) needs the matching ' +
|
|
33
|
+
'workspace role.',
|
|
34
|
+
LAST_AREA_DETACH: 'This is the document\'s last area: detaching it makes the document workspace-level ' +
|
|
35
|
+
'and drops the per-agent restrictions on that share. Re-run with ' +
|
|
36
|
+
'--confirm-workspace-scope if that is what you want.',
|
|
37
|
+
STORAGE_WRITE_FAILED: 'The content could not be stored, so NOTHING was written — the version was not bumped ' +
|
|
38
|
+
'and the previous content is intact. Try again; if it persists, the object storage is ' +
|
|
39
|
+
'down.',
|
|
40
|
+
CROSS_WORKSPACE: 'That area belongs to a different workspace. A document lives in exactly one workspace ' +
|
|
41
|
+
'and can only be linked to areas of that workspace.',
|
|
42
|
+
NOT_SHARED: 'The document is not shared with that area, so there was nothing to remove. Run ' +
|
|
43
|
+
'`orbitmap doc <id-or-slug>` to see where it is linked.',
|
|
44
|
+
};
|
|
45
|
+
/**
|
|
46
|
+
* Print an error, replacing the server's text with the friendly one when we have it.
|
|
47
|
+
*
|
|
48
|
+
* The lookup goes through the CANONICAL code (`ERROR_CODE_ALIASES` in `errors.ts`) while
|
|
49
|
+
* the reported code stays the wire one, so nothing a user sees changes across the API's
|
|
50
|
+
* `PROJECT_*` → `AREA_*` rename. Exit code is the caller's business — every command sets
|
|
51
|
+
* `process.exitCode = 1` in its catch, as it always did.
|
|
52
|
+
*
|
|
53
|
+
* @param extra Command-specific entries (e.g. `doc-patch`'s), merged over the shared map.
|
|
54
|
+
*/
|
|
55
|
+
export function printDocumentError(error, jsonMode, extra) {
|
|
56
|
+
if (error instanceof OrbitMapAPIError) {
|
|
57
|
+
const friendly = extra?.[error.canonicalCode] ?? DOCUMENT_FRIENDLY_ERRORS[error.canonicalCode];
|
|
58
|
+
if (friendly) {
|
|
59
|
+
// Re-wrap rather than hand-rolling the envelope: the `--json` consumer keeps the same
|
|
60
|
+
// `code`/`status` it always got, and still gets `details` like every other error.
|
|
61
|
+
printError(new OrbitMapAPIError(friendly, error.code, error.status, error.details), jsonMode);
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
printError(error, jsonMode);
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* The error a command raises when the server's own acknowledgement says the write did not
|
|
69
|
+
* land. `subject` is what the user typed (title or reference), so the message names the
|
|
70
|
+
* thing that was NOT written.
|
|
71
|
+
*/
|
|
72
|
+
export function writeNotAcknowledged(operation, subject, details) {
|
|
73
|
+
return new OrbitMapAPIError(`The server accepted the request but reported that "${subject}" was NOT ${operation}. ` +
|
|
74
|
+
'Nothing was written — do not treat this as a success. Re-read the document to see ' +
|
|
75
|
+
'its current state before retrying.', WRITE_NOT_ACKNOWLEDGED, 500, details);
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=doc-errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doc-errors.js","sourceRoot":"","sources":["../../src/commands/doc-errors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,wBAAwB,CAAC;AAE/D,oFAAoF;AACpF,MAAM,CAAC,MAAM,wBAAwB,GAA2B;IAC9D,sBAAsB,EACpB,mFAAmF;QACnF,sFAAsF;QACtF,sEAAsE;IACxE,qBAAqB,EACnB,sFAAsF;QACtF,iFAAiF;QACjF,iBAAiB;IACnB,gBAAgB,EACd,qFAAqF;QACrF,kEAAkE;QAClE,qDAAqD;IACvD,oBAAoB,EAClB,uFAAuF;QACvF,uFAAuF;QACvF,OAAO;IACT,eAAe,EACb,wFAAwF;QACxF,oDAAoD;IACtD,UAAU,EACR,iFAAiF;QACjF,wDAAwD;CAC3D,CAAC;AAEF;;;;;;;;;GASG;AACH,MAAM,UAAU,kBAAkB,CAChC,KAAc,EACd,QAAiB,EACjB,KAA8B;IAE9B,IAAI,KAAK,YAAY,gBAAgB,EAAE,CAAC;QACtC,MAAM,QAAQ,GACZ,KAAK,EAAE,CAAC,KAAK,CAAC,aAAa,CAAC,IAAI,wBAAwB,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QAChF,IAAI,QAAQ,EAAE,CAAC;YACb,sFAAsF;YACtF,kFAAkF;YAClF,UAAU,CACR,IAAI,gBAAgB,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC,EACvE,QAAQ,CACT,CAAC;YACF,OAAO;QACT,CAAC;IACH,CAAC;IACD,UAAU,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;AAC9B,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAClC,SAAiB,EACjB,OAAe,EACf,OAAiC;IAEjC,OAAO,IAAI,gBAAgB,CACzB,sDAAsD,OAAO,aAAa,SAAS,IAAI;QACrF,oFAAoF;QACpF,oCAAoC,EACtC,sBAAsB,EACtB,GAAG,EACH,OAAO,CACR,CAAC;AACJ,CAAC"}
|
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
import type { DocumentScope } from '../adapters/types.js';
|
|
2
|
+
/** The two spellings `--scope` accepts — the server's own enum (`workspace` | `area`). */
|
|
3
|
+
export declare const DOCUMENT_SCOPES: readonly DocumentScope[];
|
|
1
4
|
export declare function docImportCommand(title: string, options: {
|
|
2
5
|
json: boolean;
|
|
3
6
|
area?: string;
|
|
@@ -7,4 +10,10 @@ export declare function docImportCommand(title: string, options: {
|
|
|
7
10
|
sourcePath?: string;
|
|
8
11
|
context?: string;
|
|
9
12
|
workspaceId?: string;
|
|
13
|
+
/**
|
|
14
|
+
* `--scope workspace|area`. Where the document LANDS. Separate from `workspaceId`,
|
|
15
|
+
* which only says WHICH workspace — the two used to be the same flag, and a caller who
|
|
16
|
+
* meant "workspace level" got an area document whenever the presigned path was taken.
|
|
17
|
+
*/
|
|
18
|
+
scope?: string;
|
|
10
19
|
}): Promise<void>;
|
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
import { readFileSync, statSync } from 'node:fs';
|
|
2
2
|
import { createAdapter } from '../adapters/factory.js';
|
|
3
3
|
import { confirmWriteTarget } from '../write-target.js';
|
|
4
|
-
import { formatOutput,
|
|
4
|
+
import { formatOutput, printSuccess, printValidationError } from '../output.js';
|
|
5
5
|
import { DOCUMENT_TYPES } from '../enums.js';
|
|
6
|
+
import { printDocumentError, writeNotAcknowledged } from './doc-errors.js';
|
|
7
|
+
/** The two spellings `--scope` accepts — the server's own enum (`workspace` | `area`). */
|
|
8
|
+
export const DOCUMENT_SCOPES = ['workspace', 'area'];
|
|
6
9
|
function formatBytes(bytes) {
|
|
7
10
|
if (bytes < 1024)
|
|
8
11
|
return `${bytes} B`;
|
|
@@ -16,6 +19,15 @@ export async function docImportCommand(title, options) {
|
|
|
16
19
|
printValidationError(msg, options.json);
|
|
17
20
|
return;
|
|
18
21
|
}
|
|
22
|
+
if (options.scope !== undefined &&
|
|
23
|
+
!DOCUMENT_SCOPES.includes(options.scope)) {
|
|
24
|
+
const msg = `Invalid --scope "${options.scope}". Valid: ${DOCUMENT_SCOPES.join(', ')} — ` +
|
|
25
|
+
'`workspace` links the document to no area (reachable from every one), `area` links ' +
|
|
26
|
+
'it to the area this invocation is scoped to.';
|
|
27
|
+
printValidationError(msg, options.json);
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
const scope = options.scope;
|
|
19
31
|
// Verify file is readable before doing anything
|
|
20
32
|
try {
|
|
21
33
|
statSync(options.file);
|
|
@@ -26,7 +38,9 @@ export async function docImportCommand(title, options) {
|
|
|
26
38
|
return;
|
|
27
39
|
}
|
|
28
40
|
try {
|
|
29
|
-
|
|
41
|
+
// `--scope workspace` creates ABOVE every area, so the echo must name the workspace
|
|
42
|
+
// rather than promise an area the document will not be linked to (see write-target.ts).
|
|
43
|
+
await confirmWriteTarget('import document', options, scope === 'workspace' ? 'workspace' : 'new');
|
|
30
44
|
const client = await createAdapter(options.area);
|
|
31
45
|
// Try presigned URL upload first
|
|
32
46
|
const presignedResult = await client.presignedImport(options.file, {
|
|
@@ -35,6 +49,7 @@ export async function docImportCommand(title, options) {
|
|
|
35
49
|
source_path: options.sourcePath,
|
|
36
50
|
context: options.context,
|
|
37
51
|
workspace_id: options.workspaceId,
|
|
52
|
+
scope,
|
|
38
53
|
}, options.json
|
|
39
54
|
? undefined
|
|
40
55
|
: (uploaded, total) => {
|
|
@@ -44,6 +59,16 @@ export async function docImportCommand(title, options) {
|
|
|
44
59
|
if (!options.json) {
|
|
45
60
|
process.stderr.write('\n');
|
|
46
61
|
}
|
|
62
|
+
// The server's own acknowledgement, not the fact that a 2xx came back: `imported:
|
|
63
|
+
// false` means the document was NOT created, and printing a slug for it would send
|
|
64
|
+
// the caller looking for something that does not exist.
|
|
65
|
+
if (presignedResult.data.imported === false) {
|
|
66
|
+
throw writeNotAcknowledged('imported', title, {
|
|
67
|
+
document_id: presignedResult.data.document_id,
|
|
68
|
+
slug: presignedResult.data.slug,
|
|
69
|
+
upload_method: 'presigned',
|
|
70
|
+
});
|
|
71
|
+
}
|
|
47
72
|
if (options.json) {
|
|
48
73
|
console.log(formatOutput({ ...presignedResult, upload_method: 'presigned' }, true));
|
|
49
74
|
return;
|
|
@@ -60,7 +85,15 @@ export async function docImportCommand(title, options) {
|
|
|
60
85
|
source_path: options.sourcePath,
|
|
61
86
|
context: options.context,
|
|
62
87
|
workspace_id: options.workspaceId,
|
|
88
|
+
scope,
|
|
63
89
|
}));
|
|
90
|
+
if (response.data.imported === false) {
|
|
91
|
+
throw writeNotAcknowledged('imported', title, {
|
|
92
|
+
document_id: response.data.document_id,
|
|
93
|
+
slug: response.data.slug,
|
|
94
|
+
upload_method: 'direct',
|
|
95
|
+
});
|
|
96
|
+
}
|
|
64
97
|
if (options.json) {
|
|
65
98
|
console.log(formatOutput({ ...response, upload_method: 'direct' }, true));
|
|
66
99
|
return;
|
|
@@ -72,7 +105,7 @@ export async function docImportCommand(title, options) {
|
|
|
72
105
|
// Clear progress line if present
|
|
73
106
|
process.stderr.write('\n');
|
|
74
107
|
}
|
|
75
|
-
|
|
108
|
+
printDocumentError(error, options.json);
|
|
76
109
|
process.exitCode = 1;
|
|
77
110
|
}
|
|
78
111
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doc-import.js","sourceRoot":"","sources":["../../src/commands/doc-import.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"doc-import.js","sourceRoot":"","sources":["../../src/commands/doc-import.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,12 @@
|
|
|
1
1
|
import { createAdapter } from '../adapters/factory.js';
|
|
2
2
|
import { confirmWriteTarget } from '../write-target.js';
|
|
3
|
-
import { formatOutput,
|
|
4
|
-
import {
|
|
3
|
+
import { formatOutput, printSuccess, printValidationError } from '../output.js';
|
|
4
|
+
import { printDocumentError } from './doc-errors.js';
|
|
5
|
+
/**
|
|
6
|
+
* The refusals only a PATCH can raise. Everything a document write can be refused with in
|
|
7
|
+
* general — the scope and storage codes — lives in `doc-errors.ts` and is merged under
|
|
8
|
+
* these by {@link printDocumentError}.
|
|
9
|
+
*/
|
|
5
10
|
const FRIENDLY_ERRORS = {
|
|
6
11
|
CONTENT_UNAVAILABLE: 'Storage unavailable — patch aborted to prevent data loss. Try again later.',
|
|
7
12
|
PATCH_RESULT_EMPTY: 'Patch would result in an empty document — aborted.',
|
|
@@ -135,17 +140,7 @@ export async function docPatchCommand(idOrSlug, options) {
|
|
|
135
140
|
}
|
|
136
141
|
}
|
|
137
142
|
catch (error) {
|
|
138
|
-
|
|
139
|
-
// keep reporting the wire code, so nothing the user sees changes across the API rename.
|
|
140
|
-
const friendly = error instanceof OrbitMapAPIError ? FRIENDLY_ERRORS[error.canonicalCode] : undefined;
|
|
141
|
-
if (error instanceof OrbitMapAPIError && friendly) {
|
|
142
|
-
// Re-wrap rather than hand-rolling the envelope: the `--json` consumer keeps the same
|
|
143
|
-
// `code`/`status` it always got, and now also gets `details` like every other error.
|
|
144
|
-
printError(new OrbitMapAPIError(friendly, error.code, error.status, error.details), options.json);
|
|
145
|
-
process.exitCode = 1;
|
|
146
|
-
return;
|
|
147
|
-
}
|
|
148
|
-
printError(error, options.json);
|
|
143
|
+
printDocumentError(error, options.json, FRIENDLY_ERRORS);
|
|
149
144
|
process.exitCode = 1;
|
|
150
145
|
}
|
|
151
146
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doc-patch.js","sourceRoot":"","sources":["../../src/commands/doc-patch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,
|
|
1
|
+
{"version":3,"file":"doc-patch.js","sourceRoot":"","sources":["../../src/commands/doc-patch.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,6 +6,7 @@ export declare function docShareCommand(documentId: string, areaId: string, opti
|
|
|
6
6
|
export declare function docUnshareCommand(documentId: string, areaId: string, options: {
|
|
7
7
|
json: boolean;
|
|
8
8
|
area?: string;
|
|
9
|
+
confirmWorkspaceScope?: boolean;
|
|
9
10
|
}): Promise<void>;
|
|
10
11
|
export declare function docVisibilityCommand(documentId: string, areaId: string, options: {
|
|
11
12
|
json: boolean;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { createAdapter } from '../adapters/factory.js';
|
|
2
2
|
import { confirmWriteTarget } from '../write-target.js';
|
|
3
|
-
import { formatOutput,
|
|
3
|
+
import { formatOutput, printSuccess } from '../output.js';
|
|
4
|
+
import { printDocumentError } from './doc-errors.js';
|
|
4
5
|
export async function docShareCommand(documentId, areaId, options) {
|
|
5
6
|
const agentIds = options.agents
|
|
6
7
|
? options.agents.split(',').map((s) => s.trim())
|
|
@@ -19,7 +20,7 @@ export async function docShareCommand(documentId, areaId, options) {
|
|
|
19
20
|
printSuccess(`Document ${documentId} shared with area ${areaId}${restriction}.`, false);
|
|
20
21
|
}
|
|
21
22
|
catch (error) {
|
|
22
|
-
|
|
23
|
+
printDocumentError(error, options.json);
|
|
23
24
|
process.exitCode = 1;
|
|
24
25
|
}
|
|
25
26
|
}
|
|
@@ -27,15 +28,22 @@ export async function docUnshareCommand(documentId, areaId, options) {
|
|
|
27
28
|
try {
|
|
28
29
|
await confirmWriteTarget('unshare document', options, 'existing');
|
|
29
30
|
const client = await createAdapter(options.area);
|
|
30
|
-
const response = (await client.unshareDocument(documentId, areaId));
|
|
31
|
+
const response = (await client.unshareDocument(documentId, areaId, options.confirmWorkspaceScope));
|
|
31
32
|
if (options.json) {
|
|
32
33
|
console.log(formatOutput(response, true));
|
|
33
34
|
return;
|
|
34
35
|
}
|
|
35
|
-
|
|
36
|
+
// Detaching the last area RE-SCOPES the document to the workspace and drops that
|
|
37
|
+
// share's per-agent restrictions. Saying only "unshared" would hide a change of scope
|
|
38
|
+
// behind a routine-sounding line.
|
|
39
|
+
const rescoped = response.data.scope === 'workspace'
|
|
40
|
+
? ' It was the last area, so the document is now workspace-level: reachable from ' +
|
|
41
|
+
'every area, and no longer restricted to specific agents.'
|
|
42
|
+
: '';
|
|
43
|
+
printSuccess(`Document ${documentId} unshared from area ${areaId}.${rescoped}`, false);
|
|
36
44
|
}
|
|
37
45
|
catch (error) {
|
|
38
|
-
|
|
46
|
+
printDocumentError(error, options.json);
|
|
39
47
|
process.exitCode = 1;
|
|
40
48
|
}
|
|
41
49
|
}
|
|
@@ -51,13 +59,14 @@ export async function docVisibilityCommand(documentId, areaId, options) {
|
|
|
51
59
|
console.log(formatOutput(response, true));
|
|
52
60
|
return;
|
|
53
61
|
}
|
|
54
|
-
const
|
|
55
|
-
|
|
62
|
+
const agentIdsInResponse = response.data.agent_ids ?? [];
|
|
63
|
+
const restriction = agentIdsInResponse.length > 0
|
|
64
|
+
? `Restricted to ${agentIdsInResponse.length} agent(s).`
|
|
56
65
|
: 'All agents can access.';
|
|
57
66
|
printSuccess(`Visibility updated for document ${documentId} in area ${areaId}. ${restriction}`, false);
|
|
58
67
|
}
|
|
59
68
|
catch (error) {
|
|
60
|
-
|
|
69
|
+
printDocumentError(error, options.json);
|
|
61
70
|
process.exitCode = 1;
|
|
62
71
|
}
|
|
63
72
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doc-share.js","sourceRoot":"","sources":["../../src/commands/doc-share.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,
|
|
1
|
+
{"version":3,"file":"doc-share.js","sourceRoot":"","sources":["../../src/commands/doc-share.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAsCrD,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,UAAkB,EAClB,MAAc,EACd,OAA0D;IAE1D,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM;QAC7B,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAChD,CAAC,CAAC,SAAS,CAAC;IAEd,IAAI,CAAC;QACH,MAAM,kBAAkB,CAAC,gBAAgB,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;QAChE,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACjD,MAAM,QAAQ,GAAG,CAAC,MAAM,MAAM,CAAC,aAAa,CAC1C,UAAU,EACV,MAAM,EACN,QAAQ,CACT,CAAkB,CAAC;QAEpB,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,WAAW,GACf,QAAQ,CAAC,IAAI,CAAC,oBAAoB,CAAC,MAAM,GAAG,CAAC;YAC3C,CAAC,CAAC,mBAAmB,QAAQ,CAAC,IAAI,CAAC,oBAAoB,CAAC,MAAM,YAAY;YAC1E,CAAC,CAAC,EAAE,CAAC;QACT,YAAY,CACV,YAAY,UAAU,qBAAqB,MAAM,GAAG,WAAW,GAAG,EAClE,KAAK,CACN,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,kBAAkB,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;QACxC,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,UAAkB,EAClB,MAAc,EACd,OAA0E;IAE1E,IAAI,CAAC;QACH,MAAM,kBAAkB,CAAC,kBAAkB,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;QAClE,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACjD,MAAM,QAAQ,GAAG,CAAC,MAAM,MAAM,CAAC,eAAe,CAC5C,UAAU,EACV,MAAM,EACN,OAAO,CAAC,qBAAqB,CAC9B,CAAoB,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,iFAAiF;QACjF,sFAAsF;QACtF,kCAAkC;QAClC,MAAM,QAAQ,GACZ,QAAQ,CAAC,IAAI,CAAC,KAAK,KAAK,WAAW;YACjC,CAAC,CAAC,gFAAgF;gBAChF,0DAA0D;YAC5D,CAAC,CAAC,EAAE,CAAC;QACT,YAAY,CACV,YAAY,UAAU,uBAAuB,MAAM,IAAI,QAAQ,EAAE,EACjE,KAAK,CACN,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,kBAAkB,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;QACxC,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,UAAkB,EAClB,MAAc,EACd,OAA0D;IAE1D,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM;QAC7B,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAChD,CAAC,CAAC,EAAE,CAAC;IAEP,IAAI,CAAC;QACH,MAAM,kBAAkB,CAAC,yBAAyB,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;QACzE,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACjD,MAAM,QAAQ,GAAG,CAAC,MAAM,MAAM,CAAC,qBAAqB,CAClD,UAAU,EACV,MAAM,EACN,QAAQ,CACT,CAAuB,CAAC;QAEzB,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,kBAAkB,GAAG,QAAQ,CAAC,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC;QACzD,MAAM,WAAW,GACf,kBAAkB,CAAC,MAAM,GAAG,CAAC;YAC3B,CAAC,CAAC,iBAAiB,kBAAkB,CAAC,MAAM,YAAY;YACxD,CAAC,CAAC,wBAAwB,CAAC;QAC/B,YAAY,CACV,mCAAmC,UAAU,YAAY,MAAM,KAAK,WAAW,EAAE,EACjF,KAAK,CACN,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,kBAAkB,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;QACxC,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvB,CAAC;AACH,CAAC"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { readFileSync, statSync } from 'node:fs';
|
|
2
2
|
import { createAdapter } from '../adapters/factory.js';
|
|
3
3
|
import { confirmWriteTarget } from '../write-target.js';
|
|
4
|
-
import { formatOutput,
|
|
4
|
+
import { formatOutput, printSuccess, printValidationError } from '../output.js';
|
|
5
|
+
import { printDocumentError, writeNotAcknowledged } from './doc-errors.js';
|
|
5
6
|
function formatBytes(bytes) {
|
|
6
7
|
if (bytes < 1024)
|
|
7
8
|
return `${bytes} B`;
|
|
@@ -32,6 +33,16 @@ export async function docUpdateCommand(idOrSlug, options) {
|
|
|
32
33
|
if (!options.json) {
|
|
33
34
|
process.stderr.write('\n');
|
|
34
35
|
}
|
|
36
|
+
// The acknowledgement, not the version number: `updated: false` says the content did
|
|
37
|
+
// NOT land, and reporting "updated to version N" off the bumped counter alone is the
|
|
38
|
+
// exact lie S7 exists to remove — the caller walks away believing the write happened.
|
|
39
|
+
if (presignedResult.data.updated === false) {
|
|
40
|
+
throw writeNotAcknowledged('updated', idOrSlug, {
|
|
41
|
+
document_id: presignedResult.data.document_id,
|
|
42
|
+
version: presignedResult.data.version,
|
|
43
|
+
upload_method: 'presigned',
|
|
44
|
+
});
|
|
45
|
+
}
|
|
35
46
|
if (options.json) {
|
|
36
47
|
console.log(formatOutput({ ...presignedResult, upload_method: 'presigned' }, true));
|
|
37
48
|
return;
|
|
@@ -42,6 +53,13 @@ export async function docUpdateCommand(idOrSlug, options) {
|
|
|
42
53
|
// Fallback: read file into memory and send as JSON body
|
|
43
54
|
const content = readFileSync(options.file, 'utf-8');
|
|
44
55
|
const response = (await client.updateDocument(idOrSlug, content, options.changelog));
|
|
56
|
+
if (response.data.updated === false) {
|
|
57
|
+
throw writeNotAcknowledged('updated', idOrSlug, {
|
|
58
|
+
document_id: response.data.document_id,
|
|
59
|
+
version: response.data.version,
|
|
60
|
+
upload_method: 'direct',
|
|
61
|
+
});
|
|
62
|
+
}
|
|
45
63
|
if (options.json) {
|
|
46
64
|
console.log(formatOutput({ ...response, upload_method: 'direct' }, true));
|
|
47
65
|
return;
|
|
@@ -53,7 +71,7 @@ export async function docUpdateCommand(idOrSlug, options) {
|
|
|
53
71
|
// Clear progress line if present
|
|
54
72
|
process.stderr.write('\n');
|
|
55
73
|
}
|
|
56
|
-
|
|
74
|
+
printDocumentError(error, options.json);
|
|
57
75
|
process.exitCode = 1;
|
|
58
76
|
}
|
|
59
77
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doc-update.js","sourceRoot":"","sources":["../../src/commands/doc-update.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,
|
|
1
|
+
{"version":3,"file":"doc-update.js","sourceRoot":"","sources":["../../src/commands/doc-update.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -38,7 +38,7 @@ import { createRequire } from 'node:module';
|
|
|
38
38
|
import { createAreaCommand } from './commands/create-area.js';
|
|
39
39
|
import { setWorkspaceFlag, setWorkspaceIdFlag } from './workspace-resolve.js';
|
|
40
40
|
import { printValidationError } from './output.js';
|
|
41
|
-
import { ALL_HELP, commandPath, DOCS_DESCRIPTION, IDEA_STATUS_HELP, IDEAS_DESCRIPTION, INTENT_STATUS_HELP, INTENTS_DESCRIPTION, ISSUE_STATUS_HELP, ISSUES_DESCRIPTION, LIMIT_HELP, MISSION_STATUS_HELP, MISSIONS_DESCRIPTION, multiAreaRejection, TASKS_DESCRIPTION, TASK_STATUS_HELP, VIBES_DESCRIPTION, } from './list-options.js';
|
|
41
|
+
import { ALL_HELP, commandPath, DOCS_DESCRIPTION, IDEA_STATUS_HELP, IDEAS_DESCRIPTION, INTENT_STATUS_HELP, INTENTS_DESCRIPTION, ISSUE_STATUS_HELP, ISSUES_DESCRIPTION, LIMIT_HELP, MISSION_STATUS_HELP, MISSIONS_DESCRIPTION, multiAreaRejection, allAreasWriteRejection, DOCUMENT_SCOPE_NOTE, TASKS_DESCRIPTION, TASK_STATUS_HELP, VIBES_DESCRIPTION, } from './list-options.js';
|
|
42
42
|
const program = new Command();
|
|
43
43
|
/**
|
|
44
44
|
* `--version` reads the real package version instead of a hardcoded literal, which had gone
|
|
@@ -95,7 +95,11 @@ program.hook('preAction', (thisCommand, actionCommand) => {
|
|
|
95
95
|
const path = commandPath(actionCommand.name(), actionCommand.parent?.name());
|
|
96
96
|
const area = actionCommand.opts()['area'] ??
|
|
97
97
|
thisCommand.opts()['area'];
|
|
98
|
-
const rejected =
|
|
98
|
+
const rejected =
|
|
99
|
+
// `--area all` first: `multiAreaRejection` strips `all` before counting (it is not an
|
|
100
|
+
// area), which is why the multi-area guard could never fire on it and a document write
|
|
101
|
+
// took the flag as if it had said nothing.
|
|
102
|
+
allAreasWriteRejection(path, area) ?? multiAreaRejection(path, area);
|
|
99
103
|
if (rejected) {
|
|
100
104
|
printValidationError(rejected, Boolean(thisCommand.opts()['json']));
|
|
101
105
|
// `printValidationError` sets the exit code; stop before the command writes anything.
|
|
@@ -434,12 +438,14 @@ program
|
|
|
434
438
|
});
|
|
435
439
|
program
|
|
436
440
|
.command('doc-import <title>')
|
|
437
|
-
.description(
|
|
441
|
+
.description(`Import a markdown file as a document. ${DOCUMENT_SCOPE_NOTE} — pick it with --scope`)
|
|
438
442
|
.requiredOption('--type <type>', 'Document type: spec, architecture, api, guide, decision, changelog, other')
|
|
439
443
|
.requiredOption('--file <path>', 'Path to markdown file')
|
|
440
444
|
.option('--source-path <path>', 'Original source path for reference')
|
|
441
445
|
.option('--context <text>', 'Short description of when this document is relevant')
|
|
442
|
-
.option('--
|
|
446
|
+
.option('--scope <scope>', 'Where the document lands: `workspace` (linked to no area, reachable from every one) ' +
|
|
447
|
+
'or `area` (linked to this invocation\'s area). Default: area')
|
|
448
|
+
.option('--workspace-id <slug-or-uuid>', 'WHICH workspace to create it in (slug or UUID) — not the scope; use --scope for that')
|
|
443
449
|
.action(async (title, opts, cmd) => {
|
|
444
450
|
const globalOpts = cmd.optsWithGlobals();
|
|
445
451
|
await docImportCommand(title, {
|
|
@@ -450,6 +456,7 @@ program
|
|
|
450
456
|
file: opts.file,
|
|
451
457
|
sourcePath: opts.sourcePath,
|
|
452
458
|
context: opts.context,
|
|
459
|
+
scope: opts.scope,
|
|
453
460
|
// Program-level `--workspace-id` is the fallback when it was given before the
|
|
454
461
|
// subcommand name (see `create-area`).
|
|
455
462
|
workspaceId: opts.workspaceId ?? globalOpts.workspaceId,
|
|
@@ -457,7 +464,8 @@ program
|
|
|
457
464
|
});
|
|
458
465
|
program
|
|
459
466
|
.command('doc-update <id-or-slug>')
|
|
460
|
-
.description(
|
|
467
|
+
.description(`Update a document with content from a file. ${DOCUMENT_SCOPE_NOTE}; the id or slug ` +
|
|
468
|
+
'resolves across the whole workspace, whatever this directory maps to')
|
|
461
469
|
.requiredOption('--file <path>', 'Path to markdown file with new content')
|
|
462
470
|
.option('--changelog <text>', 'Description of what changed')
|
|
463
471
|
.action(async (idOrSlug, opts, cmd) => {
|
|
@@ -471,7 +479,8 @@ program
|
|
|
471
479
|
});
|
|
472
480
|
program
|
|
473
481
|
.command('doc-patch <id-or-slug>')
|
|
474
|
-
.description(
|
|
482
|
+
.description(`Patch a document with section-based operations. ${DOCUMENT_SCOPE_NOTE}; the id or ` +
|
|
483
|
+
'slug resolves across the whole workspace')
|
|
475
484
|
.requiredOption('--base-version <n>', 'Document version to patch against (optimistic lock)')
|
|
476
485
|
.option('--operations <json>', 'JSON array of patch operations')
|
|
477
486
|
.option('--replace-section <heading>', 'Replace a section body (requires --content)')
|
|
@@ -501,7 +510,8 @@ program
|
|
|
501
510
|
});
|
|
502
511
|
program
|
|
503
512
|
.command('doc-share <document-id> <area-id>')
|
|
504
|
-
.description(
|
|
513
|
+
.description(`Link a document to another area. ${DOCUMENT_SCOPE_NOTE} — sharing a workspace-level ` +
|
|
514
|
+
'document into one area NARROWS it to that area')
|
|
505
515
|
.option('--agents <ids>', 'Comma-separated agent IDs to restrict visibility')
|
|
506
516
|
.action(async (documentId, areaId, opts, cmd) => {
|
|
507
517
|
const globalOpts = cmd.optsWithGlobals();
|
|
@@ -513,17 +523,22 @@ program
|
|
|
513
523
|
});
|
|
514
524
|
program
|
|
515
525
|
.command('doc-unshare <document-id> <area-id>')
|
|
516
|
-
.description(
|
|
517
|
-
|
|
526
|
+
.description(`Unlink a document from an area. ${DOCUMENT_SCOPE_NOTE}, so detaching the LAST area ` +
|
|
527
|
+
'makes the document workspace-level')
|
|
528
|
+
.option('--confirm-workspace-scope', 'Allow detaching the document\'s last area: it becomes workspace-level (reachable ' +
|
|
529
|
+
'from every area) and that share\'s per-agent restrictions are dropped')
|
|
530
|
+
.action(async (documentId, areaId, opts, cmd) => {
|
|
518
531
|
const globalOpts = cmd.optsWithGlobals();
|
|
519
532
|
await docUnshareCommand(documentId, areaId, {
|
|
520
533
|
json: globalOpts.json,
|
|
521
534
|
area: globalOpts.area,
|
|
535
|
+
confirmWorkspaceScope: opts.confirmWorkspaceScope,
|
|
522
536
|
});
|
|
523
537
|
});
|
|
524
538
|
program
|
|
525
539
|
.command('doc-visibility <document-id> <target-area-id>')
|
|
526
|
-
.description('Update document visibility (restrict to specific agents or allow all)'
|
|
540
|
+
.description('Update document visibility in one area (restrict to specific agents or allow all). ' +
|
|
541
|
+
`${DOCUMENT_SCOPE_NOTE}, and a restriction applies to one of those links`)
|
|
527
542
|
.option('--agents <ids>', 'Comma-separated agent IDs to restrict visibility (omit to allow all)')
|
|
528
543
|
.action(async (documentId, targetAreaId, opts, cmd) => {
|
|
529
544
|
const globalOpts = cmd.optsWithGlobals();
|