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,129 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Git Hooks Generator
|
|
4
|
+
*
|
|
5
|
+
* Generates pre-commit hook scripts for ctx integration.
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.generatePreCommitHook = generatePreCommitHook;
|
|
9
|
+
exports.generateStandalonePreCommitHook = generateStandalonePreCommitHook;
|
|
10
|
+
exports.getAutoStagedFiles = getAutoStagedFiles;
|
|
11
|
+
/**
|
|
12
|
+
* Generate pre-commit hook script content
|
|
13
|
+
*/
|
|
14
|
+
function generatePreCommitHook(options = {}) {
|
|
15
|
+
const { incremental = true, autoStage = true, skipValidation = false, verbose = false, quiet = false, } = options;
|
|
16
|
+
// Build the ctx command
|
|
17
|
+
const cmdParts = ['npx ctx build'];
|
|
18
|
+
if (incremental)
|
|
19
|
+
cmdParts.push('--incremental');
|
|
20
|
+
if (skipValidation)
|
|
21
|
+
cmdParts.push('--skip-validation');
|
|
22
|
+
if (verbose)
|
|
23
|
+
cmdParts.push('--verbose');
|
|
24
|
+
if (quiet)
|
|
25
|
+
cmdParts.push('--quiet');
|
|
26
|
+
const ctxCommand = cmdParts.join(' ');
|
|
27
|
+
// Generate the hook script
|
|
28
|
+
const script = `#!/usr/bin/env sh
|
|
29
|
+
. "$(dirname -- "$0")/_/husky.sh"
|
|
30
|
+
|
|
31
|
+
# ctx pre-commit hook
|
|
32
|
+
# Automatically builds context files and stages them for commit
|
|
33
|
+
|
|
34
|
+
# Run ctx build
|
|
35
|
+
${ctxCommand}
|
|
36
|
+
BUILD_EXIT_CODE=$?
|
|
37
|
+
|
|
38
|
+
# Check if build succeeded
|
|
39
|
+
if [ $BUILD_EXIT_CODE -ne 0 ]; then
|
|
40
|
+
echo ""
|
|
41
|
+
echo "❌ ctx build failed with exit code $BUILD_EXIT_CODE"
|
|
42
|
+
echo ""
|
|
43
|
+
if [ $BUILD_EXIT_CODE -eq 1 ]; then
|
|
44
|
+
echo " Validation errors found. Fix the issues above and try again."
|
|
45
|
+
elif [ $BUILD_EXIT_CODE -eq 2 ]; then
|
|
46
|
+
echo " Runtime error occurred. Check the error message above."
|
|
47
|
+
fi
|
|
48
|
+
echo ""
|
|
49
|
+
exit $BUILD_EXIT_CODE
|
|
50
|
+
fi
|
|
51
|
+
|
|
52
|
+
${autoStage
|
|
53
|
+
? `# Stage compiled outputs (including deletions)
|
|
54
|
+
STAGED_ANY=0
|
|
55
|
+
|
|
56
|
+
# Stage CLAUDE.md
|
|
57
|
+
if [ -f "CLAUDE.md" ]; then
|
|
58
|
+
git add -A "CLAUDE.md"
|
|
59
|
+
STAGED_ANY=1
|
|
60
|
+
fi
|
|
61
|
+
|
|
62
|
+
# Stage AGENTS.md
|
|
63
|
+
if [ -f "AGENTS.md" ]; then
|
|
64
|
+
git add -A "AGENTS.md"
|
|
65
|
+
STAGED_ANY=1
|
|
66
|
+
fi
|
|
67
|
+
|
|
68
|
+
# Stage .cursor/rules (handles additions/modifications/deletions)
|
|
69
|
+
if [ -d ".cursor/rules" ]; then
|
|
70
|
+
git add -A ".cursor/rules"
|
|
71
|
+
STAGED_ANY=1
|
|
72
|
+
fi
|
|
73
|
+
|
|
74
|
+
if [ $STAGED_ANY -eq 1 ]; then
|
|
75
|
+
${!quiet ? 'echo "✅ Staged compiled context files"' : ''}
|
|
76
|
+
fi`
|
|
77
|
+
: '# Auto-staging disabled'}
|
|
78
|
+
|
|
79
|
+
exit 0
|
|
80
|
+
`;
|
|
81
|
+
return script;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Generate a minimal pre-commit hook (without husky.sh sourcing)
|
|
85
|
+
* For use in non-husky setups
|
|
86
|
+
*/
|
|
87
|
+
function generateStandalonePreCommitHook(options = {}) {
|
|
88
|
+
const { incremental = true, autoStage = true, skipValidation = false, verbose = false, quiet = false, } = options;
|
|
89
|
+
// Build the ctx command
|
|
90
|
+
const cmdParts = ['npx ctx build'];
|
|
91
|
+
if (incremental)
|
|
92
|
+
cmdParts.push('--incremental');
|
|
93
|
+
if (skipValidation)
|
|
94
|
+
cmdParts.push('--skip-validation');
|
|
95
|
+
if (verbose)
|
|
96
|
+
cmdParts.push('--verbose');
|
|
97
|
+
if (quiet)
|
|
98
|
+
cmdParts.push('--quiet');
|
|
99
|
+
const ctxCommand = cmdParts.join(' ');
|
|
100
|
+
const script = `#!/bin/sh
|
|
101
|
+
# ctx pre-commit hook (standalone)
|
|
102
|
+
|
|
103
|
+
# Run ctx build
|
|
104
|
+
${ctxCommand}
|
|
105
|
+
BUILD_EXIT_CODE=$?
|
|
106
|
+
|
|
107
|
+
if [ $BUILD_EXIT_CODE -ne 0 ]; then
|
|
108
|
+
echo "❌ ctx build failed"
|
|
109
|
+
exit $BUILD_EXIT_CODE
|
|
110
|
+
fi
|
|
111
|
+
|
|
112
|
+
${autoStage
|
|
113
|
+
? `# Stage outputs
|
|
114
|
+
[ -f "CLAUDE.md" ] && git add -A "CLAUDE.md"
|
|
115
|
+
[ -f "AGENTS.md" ] && git add -A "AGENTS.md"
|
|
116
|
+
[ -d ".cursor/rules" ] && git add -A ".cursor/rules" 2>/dev/null`
|
|
117
|
+
: ''}
|
|
118
|
+
|
|
119
|
+
exit 0
|
|
120
|
+
`;
|
|
121
|
+
return script;
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Get the list of files that will be auto-staged
|
|
125
|
+
*/
|
|
126
|
+
function getAutoStagedFiles() {
|
|
127
|
+
return ['CLAUDE.md', 'AGENTS.md', '.cursor/rules/*.mdc'];
|
|
128
|
+
}
|
|
129
|
+
//# sourceMappingURL=hooks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../src/git/hooks.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;AAqBH,sDA4EC;AAMD,0EA2CC;AAKD,gDAEC;AAvID;;GAEG;AACH,SAAgB,qBAAqB,CAAC,UAA4B,EAAE;IAClE,MAAM,EACJ,WAAW,GAAG,IAAI,EAClB,SAAS,GAAG,IAAI,EAChB,cAAc,GAAG,KAAK,EACtB,OAAO,GAAG,KAAK,EACf,KAAK,GAAG,KAAK,GACd,GAAG,OAAO,CAAC;IAEZ,wBAAwB;IACxB,MAAM,QAAQ,GAAG,CAAC,eAAe,CAAC,CAAC;IACnC,IAAI,WAAW;QAAE,QAAQ,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IAChD,IAAI,cAAc;QAAE,QAAQ,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;IACvD,IAAI,OAAO;QAAE,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACxC,IAAI,KAAK;QAAE,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAEpC,MAAM,UAAU,GAAG,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAEtC,2BAA2B;IAC3B,MAAM,MAAM,GAAG;;;;;;;EAOf,UAAU;;;;;;;;;;;;;;;;;EAkBV,SAAS;QACP,CAAC,CAAC;;;;;;;;;;;;;;;;;;;;;;IAsBF,CAAC,KAAK,CAAC,CAAC,CAAC,wCAAwC,CAAC,CAAC,CAAC,EAAE;GACvD;QACC,CAAC,CAAC,yBACN;;;CAGC,CAAC;IAEA,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;GAGG;AACH,SAAgB,+BAA+B,CAAC,UAA4B,EAAE;IAC5E,MAAM,EACJ,WAAW,GAAG,IAAI,EAClB,SAAS,GAAG,IAAI,EAChB,cAAc,GAAG,KAAK,EACtB,OAAO,GAAG,KAAK,EACf,KAAK,GAAG,KAAK,GACd,GAAG,OAAO,CAAC;IAEZ,wBAAwB;IACxB,MAAM,QAAQ,GAAG,CAAC,eAAe,CAAC,CAAC;IACnC,IAAI,WAAW;QAAE,QAAQ,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IAChD,IAAI,cAAc;QAAE,QAAQ,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;IACvD,IAAI,OAAO;QAAE,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACxC,IAAI,KAAK;QAAE,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAEpC,MAAM,UAAU,GAAG,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAEtC,MAAM,MAAM,GAAG;;;;EAIf,UAAU;;;;;;;;EASV,SAAS;QACP,CAAC,CAAC;;;iEAG2D;QAC7D,CAAC,CAAC,EACN;;;CAGC,CAAC;IAEA,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,SAAgB,kBAAkB;IAChC,OAAO,CAAC,WAAW,EAAE,WAAW,EAAE,qBAAqB,CAAC,CAAC;AAC3D,CAAC"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Husky Manager
|
|
3
|
+
*
|
|
4
|
+
* Manages Husky installation and configuration for git hooks.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Husky installation status
|
|
8
|
+
*/
|
|
9
|
+
export interface HuskyStatus {
|
|
10
|
+
/** Whether Husky is installed as a dependency */
|
|
11
|
+
installed: boolean;
|
|
12
|
+
/** Whether Husky is initialized (.husky directory exists) */
|
|
13
|
+
initialized: boolean;
|
|
14
|
+
/** Husky version if installed */
|
|
15
|
+
version?: string;
|
|
16
|
+
/** Whether pre-commit hook exists */
|
|
17
|
+
hasPreCommitHook: boolean;
|
|
18
|
+
/** Whether our ctx hook is already configured */
|
|
19
|
+
hasCtxHook: boolean;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Husky Manager class
|
|
23
|
+
*/
|
|
24
|
+
export declare class HuskyManager {
|
|
25
|
+
private projectRoot;
|
|
26
|
+
constructor(projectRoot: string);
|
|
27
|
+
/**
|
|
28
|
+
* Check Husky installation status
|
|
29
|
+
*/
|
|
30
|
+
checkStatus(): Promise<HuskyStatus>;
|
|
31
|
+
/**
|
|
32
|
+
* Install Husky as a dev dependency
|
|
33
|
+
*/
|
|
34
|
+
install(): Promise<boolean>;
|
|
35
|
+
/**
|
|
36
|
+
* Initialize Husky (create .husky directory)
|
|
37
|
+
*/
|
|
38
|
+
initialize(): Promise<boolean>;
|
|
39
|
+
/**
|
|
40
|
+
* Add pre-commit hook
|
|
41
|
+
*/
|
|
42
|
+
addPreCommitHook(hookContent: string): Promise<boolean>;
|
|
43
|
+
/**
|
|
44
|
+
* Remove ctx hook from pre-commit
|
|
45
|
+
*/
|
|
46
|
+
removeCtxHook(): Promise<boolean>;
|
|
47
|
+
/**
|
|
48
|
+
* Detect which package manager is being used
|
|
49
|
+
*/
|
|
50
|
+
private detectPackageManager;
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=husky.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"husky.d.ts","sourceRoot":"","sources":["../../src/git/husky.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,iDAAiD;IACjD,SAAS,EAAE,OAAO,CAAC;IACnB,6DAA6D;IAC7D,WAAW,EAAE,OAAO,CAAC;IACrB,iCAAiC;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,qCAAqC;IACrC,gBAAgB,EAAE,OAAO,CAAC;IAC1B,iDAAiD;IACjD,UAAU,EAAE,OAAO,CAAC;CACrB;AAED;;GAEG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,WAAW,CAAS;gBAEhB,WAAW,EAAE,MAAM;IAI/B;;OAEG;IACG,WAAW,IAAI,OAAO,CAAC,WAAW,CAAC;IA+CzC;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC;IAwBjC;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC;IAuBpC;;OAEG;IACG,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAkC7D;;OAEG;IACG,aAAa,IAAI,OAAO,CAAC,OAAO,CAAC;IA+BvC;;OAEG;IACH,OAAO,CAAC,oBAAoB;CAS7B"}
|
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Husky Manager
|
|
4
|
+
*
|
|
5
|
+
* Manages Husky installation and configuration for git hooks.
|
|
6
|
+
*/
|
|
7
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
8
|
+
if (k2 === undefined) k2 = k;
|
|
9
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
10
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
11
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
12
|
+
}
|
|
13
|
+
Object.defineProperty(o, k2, desc);
|
|
14
|
+
}) : (function(o, m, k, k2) {
|
|
15
|
+
if (k2 === undefined) k2 = k;
|
|
16
|
+
o[k2] = m[k];
|
|
17
|
+
}));
|
|
18
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
19
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
20
|
+
}) : function(o, v) {
|
|
21
|
+
o["default"] = v;
|
|
22
|
+
});
|
|
23
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
24
|
+
var ownKeys = function(o) {
|
|
25
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
26
|
+
var ar = [];
|
|
27
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
28
|
+
return ar;
|
|
29
|
+
};
|
|
30
|
+
return ownKeys(o);
|
|
31
|
+
};
|
|
32
|
+
return function (mod) {
|
|
33
|
+
if (mod && mod.__esModule) return mod;
|
|
34
|
+
var result = {};
|
|
35
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
36
|
+
__setModuleDefault(result, mod);
|
|
37
|
+
return result;
|
|
38
|
+
};
|
|
39
|
+
})();
|
|
40
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
41
|
+
exports.HuskyManager = void 0;
|
|
42
|
+
const fs = __importStar(require("fs"));
|
|
43
|
+
const path = __importStar(require("path"));
|
|
44
|
+
const child_process_1 = require("child_process");
|
|
45
|
+
/**
|
|
46
|
+
* Husky Manager class
|
|
47
|
+
*/
|
|
48
|
+
class HuskyManager {
|
|
49
|
+
projectRoot;
|
|
50
|
+
constructor(projectRoot) {
|
|
51
|
+
this.projectRoot = projectRoot;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Check Husky installation status
|
|
55
|
+
*/
|
|
56
|
+
async checkStatus() {
|
|
57
|
+
const status = {
|
|
58
|
+
installed: false,
|
|
59
|
+
initialized: false,
|
|
60
|
+
hasPreCommitHook: false,
|
|
61
|
+
hasCtxHook: false,
|
|
62
|
+
};
|
|
63
|
+
// Check if Husky is in package.json dependencies
|
|
64
|
+
const packageJsonPath = path.join(this.projectRoot, 'package.json');
|
|
65
|
+
if (fs.existsSync(packageJsonPath)) {
|
|
66
|
+
try {
|
|
67
|
+
const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8'));
|
|
68
|
+
const deps = {
|
|
69
|
+
...packageJson.dependencies,
|
|
70
|
+
...packageJson.devDependencies,
|
|
71
|
+
};
|
|
72
|
+
if (deps.husky) {
|
|
73
|
+
status.installed = true;
|
|
74
|
+
status.version = deps.husky.replace(/[\^~]/g, '');
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
// Ignore JSON parse errors
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
// Check if .husky directory exists
|
|
82
|
+
const huskyDir = path.join(this.projectRoot, '.husky');
|
|
83
|
+
status.initialized = fs.existsSync(huskyDir);
|
|
84
|
+
// Check if pre-commit hook exists
|
|
85
|
+
const preCommitPath = path.join(huskyDir, 'pre-commit');
|
|
86
|
+
status.hasPreCommitHook = fs.existsSync(preCommitPath);
|
|
87
|
+
// Check if our ctx hook is configured
|
|
88
|
+
if (status.hasPreCommitHook) {
|
|
89
|
+
try {
|
|
90
|
+
const hookContent = fs.readFileSync(preCommitPath, 'utf-8');
|
|
91
|
+
status.hasCtxHook = hookContent.includes('ctx build');
|
|
92
|
+
}
|
|
93
|
+
catch {
|
|
94
|
+
// Ignore read errors
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
return status;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Install Husky as a dev dependency
|
|
101
|
+
*/
|
|
102
|
+
async install() {
|
|
103
|
+
try {
|
|
104
|
+
// Detect package manager
|
|
105
|
+
const packageManager = this.detectPackageManager();
|
|
106
|
+
// Install Husky
|
|
107
|
+
const installCmd = packageManager === 'yarn'
|
|
108
|
+
? 'yarn add -D husky'
|
|
109
|
+
: packageManager === 'pnpm'
|
|
110
|
+
? 'pnpm add -D husky'
|
|
111
|
+
: 'npm install -D husky';
|
|
112
|
+
(0, child_process_1.execSync)(installCmd, {
|
|
113
|
+
cwd: this.projectRoot,
|
|
114
|
+
stdio: 'pipe',
|
|
115
|
+
});
|
|
116
|
+
return true;
|
|
117
|
+
}
|
|
118
|
+
catch {
|
|
119
|
+
return false;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Initialize Husky (create .husky directory)
|
|
124
|
+
*/
|
|
125
|
+
async initialize() {
|
|
126
|
+
try {
|
|
127
|
+
// Run husky init or husky install depending on version
|
|
128
|
+
const result = (0, child_process_1.spawnSync)('npx', ['husky', 'init'], {
|
|
129
|
+
cwd: this.projectRoot,
|
|
130
|
+
stdio: 'pipe',
|
|
131
|
+
});
|
|
132
|
+
if (result.status !== 0) {
|
|
133
|
+
// Try older husky install command
|
|
134
|
+
const legacyResult = (0, child_process_1.spawnSync)('npx', ['husky', 'install'], {
|
|
135
|
+
cwd: this.projectRoot,
|
|
136
|
+
stdio: 'pipe',
|
|
137
|
+
});
|
|
138
|
+
return legacyResult.status === 0;
|
|
139
|
+
}
|
|
140
|
+
return true;
|
|
141
|
+
}
|
|
142
|
+
catch {
|
|
143
|
+
return false;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Add pre-commit hook
|
|
148
|
+
*/
|
|
149
|
+
async addPreCommitHook(hookContent) {
|
|
150
|
+
try {
|
|
151
|
+
const huskyDir = path.join(this.projectRoot, '.husky');
|
|
152
|
+
// Ensure .husky directory exists
|
|
153
|
+
if (!fs.existsSync(huskyDir)) {
|
|
154
|
+
await fs.promises.mkdir(huskyDir, { recursive: true });
|
|
155
|
+
}
|
|
156
|
+
const preCommitPath = path.join(huskyDir, 'pre-commit');
|
|
157
|
+
// Check if pre-commit already exists
|
|
158
|
+
if (fs.existsSync(preCommitPath)) {
|
|
159
|
+
const existingContent = await fs.promises.readFile(preCommitPath, 'utf-8');
|
|
160
|
+
// If ctx build is already there, don't duplicate
|
|
161
|
+
if (existingContent.includes('ctx build')) {
|
|
162
|
+
return true;
|
|
163
|
+
}
|
|
164
|
+
// Append to existing hook
|
|
165
|
+
const updatedContent = existingContent.trim() + '\n\n' + hookContent;
|
|
166
|
+
await fs.promises.writeFile(preCommitPath, updatedContent, { mode: 0o755 });
|
|
167
|
+
}
|
|
168
|
+
else {
|
|
169
|
+
// Create new hook
|
|
170
|
+
await fs.promises.writeFile(preCommitPath, hookContent, { mode: 0o755 });
|
|
171
|
+
}
|
|
172
|
+
return true;
|
|
173
|
+
}
|
|
174
|
+
catch {
|
|
175
|
+
return false;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Remove ctx hook from pre-commit
|
|
180
|
+
*/
|
|
181
|
+
async removeCtxHook() {
|
|
182
|
+
try {
|
|
183
|
+
const preCommitPath = path.join(this.projectRoot, '.husky', 'pre-commit');
|
|
184
|
+
if (!fs.existsSync(preCommitPath)) {
|
|
185
|
+
return true;
|
|
186
|
+
}
|
|
187
|
+
const content = await fs.promises.readFile(preCommitPath, 'utf-8');
|
|
188
|
+
// Remove ctx-related lines
|
|
189
|
+
const lines = content.split('\n');
|
|
190
|
+
const filteredLines = lines.filter((line) => !line.includes('ctx build') && !line.includes('# ctx pre-commit'));
|
|
191
|
+
const newContent = filteredLines.join('\n').trim();
|
|
192
|
+
if (newContent === '#!/usr/bin/env sh' || newContent === '#!/bin/sh') {
|
|
193
|
+
// Hook is now empty, remove the file
|
|
194
|
+
await fs.promises.unlink(preCommitPath);
|
|
195
|
+
}
|
|
196
|
+
else {
|
|
197
|
+
await fs.promises.writeFile(preCommitPath, newContent + '\n', { mode: 0o755 });
|
|
198
|
+
}
|
|
199
|
+
return true;
|
|
200
|
+
}
|
|
201
|
+
catch {
|
|
202
|
+
return false;
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Detect which package manager is being used
|
|
207
|
+
*/
|
|
208
|
+
detectPackageManager() {
|
|
209
|
+
if (fs.existsSync(path.join(this.projectRoot, 'pnpm-lock.yaml'))) {
|
|
210
|
+
return 'pnpm';
|
|
211
|
+
}
|
|
212
|
+
if (fs.existsSync(path.join(this.projectRoot, 'yarn.lock'))) {
|
|
213
|
+
return 'yarn';
|
|
214
|
+
}
|
|
215
|
+
return 'npm';
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
exports.HuskyManager = HuskyManager;
|
|
219
|
+
//# sourceMappingURL=husky.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"husky.js","sourceRoot":"","sources":["../../src/git/husky.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Git Integration Module
|
|
3
|
+
*
|
|
4
|
+
* Provides Husky hook setup, gitignore management, and pre-commit integration.
|
|
5
|
+
*/
|
|
6
|
+
export { HuskyManager, type HuskyStatus } from './husky';
|
|
7
|
+
export { GitignoreManager, type GitignoreOptions } from './gitignore';
|
|
8
|
+
export { generatePreCommitHook, type PreCommitOptions } from './hooks';
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/git/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,YAAY,EAAE,KAAK,WAAW,EAAE,MAAM,SAAS,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,KAAK,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACtE,OAAO,EAAE,qBAAqB,EAAE,KAAK,gBAAgB,EAAE,MAAM,SAAS,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Git Integration Module
|
|
4
|
+
*
|
|
5
|
+
* Provides Husky hook setup, gitignore management, and pre-commit integration.
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.generatePreCommitHook = exports.GitignoreManager = exports.HuskyManager = void 0;
|
|
9
|
+
var husky_1 = require("./husky");
|
|
10
|
+
Object.defineProperty(exports, "HuskyManager", { enumerable: true, get: function () { return husky_1.HuskyManager; } });
|
|
11
|
+
var gitignore_1 = require("./gitignore");
|
|
12
|
+
Object.defineProperty(exports, "GitignoreManager", { enumerable: true, get: function () { return gitignore_1.GitignoreManager; } });
|
|
13
|
+
var hooks_1 = require("./hooks");
|
|
14
|
+
Object.defineProperty(exports, "generatePreCommitHook", { enumerable: true, get: function () { return hooks_1.generatePreCommitHook; } });
|
|
15
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/git/index.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;AAEH,iCAAyD;AAAhD,qGAAA,YAAY,OAAA;AACrB,yCAAsE;AAA7D,6GAAA,gBAAgB,OAAA;AACzB,iCAAuE;AAA9D,8GAAA,qBAAqB,OAAA"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,cAAc,WAAW,CAAC;AAC1B,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
// ctxinit - Unified context architecture for AI coding assistants
|
|
18
|
+
__exportStar(require("./schemas"), exports);
|
|
19
|
+
__exportStar(require("./config"), exports);
|
|
20
|
+
__exportStar(require("./parser"), exports);
|
|
21
|
+
__exportStar(require("./analysis"), exports);
|
|
22
|
+
__exportStar(require("./compiler"), exports);
|
|
23
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,kEAAkE;AAClE,4CAA0B;AAC1B,2CAAyB;AACzB,2CAAyB;AACzB,6CAA2B;AAC3B,6CAA2B"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Base LLM Provider
|
|
3
|
+
*
|
|
4
|
+
* Abstract base class for all LLM providers with common functionality.
|
|
5
|
+
*/
|
|
6
|
+
import { LLMProvider, LLMProviderType, LLMProviderConfig, LLMProviderCapabilities, LLMRequest, LLMResponse } from './types';
|
|
7
|
+
/**
|
|
8
|
+
* Abstract base provider class
|
|
9
|
+
*/
|
|
10
|
+
export declare abstract class BaseLLMProvider implements LLMProvider {
|
|
11
|
+
protected config: LLMProviderConfig;
|
|
12
|
+
constructor(config: LLMProviderConfig);
|
|
13
|
+
/**
|
|
14
|
+
* Log verbose debug information if verbose mode is enabled
|
|
15
|
+
*/
|
|
16
|
+
protected log(message: string, data?: unknown): void;
|
|
17
|
+
abstract get type(): LLMProviderType;
|
|
18
|
+
abstract get name(): string;
|
|
19
|
+
abstract get capabilities(): LLMProviderCapabilities;
|
|
20
|
+
abstract isAvailable(): Promise<boolean>;
|
|
21
|
+
abstract complete(request: LLMRequest): Promise<LLMResponse>;
|
|
22
|
+
/**
|
|
23
|
+
* Get effective max tokens from config or default
|
|
24
|
+
*/
|
|
25
|
+
protected getMaxTokens(request: LLMRequest): number;
|
|
26
|
+
/**
|
|
27
|
+
* Get effective temperature from config or default
|
|
28
|
+
*/
|
|
29
|
+
protected getTemperature(request: LLMRequest): number;
|
|
30
|
+
/**
|
|
31
|
+
* Get timeout in milliseconds
|
|
32
|
+
*/
|
|
33
|
+
protected getTimeout(): number;
|
|
34
|
+
/**
|
|
35
|
+
* Build combined prompt from messages
|
|
36
|
+
*/
|
|
37
|
+
protected buildPromptFromMessages(request: LLMRequest): string;
|
|
38
|
+
/**
|
|
39
|
+
* Parse JSON from LLM response, handling markdown code blocks
|
|
40
|
+
*/
|
|
41
|
+
protected parseJsonResponse<T>(content: string): T;
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=base-provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-provider.d.ts","sourceRoot":"","sources":["../../src/llm/base-provider.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,WAAW,EACX,eAAe,EACf,iBAAiB,EACjB,uBAAuB,EACvB,UAAU,EACV,WAAW,EACZ,MAAM,SAAS,CAAC;AAEjB;;GAEG;AACH,8BAAsB,eAAgB,YAAW,WAAW;IAC1D,SAAS,CAAC,MAAM,EAAE,iBAAiB,CAAC;gBAExB,MAAM,EAAE,iBAAiB;IAIrC;;OAEG;IACH,SAAS,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI;IAWpD,QAAQ,KAAK,IAAI,IAAI,eAAe,CAAC;IACrC,QAAQ,KAAK,IAAI,IAAI,MAAM,CAAC;IAC5B,QAAQ,KAAK,YAAY,IAAI,uBAAuB,CAAC;IAErD,QAAQ,CAAC,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IACxC,QAAQ,CAAC,QAAQ,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC;IAE5D;;OAEG;IACH,SAAS,CAAC,YAAY,CAAC,OAAO,EAAE,UAAU,GAAG,MAAM;IAInD;;OAEG;IACH,SAAS,CAAC,cAAc,CAAC,OAAO,EAAE,UAAU,GAAG,MAAM;IAIrD;;OAEG;IACH,SAAS,CAAC,UAAU,IAAI,MAAM;IAI9B;;OAEG;IACH,SAAS,CAAC,uBAAuB,CAAC,OAAO,EAAE,UAAU,GAAG,MAAM;IAoB9D;;OAEG;IACH,SAAS,CAAC,iBAAiB,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,GAAG,CAAC;CAmBnD"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Base LLM Provider
|
|
4
|
+
*
|
|
5
|
+
* Abstract base class for all LLM providers with common functionality.
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.BaseLLMProvider = void 0;
|
|
9
|
+
/**
|
|
10
|
+
* Abstract base provider class
|
|
11
|
+
*/
|
|
12
|
+
class BaseLLMProvider {
|
|
13
|
+
config;
|
|
14
|
+
constructor(config) {
|
|
15
|
+
this.config = config;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Log verbose debug information if verbose mode is enabled
|
|
19
|
+
*/
|
|
20
|
+
log(message, data) {
|
|
21
|
+
if (this.config.verbose) {
|
|
22
|
+
const prefix = `[${this.type}]`;
|
|
23
|
+
if (data !== undefined) {
|
|
24
|
+
console.error(`${prefix} ${message}:`, data);
|
|
25
|
+
}
|
|
26
|
+
else {
|
|
27
|
+
console.error(`${prefix} ${message}`);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Get effective max tokens from config or default
|
|
33
|
+
*/
|
|
34
|
+
getMaxTokens(request) {
|
|
35
|
+
return request.maxTokens ?? this.config.maxTokens ?? 4096;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Get effective temperature from config or default
|
|
39
|
+
*/
|
|
40
|
+
getTemperature(request) {
|
|
41
|
+
return request.temperature ?? this.config.temperature ?? 0.7;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Get timeout in milliseconds
|
|
45
|
+
*/
|
|
46
|
+
getTimeout() {
|
|
47
|
+
return this.config.timeout ?? 120000; // 2 minutes default
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Build combined prompt from messages
|
|
51
|
+
*/
|
|
52
|
+
buildPromptFromMessages(request) {
|
|
53
|
+
const parts = [];
|
|
54
|
+
if (request.systemPrompt) {
|
|
55
|
+
parts.push(request.systemPrompt);
|
|
56
|
+
}
|
|
57
|
+
for (const msg of request.messages) {
|
|
58
|
+
if (msg.role === 'system') {
|
|
59
|
+
parts.push(msg.content);
|
|
60
|
+
}
|
|
61
|
+
else if (msg.role === 'user') {
|
|
62
|
+
parts.push(`User: ${msg.content}`);
|
|
63
|
+
}
|
|
64
|
+
else if (msg.role === 'assistant') {
|
|
65
|
+
parts.push(`Assistant: ${msg.content}`);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
return parts.join('\n\n');
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Parse JSON from LLM response, handling markdown code blocks
|
|
72
|
+
*/
|
|
73
|
+
parseJsonResponse(content) {
|
|
74
|
+
// Remove markdown code blocks if present
|
|
75
|
+
let jsonStr = content.trim();
|
|
76
|
+
// Handle ```json ... ``` blocks
|
|
77
|
+
const jsonBlockMatch = jsonStr.match(/```(?:json)?\s*([\s\S]*?)```/);
|
|
78
|
+
if (jsonBlockMatch) {
|
|
79
|
+
jsonStr = jsonBlockMatch[1].trim();
|
|
80
|
+
}
|
|
81
|
+
try {
|
|
82
|
+
return JSON.parse(jsonStr);
|
|
83
|
+
}
|
|
84
|
+
catch (error) {
|
|
85
|
+
throw new Error(`Failed to parse JSON from LLM response: ${error.message}\n` +
|
|
86
|
+
`Response content: ${content.slice(0, 500)}...`);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
exports.BaseLLMProvider = BaseLLMProvider;
|
|
91
|
+
//# sourceMappingURL=base-provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-provider.js","sourceRoot":"","sources":["../../src/llm/base-provider.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;AAWH;;GAEG;AACH,MAAsB,eAAe;IACzB,MAAM,CAAoB;IAEpC,YAAY,MAAyB;QACnC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED;;OAEG;IACO,GAAG,CAAC,OAAe,EAAE,IAAc;QAC3C,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACxB,MAAM,MAAM,GAAG,IAAI,IAAI,CAAC,IAAI,GAAG,CAAC;YAChC,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;gBACvB,OAAO,CAAC,KAAK,CAAC,GAAG,MAAM,IAAI,OAAO,GAAG,EAAE,IAAI,CAAC,CAAC;YAC/C,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,KAAK,CAAC,GAAG,MAAM,IAAI,OAAO,EAAE,CAAC,CAAC;YACxC,CAAC;QACH,CAAC;IACH,CAAC;IASD;;OAEG;IACO,YAAY,CAAC,OAAmB;QACxC,OAAO,OAAO,CAAC,SAAS,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,IAAI,IAAI,CAAC;IAC5D,CAAC;IAED;;OAEG;IACO,cAAc,CAAC,OAAmB;QAC1C,OAAO,OAAO,CAAC,WAAW,IAAI,IAAI,CAAC,MAAM,CAAC,WAAW,IAAI,GAAG,CAAC;IAC/D,CAAC;IAED;;OAEG;IACO,UAAU;QAClB,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,CAAC,oBAAoB;IAC5D,CAAC;IAED;;OAEG;IACO,uBAAuB,CAAC,OAAmB;QACnD,MAAM,KAAK,GAAa,EAAE,CAAC;QAE3B,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;YACzB,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;QACnC,CAAC;QAED,KAAK,MAAM,GAAG,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;YACnC,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAC1B,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAC1B,CAAC;iBAAM,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;gBAC/B,KAAK,CAAC,IAAI,CAAC,SAAS,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;YACrC,CAAC;iBAAM,IAAI,GAAG,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;gBACpC,KAAK,CAAC,IAAI,CAAC,cAAc,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;YAC1C,CAAC;QACH,CAAC;QAED,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC5B,CAAC;IAED;;OAEG;IACO,iBAAiB,CAAI,OAAe;QAC5C,yCAAyC;QACzC,IAAI,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;QAE7B,gCAAgC;QAChC,MAAM,cAAc,GAAG,OAAO,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;QACrE,IAAI,cAAc,EAAE,CAAC;YACnB,OAAO,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACrC,CAAC;QAED,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAM,CAAC;QAClC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CACb,2CAA4C,KAAe,CAAC,OAAO,IAAI;gBACvE,qBAAqB,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,KAAK,CAChD,CAAC;QACJ,CAAC;IACH,CAAC;CACF;AA9FD,0CA8FC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LLM Module
|
|
3
|
+
*
|
|
4
|
+
* Unified interface for LLM providers (API and CLI).
|
|
5
|
+
*/
|
|
6
|
+
export { LLMProviderType, LLMProviderConfig, LLMMessage, LLMRequest, LLMResponse, LLMProvider, LLMProviderCapabilities, BootstrapLLMOutput, ProviderDetectionResult, } from './types';
|
|
7
|
+
export { BaseLLMProvider } from './base-provider';
|
|
8
|
+
export { ClaudeAPIProvider } from './providers/claude-api';
|
|
9
|
+
export { ClaudeCodeProvider } from './providers/claude-code';
|
|
10
|
+
export { OpenAIAPIProvider } from './providers/openai-api';
|
|
11
|
+
export { GeminiAPIProvider } from './providers/gemini-api';
|
|
12
|
+
export { GeminiCLIProvider } from './providers/gemini-cli';
|
|
13
|
+
export { CursorCLIProvider } from './providers/cursor-cli';
|
|
14
|
+
export { CodexCLIProvider } from './providers/codex-cli';
|
|
15
|
+
export { InteractiveProvider, StdinProvider } from './providers/interactive';
|
|
16
|
+
export { createProvider, detectProviders, autoSelectProvider, listProviderTypes, } from './provider-factory';
|
|
17
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/llm/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EACL,eAAe,EACf,iBAAiB,EACjB,UAAU,EACV,UAAU,EACV,WAAW,EACX,WAAW,EACX,uBAAuB,EACvB,kBAAkB,EAClB,uBAAuB,GACxB,MAAM,SAAS,CAAC;AAGjB,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAGlD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAG7E,OAAO,EACL,cAAc,EACd,eAAe,EACf,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,oBAAoB,CAAC"}
|