ctxinit 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +484 -0
- package/bin/ctx.js +3 -0
- package/dist/analysis/index.d.ts +2 -0
- package/dist/analysis/index.d.ts.map +1 -0
- package/dist/analysis/index.js +18 -0
- package/dist/analysis/index.js.map +1 -0
- package/dist/analysis/static-analysis.d.ts +79 -0
- package/dist/analysis/static-analysis.d.ts.map +1 -0
- package/dist/analysis/static-analysis.js +279 -0
- package/dist/analysis/static-analysis.js.map +1 -0
- package/dist/bootstrap/index.d.ts +8 -0
- package/dist/bootstrap/index.d.ts.map +1 -0
- package/dist/bootstrap/index.js +13 -0
- package/dist/bootstrap/index.js.map +1 -0
- package/dist/bootstrap/orchestrator.d.ts +48 -0
- package/dist/bootstrap/orchestrator.d.ts.map +1 -0
- package/dist/bootstrap/orchestrator.js +363 -0
- package/dist/bootstrap/orchestrator.js.map +1 -0
- package/dist/bootstrap/validator.d.ts +25 -0
- package/dist/bootstrap/validator.d.ts.map +1 -0
- package/dist/bootstrap/validator.js +412 -0
- package/dist/bootstrap/validator.js.map +1 -0
- package/dist/build/atomic.d.ts +74 -0
- package/dist/build/atomic.d.ts.map +1 -0
- package/dist/build/atomic.js +235 -0
- package/dist/build/atomic.js.map +1 -0
- package/dist/build/index.d.ts +10 -0
- package/dist/build/index.d.ts.map +1 -0
- package/dist/build/index.js +26 -0
- package/dist/build/index.js.map +1 -0
- package/dist/build/lock.d.ts +102 -0
- package/dist/build/lock.d.ts.map +1 -0
- package/dist/build/lock.js +297 -0
- package/dist/build/lock.js.map +1 -0
- package/dist/build/manifest.d.ts +138 -0
- package/dist/build/manifest.d.ts.map +1 -0
- package/dist/build/manifest.js +269 -0
- package/dist/build/manifest.js.map +1 -0
- package/dist/build/orchestrator.d.ts +103 -0
- package/dist/build/orchestrator.d.ts.map +1 -0
- package/dist/build/orchestrator.js +524 -0
- package/dist/build/orchestrator.js.map +1 -0
- package/dist/cli/bootstrap.d.ts +77 -0
- package/dist/cli/bootstrap.d.ts.map +1 -0
- package/dist/cli/bootstrap.js +527 -0
- package/dist/cli/bootstrap.js.map +1 -0
- package/dist/cli/build.d.ts +32 -0
- package/dist/cli/build.d.ts.map +1 -0
- package/dist/cli/build.js +156 -0
- package/dist/cli/build.js.map +1 -0
- package/dist/cli/diff.d.ts +23 -0
- package/dist/cli/diff.d.ts.map +1 -0
- package/dist/cli/diff.js +226 -0
- package/dist/cli/diff.js.map +1 -0
- package/dist/cli/hooks.d.ts +29 -0
- package/dist/cli/hooks.d.ts.map +1 -0
- package/dist/cli/hooks.js +176 -0
- package/dist/cli/hooks.js.map +1 -0
- package/dist/cli/init.d.ts +53 -0
- package/dist/cli/init.d.ts.map +1 -0
- package/dist/cli/init.js +254 -0
- package/dist/cli/init.js.map +1 -0
- package/dist/cli/lint.d.ts +46 -0
- package/dist/cli/lint.d.ts.map +1 -0
- package/dist/cli/lint.js +210 -0
- package/dist/cli/lint.js.map +1 -0
- package/dist/cli/migrate.d.ts +28 -0
- package/dist/cli/migrate.d.ts.map +1 -0
- package/dist/cli/migrate.js +350 -0
- package/dist/cli/migrate.js.map +1 -0
- package/dist/cli/verify.d.ts +21 -0
- package/dist/cli/verify.d.ts.map +1 -0
- package/dist/cli/verify.js +209 -0
- package/dist/cli/verify.js.map +1 -0
- package/dist/cli.d.ts +8 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +262 -0
- package/dist/cli.js.map +1 -0
- package/dist/compiler/agents-compiler.d.ts +24 -0
- package/dist/compiler/agents-compiler.d.ts.map +1 -0
- package/dist/compiler/agents-compiler.js +192 -0
- package/dist/compiler/agents-compiler.js.map +1 -0
- package/dist/compiler/base-compiler.d.ts +152 -0
- package/dist/compiler/base-compiler.d.ts.map +1 -0
- package/dist/compiler/base-compiler.js +180 -0
- package/dist/compiler/base-compiler.js.map +1 -0
- package/dist/compiler/claude-compiler.d.ts +24 -0
- package/dist/compiler/claude-compiler.d.ts.map +1 -0
- package/dist/compiler/claude-compiler.js +182 -0
- package/dist/compiler/claude-compiler.js.map +1 -0
- package/dist/compiler/cursor-compiler.d.ts +33 -0
- package/dist/compiler/cursor-compiler.d.ts.map +1 -0
- package/dist/compiler/cursor-compiler.js +136 -0
- package/dist/compiler/cursor-compiler.js.map +1 -0
- package/dist/compiler/index.d.ts +7 -0
- package/dist/compiler/index.d.ts.map +1 -0
- package/dist/compiler/index.js +24 -0
- package/dist/compiler/index.js.map +1 -0
- package/dist/compiler/rule-selector.d.ts +115 -0
- package/dist/compiler/rule-selector.d.ts.map +1 -0
- package/dist/compiler/rule-selector.js +273 -0
- package/dist/compiler/rule-selector.js.map +1 -0
- package/dist/compiler/token-estimator.d.ts +74 -0
- package/dist/compiler/token-estimator.d.ts.map +1 -0
- package/dist/compiler/token-estimator.js +191 -0
- package/dist/compiler/token-estimator.js.map +1 -0
- package/dist/config/index.d.ts +2 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +18 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/loader.d.ts +48 -0
- package/dist/config/loader.d.ts.map +1 -0
- package/dist/config/loader.js +175 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/git/gitignore.d.ts +59 -0
- package/dist/git/gitignore.d.ts.map +1 -0
- package/dist/git/gitignore.js +268 -0
- package/dist/git/gitignore.js.map +1 -0
- package/dist/git/hooks.d.ts +34 -0
- package/dist/git/hooks.d.ts.map +1 -0
- package/dist/git/hooks.js +129 -0
- package/dist/git/hooks.js.map +1 -0
- package/dist/git/husky.d.ts +52 -0
- package/dist/git/husky.d.ts.map +1 -0
- package/dist/git/husky.js +219 -0
- package/dist/git/husky.js.map +1 -0
- package/dist/git/index.d.ts +9 -0
- package/dist/git/index.d.ts.map +1 -0
- package/dist/git/index.js +15 -0
- package/dist/git/index.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +23 -0
- package/dist/index.js.map +1 -0
- package/dist/llm/base-provider.d.ts +43 -0
- package/dist/llm/base-provider.d.ts.map +1 -0
- package/dist/llm/base-provider.js +91 -0
- package/dist/llm/base-provider.js.map +1 -0
- package/dist/llm/index.d.ts +17 -0
- package/dist/llm/index.d.ts.map +1 -0
- package/dist/llm/index.js +36 -0
- package/dist/llm/index.js.map +1 -0
- package/dist/llm/prompts/bootstrap-prompt.d.ts +27 -0
- package/dist/llm/prompts/bootstrap-prompt.d.ts.map +1 -0
- package/dist/llm/prompts/bootstrap-prompt.js +278 -0
- package/dist/llm/prompts/bootstrap-prompt.js.map +1 -0
- package/dist/llm/prompts/index.d.ts +5 -0
- package/dist/llm/prompts/index.d.ts.map +1 -0
- package/dist/llm/prompts/index.js +11 -0
- package/dist/llm/prompts/index.js.map +1 -0
- package/dist/llm/provider-factory.d.ts +27 -0
- package/dist/llm/provider-factory.d.ts.map +1 -0
- package/dist/llm/provider-factory.js +213 -0
- package/dist/llm/provider-factory.js.map +1 -0
- package/dist/llm/providers/claude-api.d.ts +21 -0
- package/dist/llm/providers/claude-api.d.ts.map +1 -0
- package/dist/llm/providers/claude-api.js +110 -0
- package/dist/llm/providers/claude-api.js.map +1 -0
- package/dist/llm/providers/claude-code.d.ts +21 -0
- package/dist/llm/providers/claude-code.d.ts.map +1 -0
- package/dist/llm/providers/claude-code.js +120 -0
- package/dist/llm/providers/claude-code.js.map +1 -0
- package/dist/llm/providers/codex-cli.d.ts +25 -0
- package/dist/llm/providers/codex-cli.d.ts.map +1 -0
- package/dist/llm/providers/codex-cli.js +129 -0
- package/dist/llm/providers/codex-cli.js.map +1 -0
- package/dist/llm/providers/cursor-cli.d.ts +24 -0
- package/dist/llm/providers/cursor-cli.d.ts.map +1 -0
- package/dist/llm/providers/cursor-cli.js +106 -0
- package/dist/llm/providers/cursor-cli.js.map +1 -0
- package/dist/llm/providers/gemini-api.d.ts +20 -0
- package/dist/llm/providers/gemini-api.d.ts.map +1 -0
- package/dist/llm/providers/gemini-api.js +121 -0
- package/dist/llm/providers/gemini-api.js.map +1 -0
- package/dist/llm/providers/gemini-cli.d.ts +20 -0
- package/dist/llm/providers/gemini-cli.d.ts.map +1 -0
- package/dist/llm/providers/gemini-cli.js +109 -0
- package/dist/llm/providers/gemini-cli.js.map +1 -0
- package/dist/llm/providers/interactive.d.ts +42 -0
- package/dist/llm/providers/interactive.d.ts.map +1 -0
- package/dist/llm/providers/interactive.js +200 -0
- package/dist/llm/providers/interactive.js.map +1 -0
- package/dist/llm/providers/openai-api.d.ts +21 -0
- package/dist/llm/providers/openai-api.d.ts.map +1 -0
- package/dist/llm/providers/openai-api.js +107 -0
- package/dist/llm/providers/openai-api.js.map +1 -0
- package/dist/llm/types.d.ts +128 -0
- package/dist/llm/types.d.ts.map +1 -0
- package/dist/llm/types.js +8 -0
- package/dist/llm/types.js.map +1 -0
- package/dist/parser/index.d.ts +3 -0
- package/dist/parser/index.d.ts.map +1 -0
- package/dist/parser/index.js +19 -0
- package/dist/parser/index.js.map +1 -0
- package/dist/parser/path-security.d.ts +40 -0
- package/dist/parser/path-security.d.ts.map +1 -0
- package/dist/parser/path-security.js +183 -0
- package/dist/parser/path-security.js.map +1 -0
- package/dist/parser/rule-parser.d.ts +50 -0
- package/dist/parser/rule-parser.d.ts.map +1 -0
- package/dist/parser/rule-parser.js +203 -0
- package/dist/parser/rule-parser.js.map +1 -0
- package/dist/schemas/config.d.ts +202 -0
- package/dist/schemas/config.d.ts.map +1 -0
- package/dist/schemas/config.js +96 -0
- package/dist/schemas/config.js.map +1 -0
- package/dist/schemas/index.d.ts +3 -0
- package/dist/schemas/index.d.ts.map +1 -0
- package/dist/schemas/index.js +19 -0
- package/dist/schemas/index.js.map +1 -0
- package/dist/schemas/rule.d.ts +67 -0
- package/dist/schemas/rule.d.ts.map +1 -0
- package/dist/schemas/rule.js +44 -0
- package/dist/schemas/rule.js.map +1 -0
- package/package.json +69 -0
- package/templates/architecture.md +35 -0
- package/templates/bootstrap-prompt.md +242 -0
- package/templates/config.yaml +25 -0
- package/templates/project.md +44 -0
- package/templates/rules/example.md +36 -0
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* LLM Module
|
|
4
|
+
*
|
|
5
|
+
* Unified interface for LLM providers (API and CLI).
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.listProviderTypes = exports.autoSelectProvider = exports.detectProviders = exports.createProvider = exports.StdinProvider = exports.InteractiveProvider = exports.CodexCLIProvider = exports.CursorCLIProvider = exports.GeminiCLIProvider = exports.GeminiAPIProvider = exports.OpenAIAPIProvider = exports.ClaudeCodeProvider = exports.ClaudeAPIProvider = exports.BaseLLMProvider = void 0;
|
|
9
|
+
// Base
|
|
10
|
+
var base_provider_1 = require("./base-provider");
|
|
11
|
+
Object.defineProperty(exports, "BaseLLMProvider", { enumerable: true, get: function () { return base_provider_1.BaseLLMProvider; } });
|
|
12
|
+
// Providers
|
|
13
|
+
var claude_api_1 = require("./providers/claude-api");
|
|
14
|
+
Object.defineProperty(exports, "ClaudeAPIProvider", { enumerable: true, get: function () { return claude_api_1.ClaudeAPIProvider; } });
|
|
15
|
+
var claude_code_1 = require("./providers/claude-code");
|
|
16
|
+
Object.defineProperty(exports, "ClaudeCodeProvider", { enumerable: true, get: function () { return claude_code_1.ClaudeCodeProvider; } });
|
|
17
|
+
var openai_api_1 = require("./providers/openai-api");
|
|
18
|
+
Object.defineProperty(exports, "OpenAIAPIProvider", { enumerable: true, get: function () { return openai_api_1.OpenAIAPIProvider; } });
|
|
19
|
+
var gemini_api_1 = require("./providers/gemini-api");
|
|
20
|
+
Object.defineProperty(exports, "GeminiAPIProvider", { enumerable: true, get: function () { return gemini_api_1.GeminiAPIProvider; } });
|
|
21
|
+
var gemini_cli_1 = require("./providers/gemini-cli");
|
|
22
|
+
Object.defineProperty(exports, "GeminiCLIProvider", { enumerable: true, get: function () { return gemini_cli_1.GeminiCLIProvider; } });
|
|
23
|
+
var cursor_cli_1 = require("./providers/cursor-cli");
|
|
24
|
+
Object.defineProperty(exports, "CursorCLIProvider", { enumerable: true, get: function () { return cursor_cli_1.CursorCLIProvider; } });
|
|
25
|
+
var codex_cli_1 = require("./providers/codex-cli");
|
|
26
|
+
Object.defineProperty(exports, "CodexCLIProvider", { enumerable: true, get: function () { return codex_cli_1.CodexCLIProvider; } });
|
|
27
|
+
var interactive_1 = require("./providers/interactive");
|
|
28
|
+
Object.defineProperty(exports, "InteractiveProvider", { enumerable: true, get: function () { return interactive_1.InteractiveProvider; } });
|
|
29
|
+
Object.defineProperty(exports, "StdinProvider", { enumerable: true, get: function () { return interactive_1.StdinProvider; } });
|
|
30
|
+
// Factory
|
|
31
|
+
var provider_factory_1 = require("./provider-factory");
|
|
32
|
+
Object.defineProperty(exports, "createProvider", { enumerable: true, get: function () { return provider_factory_1.createProvider; } });
|
|
33
|
+
Object.defineProperty(exports, "detectProviders", { enumerable: true, get: function () { return provider_factory_1.detectProviders; } });
|
|
34
|
+
Object.defineProperty(exports, "autoSelectProvider", { enumerable: true, get: function () { return provider_factory_1.autoSelectProvider; } });
|
|
35
|
+
Object.defineProperty(exports, "listProviderTypes", { enumerable: true, get: function () { return provider_factory_1.listProviderTypes; } });
|
|
36
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/llm/index.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;AAeH,OAAO;AACP,iDAAkD;AAAzC,gHAAA,eAAe,OAAA;AAExB,YAAY;AACZ,qDAA2D;AAAlD,+GAAA,iBAAiB,OAAA;AAC1B,uDAA6D;AAApD,iHAAA,kBAAkB,OAAA;AAC3B,qDAA2D;AAAlD,+GAAA,iBAAiB,OAAA;AAC1B,qDAA2D;AAAlD,+GAAA,iBAAiB,OAAA;AAC1B,qDAA2D;AAAlD,+GAAA,iBAAiB,OAAA;AAC1B,qDAA2D;AAAlD,+GAAA,iBAAiB,OAAA;AAC1B,mDAAyD;AAAhD,6GAAA,gBAAgB,OAAA;AACzB,uDAA6E;AAApE,kHAAA,mBAAmB,OAAA;AAAE,4GAAA,aAAa,OAAA;AAE3C,UAAU;AACV,uDAK4B;AAJ1B,kHAAA,cAAc,OAAA;AACd,mHAAA,eAAe,OAAA;AACf,sHAAA,kBAAkB,OAAA;AAClB,qHAAA,iBAAiB,OAAA"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bootstrap Prompt Template
|
|
3
|
+
*
|
|
4
|
+
* Internal prompt for LLM to generate/enhance .context files.
|
|
5
|
+
* This is NOT saved to a file - it's used directly with the LLM provider.
|
|
6
|
+
*/
|
|
7
|
+
import { CodebaseAnalysis } from '../../cli/bootstrap';
|
|
8
|
+
/**
|
|
9
|
+
* System prompt for bootstrap operation
|
|
10
|
+
*/
|
|
11
|
+
export declare const BOOTSTRAP_SYSTEM_PROMPT = "You are an expert AI context engineer. Your task is to generate high-quality context files for AI coding assistants (Claude Code, Cursor, Codex).\n\n## Critical Philosophy\n\n### 1. Context Files are System Prompts, Not Documentation\nEvery line must be:\n- Machine-actionable, not human-readable prose\n- Concise, imperative, and unambiguous\n- High-value (context is limited real estate)\n\n### 2. LLM Cognitive Constraints\n- Lost in the middle: Transformers degrade attention mid-context\n- Saturation point: ~150-200 distinct instructions is practical limit\n- Relevance filtering: LLMs ignore context that appears irrelevant\n\n### 3. Never Use Context as a Linter\nLLMs are probabilistic. For deterministic rules (formatting, naming), use actual linters.\nReserve context for:\n- Architectural decisions\n- Workflow patterns\n- Domain-specific context\n- Things that can't be automated\n\n### 4. Progressive Disclosure\n- Root files act as map and index\n- Detailed docs live in subdirectories\n- Use referral: \"When modifying X, first read @path/to/detail.md\"\n\n## Output Format\n\nYou MUST respond with a valid JSON object in this exact structure:\n\n{\n \"projectMd\": \"# Project Content\\n...\",\n \"architectureMd\": \"# Architecture\\n...\",\n \"rules\": [\n {\n \"path\": \"rules/project-identity.md\",\n \"content\": \"---\\nid: project-identity\\n...\\n---\\n# Content\"\n }\n ],\n \"suggestions\": [\"Optional suggestions for the user\"]\n}\n\n## Rule File Format\n\nEach rule must have YAML frontmatter:\n\n```markdown\n---\nid: unique-rule-id\ndescription: Brief machine-readable description\nglobs:\n - \"**/*.ts\"\n - \"src/**/*\"\npriority: 50\ntags:\n - category\nalways_apply: false\n---\n\n# Rule Title\n\n[Dense, imperative instructions]\n\n## Section\n\n- Bullet points preferred\n- Each point is discrete instruction\n- Use code blocks for examples\n```\n\n## Writing Style\n\n1. Imperative voice: \"Use X\" not \"You should use X\"\n2. Dense: One instruction per line, no filler\n3. Specific: Include file paths where helpful\n4. Actionable: Every sentence changes behavior\n5. No prose: Use structured lists\n\n## Anti-Patterns to Avoid\n\n- Generic advice (\"write clean code\")\n- Duplicating linter rules\n- Long explanations of \"why\"\n- Vague instructions (\"be careful with X\")\n- Marketing language (\"elegant\", \"robust\")";
|
|
12
|
+
/**
|
|
13
|
+
* Build the user prompt with analysis data
|
|
14
|
+
*/
|
|
15
|
+
export declare function buildBootstrapUserPrompt(analysis: CodebaseAnalysis, existingContext?: {
|
|
16
|
+
projectMd?: string;
|
|
17
|
+
architectureMd?: string;
|
|
18
|
+
existingRules?: Array<{
|
|
19
|
+
path: string;
|
|
20
|
+
content: string;
|
|
21
|
+
}>;
|
|
22
|
+
}): string;
|
|
23
|
+
/**
|
|
24
|
+
* Build prompt for validating generated output
|
|
25
|
+
*/
|
|
26
|
+
export declare function buildValidationPrompt(generatedOutput: string, analysis: CodebaseAnalysis): string;
|
|
27
|
+
//# sourceMappingURL=bootstrap-prompt.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bootstrap-prompt.d.ts","sourceRoot":"","sources":["../../../src/llm/prompts/bootstrap-prompt.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAEvD;;GAEG;AACH,eAAO,MAAM,uBAAuB,41EAsFO,CAAC;AAE5C;;GAEG;AACH,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,gBAAgB,EAC1B,eAAe,CAAC,EAAE;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC1D,GACA,MAAM,CAmJR;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,eAAe,EAAE,MAAM,EACvB,QAAQ,EAAE,gBAAgB,GACzB,MAAM,CAiCR"}
|
|
@@ -0,0 +1,278 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Bootstrap Prompt Template
|
|
4
|
+
*
|
|
5
|
+
* Internal prompt for LLM to generate/enhance .context files.
|
|
6
|
+
* This is NOT saved to a file - it's used directly with the LLM provider.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.BOOTSTRAP_SYSTEM_PROMPT = void 0;
|
|
10
|
+
exports.buildBootstrapUserPrompt = buildBootstrapUserPrompt;
|
|
11
|
+
exports.buildValidationPrompt = buildValidationPrompt;
|
|
12
|
+
/**
|
|
13
|
+
* System prompt for bootstrap operation
|
|
14
|
+
*/
|
|
15
|
+
exports.BOOTSTRAP_SYSTEM_PROMPT = `You are an expert AI context engineer. Your task is to generate high-quality context files for AI coding assistants (Claude Code, Cursor, Codex).
|
|
16
|
+
|
|
17
|
+
## Critical Philosophy
|
|
18
|
+
|
|
19
|
+
### 1. Context Files are System Prompts, Not Documentation
|
|
20
|
+
Every line must be:
|
|
21
|
+
- Machine-actionable, not human-readable prose
|
|
22
|
+
- Concise, imperative, and unambiguous
|
|
23
|
+
- High-value (context is limited real estate)
|
|
24
|
+
|
|
25
|
+
### 2. LLM Cognitive Constraints
|
|
26
|
+
- Lost in the middle: Transformers degrade attention mid-context
|
|
27
|
+
- Saturation point: ~150-200 distinct instructions is practical limit
|
|
28
|
+
- Relevance filtering: LLMs ignore context that appears irrelevant
|
|
29
|
+
|
|
30
|
+
### 3. Never Use Context as a Linter
|
|
31
|
+
LLMs are probabilistic. For deterministic rules (formatting, naming), use actual linters.
|
|
32
|
+
Reserve context for:
|
|
33
|
+
- Architectural decisions
|
|
34
|
+
- Workflow patterns
|
|
35
|
+
- Domain-specific context
|
|
36
|
+
- Things that can't be automated
|
|
37
|
+
|
|
38
|
+
### 4. Progressive Disclosure
|
|
39
|
+
- Root files act as map and index
|
|
40
|
+
- Detailed docs live in subdirectories
|
|
41
|
+
- Use referral: "When modifying X, first read @path/to/detail.md"
|
|
42
|
+
|
|
43
|
+
## Output Format
|
|
44
|
+
|
|
45
|
+
You MUST respond with a valid JSON object in this exact structure:
|
|
46
|
+
|
|
47
|
+
{
|
|
48
|
+
"projectMd": "# Project Content\\n...",
|
|
49
|
+
"architectureMd": "# Architecture\\n...",
|
|
50
|
+
"rules": [
|
|
51
|
+
{
|
|
52
|
+
"path": "rules/project-identity.md",
|
|
53
|
+
"content": "---\\nid: project-identity\\n...\\n---\\n# Content"
|
|
54
|
+
}
|
|
55
|
+
],
|
|
56
|
+
"suggestions": ["Optional suggestions for the user"]
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
## Rule File Format
|
|
60
|
+
|
|
61
|
+
Each rule must have YAML frontmatter:
|
|
62
|
+
|
|
63
|
+
\`\`\`markdown
|
|
64
|
+
---
|
|
65
|
+
id: unique-rule-id
|
|
66
|
+
description: Brief machine-readable description
|
|
67
|
+
globs:
|
|
68
|
+
- "**/*.ts"
|
|
69
|
+
- "src/**/*"
|
|
70
|
+
priority: 50
|
|
71
|
+
tags:
|
|
72
|
+
- category
|
|
73
|
+
always_apply: false
|
|
74
|
+
---
|
|
75
|
+
|
|
76
|
+
# Rule Title
|
|
77
|
+
|
|
78
|
+
[Dense, imperative instructions]
|
|
79
|
+
|
|
80
|
+
## Section
|
|
81
|
+
|
|
82
|
+
- Bullet points preferred
|
|
83
|
+
- Each point is discrete instruction
|
|
84
|
+
- Use code blocks for examples
|
|
85
|
+
\`\`\`
|
|
86
|
+
|
|
87
|
+
## Writing Style
|
|
88
|
+
|
|
89
|
+
1. Imperative voice: "Use X" not "You should use X"
|
|
90
|
+
2. Dense: One instruction per line, no filler
|
|
91
|
+
3. Specific: Include file paths where helpful
|
|
92
|
+
4. Actionable: Every sentence changes behavior
|
|
93
|
+
5. No prose: Use structured lists
|
|
94
|
+
|
|
95
|
+
## Anti-Patterns to Avoid
|
|
96
|
+
|
|
97
|
+
- Generic advice ("write clean code")
|
|
98
|
+
- Duplicating linter rules
|
|
99
|
+
- Long explanations of "why"
|
|
100
|
+
- Vague instructions ("be careful with X")
|
|
101
|
+
- Marketing language ("elegant", "robust")`;
|
|
102
|
+
/**
|
|
103
|
+
* Build the user prompt with analysis data
|
|
104
|
+
*/
|
|
105
|
+
function buildBootstrapUserPrompt(analysis, existingContext) {
|
|
106
|
+
const sections = [];
|
|
107
|
+
// Project Analysis Section
|
|
108
|
+
sections.push(`# Project Analysis
|
|
109
|
+
|
|
110
|
+
**Project Name**: ${analysis.projectName}
|
|
111
|
+
**Primary Languages**: ${analysis.languages.map(l => `${l.name} (${l.percentage}%)`).join(', ') || 'Unknown'}
|
|
112
|
+
**Frameworks**: ${analysis.frameworks.join(', ') || 'None detected'}
|
|
113
|
+
**Build Tools**: ${analysis.buildTools.join(', ') || 'None detected'}
|
|
114
|
+
**Testing Tools**: ${analysis.testingTools.join(', ') || 'None detected'}
|
|
115
|
+
|
|
116
|
+
## Directory Structure
|
|
117
|
+
|
|
118
|
+
**Top-level directories**: ${analysis.structure.topLevel.join(', ') || 'None'}
|
|
119
|
+
**Source structure**: ${analysis.structure.srcStructure.length > 0 ? analysis.structure.srcStructure.map(d => `src/${d}`).join(', ') : 'Flat or no src/'}
|
|
120
|
+
**Has tests**: ${analysis.structure.hasTests ? 'Yes' : 'No'}
|
|
121
|
+
**Has docs**: ${analysis.structure.hasDocs ? 'Yes' : 'No'}`);
|
|
122
|
+
// Package Info Section
|
|
123
|
+
if (analysis.packageInfo) {
|
|
124
|
+
const pkg = analysis.packageInfo;
|
|
125
|
+
sections.push(`
|
|
126
|
+
## Package Information
|
|
127
|
+
|
|
128
|
+
**Type**: ${pkg.type}
|
|
129
|
+
**Description**: ${pkg.description || 'None'}
|
|
130
|
+
**Key Dependencies**: ${pkg.dependencies.slice(0, 20).join(', ')}${pkg.dependencies.length > 20 ? '...' : ''}
|
|
131
|
+
**Scripts**: ${Object.keys(pkg.scripts).join(', ') || 'None'}`);
|
|
132
|
+
}
|
|
133
|
+
// Existing Documentation
|
|
134
|
+
if (analysis.existingDocs.length > 0) {
|
|
135
|
+
sections.push(`
|
|
136
|
+
## Existing Documentation
|
|
137
|
+
|
|
138
|
+
The following documentation exists in the project:`);
|
|
139
|
+
for (const doc of analysis.existingDocs) {
|
|
140
|
+
sections.push(`
|
|
141
|
+
### ${doc.path} (${doc.type})
|
|
142
|
+
\`\`\`
|
|
143
|
+
${doc.excerpt}
|
|
144
|
+
\`\`\``);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
// Sample Code Files
|
|
148
|
+
if (analysis.sampleFiles.length > 0) {
|
|
149
|
+
sections.push(`
|
|
150
|
+
## Sample Code Files
|
|
151
|
+
|
|
152
|
+
These files represent the coding patterns in this project:`);
|
|
153
|
+
for (const sample of analysis.sampleFiles) {
|
|
154
|
+
sections.push(`
|
|
155
|
+
### ${sample.path} (${sample.language})
|
|
156
|
+
\`\`\`${sample.language.toLowerCase()}
|
|
157
|
+
${sample.content}
|
|
158
|
+
\`\`\``);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
// Existing Context (to preserve user edits)
|
|
162
|
+
if (existingContext) {
|
|
163
|
+
sections.push(`
|
|
164
|
+
## Existing Context Files (PRESERVE USER EDITS)
|
|
165
|
+
|
|
166
|
+
The user has already created/edited these files. Enhance them while preserving their custom content:`);
|
|
167
|
+
if (existingContext.projectMd) {
|
|
168
|
+
sections.push(`
|
|
169
|
+
### Current .context/project.md
|
|
170
|
+
\`\`\`markdown
|
|
171
|
+
${existingContext.projectMd}
|
|
172
|
+
\`\`\``);
|
|
173
|
+
}
|
|
174
|
+
if (existingContext.architectureMd) {
|
|
175
|
+
sections.push(`
|
|
176
|
+
### Current .context/architecture.md
|
|
177
|
+
\`\`\`markdown
|
|
178
|
+
${existingContext.architectureMd}
|
|
179
|
+
\`\`\``);
|
|
180
|
+
}
|
|
181
|
+
if (existingContext.existingRules && existingContext.existingRules.length > 0) {
|
|
182
|
+
sections.push(`
|
|
183
|
+
### Existing Rules (enhance, don't replace):`);
|
|
184
|
+
for (const rule of existingContext.existingRules) {
|
|
185
|
+
sections.push(`
|
|
186
|
+
#### ${rule.path}
|
|
187
|
+
\`\`\`markdown
|
|
188
|
+
${rule.content.slice(0, 1000)}${rule.content.length > 1000 ? '\n... (truncated)' : ''}
|
|
189
|
+
\`\`\``);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
// Task Instructions
|
|
194
|
+
sections.push(`
|
|
195
|
+
---
|
|
196
|
+
|
|
197
|
+
## Your Task
|
|
198
|
+
|
|
199
|
+
Generate context files for this project. Create:
|
|
200
|
+
|
|
201
|
+
### 1. Enhanced project.md
|
|
202
|
+
- One-line mission statement
|
|
203
|
+
- Accurate tech stack
|
|
204
|
+
- Key directories with purposes
|
|
205
|
+
- Common commands
|
|
206
|
+
${existingContext?.projectMd ? '- PRESERVE existing user content, enhance with detected info' : ''}
|
|
207
|
+
|
|
208
|
+
### 2. Enhanced architecture.md
|
|
209
|
+
- System overview
|
|
210
|
+
- Key components and their responsibilities
|
|
211
|
+
- Data flow patterns
|
|
212
|
+
- Important design decisions
|
|
213
|
+
${existingContext?.architectureMd ? '- PRESERVE existing user content, enhance with detected info' : ''}
|
|
214
|
+
|
|
215
|
+
### 3. Rules (create these if they don't exist, enhance if they do)
|
|
216
|
+
|
|
217
|
+
Required rules:
|
|
218
|
+
- \`rules/project-identity.md\` - Mission, tech stack, architecture style
|
|
219
|
+
- \`rules/architecture-map.md\` - Directory structure with purposes
|
|
220
|
+
- \`rules/commands.md\` - Build, test, lint, deploy commands
|
|
221
|
+
- \`rules/boundaries.md\` - Do-NOT rules and prohibitions
|
|
222
|
+
- \`rules/git-workflow.md\` - Commit, branch, PR conventions
|
|
223
|
+
|
|
224
|
+
Language-specific rules (based on detected languages):
|
|
225
|
+
${analysis.languages.slice(0, 3).map(l => `- \`rules/${l.name.toLowerCase()}-patterns.md\` - ${l.name} coding patterns`).join('\n')}
|
|
226
|
+
|
|
227
|
+
Directory-specific rules (for major directories):
|
|
228
|
+
${analysis.structure.srcStructure.slice(0, 5).map(d => `- \`rules/src/${d}.md\` - Rules specific to src/${d}/`).join('\n')}
|
|
229
|
+
|
|
230
|
+
### Important Guidelines
|
|
231
|
+
|
|
232
|
+
1. **Use valid glob patterns** in frontmatter (e.g., "src/**/*.ts", not "src/*.ts")
|
|
233
|
+
2. **Reference real files** - only mention files/dirs that exist
|
|
234
|
+
3. **Be specific to THIS project** - no generic advice
|
|
235
|
+
4. **Imperative style** - "Use X" not "You should use X"
|
|
236
|
+
5. **Dense content** - no filler, every line is actionable
|
|
237
|
+
|
|
238
|
+
Respond with JSON only. No markdown code blocks around the JSON.`);
|
|
239
|
+
return sections.join('\n');
|
|
240
|
+
}
|
|
241
|
+
/**
|
|
242
|
+
* Build prompt for validating generated output
|
|
243
|
+
*/
|
|
244
|
+
function buildValidationPrompt(generatedOutput, analysis) {
|
|
245
|
+
return `Review this generated context output for issues:
|
|
246
|
+
|
|
247
|
+
## Generated Output
|
|
248
|
+
${generatedOutput}
|
|
249
|
+
|
|
250
|
+
## Validation Checklist
|
|
251
|
+
|
|
252
|
+
1. **File References**: Do all @file references point to files that exist in the project?
|
|
253
|
+
- Known directories: ${analysis.structure.topLevel.join(', ')}
|
|
254
|
+
- Source structure: ${analysis.structure.srcStructure.join(', ')}
|
|
255
|
+
|
|
256
|
+
2. **Glob Patterns**: Are all glob patterns syntactically valid?
|
|
257
|
+
- Valid: "**/*.ts", "src/**/*", "*.md"
|
|
258
|
+
- Invalid: "src/*.ts" (missing **), "[invalid"
|
|
259
|
+
|
|
260
|
+
3. **Frontmatter**: Does each rule have valid YAML frontmatter with:
|
|
261
|
+
- id (string)
|
|
262
|
+
- description (string)
|
|
263
|
+
- globs (array of strings)
|
|
264
|
+
- priority (number 0-100)
|
|
265
|
+
|
|
266
|
+
4. **Content Quality**:
|
|
267
|
+
- Imperative style?
|
|
268
|
+
- Project-specific (not generic)?
|
|
269
|
+
- Dense and actionable?
|
|
270
|
+
|
|
271
|
+
Respond with JSON:
|
|
272
|
+
{
|
|
273
|
+
"valid": true/false,
|
|
274
|
+
"issues": ["issue 1", "issue 2"],
|
|
275
|
+
"suggestions": ["suggestion 1"]
|
|
276
|
+
}`;
|
|
277
|
+
}
|
|
278
|
+
//# sourceMappingURL=bootstrap-prompt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bootstrap-prompt.js","sourceRoot":"","sources":["../../../src/llm/prompts/bootstrap-prompt.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/llm/prompts/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,uBAAuB,EACvB,wBAAwB,EACxB,qBAAqB,GACtB,MAAM,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* LLM Prompts Module
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.buildValidationPrompt = exports.buildBootstrapUserPrompt = exports.BOOTSTRAP_SYSTEM_PROMPT = void 0;
|
|
7
|
+
var bootstrap_prompt_1 = require("./bootstrap-prompt");
|
|
8
|
+
Object.defineProperty(exports, "BOOTSTRAP_SYSTEM_PROMPT", { enumerable: true, get: function () { return bootstrap_prompt_1.BOOTSTRAP_SYSTEM_PROMPT; } });
|
|
9
|
+
Object.defineProperty(exports, "buildBootstrapUserPrompt", { enumerable: true, get: function () { return bootstrap_prompt_1.buildBootstrapUserPrompt; } });
|
|
10
|
+
Object.defineProperty(exports, "buildValidationPrompt", { enumerable: true, get: function () { return bootstrap_prompt_1.buildValidationPrompt; } });
|
|
11
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/llm/prompts/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAEH,uDAI4B;AAH1B,2HAAA,uBAAuB,OAAA;AACvB,4HAAA,wBAAwB,OAAA;AACxB,yHAAA,qBAAqB,OAAA"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LLM Provider Factory
|
|
3
|
+
*
|
|
4
|
+
* Creates and manages LLM providers with auto-detection capabilities.
|
|
5
|
+
*/
|
|
6
|
+
import { LLMProvider, LLMProviderType, LLMProviderConfig, ProviderDetectionResult } from './types';
|
|
7
|
+
/**
|
|
8
|
+
* Create a provider instance
|
|
9
|
+
*/
|
|
10
|
+
export declare function createProvider(type: LLMProviderType, config?: Partial<LLMProviderConfig>): LLMProvider;
|
|
11
|
+
/**
|
|
12
|
+
* Detect all available providers
|
|
13
|
+
*/
|
|
14
|
+
export declare function detectProviders(): Promise<ProviderDetectionResult>;
|
|
15
|
+
/**
|
|
16
|
+
* Auto-select the best available provider
|
|
17
|
+
*/
|
|
18
|
+
export declare function autoSelectProvider(preferredType?: LLMProviderType): Promise<LLMProvider>;
|
|
19
|
+
/**
|
|
20
|
+
* List all supported provider types with descriptions
|
|
21
|
+
*/
|
|
22
|
+
export declare function listProviderTypes(): Array<{
|
|
23
|
+
type: LLMProviderType;
|
|
24
|
+
name: string;
|
|
25
|
+
description: string;
|
|
26
|
+
}>;
|
|
27
|
+
//# sourceMappingURL=provider-factory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider-factory.d.ts","sourceRoot":"","sources":["../../src/llm/provider-factory.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,WAAW,EACX,eAAe,EACf,iBAAiB,EACjB,uBAAuB,EACxB,MAAM,SAAS,CAAC;AAyBjB;;GAEG;AACH,wBAAgB,cAAc,CAC5B,IAAI,EAAE,eAAe,EACrB,MAAM,GAAE,OAAO,CAAC,iBAAiB,CAAM,GACtC,WAAW,CA8Bb;AAED;;GAEG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,uBAAuB,CAAC,CAqDxE;AA4BD;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,aAAa,CAAC,EAAE,eAAe,GAC9B,OAAO,CAAC,WAAW,CAAC,CA2BtB;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,KAAK,CAAC;IACzC,IAAI,EAAE,eAAe,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC,CA2CD"}
|
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* LLM Provider Factory
|
|
4
|
+
*
|
|
5
|
+
* Creates and manages LLM providers with auto-detection capabilities.
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.createProvider = createProvider;
|
|
9
|
+
exports.detectProviders = detectProviders;
|
|
10
|
+
exports.autoSelectProvider = autoSelectProvider;
|
|
11
|
+
exports.listProviderTypes = listProviderTypes;
|
|
12
|
+
const claude_api_1 = require("./providers/claude-api");
|
|
13
|
+
const claude_code_1 = require("./providers/claude-code");
|
|
14
|
+
const openai_api_1 = require("./providers/openai-api");
|
|
15
|
+
const gemini_api_1 = require("./providers/gemini-api");
|
|
16
|
+
const gemini_cli_1 = require("./providers/gemini-cli");
|
|
17
|
+
const cursor_cli_1 = require("./providers/cursor-cli");
|
|
18
|
+
const codex_cli_1 = require("./providers/codex-cli");
|
|
19
|
+
const interactive_1 = require("./providers/interactive");
|
|
20
|
+
/**
|
|
21
|
+
* Provider priority order for auto-detection
|
|
22
|
+
* Higher priority providers are preferred when multiple are available
|
|
23
|
+
*/
|
|
24
|
+
const PROVIDER_PRIORITY = [
|
|
25
|
+
'claude-code', // Prefer local CLI tools first
|
|
26
|
+
'cursor',
|
|
27
|
+
'codex',
|
|
28
|
+
'gemini-cli',
|
|
29
|
+
'claude-api', // Then APIs
|
|
30
|
+
'openai-api',
|
|
31
|
+
'gemini-api',
|
|
32
|
+
'interactive', // Fallback to manual
|
|
33
|
+
];
|
|
34
|
+
/**
|
|
35
|
+
* Create a provider instance
|
|
36
|
+
*/
|
|
37
|
+
function createProvider(type, config = {}) {
|
|
38
|
+
const fullConfig = {
|
|
39
|
+
type,
|
|
40
|
+
...config,
|
|
41
|
+
};
|
|
42
|
+
switch (type) {
|
|
43
|
+
case 'claude-api':
|
|
44
|
+
return new claude_api_1.ClaudeAPIProvider(fullConfig);
|
|
45
|
+
case 'claude-code':
|
|
46
|
+
return new claude_code_1.ClaudeCodeProvider(fullConfig);
|
|
47
|
+
case 'openai-api':
|
|
48
|
+
return new openai_api_1.OpenAIAPIProvider(fullConfig);
|
|
49
|
+
case 'gemini-api':
|
|
50
|
+
return new gemini_api_1.GeminiAPIProvider(fullConfig);
|
|
51
|
+
case 'gemini-cli':
|
|
52
|
+
return new gemini_cli_1.GeminiCLIProvider(fullConfig);
|
|
53
|
+
case 'cursor':
|
|
54
|
+
return new cursor_cli_1.CursorCLIProvider(fullConfig);
|
|
55
|
+
case 'codex':
|
|
56
|
+
return new codex_cli_1.CodexCLIProvider(fullConfig);
|
|
57
|
+
case 'interactive':
|
|
58
|
+
// Choose between interactive and stdin based on TTY
|
|
59
|
+
if (process.stdin.isTTY) {
|
|
60
|
+
return new interactive_1.InteractiveProvider(fullConfig);
|
|
61
|
+
}
|
|
62
|
+
return new interactive_1.StdinProvider(fullConfig);
|
|
63
|
+
default:
|
|
64
|
+
throw new Error(`Unknown provider type: ${type}`);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Detect all available providers
|
|
69
|
+
*/
|
|
70
|
+
async function detectProviders() {
|
|
71
|
+
const details = {};
|
|
72
|
+
const available = [];
|
|
73
|
+
// Check all provider types
|
|
74
|
+
const allTypes = [
|
|
75
|
+
'claude-api',
|
|
76
|
+
'claude-code',
|
|
77
|
+
'openai-api',
|
|
78
|
+
'gemini-api',
|
|
79
|
+
'gemini-cli',
|
|
80
|
+
'cursor',
|
|
81
|
+
'codex',
|
|
82
|
+
'interactive',
|
|
83
|
+
];
|
|
84
|
+
await Promise.all(allTypes.map(async (type) => {
|
|
85
|
+
try {
|
|
86
|
+
const provider = createProvider(type);
|
|
87
|
+
const isAvailable = await provider.isAvailable();
|
|
88
|
+
details[type] = {
|
|
89
|
+
available: isAvailable,
|
|
90
|
+
reason: isAvailable ? undefined : getUnavailableReason(type),
|
|
91
|
+
};
|
|
92
|
+
if (isAvailable) {
|
|
93
|
+
available.push(type);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
catch (error) {
|
|
97
|
+
details[type] = {
|
|
98
|
+
available: false,
|
|
99
|
+
reason: error.message,
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
}));
|
|
103
|
+
// Determine recommended provider based on priority
|
|
104
|
+
let recommended = null;
|
|
105
|
+
for (const type of PROVIDER_PRIORITY) {
|
|
106
|
+
if (available.includes(type)) {
|
|
107
|
+
recommended = type;
|
|
108
|
+
break;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
return {
|
|
112
|
+
available,
|
|
113
|
+
recommended,
|
|
114
|
+
details,
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Get reason why a provider is unavailable
|
|
119
|
+
*/
|
|
120
|
+
function getUnavailableReason(type) {
|
|
121
|
+
switch (type) {
|
|
122
|
+
case 'claude-api':
|
|
123
|
+
return 'ANTHROPIC_API_KEY environment variable not set';
|
|
124
|
+
case 'claude-code':
|
|
125
|
+
return 'claude CLI not found in PATH';
|
|
126
|
+
case 'openai-api':
|
|
127
|
+
return 'OPENAI_API_KEY environment variable not set';
|
|
128
|
+
case 'gemini-api':
|
|
129
|
+
return 'GOOGLE_API_KEY or GEMINI_API_KEY environment variable not set';
|
|
130
|
+
case 'gemini-cli':
|
|
131
|
+
return 'gemini CLI not found in PATH';
|
|
132
|
+
case 'cursor':
|
|
133
|
+
return 'cursor CLI not found in PATH';
|
|
134
|
+
case 'codex':
|
|
135
|
+
return 'codex CLI not found in PATH';
|
|
136
|
+
case 'interactive':
|
|
137
|
+
return 'No TTY available for interactive input';
|
|
138
|
+
default:
|
|
139
|
+
return 'Unknown reason';
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Auto-select the best available provider
|
|
144
|
+
*/
|
|
145
|
+
async function autoSelectProvider(preferredType) {
|
|
146
|
+
// If preferred type specified, try it first
|
|
147
|
+
if (preferredType) {
|
|
148
|
+
const provider = createProvider(preferredType);
|
|
149
|
+
if (await provider.isAvailable()) {
|
|
150
|
+
return provider;
|
|
151
|
+
}
|
|
152
|
+
throw new Error(`Preferred provider '${preferredType}' is not available: ${getUnavailableReason(preferredType)}`);
|
|
153
|
+
}
|
|
154
|
+
// Auto-detect
|
|
155
|
+
const detection = await detectProviders();
|
|
156
|
+
if (!detection.recommended) {
|
|
157
|
+
throw new Error('No LLM provider available. Please set up one of:\n' +
|
|
158
|
+
' - ANTHROPIC_API_KEY for Claude API\n' +
|
|
159
|
+
' - Install claude CLI for Claude Code\n' +
|
|
160
|
+
' - OPENAI_API_KEY for OpenAI API\n' +
|
|
161
|
+
' - GOOGLE_API_KEY for Gemini API\n' +
|
|
162
|
+
' - Install cursor, codex, or gemini CLI');
|
|
163
|
+
}
|
|
164
|
+
return createProvider(detection.recommended);
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* List all supported provider types with descriptions
|
|
168
|
+
*/
|
|
169
|
+
function listProviderTypes() {
|
|
170
|
+
return [
|
|
171
|
+
{
|
|
172
|
+
type: 'claude-api',
|
|
173
|
+
name: 'Claude API',
|
|
174
|
+
description: 'Anthropic Claude API (requires ANTHROPIC_API_KEY)',
|
|
175
|
+
},
|
|
176
|
+
{
|
|
177
|
+
type: 'claude-code',
|
|
178
|
+
name: 'Claude Code',
|
|
179
|
+
description: 'Claude Code CLI tool (requires claude in PATH)',
|
|
180
|
+
},
|
|
181
|
+
{
|
|
182
|
+
type: 'openai-api',
|
|
183
|
+
name: 'OpenAI API',
|
|
184
|
+
description: 'OpenAI GPT API (requires OPENAI_API_KEY)',
|
|
185
|
+
},
|
|
186
|
+
{
|
|
187
|
+
type: 'gemini-api',
|
|
188
|
+
name: 'Gemini API',
|
|
189
|
+
description: 'Google Gemini API (requires GOOGLE_API_KEY)',
|
|
190
|
+
},
|
|
191
|
+
{
|
|
192
|
+
type: 'gemini-cli',
|
|
193
|
+
name: 'Gemini CLI',
|
|
194
|
+
description: 'Google Gemini CLI tool (requires gemini in PATH)',
|
|
195
|
+
},
|
|
196
|
+
{
|
|
197
|
+
type: 'cursor',
|
|
198
|
+
name: 'Cursor',
|
|
199
|
+
description: 'Cursor IDE CLI (requires cursor in PATH)',
|
|
200
|
+
},
|
|
201
|
+
{
|
|
202
|
+
type: 'codex',
|
|
203
|
+
name: 'Codex/Copilot',
|
|
204
|
+
description: 'OpenAI Codex or GitHub Copilot CLI',
|
|
205
|
+
},
|
|
206
|
+
{
|
|
207
|
+
type: 'interactive',
|
|
208
|
+
name: 'Interactive',
|
|
209
|
+
description: 'Manual copy/paste mode (always available with TTY)',
|
|
210
|
+
},
|
|
211
|
+
];
|
|
212
|
+
}
|
|
213
|
+
//# sourceMappingURL=provider-factory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider-factory.js","sourceRoot":"","sources":["../../src/llm/provider-factory.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Claude API Provider
|
|
3
|
+
*
|
|
4
|
+
* Uses Anthropic's Claude API directly via HTTP.
|
|
5
|
+
*/
|
|
6
|
+
import { LLMProviderType, LLMProviderConfig, LLMProviderCapabilities, LLMRequest, LLMResponse } from '../types';
|
|
7
|
+
import { BaseLLMProvider } from '../base-provider';
|
|
8
|
+
/**
|
|
9
|
+
* Claude API provider implementation
|
|
10
|
+
*/
|
|
11
|
+
export declare class ClaudeAPIProvider extends BaseLLMProvider {
|
|
12
|
+
private static readonly API_URL;
|
|
13
|
+
private static readonly DEFAULT_MODEL;
|
|
14
|
+
constructor(config: LLMProviderConfig);
|
|
15
|
+
get type(): LLMProviderType;
|
|
16
|
+
get name(): string;
|
|
17
|
+
get capabilities(): LLMProviderCapabilities;
|
|
18
|
+
isAvailable(): Promise<boolean>;
|
|
19
|
+
complete(request: LLMRequest): Promise<LLMResponse>;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=claude-api.d.ts.map
|