compact-agent 1.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 (324) hide show
  1. package/README.md +394 -0
  2. package/bin/anycode.js +2 -0
  3. package/bin/crowcoder.js +19 -0
  4. package/bin/ecc-hooks.cjs +138 -0
  5. package/dist/agents.d.ts +17 -0
  6. package/dist/agents.js +1603 -0
  7. package/dist/agents.js.map +1 -0
  8. package/dist/api.d.ts +16 -0
  9. package/dist/api.js +115 -0
  10. package/dist/api.js.map +1 -0
  11. package/dist/autonomous-loops.d.ts +108 -0
  12. package/dist/autonomous-loops.js +526 -0
  13. package/dist/autonomous-loops.js.map +1 -0
  14. package/dist/codemaps.d.ts +53 -0
  15. package/dist/codemaps.js +325 -0
  16. package/dist/codemaps.js.map +1 -0
  17. package/dist/compaction.d.ts +30 -0
  18. package/dist/compaction.js +125 -0
  19. package/dist/compaction.js.map +1 -0
  20. package/dist/config.d.ts +5 -0
  21. package/dist/config.js +79 -0
  22. package/dist/config.js.map +1 -0
  23. package/dist/content-engine.d.ts +97 -0
  24. package/dist/content-engine.js +721 -0
  25. package/dist/content-engine.js.map +1 -0
  26. package/dist/cost-tracker.d.ts +49 -0
  27. package/dist/cost-tracker.js +150 -0
  28. package/dist/cost-tracker.js.map +1 -0
  29. package/dist/counter-button.d.ts +35 -0
  30. package/dist/counter-button.js +48 -0
  31. package/dist/counter-button.js.map +1 -0
  32. package/dist/counter.d.ts +21 -0
  33. package/dist/counter.js +31 -0
  34. package/dist/counter.js.map +1 -0
  35. package/dist/coverage.d.ts +23 -0
  36. package/dist/coverage.js +215 -0
  37. package/dist/coverage.js.map +1 -0
  38. package/dist/docs-sync.d.ts +23 -0
  39. package/dist/docs-sync.js +266 -0
  40. package/dist/docs-sync.js.map +1 -0
  41. package/dist/ecc.d.ts +41 -0
  42. package/dist/ecc.js +644 -0
  43. package/dist/ecc.js.map +1 -0
  44. package/dist/evaluation.d.ts +24 -0
  45. package/dist/evaluation.js +412 -0
  46. package/dist/evaluation.js.map +1 -0
  47. package/dist/export.d.ts +22 -0
  48. package/dist/export.js +109 -0
  49. package/dist/export.js.map +1 -0
  50. package/dist/git-workflow.d.ts +22 -0
  51. package/dist/git-workflow.js +197 -0
  52. package/dist/git-workflow.js.map +1 -0
  53. package/dist/hook-controls.d.ts +34 -0
  54. package/dist/hook-controls.js +90 -0
  55. package/dist/hook-controls.js.map +1 -0
  56. package/dist/hooks.d.ts +30 -0
  57. package/dist/hooks.js +130 -0
  58. package/dist/hooks.js.map +1 -0
  59. package/dist/html-parser.d.ts +18 -0
  60. package/dist/html-parser.js +101 -0
  61. package/dist/html-parser.js.map +1 -0
  62. package/dist/index.d.ts +12 -0
  63. package/dist/index.js +1230 -0
  64. package/dist/index.js.map +1 -0
  65. package/dist/learning.d.ts +35 -0
  66. package/dist/learning.js +238 -0
  67. package/dist/learning.js.map +1 -0
  68. package/dist/login.d.ts +37 -0
  69. package/dist/login.js +191 -0
  70. package/dist/login.js.map +1 -0
  71. package/dist/memory.d.ts +39 -0
  72. package/dist/memory.js +183 -0
  73. package/dist/memory.js.map +1 -0
  74. package/dist/model-router.d.ts +23 -0
  75. package/dist/model-router.js +145 -0
  76. package/dist/model-router.js.map +1 -0
  77. package/dist/modes.d.ts +17 -0
  78. package/dist/modes.js +217 -0
  79. package/dist/modes.js.map +1 -0
  80. package/dist/orchestration.d.ts +37 -0
  81. package/dist/orchestration.js +139 -0
  82. package/dist/orchestration.js.map +1 -0
  83. package/dist/package-detect.d.ts +36 -0
  84. package/dist/package-detect.js +529 -0
  85. package/dist/package-detect.js.map +1 -0
  86. package/dist/permissions.d.ts +25 -0
  87. package/dist/permissions.js +50 -0
  88. package/dist/permissions.js.map +1 -0
  89. package/dist/pm2-manager.d.ts +40 -0
  90. package/dist/pm2-manager.js +127 -0
  91. package/dist/pm2-manager.js.map +1 -0
  92. package/dist/query.d.ts +15 -0
  93. package/dist/query.js +278 -0
  94. package/dist/query.js.map +1 -0
  95. package/dist/refactor.d.ts +22 -0
  96. package/dist/refactor.js +226 -0
  97. package/dist/refactor.js.map +1 -0
  98. package/dist/retry.d.ts +20 -0
  99. package/dist/retry.js +88 -0
  100. package/dist/retry.js.map +1 -0
  101. package/dist/rules.d.ts +34 -0
  102. package/dist/rules.js +942 -0
  103. package/dist/rules.js.map +1 -0
  104. package/dist/schema.d.ts +23 -0
  105. package/dist/schema.js +12 -0
  106. package/dist/schema.js.map +1 -0
  107. package/dist/search-first.d.ts +17 -0
  108. package/dist/search-first.js +301 -0
  109. package/dist/search-first.js.map +1 -0
  110. package/dist/security.d.ts +10 -0
  111. package/dist/security.js +145 -0
  112. package/dist/security.js.map +1 -0
  113. package/dist/sessions.d.ts +21 -0
  114. package/dist/sessions.js +112 -0
  115. package/dist/sessions.js.map +1 -0
  116. package/dist/skill-create.d.ts +38 -0
  117. package/dist/skill-create.js +389 -0
  118. package/dist/skill-create.js.map +1 -0
  119. package/dist/skills.d.ts +34 -0
  120. package/dist/skills.js +161 -0
  121. package/dist/skills.js.map +1 -0
  122. package/dist/strategic-compaction.d.ts +24 -0
  123. package/dist/strategic-compaction.js +144 -0
  124. package/dist/strategic-compaction.js.map +1 -0
  125. package/dist/system-prompt.d.ts +3 -0
  126. package/dist/system-prompt.js +101 -0
  127. package/dist/system-prompt.js.map +1 -0
  128. package/dist/theme.d.ts +60 -0
  129. package/dist/theme.js +220 -0
  130. package/dist/theme.js.map +1 -0
  131. package/dist/tools/bash.d.ts +2 -0
  132. package/dist/tools/bash.js +49 -0
  133. package/dist/tools/bash.js.map +1 -0
  134. package/dist/tools/edit.d.ts +2 -0
  135. package/dist/tools/edit.js +76 -0
  136. package/dist/tools/edit.js.map +1 -0
  137. package/dist/tools/glob.d.ts +2 -0
  138. package/dist/tools/glob.js +54 -0
  139. package/dist/tools/glob.js.map +1 -0
  140. package/dist/tools/grep.d.ts +2 -0
  141. package/dist/tools/grep.js +64 -0
  142. package/dist/tools/grep.js.map +1 -0
  143. package/dist/tools/index.d.ts +5 -0
  144. package/dist/tools/index.js +27 -0
  145. package/dist/tools/index.js.map +1 -0
  146. package/dist/tools/list-dir.d.ts +2 -0
  147. package/dist/tools/list-dir.js +51 -0
  148. package/dist/tools/list-dir.js.map +1 -0
  149. package/dist/tools/read.d.ts +2 -0
  150. package/dist/tools/read.js +56 -0
  151. package/dist/tools/read.js.map +1 -0
  152. package/dist/tools/types.d.ts +45 -0
  153. package/dist/tools/types.js +2 -0
  154. package/dist/tools/types.js.map +1 -0
  155. package/dist/tools/web-fetch.d.ts +2 -0
  156. package/dist/tools/web-fetch.js +41 -0
  157. package/dist/tools/web-fetch.js.map +1 -0
  158. package/dist/tools/web-search.d.ts +27 -0
  159. package/dist/tools/web-search.js +139 -0
  160. package/dist/tools/web-search.js.map +1 -0
  161. package/dist/tools/write.d.ts +2 -0
  162. package/dist/tools/write.js +36 -0
  163. package/dist/tools/write.js.map +1 -0
  164. package/dist/types.d.ts +28 -0
  165. package/dist/types.js +57 -0
  166. package/dist/types.js.map +1 -0
  167. package/dist/users.d.ts +51 -0
  168. package/dist/users.js +193 -0
  169. package/dist/users.js.map +1 -0
  170. package/dist/verification.d.ts +73 -0
  171. package/dist/verification.js +269 -0
  172. package/dist/verification.js.map +1 -0
  173. package/dist/walkthrough.d.ts +10 -0
  174. package/dist/walkthrough.js +121 -0
  175. package/dist/walkthrough.js.map +1 -0
  176. package/package.json +58 -0
  177. package/resources/ecc/agents/architect.json +16 -0
  178. package/resources/ecc/agents/architect.md +212 -0
  179. package/resources/ecc/agents/build-error-resolver.json +17 -0
  180. package/resources/ecc/agents/build-error-resolver.md +116 -0
  181. package/resources/ecc/agents/chief-of-staff.json +17 -0
  182. package/resources/ecc/agents/chief-of-staff.md +153 -0
  183. package/resources/ecc/agents/code-reviewer.json +16 -0
  184. package/resources/ecc/agents/code-reviewer.md +238 -0
  185. package/resources/ecc/agents/database-reviewer.json +16 -0
  186. package/resources/ecc/agents/database-reviewer.md +92 -0
  187. package/resources/ecc/agents/doc-updater.json +16 -0
  188. package/resources/ecc/agents/doc-updater.md +108 -0
  189. package/resources/ecc/agents/e2e-runner.json +17 -0
  190. package/resources/ecc/agents/e2e-runner.md +109 -0
  191. package/resources/ecc/agents/go-build-resolver.json +17 -0
  192. package/resources/ecc/agents/go-build-resolver.md +96 -0
  193. package/resources/ecc/agents/go-reviewer.json +16 -0
  194. package/resources/ecc/agents/go-reviewer.md +77 -0
  195. package/resources/ecc/agents/harness-optimizer.json +15 -0
  196. package/resources/ecc/agents/harness-optimizer.md +34 -0
  197. package/resources/ecc/agents/loop-operator.json +16 -0
  198. package/resources/ecc/agents/loop-operator.md +36 -0
  199. package/resources/ecc/agents/planner.json +15 -0
  200. package/resources/ecc/agents/planner.md +212 -0
  201. package/resources/ecc/agents/python-reviewer.json +16 -0
  202. package/resources/ecc/agents/python-reviewer.md +99 -0
  203. package/resources/ecc/agents/refactor-cleaner.json +17 -0
  204. package/resources/ecc/agents/refactor-cleaner.md +87 -0
  205. package/resources/ecc/agents/security-reviewer.json +16 -0
  206. package/resources/ecc/agents/security-reviewer.md +109 -0
  207. package/resources/ecc/agents/tdd-guide.json +17 -0
  208. package/resources/ecc/agents/tdd-guide.md +93 -0
  209. package/resources/ecc/commands/add-language-rules.md +39 -0
  210. package/resources/ecc/commands/database-migration.md +36 -0
  211. package/resources/ecc/commands/feature-development.md +38 -0
  212. package/resources/ecc/prompts/build-fix.prompt.md +47 -0
  213. package/resources/ecc/prompts/code-review.prompt.md +56 -0
  214. package/resources/ecc/prompts/plan.prompt.md +52 -0
  215. package/resources/ecc/prompts/refactor.prompt.md +50 -0
  216. package/resources/ecc/prompts/security-review.prompt.md +70 -0
  217. package/resources/ecc/prompts/tdd.prompt.md +47 -0
  218. package/resources/ecc/rules/common-agents.md +53 -0
  219. package/resources/ecc/rules/common-coding-style.md +52 -0
  220. package/resources/ecc/rules/common-development-workflow.md +33 -0
  221. package/resources/ecc/rules/common-git-workflow.md +28 -0
  222. package/resources/ecc/rules/common-hooks.md +34 -0
  223. package/resources/ecc/rules/common-patterns.md +35 -0
  224. package/resources/ecc/rules/common-performance.md +59 -0
  225. package/resources/ecc/rules/common-security.md +33 -0
  226. package/resources/ecc/rules/common-testing.md +33 -0
  227. package/resources/ecc/rules/golang-coding-style.md +31 -0
  228. package/resources/ecc/rules/golang-hooks.md +16 -0
  229. package/resources/ecc/rules/golang-patterns.md +44 -0
  230. package/resources/ecc/rules/golang-security.md +33 -0
  231. package/resources/ecc/rules/golang-testing.md +30 -0
  232. package/resources/ecc/rules/kotlin-coding-style.md +39 -0
  233. package/resources/ecc/rules/kotlin-hooks.md +16 -0
  234. package/resources/ecc/rules/kotlin-patterns.md +50 -0
  235. package/resources/ecc/rules/kotlin-security.md +58 -0
  236. package/resources/ecc/rules/kotlin-testing.md +38 -0
  237. package/resources/ecc/rules/php-coding-style.md +25 -0
  238. package/resources/ecc/rules/php-hooks.md +21 -0
  239. package/resources/ecc/rules/php-patterns.md +23 -0
  240. package/resources/ecc/rules/php-security.md +24 -0
  241. package/resources/ecc/rules/php-testing.md +26 -0
  242. package/resources/ecc/rules/python-coding-style.md +42 -0
  243. package/resources/ecc/rules/python-hooks.md +19 -0
  244. package/resources/ecc/rules/python-patterns.md +39 -0
  245. package/resources/ecc/rules/python-security.md +30 -0
  246. package/resources/ecc/rules/python-testing.md +38 -0
  247. package/resources/ecc/rules/swift-coding-style.md +47 -0
  248. package/resources/ecc/rules/swift-hooks.md +20 -0
  249. package/resources/ecc/rules/swift-patterns.md +66 -0
  250. package/resources/ecc/rules/swift-security.md +33 -0
  251. package/resources/ecc/rules/swift-testing.md +45 -0
  252. package/resources/ecc/rules/typescript-coding-style.md +63 -0
  253. package/resources/ecc/rules/typescript-hooks.md +20 -0
  254. package/resources/ecc/rules/typescript-patterns.md +50 -0
  255. package/resources/ecc/rules/typescript-security.md +26 -0
  256. package/resources/ecc/rules/typescript-testing.md +16 -0
  257. package/resources/ecc/skills/agent-introspection-debugging/SKILL.md +152 -0
  258. package/resources/ecc/skills/agent-introspection-debugging/agents/openai.yaml +7 -0
  259. package/resources/ecc/skills/agent-sort/SKILL.md +214 -0
  260. package/resources/ecc/skills/agent-sort/agents/openai.yaml +7 -0
  261. package/resources/ecc/skills/api-design/SKILL.md +522 -0
  262. package/resources/ecc/skills/api-design/agents/openai.yaml +7 -0
  263. package/resources/ecc/skills/article-writing/SKILL.md +78 -0
  264. package/resources/ecc/skills/article-writing/agents/openai.yaml +7 -0
  265. package/resources/ecc/skills/backend-patterns/SKILL.md +597 -0
  266. package/resources/ecc/skills/backend-patterns/agents/openai.yaml +7 -0
  267. package/resources/ecc/skills/brand-voice/SKILL.md +96 -0
  268. package/resources/ecc/skills/brand-voice/agents/openai.yaml +7 -0
  269. package/resources/ecc/skills/brand-voice/references/voice-profile-schema.md +55 -0
  270. package/resources/ecc/skills/bun-runtime/SKILL.md +83 -0
  271. package/resources/ecc/skills/bun-runtime/agents/openai.yaml +7 -0
  272. package/resources/ecc/skills/coding-standards/SKILL.md +548 -0
  273. package/resources/ecc/skills/coding-standards/agents/openai.yaml +7 -0
  274. package/resources/ecc/skills/content-engine/SKILL.md +130 -0
  275. package/resources/ecc/skills/content-engine/agents/openai.yaml +7 -0
  276. package/resources/ecc/skills/crosspost/SKILL.md +110 -0
  277. package/resources/ecc/skills/crosspost/agents/openai.yaml +7 -0
  278. package/resources/ecc/skills/deep-research/SKILL.md +154 -0
  279. package/resources/ecc/skills/deep-research/agents/openai.yaml +7 -0
  280. package/resources/ecc/skills/dmux-workflows/SKILL.md +143 -0
  281. package/resources/ecc/skills/dmux-workflows/agents/openai.yaml +7 -0
  282. package/resources/ecc/skills/documentation-lookup/SKILL.md +89 -0
  283. package/resources/ecc/skills/documentation-lookup/agents/openai.yaml +7 -0
  284. package/resources/ecc/skills/e2e-testing/SKILL.md +325 -0
  285. package/resources/ecc/skills/e2e-testing/agents/openai.yaml +7 -0
  286. package/resources/ecc/skills/eval-harness/SKILL.md +235 -0
  287. package/resources/ecc/skills/eval-harness/agents/openai.yaml +7 -0
  288. package/resources/ecc/skills/everything-claude-code/SKILL.md +442 -0
  289. package/resources/ecc/skills/everything-claude-code/agents/openai.yaml +7 -0
  290. package/resources/ecc/skills/exa-search/SKILL.md +169 -0
  291. package/resources/ecc/skills/exa-search/agents/openai.yaml +7 -0
  292. package/resources/ecc/skills/fal-ai-media/SKILL.md +276 -0
  293. package/resources/ecc/skills/fal-ai-media/agents/openai.yaml +7 -0
  294. package/resources/ecc/skills/frontend-patterns/SKILL.md +647 -0
  295. package/resources/ecc/skills/frontend-patterns/agents/openai.yaml +7 -0
  296. package/resources/ecc/skills/frontend-slides/SKILL.md +183 -0
  297. package/resources/ecc/skills/frontend-slides/STYLE_PRESETS.md +330 -0
  298. package/resources/ecc/skills/frontend-slides/agents/openai.yaml +7 -0
  299. package/resources/ecc/skills/investor-materials/SKILL.md +95 -0
  300. package/resources/ecc/skills/investor-materials/agents/openai.yaml +7 -0
  301. package/resources/ecc/skills/investor-outreach/SKILL.md +90 -0
  302. package/resources/ecc/skills/investor-outreach/agents/openai.yaml +7 -0
  303. package/resources/ecc/skills/market-research/SKILL.md +74 -0
  304. package/resources/ecc/skills/market-research/agents/openai.yaml +7 -0
  305. package/resources/ecc/skills/mcp-server-patterns/SKILL.md +66 -0
  306. package/resources/ecc/skills/mcp-server-patterns/agents/openai.yaml +7 -0
  307. package/resources/ecc/skills/mle-workflow/SKILL.md +346 -0
  308. package/resources/ecc/skills/mle-workflow/agents/openai.yaml +7 -0
  309. package/resources/ecc/skills/nextjs-turbopack/SKILL.md +43 -0
  310. package/resources/ecc/skills/nextjs-turbopack/agents/openai.yaml +7 -0
  311. package/resources/ecc/skills/product-capability/SKILL.md +140 -0
  312. package/resources/ecc/skills/product-capability/agents/openai.yaml +7 -0
  313. package/resources/ecc/skills/security-review/SKILL.md +494 -0
  314. package/resources/ecc/skills/security-review/agents/openai.yaml +7 -0
  315. package/resources/ecc/skills/strategic-compact/SKILL.md +102 -0
  316. package/resources/ecc/skills/strategic-compact/agents/openai.yaml +7 -0
  317. package/resources/ecc/skills/tdd-workflow/SKILL.md +409 -0
  318. package/resources/ecc/skills/tdd-workflow/agents/openai.yaml +7 -0
  319. package/resources/ecc/skills/verification-loop/SKILL.md +125 -0
  320. package/resources/ecc/skills/verification-loop/agents/openai.yaml +7 -0
  321. package/resources/ecc/skills/video-editing/SKILL.md +307 -0
  322. package/resources/ecc/skills/video-editing/agents/openai.yaml +7 -0
  323. package/resources/ecc/skills/x-api/SKILL.md +229 -0
  324. package/resources/ecc/skills/x-api/agents/openai.yaml +7 -0
