agcel 1.0.4 → 2.0.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 (293) hide show
  1. package/README.md +40 -47
  2. package/dist/cli/commands/create.d.ts +4 -0
  3. package/dist/cli/commands/create.d.ts.map +1 -0
  4. package/dist/cli/commands/create.js +68 -0
  5. package/dist/cli/commands/create.js.map +1 -0
  6. package/dist/cli/commands/init.d.ts +3 -0
  7. package/dist/cli/commands/init.d.ts.map +1 -0
  8. package/dist/cli/commands/init.js +98 -0
  9. package/dist/cli/commands/init.js.map +1 -0
  10. package/dist/cli/commands/install.d.ts +3 -0
  11. package/dist/cli/commands/install.d.ts.map +1 -0
  12. package/dist/cli/commands/install.helpers.d.ts +15 -0
  13. package/dist/cli/commands/install.helpers.d.ts.map +1 -0
  14. package/dist/cli/commands/install.helpers.js +47 -0
  15. package/dist/cli/commands/install.helpers.js.map +1 -0
  16. package/dist/cli/commands/install.helpers.test.d.ts +2 -0
  17. package/dist/cli/commands/install.helpers.test.d.ts.map +1 -0
  18. package/dist/cli/commands/install.helpers.test.js +18 -0
  19. package/dist/cli/commands/install.helpers.test.js.map +1 -0
  20. package/dist/cli/commands/install.js +74 -0
  21. package/dist/cli/commands/install.js.map +1 -0
  22. package/dist/cli/commands/pulse.d.ts +4 -0
  23. package/dist/cli/commands/pulse.d.ts.map +1 -0
  24. package/dist/cli/commands/pulse.js +48 -0
  25. package/dist/cli/commands/pulse.js.map +1 -0
  26. package/dist/cli/commands/pulse.test.d.ts +2 -0
  27. package/dist/cli/commands/pulse.test.d.ts.map +1 -0
  28. package/dist/cli/commands/pulse.test.js +19 -0
  29. package/dist/cli/commands/pulse.test.js.map +1 -0
  30. package/dist/cli/commands/suggest.d.ts +3 -0
  31. package/dist/cli/commands/suggest.d.ts.map +1 -0
  32. package/dist/cli/commands/suggest.js +32 -0
  33. package/dist/cli/commands/suggest.js.map +1 -0
  34. package/dist/cli/index.d.ts +3 -0
  35. package/dist/cli/index.d.ts.map +1 -0
  36. package/dist/cli/index.js +20 -0
  37. package/dist/cli/index.js.map +1 -0
  38. package/dist/cli/research-hints.d.ts +5 -0
  39. package/dist/cli/research-hints.d.ts.map +1 -0
  40. package/dist/cli/research-hints.js +109 -0
  41. package/dist/cli/research-hints.js.map +1 -0
  42. package/dist/cli/research-hints.test.d.ts +2 -0
  43. package/dist/cli/research-hints.test.d.ts.map +1 -0
  44. package/dist/cli/research-hints.test.js +50 -0
  45. package/dist/cli/research-hints.test.js.map +1 -0
  46. package/dist/core/agcel-config.d.ts +27 -0
  47. package/dist/core/agcel-config.d.ts.map +1 -0
  48. package/dist/core/agcel-config.js +4 -0
  49. package/dist/core/agcel-config.js.map +1 -0
  50. package/dist/core/build-rag-engine.d.ts +12 -0
  51. package/dist/core/build-rag-engine.d.ts.map +1 -0
  52. package/dist/core/build-rag-engine.js +24 -0
  53. package/dist/core/build-rag-engine.js.map +1 -0
  54. package/dist/core/build-rag-engine.test.d.ts +2 -0
  55. package/dist/core/build-rag-engine.test.d.ts.map +1 -0
  56. package/dist/core/build-rag-engine.test.js +34 -0
  57. package/dist/core/build-rag-engine.test.js.map +1 -0
  58. package/dist/core/chroma-rag.d.ts +20 -0
  59. package/dist/core/chroma-rag.d.ts.map +1 -0
  60. package/dist/core/chroma-rag.js +108 -0
  61. package/dist/core/chroma-rag.js.map +1 -0
  62. package/dist/core/context-hygiene.d.ts +12 -0
  63. package/dist/core/context-hygiene.d.ts.map +1 -0
  64. package/dist/core/context-hygiene.js +43 -0
  65. package/dist/core/context-hygiene.js.map +1 -0
  66. package/dist/core/context-hygiene.test.d.ts +2 -0
  67. package/dist/core/context-hygiene.test.d.ts.map +1 -0
  68. package/dist/core/context-hygiene.test.js +18 -0
  69. package/dist/core/context-hygiene.test.js.map +1 -0
  70. package/dist/core/context.d.ts +44 -0
  71. package/dist/core/context.d.ts.map +1 -0
  72. package/dist/core/context.js +114 -0
  73. package/dist/core/context.js.map +1 -0
  74. package/dist/core/conversation-routing.d.ts +10 -0
  75. package/dist/core/conversation-routing.d.ts.map +1 -0
  76. package/dist/core/conversation-routing.js +27 -0
  77. package/dist/core/conversation-routing.js.map +1 -0
  78. package/dist/core/conversation-routing.test.d.ts +2 -0
  79. package/dist/core/conversation-routing.test.d.ts.map +1 -0
  80. package/dist/core/conversation-routing.test.js +29 -0
  81. package/dist/core/conversation-routing.test.js.map +1 -0
  82. package/dist/core/guardrails.d.ts +26 -0
  83. package/dist/core/guardrails.d.ts.map +1 -0
  84. package/dist/core/guardrails.js +76 -0
  85. package/dist/core/guardrails.js.map +1 -0
  86. package/dist/core/guardrails.test.d.ts +2 -0
  87. package/dist/core/guardrails.test.d.ts.map +1 -0
  88. package/dist/core/guardrails.test.js +35 -0
  89. package/dist/core/guardrails.test.js.map +1 -0
  90. package/dist/core/intent.d.ts +22 -0
  91. package/dist/core/intent.d.ts.map +1 -0
  92. package/dist/core/intent.js +79 -0
  93. package/dist/core/intent.js.map +1 -0
  94. package/dist/core/intent.test.d.ts +2 -0
  95. package/dist/core/intent.test.d.ts.map +1 -0
  96. package/dist/core/intent.test.js +43 -0
  97. package/dist/core/intent.test.js.map +1 -0
  98. package/dist/core/local-rag.d.ts +17 -0
  99. package/dist/core/local-rag.d.ts.map +1 -0
  100. package/dist/core/local-rag.js +74 -0
  101. package/dist/core/local-rag.js.map +1 -0
  102. package/dist/core/local-rag.test.d.ts +2 -0
  103. package/dist/core/local-rag.test.d.ts.map +1 -0
  104. package/dist/core/local-rag.test.js +47 -0
  105. package/dist/core/local-rag.test.js.map +1 -0
  106. package/dist/core/orchestrator.d.ts +47 -0
  107. package/dist/core/orchestrator.d.ts.map +1 -0
  108. package/dist/core/orchestrator.js +138 -0
  109. package/dist/core/orchestrator.js.map +1 -0
  110. package/dist/core/orchestrator.test.d.ts +2 -0
  111. package/dist/core/orchestrator.test.d.ts.map +1 -0
  112. package/dist/core/orchestrator.test.js +118 -0
  113. package/dist/core/orchestrator.test.js.map +1 -0
  114. package/dist/core/pulse.d.ts +13 -0
  115. package/dist/core/pulse.d.ts.map +1 -0
  116. package/dist/core/pulse.js +29 -0
  117. package/dist/core/pulse.js.map +1 -0
  118. package/dist/core/pulse.test.d.ts +2 -0
  119. package/dist/core/pulse.test.d.ts.map +1 -0
  120. package/dist/core/pulse.test.js +18 -0
  121. package/dist/core/pulse.test.js.map +1 -0
  122. package/dist/core/rag-metadata.d.ts +5 -0
  123. package/dist/core/rag-metadata.d.ts.map +1 -0
  124. package/dist/core/rag-metadata.js +13 -0
  125. package/dist/core/rag-metadata.js.map +1 -0
  126. package/dist/core/rag-metadata.test.d.ts +2 -0
  127. package/dist/core/rag-metadata.test.d.ts.map +1 -0
  128. package/dist/core/rag-metadata.test.js +12 -0
  129. package/dist/core/rag-metadata.test.js.map +1 -0
  130. package/dist/core/rag-types.d.ts +18 -0
  131. package/dist/core/rag-types.d.ts.map +1 -0
  132. package/dist/core/rag-types.js +2 -0
  133. package/dist/core/rag-types.js.map +1 -0
  134. package/dist/core/read-agcel-config.d.ts +3 -0
  135. package/dist/core/read-agcel-config.d.ts.map +1 -0
  136. package/dist/core/read-agcel-config.js +13 -0
  137. package/dist/core/read-agcel-config.js.map +1 -0
  138. package/dist/core/registry.d.ts +9 -0
  139. package/dist/core/registry.d.ts.map +1 -0
  140. package/dist/core/registry.js +75 -0
  141. package/dist/core/registry.js.map +1 -0
  142. package/dist/core/registry.test.d.ts +2 -0
  143. package/dist/core/registry.test.d.ts.map +1 -0
  144. package/dist/core/registry.test.js +128 -0
  145. package/dist/core/registry.test.js.map +1 -0
  146. package/dist/core/schema.d.ts +51 -0
  147. package/dist/core/schema.d.ts.map +1 -0
  148. package/dist/core/schema.js +31 -0
  149. package/dist/core/schema.js.map +1 -0
  150. package/dist/core/summarizer.d.ts +23 -0
  151. package/dist/core/summarizer.d.ts.map +1 -0
  152. package/dist/core/summarizer.js +66 -0
  153. package/dist/core/summarizer.js.map +1 -0
  154. package/dist/core/text-similarity.d.ts +7 -0
  155. package/dist/core/text-similarity.d.ts.map +1 -0
  156. package/dist/core/text-similarity.js +35 -0
  157. package/dist/core/text-similarity.js.map +1 -0
  158. package/dist/core/text-similarity.test.d.ts +2 -0
  159. package/dist/core/text-similarity.test.d.ts.map +1 -0
  160. package/dist/core/text-similarity.test.js +11 -0
  161. package/dist/core/text-similarity.test.js.map +1 -0
  162. package/dist/docs-site.test.d.ts +2 -0
  163. package/dist/docs-site.test.d.ts.map +1 -0
  164. package/dist/docs-site.test.js +19 -0
  165. package/dist/docs-site.test.js.map +1 -0
  166. package/dist/index.d.ts +8 -0
  167. package/dist/index.d.ts.map +1 -0
  168. package/dist/index.js +8 -39
  169. package/dist/index.js.map +1 -0
  170. package/dist/providers/adapter.d.ts +23 -0
  171. package/dist/providers/adapter.d.ts.map +1 -0
  172. package/dist/providers/adapter.js +9 -0
  173. package/dist/providers/adapter.js.map +1 -0
  174. package/dist/providers/chatgpt.d.ts +13 -0
  175. package/dist/providers/chatgpt.d.ts.map +1 -0
  176. package/dist/providers/chatgpt.js +33 -0
  177. package/dist/providers/chatgpt.js.map +1 -0
  178. package/dist/providers/chatgpt.test.d.ts +2 -0
  179. package/dist/providers/chatgpt.test.d.ts.map +1 -0
  180. package/dist/providers/chatgpt.test.js +23 -0
  181. package/dist/providers/chatgpt.test.js.map +1 -0
  182. package/dist/providers/claude.d.ts +13 -0
  183. package/dist/providers/claude.d.ts.map +1 -0
  184. package/dist/providers/claude.js +48 -0
  185. package/dist/providers/claude.js.map +1 -0
  186. package/dist/providers/cursor.d.ts +14 -0
  187. package/dist/providers/cursor.d.ts.map +1 -0
  188. package/dist/providers/cursor.js +47 -0
  189. package/dist/providers/cursor.js.map +1 -0
  190. package/dist/providers/gemini.d.ts +13 -0
  191. package/dist/providers/gemini.d.ts.map +1 -0
  192. package/dist/providers/gemini.js +42 -0
  193. package/dist/providers/gemini.js.map +1 -0
  194. package/dist/providers/index.d.ts +5 -0
  195. package/dist/providers/index.d.ts.map +1 -0
  196. package/dist/providers/index.js +18 -0
  197. package/dist/providers/index.js.map +1 -0
  198. package/dist/server/index.d.ts +2 -0
  199. package/dist/server/index.d.ts.map +1 -0
  200. package/dist/server/index.js +288 -154
  201. package/dist/server/index.js.map +1 -0
  202. package/package.json +62 -52
  203. package/.agent/workflows/api-gen.md +0 -63
  204. package/.agent/workflows/architect.md +0 -44
  205. package/.agent/workflows/brainstorm.md +0 -227
  206. package/.agent/workflows/build.md +0 -38
  207. package/.agent/workflows/changelog.md +0 -55
  208. package/.agent/workflows/checkpoint.md +0 -142
  209. package/.agent/workflows/commit.md +0 -227
  210. package/.agent/workflows/debug.md +0 -61
  211. package/.agent/workflows/deploy.md +0 -80
  212. package/.agent/workflows/doc.md +0 -251
  213. package/.agent/workflows/execute-plan.md +0 -229
  214. package/.agent/workflows/feature.md +0 -259
  215. package/.agent/workflows/fix.md +0 -327
  216. package/.agent/workflows/help.md +0 -67
  217. package/.agent/workflows/index.md +0 -152
  218. package/.agent/workflows/load.md +0 -116
  219. package/.agent/workflows/mode.md +0 -174
  220. package/.agent/workflows/optimize.md +0 -57
  221. package/.agent/workflows/plan.md +0 -341
  222. package/.agent/workflows/pr.md +0 -78
  223. package/.agent/workflows/product-plan.md +0 -36
  224. package/.agent/workflows/production-deploy.md +0 -39
  225. package/.agent/workflows/refactor.md +0 -67
  226. package/.agent/workflows/research.md +0 -120
  227. package/.agent/workflows/review.md +0 -348
  228. package/.agent/workflows/security-scan.md +0 -60
  229. package/.agent/workflows/ship.md +0 -225
  230. package/.agent/workflows/spawn.md +0 -181
  231. package/.agent/workflows/status.md +0 -63
  232. package/.agent/workflows/tdd.md +0 -143
  233. package/.agent/workflows/test.md +0 -344
  234. package/.agent/workflows/verify.md +0 -35
  235. package/LICENSE +0 -21
  236. package/dist/commands/init.js +0 -147
  237. package/dist/commands/list.js +0 -43
  238. package/dist/commands/uninstall.js +0 -70
  239. package/dist/utils/index.js +0 -28
  240. package/skills/api-security-best-practices/SKILL.md +0 -291
  241. package/skills/api-security-best-practices/references/examples.md +0 -617
  242. package/skills/architecture/SKILL.md +0 -59
  243. package/skills/architecture/context-discovery.md +0 -43
  244. package/skills/architecture/examples.md +0 -94
  245. package/skills/architecture/pattern-selection.md +0 -68
  246. package/skills/architecture/patterns-reference.md +0 -50
  247. package/skills/architecture/trade-off-analysis.md +0 -77
  248. package/skills/aws-serverless/SKILL.md +0 -327
  249. package/skills/brainstorming/SKILL.md +0 -234
  250. package/skills/c4-context/SKILL.md +0 -154
  251. package/skills/ci-cd-engineer/SKILL.md +0 -50
  252. package/skills/code-auditing/SKILL.md +0 -55
  253. package/skills/copywriting/SKILL.md +0 -248
  254. package/skills/database-engineer/SKILL.md +0 -47
  255. package/skills/doc-coauthoring/SKILL.md +0 -379
  256. package/skills/docker-expert/SKILL.md +0 -412
  257. package/skills/langgraph/SKILL.md +0 -291
  258. package/skills/postgresql/SKILL.md +0 -73
  259. package/skills/pricing-strategy/SKILL.md +0 -360
  260. package/skills/product-manager/SKILL.md +0 -57
  261. package/skills/prompt-engineer/README.md +0 -659
  262. package/skills/prompt-engineer/SKILL.md +0 -256
  263. package/skills/python-patterns/SKILL.md +0 -445
  264. package/skills/qa-engineer/SKILL.md +0 -42
  265. package/skills/rag-engineer/SKILL.md +0 -94
  266. package/skills/react-patterns/SKILL.md +0 -202
  267. package/skills/secure-refactoring/SKILL.md +0 -54
  268. package/skills/security-documentation/SKILL.md +0 -53
  269. package/skills/senior-architect/SKILL.md +0 -213
  270. package/skills/senior-architect/references/architecture_patterns.md +0 -103
  271. package/skills/senior-architect/references/system_design_workflows.md +0 -103
  272. package/skills/senior-architect/references/tech_decision_guide.md +0 -103
  273. package/skills/senior-architect/scripts/architecture_diagram_generator.py +0 -114
  274. package/skills/senior-architect/scripts/dependency_analyzer.py +0 -114
  275. package/skills/senior-architect/scripts/project_architect.py +0 -114
  276. package/skills/seo-audit/SKILL.md +0 -491
  277. package/skills/sql-injection-testing/SKILL.md +0 -452
  278. package/skills/test-driven-development/SKILL.md +0 -375
  279. package/skills/test-driven-development/testing-anti-patterns.md +0 -299
  280. package/skills/test-fixing/SKILL.md +0 -123
  281. package/skills/testing-patterns/SKILL.md +0 -263
  282. package/skills/typescript-expert/SKILL.md +0 -202
  283. package/skills/typescript-expert/references/advanced-topics.md +0 -252
  284. package/skills/typescript-expert/references/tsconfig-strict.json +0 -92
  285. package/skills/typescript-expert/references/typescript-cheatsheet.md +0 -383
  286. package/skills/typescript-expert/references/utility-types.ts +0 -335
  287. package/skills/typescript-expert/scripts/ts_diagnostic.py +0 -203
  288. package/skills/ui-ux-designer/SKILL.md +0 -46
  289. package/skills/vercel-deployment/SKILL.md +0 -83
  290. package/skills/vulnerability-scanner/SKILL.md +0 -280
  291. package/skills/vulnerability-scanner/checklists.md +0 -121
  292. package/skills/vulnerability-scanner/scripts/security_scan.py +0 -458
  293. package/skills/writing-plans/SKILL.md +0 -120
