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.
Files changed (221) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +484 -0
  3. package/bin/ctx.js +3 -0
  4. package/dist/analysis/index.d.ts +2 -0
  5. package/dist/analysis/index.d.ts.map +1 -0
  6. package/dist/analysis/index.js +18 -0
  7. package/dist/analysis/index.js.map +1 -0
  8. package/dist/analysis/static-analysis.d.ts +79 -0
  9. package/dist/analysis/static-analysis.d.ts.map +1 -0
  10. package/dist/analysis/static-analysis.js +279 -0
  11. package/dist/analysis/static-analysis.js.map +1 -0
  12. package/dist/bootstrap/index.d.ts +8 -0
  13. package/dist/bootstrap/index.d.ts.map +1 -0
  14. package/dist/bootstrap/index.js +13 -0
  15. package/dist/bootstrap/index.js.map +1 -0
  16. package/dist/bootstrap/orchestrator.d.ts +48 -0
  17. package/dist/bootstrap/orchestrator.d.ts.map +1 -0
  18. package/dist/bootstrap/orchestrator.js +363 -0
  19. package/dist/bootstrap/orchestrator.js.map +1 -0
  20. package/dist/bootstrap/validator.d.ts +25 -0
  21. package/dist/bootstrap/validator.d.ts.map +1 -0
  22. package/dist/bootstrap/validator.js +412 -0
  23. package/dist/bootstrap/validator.js.map +1 -0
  24. package/dist/build/atomic.d.ts +74 -0
  25. package/dist/build/atomic.d.ts.map +1 -0
  26. package/dist/build/atomic.js +235 -0
  27. package/dist/build/atomic.js.map +1 -0
  28. package/dist/build/index.d.ts +10 -0
  29. package/dist/build/index.d.ts.map +1 -0
  30. package/dist/build/index.js +26 -0
  31. package/dist/build/index.js.map +1 -0
  32. package/dist/build/lock.d.ts +102 -0
  33. package/dist/build/lock.d.ts.map +1 -0
  34. package/dist/build/lock.js +297 -0
  35. package/dist/build/lock.js.map +1 -0
  36. package/dist/build/manifest.d.ts +138 -0
  37. package/dist/build/manifest.d.ts.map +1 -0
  38. package/dist/build/manifest.js +269 -0
  39. package/dist/build/manifest.js.map +1 -0
  40. package/dist/build/orchestrator.d.ts +103 -0
  41. package/dist/build/orchestrator.d.ts.map +1 -0
  42. package/dist/build/orchestrator.js +524 -0
  43. package/dist/build/orchestrator.js.map +1 -0
  44. package/dist/cli/bootstrap.d.ts +77 -0
  45. package/dist/cli/bootstrap.d.ts.map +1 -0
  46. package/dist/cli/bootstrap.js +527 -0
  47. package/dist/cli/bootstrap.js.map +1 -0
  48. package/dist/cli/build.d.ts +32 -0
  49. package/dist/cli/build.d.ts.map +1 -0
  50. package/dist/cli/build.js +156 -0
  51. package/dist/cli/build.js.map +1 -0
  52. package/dist/cli/diff.d.ts +23 -0
  53. package/dist/cli/diff.d.ts.map +1 -0
  54. package/dist/cli/diff.js +226 -0
  55. package/dist/cli/diff.js.map +1 -0
  56. package/dist/cli/hooks.d.ts +29 -0
  57. package/dist/cli/hooks.d.ts.map +1 -0
  58. package/dist/cli/hooks.js +176 -0
  59. package/dist/cli/hooks.js.map +1 -0
  60. package/dist/cli/init.d.ts +53 -0
  61. package/dist/cli/init.d.ts.map +1 -0
  62. package/dist/cli/init.js +254 -0
  63. package/dist/cli/init.js.map +1 -0
  64. package/dist/cli/lint.d.ts +46 -0
  65. package/dist/cli/lint.d.ts.map +1 -0
  66. package/dist/cli/lint.js +210 -0
  67. package/dist/cli/lint.js.map +1 -0
  68. package/dist/cli/migrate.d.ts +28 -0
  69. package/dist/cli/migrate.d.ts.map +1 -0
  70. package/dist/cli/migrate.js +350 -0
  71. package/dist/cli/migrate.js.map +1 -0
  72. package/dist/cli/verify.d.ts +21 -0
  73. package/dist/cli/verify.d.ts.map +1 -0
  74. package/dist/cli/verify.js +209 -0
  75. package/dist/cli/verify.js.map +1 -0
  76. package/dist/cli.d.ts +8 -0
  77. package/dist/cli.d.ts.map +1 -0
  78. package/dist/cli.js +262 -0
  79. package/dist/cli.js.map +1 -0
  80. package/dist/compiler/agents-compiler.d.ts +24 -0
  81. package/dist/compiler/agents-compiler.d.ts.map +1 -0
  82. package/dist/compiler/agents-compiler.js +192 -0
  83. package/dist/compiler/agents-compiler.js.map +1 -0
  84. package/dist/compiler/base-compiler.d.ts +152 -0
  85. package/dist/compiler/base-compiler.d.ts.map +1 -0
  86. package/dist/compiler/base-compiler.js +180 -0
  87. package/dist/compiler/base-compiler.js.map +1 -0
  88. package/dist/compiler/claude-compiler.d.ts +24 -0
  89. package/dist/compiler/claude-compiler.d.ts.map +1 -0
  90. package/dist/compiler/claude-compiler.js +182 -0
  91. package/dist/compiler/claude-compiler.js.map +1 -0
  92. package/dist/compiler/cursor-compiler.d.ts +33 -0
  93. package/dist/compiler/cursor-compiler.d.ts.map +1 -0
  94. package/dist/compiler/cursor-compiler.js +136 -0
  95. package/dist/compiler/cursor-compiler.js.map +1 -0
  96. package/dist/compiler/index.d.ts +7 -0
  97. package/dist/compiler/index.d.ts.map +1 -0
  98. package/dist/compiler/index.js +24 -0
  99. package/dist/compiler/index.js.map +1 -0
  100. package/dist/compiler/rule-selector.d.ts +115 -0
  101. package/dist/compiler/rule-selector.d.ts.map +1 -0
  102. package/dist/compiler/rule-selector.js +273 -0
  103. package/dist/compiler/rule-selector.js.map +1 -0
  104. package/dist/compiler/token-estimator.d.ts +74 -0
  105. package/dist/compiler/token-estimator.d.ts.map +1 -0
  106. package/dist/compiler/token-estimator.js +191 -0
  107. package/dist/compiler/token-estimator.js.map +1 -0
  108. package/dist/config/index.d.ts +2 -0
  109. package/dist/config/index.d.ts.map +1 -0
  110. package/dist/config/index.js +18 -0
  111. package/dist/config/index.js.map +1 -0
  112. package/dist/config/loader.d.ts +48 -0
  113. package/dist/config/loader.d.ts.map +1 -0
  114. package/dist/config/loader.js +175 -0
  115. package/dist/config/loader.js.map +1 -0
  116. package/dist/git/gitignore.d.ts +59 -0
  117. package/dist/git/gitignore.d.ts.map +1 -0
  118. package/dist/git/gitignore.js +268 -0
  119. package/dist/git/gitignore.js.map +1 -0
  120. package/dist/git/hooks.d.ts +34 -0
  121. package/dist/git/hooks.d.ts.map +1 -0
  122. package/dist/git/hooks.js +129 -0
  123. package/dist/git/hooks.js.map +1 -0
  124. package/dist/git/husky.d.ts +52 -0
  125. package/dist/git/husky.d.ts.map +1 -0
  126. package/dist/git/husky.js +219 -0
  127. package/dist/git/husky.js.map +1 -0
  128. package/dist/git/index.d.ts +9 -0
  129. package/dist/git/index.d.ts.map +1 -0
  130. package/dist/git/index.js +15 -0
  131. package/dist/git/index.js.map +1 -0
  132. package/dist/index.d.ts +6 -0
  133. package/dist/index.d.ts.map +1 -0
  134. package/dist/index.js +23 -0
  135. package/dist/index.js.map +1 -0
  136. package/dist/llm/base-provider.d.ts +43 -0
  137. package/dist/llm/base-provider.d.ts.map +1 -0
  138. package/dist/llm/base-provider.js +91 -0
  139. package/dist/llm/base-provider.js.map +1 -0
  140. package/dist/llm/index.d.ts +17 -0
  141. package/dist/llm/index.d.ts.map +1 -0
  142. package/dist/llm/index.js +36 -0
  143. package/dist/llm/index.js.map +1 -0
  144. package/dist/llm/prompts/bootstrap-prompt.d.ts +27 -0
  145. package/dist/llm/prompts/bootstrap-prompt.d.ts.map +1 -0
  146. package/dist/llm/prompts/bootstrap-prompt.js +278 -0
  147. package/dist/llm/prompts/bootstrap-prompt.js.map +1 -0
  148. package/dist/llm/prompts/index.d.ts +5 -0
  149. package/dist/llm/prompts/index.d.ts.map +1 -0
  150. package/dist/llm/prompts/index.js +11 -0
  151. package/dist/llm/prompts/index.js.map +1 -0
  152. package/dist/llm/provider-factory.d.ts +27 -0
  153. package/dist/llm/provider-factory.d.ts.map +1 -0
  154. package/dist/llm/provider-factory.js +213 -0
  155. package/dist/llm/provider-factory.js.map +1 -0
  156. package/dist/llm/providers/claude-api.d.ts +21 -0
  157. package/dist/llm/providers/claude-api.d.ts.map +1 -0
  158. package/dist/llm/providers/claude-api.js +110 -0
  159. package/dist/llm/providers/claude-api.js.map +1 -0
  160. package/dist/llm/providers/claude-code.d.ts +21 -0
  161. package/dist/llm/providers/claude-code.d.ts.map +1 -0
  162. package/dist/llm/providers/claude-code.js +120 -0
  163. package/dist/llm/providers/claude-code.js.map +1 -0
  164. package/dist/llm/providers/codex-cli.d.ts +25 -0
  165. package/dist/llm/providers/codex-cli.d.ts.map +1 -0
  166. package/dist/llm/providers/codex-cli.js +129 -0
  167. package/dist/llm/providers/codex-cli.js.map +1 -0
  168. package/dist/llm/providers/cursor-cli.d.ts +24 -0
  169. package/dist/llm/providers/cursor-cli.d.ts.map +1 -0
  170. package/dist/llm/providers/cursor-cli.js +106 -0
  171. package/dist/llm/providers/cursor-cli.js.map +1 -0
  172. package/dist/llm/providers/gemini-api.d.ts +20 -0
  173. package/dist/llm/providers/gemini-api.d.ts.map +1 -0
  174. package/dist/llm/providers/gemini-api.js +121 -0
  175. package/dist/llm/providers/gemini-api.js.map +1 -0
  176. package/dist/llm/providers/gemini-cli.d.ts +20 -0
  177. package/dist/llm/providers/gemini-cli.d.ts.map +1 -0
  178. package/dist/llm/providers/gemini-cli.js +109 -0
  179. package/dist/llm/providers/gemini-cli.js.map +1 -0
  180. package/dist/llm/providers/interactive.d.ts +42 -0
  181. package/dist/llm/providers/interactive.d.ts.map +1 -0
  182. package/dist/llm/providers/interactive.js +200 -0
  183. package/dist/llm/providers/interactive.js.map +1 -0
  184. package/dist/llm/providers/openai-api.d.ts +21 -0
  185. package/dist/llm/providers/openai-api.d.ts.map +1 -0
  186. package/dist/llm/providers/openai-api.js +107 -0
  187. package/dist/llm/providers/openai-api.js.map +1 -0
  188. package/dist/llm/types.d.ts +128 -0
  189. package/dist/llm/types.d.ts.map +1 -0
  190. package/dist/llm/types.js +8 -0
  191. package/dist/llm/types.js.map +1 -0
  192. package/dist/parser/index.d.ts +3 -0
  193. package/dist/parser/index.d.ts.map +1 -0
  194. package/dist/parser/index.js +19 -0
  195. package/dist/parser/index.js.map +1 -0
  196. package/dist/parser/path-security.d.ts +40 -0
  197. package/dist/parser/path-security.d.ts.map +1 -0
  198. package/dist/parser/path-security.js +183 -0
  199. package/dist/parser/path-security.js.map +1 -0
  200. package/dist/parser/rule-parser.d.ts +50 -0
  201. package/dist/parser/rule-parser.d.ts.map +1 -0
  202. package/dist/parser/rule-parser.js +203 -0
  203. package/dist/parser/rule-parser.js.map +1 -0
  204. package/dist/schemas/config.d.ts +202 -0
  205. package/dist/schemas/config.d.ts.map +1 -0
  206. package/dist/schemas/config.js +96 -0
  207. package/dist/schemas/config.js.map +1 -0
  208. package/dist/schemas/index.d.ts +3 -0
  209. package/dist/schemas/index.d.ts.map +1 -0
  210. package/dist/schemas/index.js +19 -0
  211. package/dist/schemas/index.js.map +1 -0
  212. package/dist/schemas/rule.d.ts +67 -0
  213. package/dist/schemas/rule.d.ts.map +1 -0
  214. package/dist/schemas/rule.js +44 -0
  215. package/dist/schemas/rule.js.map +1 -0
  216. package/package.json +69 -0
  217. package/templates/architecture.md +35 -0
  218. package/templates/bootstrap-prompt.md +242 -0
  219. package/templates/config.yaml +25 -0
  220. package/templates/project.md +44 -0
  221. 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,5 @@
1
+ /**
2
+ * LLM Prompts Module
3
+ */
4
+ export { BOOTSTRAP_SYSTEM_PROMPT, buildBootstrapUserPrompt, buildValidationPrompt, } from './bootstrap-prompt';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -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