@dogsbay/commands 0.2.0-beta.101
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 +137 -0
- package/dist/commands/content.d.ts +78 -0
- package/dist/commands/content.d.ts.map +1 -0
- package/dist/commands/content.js +634 -0
- package/dist/commands/content.js.map +1 -0
- package/dist/commands/examples.d.ts +49 -0
- package/dist/commands/examples.d.ts.map +1 -0
- package/dist/commands/examples.js +173 -0
- package/dist/commands/examples.js.map +1 -0
- package/dist/commands/keys.d.ts +14 -0
- package/dist/commands/keys.d.ts.map +1 -0
- package/dist/commands/keys.js +87 -0
- package/dist/commands/keys.js.map +1 -0
- package/dist/commands/link-retarget.d.ts +18 -0
- package/dist/commands/link-retarget.d.ts.map +1 -0
- package/dist/commands/link-retarget.js +104 -0
- package/dist/commands/link-retarget.js.map +1 -0
- package/dist/commands/refactor-files.d.ts +27 -0
- package/dist/commands/refactor-files.d.ts.map +1 -0
- package/dist/commands/refactor-files.js +264 -0
- package/dist/commands/refactor-files.js.map +1 -0
- package/dist/commands/refactor-keys.d.ts +21 -0
- package/dist/commands/refactor-keys.d.ts.map +1 -0
- package/dist/commands/refactor-keys.js +224 -0
- package/dist/commands/refactor-keys.js.map +1 -0
- package/dist/commands/refactor-structure.d.ts +19 -0
- package/dist/commands/refactor-structure.d.ts.map +1 -0
- package/dist/commands/refactor-structure.js +314 -0
- package/dist/commands/refactor-structure.js.map +1 -0
- package/dist/commands/reindex.d.ts +10 -0
- package/dist/commands/reindex.d.ts.map +1 -0
- package/dist/commands/reindex.js +23 -0
- package/dist/commands/reindex.js.map +1 -0
- package/dist/commands/topicmap-edit.d.ts +65 -0
- package/dist/commands/topicmap-edit.d.ts.map +1 -0
- package/dist/commands/topicmap-edit.js +194 -0
- package/dist/commands/topicmap-edit.js.map +1 -0
- package/dist/commands/topicmap.d.ts +13 -0
- package/dist/commands/topicmap.d.ts.map +1 -0
- package/dist/commands/topicmap.js +69 -0
- package/dist/commands/topicmap.js.map +1 -0
- package/dist/commands/validate.d.ts +13 -0
- package/dist/commands/validate.d.ts.map +1 -0
- package/dist/commands/validate.js +753 -0
- package/dist/commands/validate.js.map +1 -0
- package/dist/commands/where-used.d.ts +16 -0
- package/dist/commands/where-used.d.ts.map +1 -0
- package/dist/commands/where-used.js +83 -0
- package/dist/commands/where-used.js.map +1 -0
- package/dist/edits.d.ts +54 -0
- package/dist/edits.d.ts.map +1 -0
- package/dist/edits.js +158 -0
- package/dist/edits.js.map +1 -0
- package/dist/engine.d.ts +103 -0
- package/dist/engine.d.ts.map +1 -0
- package/dist/engine.js +115 -0
- package/dist/engine.js.map +1 -0
- package/dist/flags.d.ts +31 -0
- package/dist/flags.d.ts.map +1 -0
- package/dist/flags.js +73 -0
- package/dist/flags.js.map +1 -0
- package/dist/frontmatter-schema.d.ts +97 -0
- package/dist/frontmatter-schema.d.ts.map +1 -0
- package/dist/frontmatter-schema.js +240 -0
- package/dist/frontmatter-schema.js.map +1 -0
- package/dist/index.d.ts +35 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +70 -0
- package/dist/index.js.map +1 -0
- package/dist/indexes.d.ts +175 -0
- package/dist/indexes.d.ts.map +1 -0
- package/dist/indexes.js +536 -0
- package/dist/indexes.js.map +1 -0
- package/dist/json-schema.d.ts +10 -0
- package/dist/json-schema.d.ts.map +1 -0
- package/dist/json-schema.js +50 -0
- package/dist/json-schema.js.map +1 -0
- package/dist/storage.d.ts +68 -0
- package/dist/storage.d.ts.map +1 -0
- package/dist/storage.js +193 -0
- package/dist/storage.js.map +1 -0
- package/dist/workspace.d.ts +30 -0
- package/dist/workspace.d.ts.map +1 -0
- package/dist/workspace.js +63 -0
- package/dist/workspace.js.map +1 -0
- package/package.json +47 -0
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Injectable workspace storage — the only I/O boundary in the engine.
|
|
3
|
+
*
|
|
4
|
+
* Commands never touch node:fs: they see a `Storage` bound to a
|
|
5
|
+
* workspace root. Implementations: `NodeStorage` (real filesystem),
|
|
6
|
+
* `MemoryStorage` (tests, browser). An Electron IPC-backed
|
|
7
|
+
* implementation slots in the same way.
|
|
8
|
+
*
|
|
9
|
+
* All paths are workspace-root-relative posix paths ("a/b.md") — no
|
|
10
|
+
* leading "./", no backslashes, no absolute paths.
|
|
11
|
+
*/
|
|
12
|
+
export interface Storage {
|
|
13
|
+
/** Every file path in the workspace (recursive), sorted, posix-relative. */
|
|
14
|
+
list(): Promise<string[]>;
|
|
15
|
+
/** Read a file as UTF-8 text. Rejects if missing. */
|
|
16
|
+
read(path: string): Promise<string>;
|
|
17
|
+
/** Write a file (creating parent directories as needed). */
|
|
18
|
+
write(path: string, content: string): Promise<void>;
|
|
19
|
+
/** Delete a file. Rejects if missing. */
|
|
20
|
+
delete(path: string): Promise<void>;
|
|
21
|
+
exists(path: string): Promise<boolean>;
|
|
22
|
+
}
|
|
23
|
+
/** Normalize any incoming path to the workspace-relative posix form. */
|
|
24
|
+
export declare const normalizeStoragePath: (path: string) => string;
|
|
25
|
+
/** In-memory storage for tests and browser embedding. */
|
|
26
|
+
export declare class MemoryStorage implements Storage {
|
|
27
|
+
private files;
|
|
28
|
+
constructor(files?: Record<string, string>);
|
|
29
|
+
list(): Promise<string[]>;
|
|
30
|
+
read(path: string): Promise<string>;
|
|
31
|
+
write(path: string, content: string): Promise<void>;
|
|
32
|
+
delete(path: string): Promise<void>;
|
|
33
|
+
exists(path: string): Promise<boolean>;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Real-filesystem storage rooted at a directory. Node-only (dynamic
|
|
37
|
+
* fs imports keep the module loadable in browser bundles that only
|
|
38
|
+
* use MemoryStorage).
|
|
39
|
+
*/
|
|
40
|
+
export interface NodeStorageOptions {
|
|
41
|
+
/**
|
|
42
|
+
* Refuse symlinks whose target resolves OUTSIDE the workspace root
|
|
43
|
+
* (list skips them; read/write/delete/exists throw). Default false —
|
|
44
|
+
* pnpm/monorepo layouts legitimately symlink content in, and the CLI
|
|
45
|
+
* runs on the user's own tree. Turn it on where the tree is UNTRUSTED
|
|
46
|
+
* and the verbs are reachable by an agent (the IDE sidecar does):
|
|
47
|
+
* a repo containing `docs/x -> ~/.ssh` would otherwise expose those files
|
|
48
|
+
* to `where-used`/`validate`/`read`-style verbs.
|
|
49
|
+
*/
|
|
50
|
+
containSymlinks?: boolean;
|
|
51
|
+
}
|
|
52
|
+
export declare class NodeStorage implements Storage {
|
|
53
|
+
private root;
|
|
54
|
+
private readonly containSymlinks;
|
|
55
|
+
private rootReal;
|
|
56
|
+
constructor(root: string, options?: NodeStorageOptions);
|
|
57
|
+
private fs;
|
|
58
|
+
private abs;
|
|
59
|
+
/** `abs()` plus, when contained, a realpath check that no symlink escapes the root. */
|
|
60
|
+
private safeAbs;
|
|
61
|
+
private isInsideRoot;
|
|
62
|
+
list(): Promise<string[]>;
|
|
63
|
+
read(path: string): Promise<string>;
|
|
64
|
+
write(path: string, content: string): Promise<void>;
|
|
65
|
+
delete(path: string): Promise<void>;
|
|
66
|
+
exists(path: string): Promise<boolean>;
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=storage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../src/storage.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,MAAM,WAAW,OAAO;IACtB,4EAA4E;IAC5E,IAAI,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC1B,qDAAqD;IACrD,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACpC,4DAA4D;IAC5D,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACpD,yCAAyC;IACzC,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACpC,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACxC;AAED,wEAAwE;AACxE,eAAO,MAAM,oBAAoB,GAAI,MAAM,MAAM,KAAG,MAiBnD,CAAC;AAEF,yDAAyD;AACzD,qBAAa,aAAc,YAAW,OAAO;IAC3C,OAAO,CAAC,KAAK,CAAsB;gBAEvB,KAAK,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM;IAMxC,IAAI,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAIzB,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAMnC,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAInD,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAMnC,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAG7C;AAOD;;;;GAIG;AACH,MAAM,WAAW,kBAAkB;IACjC;;;;;;;;OAQG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,qBAAa,WAAY,YAAW,OAAO;IAI7B,OAAO,CAAC,IAAI;IAHxB,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAU;IAC1C,OAAO,CAAC,QAAQ,CAA8B;gBAE1B,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,kBAAuB;YAIpD,EAAE;IAIhB,OAAO,CAAC,GAAG;IAQX,uFAAuF;YACzE,OAAO;YASP,YAAY;IAqBpB,IAAI,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAgDzB,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAKnC,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQnD,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKnC,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAS7C"}
|
package/dist/storage.js
ADDED
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Injectable workspace storage — the only I/O boundary in the engine.
|
|
3
|
+
*
|
|
4
|
+
* Commands never touch node:fs: they see a `Storage` bound to a
|
|
5
|
+
* workspace root. Implementations: `NodeStorage` (real filesystem),
|
|
6
|
+
* `MemoryStorage` (tests, browser). An Electron IPC-backed
|
|
7
|
+
* implementation slots in the same way.
|
|
8
|
+
*
|
|
9
|
+
* All paths are workspace-root-relative posix paths ("a/b.md") — no
|
|
10
|
+
* leading "./", no backslashes, no absolute paths.
|
|
11
|
+
*/
|
|
12
|
+
/** Normalize any incoming path to the workspace-relative posix form. */
|
|
13
|
+
export const normalizeStoragePath = (path) => {
|
|
14
|
+
const parts = [];
|
|
15
|
+
for (const seg of path.replace(/\\/g, "/").split("/")) {
|
|
16
|
+
if (seg === "" || seg === ".")
|
|
17
|
+
continue;
|
|
18
|
+
if (seg === "..") {
|
|
19
|
+
// A ".." with nothing to pop escapes the workspace — keep the
|
|
20
|
+
// marker so lookups fail loudly instead of aliasing a root file
|
|
21
|
+
if (parts.length === 0 || parts[parts.length - 1] === "..") {
|
|
22
|
+
parts.push("..");
|
|
23
|
+
continue;
|
|
24
|
+
}
|
|
25
|
+
parts.pop();
|
|
26
|
+
continue;
|
|
27
|
+
}
|
|
28
|
+
parts.push(seg);
|
|
29
|
+
}
|
|
30
|
+
return parts.join("/");
|
|
31
|
+
};
|
|
32
|
+
/** In-memory storage for tests and browser embedding. */
|
|
33
|
+
export class MemoryStorage {
|
|
34
|
+
files;
|
|
35
|
+
constructor(files = {}) {
|
|
36
|
+
this.files = new Map(Object.entries(files).map(([path, content]) => [normalizeStoragePath(path), content]));
|
|
37
|
+
}
|
|
38
|
+
async list() {
|
|
39
|
+
return [...this.files.keys()].sort();
|
|
40
|
+
}
|
|
41
|
+
async read(path) {
|
|
42
|
+
const content = this.files.get(normalizeStoragePath(path));
|
|
43
|
+
if (content === undefined)
|
|
44
|
+
throw new Error(`File not found: ${path}`);
|
|
45
|
+
return content;
|
|
46
|
+
}
|
|
47
|
+
async write(path, content) {
|
|
48
|
+
this.files.set(normalizeStoragePath(path), content);
|
|
49
|
+
}
|
|
50
|
+
async delete(path) {
|
|
51
|
+
if (!this.files.delete(normalizeStoragePath(path))) {
|
|
52
|
+
throw new Error(`File not found: ${path}`);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
async exists(path) {
|
|
56
|
+
return this.files.has(normalizeStoragePath(path));
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
/** Directories never part of a content workspace. */
|
|
60
|
+
const IGNORED_DIRS = new Set([
|
|
61
|
+
"node_modules", ".git", ".dogsbay", "dist", ".astro", ".turbo",
|
|
62
|
+
]);
|
|
63
|
+
export class NodeStorage {
|
|
64
|
+
root;
|
|
65
|
+
containSymlinks;
|
|
66
|
+
rootReal;
|
|
67
|
+
constructor(root, options = {}) {
|
|
68
|
+
this.root = root;
|
|
69
|
+
this.containSymlinks = options.containSymlinks ?? false;
|
|
70
|
+
}
|
|
71
|
+
async fs() {
|
|
72
|
+
return import("node:fs/promises");
|
|
73
|
+
}
|
|
74
|
+
abs(path) {
|
|
75
|
+
const rel = normalizeStoragePath(path);
|
|
76
|
+
if (rel.startsWith("..")) {
|
|
77
|
+
throw new Error(`Path escapes the workspace root: ${path}`);
|
|
78
|
+
}
|
|
79
|
+
return `${this.root}/${rel}`;
|
|
80
|
+
}
|
|
81
|
+
/** `abs()` plus, when contained, a realpath check that no symlink escapes the root. */
|
|
82
|
+
async safeAbs(path) {
|
|
83
|
+
const abs = this.abs(path);
|
|
84
|
+
if (!this.containSymlinks)
|
|
85
|
+
return abs;
|
|
86
|
+
if (!(await this.isInsideRoot(abs))) {
|
|
87
|
+
throw new Error(`Path resolves outside the workspace root: ${path}`);
|
|
88
|
+
}
|
|
89
|
+
return abs;
|
|
90
|
+
}
|
|
91
|
+
async isInsideRoot(abs) {
|
|
92
|
+
const fs = await this.fs();
|
|
93
|
+
this.rootReal ??= fs.realpath(this.root).catch(() => this.root);
|
|
94
|
+
const rootReal = await this.rootReal;
|
|
95
|
+
// realpath the deepest existing ancestor (the target may not exist yet on write)
|
|
96
|
+
let probe = abs;
|
|
97
|
+
let suffix = "";
|
|
98
|
+
for (;;) {
|
|
99
|
+
try {
|
|
100
|
+
const real = await fs.realpath(probe);
|
|
101
|
+
const full = real + suffix;
|
|
102
|
+
return full === rootReal || full.startsWith(rootReal + "/");
|
|
103
|
+
}
|
|
104
|
+
catch {
|
|
105
|
+
const cut = probe.lastIndexOf("/");
|
|
106
|
+
if (cut <= 0)
|
|
107
|
+
return false;
|
|
108
|
+
suffix = probe.slice(cut) + suffix;
|
|
109
|
+
probe = probe.slice(0, cut);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
async list() {
|
|
114
|
+
const fs = await this.fs();
|
|
115
|
+
const out = [];
|
|
116
|
+
// Symlinked directories are walked (pnpm/monorepo layouts symlink
|
|
117
|
+
// content in); the realpath set breaks symlink cycles
|
|
118
|
+
const visited = new Set([await fs.realpath(this.root).catch(() => this.root)]);
|
|
119
|
+
const walk = async (dir, prefix) => {
|
|
120
|
+
let entries;
|
|
121
|
+
try {
|
|
122
|
+
entries = await fs.readdir(dir, { withFileTypes: true });
|
|
123
|
+
}
|
|
124
|
+
catch {
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
for (const entry of entries) {
|
|
128
|
+
const full = `${dir}/${entry.name}`;
|
|
129
|
+
let isDirectory = entry.isDirectory();
|
|
130
|
+
let isFile = entry.isFile();
|
|
131
|
+
if (entry.isSymbolicLink()) {
|
|
132
|
+
if (this.containSymlinks && !(await this.isInsideRoot(full)))
|
|
133
|
+
continue; // escapes the root
|
|
134
|
+
try {
|
|
135
|
+
const stat = await fs.stat(full); // follows the link
|
|
136
|
+
isDirectory = stat.isDirectory();
|
|
137
|
+
isFile = stat.isFile();
|
|
138
|
+
}
|
|
139
|
+
catch {
|
|
140
|
+
continue; // dangling symlink
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
if (isDirectory) {
|
|
144
|
+
if (IGNORED_DIRS.has(entry.name))
|
|
145
|
+
continue;
|
|
146
|
+
if (entry.isSymbolicLink()) {
|
|
147
|
+
try {
|
|
148
|
+
const real = await fs.realpath(full);
|
|
149
|
+
if (visited.has(real))
|
|
150
|
+
continue;
|
|
151
|
+
visited.add(real);
|
|
152
|
+
}
|
|
153
|
+
catch {
|
|
154
|
+
continue;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
await walk(full, `${prefix}${entry.name}/`);
|
|
158
|
+
}
|
|
159
|
+
else if (isFile) {
|
|
160
|
+
out.push(`${prefix}${entry.name}`);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
};
|
|
164
|
+
await walk(this.root, "");
|
|
165
|
+
return out.sort();
|
|
166
|
+
}
|
|
167
|
+
async read(path) {
|
|
168
|
+
const fs = await this.fs();
|
|
169
|
+
return fs.readFile(await this.safeAbs(path), "utf-8");
|
|
170
|
+
}
|
|
171
|
+
async write(path, content) {
|
|
172
|
+
const fs = await this.fs();
|
|
173
|
+
const abs = await this.safeAbs(path);
|
|
174
|
+
const dir = abs.slice(0, abs.lastIndexOf("/"));
|
|
175
|
+
await fs.mkdir(dir, { recursive: true });
|
|
176
|
+
await fs.writeFile(abs, content, "utf-8");
|
|
177
|
+
}
|
|
178
|
+
async delete(path) {
|
|
179
|
+
const fs = await this.fs();
|
|
180
|
+
await fs.unlink(await this.safeAbs(path));
|
|
181
|
+
}
|
|
182
|
+
async exists(path) {
|
|
183
|
+
const fs = await this.fs();
|
|
184
|
+
try {
|
|
185
|
+
await fs.access(await this.safeAbs(path));
|
|
186
|
+
return true;
|
|
187
|
+
}
|
|
188
|
+
catch {
|
|
189
|
+
return false;
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
//# sourceMappingURL=storage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage.js","sourceRoot":"","sources":["../src/storage.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Workspace — storage plus lazily built indexes.
|
|
3
|
+
*
|
|
4
|
+
* Commands receive a Workspace and read indexes; they never walk files
|
|
5
|
+
* themselves. Long-lived hosts (JSON-RPC server, MCP) call
|
|
6
|
+
* `invalidate()` on file change; one-shot CLI runs build once.
|
|
7
|
+
*/
|
|
8
|
+
import type { Storage } from "./storage.js";
|
|
9
|
+
import { type WorkspaceIndex } from "./indexes.js";
|
|
10
|
+
export declare class Workspace {
|
|
11
|
+
readonly storage: Storage;
|
|
12
|
+
private indexPromise;
|
|
13
|
+
constructor(storage: Storage);
|
|
14
|
+
/** The workspace index, building it on first use. */
|
|
15
|
+
index(): Promise<WorkspaceIndex>;
|
|
16
|
+
/**
|
|
17
|
+
* Drop the cached index; the next `index()` call rebuilds. With `paths`,
|
|
18
|
+
* the next build is INCREMENTAL over the last complete index (only those
|
|
19
|
+
* files are re-read; see buildWorkspaceIndex) — a save in a 2,000-page
|
|
20
|
+
* project then costs one parse, not two thousand.
|
|
21
|
+
*/
|
|
22
|
+
invalidate(paths?: string[]): void;
|
|
23
|
+
private lastIndex;
|
|
24
|
+
private pendingChanged;
|
|
25
|
+
private inflightChanged;
|
|
26
|
+
private nextBuild;
|
|
27
|
+
/** Rebuild now and return the fresh index. */
|
|
28
|
+
reindex(): Promise<WorkspaceIndex>;
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=workspace.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace.d.ts","sourceRoot":"","sources":["../src/workspace.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAuB,KAAK,cAAc,EAAE,MAAM,cAAc,CAAC;AAExE,qBAAa,SAAS;aAGQ,OAAO,EAAE,OAAO;IAF5C,OAAO,CAAC,YAAY,CAAsC;gBAE9B,OAAO,EAAE,OAAO;IAE5C,qDAAqD;IACrD,KAAK,IAAI,OAAO,CAAC,cAAc,CAAC;IAsBhC;;;;;OAKG;IACH,UAAU,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI;IAgBlC,OAAO,CAAC,SAAS,CAA6B;IAC9C,OAAO,CAAC,cAAc,CAAuB;IAC7C,OAAO,CAAC,eAAe,CAAuB;IAC9C,OAAO,CAAC,SAAS,CAA8C;IAE/D,8CAA8C;IACxC,OAAO,IAAI,OAAO,CAAC,cAAc,CAAC;CAIzC"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { buildWorkspaceIndex } from "./indexes.js";
|
|
2
|
+
export class Workspace {
|
|
3
|
+
storage;
|
|
4
|
+
indexPromise;
|
|
5
|
+
constructor(storage) {
|
|
6
|
+
this.storage = storage;
|
|
7
|
+
}
|
|
8
|
+
/** The workspace index, building it on first use. */
|
|
9
|
+
index() {
|
|
10
|
+
if (!this.indexPromise) {
|
|
11
|
+
const build = this.nextBuild ?? (() => buildWorkspaceIndex(this.storage));
|
|
12
|
+
const changedNow = this.pendingChanged;
|
|
13
|
+
this.nextBuild = undefined;
|
|
14
|
+
this.pendingChanged = undefined;
|
|
15
|
+
this.inflightChanged = changedNow;
|
|
16
|
+
const building = build();
|
|
17
|
+
// A rejected build must NOT be memoized — in long-lived hosts
|
|
18
|
+
// (JSON-RPC/MCP) a transient storage error would otherwise poison
|
|
19
|
+
// every later command until an explicit invalidate()
|
|
20
|
+
building.then((idx) => {
|
|
21
|
+
if (this.indexPromise === building) {
|
|
22
|
+
this.lastIndex = idx;
|
|
23
|
+
this.inflightChanged = undefined;
|
|
24
|
+
}
|
|
25
|
+
}, () => { if (this.indexPromise === building)
|
|
26
|
+
this.indexPromise = undefined; });
|
|
27
|
+
this.indexPromise = building;
|
|
28
|
+
}
|
|
29
|
+
return this.indexPromise;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Drop the cached index; the next `index()` call rebuilds. With `paths`,
|
|
33
|
+
* the next build is INCREMENTAL over the last complete index (only those
|
|
34
|
+
* files are re-read; see buildWorkspaceIndex) — a save in a 2,000-page
|
|
35
|
+
* project then costs one parse, not two thousand.
|
|
36
|
+
*/
|
|
37
|
+
invalidate(paths) {
|
|
38
|
+
if (paths && paths.length && this.lastIndex) {
|
|
39
|
+
// a build in flight (superseded by this call) carried its own changed set; those files
|
|
40
|
+
// are in neither lastIndex nor the next build unless we fold them in
|
|
41
|
+
const changed = [...(this.pendingChanged ?? []), ...(this.inflightChanged ?? []), ...paths];
|
|
42
|
+
this.pendingChanged = changed;
|
|
43
|
+
this.indexPromise = undefined;
|
|
44
|
+
// `previous` is resolved when the build STARTS (lastIndex may advance meanwhile)
|
|
45
|
+
this.nextBuild = () => buildWorkspaceIndex(this.storage, { previous: this.lastIndex, changed });
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
this.indexPromise = undefined;
|
|
49
|
+
this.pendingChanged = undefined;
|
|
50
|
+
this.inflightChanged = undefined;
|
|
51
|
+
this.nextBuild = undefined;
|
|
52
|
+
}
|
|
53
|
+
lastIndex;
|
|
54
|
+
pendingChanged;
|
|
55
|
+
inflightChanged;
|
|
56
|
+
nextBuild;
|
|
57
|
+
/** Rebuild now and return the fresh index. */
|
|
58
|
+
async reindex() {
|
|
59
|
+
this.invalidate();
|
|
60
|
+
return this.index();
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=workspace.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace.js","sourceRoot":"","sources":["../src/workspace.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,mBAAmB,EAAuB,MAAM,cAAc,CAAC;AAExE,MAAM,OAAO,SAAS;IAGQ;IAFpB,YAAY,CAAsC;IAE1D,YAA4B,OAAgB;QAAhB,YAAO,GAAP,OAAO,CAAS;IAAG,CAAC;IAEhD,qDAAqD;IACrD,KAAK;QACH,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;YACvB,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,IAAI,CAAC,GAAG,EAAE,CAAC,mBAAmB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;YAC1E,MAAM,UAAU,GAAG,IAAI,CAAC,cAAc,CAAC;YACvC,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;YAC3B,IAAI,CAAC,cAAc,GAAG,SAAS,CAAC;YAChC,IAAI,CAAC,eAAe,GAAG,UAAU,CAAC;YAClC,MAAM,QAAQ,GAAG,KAAK,EAAE,CAAC;YACzB,8DAA8D;YAC9D,kEAAkE;YAClE,qDAAqD;YACrD,QAAQ,CAAC,IAAI,CACX,CAAC,GAAG,EAAE,EAAE;gBACN,IAAI,IAAI,CAAC,YAAY,KAAK,QAAQ,EAAE,CAAC;oBAAC,IAAI,CAAC,SAAS,GAAG,GAAG,CAAC;oBAAC,IAAI,CAAC,eAAe,GAAG,SAAS,CAAC;gBAAC,CAAC;YACjG,CAAC,EACD,GAAG,EAAE,GAAG,IAAI,IAAI,CAAC,YAAY,KAAK,QAAQ;gBAAE,IAAI,CAAC,YAAY,GAAG,SAAS,CAAC,CAAC,CAAC,CAC7E,CAAC;YACF,IAAI,CAAC,YAAY,GAAG,QAAQ,CAAC;QAC/B,CAAC;QACD,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;IAED;;;;;OAKG;IACH,UAAU,CAAC,KAAgB;QACzB,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YAC5C,uFAAuF;YACvF,qEAAqE;YACrE,MAAM,OAAO,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,eAAe,IAAI,EAAE,CAAC,EAAE,GAAG,KAAK,CAAC,CAAC;YAC5F,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC;YAC9B,IAAI,CAAC,YAAY,GAAG,SAAS,CAAC;YAC9B,iFAAiF;YACjF,IAAI,CAAC,SAAS,GAAG,GAAG,EAAE,CAAC,mBAAmB,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,CAAC,CAAC;YAChG,OAAO;QACT,CAAC;QACD,IAAI,CAAC,YAAY,GAAG,SAAS,CAAC;QAC9B,IAAI,CAAC,cAAc,GAAG,SAAS,CAAC;QAChC,IAAI,CAAC,eAAe,GAAG,SAAS,CAAC;QACjC,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;IACO,SAAS,CAA6B;IACtC,cAAc,CAAuB;IACrC,eAAe,CAAuB;IACtC,SAAS,CAA8C;IAE/D,8CAA8C;IAC9C,KAAK,CAAC,OAAO;QACX,IAAI,CAAC,UAAU,EAAE,CAAC;QAClB,OAAO,IAAI,CAAC,KAAK,EAAE,CAAC;IACtB,CAAC;CACF"}
|
package/package.json
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@dogsbay/commands",
|
|
3
|
+
"version": "0.2.0-beta.101",
|
|
4
|
+
"description": "Typed, headless-first command engine for the Dogsbay platform — one zod-defined command yields CLI, JSON-RPC, and MCP surfaces",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"types": "dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"import": "./dist/index.js"
|
|
12
|
+
}
|
|
13
|
+
},
|
|
14
|
+
"files": [
|
|
15
|
+
"dist",
|
|
16
|
+
"README.md"
|
|
17
|
+
],
|
|
18
|
+
"devDependencies": {
|
|
19
|
+
"@types/js-yaml": "^4.0.9",
|
|
20
|
+
"@types/node": "^25.9.5",
|
|
21
|
+
"typescript": "^5.9.3",
|
|
22
|
+
"vitest": "^4.1.10"
|
|
23
|
+
},
|
|
24
|
+
"dependencies": {
|
|
25
|
+
"js-yaml": "^5.2.1",
|
|
26
|
+
"zod": "^4.4.3",
|
|
27
|
+
"@dogsbay/format-topicmap": "0.2.0-beta.101",
|
|
28
|
+
"@dogsbay/minja": "0.2.0-beta.101",
|
|
29
|
+
"@dogsbay/types": "0.2.0-beta.101",
|
|
30
|
+
"@dogsbay/format-dogsbay-md": "0.2.0-beta.101"
|
|
31
|
+
},
|
|
32
|
+
"license": "MIT",
|
|
33
|
+
"repository": {
|
|
34
|
+
"type": "git",
|
|
35
|
+
"url": "https://github.com/dogsbay/dogsbay.git",
|
|
36
|
+
"directory": "packages/commands"
|
|
37
|
+
},
|
|
38
|
+
"homepage": "https://github.com/dogsbay/dogsbay/tree/main/packages/commands",
|
|
39
|
+
"bugs": {
|
|
40
|
+
"url": "https://github.com/dogsbay/dogsbay/issues"
|
|
41
|
+
},
|
|
42
|
+
"scripts": {
|
|
43
|
+
"build": "tsc",
|
|
44
|
+
"test": "vitest run",
|
|
45
|
+
"test:watch": "vitest"
|
|
46
|
+
}
|
|
47
|
+
}
|