@bradygaster/squad-sdk 0.9.1 → 0.9.2-insider.2
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 +340 -296
- package/dist/agents/history-shadow.d.ts +7 -5
- package/dist/agents/history-shadow.d.ts.map +1 -1
- package/dist/agents/history-shadow.js +69 -78
- package/dist/agents/history-shadow.js.map +1 -1
- package/dist/agents/index.d.ts +12 -1
- package/dist/agents/index.d.ts.map +1 -1
- package/dist/agents/index.js +62 -9
- package/dist/agents/index.js.map +1 -1
- package/dist/agents/lifecycle.d.ts +4 -0
- package/dist/agents/lifecycle.d.ts.map +1 -1
- package/dist/agents/lifecycle.js +6 -7
- package/dist/agents/lifecycle.js.map +1 -1
- package/dist/agents/onboarding.d.ts +4 -2
- package/dist/agents/onboarding.d.ts.map +1 -1
- package/dist/agents/onboarding.js +26 -16
- package/dist/agents/onboarding.js.map +1 -1
- package/dist/agents/personal.d.ts +2 -1
- package/dist/agents/personal.d.ts.map +1 -1
- package/dist/agents/personal.js +11 -12
- package/dist/agents/personal.js.map +1 -1
- package/dist/build/bundle.d.ts.map +1 -1
- package/dist/build/bundle.js +6 -6
- package/dist/build/bundle.js.map +1 -1
- package/dist/build/github-dist.js +42 -42
- package/dist/build/release.d.ts.map +1 -1
- package/dist/build/release.js +7 -5
- package/dist/build/release.js.map +1 -1
- package/dist/casting/index.d.ts.map +1 -1
- package/dist/casting/index.js +4 -3
- package/dist/casting/index.js.map +1 -1
- package/dist/config/agent-source.d.ts +5 -1
- package/dist/config/agent-source.d.ts.map +1 -1
- package/dist/config/agent-source.js +85 -41
- package/dist/config/agent-source.js.map +1 -1
- package/dist/config/init.d.ts +4 -3
- package/dist/config/init.d.ts.map +1 -1
- package/dist/config/init.js +257 -236
- package/dist/config/init.js.map +1 -1
- package/dist/config/legacy-fallback.d.ts +3 -2
- package/dist/config/legacy-fallback.d.ts.map +1 -1
- package/dist/config/legacy-fallback.js +16 -14
- package/dist/config/legacy-fallback.js.map +1 -1
- package/dist/config/models.d.ts +9 -6
- package/dist/config/models.d.ts.map +1 -1
- package/dist/config/models.js +35 -25
- package/dist/config/models.js.map +1 -1
- package/dist/index.d.ts +5 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +14 -1
- package/dist/index.js.map +1 -1
- package/dist/marketplace/packaging.d.ts.map +1 -1
- package/dist/marketplace/packaging.js +18 -16
- package/dist/marketplace/packaging.js.map +1 -1
- package/dist/multi-squad.d.ts.map +1 -1
- package/dist/multi-squad.js +10 -9
- package/dist/multi-squad.js.map +1 -1
- package/dist/platform/comms-file-log.d.ts.map +1 -1
- package/dist/platform/comms-file-log.js +7 -6
- package/dist/platform/comms-file-log.js.map +1 -1
- package/dist/platform/comms.d.ts.map +1 -1
- package/dist/platform/comms.js +6 -5
- package/dist/platform/comms.js.map +1 -1
- package/dist/platform/index.d.ts.map +1 -1
- package/dist/platform/index.js +4 -3
- package/dist/platform/index.js.map +1 -1
- package/dist/ralph/capabilities.d.ts +30 -1
- package/dist/ralph/capabilities.d.ts.map +1 -1
- package/dist/ralph/capabilities.js +51 -6
- package/dist/ralph/capabilities.js.map +1 -1
- package/dist/ralph/index.d.ts +1 -1
- package/dist/ralph/index.d.ts.map +1 -1
- package/dist/ralph/index.js +4 -3
- package/dist/ralph/index.js.map +1 -1
- package/dist/ralph/rate-limiting.d.ts.map +1 -1
- package/dist/ralph/rate-limiting.js +4 -4
- package/dist/ralph/rate-limiting.js.map +1 -1
- package/dist/remote/bridge.d.ts.map +1 -1
- package/dist/remote/bridge.js +2 -2
- package/dist/remote/bridge.js.map +1 -1
- package/dist/resolution.d.ts +9 -0
- package/dist/resolution.d.ts.map +1 -1
- package/dist/resolution.js +39 -16
- package/dist/resolution.js.map +1 -1
- package/dist/roles/catalog.d.ts +1 -1
- package/dist/runtime/config.d.ts.map +1 -1
- package/dist/runtime/config.js +8 -7
- package/dist/runtime/config.js.map +1 -1
- package/dist/runtime/cross-squad.d.ts.map +1 -1
- package/dist/runtime/cross-squad.js +8 -7
- package/dist/runtime/cross-squad.js.map +1 -1
- package/dist/runtime/scheduler.d.ts.map +1 -1
- package/dist/runtime/scheduler.js +8 -8
- package/dist/runtime/scheduler.js.map +1 -1
- package/dist/runtime/squad-observer.d.ts.map +1 -1
- package/dist/runtime/squad-observer.js +7 -4
- package/dist/runtime/squad-observer.js.map +1 -1
- package/dist/sharing/consult.d.ts +1 -1
- package/dist/sharing/consult.d.ts.map +1 -1
- package/dist/sharing/consult.js +144 -142
- package/dist/sharing/consult.js.map +1 -1
- package/dist/sharing/export.d.ts.map +1 -1
- package/dist/sharing/export.js +16 -16
- package/dist/sharing/export.js.map +1 -1
- package/dist/sharing/import.d.ts.map +1 -1
- package/dist/sharing/import.js +13 -12
- package/dist/sharing/import.js.map +1 -1
- package/dist/skills/skill-loader.d.ts.map +1 -1
- package/dist/skills/skill-loader.js +10 -9
- package/dist/skills/skill-loader.js.map +1 -1
- package/dist/skills/skill-script-loader.d.ts.map +1 -1
- package/dist/skills/skill-script-loader.js +6 -4
- package/dist/skills/skill-script-loader.js.map +1 -1
- package/dist/skills/skill-source.d.ts +3 -1
- package/dist/skills/skill-source.d.ts.map +1 -1
- package/dist/skills/skill-source.js +18 -16
- package/dist/skills/skill-source.js.map +1 -1
- package/dist/state/collection-map.d.ts +43 -0
- package/dist/state/collection-map.d.ts.map +1 -0
- package/dist/state/collection-map.js +9 -0
- package/dist/state/collection-map.js.map +1 -0
- package/dist/state/collections.d.ts +102 -0
- package/dist/state/collections.d.ts.map +1 -0
- package/dist/state/collections.js +317 -0
- package/dist/state/collections.js.map +1 -0
- package/dist/state/domain-types.d.ts +122 -0
- package/dist/state/domain-types.d.ts.map +1 -0
- package/dist/state/domain-types.js +54 -0
- package/dist/state/domain-types.js.map +1 -0
- package/dist/state/handles.d.ts +16 -0
- package/dist/state/handles.d.ts.map +1 -0
- package/dist/state/handles.js +161 -0
- package/dist/state/handles.js.map +1 -0
- package/dist/state/index.d.ts +17 -0
- package/dist/state/index.d.ts.map +1 -0
- package/dist/state/index.js +15 -0
- package/dist/state/index.js.map +1 -0
- package/dist/state/io/charter-io.d.ts +28 -0
- package/dist/state/io/charter-io.d.ts.map +1 -0
- package/dist/state/io/charter-io.js +94 -0
- package/dist/state/io/charter-io.js.map +1 -0
- package/dist/state/io/decisions-io.d.ts +42 -0
- package/dist/state/io/decisions-io.d.ts.map +1 -0
- package/dist/state/io/decisions-io.js +66 -0
- package/dist/state/io/decisions-io.js.map +1 -0
- package/dist/state/io/history-io.d.ts +37 -0
- package/dist/state/io/history-io.d.ts.map +1 -0
- package/dist/state/io/history-io.js +102 -0
- package/dist/state/io/history-io.js.map +1 -0
- package/dist/state/io/index.d.ts +19 -0
- package/dist/state/io/index.d.ts.map +1 -0
- package/dist/state/io/index.js +19 -0
- package/dist/state/io/index.js.map +1 -0
- package/dist/state/io/routing-io.d.ts +37 -0
- package/dist/state/io/routing-io.d.ts.map +1 -0
- package/dist/state/io/routing-io.js +99 -0
- package/dist/state/io/routing-io.js.map +1 -0
- package/dist/state/io/team-io.d.ts +46 -0
- package/dist/state/io/team-io.d.ts.map +1 -0
- package/dist/state/io/team-io.js +82 -0
- package/dist/state/io/team-io.js.map +1 -0
- package/dist/state/schema.d.ts +24 -0
- package/dist/state/schema.d.ts.map +1 -0
- package/dist/state/schema.js +41 -0
- package/dist/state/schema.js.map +1 -0
- package/dist/state/squad-state.d.ts +42 -0
- package/dist/state/squad-state.d.ts.map +1 -0
- package/dist/state/squad-state.js +68 -0
- package/dist/state/squad-state.js.map +1 -0
- package/dist/storage/fs-storage-provider.d.ts +60 -0
- package/dist/storage/fs-storage-provider.d.ts.map +1 -0
- package/dist/storage/fs-storage-provider.js +377 -0
- package/dist/storage/fs-storage-provider.js.map +1 -0
- package/dist/storage/in-memory-storage-provider.d.ts +46 -0
- package/dist/storage/in-memory-storage-provider.d.ts.map +1 -0
- package/dist/storage/in-memory-storage-provider.js +264 -0
- package/dist/storage/in-memory-storage-provider.js.map +1 -0
- package/dist/storage/index.d.ts +6 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +5 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/sqlite-storage-provider.d.ts +95 -0
- package/dist/storage/sqlite-storage-provider.d.ts.map +1 -0
- package/dist/storage/sqlite-storage-provider.js +383 -0
- package/dist/storage/sqlite-storage-provider.js.map +1 -0
- package/dist/storage/storage-error.d.ts +28 -0
- package/dist/storage/storage-error.d.ts.map +1 -0
- package/dist/storage/storage-error.js +35 -0
- package/dist/storage/storage-error.js.map +1 -0
- package/dist/storage/storage-provider.d.ts +161 -0
- package/dist/storage/storage-provider.d.ts.map +1 -0
- package/dist/storage/storage-provider.js +18 -0
- package/dist/storage/storage-provider.js.map +1 -0
- package/dist/streams/resolver.d.ts.map +1 -1
- package/dist/streams/resolver.js +6 -5
- package/dist/streams/resolver.js.map +1 -1
- package/dist/tools/index.d.ts +5 -1
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +54 -15
- package/dist/tools/index.js.map +1 -1
- package/dist/upstream/resolver.d.ts +3 -2
- package/dist/upstream/resolver.d.ts.map +1 -1
- package/dist/upstream/resolver.js +33 -32
- package/dist/upstream/resolver.js.map +1 -1
- package/package.json +33 -1
- package/templates/casting/Futurama.json +9 -9
- package/templates/casting-history.json +4 -4
- package/templates/casting-policy.json +37 -37
- package/templates/casting-reference.md +104 -104
- package/templates/casting-registry.json +3 -3
- package/templates/ceremonies.md +41 -41
- package/templates/charter.md +53 -53
- package/templates/constraint-tracking.md +38 -38
- package/templates/cooperative-rate-limiting.md +229 -229
- package/templates/copilot-instructions.md +46 -46
- package/templates/history.md +10 -10
- package/templates/identity/now.md +9 -9
- package/templates/identity/wisdom.md +15 -15
- package/templates/issue-lifecycle.md +412 -412
- package/templates/keda-scaler.md +164 -164
- package/templates/machine-capabilities.md +74 -74
- package/templates/mcp-config.md +90 -90
- package/templates/multi-agent-format.md +28 -28
- package/templates/plugin-marketplace.md +49 -49
- package/templates/ralph-circuit-breaker.md +313 -313
- package/templates/raw-agent-output.md +37 -37
- package/templates/roster.md +60 -60
- package/templates/routing.md +39 -39
- package/templates/run-output.md +50 -50
- package/templates/schedule.json +19 -19
- package/templates/scribe-charter.md +123 -119
- package/templates/skill.md +24 -24
- package/templates/skills/agent-collaboration/SKILL.md +42 -42
- package/templates/skills/agent-conduct/SKILL.md +24 -24
- package/templates/skills/architectural-proposals/SKILL.md +151 -151
- package/templates/skills/ci-validation-gates/SKILL.md +84 -84
- package/templates/skills/cli-wiring/SKILL.md +47 -47
- package/templates/skills/client-compatibility/SKILL.md +89 -89
- package/templates/skills/cross-machine-coordination/SKILL.md +434 -0
- package/templates/skills/cross-squad/SKILL.md +114 -114
- package/templates/skills/distributed-mesh/SKILL.md +287 -287
- package/templates/skills/distributed-mesh/mesh.json.example +30 -30
- package/templates/skills/distributed-mesh/sync-mesh.ps1 +111 -111
- package/templates/skills/distributed-mesh/sync-mesh.sh +104 -104
- package/templates/skills/docs-standards/SKILL.md +71 -71
- package/templates/skills/economy-mode/SKILL.md +114 -114
- package/templates/skills/error-recovery/SKILL.md +99 -0
- package/templates/skills/external-comms/SKILL.md +329 -329
- package/templates/skills/gh-auth-isolation/SKILL.md +183 -183
- package/templates/skills/git-workflow/SKILL.md +204 -204
- package/templates/skills/github-multi-account/SKILL.md +95 -95
- package/templates/skills/history-hygiene/SKILL.md +36 -36
- package/templates/skills/humanizer/SKILL.md +105 -105
- package/templates/skills/init-mode/SKILL.md +102 -102
- package/templates/skills/iterative-retrieval/SKILL.md +165 -0
- package/templates/skills/model-selection/SKILL.md +117 -117
- package/templates/skills/nap/SKILL.md +24 -24
- package/templates/skills/notification-routing/SKILL.md +105 -0
- package/templates/skills/personal-squad/SKILL.md +57 -57
- package/templates/skills/pr-screenshots/SKILL.md +149 -0
- package/templates/skills/project-conventions/SKILL.md +56 -56
- package/templates/skills/ralph-two-pass-scan/SKILL.md +35 -0
- package/templates/skills/reflect/SKILL.md +229 -0
- package/templates/skills/release-process/SKILL.md +131 -423
- package/templates/skills/reskill/SKILL.md +92 -92
- package/templates/skills/retro-enforcement/SKILL.md +148 -0
- package/templates/skills/reviewer-protocol/SKILL.md +79 -79
- package/templates/skills/secret-handling/SKILL.md +200 -200
- package/templates/skills/session-recovery/SKILL.md +155 -155
- package/templates/skills/squad-conventions/SKILL.md +69 -69
- package/templates/skills/test-discipline/SKILL.md +37 -37
- package/templates/skills/tiered-memory/SKILL.md +234 -0
- package/templates/skills/windows-compatibility/SKILL.md +98 -74
- package/templates/{squad.agent.md → squad.agent.md.template} +57 -28
- package/templates/workflows/squad-ci.yml +24 -24
- package/templates/workflows/squad-docs.yml +54 -54
- package/templates/workflows/squad-heartbeat.yml +167 -171
- package/templates/workflows/squad-insider-release.yml +61 -61
- package/templates/workflows/squad-issue-assign.yml +161 -161
- package/templates/workflows/squad-label-enforce.yml +181 -181
- package/templates/workflows/squad-preview.yml +55 -55
- package/templates/workflows/squad-promote.yml +120 -120
- package/templates/workflows/squad-release.yml +77 -77
- package/templates/workflows/squad-triage.yml +260 -260
- package/templates/workflows/sync-squad-labels.yml +169 -169
|
@@ -0,0 +1,264 @@
|
|
|
1
|
+
import { posix } from 'path';
|
|
2
|
+
/**
|
|
3
|
+
* InMemoryStorageProvider — test-friendly StorageProvider backed by a Map.
|
|
4
|
+
*
|
|
5
|
+
* No filesystem access. All paths are normalized to forward-slash POSIX form.
|
|
6
|
+
* Useful for unit tests and DI scenarios where real I/O is undesirable.
|
|
7
|
+
*/
|
|
8
|
+
export class InMemoryStorageProvider {
|
|
9
|
+
files = new Map();
|
|
10
|
+
/** Track write timestamps for stat(). Key = normalized path, value = epoch ms. */
|
|
11
|
+
mtimes = new Map();
|
|
12
|
+
norm(p) {
|
|
13
|
+
// Convert Windows backslashes to forward slashes before POSIX normalization
|
|
14
|
+
// so that paths from path.join() on Windows match stored POSIX keys.
|
|
15
|
+
return posix.normalize(p.replace(/\\/g, '/')).replace(/\/+$/, '');
|
|
16
|
+
}
|
|
17
|
+
async read(filePath) {
|
|
18
|
+
return this.readSync(filePath);
|
|
19
|
+
}
|
|
20
|
+
async write(filePath, data) {
|
|
21
|
+
this.writeSync(filePath, data);
|
|
22
|
+
}
|
|
23
|
+
async append(filePath, data) {
|
|
24
|
+
this.appendSync(filePath, data);
|
|
25
|
+
}
|
|
26
|
+
async exists(filePath) {
|
|
27
|
+
return this.existsSync(filePath);
|
|
28
|
+
}
|
|
29
|
+
async list(dirPath) {
|
|
30
|
+
return this.listSync(dirPath);
|
|
31
|
+
}
|
|
32
|
+
async delete(filePath) {
|
|
33
|
+
const key = this.norm(filePath);
|
|
34
|
+
this.files.delete(key);
|
|
35
|
+
this.mtimes.delete(key);
|
|
36
|
+
}
|
|
37
|
+
async deleteDir(dirPath) {
|
|
38
|
+
const prefix = this.norm(dirPath) + '/';
|
|
39
|
+
for (const key of [...this.files.keys()]) {
|
|
40
|
+
if (key === this.norm(dirPath) || key.startsWith(prefix)) {
|
|
41
|
+
this.files.delete(key);
|
|
42
|
+
this.mtimes.delete(key);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
// ── Phase 3 Wave 1 additions ────────────────────────────────────────────
|
|
47
|
+
async isDirectory(targetPath) {
|
|
48
|
+
return this.isDirectorySync(targetPath);
|
|
49
|
+
}
|
|
50
|
+
async mkdir(dirPath, _options) {
|
|
51
|
+
this.mkdirSync(dirPath, _options);
|
|
52
|
+
}
|
|
53
|
+
async rename(oldPath, newPath) {
|
|
54
|
+
const oldKey = this.norm(oldPath);
|
|
55
|
+
const newKey = this.norm(newPath);
|
|
56
|
+
const oldPrefix = oldKey + '/';
|
|
57
|
+
// Collect all entries to move (exact match + children)
|
|
58
|
+
const toMove = [];
|
|
59
|
+
for (const [key, value] of this.files) {
|
|
60
|
+
if (key === oldKey) {
|
|
61
|
+
toMove.push([newKey, value]);
|
|
62
|
+
}
|
|
63
|
+
else if (key.startsWith(oldPrefix)) {
|
|
64
|
+
toMove.push([newKey + key.slice(oldKey.length), value]);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
if (toMove.length === 0) {
|
|
68
|
+
const err = new Error(`ENOENT: no such file or directory, rename '${oldPath}'`);
|
|
69
|
+
err.code = 'ENOENT';
|
|
70
|
+
throw err;
|
|
71
|
+
}
|
|
72
|
+
// Remove old entries
|
|
73
|
+
for (const [key] of [...this.files]) {
|
|
74
|
+
if (key === oldKey || key.startsWith(oldPrefix)) {
|
|
75
|
+
this.files.delete(key);
|
|
76
|
+
this.mtimes.delete(key);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
// Insert new entries
|
|
80
|
+
const now = Date.now();
|
|
81
|
+
for (const [key, value] of toMove) {
|
|
82
|
+
this.files.set(key, value);
|
|
83
|
+
this.mtimes.set(key, now);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
async copy(srcPath, destPath) {
|
|
87
|
+
const srcKey = this.norm(srcPath);
|
|
88
|
+
const content = this.files.get(srcKey);
|
|
89
|
+
if (content === undefined) {
|
|
90
|
+
const err = new Error(`ENOENT: no such file or directory, copy '${srcPath}'`);
|
|
91
|
+
err.code = 'ENOENT';
|
|
92
|
+
throw err;
|
|
93
|
+
}
|
|
94
|
+
const destKey = this.norm(destPath);
|
|
95
|
+
this.files.set(destKey, content);
|
|
96
|
+
this.mtimes.set(destKey, Date.now());
|
|
97
|
+
}
|
|
98
|
+
async stat(targetPath) {
|
|
99
|
+
const key = this.norm(targetPath);
|
|
100
|
+
// Exact file match
|
|
101
|
+
if (this.files.has(key)) {
|
|
102
|
+
const content = this.files.get(key);
|
|
103
|
+
return {
|
|
104
|
+
size: Buffer.byteLength(content, 'utf-8'),
|
|
105
|
+
mtimeMs: this.mtimes.get(key) ?? 0,
|
|
106
|
+
isDirectory: false,
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
// Directory: exists if any file has this prefix
|
|
110
|
+
const prefix = key + '/';
|
|
111
|
+
for (const k of this.files.keys()) {
|
|
112
|
+
if (k.startsWith(prefix)) {
|
|
113
|
+
return { size: 0, mtimeMs: 0, isDirectory: true };
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
return undefined;
|
|
117
|
+
}
|
|
118
|
+
// ── Synchronous variants ────────────────────────────────────────────────
|
|
119
|
+
readSync(filePath) {
|
|
120
|
+
return this.files.get(this.norm(filePath));
|
|
121
|
+
}
|
|
122
|
+
writeSync(filePath, data) {
|
|
123
|
+
const key = this.norm(filePath);
|
|
124
|
+
this.files.set(key, data);
|
|
125
|
+
this.mtimes.set(key, Date.now());
|
|
126
|
+
}
|
|
127
|
+
existsSync(filePath) {
|
|
128
|
+
const key = this.norm(filePath);
|
|
129
|
+
if (this.files.has(key))
|
|
130
|
+
return true;
|
|
131
|
+
// Check if any key has this as a directory prefix
|
|
132
|
+
const prefix = key + '/';
|
|
133
|
+
for (const k of this.files.keys()) {
|
|
134
|
+
if (k.startsWith(prefix))
|
|
135
|
+
return true;
|
|
136
|
+
}
|
|
137
|
+
return false;
|
|
138
|
+
}
|
|
139
|
+
listSync(dirPath) {
|
|
140
|
+
const dir = this.norm(dirPath);
|
|
141
|
+
const prefix = dir + '/';
|
|
142
|
+
const entries = new Set();
|
|
143
|
+
for (const key of this.files.keys()) {
|
|
144
|
+
if (key.startsWith(prefix)) {
|
|
145
|
+
const rest = key.slice(prefix.length);
|
|
146
|
+
const name = rest.split('/')[0];
|
|
147
|
+
entries.add(name);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
return [...entries];
|
|
151
|
+
}
|
|
152
|
+
isDirectorySync(targetPath) {
|
|
153
|
+
const key = this.norm(targetPath);
|
|
154
|
+
// A path is a directory if any stored file has it as a prefix
|
|
155
|
+
if (this.files.has(key))
|
|
156
|
+
return false; // it's a file
|
|
157
|
+
const prefix = key + '/';
|
|
158
|
+
for (const k of this.files.keys()) {
|
|
159
|
+
if (k.startsWith(prefix))
|
|
160
|
+
return true;
|
|
161
|
+
}
|
|
162
|
+
return false;
|
|
163
|
+
}
|
|
164
|
+
mkdirSync(_dirPath, _options) {
|
|
165
|
+
// In-memory provider doesn't need explicit directory creation —
|
|
166
|
+
// directories are implicit from file paths. This is a no-op.
|
|
167
|
+
}
|
|
168
|
+
statSync(targetPath) {
|
|
169
|
+
const key = this.norm(targetPath);
|
|
170
|
+
// Exact file match
|
|
171
|
+
if (this.files.has(key)) {
|
|
172
|
+
const content = this.files.get(key);
|
|
173
|
+
return {
|
|
174
|
+
size: Buffer.byteLength(content, 'utf-8'),
|
|
175
|
+
mtimeMs: this.mtimes.get(key) ?? 0,
|
|
176
|
+
isDirectory: false,
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
// Directory: exists if any file has this prefix
|
|
180
|
+
const prefix = key + '/';
|
|
181
|
+
for (const k of this.files.keys()) {
|
|
182
|
+
if (k.startsWith(prefix)) {
|
|
183
|
+
return { size: 0, mtimeMs: 0, isDirectory: true };
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
return undefined;
|
|
187
|
+
}
|
|
188
|
+
appendSync(filePath, data) {
|
|
189
|
+
const key = this.norm(filePath);
|
|
190
|
+
const existing = this.files.get(key) ?? '';
|
|
191
|
+
this.files.set(key, existing + data);
|
|
192
|
+
this.mtimes.set(key, Date.now());
|
|
193
|
+
}
|
|
194
|
+
deleteSync(filePath) {
|
|
195
|
+
const key = this.norm(filePath);
|
|
196
|
+
this.files.delete(key);
|
|
197
|
+
this.mtimes.delete(key);
|
|
198
|
+
}
|
|
199
|
+
renameSync(oldPath, newPath) {
|
|
200
|
+
const oldKey = this.norm(oldPath);
|
|
201
|
+
const newKey = this.norm(newPath);
|
|
202
|
+
const oldPrefix = oldKey + '/';
|
|
203
|
+
// Collect all entries to move (exact match + children)
|
|
204
|
+
const toMove = [];
|
|
205
|
+
for (const [key, value] of this.files) {
|
|
206
|
+
if (key === oldKey) {
|
|
207
|
+
toMove.push([newKey, value]);
|
|
208
|
+
}
|
|
209
|
+
else if (key.startsWith(oldPrefix)) {
|
|
210
|
+
toMove.push([newKey + key.slice(oldKey.length), value]);
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
if (toMove.length === 0) {
|
|
214
|
+
const err = new Error(`ENOENT: no such file or directory, rename '${oldPath}'`);
|
|
215
|
+
err.code = 'ENOENT';
|
|
216
|
+
throw err;
|
|
217
|
+
}
|
|
218
|
+
// Remove old entries
|
|
219
|
+
for (const [key] of [...this.files]) {
|
|
220
|
+
if (key === oldKey || key.startsWith(oldPrefix)) {
|
|
221
|
+
this.files.delete(key);
|
|
222
|
+
this.mtimes.delete(key);
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
// Insert new entries
|
|
226
|
+
const now = Date.now();
|
|
227
|
+
for (const [key, value] of toMove) {
|
|
228
|
+
this.files.set(key, value);
|
|
229
|
+
this.mtimes.set(key, now);
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
copySync(srcPath, destPath) {
|
|
233
|
+
const srcKey = this.norm(srcPath);
|
|
234
|
+
const content = this.files.get(srcKey);
|
|
235
|
+
if (content === undefined) {
|
|
236
|
+
const err = new Error(`ENOENT: no such file or directory, copy '${srcPath}'`);
|
|
237
|
+
err.code = 'ENOENT';
|
|
238
|
+
throw err;
|
|
239
|
+
}
|
|
240
|
+
const destKey = this.norm(destPath);
|
|
241
|
+
this.files.set(destKey, content);
|
|
242
|
+
this.mtimes.set(destKey, Date.now());
|
|
243
|
+
}
|
|
244
|
+
deleteDirSync(dirPath) {
|
|
245
|
+
const prefix = this.norm(dirPath) + '/';
|
|
246
|
+
for (const key of [...this.files.keys()]) {
|
|
247
|
+
if (key === this.norm(dirPath) || key.startsWith(prefix)) {
|
|
248
|
+
this.files.delete(key);
|
|
249
|
+
this.mtimes.delete(key);
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
// ── Test helpers────────────────────────────────────────────────────────
|
|
254
|
+
/** Return a shallow copy of the internal state for test assertions. */
|
|
255
|
+
snapshot() {
|
|
256
|
+
return new Map(this.files);
|
|
257
|
+
}
|
|
258
|
+
/** Reset all stored files. */
|
|
259
|
+
clear() {
|
|
260
|
+
this.files.clear();
|
|
261
|
+
this.mtimes.clear();
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
//# sourceMappingURL=in-memory-storage-provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"in-memory-storage-provider.js","sourceRoot":"","sources":["../../src/storage/in-memory-storage-provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export type { StorageProvider, StorageStats } from './storage-provider.js';
|
|
2
|
+
export { FSStorageProvider } from './fs-storage-provider.js';
|
|
3
|
+
export { InMemoryStorageProvider } from './in-memory-storage-provider.js';
|
|
4
|
+
export { SQLiteStorageProvider } from './sqlite-storage-provider.js';
|
|
5
|
+
export { StorageError } from './storage-error.js';
|
|
6
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/storage/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAC3E,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAC;AAC1E,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { FSStorageProvider } from './fs-storage-provider.js';
|
|
2
|
+
export { InMemoryStorageProvider } from './in-memory-storage-provider.js';
|
|
3
|
+
export { SQLiteStorageProvider } from './sqlite-storage-provider.js';
|
|
4
|
+
export { StorageError } from './storage-error.js';
|
|
5
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/storage/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAC;AAC1E,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import type { StorageProvider, StorageStats } from './storage-provider.js';
|
|
2
|
+
/**
|
|
3
|
+
* SQLiteStorageProvider -- cross-platform SQLite-backed StorageProvider using sql.js (WASM).
|
|
4
|
+
*
|
|
5
|
+
* Use this provider when you need a single-file, portable storage backend that
|
|
6
|
+
* works identically across Windows, Linux, and macOS without native compilation.
|
|
7
|
+
* It is ideal for desktop tools and CLI applications that need durable storage
|
|
8
|
+
* without external database dependencies.
|
|
9
|
+
*
|
|
10
|
+
* **Initialization:** You MUST call {@link init} before performing any read or
|
|
11
|
+
* write operations. Calling `init()` is safe to call multiple times; subsequent
|
|
12
|
+
* calls are no-ops that return the same initialization promise.
|
|
13
|
+
*
|
|
14
|
+
* **Concurrency:** This provider is designed for single-process access. Running
|
|
15
|
+
* multiple processes against the same database file simultaneously may cause
|
|
16
|
+
* data corruption because sql.js loads the entire DB into memory and persists
|
|
17
|
+
* it atomically on every write. Use file-level locking or a dedicated process
|
|
18
|
+
* if concurrent access is required.
|
|
19
|
+
*
|
|
20
|
+
* **Database location:** The database file defaults to `.squad/squad.db`
|
|
21
|
+
* relative to the working directory. The file and parent directories are
|
|
22
|
+
* created automatically on first write. Callers are responsible for deleting
|
|
23
|
+
* the file when it is no longer needed (e.g. in test cleanup).
|
|
24
|
+
*
|
|
25
|
+
* Schema: `files(path TEXT PRIMARY KEY, content TEXT, updated_at TEXT)`
|
|
26
|
+
*
|
|
27
|
+
* sql.js runs SQLite entirely in WASM -- no native compilation required.
|
|
28
|
+
* The WASM bundle is loaded lazily via dynamic `import('sql.js')` so it
|
|
29
|
+
* only impacts startup when this provider is actually instantiated.
|
|
30
|
+
*
|
|
31
|
+
* Sync methods work because sql.js operations are synchronous under the
|
|
32
|
+
* hood (WASM, not network). The DB must be initialized before sync calls.
|
|
33
|
+
*/
|
|
34
|
+
export declare class SQLiteStorageProvider implements StorageProvider {
|
|
35
|
+
private readonly dbPath;
|
|
36
|
+
private db;
|
|
37
|
+
private initPromise;
|
|
38
|
+
constructor(dbPath?: string);
|
|
39
|
+
/**
|
|
40
|
+
* Initialize the SQLite database, loading the WASM bundle and creating the
|
|
41
|
+
* schema if needed. **Must be called before any read/write operation.**
|
|
42
|
+
*
|
|
43
|
+
* Safe to call multiple times -- the first call performs initialization and
|
|
44
|
+
* subsequent calls return the same resolved promise (no extra work).
|
|
45
|
+
*
|
|
46
|
+
* If the database file already exists on disk it is loaded into memory;
|
|
47
|
+
* otherwise a fresh in-memory database is created and will be persisted on
|
|
48
|
+
* the first write.
|
|
49
|
+
*
|
|
50
|
+
* @throws If the sql.js WASM bundle cannot be loaded (e.g. missing dependency).
|
|
51
|
+
*/
|
|
52
|
+
init(): Promise<void>;
|
|
53
|
+
private doInit;
|
|
54
|
+
/** Throws if the DB has not been initialized (for sync methods). */
|
|
55
|
+
private ensureDb;
|
|
56
|
+
/** Ensure the DB is ready (for async methods). */
|
|
57
|
+
private ready;
|
|
58
|
+
/** Normalize a path to forward-slash POSIX form with no trailing slash. */
|
|
59
|
+
private norm;
|
|
60
|
+
/** Escape SQL LIKE wildcards so user-supplied paths are matched literally. */
|
|
61
|
+
private escapeLike;
|
|
62
|
+
/** Persist the in-memory DB to disk (atomic write-then-rename). */
|
|
63
|
+
private persist;
|
|
64
|
+
private now;
|
|
65
|
+
read(filePath: string): Promise<string | undefined>;
|
|
66
|
+
write(filePath: string, data: string): Promise<void>;
|
|
67
|
+
append(filePath: string, data: string): Promise<void>;
|
|
68
|
+
exists(filePath: string): Promise<boolean>;
|
|
69
|
+
list(dirPath: string): Promise<string[]>;
|
|
70
|
+
delete(filePath: string): Promise<void>;
|
|
71
|
+
deleteDir(dirPath: string): Promise<void>;
|
|
72
|
+
readSync(filePath: string): string | undefined;
|
|
73
|
+
writeSync(filePath: string, data: string): void;
|
|
74
|
+
existsSync(filePath: string): boolean;
|
|
75
|
+
listSync(dirPath: string): string[];
|
|
76
|
+
isDirectory(targetPath: string): Promise<boolean>;
|
|
77
|
+
mkdir(_dirPath: string, _options?: {
|
|
78
|
+
recursive?: boolean;
|
|
79
|
+
}): Promise<void>;
|
|
80
|
+
rename(oldPath: string, newPath: string): Promise<void>;
|
|
81
|
+
copy(srcPath: string, destPath: string): Promise<void>;
|
|
82
|
+
stat(targetPath: string): Promise<StorageStats | undefined>;
|
|
83
|
+
isDirectorySync(targetPath: string): boolean;
|
|
84
|
+
mkdirSync(_dirPath: string, _options?: {
|
|
85
|
+
recursive?: boolean;
|
|
86
|
+
}): void;
|
|
87
|
+
statSync(targetPath: string): StorageStats | undefined;
|
|
88
|
+
appendSync(filePath: string, data: string): void;
|
|
89
|
+
deleteSync(filePath: string): void;
|
|
90
|
+
renameSync(oldPath: string, newPath: string): void;
|
|
91
|
+
copySync(srcPath: string, destPath: string): void;
|
|
92
|
+
deleteDirSync(dirPath: string): void;
|
|
93
|
+
private internalWrite;
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=sqlite-storage-provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqlite-storage-provider.d.ts","sourceRoot":"","sources":["../../src/storage/sqlite-storage-provider.ts"],"names":[],"mappings":"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"}
|