@jacobwisniewski/openstack 0.1.1

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.
Files changed (42) hide show
  1. package/README.md +46 -0
  2. package/dist/__tests__/cli.test.d.ts +2 -0
  3. package/dist/__tests__/cli.test.d.ts.map +1 -0
  4. package/dist/__tests__/cli.test.js +21 -0
  5. package/dist/__tests__/cli.test.js.map +1 -0
  6. package/dist/__tests__/commands.test.d.ts +2 -0
  7. package/dist/__tests__/commands.test.d.ts.map +1 -0
  8. package/dist/__tests__/commands.test.js +295 -0
  9. package/dist/__tests__/commands.test.js.map +1 -0
  10. package/dist/__tests__/config-operations.test.d.ts +2 -0
  11. package/dist/__tests__/config-operations.test.d.ts.map +1 -0
  12. package/dist/__tests__/config-operations.test.js +132 -0
  13. package/dist/__tests__/config-operations.test.js.map +1 -0
  14. package/dist/__tests__/fixtures.d.ts +59 -0
  15. package/dist/__tests__/fixtures.d.ts.map +1 -0
  16. package/dist/__tests__/fixtures.js +59 -0
  17. package/dist/__tests__/fixtures.js.map +1 -0
  18. package/dist/__tests__/validation.test.d.ts +2 -0
  19. package/dist/__tests__/validation.test.d.ts.map +1 -0
  20. package/dist/__tests__/validation.test.js +124 -0
  21. package/dist/__tests__/validation.test.js.map +1 -0
  22. package/dist/cli.d.ts +3 -0
  23. package/dist/cli.d.ts.map +1 -0
  24. package/dist/cli.js +142 -0
  25. package/dist/cli.js.map +1 -0
  26. package/dist/commands.d.ts +97 -0
  27. package/dist/commands.d.ts.map +1 -0
  28. package/dist/commands.js +245 -0
  29. package/dist/commands.js.map +1 -0
  30. package/dist/result.d.ts +2 -0
  31. package/dist/result.d.ts.map +1 -0
  32. package/dist/result.js +9 -0
  33. package/dist/result.js.map +1 -0
  34. package/dist/types/index.d.ts +26 -0
  35. package/dist/types/index.d.ts.map +1 -0
  36. package/dist/types/index.js +3 -0
  37. package/dist/types/index.js.map +1 -0
  38. package/dist/validation.d.ts +21 -0
  39. package/dist/validation.d.ts.map +1 -0
  40. package/dist/validation.js +32 -0
  41. package/dist/validation.js.map +1 -0
  42. package/package.json +54 -0