@@ -0,0 +1,529 @@
1
+ import { execSync } from 'node:child_process';
2
+ import { existsSync, readFileSync } from 'node:fs';
3
+ import { join } from 'node:path';
4
+ /**
5
+ * Detects the package manager used in the project.
6
+ * Priority order:
7
+ * 1. CROWCODER_PACKAGE_MANAGER env var
8
+ * 2. .crowcoder/package-manager.json in cwd
9
+ * 3. package.json packageManager field
10
+ * 4. Lock file detection
11
+ * 5. Fallback: which command check
12
+ */
13
+ export function detectPackageManager(cwd) {
14
+ // 1. Check environment variable
15
+ const envPm = process.env.CROWCODER_PACKAGE_MANAGER;
16
+ if (envPm) {
17
+ return getPackageManagerInfo(envPm);
18
+ }
19
+ // 2. Check .crowcoder/package-manager.json
20
+ const configPath = join(cwd, '.crowcoder', 'package-manager.json');
21
+ if (existsSync(configPath)) {
22
+ try {
23
+ const config = JSON.parse(readFileSync(configPath, 'utf-8'));
24
+ if (config.packageManager) {
25
+ return getPackageManagerInfo(config.packageManager);
26
+ }
27
+ }
28
+ catch {
29
+ // Continue to next detection method
30
+ }
31
+ }
32
+ // 3. Check package.json packageManager field
33
+ const packageJsonPath = join(cwd, 'package.json');
34
+ if (existsSync(packageJsonPath)) {
35
+ try {
36
+ const packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf-8'));
37
+ if (packageJson.packageManager) {
38
+ const pmString = packageJson.packageManager;
39
+ const pmName = pmString.split('@')[0];
40
+ return getPackageManagerInfo(pmName);
41
+ }
42
+ }
43
+ catch {
44
+ // Continue to next detection method
45
+ }
46
+ }
47
+ // 4. Lock file detection
48
+ const lockFiles = [
49
+ ['package-lock.json', 'npm'],
50
+ ['yarn.lock', 'yarn'],
51
+ ['pnpm-lock.yaml', 'pnpm'],
52
+ ['bun.lockb', 'bun'],
53
+ ];
54
+ for (const [lockFile, pmName] of lockFiles) {
55
+ if (existsSync(join(cwd, lockFile))) {
56
+ return getPackageManagerInfo(pmName);
57
+ }
58
+ }
59
+ // 5. Check other language package managers
60
+ const otherManagers = [
61
+ ['Cargo.toml', 'cargo'],
62
+ ['go.mod', 'go'],
63
+ ['pyproject.toml', 'pip'],
64
+ ['setup.py', 'pip'],
65
+ ['Gemfile', 'bundler'],
66
+ ];
67
+ for (const [file, pmName] of otherManagers) {
68
+ if (existsSync(join(cwd, file))) {
69
+ return getPackageManagerInfo(pmName);
70
+ }
71
+ }
72
+ // 6. Fallback: check which are installed
73
+ const fallbackOrder = ['npm', 'yarn', 'pnpm', 'bun', 'cargo', 'go', 'pip', 'bundler'];
74
+ for (const pm of fallbackOrder) {
75
+ try {
76
+ execSync(`which ${pm}`, { stdio: 'ignore' });
77
+ return getPackageManagerInfo(pm);
78
+ }
79
+ catch {
80
+ // Continue
81
+ }
82
+ }
83
+ // Final fallback to npm
84
+ return getPackageManagerInfo('npm');
85
+ }
86
+ /**
87
+ * Maps package manager name to full info
88
+ */
89
+ function getPackageManagerInfo(name) {
90
+ const managers = {
91
+ npm: {
92
+ name: 'npm',
93
+ command: 'npm',
94
+ installCmd: 'npm install',
95
+ runCmd: 'npm run',
96
+ lockFile: 'package-lock.json',
97
+ },
98
+ yarn: {
99
+ name: 'yarn',
100
+ command: 'yarn',
101
+ installCmd: 'yarn install',
102
+ runCmd: 'yarn run',
103
+ lockFile: 'yarn.lock',
104
+ },
105
+ pnpm: {
106
+ name: 'pnpm',
107
+ command: 'pnpm',
108
+ installCmd: 'pnpm install',
109
+ runCmd: 'pnpm run',
110
+ lockFile: 'pnpm-lock.yaml',
111
+ },
112
+ bun: {
113
+ name: 'bun',
114
+ command: 'bun',
115
+ installCmd: 'bun install',
116
+ runCmd: 'bun run',
117
+ lockFile: 'bun.lockb',
118
+ },
119
+ cargo: {
120
+ name: 'cargo',
121
+ command: 'cargo',
122
+ installCmd: 'cargo add',
123
+ runCmd: 'cargo run',
124
+ },
125
+ go: {
126
+ name: 'go',
127
+ command: 'go',
128
+ installCmd: 'go get',
129
+ runCmd: 'go run',
130
+ },
131
+ pip: {
132
+ name: 'pip',
133
+ command: 'pip',
134
+ installCmd: 'pip install',
135
+ runCmd: 'python -m',
136
+ },
137
+ bundler: {
138
+ name: 'bundler',
139
+ command: 'bundle',
140
+ installCmd: 'bundle install',
141
+ runCmd: 'bundle exec',
142
+ },
143
+ };
144
+ return managers[name.toLowerCase()] || managers['npm'];
145
+ }
146
+ // ── Test Runner Detection ──────────────────────────────────────────
147
+ /**
148
+ * Detects the test runner used in the project
149
+ */
150
+ export function detectTestRunner(cwd) {
151
+ const packageJsonPath = join(cwd, 'package.json');
152
+ const pyprojectPath = join(cwd, 'pyproject.toml');
153
+ const cargoPath = join(cwd, 'Cargo.toml');
154
+ const goPath = join(cwd, 'go.mod');
155
+ // JavaScript/TypeScript test runners
156
+ if (existsSync(packageJsonPath)) {
157
+ try {
158
+ const packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf-8'));
159
+ const deps = {
160
+ ...packageJson.dependencies,
161
+ ...packageJson.devDependencies,
162
+ };
163
+ if (deps.jest) {
164
+ return {
165
+ name: 'jest',
166
+ command: 'jest',
167
+ coverageCommand: 'jest --coverage',
168
+ framework: 'javascript',
169
+ };
170
+ }
171
+ if (deps.vitest) {
172
+ return {
173
+ name: 'vitest',
174
+ command: 'vitest',
175
+ coverageCommand: 'vitest --coverage',
176
+ framework: 'javascript',
177
+ };
178
+ }
179
+ if (deps.mocha) {
180
+ return {
181
+ name: 'mocha',
182
+ command: 'mocha',
183
+ coverageCommand: 'nyc mocha',
184
+ framework: 'javascript',
185
+ };
186
+ }
187
+ if (deps.playwright) {
188
+ return {
189
+ name: 'playwright',
190
+ command: 'playwright test',
191
+ coverageCommand: 'playwright test --reporter=coverage',
192
+ framework: 'javascript',
193
+ };
194
+ }
195
+ if (deps.cypress) {
196
+ return {
197
+ name: 'cypress',
198
+ command: 'cypress run',
199
+ coverageCommand: 'cypress run --coverage',
200
+ framework: 'javascript',
201
+ };
202
+ }
203
+ // Check for vitest config files
204
+ if (existsSync(join(cwd, 'vitest.config.ts')) ||
205
+ existsSync(join(cwd, 'vitest.config.js'))) {
206
+ return {
207
+ name: 'vitest',
208
+ command: 'vitest',
209
+ coverageCommand: 'vitest --coverage',
210
+ framework: 'javascript',
211
+ };
212
+ }
213
+ // Check for jest config files
214
+ if (existsSync(join(cwd, 'jest.config.js')) ||
215
+ existsSync(join(cwd, 'jest.config.ts')) ||
216
+ existsSync(join(cwd, 'jest.config.json'))) {
217
+ return {
218
+ name: 'jest',
219
+ command: 'jest',
220
+ coverageCommand: 'jest --coverage',
221
+ framework: 'javascript',
222
+ };
223
+ }
224
+ }
225
+ catch {
226
+ // Continue to next detection
227
+ }
228
+ }
229
+ // Python test runners
230
+ if (existsSync(pyprojectPath)) {
231
+ try {
232
+ const pyproject = readFileSync(pyprojectPath, 'utf-8');
233
+ if (pyproject.includes('pytest')) {
234
+ return {
235
+ name: 'pytest',
236
+ command: 'pytest',
237
+ coverageCommand: 'pytest --cov',
238
+ framework: 'python',
239
+ };
240
+ }
241
+ if (pyproject.includes('unittest')) {
242
+ return {
243
+ name: 'unittest',
244
+ command: 'python -m unittest',
245
+ coverageCommand: 'coverage run -m unittest',
246
+ framework: 'python',
247
+ };
248
+ }
249
+ }
250
+ catch {
251
+ // Continue
252
+ }
253
+ }
254
+ // Python setup.py based projects
255
+ if (existsSync(join(cwd, 'setup.py'))) {
256
+ try {
257
+ const setup = readFileSync(join(cwd, 'setup.py'), 'utf-8');
258
+ if (setup.includes('pytest')) {
259
+ return {
260
+ name: 'pytest',
261
+ command: 'pytest',
262
+ coverageCommand: 'pytest --cov',
263
+ framework: 'python',
264
+ };
265
+ }
266
+ }
267
+ catch {
268
+ // Continue
269
+ }
270
+ }
271
+ // Rust test runner (cargo)
272
+ if (existsSync(cargoPath)) {
273
+ return {
274
+ name: 'cargo test',
275
+ command: 'cargo test',
276
+ coverageCommand: 'cargo tarpaulin',
277
+ framework: 'rust',
278
+ };
279
+ }
280
+ // Go test runner
281
+ if (existsSync(goPath)) {
282
+ return {
283
+ name: 'go test',
284
+ command: 'go test ./...',
285
+ coverageCommand: 'go test -cover ./...',
286
+ framework: 'go',
287
+ };
288
+ }
289
+ // Ruby test runners
290
+ if (existsSync(join(cwd, 'Gemfile'))) {
291
+ try {
292
+ const gemfile = readFileSync(join(cwd, 'Gemfile'), 'utf-8');
293
+ if (gemfile.includes('rspec')) {
294
+ return {
295
+ name: 'rspec',
296
+ command: 'rspec',
297
+ coverageCommand: 'rspec --coverage',
298
+ framework: 'ruby',
299
+ };
300
+ }
301
+ if (gemfile.includes('minitest')) {
302
+ return {
303
+ name: 'minitest',
304
+ command: 'ruby -Ilib:test test/**/*_test.rb',
305
+ coverageCommand: 'ruby -Ilib:test test/**/*_test.rb',
306
+ framework: 'ruby',
307
+ };
308
+ }
309
+ }
310
+ catch {
311
+ // Continue
312
+ }
313
+ }
314
+ // PHP test runners
315
+ if (existsSync(join(cwd, 'composer.json'))) {
316
+ try {
317
+ const composer = JSON.parse(readFileSync(join(cwd, 'composer.json'), 'utf-8'));
318
+ const devDeps = composer.devDependencies || {};
319
+ if (devDeps.phpunit) {
320
+ return {
321
+ name: 'phpunit',
322
+ command: 'vendor/bin/phpunit',
323
+ coverageCommand: 'vendor/bin/phpunit --coverage-html coverage',
324
+ framework: 'php',
325
+ };
326
+ }
327
+ if (devDeps.behat) {
328
+ return {
329
+ name: 'behat',
330
+ command: 'vendor/bin/behat',
331
+ coverageCommand: 'vendor/bin/behat',
332
+ framework: 'php',
333
+ };
334
+ }
335
+ }
336
+ catch {
337
+ // Continue
338
+ }
339
+ }
340
+ // Default fallback based on detected package manager
341
+ const pm = detectPackageManager(cwd);
342
+ if (pm.name === 'cargo') {
343
+ return {
344
+ name: 'cargo test',
345
+ command: 'cargo test',
346
+ coverageCommand: 'cargo tarpaulin',
347
+ framework: 'rust',
348
+ };
349
+ }
350
+ if (pm.name === 'go') {
351
+ return {
352
+ name: 'go test',
353
+ command: 'go test ./...',
354
+ coverageCommand: 'go test -cover ./...',
355
+ framework: 'go',
356
+ };
357
+ }
358
+ // Default to jest for Node.js projects
359
+ return {
360
+ name: 'jest',
361
+ command: 'jest',
362
+ coverageCommand: 'jest --coverage',
363
+ framework: 'javascript',
364
+ };
365
+ }
366
+ // ── Build Tool Detection ───────────────────────────────────────────
367
+ /**
368
+ * Detects the build tool used in the project
369
+ */
370
+ export function detectBuildTool(cwd) {
371
+ const packageJsonPath = join(cwd, 'package.json');
372
+ const cargoPath = join(cwd, 'Cargo.toml');
373
+ const goPath = join(cwd, 'go.mod');
374
+ const makePath = join(cwd, 'Makefile');
375
+ const buildGradle = join(cwd, 'build.gradle');
376
+ const pomPath = join(cwd, 'pom.xml');
377
+ // JavaScript/TypeScript build tools
378
+ if (existsSync(packageJsonPath)) {
379
+ try {
380
+ const packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf-8'));
381
+ const deps = {
382
+ ...packageJson.dependencies,
383
+ ...packageJson.devDependencies,
384
+ };
385
+ // Check for vite
386
+ if (deps.vite) {
387
+ return {
388
+ name: 'vite',
389
+ command: 'vite build',
390
+ watchCommand: 'vite build --watch',
391
+ };
392
+ }
393
+ // Check for webpack
394
+ if (deps.webpack) {
395
+ return {
396
+ name: 'webpack',
397
+ command: 'webpack',
398
+ watchCommand: 'webpack --watch',
399
+ };
400
+ }
401
+ // Check for esbuild
402
+ if (deps.esbuild) {
403
+ return {
404
+ name: 'esbuild',
405
+ command: 'esbuild',
406
+ watchCommand: 'esbuild --watch',
407
+ };
408
+ }
409
+ // Check for tsup
410
+ if (deps.tsup) {
411
+ return {
412
+ name: 'tsup',
413
+ command: 'tsup',
414
+ watchCommand: 'tsup --watch',
415
+ };
416
+ }
417
+ // Check for rollup
418
+ if (deps.rollup) {
419
+ return {
420
+ name: 'rollup',
421
+ command: 'rollup -c',
422
+ watchCommand: 'rollup -c --watch',
423
+ };
424
+ }
425
+ // Check for parcel
426
+ if (deps.parcel) {
427
+ return {
428
+ name: 'parcel',
429
+ command: 'parcel build',
430
+ watchCommand: 'parcel',
431
+ };
432
+ }
433
+ // Check for tsc (TypeScript)
434
+ if (deps.typescript) {
435
+ return {
436
+ name: 'tsc',
437
+ command: 'tsc',
438
+ watchCommand: 'tsc --watch',
439
+ };
440
+ }
441
+ }
442
+ catch {
443
+ // Continue to next detection
444
+ }
445
+ }
446
+ // Check for config files
447
+ if (existsSync(join(cwd, 'vite.config.ts')) || existsSync(join(cwd, 'vite.config.js'))) {
448
+ return {
449
+ name: 'vite',
450
+ command: 'vite build',
451
+ watchCommand: 'vite build --watch',
452
+ };
453
+ }
454
+ if (existsSync(join(cwd, 'webpack.config.js')) || existsSync(join(cwd, 'webpack.config.ts'))) {
455
+ return {
456
+ name: 'webpack',
457
+ command: 'webpack',
458
+ watchCommand: 'webpack --watch',
459
+ };
460
+ }
461
+ if (existsSync(join(cwd, 'esbuild.js'))) {
462
+ return {
463
+ name: 'esbuild',
464
+ command: 'esbuild',
465
+ watchCommand: 'esbuild --watch',
466
+ };
467
+ }
468
+ if (existsSync(join(cwd, 'rollup.config.js')) || existsSync(join(cwd, 'rollup.config.ts'))) {
469
+ return {
470
+ name: 'rollup',
471
+ command: 'rollup -c',
472
+ watchCommand: 'rollup -c --watch',
473
+ };
474
+ }
475
+ if (existsSync(join(cwd, 'tsconfig.json'))) {
476
+ return {
477
+ name: 'tsc',
478
+ command: 'tsc',
479
+ watchCommand: 'tsc --watch',
480
+ };
481
+ }
482
+ // Rust build tool (cargo)
483
+ if (existsSync(cargoPath)) {
484
+ return {
485
+ name: 'cargo',
486
+ command: 'cargo build',
487
+ watchCommand: 'cargo watch -x build',
488
+ };
489
+ }
490
+ // Go build tool
491
+ if (existsSync(goPath)) {
492
+ return {
493
+ name: 'go build',
494
+ command: 'go build',
495
+ watchCommand: 'go build ./...',
496
+ };
497
+ }
498
+ // Make
499
+ if (existsSync(makePath)) {
500
+ return {
501
+ name: 'make',
502
+ command: 'make build',
503
+ watchCommand: 'make watch',
504
+ };
505
+ }
506
+ // Gradle (Java)
507
+ if (existsSync(buildGradle)) {
508
+ return {
509
+ name: 'gradle',
510
+ command: 'gradle build',
511
+ watchCommand: 'gradle build --continuous',
512
+ };
513
+ }
514
+ // Maven (Java)
515
+ if (existsSync(pomPath)) {
516
+ return {
517
+ name: 'maven',
518
+ command: 'mvn clean package',
519
+ watchCommand: 'mvn install -DskipTests',
520
+ };
521
+ }
522
+ // Default fallback
523
+ return {
524
+ name: 'tsc',
525
+ command: 'tsc',
526
+ watchCommand: 'tsc --watch',
527
+ };
528
+ }
529
+ //# sourceMappingURL=package-detect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package-detect.js","sourceRoot":"","sources":["../src/package-detect.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Permission system — controls tool execution based on permission mode.
3
+ *
4
+ * Three modes:
5
+ * - `yolo`: All tools allowed without prompting
6
+ * - `auto`: Read-only tools allowed; destructive tools require confirmation
7
+ * - `ask`: All non-read-only tools require confirmation
8
+ *
9
+ * Users can type "always" when prompted to upgrade to `auto` mode
10
+ * for the rest of the session (and persist to config).
11
+ */
12
+ import * as readline from 'node:readline/promises';
13
+ import type { Tool } from './tools/types.js';
14
+ import type { CrowcoderConfig } from './types.js';
15
+ /**
16
+ * Check if a tool call is allowed under the current permission mode.
17
+ * Returns true if allowed, false if denied.
18
+ *
19
+ * @param tool - The tool being invoked
20
+ * @param input - The tool's input arguments
21
+ * @param config - Current Crowcoder configuration (may be mutated if user types "always")
22
+ * @param rl - Readline interface for prompting the user
23
+ * @returns True if the tool call is allowed, false if denied
24
+ */
25
+ export declare function checkPermission(tool: Tool, input: Record<string, unknown>, config: CrowcoderConfig, rl: readline.Interface): Promise<boolean>;
@@ -0,0 +1,50 @@
1
+ import chalk from 'chalk';
2
+ import { saveConfig } from './config.js';
3
+ /**
4
+ * Check if a tool call is allowed under the current permission mode.
5
+ * Returns true if allowed, false if denied.
6
+ *
7
+ * @param tool - The tool being invoked
8
+ * @param input - The tool's input arguments
9
+ * @param config - Current Crowcoder configuration (may be mutated if user types "always")
10
+ * @param rl - Readline interface for prompting the user
11
+ * @returns True if the tool call is allowed, false if denied
12
+ */
13
+ export async function checkPermission(tool, input, config, rl) {
14
+ // yolo mode = everything allowed
15
+ if (config.permissionMode === 'yolo')
16
+ return true;
17
+ // Read-only tools always allowed
18
+ if (tool.isReadOnly)
19
+ return true;
20
+ // auto mode = allow non-destructive, ask for destructive
21
+ if (config.permissionMode === 'auto' && !tool.isDestructive)
22
+ return true;
23
+ // ask mode or destructive in auto mode → prompt user
24
+ const desc = formatToolCall(tool, input);
25
+ console.log(chalk.yellow(`\n⚡ Tool: ${tool.name}`));
26
+ console.log(chalk.dim(desc));
27
+ const answer = await rl.question(chalk.yellow('Allow? [Y/n/always] '));
28
+ const a = answer.trim().toLowerCase();
29
+ if (a === 'always') {
30
+ // Upgrade to auto for rest of session and save to disk
31
+ config.permissionMode = 'auto';
32
+ saveConfig(config);
33
+ console.log(chalk.dim(' (auto-approving safe operations for this session and future sessions)'));
34
+ return true;
35
+ }
36
+ return a === '' || a === 'y' || a === 'yes';
37
+ }
38
+ function formatToolCall(tool, input) {
39
+ switch (tool.name) {
40
+ case 'bash':
41
+ return ` $ ${input.command}`;
42
+ case 'write_file':
43
+ return ` Write to: ${input.file_path} (${(input.content || '').split('\n').length} lines)`;
44
+ case 'edit_file':
45
+ return ` Edit: ${input.file_path}`;
46
+ default:
47
+ return ` ${JSON.stringify(input).slice(0, 200)}`;
48
+ }
49
+ }
50
+ //# sourceMappingURL=permissions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"permissions.js","sourceRoot":"","sources":["../src/permissions.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,IAAU,EACV,KAA8B,EAC9B,MAAuB,EACvB,EAAsB;IAEtB,iCAAiC;IACjC,IAAI,MAAM,CAAC,cAAc,KAAK,MAAM;QAAE,OAAO,IAAI,CAAC;IAElD,iCAAiC;IACjC,IAAI,IAAI,CAAC,UAAU;QAAE,OAAO,IAAI,CAAC;IAEjC,yDAAyD;IACzD,IAAI,MAAM,CAAC,cAAc,KAAK,MAAM,IAAI,CAAC,IAAI,CAAC,aAAa;QAAE,OAAO,IAAI,CAAC;IAEzE,qDAAqD;IACrD,MAAM,IAAI,GAAG,cAAc,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACzC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,aAAa,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IACpD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;IAE7B,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,sBAAsB,CAAC,CAAC,CAAC;IACvE,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAEtC,IAAI,CAAC,KAAK,QAAQ,EAAE,CAAC;QACnB,uDAAuD;QACvD,MAAM,CAAC,cAAc,GAAG,MAAM,CAAC;QAC/B,UAAU,CAAC,MAAM,CAAC,CAAC;QACnB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,yEAAyE,CAAC,CAAC,CAAC;QAClG,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,KAAK,CAAC;AAC9C,CAAC;AAED,SAAS,cAAc,CAAC,IAAU,EAAE,KAA8B;IAChE,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;QAClB,KAAK,MAAM;YACT,OAAO,OAAO,KAAK,CAAC,OAAO,EAAE,CAAC;QAChC,KAAK,YAAY;YACf,OAAO,eAAe,KAAK,CAAC,SAAS,KAAK,CAAE,KAAK,CAAC,OAAkB,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,SAAS,CAAC;QAC1G,KAAK,WAAW;YACd,OAAO,WAAW,KAAK,CAAC,SAAS,EAAE,CAAC;QACtC;YACE,OAAO,KAAK,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;IACtD,CAAC;AACH,CAAC"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * PM2 Service Lifecycle Management
3
+ * Utilities for managing background services with PM2.
4
+ */
5
+ export interface ServiceConfig {
6
+ name: string;
7
+ script: string;
8
+ cwd: string;
9
+ env?: Record<string, string>;
10
+ instances?: number;
11
+ maxMemory?: string;
12
+ }
13
+ /**
14
+ * Build a prompt for Claude to help with PM2 lifecycle management.
15
+ * @param action - The PM2 action (start, stop, restart, delete, logs, status, scale)
16
+ * @returns A prompt describing what PM2 actions are available
17
+ */
18
+ export declare function buildPM2Prompt(action: string): string;
19
+ /**
20
+ * Check if PM2 is installed and available.
21
+ * @returns true if pm2 command is available, false otherwise
22
+ */
23
+ export declare function isPM2Available(): boolean;
24
+ /**
25
+ * List all PM2 services and return the formatted output.
26
+ * @param cwd - Working directory to run the command in
27
+ * @returns PM2 list output as a string
28
+ */
29
+ export declare function listPM2Services(cwd: string): string;
30
+ /**
31
+ * Build a prompt for creating a PM2 ecosystem configuration file.
32
+ * @param cwd - Working directory where the ecosystem file will be created
33
+ * @returns A prompt with guidance on creating ecosystem.config.js
34
+ */
35
+ export declare function buildEcosystemPrompt(cwd: string): string;
36
+ /**
37
+ * Pretty-print PM2 status output with colored formatting.
38
+ * @param output - Raw PM2 list output
39
+ */
40
+ export declare function printPM2Status(output: string): void;