@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,134 @@
1
+ import { readFile, writeFile, symlink, unlink, readlink, mkdir, stat } from 'node:fs/promises';
2
+ import { join, resolve } from 'node:path';
3
+ import { homedir } from 'node:os';
4
+ import { select } from '@inquirer/prompts';
5
+ function getSkillsDir() {
6
+ return join(homedir(), '.claude', 'skills');
7
+ }
8
+ function getSkillLinksPath(installDir) {
9
+ return join(installDir, '.skill-links.json');
10
+ }
11
+ async function loadSkillLinks(installDir) {
12
+ try {
13
+ const raw = await readFile(getSkillLinksPath(installDir), 'utf-8');
14
+ return JSON.parse(raw);
15
+ }
16
+ catch {
17
+ return null;
18
+ }
19
+ }
20
+ async function saveSkillLinks(installDir, data) {
21
+ await writeFile(getSkillLinksPath(installDir), JSON.stringify(data, null, 2) + '\n', 'utf-8');
22
+ }
23
+ async function fileExists(path) {
24
+ try {
25
+ await stat(path);
26
+ return true;
27
+ }
28
+ catch {
29
+ return false;
30
+ }
31
+ }
32
+ async function isSymlink(path) {
33
+ try {
34
+ await readlink(path);
35
+ return true;
36
+ }
37
+ catch {
38
+ return false;
39
+ }
40
+ }
41
+ export async function checkCollisions(targetName) {
42
+ const skillsDir = getSkillsDir();
43
+ const targetPath = join(skillsDir, targetName);
44
+ if (!(await fileExists(targetPath))) {
45
+ return { exists: false, isLink: false };
46
+ }
47
+ if (await isSymlink(targetPath)) {
48
+ const linkTarget = await readlink(targetPath);
49
+ return { exists: true, isLink: true, linkTarget };
50
+ }
51
+ return { exists: true, isLink: false };
52
+ }
53
+ export async function backupSkill(name) {
54
+ const skillsDir = getSkillsDir();
55
+ const original = join(skillsDir, name);
56
+ const backupName = `${name}.backup-${Date.now()}`;
57
+ const backupPath = join(skillsDir, backupName);
58
+ const { rename } = await import('node:fs/promises');
59
+ await rename(original, backupPath);
60
+ return backupName;
61
+ }
62
+ export async function linkSkills(workflowName, skills, installDir) {
63
+ const skillsDir = getSkillsDir();
64
+ await mkdir(skillsDir, { recursive: true });
65
+ const linked = [];
66
+ const skipped = [];
67
+ const links = [];
68
+ for (const skill of skills) {
69
+ const linkedName = `${workflowName}-${skill.name}`;
70
+ const linkPath = join(skillsDir, linkedName);
71
+ const targetPath = resolve(installDir, skill.path);
72
+ // Check for the target file
73
+ if (!(await fileExists(targetPath))) {
74
+ skipped.push(`${linkedName} (source not found: ${skill.path})`);
75
+ continue;
76
+ }
77
+ const collision = await checkCollisions(linkedName);
78
+ if (collision.exists) {
79
+ const action = await select({
80
+ message: `Skill "${linkedName}" already exists${collision.isLink ? ` (linked to ${collision.linkTarget})` : ''}. What should we do?`,
81
+ choices: [
82
+ { value: 'replace', name: 'Replace (backup existing)' },
83
+ { value: 'overwrite', name: 'Overwrite without backup' },
84
+ { value: 'skip', name: 'Skip' },
85
+ ],
86
+ });
87
+ if (action === 'skip') {
88
+ skipped.push(linkedName);
89
+ continue;
90
+ }
91
+ if (action === 'replace') {
92
+ await backupSkill(linkedName);
93
+ }
94
+ // Remove existing before creating new symlink
95
+ try {
96
+ await unlink(linkPath);
97
+ }
98
+ catch {
99
+ // Ignore if already gone
100
+ }
101
+ }
102
+ await symlink(targetPath, linkPath);
103
+ linked.push(linkedName);
104
+ links.push({ skillName: skill.name, linkedName, targetPath });
105
+ }
106
+ // Save link tracking file
107
+ const linksFile = { workflowName, links };
108
+ await saveSkillLinks(installDir, linksFile);
109
+ return { linked, skipped };
110
+ }
111
+ export async function unlinkSkills(workflowName, installDir) {
112
+ const linksData = await loadSkillLinks(installDir);
113
+ const removed = [];
114
+ if (!linksData) {
115
+ return removed;
116
+ }
117
+ const skillsDir = getSkillsDir();
118
+ for (const link of linksData.links) {
119
+ const linkPath = join(skillsDir, link.linkedName);
120
+ try {
121
+ // Verify it's a symlink pointing to our install before removing
122
+ const target = await readlink(linkPath);
123
+ if (resolve(target) === resolve(link.targetPath)) {
124
+ await unlink(linkPath);
125
+ removed.push(link.linkedName);
126
+ }
127
+ }
128
+ catch {
129
+ // Link already gone — that's fine
130
+ }
131
+ }
132
+ return removed;
133
+ }
134
+ //# sourceMappingURL=skill-linker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-linker.js","sourceRoot":"","sources":["../../src/lib/skill-linker.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,49 @@
1
+ {
2
+ "name": "@claudeflows/cli",
3
+ "version": "0.1.0",
4
+ "description": "CLI tool for installing and managing Claude Code agentic workflows",
5
+ "type": "module",
6
+ "bin": {
7
+ "claudeflows": "./bin/claudeflows.js"
8
+ },
9
+ "main": "./dist/index.js",
10
+ "types": "./dist/index.d.ts",
11
+ "scripts": {
12
+ "build": "tsc",
13
+ "dev": "tsc --watch",
14
+ "lint": "tsc --noEmit",
15
+ "prepublishOnly": "npm run build"
16
+ },
17
+ "files": [
18
+ "dist/",
19
+ "bin/",
20
+ "README.md",
21
+ "LICENSE"
22
+ ],
23
+ "repository": {
24
+ "type": "git",
25
+ "url": "https://github.com/mikethepurple/claudeflows"
26
+ },
27
+ "homepage": "https://github.com/mikethepurple/claudeflows",
28
+ "bugs": "https://github.com/mikethepurple/claudeflows/issues",
29
+ "dependencies": {
30
+ "commander": "^13.0.0",
31
+ "chalk": "^5.4.0",
32
+ "ora": "^8.2.0",
33
+ "inquirer": "^12.3.0",
34
+ "semver": "^7.6.0",
35
+ "ajv": "^8.17.0",
36
+ "tar": "^7.4.0"
37
+ },
38
+ "devDependencies": {
39
+ "@types/node": "^22.0.0",
40
+ "@types/semver": "^7.5.0",
41
+ "@types/inquirer": "^9.0.0",
42
+ "typescript": "^5.7.0"
43
+ },
44
+ "engines": {
45
+ "node": ">=18.0.0"
46
+ },
47
+ "keywords": ["claude", "workflows", "agentic", "marketplace", "cli"],
48
+ "license": "MIT"
49
+ }