package/README.md ADDED
@@ -0,0 +1,46 @@
1
+ # openstack
2
+
3
+ Simple profile management for OpenCode configurations.
4
+
5
+ ## Quick Start
6
+
7
+ ```bash
8
+ npm install -g @jacobwisniewski/openstack
9
+
10
+ # Initialize openstack (backs up your current config)
11
+ openstack init
12
+
13
+ # Install a profile from git
14
+ openstack install https://github.com/user/opencode-config
15
+
16
+ # Switch to the profile
17
+ openstack use user
18
+
19
+ # List installed profiles
20
+ openstack list
21
+ ```
22
+
23
+ ## What is openstack?
24
+
25
+ openstack lets you easily switch between different OpenCode configurations. Each profile contains:
26
+
27
+ - `AGENTS.md` - Your coding rules and preferences
28
+ - `skills/` - Per-profile skills directory (isolated per profile)
29
+ - `opencode.json` - Optional configuration (modes, MCP servers, etc.)
30
+
31
+ ## Why?
32
+
33
+ - **Clean separation** - Each profile is self-contained
34
+ - **Easy to try** - Install someone's config, try it, switch back
35
+ - **Easy to remove** - Just `openstack use default` to go back
36
+ - **Simple** - No magic, just symlink management
37
+
38
+ ## Documentation
39
+
40
+ - [Development Plan](docs/plan.md) - Architecture and implementation details
41
+ - [Creating Profiles](docs/creating-profiles.md) - How to make your own profile
42
+ - [CLI Reference](docs/cli.md) - Command documentation
43
+
44
+ ## License
45
+
46
+ MIT
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=cli.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/cli.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const vitest_1 = require("vitest");
4
+ const fixtures_1 = require("./fixtures");
5
+ (0, vitest_1.describe)("Config listing display", () => {
6
+ (0, vitest_1.describe)("GIVEN profiles list", () => {
7
+ (0, vitest_1.it)("SHOULD format profile names correctly", () => {
8
+ const profiles = [
9
+ { name: "default", source: "local" },
10
+ { name: "work", source: "git" },
11
+ { name: "personal", source: "local" },
12
+ ];
13
+ const activeProfile = "work";
14
+ const formatted = (0, fixtures_1.formatProfileList)(profiles, activeProfile);
15
+ (0, vitest_1.expect)(formatted[0]).toBe(" default (local)");
16
+ (0, vitest_1.expect)(formatted[1]).toBe(" * work (git)");
17
+ (0, vitest_1.expect)(formatted[2]).toBe(" personal (local)");
18
+ });
19
+ });
20
+ });
21
+ //# sourceMappingURL=cli.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.test.js","sourceRoot":"","sources":["../../src/__tests__/cli.test.ts"],"names":[],"mappings":";;AAAA,mCAA8C;AAC9C,yCAA6D;AAE7D,IAAA,iBAAQ,EAAC,wBAAwB,EAAE,GAAG,EAAE;IACtC,IAAA,iBAAQ,EAAC,qBAAqB,EAAE,GAAG,EAAE;QACnC,IAAA,WAAE,EAAC,uCAAuC,EAAE,GAAG,EAAE;YAC/C,MAAM,QAAQ,GAAc;gBAC1B,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE;gBACpC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE;gBAC/B,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE;aACtC,CAAC;YACF,MAAM,aAAa,GAAG,MAAM,CAAC;YAE7B,MAAM,SAAS,GAAG,IAAA,4BAAiB,EAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;YAE7D,IAAA,eAAM,EAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;YACtD,IAAA,eAAM,EAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;YACpD,IAAA,eAAM,EAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;QACxD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=commands.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commands.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/commands.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,295 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ const vitest_1 = require("vitest");
37
+ const fs = __importStar(require("fs"));
38
+ const path = __importStar(require("path"));
39
+ const os = __importStar(require("os"));
40
+ const commands_1 = require("../commands");
41
+ function createRealFileSystem() {
42
+ return {
43
+ existsSync: fs.existsSync,
44
+ mkdirSync: fs.mkdirSync,
45
+ readFileSync: fs.readFileSync,
46
+ writeFileSync: fs.writeFileSync,
47
+ copyFileSync: fs.copyFileSync,
48
+ readdirSync: fs.readdirSync,
49
+ rmSync: fs.rmSync,
50
+ symlinkSync: fs.symlinkSync,
51
+ unlinkSync: fs.unlinkSync,
52
+ lstatSync: fs.lstatSync,
53
+ };
54
+ }
55
+ function createTestPaths(testDir) {
56
+ return {
57
+ openstackDir: path.join(testDir, ".config", "openstack"),
58
+ opencodeDir: path.join(testDir, ".config", "opencode"),
59
+ configFile: path.join(testDir, ".config", "openstack", "config.yaml"),
60
+ profilesDir: path.join(testDir, ".config", "openstack", "profiles"),
61
+ };
62
+ }
63
+ (0, vitest_1.describe)("isInitialized", () => {
64
+ let testDir;
65
+ let paths;
66
+ let fileSystem;
67
+ (0, vitest_1.beforeEach)(() => {
68
+ testDir = path.join(os.tmpdir(), `openstack-test-${Date.now()}`);
69
+ fs.mkdirSync(testDir, { recursive: true });
70
+ paths = createTestPaths(testDir);
71
+ fileSystem = createRealFileSystem();
72
+ });
73
+ (0, vitest_1.describe)("GIVEN no config file exists", () => {
74
+ (0, vitest_1.it)("SHOULD return false", () => {
75
+ const result = (0, commands_1.isInitialized)(paths, fileSystem);
76
+ (0, vitest_1.expect)(result).toBe(false);
77
+ });
78
+ });
79
+ (0, vitest_1.describe)("GIVEN config file exists", () => {
80
+ (0, vitest_1.it)("SHOULD return true", () => {
81
+ fs.mkdirSync(paths.openstackDir, { recursive: true });
82
+ fs.writeFileSync(paths.configFile, "test: true");
83
+ const result = (0, commands_1.isInitialized)(paths, fileSystem);
84
+ (0, vitest_1.expect)(result).toBe(true);
85
+ });
86
+ });
87
+ });
88
+ (0, vitest_1.describe)("saveConfig and loadConfig", () => {
89
+ let testDir;
90
+ let paths;
91
+ let fileSystem;
92
+ let testConfig;
93
+ (0, vitest_1.beforeEach)(() => {
94
+ testDir = path.join(os.tmpdir(), `openstack-test-${Date.now()}`);
95
+ fs.mkdirSync(testDir, { recursive: true });
96
+ paths = createTestPaths(testDir);
97
+ fileSystem = createRealFileSystem();
98
+ testConfig = {
99
+ version: "0.1.0",
100
+ active_profile: "default",
101
+ profiles: [
102
+ {
103
+ name: "default",
104
+ source: "local",
105
+ installed_at: "2025-01-09T10:00:00Z",
106
+ },
107
+ ],
108
+ };
109
+ });
110
+ (0, vitest_1.describe)("GIVEN a valid config", () => {
111
+ (0, vitest_1.it)("SHOULD save and load successfully", () => {
112
+ fs.mkdirSync(paths.openstackDir, { recursive: true });
113
+ (0, commands_1.saveConfig)(paths, fileSystem, testConfig);
114
+ const loaded = (0, commands_1.loadConfig)(paths, fileSystem);
115
+ (0, vitest_1.expect)(loaded).toEqual(testConfig);
116
+ });
117
+ });
118
+ (0, vitest_1.describe)("GIVEN config with multiple profiles", () => {
119
+ (0, vitest_1.it)("SHOULD save and load all profiles", () => {
120
+ const multiProfileConfig = {
121
+ version: "0.1.0",
122
+ active_profile: "work",
123
+ profiles: [
124
+ {
125
+ name: "default",
126
+ source: "local",
127
+ installed_at: "2025-01-09T10:00:00Z",
128
+ },
129
+ {
130
+ name: "work",
131
+ source: "https://github.com/user/repo",
132
+ installed_at: "2025-01-09T11:00:00Z",
133
+ },
134
+ ],
135
+ };
136
+ fs.mkdirSync(paths.openstackDir, { recursive: true });
137
+ (0, commands_1.saveConfig)(paths, fileSystem, multiProfileConfig);
138
+ const loaded = (0, commands_1.loadConfig)(paths, fileSystem);
139
+ (0, vitest_1.expect)(loaded).toEqual(multiProfileConfig);
140
+ });
141
+ });
142
+ (0, vitest_1.describe)("GIVEN no config file", () => {
143
+ (0, vitest_1.it)("SHOULD return null", () => {
144
+ const loaded = (0, commands_1.loadConfig)(paths, fileSystem);
145
+ (0, vitest_1.expect)(loaded).toBeNull();
146
+ });
147
+ });
148
+ });
149
+ (0, vitest_1.describe)("copyDir", () => {
150
+ let testDir;
151
+ let fileSystem;
152
+ (0, vitest_1.beforeEach)(() => {
153
+ testDir = path.join(os.tmpdir(), `openstack-test-${Date.now()}`);
154
+ fs.mkdirSync(testDir, { recursive: true });
155
+ fileSystem = createRealFileSystem();
156
+ });
157
+ (0, vitest_1.describe)("GIVEN a source directory with files and subdirectories", () => {
158
+ (0, vitest_1.it)("SHOULD copy all contents recursively", () => {
159
+ const sourceDir = path.join(testDir, "source");
160
+ const destDir = path.join(testDir, "dest");
161
+ // Create source structure
162
+ fs.mkdirSync(path.join(sourceDir, "skills", "test-skill"), { recursive: true });
163
+ fs.writeFileSync(path.join(sourceDir, "AGENTS.md"), "test content");
164
+ fs.writeFileSync(path.join(sourceDir, "skills", "test-skill", "SKILL.md"), "skill content");
165
+ (0, commands_1.copyDir)(fileSystem, sourceDir, destDir);
166
+ (0, vitest_1.expect)(fs.existsSync(path.join(destDir, "AGENTS.md"))).toBe(true);
167
+ (0, vitest_1.expect)(fs.readFileSync(path.join(destDir, "AGENTS.md"), "utf-8")).toBe("test content");
168
+ (0, vitest_1.expect)(fs.existsSync(path.join(destDir, "skills", "test-skill", "SKILL.md"))).toBe(true);
169
+ });
170
+ });
171
+ (0, vitest_1.describe)("GIVEN source directory with nested structure", () => {
172
+ (0, vitest_1.it)("SHOULD preserve directory hierarchy", () => {
173
+ const sourceDir = path.join(testDir, "source");
174
+ const destDir = path.join(testDir, "dest");
175
+ fs.mkdirSync(path.join(sourceDir, "a", "b", "c"), { recursive: true });
176
+ fs.writeFileSync(path.join(sourceDir, "a", "file.txt"), "content");
177
+ fs.writeFileSync(path.join(sourceDir, "a", "b", "file2.txt"), "content2");
178
+ (0, commands_1.copyDir)(fileSystem, sourceDir, destDir);
179
+ (0, vitest_1.expect)(fs.existsSync(path.join(destDir, "a", "file.txt"))).toBe(true);
180
+ (0, vitest_1.expect)(fs.existsSync(path.join(destDir, "a", "b", "file2.txt"))).toBe(true);
181
+ (0, vitest_1.expect)(fs.existsSync(path.join(destDir, "a", "b", "c"))).toBe(true);
182
+ });
183
+ });
184
+ });
185
+ (0, vitest_1.describe)("init", () => {
186
+ let testDir;
187
+ let paths;
188
+ let fileSystem;
189
+ (0, vitest_1.beforeEach)(() => {
190
+ testDir = path.join(os.tmpdir(), `openstack-test-${Date.now()}`);
191
+ fs.mkdirSync(testDir, { recursive: true });
192
+ paths = createTestPaths(testDir);
193
+ fileSystem = createRealFileSystem();
194
+ });
195
+ (0, vitest_1.describe)("GIVEN opencode config exists", () => {
196
+ (0, vitest_1.it)("SHOULD create backup in profiles/default", () => {
197
+ // Setup mock opencode config
198
+ fs.mkdirSync(paths.opencodeDir, { recursive: true });
199
+ fs.writeFileSync(path.join(paths.opencodeDir, "AGENTS.md"), "# My Config");
200
+ const result = (0, commands_1.init)(paths, fileSystem, { force: false }, "0.1.0");
201
+ (0, vitest_1.expect)(result.success).toBe(true);
202
+ const defaultProfileDir = path.join(paths.profilesDir, "default");
203
+ (0, vitest_1.expect)(fs.existsSync(defaultProfileDir)).toBe(true);
204
+ (0, vitest_1.expect)(fs.existsSync(path.join(defaultProfileDir, "AGENTS.md"))).toBe(true);
205
+ });
206
+ (0, vitest_1.it)("SHOULD create config.yaml with default profile", () => {
207
+ fs.mkdirSync(paths.opencodeDir, { recursive: true });
208
+ fs.writeFileSync(path.join(paths.opencodeDir, "AGENTS.md"), "# Config");
209
+ const result = (0, commands_1.init)(paths, fileSystem, { force: false }, "0.1.0");
210
+ (0, vitest_1.expect)(result.success).toBe(true);
211
+ (0, vitest_1.expect)(fs.existsSync(paths.configFile)).toBe(true);
212
+ const config = (0, commands_1.loadConfig)(paths, fileSystem);
213
+ (0, vitest_1.expect)(config).not.toBeNull();
214
+ (0, vitest_1.expect)(config.active_profile).toBe("default");
215
+ (0, vitest_1.expect)(config.profiles[0].name).toBe("default");
216
+ });
217
+ });
218
+ (0, vitest_1.describe)("GIVEN no opencode config", () => {
219
+ (0, vitest_1.it)("SHOULD return error", () => {
220
+ const result = (0, commands_1.init)(paths, fileSystem, { force: false }, "0.1.0");
221
+ (0, vitest_1.expect)(result.success).toBe(false);
222
+ if (!result.success) {
223
+ (0, vitest_1.expect)(result.error).toContain("OpenCode config directory not found");
224
+ }
225
+ });
226
+ });
227
+ (0, vitest_1.describe)("GIVEN already initialized", () => {
228
+ (0, vitest_1.it)("SHOULD return error without force flag", () => {
229
+ // Setup
230
+ fs.mkdirSync(paths.opencodeDir, { recursive: true });
231
+ fs.writeFileSync(path.join(paths.opencodeDir, "AGENTS.md"), "# Config");
232
+ // First init
233
+ (0, commands_1.init)(paths, fileSystem, { force: false }, "0.1.0");
234
+ // Second init without force
235
+ const result = (0, commands_1.init)(paths, fileSystem, { force: false }, "0.1.0");
236
+ (0, vitest_1.expect)(result.success).toBe(false);
237
+ if (!result.success) {
238
+ (0, vitest_1.expect)(result.error).toContain("Already initialized");
239
+ }
240
+ });
241
+ (0, vitest_1.it)("SHOULD succeed with force flag", () => {
242
+ // Setup
243
+ fs.mkdirSync(paths.opencodeDir, { recursive: true });
244
+ fs.writeFileSync(path.join(paths.opencodeDir, "AGENTS.md"), "# Config");
245
+ // First init
246
+ (0, commands_1.init)(paths, fileSystem, { force: false }, "0.1.0");
247
+ // Modify and re-init with force
248
+ fs.writeFileSync(path.join(paths.opencodeDir, "AGENTS.md"), "# Updated Config");
249
+ const result = (0, commands_1.init)(paths, fileSystem, { force: true }, "0.1.0");
250
+ (0, vitest_1.expect)(result.success).toBe(true);
251
+ const defaultProfileDir = path.join(paths.profilesDir, "default");
252
+ const content = fs.readFileSync(path.join(defaultProfileDir, "AGENTS.md"), "utf-8");
253
+ (0, vitest_1.expect)(content).toBe("# Updated Config");
254
+ });
255
+ });
256
+ });
257
+ (0, vitest_1.describe)("list", () => {
258
+ let testDir;
259
+ let paths;
260
+ let fileSystem;
261
+ (0, vitest_1.beforeEach)(() => {
262
+ testDir = path.join(os.tmpdir(), `openstack-test-${Date.now()}`);
263
+ fs.mkdirSync(testDir, { recursive: true });
264
+ paths = createTestPaths(testDir);
265
+ fileSystem = createRealFileSystem();
266
+ });
267
+ (0, vitest_1.describe)("GIVEN not initialized", () => {
268
+ (0, vitest_1.it)("SHOULD return null", () => {
269
+ const result = (0, commands_1.list)(paths, fileSystem);
270
+ (0, vitest_1.expect)(result).toBeNull();
271
+ });
272
+ });
273
+ (0, vitest_1.describe)("GIVEN initialized with multiple profiles", () => {
274
+ (0, vitest_1.it)("SHOULD return all profiles with active marker", () => {
275
+ // Setup
276
+ fs.mkdirSync(paths.opencodeDir, { recursive: true });
277
+ fs.writeFileSync(path.join(paths.opencodeDir, "AGENTS.md"), "# Config");
278
+ (0, commands_1.init)(paths, fileSystem, { force: false }, "0.1.0");
279
+ // Add another profile manually
280
+ const config = (0, commands_1.loadConfig)(paths, fileSystem);
281
+ config.profiles.push({
282
+ name: "work",
283
+ source: "https://github.com/user/repo",
284
+ installed_at: "2025-01-09T11:00:00Z",
285
+ });
286
+ (0, commands_1.saveConfig)(paths, fileSystem, config);
287
+ const profiles = (0, commands_1.list)(paths, fileSystem);
288
+ (0, vitest_1.expect)(profiles).toEqual([
289
+ { name: "default", source: "local", isActive: true },
290
+ { name: "work", source: "https://github.com/user/repo", isActive: false },
291
+ ]);
292
+ });
293
+ });
294
+ });
295
+ //# sourceMappingURL=commands.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commands.test.js","sourceRoot":"","sources":["../../src/__tests__/commands.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=config-operations.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-operations.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/config-operations.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,132 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ const vitest_1 = require("vitest");
37
+ const fs = __importStar(require("fs"));
38
+ const path = __importStar(require("path"));
39
+ const YAML = __importStar(require("yaml"));
40
+ const fixtures_1 = require("./fixtures");
41
+ (0, vitest_1.describe)("Config file operations", () => {
42
+ let testDir;
43
+ let configFile;
44
+ (0, vitest_1.beforeEach)(() => {
45
+ testDir = (0, fixtures_1.createTestDir)("openstack-config-test");
46
+ configFile = path.join(testDir, "config.yaml");
47
+ (0, fixtures_1.setupTestDir)(testDir);
48
+ });
49
+ (0, vitest_1.afterEach)(() => {
50
+ (0, fixtures_1.cleanupTestDir)(testDir);
51
+ });
52
+ (0, vitest_1.describe)("GIVEN a valid config file", () => {
53
+ (0, vitest_1.it)("SHOULD parse with YAML library", () => {
54
+ (0, fixtures_1.writeConfigFile)(configFile, fixtures_1.validConfigYaml);
55
+ const content = (0, fixtures_1.readConfigFile)(configFile);
56
+ const parsed = YAML.parse(content);
57
+ (0, vitest_1.expect)(parsed.version).toBe("0.1.0");
58
+ (0, vitest_1.expect)(parsed.active_profile).toBe("default");
59
+ (0, vitest_1.expect)(parsed.profiles).toHaveLength(1);
60
+ (0, vitest_1.expect)(parsed.profiles[0].name).toBe("default");
61
+ });
62
+ });
63
+ (0, vitest_1.describe)("GIVEN a config with multiple profiles", () => {
64
+ (0, vitest_1.it)("SHOULD parse all profiles correctly", () => {
65
+ (0, fixtures_1.writeConfigFile)(configFile, fixtures_1.configWithMultipleProfilesYaml);
66
+ const content = (0, fixtures_1.readConfigFile)(configFile);
67
+ const parsed = YAML.parse(content);
68
+ (0, vitest_1.expect)(parsed.profiles).toHaveLength(2);
69
+ (0, vitest_1.expect)(parsed.profiles[1].name).toBe("work");
70
+ });
71
+ });
72
+ (0, vitest_1.describe)("GIVEN an empty profiles list", () => {
73
+ (0, vitest_1.it)("SHOULD parse successfully", () => {
74
+ (0, fixtures_1.writeConfigFile)(configFile, fixtures_1.emptyProfilesConfigYaml);
75
+ const content = (0, fixtures_1.readConfigFile)(configFile);
76
+ const parsed = YAML.parse(content);
77
+ (0, vitest_1.expect)(parsed.profiles).toHaveLength(0);
78
+ });
79
+ });
80
+ (0, vitest_1.describe)("GIVEN a non-existent config file", () => {
81
+ (0, vitest_1.it)("SHOULD throw when reading", () => {
82
+ const nonExistentFile = path.join(testDir, "non-existent.yaml");
83
+ (0, vitest_1.expect)(() => (0, fixtures_1.readConfigFile)(nonExistentFile)).toThrow();
84
+ });
85
+ });
86
+ });
87
+ (0, vitest_1.describe)("Directory operations", () => {
88
+ let testDir;
89
+ let profilesDir;
90
+ let defaultProfileDir;
91
+ (0, vitest_1.beforeEach)(() => {
92
+ testDir = (0, fixtures_1.createTestDir)("openstack-dir-test");
93
+ profilesDir = path.join(testDir, "profiles");
94
+ defaultProfileDir = path.join(profilesDir, "default");
95
+ (0, fixtures_1.setupTestDir)(testDir);
96
+ });
97
+ (0, vitest_1.afterEach)(() => {
98
+ (0, fixtures_1.cleanupTestDir)(testDir);
99
+ });
100
+ (0, vitest_1.describe)("GIVEN creating directory structure", () => {
101
+ (0, vitest_1.it)("SHOULD create nested directories", () => {
102
+ fs.mkdirSync(defaultProfileDir, { recursive: true });
103
+ (0, vitest_1.expect)(fs.existsSync(defaultProfileDir)).toBe(true);
104
+ });
105
+ });
106
+ (0, vitest_1.describe)("GIVEN copying directory contents", () => {
107
+ (0, vitest_1.it)("SHOULD copy files recursively", () => {
108
+ const sourceDir = path.join(testDir, "source");
109
+ const destDir = path.join(testDir, "dest");
110
+ // Create source structure
111
+ fs.mkdirSync(path.join(sourceDir, "skills", "test-skill"), { recursive: true });
112
+ fs.writeFileSync(path.join(sourceDir, "AGENTS.md"), "test content");
113
+ fs.writeFileSync(path.join(sourceDir, "skills", "test-skill", "SKILL.md"), "skill content");
114
+ // Copy
115
+ fs.mkdirSync(destDir, { recursive: true });
116
+ const entries = fs.readdirSync(sourceDir, { withFileTypes: true });
117
+ for (const entry of entries) {
118
+ const srcPath = path.join(sourceDir, entry.name);
119
+ const destPath = path.join(destDir, entry.name);
120
+ if (entry.isDirectory()) {
121
+ fs.cpSync(srcPath, destPath, { recursive: true });
122
+ }
123
+ else {
124
+ fs.copyFileSync(srcPath, destPath);
125
+ }
126
+ }
127
+ (0, vitest_1.expect)(fs.existsSync(path.join(destDir, "AGENTS.md"))).toBe(true);
128
+ (0, vitest_1.expect)(fs.existsSync(path.join(destDir, "skills", "test-skill", "SKILL.md"))).toBe(true);
129
+ });
130
+ });
131
+ });
132
+ //# sourceMappingURL=config-operations.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-operations.test.js","sourceRoot":"","sources":["../../src/__tests__/config-operations.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,59 @@
1
+ export declare const validProfile: {
2
+ name: string;
3
+ source: string;
4
+ installed_at: string;
5
+ };
6
+ export declare const validProfileLocal: {
7
+ name: string;
8
+ source: string;
9
+ installed_at: string;
10
+ };
11
+ export declare const validConfig: {
12
+ version: string;
13
+ active_profile: string;
14
+ profiles: {
15
+ name: string;
16
+ source: string;
17
+ installed_at: string;
18
+ }[];
19
+ };
20
+ export declare const configWithMultipleProfiles: {
21
+ version: string;
22
+ active_profile: string;
23
+ profiles: {
24
+ name: string;
25
+ source: string;
26
+ installed_at: string;
27
+ }[];
28
+ };
29
+ export declare const emptyProfilesConfig: {
30
+ version: string;
31
+ active_profile: string;
32
+ profiles: never[];
33
+ };
34
+ export declare const invalidProfileEmptyName: {
35
+ name: string;
36
+ source: string;
37
+ installed_at: string;
38
+ };
39
+ export declare const invalidProfileBadDate: {
40
+ name: string;
41
+ source: string;
42
+ installed_at: string;
43
+ };
44
+ export declare const invalidProfileMissingFields: {
45
+ name: string;
46
+ };
47
+ export declare const incompleteConfig: {
48
+ version: string;
49
+ };
50
+ export declare const configWithInvalidProfile: {
51
+ version: string;
52
+ active_profile: string;
53
+ profiles: {
54
+ name: string;
55
+ source: string;
56
+ installed_at: string;
57
+ }[];
58
+ };
59
+ //# sourceMappingURL=fixtures.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fixtures.d.ts","sourceRoot":"","sources":["../../src/__tests__/fixtures.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,YAAY;;;;CAIxB,CAAC;AAEF,eAAO,MAAM,iBAAiB;;;;CAI7B,CAAC;AAEF,eAAO,MAAM,WAAW;;;;;;;;CAIvB,CAAC;AAEF,eAAO,MAAM,0BAA0B;;;;;;;;CAWtC,CAAC;AAEF,eAAO,MAAM,mBAAmB;;;;CAI/B,CAAC;AAGF,eAAO,MAAM,uBAAuB;;;;CAInC,CAAC;AAEF,eAAO,MAAM,qBAAqB;;;;CAIjC,CAAC;AAEF,eAAO,MAAM,2BAA2B;;CAEvC,CAAC;AAEF,eAAO,MAAM,gBAAgB;;CAE5B,CAAC;AAEF,eAAO,MAAM,wBAAwB;;;;;;;;CAIpC,CAAC"}