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.
- package/README.md +40 -47
- package/dist/cli/commands/create.d.ts +4 -0
- package/dist/cli/commands/create.d.ts.map +1 -0
- package/dist/cli/commands/create.js +68 -0
- package/dist/cli/commands/create.js.map +1 -0
- package/dist/cli/commands/init.d.ts +3 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +98 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/install.d.ts +3 -0
- package/dist/cli/commands/install.d.ts.map +1 -0
- package/dist/cli/commands/install.helpers.d.ts +15 -0
- package/dist/cli/commands/install.helpers.d.ts.map +1 -0
- package/dist/cli/commands/install.helpers.js +47 -0
- package/dist/cli/commands/install.helpers.js.map +1 -0
- package/dist/cli/commands/install.helpers.test.d.ts +2 -0
- package/dist/cli/commands/install.helpers.test.d.ts.map +1 -0
- package/dist/cli/commands/install.helpers.test.js +18 -0
- package/dist/cli/commands/install.helpers.test.js.map +1 -0
- package/dist/cli/commands/install.js +74 -0
- package/dist/cli/commands/install.js.map +1 -0
- package/dist/cli/commands/pulse.d.ts +4 -0
- package/dist/cli/commands/pulse.d.ts.map +1 -0
- package/dist/cli/commands/pulse.js +48 -0
- package/dist/cli/commands/pulse.js.map +1 -0
- package/dist/cli/commands/pulse.test.d.ts +2 -0
- package/dist/cli/commands/pulse.test.d.ts.map +1 -0
- package/dist/cli/commands/pulse.test.js +19 -0
- package/dist/cli/commands/pulse.test.js.map +1 -0
- package/dist/cli/commands/suggest.d.ts +3 -0
- package/dist/cli/commands/suggest.d.ts.map +1 -0
- package/dist/cli/commands/suggest.js +32 -0
- package/dist/cli/commands/suggest.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +20 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/research-hints.d.ts +5 -0
- package/dist/cli/research-hints.d.ts.map +1 -0
- package/dist/cli/research-hints.js +109 -0
- package/dist/cli/research-hints.js.map +1 -0
- package/dist/cli/research-hints.test.d.ts +2 -0
- package/dist/cli/research-hints.test.d.ts.map +1 -0
- package/dist/cli/research-hints.test.js +50 -0
- package/dist/cli/research-hints.test.js.map +1 -0
- package/dist/core/agcel-config.d.ts +27 -0
- package/dist/core/agcel-config.d.ts.map +1 -0
- package/dist/core/agcel-config.js +4 -0
- package/dist/core/agcel-config.js.map +1 -0
- package/dist/core/build-rag-engine.d.ts +12 -0
- package/dist/core/build-rag-engine.d.ts.map +1 -0
- package/dist/core/build-rag-engine.js +24 -0
- package/dist/core/build-rag-engine.js.map +1 -0
- package/dist/core/build-rag-engine.test.d.ts +2 -0
- package/dist/core/build-rag-engine.test.d.ts.map +1 -0
- package/dist/core/build-rag-engine.test.js +34 -0
- package/dist/core/build-rag-engine.test.js.map +1 -0
- package/dist/core/chroma-rag.d.ts +20 -0
- package/dist/core/chroma-rag.d.ts.map +1 -0
- package/dist/core/chroma-rag.js +108 -0
- package/dist/core/chroma-rag.js.map +1 -0
- package/dist/core/context-hygiene.d.ts +12 -0
- package/dist/core/context-hygiene.d.ts.map +1 -0
- package/dist/core/context-hygiene.js +43 -0
- package/dist/core/context-hygiene.js.map +1 -0
- package/dist/core/context-hygiene.test.d.ts +2 -0
- package/dist/core/context-hygiene.test.d.ts.map +1 -0
- package/dist/core/context-hygiene.test.js +18 -0
- package/dist/core/context-hygiene.test.js.map +1 -0
- package/dist/core/context.d.ts +44 -0
- package/dist/core/context.d.ts.map +1 -0
- package/dist/core/context.js +114 -0
- package/dist/core/context.js.map +1 -0
- package/dist/core/conversation-routing.d.ts +10 -0
- package/dist/core/conversation-routing.d.ts.map +1 -0
- package/dist/core/conversation-routing.js +27 -0
- package/dist/core/conversation-routing.js.map +1 -0
- package/dist/core/conversation-routing.test.d.ts +2 -0
- package/dist/core/conversation-routing.test.d.ts.map +1 -0
- package/dist/core/conversation-routing.test.js +29 -0
- package/dist/core/conversation-routing.test.js.map +1 -0
- package/dist/core/guardrails.d.ts +26 -0
- package/dist/core/guardrails.d.ts.map +1 -0
- package/dist/core/guardrails.js +76 -0
- package/dist/core/guardrails.js.map +1 -0
- package/dist/core/guardrails.test.d.ts +2 -0
- package/dist/core/guardrails.test.d.ts.map +1 -0
- package/dist/core/guardrails.test.js +35 -0
- package/dist/core/guardrails.test.js.map +1 -0
- package/dist/core/intent.d.ts +22 -0
- package/dist/core/intent.d.ts.map +1 -0
- package/dist/core/intent.js +79 -0
- package/dist/core/intent.js.map +1 -0
- package/dist/core/intent.test.d.ts +2 -0
- package/dist/core/intent.test.d.ts.map +1 -0
- package/dist/core/intent.test.js +43 -0
- package/dist/core/intent.test.js.map +1 -0
- package/dist/core/local-rag.d.ts +17 -0
- package/dist/core/local-rag.d.ts.map +1 -0
- package/dist/core/local-rag.js +74 -0
- package/dist/core/local-rag.js.map +1 -0
- package/dist/core/local-rag.test.d.ts +2 -0
- package/dist/core/local-rag.test.d.ts.map +1 -0
- package/dist/core/local-rag.test.js +47 -0
- package/dist/core/local-rag.test.js.map +1 -0
- package/dist/core/orchestrator.d.ts +47 -0
- package/dist/core/orchestrator.d.ts.map +1 -0
- package/dist/core/orchestrator.js +138 -0
- package/dist/core/orchestrator.js.map +1 -0
- package/dist/core/orchestrator.test.d.ts +2 -0
- package/dist/core/orchestrator.test.d.ts.map +1 -0
- package/dist/core/orchestrator.test.js +118 -0
- package/dist/core/orchestrator.test.js.map +1 -0
- package/dist/core/pulse.d.ts +13 -0
- package/dist/core/pulse.d.ts.map +1 -0
- package/dist/core/pulse.js +29 -0
- package/dist/core/pulse.js.map +1 -0
- package/dist/core/pulse.test.d.ts +2 -0
- package/dist/core/pulse.test.d.ts.map +1 -0
- package/dist/core/pulse.test.js +18 -0
- package/dist/core/pulse.test.js.map +1 -0
- package/dist/core/rag-metadata.d.ts +5 -0
- package/dist/core/rag-metadata.d.ts.map +1 -0
- package/dist/core/rag-metadata.js +13 -0
- package/dist/core/rag-metadata.js.map +1 -0
- package/dist/core/rag-metadata.test.d.ts +2 -0
- package/dist/core/rag-metadata.test.d.ts.map +1 -0
- package/dist/core/rag-metadata.test.js +12 -0
- package/dist/core/rag-metadata.test.js.map +1 -0
- package/dist/core/rag-types.d.ts +18 -0
- package/dist/core/rag-types.d.ts.map +1 -0
- package/dist/core/rag-types.js +2 -0
- package/dist/core/rag-types.js.map +1 -0
- package/dist/core/read-agcel-config.d.ts +3 -0
- package/dist/core/read-agcel-config.d.ts.map +1 -0
- package/dist/core/read-agcel-config.js +13 -0
- package/dist/core/read-agcel-config.js.map +1 -0
- package/dist/core/registry.d.ts +9 -0
- package/dist/core/registry.d.ts.map +1 -0
- package/dist/core/registry.js +75 -0
- package/dist/core/registry.js.map +1 -0
- package/dist/core/registry.test.d.ts +2 -0
- package/dist/core/registry.test.d.ts.map +1 -0
- package/dist/core/registry.test.js +128 -0
- package/dist/core/registry.test.js.map +1 -0
- package/dist/core/schema.d.ts +51 -0
- package/dist/core/schema.d.ts.map +1 -0
- package/dist/core/schema.js +31 -0
- package/dist/core/schema.js.map +1 -0
- package/dist/core/summarizer.d.ts +23 -0
- package/dist/core/summarizer.d.ts.map +1 -0
- package/dist/core/summarizer.js +66 -0
- package/dist/core/summarizer.js.map +1 -0
- package/dist/core/text-similarity.d.ts +7 -0
- package/dist/core/text-similarity.d.ts.map +1 -0
- package/dist/core/text-similarity.js +35 -0
- package/dist/core/text-similarity.js.map +1 -0
- package/dist/core/text-similarity.test.d.ts +2 -0
- package/dist/core/text-similarity.test.d.ts.map +1 -0
- package/dist/core/text-similarity.test.js +11 -0
- package/dist/core/text-similarity.test.js.map +1 -0
- package/dist/docs-site.test.d.ts +2 -0
- package/dist/docs-site.test.d.ts.map +1 -0
- package/dist/docs-site.test.js +19 -0
- package/dist/docs-site.test.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -39
- package/dist/index.js.map +1 -0
- package/dist/providers/adapter.d.ts +23 -0
- package/dist/providers/adapter.d.ts.map +1 -0
- package/dist/providers/adapter.js +9 -0
- package/dist/providers/adapter.js.map +1 -0
- package/dist/providers/chatgpt.d.ts +13 -0
- package/dist/providers/chatgpt.d.ts.map +1 -0
- package/dist/providers/chatgpt.js +33 -0
- package/dist/providers/chatgpt.js.map +1 -0
- package/dist/providers/chatgpt.test.d.ts +2 -0
- package/dist/providers/chatgpt.test.d.ts.map +1 -0
- package/dist/providers/chatgpt.test.js +23 -0
- package/dist/providers/chatgpt.test.js.map +1 -0
- package/dist/providers/claude.d.ts +13 -0
- package/dist/providers/claude.d.ts.map +1 -0
- package/dist/providers/claude.js +48 -0
- package/dist/providers/claude.js.map +1 -0
- package/dist/providers/cursor.d.ts +14 -0
- package/dist/providers/cursor.d.ts.map +1 -0
- package/dist/providers/cursor.js +47 -0
- package/dist/providers/cursor.js.map +1 -0
- package/dist/providers/gemini.d.ts +13 -0
- package/dist/providers/gemini.d.ts.map +1 -0
- package/dist/providers/gemini.js +42 -0
- package/dist/providers/gemini.js.map +1 -0
- package/dist/providers/index.d.ts +5 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +18 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/server/index.d.ts +2 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +288 -154
- package/dist/server/index.js.map +1 -0
- package/package.json +62 -52
- package/.agent/workflows/api-gen.md +0 -63
- package/.agent/workflows/architect.md +0 -44
- package/.agent/workflows/brainstorm.md +0 -227
- package/.agent/workflows/build.md +0 -38
- package/.agent/workflows/changelog.md +0 -55
- package/.agent/workflows/checkpoint.md +0 -142
- package/.agent/workflows/commit.md +0 -227
- package/.agent/workflows/debug.md +0 -61
- package/.agent/workflows/deploy.md +0 -80
- package/.agent/workflows/doc.md +0 -251
- package/.agent/workflows/execute-plan.md +0 -229
- package/.agent/workflows/feature.md +0 -259
- package/.agent/workflows/fix.md +0 -327
- package/.agent/workflows/help.md +0 -67
- package/.agent/workflows/index.md +0 -152
- package/.agent/workflows/load.md +0 -116
- package/.agent/workflows/mode.md +0 -174
- package/.agent/workflows/optimize.md +0 -57
- package/.agent/workflows/plan.md +0 -341
- package/.agent/workflows/pr.md +0 -78
- package/.agent/workflows/product-plan.md +0 -36
- package/.agent/workflows/production-deploy.md +0 -39
- package/.agent/workflows/refactor.md +0 -67
- package/.agent/workflows/research.md +0 -120
- package/.agent/workflows/review.md +0 -348
- package/.agent/workflows/security-scan.md +0 -60
- package/.agent/workflows/ship.md +0 -225
- package/.agent/workflows/spawn.md +0 -181
- package/.agent/workflows/status.md +0 -63
- package/.agent/workflows/tdd.md +0 -143
- package/.agent/workflows/test.md +0 -344
- package/.agent/workflows/verify.md +0 -35
- package/LICENSE +0 -21
- package/dist/commands/init.js +0 -147
- package/dist/commands/list.js +0 -43
- package/dist/commands/uninstall.js +0 -70
- package/dist/utils/index.js +0 -28
- package/skills/api-security-best-practices/SKILL.md +0 -291
- package/skills/api-security-best-practices/references/examples.md +0 -617
- package/skills/architecture/SKILL.md +0 -59
- package/skills/architecture/context-discovery.md +0 -43
- package/skills/architecture/examples.md +0 -94
- package/skills/architecture/pattern-selection.md +0 -68
- package/skills/architecture/patterns-reference.md +0 -50
- package/skills/architecture/trade-off-analysis.md +0 -77
- package/skills/aws-serverless/SKILL.md +0 -327
- package/skills/brainstorming/SKILL.md +0 -234
- package/skills/c4-context/SKILL.md +0 -154
- package/skills/ci-cd-engineer/SKILL.md +0 -50
- package/skills/code-auditing/SKILL.md +0 -55
- package/skills/copywriting/SKILL.md +0 -248
- package/skills/database-engineer/SKILL.md +0 -47
- package/skills/doc-coauthoring/SKILL.md +0 -379
- package/skills/docker-expert/SKILL.md +0 -412
- package/skills/langgraph/SKILL.md +0 -291
- package/skills/postgresql/SKILL.md +0 -73
- package/skills/pricing-strategy/SKILL.md +0 -360
- package/skills/product-manager/SKILL.md +0 -57
- package/skills/prompt-engineer/README.md +0 -659
- package/skills/prompt-engineer/SKILL.md +0 -256
- package/skills/python-patterns/SKILL.md +0 -445
- package/skills/qa-engineer/SKILL.md +0 -42
- package/skills/rag-engineer/SKILL.md +0 -94
- package/skills/react-patterns/SKILL.md +0 -202
- package/skills/secure-refactoring/SKILL.md +0 -54
- package/skills/security-documentation/SKILL.md +0 -53
- package/skills/senior-architect/SKILL.md +0 -213
- package/skills/senior-architect/references/architecture_patterns.md +0 -103
- package/skills/senior-architect/references/system_design_workflows.md +0 -103
- package/skills/senior-architect/references/tech_decision_guide.md +0 -103
- package/skills/senior-architect/scripts/architecture_diagram_generator.py +0 -114
- package/skills/senior-architect/scripts/dependency_analyzer.py +0 -114
- package/skills/senior-architect/scripts/project_architect.py +0 -114
- package/skills/seo-audit/SKILL.md +0 -491
- package/skills/sql-injection-testing/SKILL.md +0 -452
- package/skills/test-driven-development/SKILL.md +0 -375
- package/skills/test-driven-development/testing-anti-patterns.md +0 -299
- package/skills/test-fixing/SKILL.md +0 -123
- package/skills/testing-patterns/SKILL.md +0 -263
- package/skills/typescript-expert/SKILL.md +0 -202
- package/skills/typescript-expert/references/advanced-topics.md +0 -252
- package/skills/typescript-expert/references/tsconfig-strict.json +0 -92
- package/skills/typescript-expert/references/typescript-cheatsheet.md +0 -383
- package/skills/typescript-expert/references/utility-types.ts +0 -335
- package/skills/typescript-expert/scripts/ts_diagnostic.py +0 -203
- package/skills/ui-ux-designer/SKILL.md +0 -46
- package/skills/vercel-deployment/SKILL.md +0 -83
- package/skills/vulnerability-scanner/SKILL.md +0 -280
- package/skills/vulnerability-scanner/checklists.md +0 -121
- package/skills/vulnerability-scanner/scripts/security_scan.py +0 -458
- package/skills/writing-plans/SKILL.md +0 -120
package/README.md
CHANGED
|
@@ -1,72 +1,65 @@
|
|
|
1
|
-
#
|
|
1
|
+
# AgCEL
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Agentic Context Engineering Library: registry-backed agents and skills, MCP server, RAG (local JSON or optional ChromaDB), and CLI tooling.
|
|
4
4
|
|
|
5
|
-
##
|
|
5
|
+
## Requirements
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
|
|
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
|
-
|
|
10
|
+
## Install
|
|
12
11
|
|
|
13
12
|
```bash
|
|
14
|
-
npm install
|
|
13
|
+
npm install
|
|
14
|
+
npm run build
|
|
15
15
|
```
|
|
16
16
|
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
To remove AgCel, simply uninstall the npm package:
|
|
17
|
+
Global MCP wiring:
|
|
20
18
|
|
|
21
19
|
```bash
|
|
22
|
-
|
|
20
|
+
npx agcel install
|
|
23
21
|
```
|
|
24
22
|
|
|
25
|
-
|
|
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
|
-
|
|
25
|
+
## CLI
|
|
30
26
|
|
|
31
|
-
| Command |
|
|
32
|
-
|
|
33
|
-
| `
|
|
34
|
-
| `
|
|
35
|
-
| `
|
|
36
|
-
| `
|
|
37
|
-
| `
|
|
38
|
-
| `
|
|
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
|
-
|
|
36
|
+
Run from source:
|
|
41
37
|
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
38
|
+
```bash
|
|
39
|
+
npm run cli -- suggest your task here
|
|
40
|
+
```
|
|
45
41
|
|
|
46
|
-
|
|
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
|
-
|
|
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
|
-
|
|
47
|
+
## Configuration (`.agcel/config.json`)
|
|
55
48
|
|
|
56
|
-
-
|
|
57
|
-
-
|
|
58
|
-
-
|
|
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
|
-
|
|
53
|
+
## Development
|
|
61
54
|
|
|
62
|
-
|
|
55
|
+
```bash
|
|
56
|
+
npm run typecheck
|
|
57
|
+
npm test
|
|
58
|
+
```
|
|
63
59
|
|
|
64
|
-
|
|
65
|
-
- **Operational Rules**: "Always ask for clarification."
|
|
66
|
-
- **Security Rules**: "Never share API keys."
|
|
60
|
+
## Troubleshooting
|
|
67
61
|
|
|
68
|
-
|
|
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
|
-
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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"}
|