@claudeflows/cli 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (88) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +57 -0
  3. package/bin/claudeflows.js +2 -0
  4. package/dist/commands/doctor.d.ts +3 -0
  5. package/dist/commands/doctor.d.ts.map +1 -0
  6. package/dist/commands/doctor.js +111 -0
  7. package/dist/commands/doctor.js.map +1 -0
  8. package/dist/commands/init.d.ts +3 -0
  9. package/dist/commands/init.d.ts.map +1 -0
  10. package/dist/commands/init.js +174 -0
  11. package/dist/commands/init.js.map +1 -0
  12. package/dist/commands/install.d.ts +3 -0
  13. package/dist/commands/install.d.ts.map +1 -0
  14. package/dist/commands/install.js +353 -0
  15. package/dist/commands/install.js.map +1 -0
  16. package/dist/commands/license.d.ts +3 -0
  17. package/dist/commands/license.d.ts.map +1 -0
  18. package/dist/commands/license.js +167 -0
  19. package/dist/commands/license.js.map +1 -0
  20. package/dist/commands/list.d.ts +3 -0
  21. package/dist/commands/list.d.ts.map +1 -0
  22. package/dist/commands/list.js +97 -0
  23. package/dist/commands/list.js.map +1 -0
  24. package/dist/commands/login.d.ts +3 -0
  25. package/dist/commands/login.d.ts.map +1 -0
  26. package/dist/commands/login.js +144 -0
  27. package/dist/commands/login.js.map +1 -0
  28. package/dist/commands/publish.d.ts +3 -0
  29. package/dist/commands/publish.d.ts.map +1 -0
  30. package/dist/commands/publish.js +121 -0
  31. package/dist/commands/publish.js.map +1 -0
  32. package/dist/commands/uninstall.d.ts +3 -0
  33. package/dist/commands/uninstall.d.ts.map +1 -0
  34. package/dist/commands/uninstall.js +66 -0
  35. package/dist/commands/uninstall.js.map +1 -0
  36. package/dist/commands/update.d.ts +3 -0
  37. package/dist/commands/update.d.ts.map +1 -0
  38. package/dist/commands/update.js +167 -0
  39. package/dist/commands/update.js.map +1 -0
  40. package/dist/commands/verify.d.ts +3 -0
  41. package/dist/commands/verify.d.ts.map +1 -0
  42. package/dist/commands/verify.js +129 -0
  43. package/dist/commands/verify.js.map +1 -0
  44. package/dist/index.d.ts +2 -0
  45. package/dist/index.d.ts.map +1 -0
  46. package/dist/index.js +28 -0
  47. package/dist/index.js.map +1 -0
  48. package/dist/lib/config.d.ts +10 -0
  49. package/dist/lib/config.d.ts.map +1 -0
  50. package/dist/lib/config.js +37 -0
  51. package/dist/lib/config.js.map +1 -0
  52. package/dist/lib/doctor.d.ts +14 -0
  53. package/dist/lib/doctor.d.ts.map +1 -0
  54. package/dist/lib/doctor.js +344 -0
  55. package/dist/lib/doctor.js.map +1 -0
  56. package/dist/lib/env-manager.d.ts +10 -0
  57. package/dist/lib/env-manager.d.ts.map +1 -0
  58. package/dist/lib/env-manager.js +60 -0
  59. package/dist/lib/env-manager.js.map +1 -0
  60. package/dist/lib/installer.d.ts +3 -0
  61. package/dist/lib/installer.d.ts.map +1 -0
  62. package/dist/lib/installer.js +43 -0
  63. package/dist/lib/installer.js.map +1 -0
  64. package/dist/lib/integrity.d.ts +42 -0
  65. package/dist/lib/integrity.d.ts.map +1 -0
  66. package/dist/lib/integrity.js +119 -0
  67. package/dist/lib/integrity.js.map +1 -0
  68. package/dist/lib/license.d.ts +39 -0
  69. package/dist/lib/license.d.ts.map +1 -0
  70. package/dist/lib/license.js +108 -0
  71. package/dist/lib/license.js.map +1 -0
  72. package/dist/lib/manifest.d.ts +74 -0
  73. package/dist/lib/manifest.d.ts.map +1 -0
  74. package/dist/lib/manifest.js +47 -0
  75. package/dist/lib/manifest.js.map +1 -0
  76. package/dist/lib/mcp-setup.d.ts +18 -0
  77. package/dist/lib/mcp-setup.d.ts.map +1 -0
  78. package/dist/lib/mcp-setup.js +92 -0
  79. package/dist/lib/mcp-setup.js.map +1 -0
  80. package/dist/lib/registry.d.ts +28 -0
  81. package/dist/lib/registry.d.ts.map +1 -0
  82. package/dist/lib/registry.js +77 -0
  83. package/dist/lib/registry.js.map +1 -0
  84. package/dist/lib/skill-linker.d.ts +13 -0
  85. package/dist/lib/skill-linker.d.ts.map +1 -0
  86. package/dist/lib/skill-linker.js +134 -0
  87. package/dist/lib/skill-linker.js.map +1 -0
  88. package/package.json +49 -0
