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 @@
|
|
|
1
|
+
{"version":3,"file":"rules.js","sourceRoot":"","sources":["../src/rules.ts"],"names":[],"mappings":"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"}
|
package/dist/schema.d.ts
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Schema definitions for persistent data stores.
|
|
3
|
+
*
|
|
4
|
+
* Each store is a JSON file under ~/.crowcoder/.
|
|
5
|
+
* Schema versions are tracked to support future migrations.
|
|
6
|
+
*/
|
|
7
|
+
export declare const USERS_TABLE_VERSION = 1;
|
|
8
|
+
export interface UserRow {
|
|
9
|
+
id: string;
|
|
10
|
+
name: string;
|
|
11
|
+
email?: string;
|
|
12
|
+
role?: string;
|
|
13
|
+
active: boolean;
|
|
14
|
+
createdAt: string;
|
|
15
|
+
updatedAt: string;
|
|
16
|
+
metadata: Record<string, string>;
|
|
17
|
+
}
|
|
18
|
+
export interface UsersTable {
|
|
19
|
+
version: number;
|
|
20
|
+
users: UserRow[];
|
|
21
|
+
activeUserId: string | null;
|
|
22
|
+
}
|
|
23
|
+
export declare function createEmptyUsersTable(): UsersTable;
|
package/dist/schema.js
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Schema definitions for persistent data stores.
|
|
3
|
+
*
|
|
4
|
+
* Each store is a JSON file under ~/.crowcoder/.
|
|
5
|
+
* Schema versions are tracked to support future migrations.
|
|
6
|
+
*/
|
|
7
|
+
// ── Users Table ──────────────────────────────────────────
|
|
8
|
+
export const USERS_TABLE_VERSION = 1;
|
|
9
|
+
export function createEmptyUsersTable() {
|
|
10
|
+
return { version: USERS_TABLE_VERSION, users: [], activeUserId: null };
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,4DAA4D;AAE5D,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC;AAmBrC,MAAM,UAAU,qBAAqB;IACnC,OAAO,EAAE,OAAO,EAAE,mBAAmB,EAAE,KAAK,EAAE,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC;AACzE,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Search-First Workflow — Research before implementation.
|
|
3
|
+
* Builds prompts that force the AI to understand existing code patterns
|
|
4
|
+
* before proposing new implementations.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Build a prompt that tells the AI to research existing code first
|
|
8
|
+
*/
|
|
9
|
+
export declare function buildSearchFirstPrompt(task: string, cwd: string): string;
|
|
10
|
+
/**
|
|
11
|
+
* Build a prompt for looking up documentation
|
|
12
|
+
*/
|
|
13
|
+
export declare function buildDocsLookupPrompt(query: string, cwd: string): string;
|
|
14
|
+
/**
|
|
15
|
+
* Print a summary of the research workflow
|
|
16
|
+
*/
|
|
17
|
+
export declare function printSearchFirstSummary(): void;
|
|
@@ -0,0 +1,301 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Search-First Workflow — Research before implementation.
|
|
3
|
+
* Builds prompts that force the AI to understand existing code patterns
|
|
4
|
+
* before proposing new implementations.
|
|
5
|
+
*/
|
|
6
|
+
import { execSync } from 'node:child_process';
|
|
7
|
+
import { existsSync, readFileSync, readdirSync } from 'node:fs';
|
|
8
|
+
import { join } from 'node:path';
|
|
9
|
+
import chalk from 'chalk';
|
|
10
|
+
/**
|
|
11
|
+
* Escape special regex characters for safe usage in grep patterns
|
|
12
|
+
*/
|
|
13
|
+
function escapeRegex(str) {
|
|
14
|
+
return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Safely run grep without throwing errors
|
|
18
|
+
*/
|
|
19
|
+
function safeGrep(pattern, path, filePattern = '*.ts') {
|
|
20
|
+
try {
|
|
21
|
+
const escaped = escapeRegex(pattern);
|
|
22
|
+
const result = execSync(`grep -r "${escaped}" "${path}" --include="${filePattern}" 2>/dev/null || echo ""`, {
|
|
23
|
+
encoding: 'utf-8',
|
|
24
|
+
cwd: path,
|
|
25
|
+
timeout: 10_000,
|
|
26
|
+
});
|
|
27
|
+
return result
|
|
28
|
+
.split('\n')
|
|
29
|
+
.filter((line) => line.trim())
|
|
30
|
+
.slice(0, 20); // Limit to first 20 matches
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
return [];
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Find relevant files based on keywords
|
|
38
|
+
*/
|
|
39
|
+
function findRelevantFiles(keyword, cwd) {
|
|
40
|
+
try {
|
|
41
|
+
const result = execSync(`find "${cwd}/src" -name "*.ts" -type f 2>/dev/null | head -30`, { encoding: 'utf-8', timeout: 5_000 });
|
|
42
|
+
const files = result
|
|
43
|
+
.split('\n')
|
|
44
|
+
.filter((f) => f.trim())
|
|
45
|
+
.map((f) => f.replace(cwd + '/', ''));
|
|
46
|
+
// Filter by keyword relevance
|
|
47
|
+
return files.filter((f) => f.toLowerCase().includes(keyword.toLowerCase()) ||
|
|
48
|
+
f.includes('types') ||
|
|
49
|
+
f.includes('index'));
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
return [];
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Read and summarize a file's key exports and patterns
|
|
57
|
+
*/
|
|
58
|
+
function summarizeFile(filePath, cwd) {
|
|
59
|
+
try {
|
|
60
|
+
const fullPath = join(cwd, filePath);
|
|
61
|
+
if (!existsSync(fullPath))
|
|
62
|
+
return '';
|
|
63
|
+
const content = readFileSync(fullPath, 'utf-8');
|
|
64
|
+
const lines = content.split('\n');
|
|
65
|
+
// Extract exports
|
|
66
|
+
const exports = lines
|
|
67
|
+
.filter((l) => l.includes('export '))
|
|
68
|
+
.slice(0, 10)
|
|
69
|
+
.map((l) => l.trim());
|
|
70
|
+
// Extract imports
|
|
71
|
+
const imports = lines
|
|
72
|
+
.filter((l) => l.includes('import '))
|
|
73
|
+
.slice(0, 5)
|
|
74
|
+
.map((l) => l.trim());
|
|
75
|
+
// Extract top-level function/class names
|
|
76
|
+
const definitions = lines
|
|
77
|
+
.filter((l) => /^(export\s+)?(function|class|interface|type|const)\s+\w+/.test(l))
|
|
78
|
+
.slice(0, 8)
|
|
79
|
+
.map((l) => l.trim());
|
|
80
|
+
let summary = `\n### ${filePath}\n`;
|
|
81
|
+
if (definitions.length > 0) {
|
|
82
|
+
summary += `**Definitions:**\n${definitions.map((d) => `- ${d}`).join('\n')}\n`;
|
|
83
|
+
}
|
|
84
|
+
if (exports.length > 0) {
|
|
85
|
+
summary += `**Key exports:**\n${exports.map((e) => `- ${e}`).join('\n')}\n`;
|
|
86
|
+
}
|
|
87
|
+
return summary;
|
|
88
|
+
}
|
|
89
|
+
catch {
|
|
90
|
+
return '';
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Find documentation files (README, docs/, comments in code)
|
|
95
|
+
*/
|
|
96
|
+
function findDocs(cwd) {
|
|
97
|
+
const docFiles = [];
|
|
98
|
+
// Check for README
|
|
99
|
+
const readmeFiles = ['README.md', 'readme.md', 'docs/README.md'];
|
|
100
|
+
for (const f of readmeFiles) {
|
|
101
|
+
if (existsSync(join(cwd, f))) {
|
|
102
|
+
docFiles.push(f);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
// Check for docs directory
|
|
106
|
+
const docsDir = join(cwd, 'docs');
|
|
107
|
+
if (existsSync(docsDir)) {
|
|
108
|
+
try {
|
|
109
|
+
const files = readdirSync(docsDir);
|
|
110
|
+
docFiles.push(...files.filter((f) => f.endsWith('.md')).map((f) => `docs/${f}`));
|
|
111
|
+
}
|
|
112
|
+
catch {
|
|
113
|
+
// Ignore errors
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
// Check for src/docs
|
|
117
|
+
const srcDocsDir = join(cwd, 'src', 'docs');
|
|
118
|
+
if (existsSync(srcDocsDir)) {
|
|
119
|
+
try {
|
|
120
|
+
const files = readdirSync(srcDocsDir);
|
|
121
|
+
docFiles.push(...files.filter((f) => f.endsWith('.md')).map((f) => `src/docs/${f}`));
|
|
122
|
+
}
|
|
123
|
+
catch {
|
|
124
|
+
// Ignore errors
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
return docFiles.slice(0, 10); // Limit to 10 docs
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Extract JSDoc comments from a file
|
|
131
|
+
*/
|
|
132
|
+
function extractJSDoc(filePath, cwd) {
|
|
133
|
+
try {
|
|
134
|
+
const fullPath = join(cwd, filePath);
|
|
135
|
+
if (!existsSync(fullPath))
|
|
136
|
+
return [];
|
|
137
|
+
const content = readFileSync(fullPath, 'utf-8');
|
|
138
|
+
const jsdocs = [];
|
|
139
|
+
const lines = content.split('\n');
|
|
140
|
+
for (let i = 0; i < lines.length; i++) {
|
|
141
|
+
if (lines[i].includes('/**')) {
|
|
142
|
+
let doc = '';
|
|
143
|
+
for (let j = i; j < Math.min(i + 10, lines.length); j++) {
|
|
144
|
+
doc += lines[j] + '\n';
|
|
145
|
+
if (lines[j].includes('*/')) {
|
|
146
|
+
jsdocs.push(doc);
|
|
147
|
+
break;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
return jsdocs.slice(0, 5);
|
|
153
|
+
}
|
|
154
|
+
catch {
|
|
155
|
+
return [];
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Build a prompt that tells the AI to research existing code first
|
|
160
|
+
*/
|
|
161
|
+
export function buildSearchFirstPrompt(task, cwd) {
|
|
162
|
+
const keyword = task.split(/\s+/)[0]; // Extract first word as search term
|
|
163
|
+
const relevantFiles = findRelevantFiles(keyword, cwd);
|
|
164
|
+
const relatedGreps = safeGrep(keyword, join(cwd, 'src'), '*.ts');
|
|
165
|
+
let research = '';
|
|
166
|
+
// Relevant file summaries
|
|
167
|
+
if (relevantFiles.length > 0) {
|
|
168
|
+
research += `\n## Relevant Existing Code\n`;
|
|
169
|
+
for (const file of relevantFiles.slice(0, 5)) {
|
|
170
|
+
research += summarizeFile(file, cwd);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
// Pattern matches
|
|
174
|
+
if (relatedGreps.length > 0) {
|
|
175
|
+
research += `\n## Related Code Patterns\n`;
|
|
176
|
+
research += 'Found these related patterns in the codebase:\n';
|
|
177
|
+
research += relatedGreps.map((g) => `\`\`\`\n${g}\n\`\`\``).join('\n');
|
|
178
|
+
}
|
|
179
|
+
return `# Research-First Implementation
|
|
180
|
+
|
|
181
|
+
## Task
|
|
182
|
+
${task}
|
|
183
|
+
|
|
184
|
+
## Before Writing Code: Research Phase
|
|
185
|
+
|
|
186
|
+
Please follow this approach:
|
|
187
|
+
|
|
188
|
+
1. **Analyze existing patterns** in the codebase
|
|
189
|
+
- Look at similar functions and modules
|
|
190
|
+
- Understand how the project structures code
|
|
191
|
+
- Check for established patterns we should follow
|
|
192
|
+
|
|
193
|
+
2. **Review documentation and comments**
|
|
194
|
+
- Check relevant files for JSDoc and inline comments
|
|
195
|
+
- Look for design patterns in existing implementations
|
|
196
|
+
- Understand architectural decisions
|
|
197
|
+
|
|
198
|
+
3. **Identify applicable patterns**
|
|
199
|
+
- What patterns from existing code apply here?
|
|
200
|
+
- Are there similar functions we should model after?
|
|
201
|
+
- What conventions does this project follow?
|
|
202
|
+
|
|
203
|
+
4. **Reference existing code in your proposal**
|
|
204
|
+
- When proposing a solution, reference the existing code that informed it
|
|
205
|
+
- Explain how your implementation follows established patterns
|
|
206
|
+
- Point out if you're introducing a new pattern and why
|
|
207
|
+
|
|
208
|
+
## Current Codebase Research
|
|
209
|
+
${research || '(Run research to populate this section)'}
|
|
210
|
+
|
|
211
|
+
## Implementation Guidelines
|
|
212
|
+
- Follow the style and patterns of existing code
|
|
213
|
+
- Use the same import structure and module organization
|
|
214
|
+
- Match the error handling approach used elsewhere
|
|
215
|
+
- Maintain consistency with project conventions
|
|
216
|
+
- Reference specific files and functions that informed the design
|
|
217
|
+
|
|
218
|
+
Now, please implement the task, but start by analyzing the codebase and then proposing your solution.`;
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Build a prompt for looking up documentation
|
|
222
|
+
*/
|
|
223
|
+
export function buildDocsLookupPrompt(query, cwd) {
|
|
224
|
+
const docFiles = findDocs(cwd);
|
|
225
|
+
const grepResults = safeGrep(query, join(cwd, 'src'), '*.ts');
|
|
226
|
+
let docsContent = '';
|
|
227
|
+
// Read doc files
|
|
228
|
+
if (docFiles.length > 0) {
|
|
229
|
+
docsContent += `\n## Documentation Files Found\n`;
|
|
230
|
+
for (const docFile of docFiles) {
|
|
231
|
+
const fullPath = join(cwd, docFile);
|
|
232
|
+
if (existsSync(fullPath)) {
|
|
233
|
+
try {
|
|
234
|
+
const content = readFileSync(fullPath, 'utf-8');
|
|
235
|
+
docsContent += `\n### ${docFile}\n\`\`\`\n${content.slice(0, 1000)}\n\`\`\`\n`;
|
|
236
|
+
}
|
|
237
|
+
catch {
|
|
238
|
+
docsContent += `\n### ${docFile} (could not read)\n`;
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
// JSDoc from relevant files
|
|
244
|
+
if (grepResults.length > 0) {
|
|
245
|
+
const srcFiles = findRelevantFiles(query, cwd).slice(0, 3);
|
|
246
|
+
docsContent += `\n## Code Documentation & Comments\n`;
|
|
247
|
+
for (const file of srcFiles) {
|
|
248
|
+
const jsDoc = extractJSDoc(file, cwd);
|
|
249
|
+
if (jsDoc.length > 0) {
|
|
250
|
+
docsContent += `\n### ${file}\n`;
|
|
251
|
+
docsContent += jsDoc.map((doc) => `\`\`\`typescript\n${doc}\n\`\`\``).join('\n');
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
return `# Documentation Lookup
|
|
256
|
+
|
|
257
|
+
## Query
|
|
258
|
+
${query}
|
|
259
|
+
|
|
260
|
+
## Research Results
|
|
261
|
+
|
|
262
|
+
### Step 1: Local Documentation
|
|
263
|
+
- Searched docs/ directory
|
|
264
|
+
- Searched README files
|
|
265
|
+
- Searched for configuration files
|
|
266
|
+
|
|
267
|
+
### Step 2: Code Comments & JSDoc
|
|
268
|
+
- Extracted JSDoc from relevant files
|
|
269
|
+
- Found inline documentation
|
|
270
|
+
- Checked for examples in tests
|
|
271
|
+
|
|
272
|
+
${docsContent || '(No documentation found - searching code patterns instead)'}
|
|
273
|
+
|
|
274
|
+
### Step 3: Code Patterns
|
|
275
|
+
${grepResults.length > 0
|
|
276
|
+
? 'Found these implementations:\n' +
|
|
277
|
+
grepResults.slice(0, 10).map((g) => `- ${g}`).join('\n')
|
|
278
|
+
: 'No specific patterns found'}
|
|
279
|
+
|
|
280
|
+
## Summary
|
|
281
|
+
Based on the documentation and code patterns found, here are the key findings:
|
|
282
|
+
|
|
283
|
+
1. **Documentation**: ${docFiles.length > 0 ? `Found ${docFiles.length} documentation files` : 'Limited documentation'}
|
|
284
|
+
2. **Code Examples**: ${grepResults.length > 0 ? `Found ${grepResults.length} related code snippets` : 'No examples'}
|
|
285
|
+
3. **Related Files**: ${findRelevantFiles(query, cwd).length} relevant source files
|
|
286
|
+
|
|
287
|
+
Please use these findings to answer the query.`;
|
|
288
|
+
}
|
|
289
|
+
/**
|
|
290
|
+
* Print a summary of the research workflow
|
|
291
|
+
*/
|
|
292
|
+
export function printSearchFirstSummary() {
|
|
293
|
+
console.log(chalk.cyan('\n📚 Search-First Workflow'));
|
|
294
|
+
console.log(chalk.gray('Research existing code before implementation\n'));
|
|
295
|
+
console.log(chalk.blue('Available prompts:'));
|
|
296
|
+
console.log(chalk.gray(' buildSearchFirstPrompt(task, cwd)'));
|
|
297
|
+
console.log(chalk.gray(' → Forces research phase before coding'));
|
|
298
|
+
console.log(chalk.gray(' buildDocsLookupPrompt(query, cwd)'));
|
|
299
|
+
console.log(chalk.gray(' → Looks up relevant documentation & patterns\n'));
|
|
300
|
+
}
|
|
301
|
+
//# sourceMappingURL=search-first.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search-first.js","sourceRoot":"","sources":["../src/search-first.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export type ThreatLevel = 'critical' | 'high' | 'medium' | 'low' | 'safe';
|
|
2
|
+
export interface SecurityScanResult {
|
|
3
|
+
level: ThreatLevel;
|
|
4
|
+
threats: string[];
|
|
5
|
+
blocked: boolean;
|
|
6
|
+
}
|
|
7
|
+
export declare function scanCommand(command: string): SecurityScanResult;
|
|
8
|
+
export declare function scanContent(content: string): SecurityScanResult;
|
|
9
|
+
export declare function scanToolCall(toolName: string, input: Record<string, unknown>): SecurityScanResult;
|
|
10
|
+
export declare function printSecurityWarning(result: SecurityScanResult): void;
|
package/dist/security.js
ADDED
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Security scanner — detect dangerous commands, secrets, and risky operations.
|
|
3
|
+
* Runs before tool execution to catch threats.
|
|
4
|
+
*/
|
|
5
|
+
import chalk from 'chalk';
|
|
6
|
+
// ── Dangerous command patterns ────────────────────────────
|
|
7
|
+
const DANGEROUS_COMMANDS = [
|
|
8
|
+
// Destructive filesystem
|
|
9
|
+
{ pattern: /\brm\s+(-[a-zA-Z]*f[a-zA-Z]*\s+|--force\s+).*(\*|\/|\~)/i, level: 'critical', description: 'Recursive force delete with wildcard/root path' },
|
|
10
|
+
{ pattern: /\brm\s+-[a-zA-Z]*r[a-zA-Z]*f/i, level: 'critical', description: 'rm -rf detected' },
|
|
11
|
+
{ pattern: /\brmdir\s+\/s\s+\/q/i, level: 'critical', description: 'Windows recursive delete' },
|
|
12
|
+
{ pattern: /\bformat\s+[a-zA-Z]:/i, level: 'critical', description: 'Disk format command' },
|
|
13
|
+
{ pattern: /\bmkfs\b/i, level: 'critical', description: 'Filesystem format command' },
|
|
14
|
+
{ pattern: />\s*\/dev\/sda/i, level: 'critical', description: 'Direct write to disk device' },
|
|
15
|
+
{ pattern: /\bdd\s+.*of=\/dev\//i, level: 'critical', description: 'dd write to device' },
|
|
16
|
+
// Destructive git
|
|
17
|
+
{ pattern: /\bgit\s+push\s+.*--force/i, level: 'high', description: 'Git force push' },
|
|
18
|
+
{ pattern: /\bgit\s+push\s+-f\b/i, level: 'high', description: 'Git force push (-f)' },
|
|
19
|
+
{ pattern: /\bgit\s+reset\s+--hard/i, level: 'high', description: 'Git hard reset (destroys uncommitted changes)' },
|
|
20
|
+
{ pattern: /\bgit\s+clean\s+-[a-zA-Z]*f/i, level: 'high', description: 'Git clean -f (deletes untracked files)' },
|
|
21
|
+
{ pattern: /\bgit\s+checkout\s+--\s+\./i, level: 'high', description: 'Git checkout -- . (discard all changes)' },
|
|
22
|
+
{ pattern: /\bgit\s+branch\s+-D/i, level: 'medium', description: 'Force delete git branch' },
|
|
23
|
+
// Database destruction
|
|
24
|
+
{ pattern: /\bDROP\s+(TABLE|DATABASE|SCHEMA)\b/i, level: 'critical', description: 'SQL DROP statement' },
|
|
25
|
+
{ pattern: /\bTRUNCATE\s+TABLE\b/i, level: 'high', description: 'SQL TRUNCATE table' },
|
|
26
|
+
{ pattern: /\bDELETE\s+FROM\s+\w+\s*(;|$)/i, level: 'high', description: 'DELETE without WHERE clause' },
|
|
27
|
+
{ pattern: /\bALTER\s+TABLE\s+.*DROP\s+COLUMN/i, level: 'medium', description: 'Drop column from table' },
|
|
28
|
+
// System/privilege escalation
|
|
29
|
+
{ pattern: /\bchmod\s+777\b/i, level: 'high', description: 'chmod 777 (world-writable)' },
|
|
30
|
+
{ pattern: /\bchmod\s+.*\+s\b/i, level: 'high', description: 'Set SUID/SGID bit' },
|
|
31
|
+
{ pattern: /\bcurl\s+.*\|\s*(sudo\s+)?bash/i, level: 'critical', description: 'Pipe curl to bash (remote code execution)' },
|
|
32
|
+
{ pattern: /\bwget\s+.*\|\s*(sudo\s+)?bash/i, level: 'critical', description: 'Pipe wget to bash (remote code execution)' },
|
|
33
|
+
{ pattern: /\beval\s*\(/i, level: 'medium', description: 'eval() usage (code injection risk)' },
|
|
34
|
+
// Process/network
|
|
35
|
+
{ pattern: /\bkill\s+-9\s+1\b/i, level: 'critical', description: 'Kill init process' },
|
|
36
|
+
{ pattern: /\bkillall\b/i, level: 'medium', description: 'Kill all processes by name' },
|
|
37
|
+
{ pattern: /\b:(){ :|:& };:/i, level: 'critical', description: 'Fork bomb detected' },
|
|
38
|
+
// Environment/config destruction
|
|
39
|
+
{ pattern: /\bunset\s+(PATH|HOME|USER)\b/i, level: 'high', description: 'Unsetting critical env var' },
|
|
40
|
+
{ pattern: /\bexport\s+PATH\s*=\s*$/i, level: 'high', description: 'Clearing PATH variable' },
|
|
41
|
+
// Crypto/ransomware patterns
|
|
42
|
+
{ pattern: /\bopenssl\s+enc\s+.*-aes/i, level: 'medium', description: 'File encryption command' },
|
|
43
|
+
{ pattern: /\bgpg\s+.*--encrypt\b/i, level: 'low', description: 'GPG encryption' },
|
|
44
|
+
];
|
|
45
|
+
// ── Secret patterns ───────────────────────────────────────
|
|
46
|
+
const SECRET_PATTERNS = [
|
|
47
|
+
{ pattern: /(?:api[_-]?key|apikey)\s*[:=]\s*['"][a-zA-Z0-9_\-]{20,}/i, description: 'API key detected' },
|
|
48
|
+
{ pattern: /(?:secret|token|password|passwd|pwd)\s*[:=]\s*['"][^'"]{8,}/i, description: 'Secret/password in code' },
|
|
49
|
+
{ pattern: /(?:aws_access_key_id|aws_secret_access_key)\s*[:=]/i, description: 'AWS credentials' },
|
|
50
|
+
{ pattern: /(?:AKIA|ASIA)[A-Z0-9]{16}/i, description: 'AWS access key ID' },
|
|
51
|
+
{ pattern: /-----BEGIN\s+(RSA |DSA |EC )?PRIVATE KEY-----/i, description: 'Private key detected' },
|
|
52
|
+
{ pattern: /ghp_[a-zA-Z0-9]{36}/i, description: 'GitHub personal access token' },
|
|
53
|
+
{ pattern: /sk-[a-zA-Z0-9]{40,}/i, description: 'OpenAI/Stripe secret key' },
|
|
54
|
+
{ pattern: /xox[bpoas]-[a-zA-Z0-9\-]+/i, description: 'Slack token' },
|
|
55
|
+
{ pattern: /eyJ[a-zA-Z0-9_-]{10,}\.[a-zA-Z0-9_-]{10,}/i, description: 'JWT token' },
|
|
56
|
+
];
|
|
57
|
+
export function scanCommand(command) {
|
|
58
|
+
const threats = [];
|
|
59
|
+
let maxLevel = 'safe';
|
|
60
|
+
for (const rule of DANGEROUS_COMMANDS) {
|
|
61
|
+
if (rule.pattern.test(command)) {
|
|
62
|
+
threats.push(`[${rule.level.toUpperCase()}] ${rule.description}`);
|
|
63
|
+
if (severityRank(rule.level) > severityRank(maxLevel)) {
|
|
64
|
+
maxLevel = rule.level;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
return {
|
|
69
|
+
level: maxLevel,
|
|
70
|
+
threats,
|
|
71
|
+
blocked: maxLevel === 'critical',
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
export function scanContent(content) {
|
|
75
|
+
const threats = [];
|
|
76
|
+
let maxLevel = 'safe';
|
|
77
|
+
for (const rule of SECRET_PATTERNS) {
|
|
78
|
+
if (rule.pattern.test(content)) {
|
|
79
|
+
threats.push(`[SECRET] ${rule.description}`);
|
|
80
|
+
if (severityRank('high') > severityRank(maxLevel)) {
|
|
81
|
+
maxLevel = 'high';
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
return {
|
|
86
|
+
level: maxLevel,
|
|
87
|
+
threats,
|
|
88
|
+
blocked: false,
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
export function scanToolCall(toolName, input) {
|
|
92
|
+
const allThreats = [];
|
|
93
|
+
let maxLevel = 'safe';
|
|
94
|
+
// Scan bash commands
|
|
95
|
+
if (toolName === 'bash' && typeof input.command === 'string') {
|
|
96
|
+
const cmdScan = scanCommand(input.command);
|
|
97
|
+
allThreats.push(...cmdScan.threats);
|
|
98
|
+
if (severityRank(cmdScan.level) > severityRank(maxLevel))
|
|
99
|
+
maxLevel = cmdScan.level;
|
|
100
|
+
}
|
|
101
|
+
// Scan file content for secrets
|
|
102
|
+
if (toolName === 'write_file' && typeof input.content === 'string') {
|
|
103
|
+
const contentScan = scanContent(input.content);
|
|
104
|
+
allThreats.push(...contentScan.threats);
|
|
105
|
+
if (severityRank(contentScan.level) > severityRank(maxLevel))
|
|
106
|
+
maxLevel = contentScan.level;
|
|
107
|
+
}
|
|
108
|
+
// Scan file paths for sensitive locations
|
|
109
|
+
const filePath = input.file_path;
|
|
110
|
+
if (filePath) {
|
|
111
|
+
if (/\.(env|pem|key|p12|pfx)$/i.test(filePath)) {
|
|
112
|
+
allThreats.push('[MEDIUM] Accessing sensitive file type');
|
|
113
|
+
if (severityRank('medium') > severityRank(maxLevel))
|
|
114
|
+
maxLevel = 'medium';
|
|
115
|
+
}
|
|
116
|
+
if (/\/etc\/(passwd|shadow|sudoers)/i.test(filePath)) {
|
|
117
|
+
allThreats.push('[HIGH] Accessing system security file');
|
|
118
|
+
if (severityRank('high') > severityRank(maxLevel))
|
|
119
|
+
maxLevel = 'high';
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
return { level: maxLevel, threats: allThreats, blocked: maxLevel === 'critical' };
|
|
123
|
+
}
|
|
124
|
+
export function printSecurityWarning(result) {
|
|
125
|
+
if (result.threats.length === 0)
|
|
126
|
+
return;
|
|
127
|
+
const levelColor = {
|
|
128
|
+
critical: chalk.bgRed.white.bold,
|
|
129
|
+
high: chalk.red.bold,
|
|
130
|
+
medium: chalk.yellow,
|
|
131
|
+
low: chalk.dim,
|
|
132
|
+
safe: chalk.green,
|
|
133
|
+
};
|
|
134
|
+
console.log(levelColor[result.level](` ⚠ Security: ${result.level.toUpperCase()}`));
|
|
135
|
+
for (const t of result.threats) {
|
|
136
|
+
console.log(chalk.yellow(` ${t}`));
|
|
137
|
+
}
|
|
138
|
+
if (result.blocked) {
|
|
139
|
+
console.log(chalk.bgRed.white(' BLOCKED — this operation was prevented.'));
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
function severityRank(level) {
|
|
143
|
+
return { safe: 0, low: 1, medium: 2, high: 3, critical: 4 }[level];
|
|
144
|
+
}
|
|
145
|
+
//# sourceMappingURL=security.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"security.js","sourceRoot":"","sources":["../src/security.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { Message } from './types.js';
|
|
2
|
+
export interface Session {
|
|
3
|
+
id: string;
|
|
4
|
+
name: string;
|
|
5
|
+
cwd: string;
|
|
6
|
+
model: string;
|
|
7
|
+
provider: string;
|
|
8
|
+
messages: Message[];
|
|
9
|
+
createdAt: string;
|
|
10
|
+
updatedAt: string;
|
|
11
|
+
tokenCount: number;
|
|
12
|
+
turnCount: number;
|
|
13
|
+
mode: string;
|
|
14
|
+
}
|
|
15
|
+
export declare function generateSessionId(): string;
|
|
16
|
+
export declare function saveSession(session: Session): Promise<void>;
|
|
17
|
+
export declare function loadSession(id: string): Session | null;
|
|
18
|
+
export declare function listSessions(): Pick<Session, 'id' | 'name' | 'cwd' | 'model' | 'createdAt' | 'updatedAt' | 'turnCount'>[];
|
|
19
|
+
export declare function deleteSession(id: string): boolean;
|
|
20
|
+
export declare function createSession(cwd: string, model: string, provider: string, mode: string): Session;
|
|
21
|
+
export declare function autoSave(session: Session, messages: Message[]): Promise<void>;
|