package/README.md CHANGED
@@ -1,72 +1,65 @@
1
- # AgCel
1
+ # AgCEL
2
2
 
3
- AgCel is a local MCP (Model Context Protocol) Skills Server that functions both as a command-line tool and a backend for Antigravity workflows. It bridges the gap between local execution and AI agent capabilities by providing structured "Skills".
3
+ Agentic Context Engineering Library: registry-backed agents and skills, MCP server, RAG (local JSON or optional ChromaDB), and CLI tooling.
4
4
 
5
- ## Overview
5
+ ## Requirements
6
6
 
7
- The project consists of two main components:
8
- 1. **AgCel CLI**: A command-line interface to manage and interact with the MCP server.
9
- 2. **AgCel MCP Skills Server**: A local server that hosts skills and capabilities, enabling AI agents to perform complex tasks.
7
+ - Node.js 20+
8
+ - For Chroma mode: a running Chroma server (see [Chroma docs](https://docs.trychroma.com/))
10
9
 
11
- To install the AgCel CLI globally:
10
+ ## Install
12
11
 
13
12
  ```bash
14
- npm install -g agcel
13
+ npm install
14
+ npm run build
15
15
  ```
16
16
 
17
- This will make the `agc` command available globally. If you are developing locally, you can run `npm install -g .` from the project root.
18
-
19
- To remove AgCel, simply uninstall the npm package:
17
+ Global MCP wiring:
20
18
 
21
19
  ```bash
22
- npm uninstall -g agcel
20
+ npx agcel install
23
21
  ```
24
22
 
25
- You may also want to manually remove the global data directory (`~/.agcel`) and the server registration in your MCP config if you previously ran the legacy `install` command.
26
-
27
- ## CLI Usage
23
+ Targets Claude Desktop (macOS, Linux, Windows where paths are known), Claude Code (`~/.claude.json`), and Cursor (`~/.cursor/mcp.json`).
28
24
 
29
- The `agc` command-line tool is your primary interface. Application data is stored in the `.agc` directory in your project root, and `~/.agcel` for global configuration.
25
+ ## CLI
30
26
 
31
- | Command | Description |
32
- | :--- | :--- |
33
- | `agc init` | Initialize AgCel in the current project (copies workflows to `.agent/workflows`). |
34
- | `agc skills list` | List all available skills (local or global). |
35
- | `agc workflows list` | List all available workflows (local or global). |
36
- | `agc uninstall` | Clean up global data and remove the npm package. |
37
- | `agc --help` | Show the help menu. |
38
- | `agc --version` | Show the CLI version. |
27
+ | Command | Purpose |
28
+ |--------|---------|
29
+ | `agcel init` | Project `.agcel/` layout and provider stubs |
30
+ | `agcel install` | Register the MCP server in host configs |
31
+ | `agcel suggest <words...>` | Rank agents for a task; prints next steps if confidence is low |
32
+ | `agcel create-agent` | Interactive agent file (`--research` prints best-practice links) |
33
+ | `agcel create-skill` | Interactive skill file |
34
+ | `agcel pulse` | Summarize git changes into memory/RAG |
39
35
 
40
- ## Concepts
36
+ Run from source:
41
37
 
42
- ### Skills
43
-
44
- **Skills** are specialized capabilities that allow the AI to perform complex tasks. AgCel comes with a rich set of built-in skills:
38
+ ```bash
39
+ npm run cli -- suggest your task here
40
+ ```
45
41
 
46
- - **Languages**: Python, TypeScript, JavaScript
47
- - **Frameworks**: React, Next.js, FastAPI, Django
48
- - **DevOps**: Docker, GitHub Actions, Vercel
49
- - **Security**: OWASP, Vulnerability Scanning
50
- - **Methodology**: TDD, Systematic Debugging, Code Review, Architecture
42
+ ## MCP tools
51
43
 
52
- ### Workflows
44
+ - `route_query`: intent, RAG context, assembled prompt. Optional `conversation_history`, `previous_agent_name`, `draft_output` (guardrail check), `guardrail_strict`.
45
+ - `detect_intent`, `get_context`, `ingest_document`, `generate_config`, `validate_output`
53
46
 
54
- **Workflows** are standard operating procedures for common development tasks.
47
+ ## Configuration (`.agcel/config.json`)
55
48
 
56
- - **Development**: `/feature`, `/fix`, `/test`, `/refactor`
57
- - **Planning**: `/plan`, `/brainstorm`, `/research`
58
- - **Operations**: `/ship`, `/deploy`, `/security-scan`
49
+ - `ragEnabled`, `ragBackend` (`local` | `chroma`), `chroma` connection options
50
+ - `ragQueryMetadataFilter`: restrict RAG hits by metadata equality
51
+ - `strictGuardrailsOnRouteQuery`: treat failed guardrails on `draft_output` as blocking
59
52
 
60
- ### Rules
53
+ ## Development
61
54
 
62
- **Rules** serve as guardrails for the AI.
55
+ ```bash
56
+ npm run typecheck
57
+ npm test
58
+ ```
63
59
 
64
- - **Boundary Rules**: "Do not use external libraries."
65
- - **Operational Rules**: "Always ask for clarification."
66
- - **Security Rules**: "Never share API keys."
60
+ ## Troubleshooting
67
61
 
68
- ## Integration with Antigravity
62
+ - **No skills attached to an agent**: ensure files exist under `.agcel/registry/skills/` and names match the agent `skills` list. Missing skills appear in `route_query` as `missing_skills` and `warnings`.
63
+ - **Chroma errors**: AgCEL falls back to the local JSON index when Chroma is unreachable.
69
64
 
70
- When working with the Antigravity IDE:
71
- 1. Run `agc init` to set up the environment.
72
- 2. Use workflows in the Agent Window (e.g., `/feature` to start developing a new feature).
65
+ See `requirements.md` for the full requirement set and `gaps.md` for implementation status.
@@ -0,0 +1,4 @@
1
+ import { Command } from 'commander';
2
+ export declare const createAgentCommand: Command;
3
+ export declare const createSkillCommand: Command;
4
+ //# sourceMappingURL=create.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/create.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAUpC,eAAO,MAAM,kBAAkB,SAsD3B,CAAC;AAEL,eAAO,MAAM,kBAAkB,SAuB3B,CAAC"}
@@ -0,0 +1,68 @@
1
+ import { Command } from 'commander';
2
+ import * as fs from 'node:fs/promises';
3
+ import * as path from 'node:path';
4
+ import * as readline from 'node:readline';
5
+ import { formatResearchForSkills } from '../research-hints.js';
6
+ function prompt(rl, question) {
7
+ return new Promise(resolve => rl.question(question, resolve));
8
+ }
9
+ export const createAgentCommand = new Command('create-agent')
10
+ .description('Interactively create a new AgCEL agent persona')
11
+ .option('--research', 'After skills are listed, print vetted best-practice links to review while authoring')
12
+ .action(async (options) => {
13
+ const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
14
+ console.log('\nAgCEL Interactive Agent Builder\n');
15
+ const name = await prompt(rl, 'Agent name (e.g., backend-developer): ');
16
+ const description = await prompt(rl, 'Agent description: ');
17
+ const role = await prompt(rl, 'Role / System instruction summary: ');
18
+ const skillsInput = await prompt(rl, 'Skills (comma-separated, e.g., python,testing,debugging): ');
19
+ const skills = skillsInput.split(',').map(s => s.trim()).filter(Boolean);
20
+ const agent = { name, description, role, skills };
21
+ const registryPath = path.join(process.cwd(), '.agcel', 'registry', 'agents');
22
+ await fs.mkdir(registryPath, { recursive: true });
23
+ const filePath = path.join(registryPath, `${name}.json`);
24
+ await fs.writeFile(filePath, JSON.stringify(agent, null, 2));
25
+ console.log(`\nAgent "${name}" created at ${filePath}`);
26
+ if (options.research && skills.length > 0) {
27
+ console.log(`\n${formatResearchForSkills(skills)}\n`);
28
+ }
29
+ const createSkills = await prompt(rl, '\nWould you like to create skill files for this agent? (y/n): ');
30
+ if (createSkills.toLowerCase() === 'y') {
31
+ const skillsPath = path.join(process.cwd(), '.agcel', 'registry', 'skills');
32
+ await fs.mkdir(skillsPath, { recursive: true });
33
+ for (const skillName of skills) {
34
+ const skillDesc = await prompt(rl, ` Description for skill "${skillName}": `);
35
+ const systemPrompt = await prompt(rl, ` System prompt for "${skillName}": `);
36
+ const skill = {
37
+ name: skillName,
38
+ description: skillDesc,
39
+ systemPrompt,
40
+ tools: []
41
+ };
42
+ const skillFile = path.join(skillsPath, `${skillName}.json`);
43
+ await fs.writeFile(skillFile, JSON.stringify(skill, null, 2));
44
+ console.log(` Skill "${skillName}" created at ${skillFile}`);
45
+ }
46
+ }
47
+ rl.close();
48
+ console.log('\nAgent setup complete. Run the MCP server to start using your new agent.\n');
49
+ });
50
+ export const createSkillCommand = new Command('create-skill')
51
+ .description('Interactively create a new AgCEL skill')
52
+ .action(async () => {
53
+ const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
54
+ console.log('\nAgCEL Interactive Skill Builder\n');
55
+ const name = await prompt(rl, 'Skill name: ');
56
+ const description = await prompt(rl, 'Description: ');
57
+ const systemPrompt = await prompt(rl, 'System prompt / instructions: ');
58
+ const toolsInput = await prompt(rl, 'Associated tools (comma-separated, or leave empty): ');
59
+ const tools = toolsInput.split(',').map(s => s.trim()).filter(Boolean);
60
+ const skill = { name, description, systemPrompt, tools };
61
+ const skillsPath = path.join(process.cwd(), '.agcel', 'registry', 'skills');
62
+ await fs.mkdir(skillsPath, { recursive: true });
63
+ const filePath = path.join(skillsPath, `${name}.json`);
64
+ await fs.writeFile(filePath, JSON.stringify(skill, null, 2));
65
+ rl.close();
66
+ console.log(`\nSkill "${name}" created at ${filePath}\n`);
67
+ });
68
+ //# sourceMappingURL=create.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create.js","sourceRoot":"","sources":["../../../src/cli/commands/create.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const initCommand: Command;
3
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAapC,eAAO,MAAM,WAAW,SA2FpB,CAAC"}
@@ -0,0 +1,98 @@
1
+ import { Command } from 'commander';
2
+ import fs from 'node:fs/promises';
3
+ import path from 'node:path';
4
+ import { getAdapter, getAllAdapters } from '../../providers/index.js';
5
+ import { Registry } from '../../core/registry.js';
6
+ function parseRagBackend(value) {
7
+ const v = String(value).toLowerCase();
8
+ if (v === 'local' || v === 'chroma')
9
+ return v;
10
+ throw new Error(`Invalid --rag-backend "${value}". Use local or chroma.`);
11
+ }
12
+ export const initCommand = new Command('init')
13
+ .description('Initialize AgCEL project structure (and optionally provider configs)')
14
+ .option('-p, --provider <type>', 'Provider type (claude, gemini, cursor, chatgpt)')
15
+ .option('-a, --agent <name>', 'Agent name to generate config for')
16
+ .option('--rag <mode>', 'RAG mode (enable, disable, auto)', 'auto')
17
+ .option('--rag-backend <backend>', 'When RAG is enabled: local (JSON index) or chroma (ChromaDB server)', (v) => parseRagBackend(v), 'local')
18
+ .option('--chroma-host <host>', 'Chroma server host (default localhost)')
19
+ .option('--chroma-port <port>', 'Chroma server port (default 8000)', (v) => {
20
+ const n = Number(v);
21
+ if (!Number.isFinite(n))
22
+ throw new Error(`Invalid --chroma-port "${v}"`);
23
+ return n;
24
+ })
25
+ .option('--chroma-ssl', 'Use HTTPS for Chroma')
26
+ .option('--chroma-collection <name>', 'Chroma collection name (default agcel)')
27
+ .action(async (options) => {
28
+ const skillsDir = path.join(process.cwd(), '.agcel', 'skills');
29
+ const registryDir = path.join(process.cwd(), '.agcel', 'registry');
30
+ const configDir = path.join(process.cwd(), '.agcel');
31
+ const configPath = path.join(configDir, 'config.json');
32
+ try {
33
+ await fs.mkdir(skillsDir, { recursive: true });
34
+ await fs.mkdir(path.join(registryDir, 'agents'), { recursive: true });
35
+ await fs.mkdir(path.join(registryDir, 'skills'), { recursive: true });
36
+ await fs.mkdir(configDir, { recursive: true });
37
+ const ragMode = String(options.rag || 'auto').toLowerCase();
38
+ let ragEnabled;
39
+ if (ragMode === 'enable')
40
+ ragEnabled = true;
41
+ else if (ragMode === 'disable')
42
+ ragEnabled = false;
43
+ else
44
+ ragEnabled = undefined;
45
+ const config = {};
46
+ if (ragEnabled !== undefined) {
47
+ config.ragEnabled = ragEnabled;
48
+ }
49
+ if (ragEnabled === true) {
50
+ config.ragBackend = options.ragBackend;
51
+ }
52
+ if (options.chromaHost || options.chromaPort !== undefined || options.chromaSsl || options.chromaCollection) {
53
+ config.chroma = {};
54
+ if (options.chromaHost)
55
+ config.chroma.host = options.chromaHost;
56
+ if (options.chromaPort !== undefined)
57
+ config.chroma.port = options.chromaPort;
58
+ if (options.chromaSsl)
59
+ config.chroma.ssl = true;
60
+ if (options.chromaCollection)
61
+ config.chroma.collectionName = options.chromaCollection;
62
+ }
63
+ await fs.writeFile(configPath, JSON.stringify(config, null, 2) + '\n');
64
+ console.log('Initialized AgCEL structure under .agcel/.');
65
+ // If an agent is specified, generate provider-specific config
66
+ if (!options.agent)
67
+ return;
68
+ const registry = new Registry();
69
+ const agents = await registry.loadAgents();
70
+ const agent = agents.find(a => a.name === options.agent);
71
+ if (!agent) {
72
+ console.warn(`Agent "${options.agent}" not found in registry. Run 'agcel create-agent' first.`);
73
+ return;
74
+ }
75
+ const skills = await registry.loadSkills();
76
+ const adapters = options.provider
77
+ ? [getAdapter(options.provider)].filter((a) => Boolean(a))
78
+ : getAllAdapters();
79
+ if (options.provider && adapters.length === 0) {
80
+ console.error(`Unknown provider: ${options.provider}. Supported: claude, gemini, cursor, chatgpt`);
81
+ process.exit(1);
82
+ }
83
+ for (const adapter of adapters) {
84
+ const providerFiles = adapter.generateConfig(agent, skills);
85
+ for (const file of providerFiles) {
86
+ const filePath = path.join(process.cwd(), file.pathFromProjectRoot);
87
+ await fs.mkdir(path.dirname(filePath), { recursive: true });
88
+ await fs.writeFile(filePath, file.content);
89
+ console.log(`Generated ${path.relative(process.cwd(), filePath)}`);
90
+ }
91
+ }
92
+ }
93
+ catch (error) {
94
+ console.error('Failed to initialize project:', error);
95
+ process.exit(1);
96
+ }
97
+ });
98
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const installCommand: Command;
3
+ //# sourceMappingURL=install.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/install.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAWpC,eAAO,MAAM,cAAc,SA4CvB,CAAC"}
@@ -0,0 +1,15 @@
1
+ export interface McpServerEntry {
2
+ command: string;
3
+ args: string[];
4
+ }
5
+ export interface McpConfig {
6
+ mcpServers?: Record<string, McpServerEntry>;
7
+ [key: string]: unknown;
8
+ }
9
+ export declare function getMcpConfigPaths(): Array<{
10
+ name: string;
11
+ path: string;
12
+ }>;
13
+ export declare function readJsonFile(filePath: string): Promise<McpConfig>;
14
+ export declare function writeJsonFile(filePath: string, data: McpConfig): Promise<void>;
15
+ //# sourceMappingURL=install.helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install.helpers.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/install.helpers.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAED,MAAM,WAAW,SAAS;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IAC5C,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,wBAAgB,iBAAiB,IAAI,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CA6BzE;AAED,wBAAsB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAOvE;AAED,wBAAsB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAGpF"}
@@ -0,0 +1,47 @@
1
+ import * as fs from 'node:fs/promises';
2
+ import * as path from 'node:path';
3
+ import * as os from 'node:os';
4
+ export function getMcpConfigPaths() {
5
+ const home = os.homedir();
6
+ const paths = [
7
+ { name: 'Claude Code', path: path.join(home, '.claude.json') },
8
+ { name: 'Cursor', path: path.join(home, '.cursor', 'mcp.json') }
9
+ ];
10
+ const claudeDesktopPaths = [];
11
+ if (process.platform === 'darwin') {
12
+ claudeDesktopPaths.push({
13
+ name: 'Claude Desktop',
14
+ path: path.join(home, 'Library', 'Application Support', 'Claude', 'claude_desktop_config.json')
15
+ });
16
+ }
17
+ else if (process.platform === 'linux') {
18
+ claudeDesktopPaths.push({
19
+ name: 'Claude Desktop',
20
+ path: path.join(home, '.config', 'Claude', 'claude_desktop_config.json')
21
+ });
22
+ }
23
+ else if (process.platform === 'win32') {
24
+ const appData = process.env.APPDATA;
25
+ if (appData) {
26
+ claudeDesktopPaths.push({
27
+ name: 'Claude Desktop',
28
+ path: path.join(appData, 'Claude', 'claude_desktop_config.json')
29
+ });
30
+ }
31
+ }
32
+ return [...claudeDesktopPaths, ...paths];
33
+ }
34
+ export async function readJsonFile(filePath) {
35
+ try {
36
+ const data = await fs.readFile(filePath, 'utf-8');
37
+ return JSON.parse(data);
38
+ }
39
+ catch {
40
+ return {};
41
+ }
42
+ }
43
+ export async function writeJsonFile(filePath, data) {
44
+ await fs.mkdir(path.dirname(filePath), { recursive: true });
45
+ await fs.writeFile(filePath, JSON.stringify(data, null, 2) + '\n');
46
+ }
47
+ //# sourceMappingURL=install.helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install.helpers.js","sourceRoot":"","sources":["../../../src/cli/commands/install.helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAY9B,MAAM,UAAU,iBAAiB;IAC/B,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC;IAC1B,MAAM,KAAK,GAA0C;QACnD,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,cAAc,CAAC,EAAE;QAC9D,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,UAAU,CAAC,EAAE;KACjE,CAAC;IAEF,MAAM,kBAAkB,GAA0C,EAAE,CAAC;IACrE,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAClC,kBAAkB,CAAC,IAAI,CAAC;YACtB,IAAI,EAAE,gBAAgB;YACtB,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,qBAAqB,EAAE,QAAQ,EAAE,4BAA4B,CAAC;SAChG,CAAC,CAAC;IACL,CAAC;SAAM,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACxC,kBAAkB,CAAC,IAAI,CAAC;YACtB,IAAI,EAAE,gBAAgB;YACtB,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,4BAA4B,CAAC;SACzE,CAAC,CAAC;IACL,CAAC;SAAM,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACxC,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;QACpC,IAAI,OAAO,EAAE,CAAC;YACZ,kBAAkB,CAAC,IAAI,CAAC;gBACtB,IAAI,EAAE,gBAAgB;gBACtB,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,4BAA4B,CAAC;aACjE,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,kBAAkB,EAAE,GAAG,KAAK,CAAC,CAAC;AAC3C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,QAAgB;IACjD,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAClD,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAc,CAAC;IACvC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,QAAgB,EAAE,IAAe;IACnE,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5D,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;AACrE,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=install.helpers.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install.helpers.test.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/install.helpers.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,18 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { getMcpConfigPaths } from './install.helpers.js';
3
+ describe('getMcpConfigPaths', () => {
4
+ it('Given any platform when listing paths then Claude Code and Cursor entries exist', () => {
5
+ const paths = getMcpConfigPaths();
6
+ const labels = paths.map((p) => p.name);
7
+ expect(labels).toContain('Claude Code');
8
+ expect(labels).toContain('Cursor');
9
+ });
10
+ it('Given paths when listing then every path is absolute-style under homedir', () => {
11
+ const paths = getMcpConfigPaths();
12
+ expect(paths.length).toBeGreaterThanOrEqual(2);
13
+ for (const p of paths) {
14
+ expect(p.path.length).toBeGreaterThan(0);
15
+ }
16
+ });
17
+ });
18
+ //# sourceMappingURL=install.helpers.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install.helpers.test.js","sourceRoot":"","sources":["../../../src/cli/commands/install.helpers.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAEzD,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,EAAE,CAAC,iFAAiF,EAAE,GAAG,EAAE;QACzF,MAAM,KAAK,GAAG,iBAAiB,EAAE,CAAC;QAClC,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACxC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;QACxC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0EAA0E,EAAE,GAAG,EAAE;QAClF,MAAM,KAAK,GAAG,iBAAiB,EAAE,CAAC;QAClC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;QAC/C,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;YACtB,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,74 @@
1
+ import { Command } from 'commander';
2
+ import * as path from 'node:path';
3
+ import { fileURLToPath } from 'node:url';
4
+ import { getMcpConfigPaths, readJsonFile, writeJsonFile } from './install.helpers.js';
5
+ export const installCommand = new Command('install')
6
+ .description('Globally install the AgCEL MCP server into IDE configurations')
7
+ .option('--target <ide>', 'Install to a specific IDE only (claude-desktop, claude-code, cursor)')
8
+ .option('--uninstall', 'Remove AgCEL from IDE configurations')
9
+ .option('--dry-run', 'Show what would be written without making changes')
10
+ .action(async (options) => {
11
+ const __filename = fileURLToPath(import.meta.url);
12
+ const __dirname = path.dirname(__filename);
13
+ const serverScript = path.resolve(__dirname, '../../server/index.js');
14
+ const serverEntry = {
15
+ command: 'node',
16
+ args: [serverScript]
17
+ };
18
+ const allConfigs = getMcpConfigPaths();
19
+ const targets = options.target
20
+ ? allConfigs.filter(c => c.name.toLowerCase().replaceAll(/\s+/g, '-') === options.target)
21
+ : allConfigs;
22
+ if (targets.length === 0) {
23
+ console.error(`Unknown target: ${options.target}. Available: claude-desktop, claude-code, cursor`);
24
+ process.exit(1);
25
+ }
26
+ console.log(options.uninstall ? 'Uninstalling AgCEL MCP Server.' : 'Installing AgCEL MCP Server.');
27
+ for (const target of targets) {
28
+ if (options.uninstall) {
29
+ await uninstallFromTarget({
30
+ target,
31
+ dryRun: Boolean(options.dryRun)
32
+ });
33
+ }
34
+ else {
35
+ await installToTarget({
36
+ target,
37
+ serverEntry,
38
+ dryRun: Boolean(options.dryRun)
39
+ });
40
+ }
41
+ }
42
+ if (!options.dryRun && !options.uninstall) {
43
+ console.log('AgCEL MCP Server installed. Restart your IDE to activate.');
44
+ }
45
+ });
46
+ async function uninstallFromTarget(args) {
47
+ const config = await readJsonFile(args.target.path);
48
+ const hasEntry = Boolean(config.mcpServers && 'agcel' in config.mcpServers);
49
+ if (!hasEntry) {
50
+ console.log(` ${args.target.name} not installed, skipping`);
51
+ return;
52
+ }
53
+ delete config.mcpServers['agcel'];
54
+ if (args.dryRun) {
55
+ console.log(` [DRY RUN] Would remove "agcel" from ${args.target.name} (${args.target.path})`);
56
+ return;
57
+ }
58
+ await writeJsonFile(args.target.path, config);
59
+ console.log(` Removed from ${args.target.name}`);
60
+ }
61
+ async function installToTarget(args) {
62
+ const config = await readJsonFile(args.target.path);
63
+ config.mcpServers ??= {};
64
+ config.mcpServers['agcel'] = args.serverEntry;
65
+ if (args.dryRun) {
66
+ console.log(` [DRY RUN] Would write to ${args.target.name}:`);
67
+ console.log(` ${args.target.path}`);
68
+ console.log(` ${JSON.stringify({ agcel: args.serverEntry }, null, 2).split('\n').join('\n ')}\n`);
69
+ return;
70
+ }
71
+ await writeJsonFile(args.target.path, config);
72
+ console.log(` Installed for ${args.target.name} at ${args.target.path}`);
73
+ }
74
+ //# sourceMappingURL=install.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install.js","sourceRoot":"","sources":["../../../src/cli/commands/install.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { Command } from 'commander';
2
+ export declare function parsePorcelainChangedFiles(porcelain: string): string[];
3
+ export declare const pulseCommand: Command;
4
+ //# sourceMappingURL=pulse.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pulse.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/pulse.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQpC,wBAAgB,0BAA0B,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE,CActE;AAWD,eAAO,MAAM,YAAY,SAkBrB,CAAC"}
@@ -0,0 +1,48 @@
1
+ import { Command } from 'commander';
2
+ import { execFile } from 'node:child_process';
3
+ import { promisify } from 'node:util';
4
+ import { ContextManager } from '../../core/context.js';
5
+ import { PulseService } from '../../core/pulse.js';
6
+ const execFileAsync = promisify(execFile);
7
+ export function parsePorcelainChangedFiles(porcelain) {
8
+ // Porcelain v1 lines: XY SP <path> (rename/copy: <old> -> <new>)
9
+ return porcelain
10
+ .split('\n')
11
+ .map(l => l.replace(/\r$/, ''))
12
+ .filter(Boolean)
13
+ .map((line) => {
14
+ if (line.length < 4)
15
+ return '';
16
+ const payload = line.slice(3).trim();
17
+ const arrow = ' -> ';
18
+ if (payload.includes(arrow))
19
+ return payload.split(arrow).at(-1).trim();
20
+ return payload;
21
+ })
22
+ .filter(Boolean);
23
+ }
24
+ async function safeGit(args) {
25
+ try {
26
+ const { stdout } = await execFileAsync('git', args, { encoding: 'utf-8' });
27
+ return String(stdout || '').trim();
28
+ }
29
+ catch {
30
+ return '';
31
+ }
32
+ }
33
+ export const pulseCommand = new Command('pulse')
34
+ .description('Summarize recent project changes into memory/RAG')
35
+ .action(async () => {
36
+ const timestampIso = new Date().toISOString();
37
+ const gitHead = await safeGit(['log', '-1', '--oneline']);
38
+ const changedFilesRaw = await safeGit(['status', '--porcelain']);
39
+ const changedFiles = parsePorcelainChangedFiles(changedFilesRaw);
40
+ const diffStat = await safeGit(['diff', '--stat']);
41
+ const pulse = new PulseService();
42
+ const memo = pulse.buildMemo({ timestampIso, changedFiles, diffStat, gitHead });
43
+ const cm = new ContextManager();
44
+ await cm.initialize();
45
+ await cm.ingest(`pulse-${timestampIso}`, memo, { type: 'pulse' });
46
+ console.log('Pulse memo saved.');
47
+ });
48
+ //# sourceMappingURL=pulse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pulse.js","sourceRoot":"","sources":["../../../src/cli/commands/pulse.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAE1C,MAAM,UAAU,0BAA0B,CAAC,SAAiB;IAC1D,iEAAiE;IACjE,OAAO,SAAS;SACb,KAAK,CAAC,IAAI,CAAC;SACX,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;SAC9B,MAAM,CAAC,OAAO,CAAC;SACf,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACZ,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,EAAE,CAAC;QAC/B,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACrC,MAAM,KAAK,GAAG,MAAM,CAAC;QACrB,IAAI,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE,OAAO,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAE,CAAC,IAAI,EAAE,CAAC;QACxE,OAAO,OAAO,CAAC;IACjB,CAAC,CAAC;SACD,MAAM,CAAC,OAAO,CAAC,CAAC;AACrB,CAAC;AAED,KAAK,UAAU,OAAO,CAAC,IAAc;IACnC,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,aAAa,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;QAC3E,OAAO,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACrC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC;KAC7C,WAAW,CAAC,kDAAkD,CAAC;KAC/D,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,MAAM,YAAY,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC9C,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC;IAC1D,MAAM,eAAe,GAAG,MAAM,OAAO,CAAC,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC;IACjE,MAAM,YAAY,GAAG,0BAA0B,CAAC,eAAe,CAAC,CAAC;IAEjE,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;IAEnD,MAAM,KAAK,GAAG,IAAI,YAAY,EAAE,CAAC;IACjC,MAAM,IAAI,GAAG,KAAK,CAAC,SAAS,CAAC,EAAE,YAAY,EAAE,YAAY,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;IAEhF,MAAM,EAAE,GAAG,IAAI,cAAc,EAAE,CAAC;IAChC,MAAM,EAAE,CAAC,UAAU,EAAE,CAAC;IACtB,MAAM,EAAE,CAAC,MAAM,CAAC,SAAS,YAAY,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;IAElE,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;AACnC,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=pulse.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pulse.test.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/pulse.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,19 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { parsePorcelainChangedFiles } from './pulse.js';
3
+ describe('parsePorcelainChangedFiles', () => {
4
+ it('Given leading-space status codes when parsing then returns clean file paths', () => {
5
+ const porcelain = [
6
+ ' M src/a.ts',
7
+ 'M src/b.ts',
8
+ '?? src/new.ts'
9
+ ].join('\n');
10
+ const files = parsePorcelainChangedFiles(porcelain);
11
+ expect(files).toEqual(['src/a.ts', 'src/b.ts', 'src/new.ts']);
12
+ });
13
+ it('Given rename entry when parsing then returns new path', () => {
14
+ const porcelain = 'R old/name.ts -> new/name.ts';
15
+ const files = parsePorcelainChangedFiles(porcelain);
16
+ expect(files).toEqual(['new/name.ts']);
17
+ });
18
+ });
19
+ //# sourceMappingURL=pulse.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pulse.test.js","sourceRoot":"","sources":["../../../src/cli/commands/pulse.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,0BAA0B,EAAE,MAAM,YAAY,CAAC;AAExD,QAAQ,CAAC,4BAA4B,EAAE,GAAG,EAAE;IAC1C,EAAE,CAAC,6EAA6E,EAAE,GAAG,EAAE;QACrF,MAAM,SAAS,GAAG;YAChB,aAAa;YACb,aAAa;YACb,eAAe;SAChB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEb,MAAM,KAAK,GAAG,0BAA0B,CAAC,SAAS,CAAC,CAAC;QAEpD,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,UAAU,EAAE,UAAU,EAAE,YAAY,CAAC,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;QAC/D,MAAM,SAAS,GAAG,+BAA+B,CAAC;QAElD,MAAM,KAAK,GAAG,0BAA0B,CAAC,SAAS,CAAC,CAAC;QAEpD,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const suggestCommand: Command;
3
+ //# sourceMappingURL=suggest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"suggest.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/suggest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,eAAO,MAAM,cAAc,SA8BvB,CAAC"}