@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
@@ -0,0 +1,59 @@
1
+ "use strict";
2
+ // Common test data fixtures for validation tests
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.configWithInvalidProfile = exports.incompleteConfig = exports.invalidProfileMissingFields = exports.invalidProfileBadDate = exports.invalidProfileEmptyName = exports.emptyProfilesConfig = exports.configWithMultipleProfiles = exports.validConfig = exports.validProfileLocal = exports.validProfile = void 0;
5
+ exports.validProfile = {
6
+ name: "my-profile",
7
+ source: "https://github.com/user/repo",
8
+ installed_at: "2025-01-09T10:00:00Z",
9
+ };
10
+ exports.validProfileLocal = {
11
+ name: "default",
12
+ source: "local",
13
+ installed_at: "2025-01-09T10:00:00Z",
14
+ };
15
+ exports.validConfig = {
16
+ version: "0.1.0",
17
+ active_profile: "default",
18
+ profiles: [exports.validProfileLocal],
19
+ };
20
+ exports.configWithMultipleProfiles = {
21
+ version: "0.1.0",
22
+ active_profile: "work",
23
+ profiles: [
24
+ exports.validProfileLocal,
25
+ {
26
+ name: "work",
27
+ source: "https://github.com/user/repo",
28
+ installed_at: "2025-01-09T11:00:00Z",
29
+ },
30
+ ],
31
+ };
32
+ exports.emptyProfilesConfig = {
33
+ version: "0.1.0",
34
+ active_profile: "default",
35
+ profiles: [],
36
+ };
37
+ // Invalid fixtures
38
+ exports.invalidProfileEmptyName = {
39
+ name: "",
40
+ source: "local",
41
+ installed_at: "2025-01-09T10:00:00Z",
42
+ };
43
+ exports.invalidProfileBadDate = {
44
+ name: "test",
45
+ source: "local",
46
+ installed_at: "not-a-datetime",
47
+ };
48
+ exports.invalidProfileMissingFields = {
49
+ name: "test",
50
+ };
51
+ exports.incompleteConfig = {
52
+ version: "0.1.0",
53
+ };
54
+ exports.configWithInvalidProfile = {
55
+ version: "0.1.0",
56
+ active_profile: "default",
57
+ profiles: [exports.invalidProfileEmptyName],
58
+ };
59
+ //# sourceMappingURL=fixtures.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fixtures.js","sourceRoot":"","sources":["../../src/__tests__/fixtures.ts"],"names":[],"mappings":";AAAA,iDAAiD;;;AAEpC,QAAA,YAAY,GAAG;IAC1B,IAAI,EAAE,YAAY;IAClB,MAAM,EAAE,8BAA8B;IACtC,YAAY,EAAE,sBAAsB;CACrC,CAAC;AAEW,QAAA,iBAAiB,GAAG;IAC/B,IAAI,EAAE,SAAS;IACf,MAAM,EAAE,OAAO;IACf,YAAY,EAAE,sBAAsB;CACrC,CAAC;AAEW,QAAA,WAAW,GAAG;IACzB,OAAO,EAAE,OAAO;IAChB,cAAc,EAAE,SAAS;IACzB,QAAQ,EAAE,CAAC,yBAAiB,CAAC;CAC9B,CAAC;AAEW,QAAA,0BAA0B,GAAG;IACxC,OAAO,EAAE,OAAO;IAChB,cAAc,EAAE,MAAM;IACtB,QAAQ,EAAE;QACR,yBAAiB;QACjB;YACE,IAAI,EAAE,MAAM;YACZ,MAAM,EAAE,8BAA8B;YACtC,YAAY,EAAE,sBAAsB;SACrC;KACF;CACF,CAAC;AAEW,QAAA,mBAAmB,GAAG;IACjC,OAAO,EAAE,OAAO;IAChB,cAAc,EAAE,SAAS;IACzB,QAAQ,EAAE,EAAE;CACb,CAAC;AAEF,mBAAmB;AACN,QAAA,uBAAuB,GAAG;IACrC,IAAI,EAAE,EAAE;IACR,MAAM,EAAE,OAAO;IACf,YAAY,EAAE,sBAAsB;CACrC,CAAC;AAEW,QAAA,qBAAqB,GAAG;IACnC,IAAI,EAAE,MAAM;IACZ,MAAM,EAAE,OAAO;IACf,YAAY,EAAE,gBAAgB;CAC/B,CAAC;AAEW,QAAA,2BAA2B,GAAG;IACzC,IAAI,EAAE,MAAM;CACb,CAAC;AAEW,QAAA,gBAAgB,GAAG;IAC9B,OAAO,EAAE,OAAO;CACjB,CAAC;AAEW,QAAA,wBAAwB,GAAG;IACtC,OAAO,EAAE,OAAO;IAChB,cAAc,EAAE,SAAS;IACzB,QAAQ,EAAE,CAAC,+BAAuB,CAAC;CACpC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=validation.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/validation.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,124 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const vitest_1 = require("vitest");
4
+ const validation_1 = require("../validation");
5
+ const fixtures_1 = require("./fixtures");
6
+ (0, vitest_1.describe)("ProfileEntrySchema", () => {
7
+ (0, vitest_1.describe)("GIVEN a valid profile entry", () => {
8
+ (0, vitest_1.it)("SHOULD parse successfully", () => {
9
+ const result = validation_1.ProfileEntrySchema.safeParse(fixtures_1.validProfile);
10
+ (0, vitest_1.expect)(result.success).toBe(true);
11
+ });
12
+ });
13
+ (0, vitest_1.describe)("GIVEN a profile with empty name", () => {
14
+ (0, vitest_1.it)("SHOULD fail validation", () => {
15
+ const result = validation_1.ProfileEntrySchema.safeParse(fixtures_1.invalidProfileEmptyName);
16
+ (0, vitest_1.expect)(result.success).toBe(false);
17
+ });
18
+ });
19
+ (0, vitest_1.describe)("GIVEN a profile with invalid datetime", () => {
20
+ (0, vitest_1.it)("SHOULD fail validation", () => {
21
+ const result = validation_1.ProfileEntrySchema.safeParse(fixtures_1.invalidProfileBadDate);
22
+ (0, vitest_1.expect)(result.success).toBe(false);
23
+ });
24
+ });
25
+ (0, vitest_1.describe)("GIVEN a profile missing required fields", () => {
26
+ (0, vitest_1.it)("SHOULD fail validation", () => {
27
+ const result = validation_1.ProfileEntrySchema.safeParse(fixtures_1.invalidProfileMissingFields);
28
+ (0, vitest_1.expect)(result.success).toBe(false);
29
+ });
30
+ });
31
+ });
32
+ (0, vitest_1.describe)("OpenStackConfigSchema", () => {
33
+ (0, vitest_1.describe)("GIVEN a valid config", () => {
34
+ (0, vitest_1.it)("SHOULD parse successfully", () => {
35
+ const result = validation_1.OpenStackConfigSchema.safeParse(fixtures_1.validConfig);
36
+ (0, vitest_1.expect)(result.success).toBe(true);
37
+ });
38
+ });
39
+ (0, vitest_1.describe)("GIVEN a config with multiple profiles", () => {
40
+ (0, vitest_1.it)("SHOULD parse successfully", () => {
41
+ const result = validation_1.OpenStackConfigSchema.safeParse(fixtures_1.configWithMultipleProfiles);
42
+ (0, vitest_1.expect)(result.success).toBe(true);
43
+ });
44
+ });
45
+ (0, vitest_1.describe)("GIVEN a config with empty profiles array", () => {
46
+ (0, vitest_1.it)("SHOULD parse successfully", () => {
47
+ const result = validation_1.OpenStackConfigSchema.safeParse(fixtures_1.emptyProfilesConfig);
48
+ (0, vitest_1.expect)(result.success).toBe(true);
49
+ });
50
+ });
51
+ (0, vitest_1.describe)("GIVEN a config missing required fields", () => {
52
+ (0, vitest_1.it)("SHOULD fail validation", () => {
53
+ const result = validation_1.OpenStackConfigSchema.safeParse(fixtures_1.incompleteConfig);
54
+ (0, vitest_1.expect)(result.success).toBe(false);
55
+ });
56
+ });
57
+ (0, vitest_1.describe)("GIVEN a config with invalid profile in array", () => {
58
+ (0, vitest_1.it)("SHOULD fail validation", () => {
59
+ const result = validation_1.OpenStackConfigSchema.safeParse(fixtures_1.configWithInvalidProfile);
60
+ (0, vitest_1.expect)(result.success).toBe(false);
61
+ });
62
+ });
63
+ });
64
+ (0, vitest_1.describe)("validateProfileEntry", () => {
65
+ (0, vitest_1.describe)("GIVEN a valid profile entry", () => {
66
+ (0, vitest_1.it)("SHOULD return ok with the data", () => {
67
+ const result = (0, validation_1.validateProfileEntry)(fixtures_1.validProfile);
68
+ (0, vitest_1.expect)(result.isOk()).toBe(true);
69
+ if (result.isOk()) {
70
+ (0, vitest_1.expect)(result.value.name).toBe(fixtures_1.validProfile.name);
71
+ (0, vitest_1.expect)(result.value.source).toBe(fixtures_1.validProfile.source);
72
+ }
73
+ });
74
+ });
75
+ (0, vitest_1.describe)("GIVEN an invalid profile entry", () => {
76
+ (0, vitest_1.it)("SHOULD return err with error message", () => {
77
+ const result = (0, validation_1.validateProfileEntry)(fixtures_1.invalidProfileEmptyName);
78
+ (0, vitest_1.expect)(result.isErr()).toBe(true);
79
+ if (result.isErr()) {
80
+ (0, vitest_1.expect)(result.error).toContain("name");
81
+ }
82
+ });
83
+ });
84
+ });
85
+ (0, vitest_1.describe)("validateConfig", () => {
86
+ (0, vitest_1.describe)("GIVEN a valid config", () => {
87
+ (0, vitest_1.it)("SHOULD return ok with the data", () => {
88
+ const result = (0, validation_1.validateConfig)(fixtures_1.validConfig);
89
+ (0, vitest_1.expect)(result.isOk()).toBe(true);
90
+ if (result.isOk()) {
91
+ (0, vitest_1.expect)(result.value.version).toBe(fixtures_1.validConfig.version);
92
+ (0, vitest_1.expect)(result.value.active_profile).toBe(fixtures_1.validConfig.active_profile);
93
+ (0, vitest_1.expect)(result.value.profiles).toHaveLength(1);
94
+ }
95
+ });
96
+ });
97
+ (0, vitest_1.describe)("GIVEN an invalid config", () => {
98
+ (0, vitest_1.it)("SHOULD return err with formatted error message", () => {
99
+ const invalidConfig = {
100
+ version: "0.1.0",
101
+ active_profile: "default",
102
+ profiles: [fixtures_1.invalidProfileEmptyName],
103
+ };
104
+ const result = (0, validation_1.validateConfig)(invalidConfig);
105
+ (0, vitest_1.expect)(result.isErr()).toBe(true);
106
+ if (result.isErr()) {
107
+ (0, vitest_1.expect)(result.error.length).toBeGreaterThan(0);
108
+ }
109
+ });
110
+ });
111
+ (0, vitest_1.describe)("GIVEN non-object data", () => {
112
+ (0, vitest_1.it)("SHOULD return err", () => {
113
+ const result = (0, validation_1.validateConfig)("not an object");
114
+ (0, vitest_1.expect)(result.isErr()).toBe(true);
115
+ });
116
+ });
117
+ (0, vitest_1.describe)("GIVEN null data", () => {
118
+ (0, vitest_1.it)("SHOULD return err", () => {
119
+ const result = (0, validation_1.validateConfig)(null);
120
+ (0, vitest_1.expect)(result.isErr()).toBe(true);
121
+ });
122
+ });
123
+ });
124
+ //# sourceMappingURL=validation.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.test.js","sourceRoot":"","sources":["../../src/__tests__/validation.test.ts"],"names":[],"mappings":"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"}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
package/dist/cli.js ADDED
@@ -0,0 +1,142 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
4
+ if (k2 === undefined) k2 = k;
5
+ var desc = Object.getOwnPropertyDescriptor(m, k);
6
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
7
+ desc = { enumerable: true, get: function() { return m[k]; } };
8
+ }
9
+ Object.defineProperty(o, k2, desc);
10
+ }) : (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ o[k2] = m[k];
13
+ }));
14
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
15
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
16
+ }) : function(o, v) {
17
+ o["default"] = v;
18
+ });
19
+ var __importStar = (this && this.__importStar) || (function () {
20
+ var ownKeys = function(o) {
21
+ ownKeys = Object.getOwnPropertyNames || function (o) {
22
+ var ar = [];
23
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
24
+ return ar;
25
+ };
26
+ return ownKeys(o);
27
+ };
28
+ return function (mod) {
29
+ if (mod && mod.__esModule) return mod;
30
+ var result = {};
31
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
32
+ __setModuleDefault(result, mod);
33
+ return result;
34
+ };
35
+ })();
36
+ Object.defineProperty(exports, "__esModule", { value: true });
37
+ const fs = __importStar(require("fs"));
38
+ const path = __importStar(require("path"));
39
+ const os = __importStar(require("os"));
40
+ const child_process_1 = require("child_process");
41
+ const commander_1 = require("commander");
42
+ const commands_1 = require("./commands");
43
+ const PACKAGE_JSON_PATH = path.join(__dirname, "..", "package.json");
44
+ const PACKAGE_VERSION = JSON.parse(fs.readFileSync(PACKAGE_JSON_PATH, "utf-8")).version;
45
+ function createPaths() {
46
+ const homeDir = os.homedir();
47
+ return {
48
+ openstackDir: path.join(homeDir, ".config", "openstack"),
49
+ opencodeDir: path.join(homeDir, ".config", "opencode"),
50
+ configFile: path.join(homeDir, ".config", "openstack", "config.yaml"),
51
+ profilesDir: path.join(homeDir, ".config", "openstack", "profiles"),
52
+ };
53
+ }
54
+ const fileSystem = {
55
+ existsSync: fs.existsSync,
56
+ mkdirSync: fs.mkdirSync,
57
+ readFileSync: fs.readFileSync,
58
+ writeFileSync: fs.writeFileSync,
59
+ copyFileSync: fs.copyFileSync,
60
+ readdirSync: fs.readdirSync,
61
+ rmSync: fs.rmSync,
62
+ symlinkSync: fs.symlinkSync,
63
+ unlinkSync: fs.unlinkSync,
64
+ lstatSync: fs.lstatSync,
65
+ };
66
+ const gitRunner = {
67
+ clone: (url, dest) => {
68
+ (0, child_process_1.execSync)(`git clone --depth 1 "${url}" "${dest}"`, { stdio: "inherit" });
69
+ },
70
+ };
71
+ function handleError(message) {
72
+ console.error(`Error: ${message}`);
73
+ process.exit(1);
74
+ }
75
+ commander_1.program
76
+ .name("openstack")
77
+ .description("Simple profile management for OpenCode configurations")
78
+ .version(PACKAGE_VERSION);
79
+ commander_1.program
80
+ .command("init")
81
+ .description("Initialize openstack and backup your current config")
82
+ .option("-f, --force", "Force re-initialization (DANGER: will overwrite default backup)")
83
+ .action((options) => {
84
+ const paths = createPaths();
85
+ const result = (0, commands_1.init)(paths, fileSystem, { force: options.force ?? false }, PACKAGE_VERSION);
86
+ if (!result.success) {
87
+ handleError(result.error);
88
+ }
89
+ console.log(result.message);
90
+ });
91
+ commander_1.program
92
+ .command("install <source>")
93
+ .description("Install a profile from git URL or local path")
94
+ .option("-n, --name <name>", "Custom name for the profile")
95
+ .action((source, options) => {
96
+ const paths = createPaths();
97
+ const result = (0, commands_1.install)(paths, fileSystem, gitRunner, source, { name: options.name });
98
+ if (!result.success) {
99
+ handleError(result.error);
100
+ }
101
+ console.log(result.message);
102
+ });
103
+ commander_1.program
104
+ .command("use <name>")
105
+ .description("Switch to a profile")
106
+ .action((name) => {
107
+ const paths = createPaths();
108
+ const result = (0, commands_1.use)(paths, fileSystem, { name });
109
+ if (!result.success) {
110
+ handleError(result.error);
111
+ }
112
+ console.log(result.message);
113
+ });
114
+ commander_1.program
115
+ .command("remove <name>")
116
+ .description("Remove an installed profile")
117
+ .option("-f, --force", "Force removal even if profile is active")
118
+ .action((name, options) => {
119
+ const paths = createPaths();
120
+ const result = (0, commands_1.remove)(paths, fileSystem, { name, force: options.force });
121
+ if (!result.success) {
122
+ handleError(result.error);
123
+ }
124
+ console.log(result.message);
125
+ });
126
+ commander_1.program
127
+ .command("list")
128
+ .description("List installed profiles")
129
+ .action(() => {
130
+ const paths = createPaths();
131
+ const profiles = (0, commands_1.list)(paths, fileSystem);
132
+ if (profiles === null) {
133
+ handleError("openstack not initialized. Run 'openstack init' first to backup your current config.");
134
+ }
135
+ console.log("Installed profiles:");
136
+ profiles.forEach((p) => {
137
+ const marker = p.isActive ? "*" : " ";
138
+ console.log(` ${marker} ${p.name.padEnd(12)} (${p.source})`);
139
+ });
140
+ });
141
+ commander_1.program.parse();
142
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,97 @@
1
+ import * as fs from "fs";
2
+ import { type ValidatedOpenStackConfig } from "./validation";
3
+ export interface FileSystem {
4
+ existsSync: typeof fs.existsSync;
5
+ mkdirSync: typeof fs.mkdirSync;
6
+ readFileSync: typeof fs.readFileSync;
7
+ writeFileSync: typeof fs.writeFileSync;
8
+ copyFileSync: typeof fs.copyFileSync;
9
+ readdirSync: typeof fs.readdirSync;
10
+ rmSync: typeof fs.rmSync;
11
+ symlinkSync: typeof fs.symlinkSync;
12
+ unlinkSync: typeof fs.unlinkSync;
13
+ lstatSync: typeof fs.lstatSync;
14
+ }
15
+ export interface GitRunner {
16
+ clone: (url: string, dest: string) => void;
17
+ }
18
+ export interface OpenStackConfig {
19
+ version: string;
20
+ active_profile: string;
21
+ profiles: ProfileEntry[];
22
+ }
23
+ export interface ProfileEntry {
24
+ name: string;
25
+ source: string;
26
+ installed_at: string;
27
+ }
28
+ export interface Paths {
29
+ openstackDir: string;
30
+ opencodeDir: string;
31
+ configFile: string;
32
+ profilesDir: string;
33
+ }
34
+ export interface InitOptions {
35
+ force: boolean;
36
+ }
37
+ export interface InitResult {
38
+ success: true;
39
+ message: string;
40
+ }
41
+ export interface InitError {
42
+ success: false;
43
+ error: string;
44
+ }
45
+ export type InitOutput = InitResult | InitError;
46
+ export interface InstallOptions {
47
+ name?: string;
48
+ }
49
+ export interface InstallResult {
50
+ success: true;
51
+ message: string;
52
+ }
53
+ export interface InstallError {
54
+ success: false;
55
+ error: string;
56
+ }
57
+ export type InstallOutput = InstallResult | InstallError;
58
+ export declare function isInitialized(paths: Paths, fs: FileSystem): boolean;
59
+ export declare function loadConfig(paths: Paths, fs: FileSystem): ValidatedOpenStackConfig | null;
60
+ export declare function saveConfig(paths: Paths, fs: FileSystem, config: OpenStackConfig): void;
61
+ export declare function copyDir(fs: FileSystem, src: string, dest: string): void;
62
+ export declare function init(paths: Paths, fs: FileSystem, options: InitOptions, packageVersion: string): InitOutput;
63
+ export interface ProfileListItem {
64
+ name: string;
65
+ source: string;
66
+ isActive: boolean;
67
+ }
68
+ export declare function list(paths: Paths, fs: FileSystem): ProfileListItem[] | null;
69
+ export interface RemoveOptions {
70
+ name: string;
71
+ force?: boolean;
72
+ }
73
+ export interface RemoveResult {
74
+ success: true;
75
+ message: string;
76
+ }
77
+ export interface RemoveError {
78
+ success: false;
79
+ error: string;
80
+ }
81
+ export type RemoveOutput = RemoveResult | RemoveError;
82
+ export declare function remove(paths: Paths, fs: FileSystem, options: RemoveOptions): RemoveOutput;
83
+ export declare function install(paths: Paths, fs: FileSystem, git: GitRunner, source: string, options: InstallOptions): InstallOutput;
84
+ export interface UseOptions {
85
+ name: string;
86
+ }
87
+ export interface UseResult {
88
+ success: true;
89
+ message: string;
90
+ }
91
+ export interface UseError {
92
+ success: false;
93
+ error: string;
94
+ }
95
+ export type UseOutput = UseResult | UseError;
96
+ export declare function use(paths: Paths, fs: FileSystem, options: UseOptions): UseOutput;
97
+ //# sourceMappingURL=commands.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../src/commands.ts"],"names":[],"mappings":"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"}