@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
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@archznn/crewloop-skills",
3
- "version": "0.3.0",
4
- "description": "CrewLoop AI agent skills bundle",
3
+ "version": "0.4.1",
4
+ "description": "CrewLoop AI agent skills bundle and CLI",
5
5
  "license": "MIT",
6
6
  "author": "leorsousa05",
7
7
  "repository": {
@@ -9,16 +9,29 @@
9
9
  "url": "https://github.com/leorsousa05/CrewLoop.git"
10
10
  },
11
11
  "homepage": "https://leorsousa05.github.io/CrewLoop/",
12
+ "bin": {
13
+ "crewloop": "packages/cli/bin/crewloop.js"
14
+ },
12
15
  "files": [
13
16
  "skills/",
14
17
  "references/",
15
18
  "assets/",
16
19
  "servers/obsidian-mcp/",
20
+ "servers/dashboard/",
21
+ "packages/cli/bin/",
22
+ "packages/cli/dist/",
23
+ "packages/cli/README.md",
17
24
  "README.md",
18
25
  "LICENSE.md"
19
26
  ],
27
+ "scripts": {
28
+ "build": "npm run build --workspaces",
29
+ "test": "npm test --workspaces",
30
+ "prepublishOnly": "npm run build --workspaces"
31
+ },
20
32
  "workspaces": [
21
- "packages/cli"
33
+ "packages/cli",
34
+ "servers/dashboard"
22
35
  ],
