compact-agent 1.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/README.md +394 -0
- package/bin/anycode.js +2 -0
- package/bin/crowcoder.js +19 -0
- package/bin/ecc-hooks.cjs +138 -0
- package/dist/agents.d.ts +17 -0
- package/dist/agents.js +1603 -0
- package/dist/agents.js.map +1 -0
- package/dist/api.d.ts +16 -0
- package/dist/api.js +115 -0
- package/dist/api.js.map +1 -0
- package/dist/autonomous-loops.d.ts +108 -0
- package/dist/autonomous-loops.js +526 -0
- package/dist/autonomous-loops.js.map +1 -0
- package/dist/codemaps.d.ts +53 -0
- package/dist/codemaps.js +325 -0
- package/dist/codemaps.js.map +1 -0
- package/dist/compaction.d.ts +30 -0
- package/dist/compaction.js +125 -0
- package/dist/compaction.js.map +1 -0
- package/dist/config.d.ts +5 -0
- package/dist/config.js +79 -0
- package/dist/config.js.map +1 -0
- package/dist/content-engine.d.ts +97 -0
- package/dist/content-engine.js +721 -0
- package/dist/content-engine.js.map +1 -0
- package/dist/cost-tracker.d.ts +49 -0
- package/dist/cost-tracker.js +150 -0
- package/dist/cost-tracker.js.map +1 -0
- package/dist/counter-button.d.ts +35 -0
- package/dist/counter-button.js +48 -0
- package/dist/counter-button.js.map +1 -0
- package/dist/counter.d.ts +21 -0
- package/dist/counter.js +31 -0
- package/dist/counter.js.map +1 -0
- package/dist/coverage.d.ts +23 -0
- package/dist/coverage.js +215 -0
- package/dist/coverage.js.map +1 -0
- package/dist/docs-sync.d.ts +23 -0
- package/dist/docs-sync.js +266 -0
- package/dist/docs-sync.js.map +1 -0
- package/dist/ecc.d.ts +41 -0
- package/dist/ecc.js +644 -0
- package/dist/ecc.js.map +1 -0
- package/dist/evaluation.d.ts +24 -0
- package/dist/evaluation.js +412 -0
- package/dist/evaluation.js.map +1 -0
- package/dist/export.d.ts +22 -0
- package/dist/export.js +109 -0
- package/dist/export.js.map +1 -0
- package/dist/git-workflow.d.ts +22 -0
- package/dist/git-workflow.js +197 -0
- package/dist/git-workflow.js.map +1 -0
- package/dist/hook-controls.d.ts +34 -0
- package/dist/hook-controls.js +90 -0
- package/dist/hook-controls.js.map +1 -0
- package/dist/hooks.d.ts +30 -0
- package/dist/hooks.js +130 -0
- package/dist/hooks.js.map +1 -0
- package/dist/html-parser.d.ts +18 -0
- package/dist/html-parser.js +101 -0
- package/dist/html-parser.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.js +1230 -0
- package/dist/index.js.map +1 -0
- package/dist/learning.d.ts +35 -0
- package/dist/learning.js +238 -0
- package/dist/learning.js.map +1 -0
- package/dist/login.d.ts +37 -0
- package/dist/login.js +191 -0
- package/dist/login.js.map +1 -0
- package/dist/memory.d.ts +39 -0
- package/dist/memory.js +183 -0
- package/dist/memory.js.map +1 -0
- package/dist/model-router.d.ts +23 -0
- package/dist/model-router.js +145 -0
- package/dist/model-router.js.map +1 -0
- package/dist/modes.d.ts +17 -0
- package/dist/modes.js +217 -0
- package/dist/modes.js.map +1 -0
- package/dist/orchestration.d.ts +37 -0
- package/dist/orchestration.js +139 -0
- package/dist/orchestration.js.map +1 -0
- package/dist/package-detect.d.ts +36 -0
- package/dist/package-detect.js +529 -0
- package/dist/package-detect.js.map +1 -0
- package/dist/permissions.d.ts +25 -0
- package/dist/permissions.js +50 -0
- package/dist/permissions.js.map +1 -0
- package/dist/pm2-manager.d.ts +40 -0
- package/dist/pm2-manager.js +127 -0
- package/dist/pm2-manager.js.map +1 -0
- package/dist/query.d.ts +15 -0
- package/dist/query.js +278 -0
- package/dist/query.js.map +1 -0
- package/dist/refactor.d.ts +22 -0
- package/dist/refactor.js +226 -0
- package/dist/refactor.js.map +1 -0
- package/dist/retry.d.ts +20 -0
- package/dist/retry.js +88 -0
- package/dist/retry.js.map +1 -0
- package/dist/rules.d.ts +34 -0
- package/dist/rules.js +942 -0
- package/dist/rules.js.map +1 -0
- package/dist/schema.d.ts +23 -0
- package/dist/schema.js +12 -0
- package/dist/schema.js.map +1 -0
- package/dist/search-first.d.ts +17 -0
- package/dist/search-first.js +301 -0
- package/dist/search-first.js.map +1 -0
- package/dist/security.d.ts +10 -0
- package/dist/security.js +145 -0
- package/dist/security.js.map +1 -0
- package/dist/sessions.d.ts +21 -0
- package/dist/sessions.js +112 -0
- package/dist/sessions.js.map +1 -0
- package/dist/skill-create.d.ts +38 -0
- package/dist/skill-create.js +389 -0
- package/dist/skill-create.js.map +1 -0
- package/dist/skills.d.ts +34 -0
- package/dist/skills.js +161 -0
- package/dist/skills.js.map +1 -0
- package/dist/strategic-compaction.d.ts +24 -0
- package/dist/strategic-compaction.js +144 -0
- package/dist/strategic-compaction.js.map +1 -0
- package/dist/system-prompt.d.ts +3 -0
- package/dist/system-prompt.js +101 -0
- package/dist/system-prompt.js.map +1 -0
- package/dist/theme.d.ts +60 -0
- package/dist/theme.js +220 -0
- package/dist/theme.js.map +1 -0
- package/dist/tools/bash.d.ts +2 -0
- package/dist/tools/bash.js +49 -0
- package/dist/tools/bash.js.map +1 -0
- package/dist/tools/edit.d.ts +2 -0
- package/dist/tools/edit.js +76 -0
- package/dist/tools/edit.js.map +1 -0
- package/dist/tools/glob.d.ts +2 -0
- package/dist/tools/glob.js +54 -0
- package/dist/tools/glob.js.map +1 -0
- package/dist/tools/grep.d.ts +2 -0
- package/dist/tools/grep.js +64 -0
- package/dist/tools/grep.js.map +1 -0
- package/dist/tools/index.d.ts +5 -0
- package/dist/tools/index.js +27 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/list-dir.d.ts +2 -0
- package/dist/tools/list-dir.js +51 -0
- package/dist/tools/list-dir.js.map +1 -0
- package/dist/tools/read.d.ts +2 -0
- package/dist/tools/read.js +56 -0
- package/dist/tools/read.js.map +1 -0
- package/dist/tools/types.d.ts +45 -0
- package/dist/tools/types.js +2 -0
- package/dist/tools/types.js.map +1 -0
- package/dist/tools/web-fetch.d.ts +2 -0
- package/dist/tools/web-fetch.js +41 -0
- package/dist/tools/web-fetch.js.map +1 -0
- package/dist/tools/web-search.d.ts +27 -0
- package/dist/tools/web-search.js +139 -0
- package/dist/tools/web-search.js.map +1 -0
- package/dist/tools/write.d.ts +2 -0
- package/dist/tools/write.js +36 -0
- package/dist/tools/write.js.map +1 -0
- package/dist/types.d.ts +28 -0
- package/dist/types.js +57 -0
- package/dist/types.js.map +1 -0
- package/dist/users.d.ts +51 -0
- package/dist/users.js +193 -0
- package/dist/users.js.map +1 -0
- package/dist/verification.d.ts +73 -0
- package/dist/verification.js +269 -0
- package/dist/verification.js.map +1 -0
- package/dist/walkthrough.d.ts +10 -0
- package/dist/walkthrough.js +121 -0
- package/dist/walkthrough.js.map +1 -0
- package/package.json +58 -0
- package/resources/ecc/agents/architect.json +16 -0
- package/resources/ecc/agents/architect.md +212 -0
- package/resources/ecc/agents/build-error-resolver.json +17 -0
- package/resources/ecc/agents/build-error-resolver.md +116 -0
- package/resources/ecc/agents/chief-of-staff.json +17 -0
- package/resources/ecc/agents/chief-of-staff.md +153 -0
- package/resources/ecc/agents/code-reviewer.json +16 -0
- package/resources/ecc/agents/code-reviewer.md +238 -0
- package/resources/ecc/agents/database-reviewer.json +16 -0
- package/resources/ecc/agents/database-reviewer.md +92 -0
- package/resources/ecc/agents/doc-updater.json +16 -0
- package/resources/ecc/agents/doc-updater.md +108 -0
- package/resources/ecc/agents/e2e-runner.json +17 -0
- package/resources/ecc/agents/e2e-runner.md +109 -0
- package/resources/ecc/agents/go-build-resolver.json +17 -0
- package/resources/ecc/agents/go-build-resolver.md +96 -0
- package/resources/ecc/agents/go-reviewer.json +16 -0
- package/resources/ecc/agents/go-reviewer.md +77 -0
- package/resources/ecc/agents/harness-optimizer.json +15 -0
- package/resources/ecc/agents/harness-optimizer.md +34 -0
- package/resources/ecc/agents/loop-operator.json +16 -0
- package/resources/ecc/agents/loop-operator.md +36 -0
- package/resources/ecc/agents/planner.json +15 -0
- package/resources/ecc/agents/planner.md +212 -0
- package/resources/ecc/agents/python-reviewer.json +16 -0
- package/resources/ecc/agents/python-reviewer.md +99 -0
- package/resources/ecc/agents/refactor-cleaner.json +17 -0
- package/resources/ecc/agents/refactor-cleaner.md +87 -0
- package/resources/ecc/agents/security-reviewer.json +16 -0
- package/resources/ecc/agents/security-reviewer.md +109 -0
- package/resources/ecc/agents/tdd-guide.json +17 -0
- package/resources/ecc/agents/tdd-guide.md +93 -0
- package/resources/ecc/commands/add-language-rules.md +39 -0
- package/resources/ecc/commands/database-migration.md +36 -0
- package/resources/ecc/commands/feature-development.md +38 -0
- package/resources/ecc/prompts/build-fix.prompt.md +47 -0
- package/resources/ecc/prompts/code-review.prompt.md +56 -0
- package/resources/ecc/prompts/plan.prompt.md +52 -0
- package/resources/ecc/prompts/refactor.prompt.md +50 -0
- package/resources/ecc/prompts/security-review.prompt.md +70 -0
- package/resources/ecc/prompts/tdd.prompt.md +47 -0
- package/resources/ecc/rules/common-agents.md +53 -0
- package/resources/ecc/rules/common-coding-style.md +52 -0
- package/resources/ecc/rules/common-development-workflow.md +33 -0
- package/resources/ecc/rules/common-git-workflow.md +28 -0
- package/resources/ecc/rules/common-hooks.md +34 -0
- package/resources/ecc/rules/common-patterns.md +35 -0
- package/resources/ecc/rules/common-performance.md +59 -0
- package/resources/ecc/rules/common-security.md +33 -0
- package/resources/ecc/rules/common-testing.md +33 -0
- package/resources/ecc/rules/golang-coding-style.md +31 -0
- package/resources/ecc/rules/golang-hooks.md +16 -0
- package/resources/ecc/rules/golang-patterns.md +44 -0
- package/resources/ecc/rules/golang-security.md +33 -0
- package/resources/ecc/rules/golang-testing.md +30 -0
- package/resources/ecc/rules/kotlin-coding-style.md +39 -0
- package/resources/ecc/rules/kotlin-hooks.md +16 -0
- package/resources/ecc/rules/kotlin-patterns.md +50 -0
- package/resources/ecc/rules/kotlin-security.md +58 -0
- package/resources/ecc/rules/kotlin-testing.md +38 -0
- package/resources/ecc/rules/php-coding-style.md +25 -0
- package/resources/ecc/rules/php-hooks.md +21 -0
- package/resources/ecc/rules/php-patterns.md +23 -0
- package/resources/ecc/rules/php-security.md +24 -0
- package/resources/ecc/rules/php-testing.md +26 -0
- package/resources/ecc/rules/python-coding-style.md +42 -0
- package/resources/ecc/rules/python-hooks.md +19 -0
- package/resources/ecc/rules/python-patterns.md +39 -0
- package/resources/ecc/rules/python-security.md +30 -0
- package/resources/ecc/rules/python-testing.md +38 -0
- package/resources/ecc/rules/swift-coding-style.md +47 -0
- package/resources/ecc/rules/swift-hooks.md +20 -0
- package/resources/ecc/rules/swift-patterns.md +66 -0
- package/resources/ecc/rules/swift-security.md +33 -0
- package/resources/ecc/rules/swift-testing.md +45 -0
- package/resources/ecc/rules/typescript-coding-style.md +63 -0
- package/resources/ecc/rules/typescript-hooks.md +20 -0
- package/resources/ecc/rules/typescript-patterns.md +50 -0
- package/resources/ecc/rules/typescript-security.md +26 -0
- package/resources/ecc/rules/typescript-testing.md +16 -0
- package/resources/ecc/skills/agent-introspection-debugging/SKILL.md +152 -0
- package/resources/ecc/skills/agent-introspection-debugging/agents/openai.yaml +7 -0
- package/resources/ecc/skills/agent-sort/SKILL.md +214 -0
- package/resources/ecc/skills/agent-sort/agents/openai.yaml +7 -0
- package/resources/ecc/skills/api-design/SKILL.md +522 -0
- package/resources/ecc/skills/api-design/agents/openai.yaml +7 -0
- package/resources/ecc/skills/article-writing/SKILL.md +78 -0
- package/resources/ecc/skills/article-writing/agents/openai.yaml +7 -0
- package/resources/ecc/skills/backend-patterns/SKILL.md +597 -0
- package/resources/ecc/skills/backend-patterns/agents/openai.yaml +7 -0
- package/resources/ecc/skills/brand-voice/SKILL.md +96 -0
- package/resources/ecc/skills/brand-voice/agents/openai.yaml +7 -0
- package/resources/ecc/skills/brand-voice/references/voice-profile-schema.md +55 -0
- package/resources/ecc/skills/bun-runtime/SKILL.md +83 -0
- package/resources/ecc/skills/bun-runtime/agents/openai.yaml +7 -0
- package/resources/ecc/skills/coding-standards/SKILL.md +548 -0
- package/resources/ecc/skills/coding-standards/agents/openai.yaml +7 -0
- package/resources/ecc/skills/content-engine/SKILL.md +130 -0
- package/resources/ecc/skills/content-engine/agents/openai.yaml +7 -0
- package/resources/ecc/skills/crosspost/SKILL.md +110 -0
- package/resources/ecc/skills/crosspost/agents/openai.yaml +7 -0
- package/resources/ecc/skills/deep-research/SKILL.md +154 -0
- package/resources/ecc/skills/deep-research/agents/openai.yaml +7 -0
- package/resources/ecc/skills/dmux-workflows/SKILL.md +143 -0
- package/resources/ecc/skills/dmux-workflows/agents/openai.yaml +7 -0
- package/resources/ecc/skills/documentation-lookup/SKILL.md +89 -0
- package/resources/ecc/skills/documentation-lookup/agents/openai.yaml +7 -0
- package/resources/ecc/skills/e2e-testing/SKILL.md +325 -0
- package/resources/ecc/skills/e2e-testing/agents/openai.yaml +7 -0
- package/resources/ecc/skills/eval-harness/SKILL.md +235 -0
- package/resources/ecc/skills/eval-harness/agents/openai.yaml +7 -0
- package/resources/ecc/skills/everything-claude-code/SKILL.md +442 -0
- package/resources/ecc/skills/everything-claude-code/agents/openai.yaml +7 -0
- package/resources/ecc/skills/exa-search/SKILL.md +169 -0
- package/resources/ecc/skills/exa-search/agents/openai.yaml +7 -0
- package/resources/ecc/skills/fal-ai-media/SKILL.md +276 -0
- package/resources/ecc/skills/fal-ai-media/agents/openai.yaml +7 -0
- package/resources/ecc/skills/frontend-patterns/SKILL.md +647 -0
- package/resources/ecc/skills/frontend-patterns/agents/openai.yaml +7 -0
- package/resources/ecc/skills/frontend-slides/SKILL.md +183 -0
- package/resources/ecc/skills/frontend-slides/STYLE_PRESETS.md +330 -0
- package/resources/ecc/skills/frontend-slides/agents/openai.yaml +7 -0
- package/resources/ecc/skills/investor-materials/SKILL.md +95 -0
- package/resources/ecc/skills/investor-materials/agents/openai.yaml +7 -0
- package/resources/ecc/skills/investor-outreach/SKILL.md +90 -0
- package/resources/ecc/skills/investor-outreach/agents/openai.yaml +7 -0
- package/resources/ecc/skills/market-research/SKILL.md +74 -0
- package/resources/ecc/skills/market-research/agents/openai.yaml +7 -0
- package/resources/ecc/skills/mcp-server-patterns/SKILL.md +66 -0
- package/resources/ecc/skills/mcp-server-patterns/agents/openai.yaml +7 -0
- package/resources/ecc/skills/mle-workflow/SKILL.md +346 -0
- package/resources/ecc/skills/mle-workflow/agents/openai.yaml +7 -0
- package/resources/ecc/skills/nextjs-turbopack/SKILL.md +43 -0
- package/resources/ecc/skills/nextjs-turbopack/agents/openai.yaml +7 -0
- package/resources/ecc/skills/product-capability/SKILL.md +140 -0
- package/resources/ecc/skills/product-capability/agents/openai.yaml +7 -0
- package/resources/ecc/skills/security-review/SKILL.md +494 -0
- package/resources/ecc/skills/security-review/agents/openai.yaml +7 -0
- package/resources/ecc/skills/strategic-compact/SKILL.md +102 -0
- package/resources/ecc/skills/strategic-compact/agents/openai.yaml +7 -0
- package/resources/ecc/skills/tdd-workflow/SKILL.md +409 -0
- package/resources/ecc/skills/tdd-workflow/agents/openai.yaml +7 -0
- package/resources/ecc/skills/verification-loop/SKILL.md +125 -0
- package/resources/ecc/skills/verification-loop/agents/openai.yaml +7 -0
- package/resources/ecc/skills/video-editing/SKILL.md +307 -0
- package/resources/ecc/skills/video-editing/agents/openai.yaml +7 -0
- package/resources/ecc/skills/x-api/SKILL.md +229 -0
- package/resources/ecc/skills/x-api/agents/openai.yaml +7 -0
|
@@ -0,0 +1,529 @@
|
|
|
1
|
+
import { execSync } from 'node:child_process';
|
|
2
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
/**
|
|
5
|
+
* Detects the package manager used in the project.
|
|
6
|
+
* Priority order:
|
|
7
|
+
* 1. CROWCODER_PACKAGE_MANAGER env var
|
|
8
|
+
* 2. .crowcoder/package-manager.json in cwd
|
|
9
|
+
* 3. package.json packageManager field
|
|
10
|
+
* 4. Lock file detection
|
|
11
|
+
* 5. Fallback: which command check
|
|
12
|
+
*/
|
|
13
|
+
export function detectPackageManager(cwd) {
|
|
14
|
+
// 1. Check environment variable
|
|
15
|
+
const envPm = process.env.CROWCODER_PACKAGE_MANAGER;
|
|
16
|
+
if (envPm) {
|
|
17
|
+
return getPackageManagerInfo(envPm);
|
|
18
|
+
}
|
|
19
|
+
// 2. Check .crowcoder/package-manager.json
|
|
20
|
+
const configPath = join(cwd, '.crowcoder', 'package-manager.json');
|
|
21
|
+
if (existsSync(configPath)) {
|
|
22
|
+
try {
|
|
23
|
+
const config = JSON.parse(readFileSync(configPath, 'utf-8'));
|
|
24
|
+
if (config.packageManager) {
|
|
25
|
+
return getPackageManagerInfo(config.packageManager);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
// Continue to next detection method
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
// 3. Check package.json packageManager field
|
|
33
|
+
const packageJsonPath = join(cwd, 'package.json');
|
|
34
|
+
if (existsSync(packageJsonPath)) {
|
|
35
|
+
try {
|
|
36
|
+
const packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf-8'));
|
|
37
|
+
if (packageJson.packageManager) {
|
|
38
|
+
const pmString = packageJson.packageManager;
|
|
39
|
+
const pmName = pmString.split('@')[0];
|
|
40
|
+
return getPackageManagerInfo(pmName);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
// Continue to next detection method
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
// 4. Lock file detection
|
|
48
|
+
const lockFiles = [
|
|
49
|
+
['package-lock.json', 'npm'],
|
|
50
|
+
['yarn.lock', 'yarn'],
|
|
51
|
+
['pnpm-lock.yaml', 'pnpm'],
|
|
52
|
+
['bun.lockb', 'bun'],
|
|
53
|
+
];
|
|
54
|
+
for (const [lockFile, pmName] of lockFiles) {
|
|
55
|
+
if (existsSync(join(cwd, lockFile))) {
|
|
56
|
+
return getPackageManagerInfo(pmName);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
// 5. Check other language package managers
|
|
60
|
+
const otherManagers = [
|
|
61
|
+
['Cargo.toml', 'cargo'],
|
|
62
|
+
['go.mod', 'go'],
|
|
63
|
+
['pyproject.toml', 'pip'],
|
|
64
|
+
['setup.py', 'pip'],
|
|
65
|
+
['Gemfile', 'bundler'],
|
|
66
|
+
];
|
|
67
|
+
for (const [file, pmName] of otherManagers) {
|
|
68
|
+
if (existsSync(join(cwd, file))) {
|
|
69
|
+
return getPackageManagerInfo(pmName);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
// 6. Fallback: check which are installed
|
|
73
|
+
const fallbackOrder = ['npm', 'yarn', 'pnpm', 'bun', 'cargo', 'go', 'pip', 'bundler'];
|
|
74
|
+
for (const pm of fallbackOrder) {
|
|
75
|
+
try {
|
|
76
|
+
execSync(`which ${pm}`, { stdio: 'ignore' });
|
|
77
|
+
return getPackageManagerInfo(pm);
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
// Continue
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
// Final fallback to npm
|
|
84
|
+
return getPackageManagerInfo('npm');
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Maps package manager name to full info
|
|
88
|
+
*/
|
|
89
|
+
function getPackageManagerInfo(name) {
|
|
90
|
+
const managers = {
|
|
91
|
+
npm: {
|
|
92
|
+
name: 'npm',
|
|
93
|
+
command: 'npm',
|
|
94
|
+
installCmd: 'npm install',
|
|
95
|
+
runCmd: 'npm run',
|
|
96
|
+
lockFile: 'package-lock.json',
|
|
97
|
+
},
|
|
98
|
+
yarn: {
|
|
99
|
+
name: 'yarn',
|
|
100
|
+
command: 'yarn',
|
|
101
|
+
installCmd: 'yarn install',
|
|
102
|
+
runCmd: 'yarn run',
|
|
103
|
+
lockFile: 'yarn.lock',
|
|
104
|
+
},
|
|
105
|
+
pnpm: {
|
|
106
|
+
name: 'pnpm',
|
|
107
|
+
command: 'pnpm',
|
|
108
|
+
installCmd: 'pnpm install',
|
|
109
|
+
runCmd: 'pnpm run',
|
|
110
|
+
lockFile: 'pnpm-lock.yaml',
|
|
111
|
+
},
|
|
112
|
+
bun: {
|
|
113
|
+
name: 'bun',
|
|
114
|
+
command: 'bun',
|
|
115
|
+
installCmd: 'bun install',
|
|
116
|
+
runCmd: 'bun run',
|
|
117
|
+
lockFile: 'bun.lockb',
|
|
118
|
+
},
|
|
119
|
+
cargo: {
|
|
120
|
+
name: 'cargo',
|
|
121
|
+
command: 'cargo',
|
|
122
|
+
installCmd: 'cargo add',
|
|
123
|
+
runCmd: 'cargo run',
|
|
124
|
+
},
|
|
125
|
+
go: {
|
|
126
|
+
name: 'go',
|
|
127
|
+
command: 'go',
|
|
128
|
+
installCmd: 'go get',
|
|
129
|
+
runCmd: 'go run',
|
|
130
|
+
},
|
|
131
|
+
pip: {
|
|
132
|
+
name: 'pip',
|
|
133
|
+
command: 'pip',
|
|
134
|
+
installCmd: 'pip install',
|
|
135
|
+
runCmd: 'python -m',
|
|
136
|
+
},
|
|
137
|
+
bundler: {
|
|
138
|
+
name: 'bundler',
|
|
139
|
+
command: 'bundle',
|
|
140
|
+
installCmd: 'bundle install',
|
|
141
|
+
runCmd: 'bundle exec',
|
|
142
|
+
},
|
|
143
|
+
};
|
|
144
|
+
return managers[name.toLowerCase()] || managers['npm'];
|
|
145
|
+
}
|
|
146
|
+
// ── Test Runner Detection ──────────────────────────────────────────
|
|
147
|
+
/**
|
|
148
|
+
* Detects the test runner used in the project
|
|
149
|
+
*/
|
|
150
|
+
export function detectTestRunner(cwd) {
|
|
151
|
+
const packageJsonPath = join(cwd, 'package.json');
|
|
152
|
+
const pyprojectPath = join(cwd, 'pyproject.toml');
|
|
153
|
+
const cargoPath = join(cwd, 'Cargo.toml');
|
|
154
|
+
const goPath = join(cwd, 'go.mod');
|
|
155
|
+
// JavaScript/TypeScript test runners
|
|
156
|
+
if (existsSync(packageJsonPath)) {
|
|
157
|
+
try {
|
|
158
|
+
const packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf-8'));
|
|
159
|
+
const deps = {
|
|
160
|
+
...packageJson.dependencies,
|
|
161
|
+
...packageJson.devDependencies,
|
|
162
|
+
};
|
|
163
|
+
if (deps.jest) {
|
|
164
|
+
return {
|
|
165
|
+
name: 'jest',
|
|
166
|
+
command: 'jest',
|
|
167
|
+
coverageCommand: 'jest --coverage',
|
|
168
|
+
framework: 'javascript',
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
if (deps.vitest) {
|
|
172
|
+
return {
|
|
173
|
+
name: 'vitest',
|
|
174
|
+
command: 'vitest',
|
|
175
|
+
coverageCommand: 'vitest --coverage',
|
|
176
|
+
framework: 'javascript',
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
if (deps.mocha) {
|
|
180
|
+
return {
|
|
181
|
+
name: 'mocha',
|
|
182
|
+
command: 'mocha',
|
|
183
|
+
coverageCommand: 'nyc mocha',
|
|
184
|
+
framework: 'javascript',
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
if (deps.playwright) {
|
|
188
|
+
return {
|
|
189
|
+
name: 'playwright',
|
|
190
|
+
command: 'playwright test',
|
|
191
|
+
coverageCommand: 'playwright test --reporter=coverage',
|
|
192
|
+
framework: 'javascript',
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
if (deps.cypress) {
|
|
196
|
+
return {
|
|
197
|
+
name: 'cypress',
|
|
198
|
+
command: 'cypress run',
|
|
199
|
+
coverageCommand: 'cypress run --coverage',
|
|
200
|
+
framework: 'javascript',
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
// Check for vitest config files
|
|
204
|
+
if (existsSync(join(cwd, 'vitest.config.ts')) ||
|
|
205
|
+
existsSync(join(cwd, 'vitest.config.js'))) {
|
|
206
|
+
return {
|
|
207
|
+
name: 'vitest',
|
|
208
|
+
command: 'vitest',
|
|
209
|
+
coverageCommand: 'vitest --coverage',
|
|
210
|
+
framework: 'javascript',
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
// Check for jest config files
|
|
214
|
+
if (existsSync(join(cwd, 'jest.config.js')) ||
|
|
215
|
+
existsSync(join(cwd, 'jest.config.ts')) ||
|
|
216
|
+
existsSync(join(cwd, 'jest.config.json'))) {
|
|
217
|
+
return {
|
|
218
|
+
name: 'jest',
|
|
219
|
+
command: 'jest',
|
|
220
|
+
coverageCommand: 'jest --coverage',
|
|
221
|
+
framework: 'javascript',
|
|
222
|
+
};
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
catch {
|
|
226
|
+
// Continue to next detection
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
// Python test runners
|
|
230
|
+
if (existsSync(pyprojectPath)) {
|
|
231
|
+
try {
|
|
232
|
+
const pyproject = readFileSync(pyprojectPath, 'utf-8');
|
|
233
|
+
if (pyproject.includes('pytest')) {
|
|
234
|
+
return {
|
|
235
|
+
name: 'pytest',
|
|
236
|
+
command: 'pytest',
|
|
237
|
+
coverageCommand: 'pytest --cov',
|
|
238
|
+
framework: 'python',
|
|
239
|
+
};
|
|
240
|
+
}
|
|
241
|
+
if (pyproject.includes('unittest')) {
|
|
242
|
+
return {
|
|
243
|
+
name: 'unittest',
|
|
244
|
+
command: 'python -m unittest',
|
|
245
|
+
coverageCommand: 'coverage run -m unittest',
|
|
246
|
+
framework: 'python',
|
|
247
|
+
};
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
catch {
|
|
251
|
+
// Continue
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
// Python setup.py based projects
|
|
255
|
+
if (existsSync(join(cwd, 'setup.py'))) {
|
|
256
|
+
try {
|
|
257
|
+
const setup = readFileSync(join(cwd, 'setup.py'), 'utf-8');
|
|
258
|
+
if (setup.includes('pytest')) {
|
|
259
|
+
return {
|
|
260
|
+
name: 'pytest',
|
|
261
|
+
command: 'pytest',
|
|
262
|
+
coverageCommand: 'pytest --cov',
|
|
263
|
+
framework: 'python',
|
|
264
|
+
};
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
catch {
|
|
268
|
+
// Continue
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
// Rust test runner (cargo)
|
|
272
|
+
if (existsSync(cargoPath)) {
|
|
273
|
+
return {
|
|
274
|
+
name: 'cargo test',
|
|
275
|
+
command: 'cargo test',
|
|
276
|
+
coverageCommand: 'cargo tarpaulin',
|
|
277
|
+
framework: 'rust',
|
|
278
|
+
};
|
|
279
|
+
}
|
|
280
|
+
// Go test runner
|
|
281
|
+
if (existsSync(goPath)) {
|
|
282
|
+
return {
|
|
283
|
+
name: 'go test',
|
|
284
|
+
command: 'go test ./...',
|
|
285
|
+
coverageCommand: 'go test -cover ./...',
|
|
286
|
+
framework: 'go',
|
|
287
|
+
};
|
|
288
|
+
}
|
|
289
|
+
// Ruby test runners
|
|
290
|
+
if (existsSync(join(cwd, 'Gemfile'))) {
|
|
291
|
+
try {
|
|
292
|
+
const gemfile = readFileSync(join(cwd, 'Gemfile'), 'utf-8');
|
|
293
|
+
if (gemfile.includes('rspec')) {
|
|
294
|
+
return {
|
|
295
|
+
name: 'rspec',
|
|
296
|
+
command: 'rspec',
|
|
297
|
+
coverageCommand: 'rspec --coverage',
|
|
298
|
+
framework: 'ruby',
|
|
299
|
+
};
|
|
300
|
+
}
|
|
301
|
+
if (gemfile.includes('minitest')) {
|
|
302
|
+
return {
|
|
303
|
+
name: 'minitest',
|
|
304
|
+
command: 'ruby -Ilib:test test/**/*_test.rb',
|
|
305
|
+
coverageCommand: 'ruby -Ilib:test test/**/*_test.rb',
|
|
306
|
+
framework: 'ruby',
|
|
307
|
+
};
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
catch {
|
|
311
|
+
// Continue
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
// PHP test runners
|
|
315
|
+
if (existsSync(join(cwd, 'composer.json'))) {
|
|
316
|
+
try {
|
|
317
|
+
const composer = JSON.parse(readFileSync(join(cwd, 'composer.json'), 'utf-8'));
|
|
318
|
+
const devDeps = composer.devDependencies || {};
|
|
319
|
+
if (devDeps.phpunit) {
|
|
320
|
+
return {
|
|
321
|
+
name: 'phpunit',
|
|
322
|
+
command: 'vendor/bin/phpunit',
|
|
323
|
+
coverageCommand: 'vendor/bin/phpunit --coverage-html coverage',
|
|
324
|
+
framework: 'php',
|
|
325
|
+
};
|
|
326
|
+
}
|
|
327
|
+
if (devDeps.behat) {
|
|
328
|
+
return {
|
|
329
|
+
name: 'behat',
|
|
330
|
+
command: 'vendor/bin/behat',
|
|
331
|
+
coverageCommand: 'vendor/bin/behat',
|
|
332
|
+
framework: 'php',
|
|
333
|
+
};
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
catch {
|
|
337
|
+
// Continue
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
// Default fallback based on detected package manager
|
|
341
|
+
const pm = detectPackageManager(cwd);
|
|
342
|
+
if (pm.name === 'cargo') {
|
|
343
|
+
return {
|
|
344
|
+
name: 'cargo test',
|
|
345
|
+
command: 'cargo test',
|
|
346
|
+
coverageCommand: 'cargo tarpaulin',
|
|
347
|
+
framework: 'rust',
|
|
348
|
+
};
|
|
349
|
+
}
|
|
350
|
+
if (pm.name === 'go') {
|
|
351
|
+
return {
|
|
352
|
+
name: 'go test',
|
|
353
|
+
command: 'go test ./...',
|
|
354
|
+
coverageCommand: 'go test -cover ./...',
|
|
355
|
+
framework: 'go',
|
|
356
|
+
};
|
|
357
|
+
}
|
|
358
|
+
// Default to jest for Node.js projects
|
|
359
|
+
return {
|
|
360
|
+
name: 'jest',
|
|
361
|
+
command: 'jest',
|
|
362
|
+
coverageCommand: 'jest --coverage',
|
|
363
|
+
framework: 'javascript',
|
|
364
|
+
};
|
|
365
|
+
}
|
|
366
|
+
// ── Build Tool Detection ───────────────────────────────────────────
|
|
367
|
+
/**
|
|
368
|
+
* Detects the build tool used in the project
|
|
369
|
+
*/
|
|
370
|
+
export function detectBuildTool(cwd) {
|
|
371
|
+
const packageJsonPath = join(cwd, 'package.json');
|
|
372
|
+
const cargoPath = join(cwd, 'Cargo.toml');
|
|
373
|
+
const goPath = join(cwd, 'go.mod');
|
|
374
|
+
const makePath = join(cwd, 'Makefile');
|
|
375
|
+
const buildGradle = join(cwd, 'build.gradle');
|
|
376
|
+
const pomPath = join(cwd, 'pom.xml');
|
|
377
|
+
// JavaScript/TypeScript build tools
|
|
378
|
+
if (existsSync(packageJsonPath)) {
|
|
379
|
+
try {
|
|
380
|
+
const packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf-8'));
|
|
381
|
+
const deps = {
|
|
382
|
+
...packageJson.dependencies,
|
|
383
|
+
...packageJson.devDependencies,
|
|
384
|
+
};
|
|
385
|
+
// Check for vite
|
|
386
|
+
if (deps.vite) {
|
|
387
|
+
return {
|
|
388
|
+
name: 'vite',
|
|
389
|
+
command: 'vite build',
|
|
390
|
+
watchCommand: 'vite build --watch',
|
|
391
|
+
};
|
|
392
|
+
}
|
|
393
|
+
// Check for webpack
|
|
394
|
+
if (deps.webpack) {
|
|
395
|
+
return {
|
|
396
|
+
name: 'webpack',
|
|
397
|
+
command: 'webpack',
|
|
398
|
+
watchCommand: 'webpack --watch',
|
|
399
|
+
};
|
|
400
|
+
}
|
|
401
|
+
// Check for esbuild
|
|
402
|
+
if (deps.esbuild) {
|
|
403
|
+
return {
|
|
404
|
+
name: 'esbuild',
|
|
405
|
+
command: 'esbuild',
|
|
406
|
+
watchCommand: 'esbuild --watch',
|
|
407
|
+
};
|
|
408
|
+
}
|
|
409
|
+
// Check for tsup
|
|
410
|
+
if (deps.tsup) {
|
|
411
|
+
return {
|
|
412
|
+
name: 'tsup',
|
|
413
|
+
command: 'tsup',
|
|
414
|
+
watchCommand: 'tsup --watch',
|
|
415
|
+
};
|
|
416
|
+
}
|
|
417
|
+
// Check for rollup
|
|
418
|
+
if (deps.rollup) {
|
|
419
|
+
return {
|
|
420
|
+
name: 'rollup',
|
|
421
|
+
command: 'rollup -c',
|
|
422
|
+
watchCommand: 'rollup -c --watch',
|
|
423
|
+
};
|
|
424
|
+
}
|
|
425
|
+
// Check for parcel
|
|
426
|
+
if (deps.parcel) {
|
|
427
|
+
return {
|
|
428
|
+
name: 'parcel',
|
|
429
|
+
command: 'parcel build',
|
|
430
|
+
watchCommand: 'parcel',
|
|
431
|
+
};
|
|
432
|
+
}
|
|
433
|
+
// Check for tsc (TypeScript)
|
|
434
|
+
if (deps.typescript) {
|
|
435
|
+
return {
|
|
436
|
+
name: 'tsc',
|
|
437
|
+
command: 'tsc',
|
|
438
|
+
watchCommand: 'tsc --watch',
|
|
439
|
+
};
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
catch {
|
|
443
|
+
// Continue to next detection
|
|
444
|
+
}
|
|
445
|
+
}
|
|
446
|
+
// Check for config files
|
|
447
|
+
if (existsSync(join(cwd, 'vite.config.ts')) || existsSync(join(cwd, 'vite.config.js'))) {
|
|
448
|
+
return {
|
|
449
|
+
name: 'vite',
|
|
450
|
+
command: 'vite build',
|
|
451
|
+
watchCommand: 'vite build --watch',
|
|
452
|
+
};
|
|
453
|
+
}
|
|
454
|
+
if (existsSync(join(cwd, 'webpack.config.js')) || existsSync(join(cwd, 'webpack.config.ts'))) {
|
|
455
|
+
return {
|
|
456
|
+
name: 'webpack',
|
|
457
|
+
command: 'webpack',
|
|
458
|
+
watchCommand: 'webpack --watch',
|
|
459
|
+
};
|
|
460
|
+
}
|
|
461
|
+
if (existsSync(join(cwd, 'esbuild.js'))) {
|
|
462
|
+
return {
|
|
463
|
+
name: 'esbuild',
|
|
464
|
+
command: 'esbuild',
|
|
465
|
+
watchCommand: 'esbuild --watch',
|
|
466
|
+
};
|
|
467
|
+
}
|
|
468
|
+
if (existsSync(join(cwd, 'rollup.config.js')) || existsSync(join(cwd, 'rollup.config.ts'))) {
|
|
469
|
+
return {
|
|
470
|
+
name: 'rollup',
|
|
471
|
+
command: 'rollup -c',
|
|
472
|
+
watchCommand: 'rollup -c --watch',
|
|
473
|
+
};
|
|
474
|
+
}
|
|
475
|
+
if (existsSync(join(cwd, 'tsconfig.json'))) {
|
|
476
|
+
return {
|
|
477
|
+
name: 'tsc',
|
|
478
|
+
command: 'tsc',
|
|
479
|
+
watchCommand: 'tsc --watch',
|
|
480
|
+
};
|
|
481
|
+
}
|
|
482
|
+
// Rust build tool (cargo)
|
|
483
|
+
if (existsSync(cargoPath)) {
|
|
484
|
+
return {
|
|
485
|
+
name: 'cargo',
|
|
486
|
+
command: 'cargo build',
|
|
487
|
+
watchCommand: 'cargo watch -x build',
|
|
488
|
+
};
|
|
489
|
+
}
|
|
490
|
+
// Go build tool
|
|
491
|
+
if (existsSync(goPath)) {
|
|
492
|
+
return {
|
|
493
|
+
name: 'go build',
|
|
494
|
+
command: 'go build',
|
|
495
|
+
watchCommand: 'go build ./...',
|
|
496
|
+
};
|
|
497
|
+
}
|
|
498
|
+
// Make
|
|
499
|
+
if (existsSync(makePath)) {
|
|
500
|
+
return {
|
|
501
|
+
name: 'make',
|
|
502
|
+
command: 'make build',
|
|
503
|
+
watchCommand: 'make watch',
|
|
504
|
+
};
|
|
505
|
+
}
|
|
506
|
+
// Gradle (Java)
|
|
507
|
+
if (existsSync(buildGradle)) {
|
|
508
|
+
return {
|
|
509
|
+
name: 'gradle',
|
|
510
|
+
command: 'gradle build',
|
|
511
|
+
watchCommand: 'gradle build --continuous',
|
|
512
|
+
};
|
|
513
|
+
}
|
|
514
|
+
// Maven (Java)
|
|
515
|
+
if (existsSync(pomPath)) {
|
|
516
|
+
return {
|
|
517
|
+
name: 'maven',
|
|
518
|
+
command: 'mvn clean package',
|
|
519
|
+
watchCommand: 'mvn install -DskipTests',
|
|
520
|
+
};
|
|
521
|
+
}
|
|
522
|
+
// Default fallback
|
|
523
|
+
return {
|
|
524
|
+
name: 'tsc',
|
|
525
|
+
command: 'tsc',
|
|
526
|
+
watchCommand: 'tsc --watch',
|
|
527
|
+
};
|
|
528
|
+
}
|
|
529
|
+
//# sourceMappingURL=package-detect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"package-detect.js","sourceRoot":"","sources":["../src/package-detect.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Permission system — controls tool execution based on permission mode.
|
|
3
|
+
*
|
|
4
|
+
* Three modes:
|
|
5
|
+
* - `yolo`: All tools allowed without prompting
|
|
6
|
+
* - `auto`: Read-only tools allowed; destructive tools require confirmation
|
|
7
|
+
* - `ask`: All non-read-only tools require confirmation
|
|
8
|
+
*
|
|
9
|
+
* Users can type "always" when prompted to upgrade to `auto` mode
|
|
10
|
+
* for the rest of the session (and persist to config).
|
|
11
|
+
*/
|
|
12
|
+
import * as readline from 'node:readline/promises';
|
|
13
|
+
import type { Tool } from './tools/types.js';
|
|
14
|
+
import type { CrowcoderConfig } from './types.js';
|
|
15
|
+
/**
|
|
16
|
+
* Check if a tool call is allowed under the current permission mode.
|
|
17
|
+
* Returns true if allowed, false if denied.
|
|
18
|
+
*
|
|
19
|
+
* @param tool - The tool being invoked
|
|
20
|
+
* @param input - The tool's input arguments
|
|
21
|
+
* @param config - Current Crowcoder configuration (may be mutated if user types "always")
|
|
22
|
+
* @param rl - Readline interface for prompting the user
|
|
23
|
+
* @returns True if the tool call is allowed, false if denied
|
|
24
|
+
*/
|
|
25
|
+
export declare function checkPermission(tool: Tool, input: Record<string, unknown>, config: CrowcoderConfig, rl: readline.Interface): Promise<boolean>;
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import { saveConfig } from './config.js';
|
|
3
|
+
/**
|
|
4
|
+
* Check if a tool call is allowed under the current permission mode.
|
|
5
|
+
* Returns true if allowed, false if denied.
|
|
6
|
+
*
|
|
7
|
+
* @param tool - The tool being invoked
|
|
8
|
+
* @param input - The tool's input arguments
|
|
9
|
+
* @param config - Current Crowcoder configuration (may be mutated if user types "always")
|
|
10
|
+
* @param rl - Readline interface for prompting the user
|
|
11
|
+
* @returns True if the tool call is allowed, false if denied
|
|
12
|
+
*/
|
|
13
|
+
export async function checkPermission(tool, input, config, rl) {
|
|
14
|
+
// yolo mode = everything allowed
|
|
15
|
+
if (config.permissionMode === 'yolo')
|
|
16
|
+
return true;
|
|
17
|
+
// Read-only tools always allowed
|
|
18
|
+
if (tool.isReadOnly)
|
|
19
|
+
return true;
|
|
20
|
+
// auto mode = allow non-destructive, ask for destructive
|
|
21
|
+
if (config.permissionMode === 'auto' && !tool.isDestructive)
|
|
22
|
+
return true;
|
|
23
|
+
// ask mode or destructive in auto mode → prompt user
|
|
24
|
+
const desc = formatToolCall(tool, input);
|
|
25
|
+
console.log(chalk.yellow(`\n⚡ Tool: ${tool.name}`));
|
|
26
|
+
console.log(chalk.dim(desc));
|
|
27
|
+
const answer = await rl.question(chalk.yellow('Allow? [Y/n/always] '));
|
|
28
|
+
const a = answer.trim().toLowerCase();
|
|
29
|
+
if (a === 'always') {
|
|
30
|
+
// Upgrade to auto for rest of session and save to disk
|
|
31
|
+
config.permissionMode = 'auto';
|
|
32
|
+
saveConfig(config);
|
|
33
|
+
console.log(chalk.dim(' (auto-approving safe operations for this session and future sessions)'));
|
|
34
|
+
return true;
|
|
35
|
+
}
|
|
36
|
+
return a === '' || a === 'y' || a === 'yes';
|
|
37
|
+
}
|
|
38
|
+
function formatToolCall(tool, input) {
|
|
39
|
+
switch (tool.name) {
|
|
40
|
+
case 'bash':
|
|
41
|
+
return ` $ ${input.command}`;
|
|
42
|
+
case 'write_file':
|
|
43
|
+
return ` Write to: ${input.file_path} (${(input.content || '').split('\n').length} lines)`;
|
|
44
|
+
case 'edit_file':
|
|
45
|
+
return ` Edit: ${input.file_path}`;
|
|
46
|
+
default:
|
|
47
|
+
return ` ${JSON.stringify(input).slice(0, 200)}`;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=permissions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permissions.js","sourceRoot":"","sources":["../src/permissions.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,IAAU,EACV,KAA8B,EAC9B,MAAuB,EACvB,EAAsB;IAEtB,iCAAiC;IACjC,IAAI,MAAM,CAAC,cAAc,KAAK,MAAM;QAAE,OAAO,IAAI,CAAC;IAElD,iCAAiC;IACjC,IAAI,IAAI,CAAC,UAAU;QAAE,OAAO,IAAI,CAAC;IAEjC,yDAAyD;IACzD,IAAI,MAAM,CAAC,cAAc,KAAK,MAAM,IAAI,CAAC,IAAI,CAAC,aAAa;QAAE,OAAO,IAAI,CAAC;IAEzE,qDAAqD;IACrD,MAAM,IAAI,GAAG,cAAc,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACzC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,aAAa,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IACpD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;IAE7B,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,sBAAsB,CAAC,CAAC,CAAC;IACvE,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAEtC,IAAI,CAAC,KAAK,QAAQ,EAAE,CAAC;QACnB,uDAAuD;QACvD,MAAM,CAAC,cAAc,GAAG,MAAM,CAAC;QAC/B,UAAU,CAAC,MAAM,CAAC,CAAC;QACnB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,yEAAyE,CAAC,CAAC,CAAC;QAClG,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,KAAK,CAAC;AAC9C,CAAC;AAED,SAAS,cAAc,CAAC,IAAU,EAAE,KAA8B;IAChE,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;QAClB,KAAK,MAAM;YACT,OAAO,OAAO,KAAK,CAAC,OAAO,EAAE,CAAC;QAChC,KAAK,YAAY;YACf,OAAO,eAAe,KAAK,CAAC,SAAS,KAAK,CAAE,KAAK,CAAC,OAAkB,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,SAAS,CAAC;QAC1G,KAAK,WAAW;YACd,OAAO,WAAW,KAAK,CAAC,SAAS,EAAE,CAAC;QACtC;YACE,OAAO,KAAK,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;IACtD,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PM2 Service Lifecycle Management
|
|
3
|
+
* Utilities for managing background services with PM2.
|
|
4
|
+
*/
|
|
5
|
+
export interface ServiceConfig {
|
|
6
|
+
name: string;
|
|
7
|
+
script: string;
|
|
8
|
+
cwd: string;
|
|
9
|
+
env?: Record<string, string>;
|
|
10
|
+
instances?: number;
|
|
11
|
+
maxMemory?: string;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Build a prompt for Claude to help with PM2 lifecycle management.
|
|
15
|
+
* @param action - The PM2 action (start, stop, restart, delete, logs, status, scale)
|
|
16
|
+
* @returns A prompt describing what PM2 actions are available
|
|
17
|
+
*/
|
|
18
|
+
export declare function buildPM2Prompt(action: string): string;
|
|
19
|
+
/**
|
|
20
|
+
* Check if PM2 is installed and available.
|
|
21
|
+
* @returns true if pm2 command is available, false otherwise
|
|
22
|
+
*/
|
|
23
|
+
export declare function isPM2Available(): boolean;
|
|
24
|
+
/**
|
|
25
|
+
* List all PM2 services and return the formatted output.
|
|
26
|
+
* @param cwd - Working directory to run the command in
|
|
27
|
+
* @returns PM2 list output as a string
|
|
28
|
+
*/
|
|
29
|
+
export declare function listPM2Services(cwd: string): string;
|
|
30
|
+
/**
|
|
31
|
+
* Build a prompt for creating a PM2 ecosystem configuration file.
|
|
32
|
+
* @param cwd - Working directory where the ecosystem file will be created
|
|
33
|
+
* @returns A prompt with guidance on creating ecosystem.config.js
|
|
34
|
+
*/
|
|
35
|
+
export declare function buildEcosystemPrompt(cwd: string): string;
|
|
36
|
+
/**
|
|
37
|
+
* Pretty-print PM2 status output with colored formatting.
|
|
38
|
+
* @param output - Raw PM2 list output
|
|
39
|
+
*/
|
|
40
|
+
export declare function printPM2Status(output: string): void;
|