@archznn/crewloop-skills 0.3.0 → 0.4.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 (164) hide show
  1. package/package.json +16 -3
  2. package/packages/cli/README.md +55 -0
  3. package/packages/cli/bin/crewloop.js +6 -0
  4. package/packages/cli/dist/agents.d.ts +7 -0
  5. package/packages/cli/dist/agents.d.ts.map +1 -0
  6. package/packages/cli/dist/agents.js +31 -0
  7. package/packages/cli/dist/agents.js.map +1 -0
  8. package/packages/cli/dist/cli.d.ts +14 -0
  9. package/packages/cli/dist/cli.d.ts.map +1 -0
  10. package/packages/cli/dist/cli.js +255 -0
  11. package/packages/cli/dist/cli.js.map +1 -0
  12. package/packages/cli/dist/installer.d.ts +19 -0
  13. package/packages/cli/dist/installer.d.ts.map +1 -0
  14. package/packages/cli/dist/installer.js +89 -0
  15. package/packages/cli/dist/installer.js.map +1 -0
  16. package/packages/cli/dist/mcp.d.ts +20 -0
  17. package/packages/cli/dist/mcp.d.ts.map +1 -0
  18. package/packages/cli/dist/mcp.js +130 -0
  19. package/packages/cli/dist/mcp.js.map +1 -0
  20. package/packages/cli/dist/resolver.d.ts +7 -0
  21. package/packages/cli/dist/resolver.d.ts.map +1 -0
  22. package/packages/cli/dist/resolver.js +57 -0
  23. package/packages/cli/dist/resolver.js.map +1 -0
  24. package/packages/cli/dist/tests/agents.test.d.ts +2 -0
  25. package/packages/cli/dist/tests/agents.test.d.ts.map +1 -0
  26. package/packages/cli/dist/tests/agents.test.js +27 -0
  27. package/packages/cli/dist/tests/agents.test.js.map +1 -0
  28. package/packages/cli/dist/tests/cli.test.d.ts +2 -0
  29. package/packages/cli/dist/tests/cli.test.d.ts.map +1 -0
  30. package/packages/cli/dist/tests/cli.test.js +103 -0
  31. package/packages/cli/dist/tests/cli.test.js.map +1 -0
  32. package/packages/cli/dist/tests/installer.test.d.ts +2 -0
  33. package/packages/cli/dist/tests/installer.test.d.ts.map +1 -0
  34. package/packages/cli/dist/tests/installer.test.js +129 -0
  35. package/packages/cli/dist/tests/installer.test.js.map +1 -0
  36. package/packages/cli/dist/tests/mcp.test.d.ts +2 -0
  37. package/packages/cli/dist/tests/mcp.test.d.ts.map +1 -0
  38. package/packages/cli/dist/tests/mcp.test.js +153 -0
  39. package/packages/cli/dist/tests/mcp.test.js.map +1 -0
  40. package/packages/cli/dist/tests/resolver.test.d.ts +2 -0
  41. package/packages/cli/dist/tests/resolver.test.d.ts.map +1 -0
  42. package/packages/cli/dist/tests/resolver.test.js +41 -0
  43. package/packages/cli/dist/tests/resolver.test.js.map +1 -0
  44. package/servers/dashboard/README.md +87 -0
  45. package/servers/dashboard/bin/crewloop-dashboard.js +5 -0
  46. package/servers/dashboard/config-examples/codex-hooks.json +14 -0
  47. package/servers/dashboard/config-examples/kimi-code-config.toml +6 -0
  48. package/servers/dashboard/config-examples/opencode-plugin/crewloop-dashboard.js +64 -0
  49. package/servers/dashboard/dist/adapters/codex.d.ts +23 -0
  50. package/servers/dashboard/dist/adapters/codex.d.ts.map +1 -0
  51. package/servers/dashboard/dist/adapters/codex.js +28 -0
  52. package/servers/dashboard/dist/adapters/codex.js.map +1 -0
  53. package/servers/dashboard/dist/adapters/kimi.d.ts +13 -0
  54. package/servers/dashboard/dist/adapters/kimi.d.ts.map +1 -0
  55. package/servers/dashboard/dist/adapters/kimi.js +28 -0
  56. package/servers/dashboard/dist/adapters/kimi.js.map +1 -0
  57. package/servers/dashboard/dist/adapters/opencode.d.ts +9 -0
  58. package/servers/dashboard/dist/adapters/opencode.d.ts.map +1 -0
  59. package/servers/dashboard/dist/adapters/opencode.js +26 -0
  60. package/servers/dashboard/dist/adapters/opencode.js.map +1 -0
  61. package/servers/dashboard/dist/adapters/shim.d.ts +7 -0
  62. package/servers/dashboard/dist/adapters/shim.d.ts.map +1 -0
  63. package/servers/dashboard/dist/adapters/shim.js +107 -0
  64. package/servers/dashboard/dist/adapters/shim.js.map +1 -0
  65. package/servers/dashboard/dist/adapters/shim.test.d.ts +2 -0
  66. package/servers/dashboard/dist/adapters/shim.test.d.ts.map +1 -0
  67. package/servers/dashboard/dist/adapters/shim.test.js +72 -0
  68. package/servers/dashboard/dist/adapters/shim.test.js.map +1 -0
  69. package/servers/dashboard/dist/api/event.d.ts +13 -0
  70. package/servers/dashboard/dist/api/event.d.ts.map +1 -0
  71. package/servers/dashboard/dist/api/event.js +52 -0
  72. package/servers/dashboard/dist/api/event.js.map +1 -0
  73. package/servers/dashboard/dist/api/skills.d.ts +4 -0
  74. package/servers/dashboard/dist/api/skills.d.ts.map +1 -0
  75. package/servers/dashboard/dist/api/skills.js +12 -0
  76. package/servers/dashboard/dist/api/skills.js.map +1 -0
  77. package/servers/dashboard/dist/config.d.ts +11 -0
  78. package/servers/dashboard/dist/config.d.ts.map +1 -0
  79. package/servers/dashboard/dist/config.js +65 -0
  80. package/servers/dashboard/dist/config.js.map +1 -0
  81. package/servers/dashboard/dist/filters/sanitize.d.ts +14 -0
  82. package/servers/dashboard/dist/filters/sanitize.d.ts.map +1 -0
  83. package/servers/dashboard/dist/filters/sanitize.js +64 -0
  84. package/servers/dashboard/dist/filters/sanitize.js.map +1 -0
  85. package/servers/dashboard/dist/filters/sanitize.test.d.ts +2 -0
  86. package/servers/dashboard/dist/filters/sanitize.test.d.ts.map +1 -0
  87. package/servers/dashboard/dist/filters/sanitize.test.js +71 -0
  88. package/servers/dashboard/dist/filters/sanitize.test.js.map +1 -0
  89. package/servers/dashboard/dist/index.d.ts +2 -0
  90. package/servers/dashboard/dist/index.d.ts.map +1 -0
  91. package/servers/dashboard/dist/index.js +22 -0
  92. package/servers/dashboard/dist/index.js.map +1 -0
  93. package/servers/dashboard/dist/presenter.d.ts +7 -0
  94. package/servers/dashboard/dist/presenter.d.ts.map +1 -0
  95. package/servers/dashboard/dist/presenter.js +54 -0
  96. package/servers/dashboard/dist/presenter.js.map +1 -0
  97. package/servers/dashboard/dist/presenter.test.d.ts +2 -0
  98. package/servers/dashboard/dist/presenter.test.d.ts.map +1 -0
  99. package/servers/dashboard/dist/presenter.test.js +66 -0
  100. package/servers/dashboard/dist/presenter.test.js.map +1 -0
  101. package/servers/dashboard/dist/server.d.ts +13 -0
  102. package/servers/dashboard/dist/server.d.ts.map +1 -0
  103. package/servers/dashboard/dist/server.js +162 -0
  104. package/servers/dashboard/dist/server.js.map +1 -0
  105. package/servers/dashboard/dist/server.test.d.ts +2 -0
  106. package/servers/dashboard/dist/server.test.d.ts.map +1 -0
  107. package/servers/dashboard/dist/server.test.js +113 -0
  108. package/servers/dashboard/dist/server.test.js.map +1 -0
  109. package/servers/dashboard/dist/skills/infer.d.ts +8 -0
  110. package/servers/dashboard/dist/skills/infer.d.ts.map +1 -0
  111. package/servers/dashboard/dist/skills/infer.js +48 -0
  112. package/servers/dashboard/dist/skills/infer.js.map +1 -0
  113. package/servers/dashboard/dist/skills/infer.test.d.ts +2 -0
  114. package/servers/dashboard/dist/skills/infer.test.d.ts.map +1 -0
  115. package/servers/dashboard/dist/skills/infer.test.js +82 -0
  116. package/servers/dashboard/dist/skills/infer.test.js.map +1 -0
  117. package/servers/dashboard/dist/skills/mapping.d.ts +5 -0
  118. package/servers/dashboard/dist/skills/mapping.d.ts.map +1 -0
  119. package/servers/dashboard/dist/skills/mapping.js +28 -0
  120. package/servers/dashboard/dist/skills/mapping.js.map +1 -0
  121. package/servers/dashboard/dist/skills/registry.d.ts +11 -0
  122. package/servers/dashboard/dist/skills/registry.d.ts.map +1 -0
  123. package/servers/dashboard/dist/skills/registry.js +59 -0
  124. package/servers/dashboard/dist/skills/registry.js.map +1 -0
  125. package/servers/dashboard/dist/state.d.ts +18 -0
  126. package/servers/dashboard/dist/state.d.ts.map +1 -0
  127. package/servers/dashboard/dist/state.js +91 -0
  128. package/servers/dashboard/dist/state.js.map +1 -0
  129. package/servers/dashboard/dist/state.test.d.ts +2 -0
  130. package/servers/dashboard/dist/state.test.d.ts.map +1 -0
  131. package/servers/dashboard/dist/state.test.js +83 -0
  132. package/servers/dashboard/dist/state.test.js.map +1 -0
  133. package/servers/dashboard/dist/types.d.ts +86 -0
  134. package/servers/dashboard/dist/types.d.ts.map +1 -0
  135. package/servers/dashboard/dist/types.js +3 -0
  136. package/servers/dashboard/dist/types.js.map +1 -0
  137. package/servers/dashboard/package.json +46 -0
  138. package/servers/dashboard/public/app.js +447 -0
  139. package/servers/dashboard/public/index.html +96 -0
  140. package/servers/dashboard/public/styles.css +664 -0
  141. package/servers/dashboard/src/adapters/codex.ts +50 -0
  142. package/servers/dashboard/src/adapters/kimi.ts +40 -0
  143. package/servers/dashboard/src/adapters/opencode.ts +36 -0
  144. package/servers/dashboard/src/adapters/shim.test.ts +74 -0
  145. package/servers/dashboard/src/adapters/shim.ts +120 -0
  146. package/servers/dashboard/src/api/event.ts +70 -0
  147. package/servers/dashboard/src/api/skills.ts +11 -0
  148. package/servers/dashboard/src/config.ts +66 -0
  149. package/servers/dashboard/src/filters/sanitize.test.ts +94 -0
  150. package/servers/dashboard/src/filters/sanitize.ts +78 -0
  151. package/servers/dashboard/src/index.ts +24 -0
  152. package/servers/dashboard/src/presenter.test.ts +69 -0
  153. package/servers/dashboard/src/presenter.ts +56 -0
  154. package/servers/dashboard/src/server.test.ts +123 -0
  155. package/servers/dashboard/src/server.ts +191 -0
  156. package/servers/dashboard/src/skills/infer.test.ts +86 -0
  157. package/servers/dashboard/src/skills/infer.ts +53 -0
  158. package/servers/dashboard/src/skills/mapping.ts +26 -0
  159. package/servers/dashboard/src/skills/registry.ts +60 -0
  160. package/servers/dashboard/src/state.test.ts +88 -0
  161. package/servers/dashboard/src/state.ts +115 -0
  162. package/servers/dashboard/src/types.ts +110 -0
  163. package/servers/dashboard/tsconfig.json +19 -0
  164. package/skills/orchestrator/SKILL.md +1 -1