23
36
  "keywords": [
24
37
  "ai-agent",
@@ -0,0 +1,55 @@
1
+ # @archznn/crewloop-cli
2
+
3
+ CLI for installing [CrewLoop](https://leorsousa05.github.io/CrewLoop/) skills into your agent's skills directory.
4
+
5
+ ## Install
6
+
7
+ ```bash
8
+ npm install -g @archznn/crewloop-cli
9
+ ```
10
+
11
+ ## Usage
12
+
13
+ Install all skills:
14
+
15
+ ```bash
16
+ crewloop install
17
+ ```
18
+
19
+ Install specific skills:
20
+
21
+ ```bash
22
+ crewloop install --skill architect --skill engineer
23
+ ```
24
+
25
+ Install to a custom directory:
26
+
27
+ ```bash
28
+ crewloop install --target /path/to/skills
29
+ ```
30
+
31
+ Install for a specific agent:
32
+
33
+ ```bash
34
+ crewloop install --agent claude
35
+ ```
36
+
37
+ List available skills:
38
+
39
+ ```bash
40
+ crewloop list
41
+ ```
42
+
43
+ ## Options
44
+
45
+ - `--target <dir>` — custom target directory
46
+ - `--skill <name>` — install only a specific skill (repeatable)
47
+ - `--agent <agent>` — target agent convention (`kimi`, `claude`, `codex`, `cursor`, `windsurf`)
48
+ - `--symlink` — create symlinks instead of copying
49
+ - `--force` — overwrite existing skills
50
+ - `--dry-run` — preview actions without installing
51
+ - `-h, --help` — show help
52
+
53
+ ## Publishing
54
+
55
+ `@archznn/crewloop-cli` is published automatically by the GitHub Actions workflow in `.github/workflows/publish-npm.yml` whenever a `v*.*.*` tag is pushed. The `@archznn/crewloop-skills` package is published first, then the CLI.
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env node
2
+ const { run } = require('../dist/cli');
3
+
4
+ run(process.argv.slice(2)).then((exitCode) => {
5
+ process.exit(exitCode);
6
+ });
@@ -0,0 +1,7 @@
1
+ export interface AgentConfig {
2
+ id: string;
3
+ skillsDir: string;
4
+ }
5
+ export declare function listSupportedAgents(): AgentConfig[];
6
+ export declare function resolveAgentDir(agentId?: string): string;
7
+ //# sourceMappingURL=agents.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agents.d.ts","sourceRoot":"","sources":["../src/agents.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;CACnB;AAUD,wBAAgB,mBAAmB,IAAI,WAAW,EAAE,CAEnD;AAED,wBAAgB,eAAe,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAYxD"}
@@ -0,0 +1,31 @@
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.listSupportedAgents = listSupportedAgents;
7
+ exports.resolveAgentDir = resolveAgentDir;
8
+ const node_path_1 = __importDefault(require("node:path"));
9
+ const node_os_1 = __importDefault(require("node:os"));
10
+ const SUPPORTED_AGENTS = [
11
+ { id: 'kimi', skillsDir: node_path_1.default.join(node_os_1.default.homedir(), '.agents', 'skills') },
12
+ { id: 'claude', skillsDir: node_path_1.default.join(node_os_1.default.homedir(), '.claude', 'skills') },
13
+ { id: 'codex', skillsDir: node_path_1.default.join(node_os_1.default.homedir(), '.codex', 'skills') },
14
+ { id: 'cursor', skillsDir: node_path_1.default.join(node_os_1.default.homedir(), '.cursor', 'rules') },
15
+ { id: 'windsurf', skillsDir: node_path_1.default.join(node_os_1.default.homedir(), '.windsurf', 'rules') },
16
+ ];
17
+ function listSupportedAgents() {
18
+ return SUPPORTED_AGENTS.map((a) => ({ ...a }));
19
+ }
20
+ function resolveAgentDir(agentId) {
21
+ if (!agentId) {
22
+ return SUPPORTED_AGENTS[0].skillsDir;
23
+ }
24
+ const agent = SUPPORTED_AGENTS.find((a) => a.id === agentId);
25
+ if (!agent) {
26
+ const known = SUPPORTED_AGENTS.map((a) => a.id).join(', ');
27
+ throw new Error(`Unknown agent "${agentId}". Supported agents: ${known}`);
28
+ }
29
+ return agent.skillsDir;
30
+ }
31
+ //# sourceMappingURL=agents.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agents.js","sourceRoot":"","sources":["../src/agents.ts"],"names":[],"mappings":";;;;;AAgBA,kDAEC;AAED,0CAYC;AAhCD,0DAA6B;AAC7B,sDAAyB;AAOzB,MAAM,gBAAgB,GAAkB;IACtC,EAAE,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,mBAAI,CAAC,IAAI,CAAC,iBAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,QAAQ,CAAC,EAAE;IACvE,EAAE,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,mBAAI,CAAC,IAAI,CAAC,iBAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,QAAQ,CAAC,EAAE;IACzE,EAAE,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,mBAAI,CAAC,IAAI,CAAC,iBAAE,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAAE;IACvE,EAAE,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,mBAAI,CAAC,IAAI,CAAC,iBAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE;IACxE,EAAE,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,mBAAI,CAAC,IAAI,CAAC,iBAAE,CAAC,OAAO,EAAE,EAAE,WAAW,EAAE,OAAO,CAAC,EAAE;CAC7E,CAAC;AAEF,SAAgB,mBAAmB;IACjC,OAAO,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;AACjD,CAAC;AAED,SAAgB,eAAe,CAAC,OAAgB;IAC9C,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,gBAAgB,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACvC,CAAC;IAED,MAAM,KAAK,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC,CAAC;IAC7D,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,KAAK,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3D,MAAM,IAAI,KAAK,CAAC,kBAAkB,OAAO,wBAAwB,KAAK,EAAE,CAAC,CAAC;IAC5E,CAAC;IAED,OAAO,KAAK,CAAC,SAAS,CAAC;AACzB,CAAC"}
@@ -0,0 +1,14 @@
1
+ export declare function parseArgs(argv: string[]): {
2
+ command: string;
3
+ target?: string;
4
+ skills?: string[];
5
+ agent?: string;
6
+ symlink?: boolean;
7
+ force?: boolean;
8
+ dryRun?: boolean;
9
+ port?: number;
10
+ host?: string;
11
+ };
12
+ export declare function printHelp(): string;
13
+ export declare function run(argv: string[]): Promise<number>;
14
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAeA,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG;IACzC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CA2DA;AAED,wBAAgB,SAAS,IAAI,MAAM,CAsBlC;AAsKD,wBAAsB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAiBzD"}
@@ -0,0 +1,255 @@
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.parseArgs = parseArgs;
7
+ exports.printHelp = printHelp;
8
+ exports.run = run;
9
+ const node_path_1 = __importDefault(require("node:path"));
10
+ const node_fs_1 = __importDefault(require("node:fs"));
11
+ const node_child_process_1 = require("node:child_process");
12
+ const resolver_1 = require("./resolver");
13
+ const agents_1 = require("./agents");
14
+ const installer_1 = require("./installer");
15
+ const mcp_1 = require("./mcp");
16
+ function requireValue(arg, next) {
17
+ if (next === undefined || next.startsWith('-')) {
18
+ throw new Error(`Flag ${arg} requires a value`);
19
+ }
20
+ return next;
21
+ }
22
+ function parseArgs(argv) {
23
+ const args = argv.slice(2);
24
+ let command = args[0];
25
+ if (command === '--version' || command === '-v') {
26
+ command = 'version';
27
+ }
28
+ else if (command === '--help' || command === '-h') {
29
+ command = 'help';
30
+ }
31
+ const result = { command };
32
+ for (let i = 1; i < args.length; i++) {
33
+ const arg = args[i];
34
+ const next = args[i + 1];
35
+ switch (arg) {
36
+ case '--target':
37
+ result.target = requireValue(arg, next);
38
+ i++;
39
+ break;
40
+ case '--skill':
41
+ if (!result.skills)
42
+ result.skills = [];
43
+ result.skills.push(requireValue(arg, next));
44
+ i++;
45
+ break;
46
+ case '--agent':
47
+ result.agent = requireValue(arg, next);
48
+ i++;
49
+ break;
50
+ case '--port':
51
+ result.port = parseInt(requireValue(arg, next), 10);
52
+ i++;
53
+ break;
54
+ case '--host':
55
+ result.host = requireValue(arg, next);
56
+ i++;
57
+ break;
58
+ case '--symlink':
59
+ result.symlink = true;
60
+ break;
61
+ case '--force':
62
+ result.force = true;
63
+ break;
64
+ case '--dry-run':
65
+ result.dryRun = true;
66
+ break;
67
+ case '--version':
68
+ case '-v':
69
+ result.command = 'version';
70
+ break;
71
+ case '--help':
72
+ case '-h':
73
+ result.command = 'help';
74
+ break;
75
+ }
76
+ }
77
+ return result;
78
+ }
79
+ function printHelp() {
80
+ return `crewloop <command> [options]
81
+
82
+ Commands:
83
+ install Install CrewLoop skills
84
+ list List available skills
85
+ dashboard Start the real-time skill dashboard
86
+ version Show version
87
+ help Show this help message
88
+
89
+ Options:
90
+ --target <dir> Install to a custom directory
91
+ --skill <name> Install only a specific skill (repeatable)
92
+ --agent <agent> Target agent convention (kimi, claude, codex, cursor, windsurf)
93
+ --port <number> Dashboard port (default: 7890)
94
+ --host <address> Dashboard host (default: 127.0.0.1)
95
+ --symlink Create symlinks instead of copying
96
+ --force Overwrite existing skills
97
+ --dry-run Print actions without installing
98
+ -v, --version Show version
99
+ -h, --help Show help
100
+ `;
101
+ }
102
+ function resolvePackageRoot() {
103
+ try {
104
+ const skillsPackageJson = require.resolve('@archznn/crewloop-skills/package.json');
105
+ return node_path_1.default.dirname(skillsPackageJson);
106
+ }
107
+ catch {
108
+ // Fallback for when the CLI is bundled inside the skills package itself.
109
+ const bundledRoot = node_path_1.default.resolve(__dirname, '..', '..');
110
+ if (node_fs_1.default.existsSync(node_path_1.default.join(bundledRoot, 'skills', 'orchestrator', 'SKILL.md'))) {
111
+ return bundledRoot;
112
+ }
113
+ const cwdNodeModules = node_path_1.default.join(process.cwd(), 'node_modules', '@archznn', 'crewloop-skills');
114
+ if (node_fs_1.default.existsSync(node_path_1.default.join(cwdNodeModules, 'package.json'))) {
115
+ return cwdNodeModules;
116
+ }
117
+ }
118
+ throw new Error('Could not find CrewLoop package root. Reinstall with: npm install -g @archznn/crewloop-cli');
119
+ }
120
+ function getVersion() {
121
+ try {
122
+ const packageRoot = resolvePackageRoot();
123
+ const pkg = JSON.parse(node_fs_1.default.readFileSync(node_path_1.default.join(packageRoot, 'package.json'), 'utf8'));
124
+ return pkg.version;
125
+ }
126
+ catch {
127
+ const fallback = node_path_1.default.resolve(__dirname, '..', '..', '..');
128
+ const pkg = JSON.parse(node_fs_1.default.readFileSync(node_path_1.default.join(fallback, 'package.json'), 'utf8'));
129
+ return pkg.version;
130
+ }
131
+ }
132
+ async function handleVersion() {
133
+ console.log(getVersion());
134
+ return 0;
135
+ }
136
+ async function handleList() {
137
+ const packageRoot = resolvePackageRoot();
138
+ const skills = (0, resolver_1.resolveSkills)(packageRoot);
139
+ if (skills.length === 0) {
140
+ console.log('No skills found.');
141
+ return 0;
142
+ }
143
+ console.log('Available CrewLoop skills:\n');
144
+ for (const skill of skills) {
145
+ console.log(` ${skill.name}`);
146
+ if (skill.description) {
147
+ console.log(` ${skill.description}`);
148
+ }
149
+ }
150
+ return 0;
151
+ }
152
+ async function handleInstall(args) {
153
+ const packageRoot = resolvePackageRoot();
154
+ const skills = (0, resolver_1.resolveSkills)(packageRoot, args.skills);
155
+ if (skills.length === 0) {
156
+ console.error('No matching skills found.');
157
+ return 1;
158
+ }
159
+ const targetDir = args.target || (0, agents_1.resolveAgentDir)(args.agent);
160
+ if (args.dryRun) {
161
+ console.log(`Would install ${skills.length} skill(s) to ${targetDir}:`);
162
+ for (const skill of skills) {
163
+ console.log(` - ${skill.name}`);
164
+ }
165
+ }
166
+ const result = (0, installer_1.installSkills)(skills, targetDir, {
167
+ target: args.target,
168
+ skills: args.skills,
169
+ agent: args.agent,
170
+ symlink: args.symlink,
171
+ force: args.force,
172
+ dryRun: args.dryRun,
173
+ }, packageRoot);
174
+ if (!args.dryRun) {
175
+ console.log(`Installed ${result.installed.length} skill(s) to ${targetDir}`);
176
+ for (const name of result.installed) {
177
+ console.log(` + ${name}`);
178
+ }
179
+ }
180
+ if (result.skipped.length > 0) {
181
+ console.log(`Skipped ${result.skipped.length} existing skill(s) (use --force to overwrite):`);
182
+ for (const name of result.skipped) {
183
+ console.log(` - ${name}`);
184
+ }
185
+ }
186
+ if (result.errors.length > 0) {
187
+ console.error(`Encountered ${result.errors.length} error(s):`);
188
+ for (const error of result.errors) {
189
+ console.error(` ! ${error.message}`);
190
+ }
191
+ return 1;
192
+ }
193
+ const mcpDir = node_path_1.default.join(packageRoot, 'servers', 'obsidian-mcp');
194
+ let mcpResult;
195
+ if (node_fs_1.default.existsSync(mcpDir)) {
196
+ mcpResult = (0, mcp_1.installMcpServer)(mcpDir, {
197
+ dryRun: args.dryRun,
198
+ force: args.force,
199
+ });
200
+ if (mcpResult.error) {
201
+ console.error(`MCP install warning: ${mcpResult.error.message}`);
202
+ }
203
+ else if (mcpResult.installed) {
204
+ console.log(`Installed Obsidian MCP server at ${mcpResult.binaryPath}`);
205
+ }
206
+ else if (mcpResult.skipped) {
207
+ console.log(`Obsidian MCP server already installed at ${mcpResult.binaryPath}`);
208
+ }
209
+ }
210
+ return 0;
211
+ }
212
+ async function handleDashboard(args) {
213
+ const packageRoot = resolvePackageRoot();
214
+ const dashboardBin = node_path_1.default.join(packageRoot, 'servers', 'dashboard', 'bin', 'crewloop-dashboard.js');
215
+ if (!node_fs_1.default.existsSync(dashboardBin)) {
216
+ console.error('Dashboard server not found. Build the dashboard package first:');
217
+ console.error(' cd servers/dashboard && npm install && npm run build');
218
+ return 1;
219
+ }
220
+ const env = { ...process.env };
221
+ if (args.port !== undefined) {
222
+ env.CREWLOOP_DASHBOARD_PORT = String(args.port);
223
+ }
224
+ if (args.host !== undefined) {
225
+ env.CREWLOOP_DASHBOARD_HOST = args.host;
226
+ }
227
+ console.log(`Starting CrewLoop dashboard from ${dashboardBin}`);
228
+ const child = (0, node_child_process_1.spawn)(process.execPath, [dashboardBin], {
229
+ env,
230
+ stdio: 'inherit',
231
+ });
232
+ return new Promise((resolve) => {
233
+ child.on('close', (code) => {
234
+ resolve(code ?? 0);
235
+ });
236
+ });
237
+ }
238
+ async function run(argv) {
239
+ const args = parseArgs(['node', 'crewloop', ...argv]);
240
+ switch (args.command) {
241
+ case 'install':
242
+ return handleInstall(args);
243
+ case 'list':
244
+ return handleList();
245
+ case 'dashboard':
246
+ return handleDashboard(args);
247
+ case 'version':
248
+ return handleVersion();
249
+ case 'help':
250
+ default:
251
+ console.log(printHelp());
252
+ return args.command === 'help' ? 0 : 1;
253
+ }
254
+ }
255
+ //# 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,19 @@
1
+ import type { SkillManifest } from './resolver';
2
+ export interface InstallOptions {
3
+ target?: string;
4
+ skills?: string[];
5
+ agent?: string;
6
+ symlink?: boolean;
7
+ force?: boolean;
8
+ dryRun?: boolean;
9
+ }
10
+ export interface InstallResult {
11
+ installed: string[];
12
+ skipped: string[];
13
+ errors: Error[];
14
+ }
15
+ export declare function mergeSharedDirs(targetSkillPath: string, sharedRoot: string, options: {
16
+ dryRun?: boolean;
17
+ }): void;
18
+ export declare function installSkills(skills: SkillManifest[], targetDir: string, options: InstallOptions, sharedRoot?: string): InstallResult;
19
+ //# sourceMappingURL=installer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"installer.d.ts","sourceRoot":"","sources":["../src/installer.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,MAAM,WAAW,cAAc;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AA+BD,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,EAAE,KAAK,EAAE,CAAC;CACjB;AAED,wBAAgB,eAAe,CAC7B,eAAe,EAAE,MAAM,EACvB,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GAC5B,IAAI,CAiBN;AAED,wBAAgB,aAAa,CAC3B,MAAM,EAAE,aAAa,EAAE,EACvB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,cAAc,EACvB,UAAU,CAAC,EAAE,MAAM,GAClB,aAAa,CA+Cf"}
@@ -0,0 +1,89 @@
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.mergeSharedDirs = mergeSharedDirs;
7
+ exports.installSkills = installSkills;
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
+ function ensureDir(dir) {
12
+ node_fs_1.default.mkdirSync(dir, { recursive: true });
13
+ }
14
+ function removeDir(dir) {
15
+ node_fs_1.default.rmSync(dir, { recursive: true, force: true });
16
+ }
17
+ function copyDir(source, target) {
18
+ ensureDir(target);
19
+ const entries = node_fs_1.default.readdirSync(source, { withFileTypes: true });
20
+ for (const entry of entries) {
21
+ const sourcePath = node_path_1.default.join(source, entry.name);
22
+ const targetPath = node_path_1.default.join(target, entry.name);
23
+ if (entry.isDirectory()) {
24
+ copyDir(sourcePath, targetPath);
25
+ }
26
+ else {
27
+ node_fs_1.default.copyFileSync(sourcePath, targetPath);
28
+ }
29
+ }
30
+ }
31
+ function createSymlink(source, target) {
32
+ const type = node_os_1.default.platform() === 'win32' ? 'junction' : 'dir';
33
+ node_fs_1.default.symlinkSync(source, target, type);
34
+ }
35
+ function mergeSharedDirs(targetSkillPath, sharedRoot, options) {
36
+ const sharedDirs = ['references', 'assets'];
37
+ for (const dir of sharedDirs) {
38
+ const sourceDir = node_path_1.default.join(sharedRoot, dir);
39
+ if (!node_fs_1.default.existsSync(sourceDir)) {
40
+ continue;
41
+ }
42
+ const targetDir = node_path_1.default.join(targetSkillPath, dir);
43
+ if (options.dryRun) {
44
+ continue;
45
+ }
46
+ copyDir(sourceDir, targetDir);
47
+ }
48
+ }
49
+ function installSkills(skills, targetDir, options, sharedRoot) {
50
+ const result = { installed: [], skipped: [], errors: [] };
51
+ if (skills.length === 0) {
52
+ return result;
53
+ }
54
+ if (!options.dryRun) {
55
+ ensureDir(targetDir);
56
+ }
57
+ for (const skill of skills) {
58
+ const targetPath = node_path_1.default.join(targetDir, skill.name);
59
+ const exists = node_fs_1.default.existsSync(targetPath);
60
+ if (exists && !options.force) {
61
+ result.skipped.push(skill.name);
62
+ continue;
63
+ }
64
+ if (options.dryRun) {
65
+ result.installed.push(skill.name);
66
+ continue;
67
+ }
68
+ try {
69
+ if (exists && options.force) {
70
+ removeDir(targetPath);
71
+ }
72
+ if (options.symlink) {
73
+ createSymlink(skill.sourcePath, targetPath);
74
+ }
75
+ else {
76
+ copyDir(skill.sourcePath, targetPath);
77
+ }
78
+ if (sharedRoot && !options.symlink) {
79
+ mergeSharedDirs(targetPath, sharedRoot, { dryRun: options.dryRun });
80
+ }
81
+ result.installed.push(skill.name);
82
+ }
83
+ catch (error) {
84
+ result.errors.push(error instanceof Error ? error : new Error(String(error)));
85
+ }
86
+ }
87
+ return result;
88
+ }
89
+ //# sourceMappingURL=installer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"installer.js","sourceRoot":"","sources":["../src/installer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ export interface McpInstallOptions {
2
+ dryRun?: boolean;
3
+ force?: boolean;
4
+ /** Python executable name/path. Default: "python3" on Unix, "python" on Windows. */
5
+ pythonCmd?: string;
6
+ /** Directory where the obsidian-mcp wrapper/symlink is placed. Default: <homedir>/.local/bin */
7
+ localBinDir?: string;
8
+ }
9
+ export interface McpInstallResult {
10
+ /** True if a new install or re-install happened. */
11
+ installed: boolean;
12
+ /** True if the binary was already present and force was false. */
13
+ skipped: boolean;
14
+ /** Absolute path to the exposed binary or wrapper. */
15
+ binaryPath?: string;
16
+ /** Error that did not block skill installation. */
17
+ error?: Error;
18
+ }
19
+ export declare function installMcpServer(mcpSourceDir: string, options?: McpInstallOptions): McpInstallResult;
20
+ //# sourceMappingURL=mcp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,iBAAiB;IAChC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,oFAAoF;IACpF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gGAAgG;IAChG,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,gBAAgB;IAC/B,oDAAoD;IACpD,SAAS,EAAE,OAAO,CAAC;IACnB,kEAAkE;IAClE,OAAO,EAAE,OAAO,CAAC;IACjB,sDAAsD;IACtD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,mDAAmD;IACnD,KAAK,CAAC,EAAE,KAAK,CAAC;CACf;AAgHD,wBAAgB,gBAAgB,CAC9B,YAAY,EAAE,MAAM,EACpB,OAAO,GAAE,iBAAsB,GAC9B,gBAAgB,CAwClB"}