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 @@
1
+ {"version":3,"file":"rules.js","sourceRoot":"","sources":["../src/rules.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Schema definitions for persistent data stores.
3
+ *
4
+ * Each store is a JSON file under ~/.crowcoder/.
5
+ * Schema versions are tracked to support future migrations.
6
+ */
7
+ export declare const USERS_TABLE_VERSION = 1;
8
+ export interface UserRow {
9
+ id: string;
10
+ name: string;
11
+ email?: string;
12
+ role?: string;
13
+ active: boolean;
14
+ createdAt: string;
15
+ updatedAt: string;
16
+ metadata: Record<string, string>;
17
+ }
18
+ export interface UsersTable {
19
+ version: number;
20
+ users: UserRow[];
21
+ activeUserId: string | null;
22
+ }
23
+ export declare function createEmptyUsersTable(): UsersTable;
package/dist/schema.js ADDED
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Schema definitions for persistent data stores.
3
+ *
4
+ * Each store is a JSON file under ~/.crowcoder/.
5
+ * Schema versions are tracked to support future migrations.
6
+ */
7
+ // ── Users Table ──────────────────────────────────────────
8
+ export const USERS_TABLE_VERSION = 1;
9
+ export function createEmptyUsersTable() {
10
+ return { version: USERS_TABLE_VERSION, users: [], activeUserId: null };
11
+ }
12
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,4DAA4D;AAE5D,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC;AAmBrC,MAAM,UAAU,qBAAqB;IACnC,OAAO,EAAE,OAAO,EAAE,mBAAmB,EAAE,KAAK,EAAE,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC;AACzE,CAAC"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Search-First Workflow — Research before implementation.
3
+ * Builds prompts that force the AI to understand existing code patterns
4
+ * before proposing new implementations.
5
+ */
6
+ /**
7
+ * Build a prompt that tells the AI to research existing code first
8
+ */
9
+ export declare function buildSearchFirstPrompt(task: string, cwd: string): string;
10
+ /**
11
+ * Build a prompt for looking up documentation
12
+ */
13
+ export declare function buildDocsLookupPrompt(query: string, cwd: string): string;
14
+ /**
15
+ * Print a summary of the research workflow
16
+ */
17
+ export declare function printSearchFirstSummary(): void;
@@ -0,0 +1,301 @@
1
+ /**
2
+ * Search-First Workflow — Research before implementation.
3
+ * Builds prompts that force the AI to understand existing code patterns
4
+ * before proposing new implementations.
5
+ */
6
+ import { execSync } from 'node:child_process';
7
+ import { existsSync, readFileSync, readdirSync } from 'node:fs';
8
+ import { join } from 'node:path';
9
+ import chalk from 'chalk';
10
+ /**
11
+ * Escape special regex characters for safe usage in grep patterns
12
+ */
13
+ function escapeRegex(str) {
14
+ return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
15
+ }
16
+ /**
17
+ * Safely run grep without throwing errors
18
+ */
19
+ function safeGrep(pattern, path, filePattern = '*.ts') {
20
+ try {
21
+ const escaped = escapeRegex(pattern);
22
+ const result = execSync(`grep -r "${escaped}" "${path}" --include="${filePattern}" 2>/dev/null || echo ""`, {
23
+ encoding: 'utf-8',
24
+ cwd: path,
25
+ timeout: 10_000,
26
+ });
27
+ return result
28
+ .split('\n')
29
+ .filter((line) => line.trim())
30
+ .slice(0, 20); // Limit to first 20 matches
31
+ }
32
+ catch {
33
+ return [];
34
+ }
35
+ }
36
+ /**
37
+ * Find relevant files based on keywords
38
+ */
39
+ function findRelevantFiles(keyword, cwd) {
40
+ try {
41
+ const result = execSync(`find "${cwd}/src" -name "*.ts" -type f 2>/dev/null | head -30`, { encoding: 'utf-8', timeout: 5_000 });
42
+ const files = result
43
+ .split('\n')
44
+ .filter((f) => f.trim())
45
+ .map((f) => f.replace(cwd + '/', ''));
46
+ // Filter by keyword relevance
47
+ return files.filter((f) => f.toLowerCase().includes(keyword.toLowerCase()) ||
48
+ f.includes('types') ||
49
+ f.includes('index'));
50
+ }
51
+ catch {
52
+ return [];
53
+ }
54
+ }
55
+ /**
56
+ * Read and summarize a file's key exports and patterns
57
+ */
58
+ function summarizeFile(filePath, cwd) {
59
+ try {
60
+ const fullPath = join(cwd, filePath);
61
+ if (!existsSync(fullPath))
62
+ return '';
63
+ const content = readFileSync(fullPath, 'utf-8');
64
+ const lines = content.split('\n');
65
+ // Extract exports
66
+ const exports = lines
67
+ .filter((l) => l.includes('export '))
68
+ .slice(0, 10)
69
+ .map((l) => l.trim());
70
+ // Extract imports
71
+ const imports = lines
72
+ .filter((l) => l.includes('import '))
73
+ .slice(0, 5)
74
+ .map((l) => l.trim());
75
+ // Extract top-level function/class names
76
+ const definitions = lines
77
+ .filter((l) => /^(export\s+)?(function|class|interface|type|const)\s+\w+/.test(l))
78
+ .slice(0, 8)
79
+ .map((l) => l.trim());
80
+ let summary = `\n### ${filePath}\n`;
81
+ if (definitions.length > 0) {
82
+ summary += `**Definitions:**\n${definitions.map((d) => `- ${d}`).join('\n')}\n`;
83
+ }
84
+ if (exports.length > 0) {
85
+ summary += `**Key exports:**\n${exports.map((e) => `- ${e}`).join('\n')}\n`;
86
+ }
87
+ return summary;
88
+ }
89
+ catch {
90
+ return '';
91
+ }
92
+ }
93
+ /**
94
+ * Find documentation files (README, docs/, comments in code)
95
+ */
96
+ function findDocs(cwd) {
97
+ const docFiles = [];
98
+ // Check for README
99
+ const readmeFiles = ['README.md', 'readme.md', 'docs/README.md'];
100
+ for (const f of readmeFiles) {
101
+ if (existsSync(join(cwd, f))) {
102
+ docFiles.push(f);
103
+ }
104
+ }
105
+ // Check for docs directory
106
+ const docsDir = join(cwd, 'docs');
107
+ if (existsSync(docsDir)) {
108
+ try {
109
+ const files = readdirSync(docsDir);
110
+ docFiles.push(...files.filter((f) => f.endsWith('.md')).map((f) => `docs/${f}`));
111
+ }
112
+ catch {
113
+ // Ignore errors
114
+ }
115
+ }
116
+ // Check for src/docs
117
+ const srcDocsDir = join(cwd, 'src', 'docs');
118
+ if (existsSync(srcDocsDir)) {
119
+ try {
120
+ const files = readdirSync(srcDocsDir);
121
+ docFiles.push(...files.filter((f) => f.endsWith('.md')).map((f) => `src/docs/${f}`));
122
+ }
123
+ catch {
124
+ // Ignore errors
125
+ }
126
+ }
127
+ return docFiles.slice(0, 10); // Limit to 10 docs
128
+ }
129
+ /**
130
+ * Extract JSDoc comments from a file
131
+ */
132
+ function extractJSDoc(filePath, cwd) {
133
+ try {
134
+ const fullPath = join(cwd, filePath);
135
+ if (!existsSync(fullPath))
136
+ return [];
137
+ const content = readFileSync(fullPath, 'utf-8');
138
+ const jsdocs = [];
139
+ const lines = content.split('\n');
140
+ for (let i = 0; i < lines.length; i++) {
141
+ if (lines[i].includes('/**')) {
142
+ let doc = '';
143
+ for (let j = i; j < Math.min(i + 10, lines.length); j++) {
144
+ doc += lines[j] + '\n';
145
+ if (lines[j].includes('*/')) {
146
+ jsdocs.push(doc);
147
+ break;
148
+ }
149
+ }
150
+ }
151
+ }
152
+ return jsdocs.slice(0, 5);
153
+ }
154
+ catch {
155
+ return [];
156
+ }
157
+ }
158
+ /**
159
+ * Build a prompt that tells the AI to research existing code first
160
+ */
161
+ export function buildSearchFirstPrompt(task, cwd) {
162
+ const keyword = task.split(/\s+/)[0]; // Extract first word as search term
163
+ const relevantFiles = findRelevantFiles(keyword, cwd);
164
+ const relatedGreps = safeGrep(keyword, join(cwd, 'src'), '*.ts');
165
+ let research = '';
166
+ // Relevant file summaries
167
+ if (relevantFiles.length > 0) {
168
+ research += `\n## Relevant Existing Code\n`;
169
+ for (const file of relevantFiles.slice(0, 5)) {
170
+ research += summarizeFile(file, cwd);
171
+ }
172
+ }
173
+ // Pattern matches
174
+ if (relatedGreps.length > 0) {
175
+ research += `\n## Related Code Patterns\n`;
176
+ research += 'Found these related patterns in the codebase:\n';
177
+ research += relatedGreps.map((g) => `\`\`\`\n${g}\n\`\`\``).join('\n');
178
+ }
179
+ return `# Research-First Implementation
180
+
181
+ ## Task
182
+ ${task}
183
+
184
+ ## Before Writing Code: Research Phase
185
+
186
+ Please follow this approach:
187
+
188
+ 1. **Analyze existing patterns** in the codebase
189
+ - Look at similar functions and modules
190
+ - Understand how the project structures code
191
+ - Check for established patterns we should follow
192
+
193
+ 2. **Review documentation and comments**
194
+ - Check relevant files for JSDoc and inline comments
195
+ - Look for design patterns in existing implementations
196
+ - Understand architectural decisions
197
+
198
+ 3. **Identify applicable patterns**
199
+ - What patterns from existing code apply here?
200
+ - Are there similar functions we should model after?
201
+ - What conventions does this project follow?
202
+
203
+ 4. **Reference existing code in your proposal**
204
+ - When proposing a solution, reference the existing code that informed it
205
+ - Explain how your implementation follows established patterns
206
+ - Point out if you're introducing a new pattern and why
207
+
208
+ ## Current Codebase Research
209
+ ${research || '(Run research to populate this section)'}
210
+
211
+ ## Implementation Guidelines
212
+ - Follow the style and patterns of existing code
213
+ - Use the same import structure and module organization
214
+ - Match the error handling approach used elsewhere
215
+ - Maintain consistency with project conventions
216
+ - Reference specific files and functions that informed the design
217
+
218
+ Now, please implement the task, but start by analyzing the codebase and then proposing your solution.`;
219
+ }
220
+ /**
221
+ * Build a prompt for looking up documentation
222
+ */
223
+ export function buildDocsLookupPrompt(query, cwd) {
224
+ const docFiles = findDocs(cwd);
225
+ const grepResults = safeGrep(query, join(cwd, 'src'), '*.ts');
226
+ let docsContent = '';
227
+ // Read doc files
228
+ if (docFiles.length > 0) {
229
+ docsContent += `\n## Documentation Files Found\n`;
230
+ for (const docFile of docFiles) {
231
+ const fullPath = join(cwd, docFile);
232
+ if (existsSync(fullPath)) {
233
+ try {
234
+ const content = readFileSync(fullPath, 'utf-8');
235
+ docsContent += `\n### ${docFile}\n\`\`\`\n${content.slice(0, 1000)}\n\`\`\`\n`;
236
+ }
237
+ catch {
238
+ docsContent += `\n### ${docFile} (could not read)\n`;
239
+ }
240
+ }
241
+ }
242
+ }
243
+ // JSDoc from relevant files
244
+ if (grepResults.length > 0) {
245
+ const srcFiles = findRelevantFiles(query, cwd).slice(0, 3);
246
+ docsContent += `\n## Code Documentation & Comments\n`;
247
+ for (const file of srcFiles) {
248
+ const jsDoc = extractJSDoc(file, cwd);
249
+ if (jsDoc.length > 0) {
250
+ docsContent += `\n### ${file}\n`;
251
+ docsContent += jsDoc.map((doc) => `\`\`\`typescript\n${doc}\n\`\`\``).join('\n');
252
+ }
253
+ }
254
+ }
255
+ return `# Documentation Lookup
256
+
257
+ ## Query
258
+ ${query}
259
+
260
+ ## Research Results
261
+
262
+ ### Step 1: Local Documentation
263
+ - Searched docs/ directory
264
+ - Searched README files
265
+ - Searched for configuration files
266
+
267
+ ### Step 2: Code Comments & JSDoc
268
+ - Extracted JSDoc from relevant files
269
+ - Found inline documentation
270
+ - Checked for examples in tests
271
+
272
+ ${docsContent || '(No documentation found - searching code patterns instead)'}
273
+
274
+ ### Step 3: Code Patterns
275
+ ${grepResults.length > 0
276
+ ? 'Found these implementations:\n' +
277
+ grepResults.slice(0, 10).map((g) => `- ${g}`).join('\n')
278
+ : 'No specific patterns found'}
279
+
280
+ ## Summary
281
+ Based on the documentation and code patterns found, here are the key findings:
282
+
283
+ 1. **Documentation**: ${docFiles.length > 0 ? `Found ${docFiles.length} documentation files` : 'Limited documentation'}
284
+ 2. **Code Examples**: ${grepResults.length > 0 ? `Found ${grepResults.length} related code snippets` : 'No examples'}
285
+ 3. **Related Files**: ${findRelevantFiles(query, cwd).length} relevant source files
286
+
287
+ Please use these findings to answer the query.`;
288
+ }
289
+ /**
290
+ * Print a summary of the research workflow
291
+ */
292
+ export function printSearchFirstSummary() {
293
+ console.log(chalk.cyan('\n📚 Search-First Workflow'));
294
+ console.log(chalk.gray('Research existing code before implementation\n'));
295
+ console.log(chalk.blue('Available prompts:'));
296
+ console.log(chalk.gray(' buildSearchFirstPrompt(task, cwd)'));
297
+ console.log(chalk.gray(' → Forces research phase before coding'));
298
+ console.log(chalk.gray(' buildDocsLookupPrompt(query, cwd)'));
299
+ console.log(chalk.gray(' → Looks up relevant documentation & patterns\n'));
300
+ }
301
+ //# sourceMappingURL=search-first.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-first.js","sourceRoot":"","sources":["../src/search-first.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ export type ThreatLevel = 'critical' | 'high' | 'medium' | 'low' | 'safe';
2
+ export interface SecurityScanResult {
3
+ level: ThreatLevel;
4
+ threats: string[];
5
+ blocked: boolean;
6
+ }
7
+ export declare function scanCommand(command: string): SecurityScanResult;
8
+ export declare function scanContent(content: string): SecurityScanResult;
9
+ export declare function scanToolCall(toolName: string, input: Record<string, unknown>): SecurityScanResult;
10
+ export declare function printSecurityWarning(result: SecurityScanResult): void;
@@ -0,0 +1,145 @@
1
+ /**
2
+ * Security scanner — detect dangerous commands, secrets, and risky operations.
3
+ * Runs before tool execution to catch threats.
4
+ */
5
+ import chalk from 'chalk';
6
+ // ── Dangerous command patterns ────────────────────────────
7
+ const DANGEROUS_COMMANDS = [
8
+ // Destructive filesystem
9
+ { pattern: /\brm\s+(-[a-zA-Z]*f[a-zA-Z]*\s+|--force\s+).*(\*|\/|\~)/i, level: 'critical', description: 'Recursive force delete with wildcard/root path' },
10
+ { pattern: /\brm\s+-[a-zA-Z]*r[a-zA-Z]*f/i, level: 'critical', description: 'rm -rf detected' },
11
+ { pattern: /\brmdir\s+\/s\s+\/q/i, level: 'critical', description: 'Windows recursive delete' },
12
+ { pattern: /\bformat\s+[a-zA-Z]:/i, level: 'critical', description: 'Disk format command' },
13
+ { pattern: /\bmkfs\b/i, level: 'critical', description: 'Filesystem format command' },
14
+ { pattern: />\s*\/dev\/sda/i, level: 'critical', description: 'Direct write to disk device' },
15
+ { pattern: /\bdd\s+.*of=\/dev\//i, level: 'critical', description: 'dd write to device' },
16
+ // Destructive git
17
+ { pattern: /\bgit\s+push\s+.*--force/i, level: 'high', description: 'Git force push' },
18
+ { pattern: /\bgit\s+push\s+-f\b/i, level: 'high', description: 'Git force push (-f)' },
19
+ { pattern: /\bgit\s+reset\s+--hard/i, level: 'high', description: 'Git hard reset (destroys uncommitted changes)' },
20
+ { pattern: /\bgit\s+clean\s+-[a-zA-Z]*f/i, level: 'high', description: 'Git clean -f (deletes untracked files)' },
21
+ { pattern: /\bgit\s+checkout\s+--\s+\./i, level: 'high', description: 'Git checkout -- . (discard all changes)' },
22
+ { pattern: /\bgit\s+branch\s+-D/i, level: 'medium', description: 'Force delete git branch' },
23
+ // Database destruction
24
+ { pattern: /\bDROP\s+(TABLE|DATABASE|SCHEMA)\b/i, level: 'critical', description: 'SQL DROP statement' },
25
+ { pattern: /\bTRUNCATE\s+TABLE\b/i, level: 'high', description: 'SQL TRUNCATE table' },
26
+ { pattern: /\bDELETE\s+FROM\s+\w+\s*(;|$)/i, level: 'high', description: 'DELETE without WHERE clause' },
27
+ { pattern: /\bALTER\s+TABLE\s+.*DROP\s+COLUMN/i, level: 'medium', description: 'Drop column from table' },
28
+ // System/privilege escalation
29
+ { pattern: /\bchmod\s+777\b/i, level: 'high', description: 'chmod 777 (world-writable)' },
30
+ { pattern: /\bchmod\s+.*\+s\b/i, level: 'high', description: 'Set SUID/SGID bit' },
31
+ { pattern: /\bcurl\s+.*\|\s*(sudo\s+)?bash/i, level: 'critical', description: 'Pipe curl to bash (remote code execution)' },
32
+ { pattern: /\bwget\s+.*\|\s*(sudo\s+)?bash/i, level: 'critical', description: 'Pipe wget to bash (remote code execution)' },
33
+ { pattern: /\beval\s*\(/i, level: 'medium', description: 'eval() usage (code injection risk)' },
34
+ // Process/network
35
+ { pattern: /\bkill\s+-9\s+1\b/i, level: 'critical', description: 'Kill init process' },
36
+ { pattern: /\bkillall\b/i, level: 'medium', description: 'Kill all processes by name' },
37
+ { pattern: /\b:(){ :|:& };:/i, level: 'critical', description: 'Fork bomb detected' },
38
+ // Environment/config destruction
39
+ { pattern: /\bunset\s+(PATH|HOME|USER)\b/i, level: 'high', description: 'Unsetting critical env var' },
40
+ { pattern: /\bexport\s+PATH\s*=\s*$/i, level: 'high', description: 'Clearing PATH variable' },
41
+ // Crypto/ransomware patterns
42
+ { pattern: /\bopenssl\s+enc\s+.*-aes/i, level: 'medium', description: 'File encryption command' },
43
+ { pattern: /\bgpg\s+.*--encrypt\b/i, level: 'low', description: 'GPG encryption' },
44
+ ];
45
+ // ── Secret patterns ───────────────────────────────────────
46
+ const SECRET_PATTERNS = [
47
+ { pattern: /(?:api[_-]?key|apikey)\s*[:=]\s*['"][a-zA-Z0-9_\-]{20,}/i, description: 'API key detected' },
48
+ { pattern: /(?:secret|token|password|passwd|pwd)\s*[:=]\s*['"][^'"]{8,}/i, description: 'Secret/password in code' },
49
+ { pattern: /(?:aws_access_key_id|aws_secret_access_key)\s*[:=]/i, description: 'AWS credentials' },
50
+ { pattern: /(?:AKIA|ASIA)[A-Z0-9]{16}/i, description: 'AWS access key ID' },
51
+ { pattern: /-----BEGIN\s+(RSA |DSA |EC )?PRIVATE KEY-----/i, description: 'Private key detected' },
52
+ { pattern: /ghp_[a-zA-Z0-9]{36}/i, description: 'GitHub personal access token' },
53
+ { pattern: /sk-[a-zA-Z0-9]{40,}/i, description: 'OpenAI/Stripe secret key' },
54
+ { pattern: /xox[bpoas]-[a-zA-Z0-9\-]+/i, description: 'Slack token' },
55
+ { pattern: /eyJ[a-zA-Z0-9_-]{10,}\.[a-zA-Z0-9_-]{10,}/i, description: 'JWT token' },
56
+ ];
57
+ export function scanCommand(command) {
58
+ const threats = [];
59
+ let maxLevel = 'safe';
60
+ for (const rule of DANGEROUS_COMMANDS) {
61
+ if (rule.pattern.test(command)) {
62
+ threats.push(`[${rule.level.toUpperCase()}] ${rule.description}`);
63
+ if (severityRank(rule.level) > severityRank(maxLevel)) {
64
+ maxLevel = rule.level;
65
+ }
66
+ }
67
+ }
68
+ return {
69
+ level: maxLevel,
70
+ threats,
71
+ blocked: maxLevel === 'critical',
72
+ };
73
+ }
74
+ export function scanContent(content) {
75
+ const threats = [];
76
+ let maxLevel = 'safe';
77
+ for (const rule of SECRET_PATTERNS) {
78
+ if (rule.pattern.test(content)) {
79
+ threats.push(`[SECRET] ${rule.description}`);
80
+ if (severityRank('high') > severityRank(maxLevel)) {
81
+ maxLevel = 'high';
82
+ }
83
+ }
84
+ }
85
+ return {
86
+ level: maxLevel,
87
+ threats,
88
+ blocked: false,
89
+ };
90
+ }
91
+ export function scanToolCall(toolName, input) {
92
+ const allThreats = [];
93
+ let maxLevel = 'safe';
94
+ // Scan bash commands
95
+ if (toolName === 'bash' && typeof input.command === 'string') {
96
+ const cmdScan = scanCommand(input.command);
97
+ allThreats.push(...cmdScan.threats);
98
+ if (severityRank(cmdScan.level) > severityRank(maxLevel))
99
+ maxLevel = cmdScan.level;
100
+ }
101
+ // Scan file content for secrets
102
+ if (toolName === 'write_file' && typeof input.content === 'string') {
103
+ const contentScan = scanContent(input.content);
104
+ allThreats.push(...contentScan.threats);
105
+ if (severityRank(contentScan.level) > severityRank(maxLevel))
106
+ maxLevel = contentScan.level;
107
+ }
108
+ // Scan file paths for sensitive locations
109
+ const filePath = input.file_path;
110
+ if (filePath) {
111
+ if (/\.(env|pem|key|p12|pfx)$/i.test(filePath)) {
112
+ allThreats.push('[MEDIUM] Accessing sensitive file type');
113
+ if (severityRank('medium') > severityRank(maxLevel))
114
+ maxLevel = 'medium';
115
+ }
116
+ if (/\/etc\/(passwd|shadow|sudoers)/i.test(filePath)) {
117
+ allThreats.push('[HIGH] Accessing system security file');
118
+ if (severityRank('high') > severityRank(maxLevel))
119
+ maxLevel = 'high';
120
+ }
121
+ }
122
+ return { level: maxLevel, threats: allThreats, blocked: maxLevel === 'critical' };
123
+ }
124
+ export function printSecurityWarning(result) {
125
+ if (result.threats.length === 0)
126
+ return;
127
+ const levelColor = {
128
+ critical: chalk.bgRed.white.bold,
129
+ high: chalk.red.bold,
130
+ medium: chalk.yellow,
131
+ low: chalk.dim,
132
+ safe: chalk.green,
133
+ };
134
+ console.log(levelColor[result.level](` ⚠ Security: ${result.level.toUpperCase()}`));
135
+ for (const t of result.threats) {
136
+ console.log(chalk.yellow(` ${t}`));
137
+ }
138
+ if (result.blocked) {
139
+ console.log(chalk.bgRed.white(' BLOCKED — this operation was prevented.'));
140
+ }
141
+ }
142
+ function severityRank(level) {
143
+ return { safe: 0, low: 1, medium: 2, high: 3, critical: 4 }[level];
144
+ }
145
+ //# sourceMappingURL=security.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"security.js","sourceRoot":"","sources":["../src/security.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import type { Message } from './types.js';
2
+ export interface Session {
3
+ id: string;
4
+ name: string;
5
+ cwd: string;
6
+ model: string;
7
+ provider: string;
8
+ messages: Message[];
9
+ createdAt: string;
10
+ updatedAt: string;
11
+ tokenCount: number;
12
+ turnCount: number;
13
+ mode: string;
14
+ }
15
+ export declare function generateSessionId(): string;
16
+ export declare function saveSession(session: Session): Promise<void>;
17
+ export declare function loadSession(id: string): Session | null;
18
+ export declare function listSessions(): Pick<Session, 'id' | 'name' | 'cwd' | 'model' | 'createdAt' | 'updatedAt' | 'turnCount'>[];
19
+ export declare function deleteSession(id: string): boolean;
20
+ export declare function createSession(cwd: string, model: string, provider: string, mode: string): Session;
21
+ export declare function autoSave(session: Session, messages: Message[]): Promise<void>;