@@ -0,0 +1,130 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.installMcpServer = installMcpServer;
7
+ const node_fs_1 = __importDefault(require("node:fs"));
8
+ const node_path_1 = __importDefault(require("node:path"));
9
+ const node_os_1 = __importDefault(require("node:os"));
10
+ const node_child_process_1 = require("node:child_process");
11
+ function defaultPythonCmd() {
12
+ return node_os_1.default.platform() === 'win32' ? 'python' : 'python3';
13
+ }
14
+ function defaultLocalBinDir() {
15
+ return node_path_1.default.join(node_os_1.default.homedir(), '.local', 'bin');
16
+ }
17
+ function venvBinDir() {
18
+ return node_os_1.default.platform() === 'win32' ? 'Scripts' : 'bin';
19
+ }
20
+ function runCommand(cmd, args) {
21
+ const result = spawnPlatform(cmd, args);
22
+ if (result.error || result.status !== 0) {
23
+ throw result.error || new Error(`Command failed: ${cmd} ${args.join(' ')}`);
24
+ }
25
+ }
26
+ function commandExists(cmd) {
27
+ const result = spawnPlatform(cmd, ['--version']);
28
+ return result.status === 0;
29
+ }
30
+ function spawnPlatform(cmd, args) {
31
+ if (node_os_1.default.platform() === 'win32') {
32
+ return (0, node_child_process_1.spawnSync)('cmd', ['/c', cmd, ...args], { stdio: 'ignore' });
33
+ }
34
+ return (0, node_child_process_1.spawnSync)(cmd, args, { stdio: 'ignore' });
35
+ }
36
+ function ensureVenv(mcpSourceDir, pythonCmd, force) {
37
+ const venvDir = node_path_1.default.join(mcpSourceDir, '.venv');
38
+ if (force && node_fs_1.default.existsSync(venvDir)) {
39
+ node_fs_1.default.rmSync(venvDir, { recursive: true, force: true });
40
+ }
41
+ if (!node_fs_1.default.existsSync(venvDir)) {
42
+ runCommand(pythonCmd, ['-m', 'venv', venvDir]);
43
+ }
44
+ }
45
+ function findExecutable(basePath) {
46
+ if (node_os_1.default.platform() !== 'win32') {
47
+ return basePath;
48
+ }
49
+ for (const ext of ['.exe', '.cmd']) {
50
+ const candidate = `${basePath}${ext}`;
51
+ if (node_fs_1.default.existsSync(candidate)) {
52
+ return candidate;
53
+ }
54
+ }
55
+ return basePath;
56
+ }
57
+ function venvPip(mcpSourceDir) {
58
+ const venvDir = node_path_1.default.join(mcpSourceDir, '.venv');
59
+ const basePath = node_path_1.default.join(venvDir, venvBinDir(), 'pip');
60
+ return findExecutable(basePath);
61
+ }
62
+ function venvBinary(mcpSourceDir) {
63
+ const venvDir = node_path_1.default.join(mcpSourceDir, '.venv');
64
+ const basePath = node_path_1.default.join(venvDir, venvBinDir(), 'obsidian-mcp');
65
+ return findExecutable(basePath);
66
+ }
67
+ function createWindowsWrapper(binaryPath, wrapperPath) {
68
+ const content = `@echo off\r\n"${binaryPath}" %*\r\n`;
69
+ node_fs_1.default.writeFileSync(wrapperPath, content);
70
+ }
71
+ function exposeBinary(mcpSourceDir, localBinDir, force) {
72
+ node_fs_1.default.mkdirSync(localBinDir, { recursive: true });
73
+ const sourceBinary = venvBinary(mcpSourceDir);
74
+ const isWindows = node_os_1.default.platform() === 'win32';
75
+ if (isWindows) {
76
+ const wrapperPath = node_path_1.default.join(localBinDir, 'obsidian-mcp.cmd');
77
+ const created = force || !node_fs_1.default.existsSync(wrapperPath);
78
+ if (created) {
79
+ createWindowsWrapper(sourceBinary, wrapperPath);
80
+ }
81
+ return { binaryPath: wrapperPath, created };
82
+ }
83
+ const targetBinary = node_path_1.default.join(localBinDir, 'obsidian-mcp');
84
+ const created = force || !node_fs_1.default.existsSync(targetBinary);
85
+ if (created) {
86
+ if (node_fs_1.default.existsSync(targetBinary)) {
87
+ node_fs_1.default.rmSync(targetBinary, { force: true });
88
+ }
89
+ node_fs_1.default.symlinkSync(sourceBinary, targetBinary);
90
+ }
91
+ return { binaryPath: targetBinary, created };
92
+ }
93
+ function installMcpServer(mcpSourceDir, options = {}) {
94
+ const pythonCmd = options.pythonCmd || defaultPythonCmd();
95
+ const localBinDir = options.localBinDir || defaultLocalBinDir();
96
+ if (!commandExists(pythonCmd)) {
97
+ return {
98
+ installed: false,
99
+ skipped: false,
100
+ error: new Error(`Python not found: ${pythonCmd}`),
101
+ };
102
+ }
103
+ if (options.dryRun) {
104
+ const binaryName = node_os_1.default.platform() === 'win32' ? 'obsidian-mcp.cmd' : 'obsidian-mcp';
105
+ return {
106
+ installed: true,
107
+ skipped: false,
108
+ binaryPath: node_path_1.default.join(localBinDir, binaryName),
109
+ };
110
+ }
111
+ try {
112
+ ensureVenv(mcpSourceDir, pythonCmd, options.force || false);
113
+ const pip = venvPip(mcpSourceDir);
114
+ runCommand(pip, ['install', '-q', '-e', mcpSourceDir]);
115
+ const { binaryPath, created } = exposeBinary(mcpSourceDir, localBinDir, options.force || false);
116
+ return {
117
+ installed: created,
118
+ skipped: !created,
119
+ binaryPath,
120
+ };
121
+ }
122
+ catch (error) {
123
+ return {
124
+ installed: false,
125
+ skipped: false,
126
+ error: error instanceof Error ? error : new Error(String(error)),
127
+ };
128
+ }
129
+ }
130
+ //# sourceMappingURL=mcp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.js","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export interface SkillManifest {
2
+ name: string;
3
+ description: string;
4
+ sourcePath: string;
5
+ }
6
+ export declare function resolveSkills(packageRoot: string, filters?: string[]): SkillManifest[];
7
+ //# sourceMappingURL=resolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../src/resolver.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;CACpB;AAyBD,wBAAgB,aAAa,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,GAAG,aAAa,EAAE,CAgCtF"}
@@ -0,0 +1,57 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.resolveSkills = resolveSkills;
7
+ const node_fs_1 = __importDefault(require("node:fs"));
8
+ const node_path_1 = __importDefault(require("node:path"));
9
+ function parseFrontmatter(content) {
10
+ const result = {};
11
+ if (!content.startsWith('---')) {
12
+ return result;
13
+ }
14
+ const end = content.indexOf('---', 3);
15
+ if (end === -1) {
16
+ return result;
17
+ }
18
+ const frontmatter = content.slice(3, end).trim();
19
+ for (const line of frontmatter.split('\n')) {
20
+ const colonIndex = line.indexOf(':');
21
+ if (colonIndex === -1)
22
+ continue;
23
+ const key = line.slice(0, colonIndex).trim();
24
+ const value = line.slice(colonIndex + 1).trim().replace(/^["']|["']$/g, '');
25
+ result[key] = value;
26
+ }
27
+ return result;
28
+ }
29
+ function resolveSkills(packageRoot, filters) {
30
+ const skillsDir = node_path_1.default.join(packageRoot, 'skills');
31
+ if (!node_fs_1.default.existsSync(skillsDir)) {
32
+ throw new Error(`Skills directory not found: ${skillsDir}`);
33
+ }
34
+ const entries = node_fs_1.default.readdirSync(skillsDir, { withFileTypes: true });
35
+ const skills = [];
36
+ for (const entry of entries) {
37
+ if (!entry.isDirectory())
38
+ continue;
39
+ const skillName = entry.name;
40
+ if (filters && filters.length > 0 && !filters.includes(skillName)) {
41
+ continue;
42
+ }
43
+ const skillFile = node_path_1.default.join(skillsDir, skillName, 'SKILL.md');
44
+ if (!node_fs_1.default.existsSync(skillFile))
45
+ continue;
46
+ const content = node_fs_1.default.readFileSync(skillFile, 'utf-8');
47
+ const frontmatter = parseFrontmatter(content);
48
+ skills.push({
49
+ name: skillName,
50
+ description: frontmatter.description || '',
51
+ sourcePath: node_path_1.default.join(skillsDir, skillName),
52
+ });
53
+ }
54
+ skills.sort((a, b) => a.name.localeCompare(b.name));
55
+ return skills;
56
+ }
57
+ //# sourceMappingURL=resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolver.js","sourceRoot":"","sources":["../src/resolver.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=agents.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agents.test.d.ts","sourceRoot":"","sources":["../../src/tests/agents.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const node_test_1 = require("node:test");
7
+ const node_assert_1 = __importDefault(require("node:assert"));
8
+ const agents_1 = require("../agents");
9
+ (0, node_test_1.describe)('agents', () => {
10
+ (0, node_test_1.it)('returns default agent directory when no agent is specified', () => {
11
+ const dir = (0, agents_1.resolveAgentDir)();
12
+ node_assert_1.default.ok(dir.includes('.agents'));
13
+ });
14
+ (0, node_test_1.it)('resolves known agents', () => {
15
+ const dir = (0, agents_1.resolveAgentDir)('claude');
16
+ node_assert_1.default.ok(dir.includes('.claude'));
17
+ });
18
+ (0, node_test_1.it)('throws for unknown agents', () => {
19
+ node_assert_1.default.throws(() => (0, agents_1.resolveAgentDir)('unknown'), /Unknown agent/);
20
+ });
21
+ (0, node_test_1.it)('lists supported agents', () => {
22
+ const agents = (0, agents_1.listSupportedAgents)();
23
+ node_assert_1.default.ok(agents.length > 0);
24
+ node_assert_1.default.ok(agents.some((a) => a.id === 'kimi'));
25
+ });
26
+ });
27
+ //# sourceMappingURL=agents.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agents.test.js","sourceRoot":"","sources":["../../src/tests/agents.test.ts"],"names":[],"mappings":";;;;;AAAA,yCAAyC;AACzC,8DAAiC;AACjC,sCAAiE;AAEjE,IAAA,oBAAQ,EAAC,QAAQ,EAAE,GAAG,EAAE;IACtB,IAAA,cAAE,EAAC,4DAA4D,EAAE,GAAG,EAAE;QACpE,MAAM,GAAG,GAAG,IAAA,wBAAe,GAAE,CAAC;QAC9B,qBAAM,CAAC,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,IAAA,cAAE,EAAC,uBAAuB,EAAE,GAAG,EAAE;QAC/B,MAAM,GAAG,GAAG,IAAA,wBAAe,EAAC,QAAQ,CAAC,CAAC;QACtC,qBAAM,CAAC,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,IAAA,cAAE,EAAC,2BAA2B,EAAE,GAAG,EAAE;QACnC,qBAAM,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,IAAA,wBAAe,EAAC,SAAS,CAAC,EAAE,eAAe,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;IAEH,IAAA,cAAE,EAAC,wBAAwB,EAAE,GAAG,EAAE;QAChC,MAAM,MAAM,GAAG,IAAA,4BAAmB,GAAE,CAAC;QACrC,qBAAM,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC7B,qBAAM,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAiB,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,MAAM,CAAC,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -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,103 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const node_test_1 = require("node:test");
7
+ const node_assert_1 = __importDefault(require("node:assert"));
8
+ const cli_1 = require("../cli");
9
+ (0, node_test_1.describe)('cli', () => {
10
+ (0, node_test_1.it)('parses install command', () => {
11
+ const args = (0, cli_1.parseArgs)(['node', 'crewloop', 'install']);
12
+ node_assert_1.default.strictEqual(args.command, 'install');
13
+ });
14
+ (0, node_test_1.it)('parses list command', () => {
15
+ const args = (0, cli_1.parseArgs)(['node', 'crewloop', 'list']);
16
+ node_assert_1.default.strictEqual(args.command, 'list');
17
+ });
18
+ (0, node_test_1.it)('parses dashboard command', () => {
19
+ const args = (0, cli_1.parseArgs)(['node', 'crewloop', 'dashboard']);
20
+ node_assert_1.default.strictEqual(args.command, 'dashboard');
21
+ });
22
+ (0, node_test_1.it)('parses --version flag', () => {
23
+ const args = (0, cli_1.parseArgs)(['node', 'crewloop', '--version']);
24
+ node_assert_1.default.strictEqual(args.command, 'version');
25
+ });
26
+ (0, node_test_1.it)('parses -v flag', () => {
27
+ const args = (0, cli_1.parseArgs)(['node', 'crewloop', '-v']);
28
+ node_assert_1.default.strictEqual(args.command, 'version');
29
+ });
30
+ (0, node_test_1.it)('parses dashboard flags', () => {
31
+ const args = (0, cli_1.parseArgs)([
32
+ 'node',
33
+ 'crewloop',
34
+ 'dashboard',
35
+ '--port',
36
+ '8080',
37
+ '--host',
38
+ '0.0.0.0',
39
+ ]);
40
+ node_assert_1.default.strictEqual(args.command, 'dashboard');
41
+ node_assert_1.default.strictEqual(args.port, 8080);
42
+ node_assert_1.default.strictEqual(args.host, '0.0.0.0');
43
+ });
44
+ (0, node_test_1.it)('throws when dashboard --port has no value', () => {
45
+ node_assert_1.default.throws(() => (0, cli_1.parseArgs)(['node', 'crewloop', 'dashboard', '--port']), /--port requires a value/);
46
+ });
47
+ (0, node_test_1.it)('throws when dashboard --host has no value', () => {
48
+ node_assert_1.default.throws(() => (0, cli_1.parseArgs)(['node', 'crewloop', 'dashboard', '--host']), /--host requires a value/);
49
+ });
50
+ (0, node_test_1.it)('parses all flags', () => {
51
+ const args = (0, cli_1.parseArgs)([
52
+ 'node',
53
+ 'crewloop',
54
+ 'install',
55
+ '--target',
56
+ '/tmp/skills',
57
+ '--skill',
58
+ 'architect',
59
+ '--skill',
60
+ 'engineer',
61
+ '--agent',
62
+ 'claude',
63
+ '--symlink',
64
+ '--force',
65
+ '--dry-run',
66
+ ]);
67
+ node_assert_1.default.strictEqual(args.command, 'install');
68
+ node_assert_1.default.strictEqual(args.target, '/tmp/skills');
69
+ node_assert_1.default.deepStrictEqual(args.skills, ['architect', 'engineer']);
70
+ node_assert_1.default.strictEqual(args.agent, 'claude');
71
+ node_assert_1.default.strictEqual(args.symlink, true);
72
+ node_assert_1.default.strictEqual(args.force, true);
73
+ node_assert_1.default.strictEqual(args.dryRun, true);
74
+ });
75
+ (0, node_test_1.it)('throws when --target has no value', () => {
76
+ node_assert_1.default.throws(() => (0, cli_1.parseArgs)(['node', 'crewloop', 'install', '--target']), /--target requires a value/);
77
+ });
78
+ (0, node_test_1.it)('throws when --skill has no value', () => {
79
+ node_assert_1.default.throws(() => (0, cli_1.parseArgs)(['node', 'crewloop', 'install', '--skill']), /--skill requires a value/);
80
+ });
81
+ (0, node_test_1.it)('throws when --agent has no value', () => {
82
+ node_assert_1.default.throws(() => (0, cli_1.parseArgs)(['node', 'crewloop', 'install', '--agent']), /--agent requires a value/);
83
+ });
84
+ (0, node_test_1.it)('throws when flag value looks like another flag', () => {
85
+ node_assert_1.default.throws(() => (0, cli_1.parseArgs)(['node', 'crewloop', 'install', '--target', '--force']), /--target requires a value/);
86
+ });
87
+ (0, node_test_1.it)('returns help text', () => {
88
+ const help = (0, cli_1.printHelp)();
89
+ node_assert_1.default.ok(help.includes('install'));
90
+ node_assert_1.default.ok(help.includes('list'));
91
+ node_assert_1.default.ok(help.includes('dashboard'));
92
+ node_assert_1.default.ok(help.includes('--target'));
93
+ node_assert_1.default.ok(help.includes('--port'));
94
+ node_assert_1.default.ok(help.includes('--version'));
95
+ node_assert_1.default.ok(help.includes('version'));
96
+ });
97
+ (0, node_test_1.it)('help text does not change command surface', () => {
98
+ const help = (0, cli_1.printHelp)();
99
+ node_assert_1.default.ok(!help.includes('doctor'));
100
+ node_assert_1.default.ok(!help.includes('validate'));
101
+ });
102
+ });
103
+ //# sourceMappingURL=cli.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.test.js","sourceRoot":"","sources":["../../src/tests/cli.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=installer.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"installer.test.d.ts","sourceRoot":"","sources":["../../src/tests/installer.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,129 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const node_test_1 = require("node:test");
7
+ const node_assert_1 = __importDefault(require("node:assert"));
8
+ const node_fs_1 = __importDefault(require("node:fs"));
9
+ const node_path_1 = __importDefault(require("node:path"));
10
+ const node_os_1 = __importDefault(require("node:os"));
11
+ const installer_1 = require("../installer");
12
+ (0, node_test_1.describe)('installer', () => {
13
+ let sourceDir;
14
+ let targetDir;
15
+ (0, node_test_1.before)(() => {
16
+ sourceDir = node_fs_1.default.mkdtempSync(node_path_1.default.join(node_os_1.default.tmpdir(), 'crewloop-source-'));
17
+ targetDir = node_fs_1.default.mkdtempSync(node_path_1.default.join(node_os_1.default.tmpdir(), 'crewloop-target-'));
18
+ node_fs_1.default.mkdirSync(node_path_1.default.join(sourceDir, 'architect'), { recursive: true });
19
+ node_fs_1.default.writeFileSync(node_path_1.default.join(sourceDir, 'architect', 'SKILL.md'), '# Architect\n');
20
+ });
21
+ (0, node_test_1.after)(() => {
22
+ node_fs_1.default.rmSync(sourceDir, { recursive: true, force: true });
23
+ node_fs_1.default.rmSync(targetDir, { recursive: true, force: true });
24
+ });
25
+ (0, node_test_1.it)('copies skills to target directory', () => {
26
+ const skills = [
27
+ { name: 'architect', description: '', sourcePath: node_path_1.default.join(sourceDir, 'architect') },
28
+ ];
29
+ const result = (0, installer_1.installSkills)(skills, targetDir, {});
30
+ node_assert_1.default.deepStrictEqual(result.installed, ['architect']);
31
+ node_assert_1.default.strictEqual(result.skipped.length, 0);
32
+ node_assert_1.default.strictEqual(result.errors.length, 0);
33
+ node_assert_1.default.ok(node_fs_1.default.existsSync(node_path_1.default.join(targetDir, 'architect', 'SKILL.md')));
34
+ });
35
+ (0, node_test_1.it)('skips existing skills without force', () => {
36
+ const skills = [
37
+ { name: 'architect', description: '', sourcePath: node_path_1.default.join(sourceDir, 'architect') },
38
+ ];
39
+ const result = (0, installer_1.installSkills)(skills, targetDir, {});
40
+ node_assert_1.default.strictEqual(result.installed.length, 0);
41
+ node_assert_1.default.deepStrictEqual(result.skipped, ['architect']);
42
+ });
43
+ (0, node_test_1.it)('overwrites existing skills with force', () => {
44
+ const skills = [
45
+ { name: 'architect', description: '', sourcePath: node_path_1.default.join(sourceDir, 'architect') },
46
+ ];
47
+ const result = (0, installer_1.installSkills)(skills, targetDir, { force: true });
48
+ node_assert_1.default.deepStrictEqual(result.installed, ['architect']);
49
+ node_assert_1.default.strictEqual(result.skipped.length, 0);
50
+ node_assert_1.default.ok(node_fs_1.default.existsSync(node_path_1.default.join(targetDir, 'architect', 'SKILL.md')));
51
+ });
52
+ (0, node_test_1.it)('dry-run does not write files', () => {
53
+ const dryTarget = node_path_1.default.join(targetDir, 'dry');
54
+ const skills = [
55
+ { name: 'architect', description: '', sourcePath: node_path_1.default.join(sourceDir, 'architect') },
56
+ ];
57
+ const result = (0, installer_1.installSkills)(skills, dryTarget, { dryRun: true });
58
+ node_assert_1.default.deepStrictEqual(result.installed, ['architect']);
59
+ node_assert_1.default.ok(!node_fs_1.default.existsSync(dryTarget));
60
+ });
61
+ });
62
+ (0, node_test_1.describe)('mergeSharedDirs', () => {
63
+ let sharedRoot;
64
+ let targetDir;
65
+ (0, node_test_1.before)(() => {
66
+ sharedRoot = node_fs_1.default.mkdtempSync(node_path_1.default.join(node_os_1.default.tmpdir(), 'crewloop-shared-'));
67
+ targetDir = node_fs_1.default.mkdtempSync(node_path_1.default.join(node_os_1.default.tmpdir(), 'crewloop-skill-'));
68
+ node_fs_1.default.mkdirSync(node_path_1.default.join(sharedRoot, 'references'), { recursive: true });
69
+ node_fs_1.default.writeFileSync(node_path_1.default.join(sharedRoot, 'references', 'conventions.md'), '# Conventions\n');
70
+ node_fs_1.default.mkdirSync(node_path_1.default.join(sharedRoot, 'assets', 'templates'), { recursive: true });
71
+ node_fs_1.default.writeFileSync(node_path_1.default.join(sharedRoot, 'assets', 'templates', 'skill.md'), '# Template\n');
72
+ });
73
+ (0, node_test_1.after)(() => {
74
+ node_fs_1.default.rmSync(sharedRoot, { recursive: true, force: true });
75
+ node_fs_1.default.rmSync(targetDir, { recursive: true, force: true });
76
+ });
77
+ (0, node_test_1.it)('copies shared references and assets into target skill', () => {
78
+ (0, installer_1.mergeSharedDirs)(targetDir, sharedRoot, {});
79
+ node_assert_1.default.ok(node_fs_1.default.existsSync(node_path_1.default.join(targetDir, 'references', 'conventions.md')));
80
+ node_assert_1.default.ok(node_fs_1.default.existsSync(node_path_1.default.join(targetDir, 'assets', 'templates', 'skill.md')));
81
+ });
82
+ (0, node_test_1.it)('overwrites existing skill files with shared copies', () => {
83
+ node_fs_1.default.mkdirSync(node_path_1.default.join(targetDir, 'references'), { recursive: true });
84
+ node_fs_1.default.writeFileSync(node_path_1.default.join(targetDir, 'references', 'conventions.md'), '# Skill-specific\n');
85
+ (0, installer_1.mergeSharedDirs)(targetDir, sharedRoot, {});
86
+ const content = node_fs_1.default.readFileSync(node_path_1.default.join(targetDir, 'references', 'conventions.md'), 'utf-8');
87
+ node_assert_1.default.strictEqual(content, '# Conventions\n');
88
+ });
89
+ (0, node_test_1.it)('respects dry-run', () => {
90
+ const dryTarget = node_fs_1.default.mkdtempSync(node_path_1.default.join(node_os_1.default.tmpdir(), 'crewloop-dry-'));
91
+ (0, installer_1.mergeSharedDirs)(dryTarget, sharedRoot, { dryRun: true });
92
+ node_assert_1.default.ok(!node_fs_1.default.existsSync(node_path_1.default.join(dryTarget, 'references')));
93
+ node_assert_1.default.ok(!node_fs_1.default.existsSync(node_path_1.default.join(dryTarget, 'assets')));
94
+ node_fs_1.default.rmSync(dryTarget, { recursive: true, force: true });
95
+ });
96
+ (0, node_test_1.it)('merges shared dirs into each installed skill', () => {
97
+ const skillSource = node_fs_1.default.mkdtempSync(node_path_1.default.join(node_os_1.default.tmpdir(), 'crewloop-skillsource-'));
98
+ const skillTarget = node_fs_1.default.mkdtempSync(node_path_1.default.join(node_os_1.default.tmpdir(), 'crewloop-skilltarget-'));
99
+ node_fs_1.default.writeFileSync(node_path_1.default.join(skillSource, 'SKILL.md'), '# Skill\n');
100
+ const skills = [
101
+ { name: 'example', description: '', sourcePath: skillSource },
102
+ ];
103
+ const result = (0, installer_1.installSkills)(skills, skillTarget, {}, sharedRoot);
104
+ node_assert_1.default.deepStrictEqual(result.installed, ['example']);
105
+ node_assert_1.default.ok(node_fs_1.default.existsSync(node_path_1.default.join(skillTarget, 'example', 'references', 'conventions.md')));
106
+ node_assert_1.default.ok(node_fs_1.default.existsSync(node_path_1.default.join(skillTarget, 'example', 'assets', 'templates', 'skill.md')));
107
+ node_fs_1.default.rmSync(skillSource, { recursive: true, force: true });
108
+ node_fs_1.default.rmSync(skillTarget, { recursive: true, force: true });
109
+ });
110
+ (0, node_test_1.it)('does not merge shared dirs in symlink mode and leaves source unchanged', () => {
111
+ const skillSource = node_fs_1.default.mkdtempSync(node_path_1.default.join(node_os_1.default.tmpdir(), 'crewloop-skillsource-'));
112
+ const skillTarget = node_fs_1.default.mkdtempSync(node_path_1.default.join(node_os_1.default.tmpdir(), 'crewloop-skilltarget-'));
113
+ node_fs_1.default.writeFileSync(node_path_1.default.join(skillSource, 'SKILL.md'), '# Skill\n');
114
+ const skills = [
115
+ { name: 'example', description: '', sourcePath: skillSource },
116
+ ];
117
+ const result = (0, installer_1.installSkills)(skills, skillTarget, { symlink: true }, sharedRoot);
118
+ node_assert_1.default.deepStrictEqual(result.installed, ['example']);
119
+ const installedSkillPath = node_path_1.default.join(skillTarget, 'example');
120
+ node_assert_1.default.ok(node_fs_1.default.lstatSync(installedSkillPath).isSymbolicLink() || node_fs_1.default.lstatSync(installedSkillPath).isDirectory());
121
+ node_assert_1.default.ok(!node_fs_1.default.existsSync(node_path_1.default.join(installedSkillPath, 'references')));
122
+ node_assert_1.default.ok(!node_fs_1.default.existsSync(node_path_1.default.join(installedSkillPath, 'assets')));
123
+ node_assert_1.default.ok(!node_fs_1.default.existsSync(node_path_1.default.join(skillSource, 'references')));
124
+ node_assert_1.default.ok(!node_fs_1.default.existsSync(node_path_1.default.join(skillSource, 'assets')));
125
+ node_fs_1.default.rmSync(skillSource, { recursive: true, force: true });
126
+ node_fs_1.default.rmSync(skillTarget, { recursive: true, force: true });
127
+ });
128
+ });
129
+ //# sourceMappingURL=installer.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"installer.test.js","sourceRoot":"","sources":["../../src/tests/installer.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=mcp.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.test.d.ts","sourceRoot":"","sources":["../../src/tests/mcp.test.ts"],"names":[],"mappings":""}