@@ -0,0 +1,167 @@
1
+ import { readdir, readFile, stat, rm, mkdir, cp } from 'node:fs/promises';
2
+ import { join } from 'node:path';
3
+ import chalk from 'chalk';
4
+ import ora from 'ora';
5
+ import semver from 'semver';
6
+ import { confirm } from '@inquirer/prompts';
7
+ import { getInstalledDir, ensureDirs } from '../lib/config.js';
8
+ import { resolveWorkflow } from '../lib/registry.js';
9
+ import { downloadFromGithub } from '../lib/installer.js';
10
+ import { parseManifest } from '../lib/manifest.js';
11
+ import { linkSkills, unlinkSkills } from '../lib/skill-linker.js';
12
+ import { runDoctor } from '../lib/doctor.js';
13
+ import { mkdtemp } from 'node:fs/promises';
14
+ import { tmpdir } from 'node:os';
15
+ async function fileExists(path) {
16
+ try {
17
+ await stat(path);
18
+ return true;
19
+ }
20
+ catch {
21
+ return false;
22
+ }
23
+ }
24
+ async function updateSingleWorkflow(name) {
25
+ const installedDir = getInstalledDir();
26
+ const installDir = join(installedDir, name);
27
+ if (!(await fileExists(join(installDir, 'workflow.json')))) {
28
+ console.error(chalk.red(`Workflow "${name}" is not installed.`));
29
+ return false;
30
+ }
31
+ // Read current manifest
32
+ const currentRaw = await readFile(join(installDir, 'workflow.json'), 'utf-8');
33
+ const currentManifest = JSON.parse(currentRaw);
34
+ // Check registry for latest version
35
+ const spinner = ora(`Checking for updates to ${name}...`).start();
36
+ const registryEntry = await resolveWorkflow(name);
37
+ if (!registryEntry) {
38
+ spinner.warn(`${name} not found in registry (may be a local/URL install)`);
39
+ return false;
40
+ }
41
+ const currentVersion = currentManifest.version;
42
+ const latestVersion = registryEntry.version;
43
+ if (semver.gte(currentVersion, latestVersion)) {
44
+ spinner.succeed(`${chalk.bold(name)} is already up to date (v${currentVersion})`);
45
+ return true;
46
+ }
47
+ spinner.info(`Update available: ${chalk.bold(name)} v${currentVersion} -> v${latestVersion}`);
48
+ const shouldUpdate = await confirm({
49
+ message: `Update ${name} from v${currentVersion} to v${latestVersion}?`,
50
+ default: true,
51
+ });
52
+ if (!shouldUpdate) {
53
+ console.log(chalk.yellow('Update skipped.'));
54
+ return true;
55
+ }
56
+ // Identify user data directories to preserve
57
+ let dirsToPreserve = [];
58
+ try {
59
+ const manifest = await parseManifest(installDir);
60
+ dirsToPreserve = manifest.postInstall?.createDirs ?? [];
61
+ }
62
+ catch {
63
+ // Can't parse manifest — proceed without preservation
64
+ }
65
+ // Download to temp
66
+ const downloadSpinner = ora('Downloading update...').start();
67
+ const tempDir = await mkdtemp(join(tmpdir(), 'cw-update-'));
68
+ try {
69
+ const tempInstallDir = join(tempDir, name);
70
+ await mkdir(tempInstallDir, { recursive: true });
71
+ await downloadFromGithub(registryEntry.repository, tempInstallDir);
72
+ // Validate new version
73
+ const newManifest = await parseManifest(tempInstallDir);
74
+ downloadSpinner.succeed(`Downloaded v${newManifest.version}`);
75
+ // Preserve user data directories
76
+ for (const dir of dirsToPreserve) {
77
+ const srcDir = join(installDir, dir);
78
+ const destDir = join(tempInstallDir, dir);
79
+ if (await fileExists(srcDir)) {
80
+ await mkdir(join(destDir, '..'), { recursive: true });
81
+ await cp(srcDir, destDir, { recursive: true });
82
+ }
83
+ }
84
+ // Remove old skill links
85
+ const unlinkSpinner = ora('Updating skill links...').start();
86
+ await unlinkSkills(name, installDir);
87
+ // Replace installation
88
+ await rm(installDir, { recursive: true, force: true });
89
+ await cp(tempInstallDir, installDir, { recursive: true });
90
+ // Re-link skills
91
+ await linkSkills(name, newManifest.skills, installDir);
92
+ unlinkSpinner.succeed('Skills re-linked');
93
+ // Recreate any postInstall dirs that weren't preserved
94
+ if (newManifest.postInstall?.createDirs) {
95
+ for (const dir of newManifest.postInstall.createDirs) {
96
+ await mkdir(join(installDir, dir), { recursive: true });
97
+ }
98
+ }
99
+ // Run doctor
100
+ console.log(chalk.bold('\nHealth check:'));
101
+ const checks = await runDoctor(newManifest, installDir);
102
+ for (const check of checks) {
103
+ const icon = check.status === 'ok'
104
+ ? chalk.green('\u2713')
105
+ : check.status === 'warn'
106
+ ? chalk.yellow('\u26A0')
107
+ : chalk.red('\u2717');
108
+ console.log(` ${icon} ${check.message}`);
109
+ }
110
+ console.log(chalk.green(`\n\u2713 Successfully updated ${chalk.bold(name)} to v${newManifest.version}`));
111
+ if (newManifest.postInstall?.message) {
112
+ console.log(chalk.cyan(`\n${newManifest.postInstall.message}`));
113
+ }
114
+ return true;
115
+ }
116
+ finally {
117
+ await rm(tempDir, { recursive: true, force: true });
118
+ }
119
+ }
120
+ export function registerUpdate(program) {
121
+ program
122
+ .command('update [name]')
123
+ .description('Update installed workflows to their latest versions')
124
+ .action(async (name) => {
125
+ try {
126
+ await ensureDirs();
127
+ if (name) {
128
+ await updateSingleWorkflow(name);
129
+ }
130
+ else {
131
+ // Update all installed workflows
132
+ const installedDir = getInstalledDir();
133
+ let entries;
134
+ try {
135
+ entries = await readdir(installedDir);
136
+ }
137
+ catch {
138
+ entries = [];
139
+ }
140
+ if (entries.length === 0) {
141
+ console.log(chalk.dim('No workflows installed.'));
142
+ return;
143
+ }
144
+ console.log(chalk.bold('Checking all workflows for updates...\n'));
145
+ for (const entry of entries) {
146
+ const dir = join(installedDir, entry);
147
+ try {
148
+ const s = await stat(dir);
149
+ if (!s.isDirectory())
150
+ continue;
151
+ await stat(join(dir, 'workflow.json'));
152
+ }
153
+ catch {
154
+ continue;
155
+ }
156
+ await updateSingleWorkflow(entry);
157
+ console.log('');
158
+ }
159
+ }
160
+ }
161
+ catch (err) {
162
+ console.error(chalk.red(`Update failed: ${err.message}`));
163
+ process.exit(1);
164
+ }
165
+ });
166
+ }
167
+ //# sourceMappingURL=update.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerVerify(program: Command): void;
3
+ //# sourceMappingURL=verify.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../../src/commands/verify.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAmBpC,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAmHrD"}
@@ -0,0 +1,129 @@
1
+ import { readdir, stat } from 'node:fs/promises';
2
+ import { join } from 'node:path';
3
+ import chalk from 'chalk';
4
+ import ora from 'ora';
5
+ import { getInstalledDir } from '../lib/config.js';
6
+ import { parseManifest } from '../lib/manifest.js';
7
+ import { verifyIntegrity, verifySignature } from '../lib/integrity.js';
8
+ import { getVersionIntegrity } from '../lib/registry.js';
9
+ async function fileExists(path) {
10
+ try {
11
+ await stat(path);
12
+ return true;
13
+ }
14
+ catch {
15
+ return false;
16
+ }
17
+ }
18
+ export function registerVerify(program) {
19
+ program
20
+ .command('verify [name]')
21
+ .description('Verify file integrity and signatures for installed workflows')
22
+ .option('-v, --verbose', 'Show per-file hash details', false)
23
+ .action(async (name, options) => {
24
+ try {
25
+ const installedDir = getInstalledDir();
26
+ // If no name given, verify all installed workflows
27
+ let workflows;
28
+ if (name) {
29
+ workflows = [name];
30
+ }
31
+ else {
32
+ try {
33
+ const entries = await readdir(installedDir, { withFileTypes: true });
34
+ workflows = entries
35
+ .filter((e) => e.isDirectory())
36
+ .map((e) => e.name);
37
+ }
38
+ catch {
39
+ console.log(chalk.yellow('No workflows installed.'));
40
+ return;
41
+ }
42
+ }
43
+ if (workflows.length === 0) {
44
+ console.log(chalk.yellow('No workflows to verify.'));
45
+ return;
46
+ }
47
+ let allValid = true;
48
+ for (const wfName of workflows) {
49
+ const installDir = join(installedDir, wfName);
50
+ if (!(await fileExists(join(installDir, 'workflow.json')))) {
51
+ console.log(chalk.red(`\n${wfName}: not found`));
52
+ allValid = false;
53
+ continue;
54
+ }
55
+ console.log(chalk.bold(`\n${wfName}:`));
56
+ const manifest = await parseManifest(installDir);
57
+ // Check local integrity block
58
+ if (!manifest.integrity) {
59
+ console.log(chalk.yellow(' No integrity block in workflow.json — skipping hash verification'));
60
+ console.log(chalk.dim(' Publish with `claudeflows publish` to generate integrity data'));
61
+ }
62
+ else {
63
+ const spinner = ora(' Verifying file hashes...').start();
64
+ const result = await verifyIntegrity(installDir, manifest.integrity);
65
+ if (result.valid) {
66
+ spinner.succeed(chalk.green(' All file hashes match'));
67
+ }
68
+ else {
69
+ spinner.fail(chalk.red(' Integrity check failed'));
70
+ allValid = false;
71
+ if (result.mismatches.length > 0) {
72
+ console.log(chalk.red(' Modified files:'));
73
+ for (const f of result.mismatches) {
74
+ console.log(chalk.red(` - ${f}`));
75
+ }
76
+ }
77
+ if (result.missing.length > 0) {
78
+ console.log(chalk.red(' Missing files:'));
79
+ for (const f of result.missing) {
80
+ console.log(chalk.red(` - ${f}`));
81
+ }
82
+ }
83
+ if (result.extra.length > 0) {
84
+ console.log(chalk.yellow(' Extra files (not in manifest):'));
85
+ for (const f of result.extra) {
86
+ console.log(chalk.yellow(` - ${f}`));
87
+ }
88
+ }
89
+ }
90
+ if (options.verbose) {
91
+ console.log(chalk.dim(` Root hash: ${manifest.integrity.root}`));
92
+ console.log(chalk.dim(` Files hashed: ${Object.keys(manifest.integrity.files).length}`));
93
+ }
94
+ }
95
+ // Check registry signature
96
+ const registryIntegrity = await getVersionIntegrity(wfName, manifest.version);
97
+ if (registryIntegrity) {
98
+ if (manifest.integrity) {
99
+ const sigValid = verifySignature(manifest.integrity.root, registryIntegrity.signature);
100
+ if (sigValid) {
101
+ console.log(chalk.green(' Signature: verified'));
102
+ }
103
+ else {
104
+ console.log(chalk.red(' Signature: MISMATCH — this workflow may have been tampered with'));
105
+ allValid = false;
106
+ }
107
+ }
108
+ }
109
+ else {
110
+ console.log(chalk.dim(' No registry signature available for this version'));
111
+ }
112
+ }
113
+ // Summary
114
+ console.log('');
115
+ if (allValid) {
116
+ console.log(chalk.green('All verifications passed.'));
117
+ }
118
+ else {
119
+ console.log(chalk.red('Some verifications failed. See details above.'));
120
+ process.exit(1);
121
+ }
122
+ }
123
+ catch (err) {
124
+ console.error(chalk.red(`Verify failed: ${err.message}`));
125
+ process.exit(1);
126
+ }
127
+ });
128
+ }
129
+ //# sourceMappingURL=verify.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify.js","sourceRoot":"","sources":["../../src/commands/verify.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,28 @@
1
+ import { Command } from 'commander';
2
+ import { registerInstall } from './commands/install.js';
3
+ import { registerList } from './commands/list.js';
4
+ import { registerDoctor } from './commands/doctor.js';
5
+ import { registerInit } from './commands/init.js';
6
+ import { registerPublish } from './commands/publish.js';
7
+ import { registerUpdate } from './commands/update.js';
8
+ import { registerUninstall } from './commands/uninstall.js';
9
+ import { registerVerify } from './commands/verify.js';
10
+ import { registerLogin } from './commands/login.js';
11
+ import { registerLicense } from './commands/license.js';
12
+ const program = new Command();
13
+ program
14
+ .name('claudeflows')
15
+ .version('0.1.0')
16
+ .description('Claude Flows \u2014 install and manage agentic workflows');
17
+ registerInstall(program);
18
+ registerList(program);
19
+ registerDoctor(program);
20
+ registerInit(program);
21
+ registerPublish(program);
22
+ registerUpdate(program);
23
+ registerUninstall(program);
24
+ registerVerify(program);
25
+ registerLogin(program);
26
+ registerLicense(program);
27
+ program.parse(process.argv);
28
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAExD,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,aAAa,CAAC;KACnB,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,0DAA0D,CAAC,CAAC;AAE3E,eAAe,CAAC,OAAO,CAAC,CAAC;AACzB,YAAY,CAAC,OAAO,CAAC,CAAC;AACtB,cAAc,CAAC,OAAO,CAAC,CAAC;AACxB,YAAY,CAAC,OAAO,CAAC,CAAC;AACtB,eAAe,CAAC,OAAO,CAAC,CAAC;AACzB,cAAc,CAAC,OAAO,CAAC,CAAC;AACxB,iBAAiB,CAAC,OAAO,CAAC,CAAC;AAC3B,cAAc,CAAC,OAAO,CAAC,CAAC;AACxB,aAAa,CAAC,OAAO,CAAC,CAAC;AACvB,eAAe,CAAC,OAAO,CAAC,CAAC;AAEzB,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC"}
@@ -0,0 +1,10 @@
1
+ export interface CwConfig {
2
+ registryUrl: string;
3
+ cacheTtlMinutes: number;
4
+ }
5
+ export declare function getWorkflowsDir(): string;
6
+ export declare function getInstalledDir(): string;
7
+ export declare function getConfig(): Promise<CwConfig>;
8
+ export declare function setConfig(updates: Partial<CwConfig>): Promise<void>;
9
+ export declare function ensureDirs(): Promise<void>;
10
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,QAAQ;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;CACzB;AAOD,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAED,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAMD,wBAAsB,SAAS,IAAI,OAAO,CAAC,QAAQ,CAAC,CAQnD;AAED,wBAAsB,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAMzE;AAED,wBAAsB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAEhD"}
@@ -0,0 +1,37 @@
1
+ import { readFile, writeFile, mkdir } from 'node:fs/promises';
2
+ import { join } from 'node:path';
3
+ import { homedir } from 'node:os';
4
+ const DEFAULT_CONFIG = {
5
+ registryUrl: 'https://raw.githubusercontent.com/claudeflows/registry/main/registry.json',
6
+ cacheTtlMinutes: 60,
7
+ };
8
+ export function getWorkflowsDir() {
9
+ return join(homedir(), '.claude-workflows');
10
+ }
11
+ export function getInstalledDir() {
12
+ return join(getWorkflowsDir(), 'installed');
13
+ }
14
+ function getConfigPath() {
15
+ return join(getWorkflowsDir(), 'config.json');
16
+ }
17
+ export async function getConfig() {
18
+ try {
19
+ const raw = await readFile(getConfigPath(), 'utf-8');
20
+ const parsed = JSON.parse(raw);
21
+ return { ...DEFAULT_CONFIG, ...parsed };
22
+ }
23
+ catch {
24
+ return { ...DEFAULT_CONFIG };
25
+ }
26
+ }
27
+ export async function setConfig(updates) {
28
+ const current = await getConfig();
29
+ const merged = { ...current, ...updates };
30
+ const dir = getWorkflowsDir();
31
+ await mkdir(dir, { recursive: true });
32
+ await writeFile(getConfigPath(), JSON.stringify(merged, null, 2) + '\n', 'utf-8');
33
+ }
34
+ export async function ensureDirs() {
35
+ await mkdir(getInstalledDir(), { recursive: true });
36
+ }
37
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAOlC,MAAM,cAAc,GAAa;IAC/B,WAAW,EAAE,2EAA2E;IACxF,eAAe,EAAE,EAAE;CACpB,CAAC;AAEF,MAAM,UAAU,eAAe;IAC7B,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,mBAAmB,CAAC,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,OAAO,IAAI,CAAC,eAAe,EAAE,EAAE,WAAW,CAAC,CAAC;AAC9C,CAAC;AAED,SAAS,aAAa;IACpB,OAAO,IAAI,CAAC,eAAe,EAAE,EAAE,aAAa,CAAC,CAAC;AAChD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS;IAC7B,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,aAAa,EAAE,EAAE,OAAO,CAAC,CAAC;QACrD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAsB,CAAC;QACpD,OAAO,EAAE,GAAG,cAAc,EAAE,GAAG,MAAM,EAAE,CAAC;IAC1C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,GAAG,cAAc,EAAE,CAAC;IAC/B,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,OAA0B;IACxD,MAAM,OAAO,GAAG,MAAM,SAAS,EAAE,CAAC;IAClC,MAAM,MAAM,GAAG,EAAE,GAAG,OAAO,EAAE,GAAG,OAAO,EAAE,CAAC;IAC1C,MAAM,GAAG,GAAG,eAAe,EAAE,CAAC;IAC9B,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACtC,MAAM,SAAS,CAAC,aAAa,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC;AACpF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU;IAC9B,MAAM,KAAK,CAAC,eAAe,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AACtD,CAAC"}
@@ -0,0 +1,14 @@
1
+ import type { WorkflowManifest } from './manifest.js';
2
+ export interface HealthCheck {
3
+ name: string;
4
+ status: 'ok' | 'warn' | 'error';
5
+ message: string;
6
+ }
7
+ export declare function checkRuntime(manifest: WorkflowManifest): Promise<HealthCheck[]>;
8
+ export declare function checkMcp(manifest: WorkflowManifest): Promise<HealthCheck[]>;
9
+ export declare function checkEnv(manifest: WorkflowManifest): Promise<HealthCheck[]>;
10
+ export declare function checkDeps(manifest: WorkflowManifest): Promise<HealthCheck[]>;
11
+ export declare function checkSkills(manifest: WorkflowManifest, installDir: string): Promise<HealthCheck[]>;
12
+ export declare function checkIntegrity(manifest: WorkflowManifest, installDir: string): Promise<HealthCheck[]>;
13
+ export declare function runDoctor(manifest: WorkflowManifest, installDir: string): Promise<HealthCheck[]>;
14
+ //# sourceMappingURL=doctor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/lib/doctor.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAItD,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,IAAI,GAAG,MAAM,GAAG,OAAO,CAAC;IAChC,OAAO,EAAE,MAAM,CAAC;CACjB;AAsBD,wBAAsB,YAAY,CAAC,QAAQ,EAAE,gBAAgB,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAkDrF;AAED,wBAAsB,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAsEjF;AAED,wBAAsB,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAiCjF;AAED,wBAAsB,SAAS,CAAC,QAAQ,EAAE,gBAAgB,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CA8DlF;AAED,wBAAsB,WAAW,CAC/B,QAAQ,EAAE,gBAAgB,EAC1B,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,WAAW,EAAE,CAAC,CA6CxB;AAED,wBAAsB,cAAc,CAClC,QAAQ,EAAE,gBAAgB,EAC1B,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,WAAW,EAAE,CAAC,CAqDxB;AAED,wBAAsB,SAAS,CAC7B,QAAQ,EAAE,gBAAgB,EAC1B,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,WAAW,EAAE,CAAC,CAWxB"}