@promptci/core 0.0.1 → 0.2.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 +201 -201
- package/README.md +29 -30
- package/dist/action-pinning.d.ts +37 -0
- package/dist/action-pinning.d.ts.map +1 -0
- package/dist/action-pinning.js +277 -0
- package/dist/action-pinning.js.map +1 -0
- package/dist/agent-practices.d.ts +3 -1
- package/dist/agent-practices.d.ts.map +1 -1
- package/dist/agent-practices.js +198 -94
- package/dist/agent-practices.js.map +1 -1
- package/dist/ai-config.d.ts +178 -0
- package/dist/ai-config.d.ts.map +1 -0
- package/dist/ai-config.js +721 -0
- package/dist/ai-config.js.map +1 -0
- package/dist/alias-files.d.ts +33 -0
- package/dist/alias-files.d.ts.map +1 -0
- package/dist/alias-files.js +60 -0
- package/dist/alias-files.js.map +1 -0
- package/dist/baseline.d.ts +17 -1
- package/dist/baseline.d.ts.map +1 -1
- package/dist/baseline.js +5 -1
- package/dist/baseline.js.map +1 -1
- package/dist/buried-critical.d.ts +17 -0
- package/dist/buried-critical.d.ts.map +1 -0
- package/dist/buried-critical.js +107 -0
- package/dist/buried-critical.js.map +1 -0
- package/dist/canonical-owner.d.ts.map +1 -1
- package/dist/canonical-owner.js +60 -30
- package/dist/canonical-owner.js.map +1 -1
- package/dist/ci-alignment.d.ts.map +1 -1
- package/dist/ci-alignment.js +3 -2
- package/dist/ci-alignment.js.map +1 -1
- package/dist/command-validity.d.ts +16 -0
- package/dist/command-validity.d.ts.map +1 -1
- package/dist/command-validity.js +387 -134
- package/dist/command-validity.js.map +1 -1
- package/dist/conflicts.d.ts.map +1 -1
- package/dist/conflicts.js +4 -44
- package/dist/conflicts.js.map +1 -1
- package/dist/context-analysis.d.ts.map +1 -1
- package/dist/context-analysis.js +13 -2
- package/dist/context-analysis.js.map +1 -1
- package/dist/context-bloat.d.ts +20 -1
- package/dist/context-bloat.d.ts.map +1 -1
- package/dist/context-bloat.js +99 -15
- package/dist/context-bloat.js.map +1 -1
- package/dist/context-optimizer.d.ts.map +1 -1
- package/dist/context-optimizer.js +18 -54
- package/dist/context-optimizer.js.map +1 -1
- package/dist/copilot-instructions-detector.d.ts +24 -0
- package/dist/copilot-instructions-detector.d.ts.map +1 -0
- package/dist/copilot-instructions-detector.js +145 -0
- package/dist/copilot-instructions-detector.js.map +1 -0
- package/dist/cursor-rules-detector.d.ts +17 -0
- package/dist/cursor-rules-detector.d.ts.map +1 -0
- package/dist/cursor-rules-detector.js +110 -0
- package/dist/cursor-rules-detector.js.map +1 -0
- package/dist/custom-rules.d.ts +52 -0
- package/dist/custom-rules.d.ts.map +1 -0
- package/dist/custom-rules.js +303 -0
- package/dist/custom-rules.js.map +1 -0
- package/dist/dead-references.d.ts +8 -2
- package/dist/dead-references.d.ts.map +1 -1
- package/dist/dead-references.js +315 -68
- package/dist/dead-references.js.map +1 -1
- package/dist/dependency-staleness.d.ts +35 -0
- package/dist/dependency-staleness.d.ts.map +1 -0
- package/dist/dependency-staleness.js +1001 -0
- package/dist/dependency-staleness.js.map +1 -0
- package/dist/detectors.d.ts +1 -3
- package/dist/detectors.d.ts.map +1 -1
- package/dist/detectors.js +74 -56
- package/dist/detectors.js.map +1 -1
- package/dist/duplicates.d.ts.map +1 -1
- package/dist/duplicates.js +15 -9
- package/dist/duplicates.js.map +1 -1
- package/dist/evidence.d.ts +39 -0
- package/dist/evidence.d.ts.map +1 -0
- package/dist/evidence.js +78 -0
- package/dist/evidence.js.map +1 -0
- package/dist/finding-id.d.ts +21 -0
- package/dist/finding-id.d.ts.map +1 -0
- package/dist/finding-id.js +31 -0
- package/dist/finding-id.js.map +1 -0
- package/dist/fix-engine.d.ts +11 -0
- package/dist/fix-engine.d.ts.map +1 -1
- package/dist/fix-engine.js +88 -71
- package/dist/fix-engine.js.map +1 -1
- package/dist/frameworks/dotnet.js +2 -2
- package/dist/frameworks/dotnet.js.map +1 -1
- package/dist/frameworks/python.d.ts.map +1 -1
- package/dist/frameworks/python.js +5 -2
- package/dist/frameworks/python.js.map +1 -1
- package/dist/frameworks/rust.d.ts.map +1 -1
- package/dist/frameworks/rust.js +2 -1
- package/dist/frameworks/rust.js.map +1 -1
- package/dist/git-symlinks.d.ts +30 -0
- package/dist/git-symlinks.d.ts.map +1 -0
- package/dist/git-symlinks.js +161 -0
- package/dist/git-symlinks.js.map +1 -0
- package/dist/gitignore.d.ts +22 -0
- package/dist/gitignore.d.ts.map +1 -0
- package/dist/gitignore.js +157 -0
- package/dist/gitignore.js.map +1 -0
- package/dist/health-score.d.ts.map +1 -1
- package/dist/health-score.js +35 -5
- package/dist/health-score.js.map +1 -1
- package/dist/hooks-settings-detector.d.ts +17 -0
- package/dist/hooks-settings-detector.d.ts.map +1 -0
- package/dist/hooks-settings-detector.js +228 -0
- package/dist/hooks-settings-detector.js.map +1 -0
- package/dist/index.d.ts +29 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +21 -6
- package/dist/index.js.map +1 -1
- package/dist/makefile.d.ts +37 -0
- package/dist/makefile.d.ts.map +1 -0
- package/dist/makefile.js +156 -0
- package/dist/makefile.js.map +1 -0
- package/dist/manifest-consistency.d.ts +6 -0
- package/dist/manifest-consistency.d.ts.map +1 -1
- package/dist/manifest-consistency.js +75 -10
- package/dist/manifest-consistency.js.map +1 -1
- package/dist/markdown-fences.d.ts +112 -0
- package/dist/markdown-fences.d.ts.map +1 -0
- package/dist/markdown-fences.js +174 -0
- package/dist/markdown-fences.js.map +1 -0
- package/dist/mcp-config-detector.d.ts +20 -0
- package/dist/mcp-config-detector.d.ts.map +1 -0
- package/dist/mcp-config-detector.js +237 -0
- package/dist/mcp-config-detector.js.map +1 -0
- package/dist/missing-context.d.ts.map +1 -1
- package/dist/missing-context.js +2 -52
- package/dist/missing-context.js.map +1 -1
- package/dist/model-budgets.d.ts +69 -0
- package/dist/model-budgets.d.ts.map +1 -0
- package/dist/model-budgets.js +110 -0
- package/dist/model-budgets.js.map +1 -0
- package/dist/negative-instructions.d.ts +26 -0
- package/dist/negative-instructions.d.ts.map +1 -0
- package/dist/negative-instructions.js +169 -0
- package/dist/negative-instructions.js.map +1 -0
- package/dist/path-containment.d.ts +41 -0
- package/dist/path-containment.d.ts.map +1 -0
- package/dist/path-containment.js +123 -0
- package/dist/path-containment.js.map +1 -0
- package/dist/project-type.d.ts +12 -2
- package/dist/project-type.d.ts.map +1 -1
- package/dist/project-type.js +25 -12
- package/dist/project-type.js.map +1 -1
- package/dist/prompt-cache.d.ts.map +1 -1
- package/dist/prompt-cache.js +33 -24
- package/dist/prompt-cache.js.map +1 -1
- package/dist/promptci-gitignore.d.ts +34 -0
- package/dist/promptci-gitignore.d.ts.map +1 -0
- package/dist/promptci-gitignore.js +42 -0
- package/dist/promptci-gitignore.js.map +1 -0
- package/dist/repo-context.d.ts +80 -0
- package/dist/repo-context.d.ts.map +1 -1
- package/dist/repo-context.js +170 -16
- package/dist/repo-context.js.map +1 -1
- package/dist/report.d.ts +8 -0
- package/dist/report.d.ts.map +1 -1
- package/dist/report.js +163 -63
- package/dist/report.js.map +1 -1
- package/dist/scan.d.ts.map +1 -1
- package/dist/scan.js +47 -4
- package/dist/scan.js.map +1 -1
- package/dist/scanner.d.ts +61 -1
- package/dist/scanner.d.ts.map +1 -1
- package/dist/scanner.js +367 -70
- package/dist/scanner.js.map +1 -1
- package/dist/security-pack.d.ts +20 -0
- package/dist/security-pack.d.ts.map +1 -1
- package/dist/security-pack.js +33 -14
- package/dist/security-pack.js.map +1 -1
- package/dist/skill-supply-chain.d.ts +132 -0
- package/dist/skill-supply-chain.d.ts.map +1 -0
- package/dist/skill-supply-chain.js +2954 -0
- package/dist/skill-supply-chain.js.map +1 -0
- package/dist/skills-detector.d.ts +23 -0
- package/dist/skills-detector.d.ts.map +1 -0
- package/dist/skills-detector.js +279 -0
- package/dist/skills-detector.js.map +1 -0
- package/dist/stale-instructions.d.ts +4 -1
- package/dist/stale-instructions.d.ts.map +1 -1
- package/dist/stale-instructions.js +53 -55
- package/dist/stale-instructions.js.map +1 -1
- package/dist/subagents-detector.d.ts +19 -0
- package/dist/subagents-detector.d.ts.map +1 -0
- package/dist/subagents-detector.js +155 -0
- package/dist/subagents-detector.js.map +1 -0
- package/dist/suppression.d.ts +2 -0
- package/dist/suppression.d.ts.map +1 -1
- package/dist/suppression.js +16 -47
- package/dist/suppression.js.map +1 -1
- package/dist/types.d.ts +62 -4
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +47 -1
- package/dist/types.js.map +1 -1
- package/dist/vague-guidance.d.ts +15 -2
- package/dist/vague-guidance.d.ts.map +1 -1
- package/dist/vague-guidance.js +44 -41
- package/dist/vague-guidance.js.map +1 -1
- package/dist/windsurf-detector.d.ts +22 -0
- package/dist/windsurf-detector.d.ts.map +1 -0
- package/dist/windsurf-detector.js +96 -0
- package/dist/windsurf-detector.js.map +1 -0
- package/dist/within-section-dedup.d.ts +16 -0
- package/dist/within-section-dedup.d.ts.map +1 -0
- package/dist/within-section-dedup.js +148 -0
- package/dist/within-section-dedup.js.map +1 -0
- package/dist/workspace-manifests.d.ts +80 -0
- package/dist/workspace-manifests.d.ts.map +1 -0
- package/dist/workspace-manifests.js +333 -0
- package/dist/workspace-manifests.js.map +1 -0
- package/package.json +11 -8
- package/dist/cheap-model-routing.d.ts +0 -4
- package/dist/cheap-model-routing.d.ts.map +0 -1
- package/dist/cheap-model-routing.js +0 -43
- package/dist/cheap-model-routing.js.map +0 -1
- package/dist/cli-output-filter.d.ts +0 -16
- package/dist/cli-output-filter.d.ts.map +0 -1
- package/dist/cli-output-filter.js +0 -88
- package/dist/cli-output-filter.js.map +0 -1
- package/dist/context-cost.d.ts +0 -4
- package/dist/context-cost.d.ts.map +0 -1
- package/dist/context-cost.js +0 -70
- package/dist/context-cost.js.map +0 -1
- package/dist/context-recommender.d.ts +0 -3
- package/dist/context-recommender.d.ts.map +0 -1
- package/dist/context-recommender.js +0 -329
- package/dist/context-recommender.js.map +0 -1
- package/dist/llm.d.ts +0 -6
- package/dist/llm.d.ts.map +0 -1
- package/dist/llm.js +0 -67
- package/dist/llm.js.map +0 -1
- package/dist/mcp-detector.d.ts +0 -4
- package/dist/mcp-detector.d.ts.map +0 -1
- package/dist/mcp-detector.js +0 -131
- package/dist/mcp-detector.js.map +0 -1
- package/dist/native-tool-preference.d.ts +0 -20
- package/dist/native-tool-preference.d.ts.map +0 -1
- package/dist/native-tool-preference.js +0 -94
- package/dist/native-tool-preference.js.map +0 -1
- package/dist/output-verbosity.d.ts +0 -3
- package/dist/output-verbosity.d.ts.map +0 -1
- package/dist/output-verbosity.js +0 -83
- package/dist/output-verbosity.js.map +0 -1
- package/dist/product-boundary.d.ts +0 -11
- package/dist/product-boundary.d.ts.map +0 -1
- package/dist/product-boundary.js +0 -301
- package/dist/product-boundary.js.map +0 -1
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
const ROUTING_KEYWORDS = [
|
|
2
|
-
/\b(?:cheap|cheaper|smaller|cost-aware|routing)\b.*\b(?:model|models|route|routing)\b/i,
|
|
3
|
-
/\b(?:escalate\s+to|escalation\s+path|stronger\s+model|expensive\s+model)\b/i,
|
|
4
|
-
/\bgpt-4o-mini\b/i,
|
|
5
|
-
/\bclaude-3-5-haiku\b|\bhaiku\b/i,
|
|
6
|
-
/\bgemini-2\.5-flash\b|\bgemini\s+flash\b|\bflash\s+model\b/i,
|
|
7
|
-
/\bmodel\s+routing\b/i,
|
|
8
|
-
];
|
|
9
|
-
export function detectCheapModelRouting(context) {
|
|
10
|
-
const { files, metrics } = context;
|
|
11
|
-
if (files.length === 0) {
|
|
12
|
-
return [];
|
|
13
|
-
}
|
|
14
|
-
// Skip for small/simple repositories to avoid noise
|
|
15
|
-
if (metrics.estimatedInstructionTokens < 500) {
|
|
16
|
-
return [];
|
|
17
|
-
}
|
|
18
|
-
const combinedContent = files.map((f) => f.content).join('\n');
|
|
19
|
-
const hasRoutingMentions = ROUTING_KEYWORDS.some((pat) => pat.test(combinedContent));
|
|
20
|
-
if (!hasRoutingMentions) {
|
|
21
|
-
return [
|
|
22
|
-
{
|
|
23
|
-
id: 'cheap-model-routing-missing',
|
|
24
|
-
severity: 'info',
|
|
25
|
-
category: 'agent_practices',
|
|
26
|
-
title: 'Missing model routing guidance',
|
|
27
|
-
summary: 'No model routing guidelines found in instruction files. Using expensive frontier models for simple tasks (like linting or formatting) unnecessarily increases AI costs.',
|
|
28
|
-
filePaths: files.map((f) => f.path),
|
|
29
|
-
locations: [],
|
|
30
|
-
evidence: ['No mentions of cheaper models, model routing, or escalation conditions found in instructions.'],
|
|
31
|
-
recommendation: 'Add guidelines specifying when to use cheaper/smaller models (e.g. Gemini 2.5 Flash, GPT-4o-mini) versus escalating to stronger models.',
|
|
32
|
-
fixRecipe: [
|
|
33
|
-
'### Model Routing Guidance',
|
|
34
|
-
'- Use cheaper/smaller models (e.g. Gemini 2.5 Flash, GPT-4o-mini) for: formatting, linting, simple test additions, mechanical renames, and documentation updates.',
|
|
35
|
-
'- Escalate to stronger models (e.g. Gemini 2.5 Pro, Claude 3.5 Sonnet) for: complex multi-file debugging, security-sensitive changes, and core architecture decisions.'
|
|
36
|
-
].join('\n'),
|
|
37
|
-
confidence: 0.8,
|
|
38
|
-
},
|
|
39
|
-
];
|
|
40
|
-
}
|
|
41
|
-
return [];
|
|
42
|
-
}
|
|
43
|
-
//# sourceMappingURL=cheap-model-routing.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cheap-model-routing.js","sourceRoot":"","sources":["../src/cheap-model-routing.ts"],"names":[],"mappings":"AAGA,MAAM,gBAAgB,GAAG;IACvB,uFAAuF;IACvF,6EAA6E;IAC7E,kBAAkB;IAClB,iCAAiC;IACjC,6DAA6D;IAC7D,sBAAsB;CACvB,CAAC;AAEF,MAAM,UAAU,uBAAuB,CAAC,OAAoB;IAC1D,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;IAEnC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,oDAAoD;IACpD,IAAI,OAAO,CAAC,0BAA0B,GAAG,GAAG,EAAE,CAAC;QAC7C,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,eAAe,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/D,MAAM,kBAAkB,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC;IAErF,IAAI,CAAC,kBAAkB,EAAE,CAAC;QACxB,OAAO;YACL;gBACE,EAAE,EAAE,6BAA6B;gBACjC,QAAQ,EAAE,MAAM;gBAChB,QAAQ,EAAE,iBAAiB;gBAC3B,KAAK,EAAE,gCAAgC;gBACvC,OAAO,EAAE,yKAAyK;gBAClL,SAAS,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;gBACnC,SAAS,EAAE,EAAE;gBACb,QAAQ,EAAE,CAAC,+FAA+F,CAAC;gBAC3G,cAAc,EAAE,yIAAyI;gBACzJ,SAAS,EAAE;oBACT,4BAA4B;oBAC5B,mKAAmK;oBACnK,wKAAwK;iBACzK,CAAC,IAAI,CAAC,IAAI,CAAC;gBACZ,UAAU,EAAE,GAAG;aAChB;SACF,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,CAAC;AACZ,CAAC"}
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* CLI output filter detector for PromptCI.
|
|
3
|
-
*
|
|
4
|
-
* Checks whether instruction files include guidance on filtering verbose CLI
|
|
5
|
-
* output before it reaches the LLM context. Tools like RTK (Rust Token Killer)
|
|
6
|
-
* transparently proxy commands such as `npm test`, `git diff`, and `cargo test`,
|
|
7
|
-
* stripping boilerplate and keeping only signal — typically 60-90% token reduction
|
|
8
|
-
* on those commands.
|
|
9
|
-
*
|
|
10
|
-
* Only fires for non-trivial projects (>500 estimated instruction tokens) that
|
|
11
|
-
* have no existing output-filter guidance in any instruction file.
|
|
12
|
-
*/
|
|
13
|
-
import type { RepoContext } from './repo-context.js';
|
|
14
|
-
import type { PromptCiIssue } from './types.js';
|
|
15
|
-
export declare function detectCliOutputFilter(context: RepoContext): PromptCiIssue[];
|
|
16
|
-
//# sourceMappingURL=cli-output-filter.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cli-output-filter.d.ts","sourceRoot":"","sources":["../src/cli-output-filter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AA0BhD,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,WAAW,GAAG,aAAa,EAAE,CA6D3E"}
|
|
@@ -1,88 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* CLI output filter detector for PromptCI.
|
|
3
|
-
*
|
|
4
|
-
* Checks whether instruction files include guidance on filtering verbose CLI
|
|
5
|
-
* output before it reaches the LLM context. Tools like RTK (Rust Token Killer)
|
|
6
|
-
* transparently proxy commands such as `npm test`, `git diff`, and `cargo test`,
|
|
7
|
-
* stripping boilerplate and keeping only signal — typically 60-90% token reduction
|
|
8
|
-
* on those commands.
|
|
9
|
-
*
|
|
10
|
-
* Only fires for non-trivial projects (>500 estimated instruction tokens) that
|
|
11
|
-
* have no existing output-filter guidance in any instruction file.
|
|
12
|
-
*/
|
|
13
|
-
// Signals that output-filter guidance already exists somewhere in the instructions.
|
|
14
|
-
const FILTER_SIGNALS = [
|
|
15
|
-
/\brtk\b/i,
|
|
16
|
-
/rust\s+token\s+killer/i,
|
|
17
|
-
/output\s+filter/i,
|
|
18
|
-
/token[- ]optimized\s+(cli|command|output)/i,
|
|
19
|
-
/cli\s+proxy/i,
|
|
20
|
-
/filter.*command.*output/i,
|
|
21
|
-
/compact.*output/i,
|
|
22
|
-
/--failures[- ]only/i,
|
|
23
|
-
];
|
|
24
|
-
// Commands that produce high-token output and benefit most from filtering.
|
|
25
|
-
// Used only to improve the evidence message — not a gate condition.
|
|
26
|
-
const NOISY_COMMANDS = [
|
|
27
|
-
'npm test', 'npm run test', 'yarn test', 'pnpm test',
|
|
28
|
-
'jest', 'vitest', 'pytest', 'cargo test', 'go test', 'rspec',
|
|
29
|
-
'git diff', 'git log', 'git status',
|
|
30
|
-
'next build', 'npm run build', 'tsc',
|
|
31
|
-
'eslint', 'ruff check', 'cargo clippy', 'golangci-lint',
|
|
32
|
-
'docker logs', 'kubectl logs',
|
|
33
|
-
'gh pr list', 'gh run list',
|
|
34
|
-
];
|
|
35
|
-
export function detectCliOutputFilter(context) {
|
|
36
|
-
const { files, metrics } = context;
|
|
37
|
-
if (files.length === 0)
|
|
38
|
-
return [];
|
|
39
|
-
// Skip trivially small instruction sets — not worth the noise.
|
|
40
|
-
if (metrics.estimatedInstructionTokens < 500)
|
|
41
|
-
return [];
|
|
42
|
-
const combinedContent = files.map((f) => f.content).join('\n');
|
|
43
|
-
const hasFilterGuidance = FILTER_SIGNALS.some((pat) => pat.test(combinedContent));
|
|
44
|
-
if (hasFilterGuidance)
|
|
45
|
-
return [];
|
|
46
|
-
// Surface whichever noisy commands are referenced in instructions (for evidence).
|
|
47
|
-
const referencedNoisyCommands = NOISY_COMMANDS.filter((cmd) => combinedContent.toLowerCase().includes(cmd.toLowerCase()));
|
|
48
|
-
const evidenceLine = referencedNoisyCommands.length > 0
|
|
49
|
-
? `Noisy commands referenced in instructions: ${referencedNoisyCommands.slice(0, 5).join(', ')}${referencedNoisyCommands.length > 5 ? ` (+${referencedNoisyCommands.length - 5} more)` : ''}.`
|
|
50
|
-
: 'No output-filter signals found across all instruction files.';
|
|
51
|
-
return [
|
|
52
|
-
{
|
|
53
|
-
id: 'cli-output-filter-missing',
|
|
54
|
-
severity: 'info',
|
|
55
|
-
category: 'agent_practices',
|
|
56
|
-
title: 'No CLI output filtering guidance',
|
|
57
|
-
summary: 'Instruction files contain no guidance on filtering verbose CLI output before it reaches ' +
|
|
58
|
-
'the LLM context. Commands like `npm test`, `git diff`, and `cargo test` can produce ' +
|
|
59
|
-
'hundreds of boilerplate lines. A CLI proxy such as RTK (Rust Token Killer) intercepts ' +
|
|
60
|
-
'these transparently and reduces token consumption by 60-90% on affected commands.',
|
|
61
|
-
filePaths: files.map((f) => f.path),
|
|
62
|
-
locations: [],
|
|
63
|
-
evidence: [evidenceLine],
|
|
64
|
-
recommendation: 'Install a CLI output filter (e.g. RTK: github.com/rtk-ai/rtk) and document it in your ' +
|
|
65
|
-
'instruction files. For Claude Code, `rtk init -g` installs a PreToolUse hook that ' +
|
|
66
|
-
'transparently rewrites Bash commands — no per-command changes needed.',
|
|
67
|
-
fixRecipe: [
|
|
68
|
-
'## CLI Output Filtering',
|
|
69
|
-
'',
|
|
70
|
-
'Use [RTK](https://github.com/rtk-ai/rtk) to reduce token consumption from verbose commands:',
|
|
71
|
-
'',
|
|
72
|
-
'```bash',
|
|
73
|
-
'brew install rtk # macOS',
|
|
74
|
-
'# or: cargo install --git https://github.com/rtk-ai/rtk',
|
|
75
|
-
'rtk init -g # Claude Code (PreToolUse hook)',
|
|
76
|
-
'rtk init -g --codex # Codex (AGENTS.md)',
|
|
77
|
-
'rtk init --agent antigravity # Antigravity (project-scoped rules)',
|
|
78
|
-
'```',
|
|
79
|
-
'',
|
|
80
|
-
'The hook transparently rewrites `npm test` → `rtk npm test` (failures only),',
|
|
81
|
-
'`git diff` → `rtk git diff` (condensed), etc. Run `rtk gain` to see token savings.',
|
|
82
|
-
].join('\n'),
|
|
83
|
-
confidence: 0.75,
|
|
84
|
-
impact: 'medium',
|
|
85
|
-
},
|
|
86
|
-
];
|
|
87
|
-
}
|
|
88
|
-
//# sourceMappingURL=cli-output-filter.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cli-output-filter.js","sourceRoot":"","sources":["../src/cli-output-filter.ts"],"names":[],"mappings":"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"}
|
package/dist/context-cost.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"context-cost.d.ts","sourceRoot":"","sources":["../src/context-cost.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAYrD,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,WAAW,GAAG,aAAa,EAAE,CAsEvE"}
|
package/dist/context-cost.js
DELETED
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
import * as crypto from 'node:crypto';
|
|
2
|
-
const TOTAL_TOKEN_WARNING = 8_000;
|
|
3
|
-
const FILE_TOKEN_WARNING = 2_500;
|
|
4
|
-
const README_DOMINANCE_RATIO = 0.5;
|
|
5
|
-
const README_DOMINANCE_MIN_TOKENS = 1_000;
|
|
6
|
-
function issueId(input) {
|
|
7
|
-
const hash = crypto.createHash('sha1').update(input).digest('hex').slice(0, 12);
|
|
8
|
-
return `context-cost-${hash}`;
|
|
9
|
-
}
|
|
10
|
-
export function detectContextCost(context) {
|
|
11
|
-
const issues = [];
|
|
12
|
-
const totalTokens = context.metrics.estimatedInstructionTokens;
|
|
13
|
-
if (totalTokens > TOTAL_TOKEN_WARNING) {
|
|
14
|
-
issues.push({
|
|
15
|
-
id: 'context-cost-total-token-budget',
|
|
16
|
-
severity: 'warning',
|
|
17
|
-
category: 'context_bloat',
|
|
18
|
-
title: 'Instruction context may exceed a practical token budget',
|
|
19
|
-
summary: `Scanned instruction context is approximately ${totalTokens} tokens. ` +
|
|
20
|
-
'This may increase AI cost and make persistent context harder for agents to use.',
|
|
21
|
-
filePaths: context.files.map((file) => file.path),
|
|
22
|
-
locations: [],
|
|
23
|
-
evidence: [`Estimated instruction tokens: ${totalTokens}`],
|
|
24
|
-
recommendation: 'Consider moving rarely needed examples, historical notes, and detailed runbooks into linked on-demand docs.',
|
|
25
|
-
confidence: 0.8,
|
|
26
|
-
tags: ['cost', 'context'],
|
|
27
|
-
});
|
|
28
|
-
}
|
|
29
|
-
for (const file of context.files) {
|
|
30
|
-
if (file.estimatedTokens <= FILE_TOKEN_WARNING)
|
|
31
|
-
continue;
|
|
32
|
-
issues.push({
|
|
33
|
-
id: issueId(`large-file:${file.path}`),
|
|
34
|
-
severity: 'info',
|
|
35
|
-
category: 'context_bloat',
|
|
36
|
-
title: `Large always-scanned instruction file: ${file.path.split(/[\\/]/).pop() ?? file.path}`,
|
|
37
|
-
summary: `This file is approximately ${file.estimatedTokens} tokens. Large instruction files are often worth splitting into ` +
|
|
38
|
-
'short always-loaded rules plus topic-specific reference docs.',
|
|
39
|
-
filePaths: [file.path],
|
|
40
|
-
locations: [{ filePath: file.path }],
|
|
41
|
-
evidence: [`${file.path}: ~${file.estimatedTokens} tokens`],
|
|
42
|
-
recommendation: 'Keep critical rules in the instruction file and move deep examples or runbooks to linked docs.',
|
|
43
|
-
confidence: 0.75,
|
|
44
|
-
tags: ['cost', 'context'],
|
|
45
|
-
});
|
|
46
|
-
}
|
|
47
|
-
if (totalTokens > 0) {
|
|
48
|
-
const readme = context.files.find((file) => file.fileType === 'readme');
|
|
49
|
-
if (readme &&
|
|
50
|
-
readme.estimatedTokens >= README_DOMINANCE_MIN_TOKENS &&
|
|
51
|
-
readme.estimatedTokens / totalTokens >= README_DOMINANCE_RATIO) {
|
|
52
|
-
issues.push({
|
|
53
|
-
id: issueId(`readme-dominates:${readme.path}`),
|
|
54
|
-
severity: 'info',
|
|
55
|
-
category: 'context_bloat',
|
|
56
|
-
title: 'README dominates scanned instruction context',
|
|
57
|
-
summary: `README content accounts for about ${Math.round((readme.estimatedTokens / totalTokens) * 100)}% ` +
|
|
58
|
-
'of scanned instruction tokens. That may be appropriate, but AI-specific guidance is usually cheaper in a smaller canonical file.',
|
|
59
|
-
filePaths: [readme.path],
|
|
60
|
-
locations: [{ filePath: readme.path }],
|
|
61
|
-
evidence: [`README: ~${readme.estimatedTokens} of ~${totalTokens} scanned tokens`],
|
|
62
|
-
recommendation: 'Consider keeping AI rules in AGENTS.md and leaving README as project documentation linked only when relevant.',
|
|
63
|
-
confidence: 0.65,
|
|
64
|
-
tags: ['cost', 'context'],
|
|
65
|
-
});
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
return issues;
|
|
69
|
-
}
|
|
70
|
-
//# sourceMappingURL=context-cost.js.map
|
package/dist/context-cost.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"context-cost.js","sourceRoot":"","sources":["../src/context-cost.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AAItC,MAAM,mBAAmB,GAAG,KAAK,CAAC;AAClC,MAAM,kBAAkB,GAAG,KAAK,CAAC;AACjC,MAAM,sBAAsB,GAAG,GAAG,CAAC;AACnC,MAAM,2BAA2B,GAAG,KAAK,CAAC;AAE1C,SAAS,OAAO,CAAC,KAAa;IAC5B,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAChF,OAAO,gBAAgB,IAAI,EAAE,CAAC;AAChC,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,OAAoB;IACpD,MAAM,MAAM,GAAoB,EAAE,CAAC;IACnC,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,0BAA0B,CAAC;IAE/D,IAAI,WAAW,GAAG,mBAAmB,EAAE,CAAC;QACtC,MAAM,CAAC,IAAI,CAAC;YACV,EAAE,EAAE,iCAAiC;YACrC,QAAQ,EAAE,SAAS;YACnB,QAAQ,EAAE,eAAe;YACzB,KAAK,EAAE,yDAAyD;YAChE,OAAO,EACL,gDAAgD,WAAW,WAAW;gBACtE,iFAAiF;YACnF,SAAS,EAAE,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC;YACjD,SAAS,EAAE,EAAE;YACb,QAAQ,EAAE,CAAC,iCAAiC,WAAW,EAAE,CAAC;YAC1D,cAAc,EACZ,6GAA6G;YAC/G,UAAU,EAAE,GAAG;YACf,IAAI,EAAE,CAAC,MAAM,EAAE,SAAS,CAAC;SAC1B,CAAC,CAAC;IACL,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QACjC,IAAI,IAAI,CAAC,eAAe,IAAI,kBAAkB;YAAE,SAAS;QACzD,MAAM,CAAC,IAAI,CAAC;YACV,EAAE,EAAE,OAAO,CAAC,cAAc,IAAI,CAAC,IAAI,EAAE,CAAC;YACtC,QAAQ,EAAE,MAAM;YAChB,QAAQ,EAAE,eAAe;YACzB,KAAK,EAAE,0CAA0C,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,IAAI,EAAE;YAC9F,OAAO,EACL,8BAA8B,IAAI,CAAC,eAAe,kEAAkE;gBACpH,+DAA+D;YACjE,SAAS,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC;YACtB,SAAS,EAAE,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;YACpC,QAAQ,EAAE,CAAC,GAAG,IAAI,CAAC,IAAI,MAAM,IAAI,CAAC,eAAe,SAAS,CAAC;YAC3D,cAAc,EACZ,gGAAgG;YAClG,UAAU,EAAE,IAAI;YAChB,IAAI,EAAE,CAAC,MAAM,EAAE,SAAS,CAAC;SAC1B,CAAC,CAAC;IACL,CAAC;IAED,IAAI,WAAW,GAAG,CAAC,EAAE,CAAC;QACpB,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC;QACxE,IACE,MAAM;YACN,MAAM,CAAC,eAAe,IAAI,2BAA2B;YACrD,MAAM,CAAC,eAAe,GAAG,WAAW,IAAI,sBAAsB,EAC9D,CAAC;YACD,MAAM,CAAC,IAAI,CAAC;gBACV,EAAE,EAAE,OAAO,CAAC,oBAAoB,MAAM,CAAC,IAAI,EAAE,CAAC;gBAC9C,QAAQ,EAAE,MAAM;gBAChB,QAAQ,EAAE,eAAe;gBACzB,KAAK,EAAE,8CAA8C;gBACrD,OAAO,EACL,qCAAqC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,eAAe,GAAG,WAAW,CAAC,GAAG,GAAG,CAAC,IAAI;oBACjG,kIAAkI;gBACpI,SAAS,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC;gBACxB,SAAS,EAAE,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC;gBACtC,QAAQ,EAAE,CAAC,YAAY,MAAM,CAAC,eAAe,QAAQ,WAAW,iBAAiB,CAAC;gBAClF,cAAc,EACZ,+GAA+G;gBACjH,UAAU,EAAE,IAAI;gBAChB,IAAI,EAAE,CAAC,MAAM,EAAE,SAAS,CAAC;aAC1B,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"context-recommender.d.ts","sourceRoot":"","sources":["../src/context-recommender.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAuC,MAAM,YAAY,CAAC;AAclF,wBAAgB,8BAA8B,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CAgYzE"}
|
|
@@ -1,329 +0,0 @@
|
|
|
1
|
-
import * as path from 'node:path';
|
|
2
|
-
import { existsSync } from 'node:fs';
|
|
3
|
-
export function generateContextRecommendations(report) {
|
|
4
|
-
const { filesScanned, repoPath } = report;
|
|
5
|
-
const rel = (absPath) => {
|
|
6
|
-
const r = path.relative(repoPath, absPath);
|
|
7
|
-
return r && !r.startsWith('..') ? r : absPath;
|
|
8
|
-
};
|
|
9
|
-
// If the repository is small and clean, skip recommendations to avoid noise
|
|
10
|
-
const totalTokens = filesScanned.reduce((sum, f) => sum + f.estimatedTokens, 0);
|
|
11
|
-
if (totalTokens < 500 && report.issues.length === 0) {
|
|
12
|
-
return '';
|
|
13
|
-
}
|
|
14
|
-
// 1. Classify all sections
|
|
15
|
-
const classified = [];
|
|
16
|
-
for (const file of filesScanned) {
|
|
17
|
-
for (const sec of file.sections) {
|
|
18
|
-
const heading = (sec.heading || '').toLowerCase();
|
|
19
|
-
const text = sec.normalizedText;
|
|
20
|
-
let classification = 'unknown';
|
|
21
|
-
let suggestedFile = '';
|
|
22
|
-
let reason = '';
|
|
23
|
-
// Check Archive/Remove markers first
|
|
24
|
-
if (heading.includes('changelog') ||
|
|
25
|
-
heading.includes('history') ||
|
|
26
|
-
heading.includes('roadmap') ||
|
|
27
|
-
heading.includes('screenshot') ||
|
|
28
|
-
heading.includes('mockup') ||
|
|
29
|
-
heading.includes('past plan') ||
|
|
30
|
-
heading.includes('yesterday') ||
|
|
31
|
-
heading.includes('todo') ||
|
|
32
|
-
heading.includes('status') ||
|
|
33
|
-
heading.includes('task') ||
|
|
34
|
-
heading.includes('notes') ||
|
|
35
|
-
text.includes('todo') && (heading.includes('todo') || heading.includes('done'))) {
|
|
36
|
-
classification = 'archive';
|
|
37
|
-
reason = 'Contains historical, stale, or roadmap content that is not relevant to ongoing AI tasks.';
|
|
38
|
-
}
|
|
39
|
-
// Check On-demand markers
|
|
40
|
-
else if (heading.includes('deploy') ||
|
|
41
|
-
heading.includes('vercel') ||
|
|
42
|
-
heading.includes('ci/cd') ||
|
|
43
|
-
heading.includes('release')) {
|
|
44
|
-
classification = 'on-demand';
|
|
45
|
-
suggestedFile = 'docs/ai/deployment.md';
|
|
46
|
-
reason = 'Contains deployment steps, environments, or release workflows which are only needed during releases.';
|
|
47
|
-
}
|
|
48
|
-
else if (heading.includes('nextjs') ||
|
|
49
|
-
heading.includes('next.js') ||
|
|
50
|
-
heading.includes('react') ||
|
|
51
|
-
heading.includes('remix') ||
|
|
52
|
-
heading.includes('frontend') ||
|
|
53
|
-
heading.includes('dashboard')) {
|
|
54
|
-
classification = 'on-demand';
|
|
55
|
-
suggestedFile = 'docs/ai/nextjs.md';
|
|
56
|
-
reason = 'Contains framework-specific UI/Next.js conventions that are only needed when editing web dashboard code.';
|
|
57
|
-
}
|
|
58
|
-
else if (heading.includes('supabase') ||
|
|
59
|
-
heading.includes('database') ||
|
|
60
|
-
heading.includes('prisma') ||
|
|
61
|
-
heading.includes('migration') ||
|
|
62
|
-
heading.includes('sql') ||
|
|
63
|
-
heading.includes('schema')) {
|
|
64
|
-
classification = 'on-demand';
|
|
65
|
-
suggestedFile = 'docs/ai/supabase.md';
|
|
66
|
-
reason = 'Contains database setup or migration steps which are only needed when schema or API boundary changes occur.';
|
|
67
|
-
}
|
|
68
|
-
else if (heading.includes('architecture') ||
|
|
69
|
-
heading.includes('design') ||
|
|
70
|
-
heading.includes('structure') ||
|
|
71
|
-
heading.includes('components')) {
|
|
72
|
-
classification = 'on-demand';
|
|
73
|
-
suggestedFile = 'docs/ai/architecture.md';
|
|
74
|
-
reason = 'Contains repository structure or module descriptions that are only needed when creating new components.';
|
|
75
|
-
}
|
|
76
|
-
else if (heading.includes('troubleshoot') ||
|
|
77
|
-
heading.includes('debug') ||
|
|
78
|
-
heading.includes('error') ||
|
|
79
|
-
heading.includes('issue')) {
|
|
80
|
-
classification = 'on-demand';
|
|
81
|
-
suggestedFile = 'docs/ai/troubleshooting.md';
|
|
82
|
-
reason = 'Contains error codes or troubleshooting procedures only needed when debugging failures.';
|
|
83
|
-
}
|
|
84
|
-
else if (sec.text.includes('```') && sec.text.length > 1500) {
|
|
85
|
-
classification = 'on-demand';
|
|
86
|
-
suggestedFile = 'docs/ai/examples.md';
|
|
87
|
-
reason = 'Contains long code snippets or examples that bloat always-loaded context.';
|
|
88
|
-
}
|
|
89
|
-
// Check Always-load markers
|
|
90
|
-
else if (heading.includes('identity') ||
|
|
91
|
-
heading.includes('about') ||
|
|
92
|
-
heading.includes('purpose') ||
|
|
93
|
-
heading.includes('boundary') ||
|
|
94
|
-
heading.includes('non-goal') ||
|
|
95
|
-
heading.includes('verification') ||
|
|
96
|
-
heading.includes('build') ||
|
|
97
|
-
heading.includes('test') ||
|
|
98
|
-
heading.includes('lint') ||
|
|
99
|
-
heading.includes('typecheck') ||
|
|
100
|
-
heading.includes('safety') ||
|
|
101
|
-
heading.includes('security') ||
|
|
102
|
-
heading.includes('secret') ||
|
|
103
|
-
heading.includes('credential') ||
|
|
104
|
-
heading.includes('auth') ||
|
|
105
|
-
heading.includes('read-before-edit') ||
|
|
106
|
-
heading.includes('scope-control') ||
|
|
107
|
-
heading.includes('honesty') ||
|
|
108
|
-
heading.includes('plan-first')) {
|
|
109
|
-
classification = 'always-load';
|
|
110
|
-
reason = 'Contains core setup, boundary constraints, verification commands, or critical developer practices.';
|
|
111
|
-
}
|
|
112
|
-
if (classification !== 'unknown') {
|
|
113
|
-
classified.push({
|
|
114
|
-
file,
|
|
115
|
-
section: sec,
|
|
116
|
-
classification,
|
|
117
|
-
suggestedFile,
|
|
118
|
-
reason,
|
|
119
|
-
});
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
const lines = [];
|
|
124
|
-
// ── Cost 2: Context Split & Retrieval Map ────────────────────────────────────
|
|
125
|
-
lines.push('## Context Architecture & Retrieval Map');
|
|
126
|
-
lines.push('');
|
|
127
|
-
lines.push('> [!NOTE]');
|
|
128
|
-
lines.push('> Split large instruction files to keep canonical instructions under the token budget. Move detailed instructions to on-demand documents and link them.');
|
|
129
|
-
lines.push('');
|
|
130
|
-
const onDemand = classified.filter((c) => c.classification === 'on-demand');
|
|
131
|
-
const archive = classified.filter((c) => c.classification === 'archive');
|
|
132
|
-
if (onDemand.length > 0 || archive.length > 0) {
|
|
133
|
-
lines.push('### Suggested Context Splits');
|
|
134
|
-
lines.push('');
|
|
135
|
-
lines.push('| Section / File | Current Size | Classification | Recommendation |');
|
|
136
|
-
lines.push('|---|---|---|---|');
|
|
137
|
-
for (const c of [...onDemand, ...archive]) {
|
|
138
|
-
const loc = `\`${rel(c.file.path)}\` (Heading: *${c.section.heading || 'None'}*)`;
|
|
139
|
-
const size = `~${Math.round(c.section.text.length / 4)} tokens`;
|
|
140
|
-
const target = c.classification === 'archive' ? 'Archive/Remove' : `On-Demand (\`${c.suggestedFile}\`)`;
|
|
141
|
-
lines.push(`| ${loc} | ${size} | **${target}** | ${c.reason} |`);
|
|
142
|
-
}
|
|
143
|
-
lines.push('');
|
|
144
|
-
}
|
|
145
|
-
lines.push('### Suggested Canonical AGENTS.md Layout');
|
|
146
|
-
lines.push('To minimize token consumption, structure your canonical rules as follows:');
|
|
147
|
-
lines.push('```markdown');
|
|
148
|
-
lines.push('# PromptCI - Agent Instructions');
|
|
149
|
-
lines.push('');
|
|
150
|
-
lines.push('## Identity & Boundaries');
|
|
151
|
-
lines.push('- Describe core project limits, tech stack, and non-goals here.');
|
|
152
|
-
lines.push('');
|
|
153
|
-
lines.push('## Verification Loop');
|
|
154
|
-
lines.push('- List exact commands: e.g. `pnpm lint`, `pnpm typecheck`, `pnpm test`.');
|
|
155
|
-
lines.push('');
|
|
156
|
-
lines.push('## References (On-Demand)');
|
|
157
|
-
lines.push('- For deployment details, read [deployment.md](file:///docs/ai/deployment.md).');
|
|
158
|
-
lines.push('- For DB schema, read [supabase.md](file:///docs/ai/supabase.md).');
|
|
159
|
-
lines.push('```');
|
|
160
|
-
lines.push('');
|
|
161
|
-
// ── Cost 5: Skills Readiness & Skill Extraction Recommendations ──────────────
|
|
162
|
-
const proceduralSections = classified.filter((c) => {
|
|
163
|
-
// Check if section is long and contains numbered lists or action bullet points
|
|
164
|
-
const text = c.section.text;
|
|
165
|
-
const linesOfText = text.split('\n');
|
|
166
|
-
const hasNumberedList = linesOfText.some((l) => /^\s*\d+\.\s+[A-Z]/i.test(l));
|
|
167
|
-
const hasImperativeVerbs = linesOfText.some((l) => /^\s*[-*]\s+(Run|Do|Verify|Build|Compile|Deploy|Release|Upgrade|Test|Check|Commit|Push)\b/i.test(l));
|
|
168
|
-
return text.length > 1000 && (hasNumberedList || hasImperativeVerbs);
|
|
169
|
-
});
|
|
170
|
-
if (proceduralSections.length > 0) {
|
|
171
|
-
lines.push('## Skills Readiness & Extraction Recommendations');
|
|
172
|
-
lines.push('');
|
|
173
|
-
lines.push('The following sections describe multi-step procedural workflows. These are excellent candidates to move out of instruction files into reusable local playbooks or skills to save persistent context tokens:');
|
|
174
|
-
lines.push('');
|
|
175
|
-
for (const c of proceduralSections) {
|
|
176
|
-
const heading = c.section.heading || 'Workflow';
|
|
177
|
-
let skillName = `custom-playbook-${c.section.id}`;
|
|
178
|
-
let trigger = `When executing specialized tasks related to ${heading}`;
|
|
179
|
-
const lowerHeading = heading.toLowerCase();
|
|
180
|
-
if (lowerHeading.includes('deploy') || lowerHeading.includes('release')) {
|
|
181
|
-
skillName = 'deployment-runbook';
|
|
182
|
-
trigger = 'Before running a deployment, release, or publishing builds';
|
|
183
|
-
}
|
|
184
|
-
else if (lowerHeading.includes('supabase') || lowerHeading.includes('migration') || lowerHeading.includes('database')) {
|
|
185
|
-
skillName = 'supabase-migration-workflow';
|
|
186
|
-
trigger = 'When writing or executing database migrations, DDL, or database client code';
|
|
187
|
-
}
|
|
188
|
-
else if (lowerHeading.includes('test') || lowerHeading.includes('ci')) {
|
|
189
|
-
skillName = 'test-and-ci-checklist';
|
|
190
|
-
trigger = 'When verifying build health or running the automated test matrix';
|
|
191
|
-
}
|
|
192
|
-
lines.push(`### Skill Candidate: \`${skillName}\``);
|
|
193
|
-
lines.push(`- **Trigger Condition:** ${trigger}`);
|
|
194
|
-
lines.push(`- **Source Section:** \`${rel(c.file.path)}\` (Section: *${heading}*)`);
|
|
195
|
-
lines.push(`- **Savings Potential:** ~${Math.round(c.section.text.length / 4)} tokens per session`);
|
|
196
|
-
lines.push(`- **Action:** Extract the procedural checklist into a file like \`docs/skills/${skillName}.md\` and add a single trigger rule in AGENTS.md.`);
|
|
197
|
-
lines.push('');
|
|
198
|
-
}
|
|
199
|
-
}
|
|
200
|
-
const roiList = [];
|
|
201
|
-
for (const c of classified) {
|
|
202
|
-
const tokens = Math.round(c.section.text.length / 4);
|
|
203
|
-
if (tokens < 100)
|
|
204
|
-
continue; // skip small ones
|
|
205
|
-
let multiplier = 1.0;
|
|
206
|
-
let action = 'Archive or remove';
|
|
207
|
-
if (c.classification === 'archive') {
|
|
208
|
-
multiplier = 2.0;
|
|
209
|
-
action = 'Remove completely or move to archive/';
|
|
210
|
-
}
|
|
211
|
-
else if (c.classification === 'on-demand') {
|
|
212
|
-
multiplier = 1.5;
|
|
213
|
-
action = `Extract to on-demand doc (\`${c.suggestedFile}\`)`;
|
|
214
|
-
}
|
|
215
|
-
else if (c.classification === 'always-load') {
|
|
216
|
-
multiplier = 0.5;
|
|
217
|
-
action = 'Trim details or move examples out';
|
|
218
|
-
}
|
|
219
|
-
// Reduce multiplier if it contains highly critical rules (value signals)
|
|
220
|
-
const textLower = c.section.text.toLowerCase();
|
|
221
|
-
const hasCriticalGuidance = textLower.includes('verification') ||
|
|
222
|
-
textLower.includes('honesty') ||
|
|
223
|
-
textLower.includes('read-before-edit') ||
|
|
224
|
-
textLower.includes('scope-control') ||
|
|
225
|
-
textLower.includes('security') ||
|
|
226
|
-
textLower.includes('safety') ||
|
|
227
|
-
textLower.includes('plan-first');
|
|
228
|
-
if (hasCriticalGuidance) {
|
|
229
|
-
if (c.classification === 'always-load') {
|
|
230
|
-
// Skip highly critical always-loaded rules from cleanup list entirely
|
|
231
|
-
continue;
|
|
232
|
-
}
|
|
233
|
-
else {
|
|
234
|
-
multiplier *= 0.5; // Lower cleanup priority for other sections containing critical text
|
|
235
|
-
}
|
|
236
|
-
}
|
|
237
|
-
// Increase multiplier for cost signals (volatile content, long code blocks, duplicates)
|
|
238
|
-
// Volatile content check (timestamps, dates, active task/branch notes)
|
|
239
|
-
const hasVolatile = /\b(?:last\s+updated|generated\s+at|timestamp|current\s+branch|active\s+task|health\s+score)\b/i.test(c.section.text) ||
|
|
240
|
-
/\b(?:202\d-\d{2}-\d{2}|[0-2]?\d:[0-5]\d:[0-5]\d)\b/.test(c.section.text);
|
|
241
|
-
if (hasVolatile) {
|
|
242
|
-
multiplier += 0.5;
|
|
243
|
-
}
|
|
244
|
-
// Long code blocks / examples check:
|
|
245
|
-
if (c.section.text.includes('```') && c.section.text.length > 2000) {
|
|
246
|
-
multiplier += 0.5;
|
|
247
|
-
}
|
|
248
|
-
// Duplicated section check:
|
|
249
|
-
const isDuplicate = report.issues.some((i) => i.category === 'duplicate' && i.filePaths.includes(c.file.path));
|
|
250
|
-
if (isDuplicate) {
|
|
251
|
-
multiplier += 0.5;
|
|
252
|
-
}
|
|
253
|
-
roiList.push({
|
|
254
|
-
name: `\`${rel(c.file.path)}\` (Section: *${c.section.heading || 'None'}*)`,
|
|
255
|
-
tokens,
|
|
256
|
-
savingsPotential: tokens * multiplier,
|
|
257
|
-
reason: c.reason,
|
|
258
|
-
action,
|
|
259
|
-
});
|
|
260
|
-
}
|
|
261
|
-
const sortedRoi = roiList.sort((a, b) => b.savingsPotential - a.savingsPotential).slice(0, 3);
|
|
262
|
-
if (sortedRoi.length > 0) {
|
|
263
|
-
lines.push('## Context ROI Ranking (Cleanup Opportunities)');
|
|
264
|
-
lines.push('');
|
|
265
|
-
lines.push('Prioritized list of instruction sections to clean up, refactor, or extract to maximize token savings:');
|
|
266
|
-
lines.push('');
|
|
267
|
-
lines.push('| Rank | Section / File | Token Size | Savings Potential | Suggested Action | Why? |');
|
|
268
|
-
lines.push('|---|---|---|---|---|---|');
|
|
269
|
-
sortedRoi.forEach((item, idx) => {
|
|
270
|
-
const rank = idx + 1;
|
|
271
|
-
lines.push(`| ${rank} | ${item.name} | ~${item.tokens} | High | ${item.action} | ${item.reason} |`);
|
|
272
|
-
});
|
|
273
|
-
lines.push('');
|
|
274
|
-
}
|
|
275
|
-
// ── Cost 11: Task-Specific Context Pack Suggestions ──────────────────────────
|
|
276
|
-
// Check repo signals
|
|
277
|
-
const hasSupabase = report.repoPath && (existsSync(path.join(report.repoPath, 'supabase')) ||
|
|
278
|
-
filesScanned.some((f) => f.path.endsWith('package.json') && f.content.includes('@supabase/supabase-js')));
|
|
279
|
-
const hasCli = filesScanned.some((f) => f.path.includes('packages/cli') || f.path.includes('apps/cli'));
|
|
280
|
-
const hasWeb = filesScanned.some((f) => f.path.includes('packages/web') || f.path.includes('apps/web'));
|
|
281
|
-
const hasNextJs = filesScanned.some((f) => /next/i.test(f.content));
|
|
282
|
-
const packs = [];
|
|
283
|
-
if (hasSupabase) {
|
|
284
|
-
packs.push({
|
|
285
|
-
name: '`supabase-auth-and-upload`',
|
|
286
|
-
source: 'Supabase schema and client config rules',
|
|
287
|
-
whenToLoad: 'When altering database schemas, migrations, security triggers, or upload APIs.',
|
|
288
|
-
savings: 'Avoids loading database structures for standard frontend/backend edits.',
|
|
289
|
-
});
|
|
290
|
-
}
|
|
291
|
-
if (hasCli) {
|
|
292
|
-
packs.push({
|
|
293
|
-
name: '`cli-command-workflow`',
|
|
294
|
-
source: 'CLI entrypoints and argument parsers instructions',
|
|
295
|
-
whenToLoad: 'When changing CLI flags, command syntax, or command handlers.',
|
|
296
|
-
savings: 'Keeps command parsing logic out of web dashboard and core development runs.',
|
|
297
|
-
});
|
|
298
|
-
}
|
|
299
|
-
if (hasWeb || hasNextJs) {
|
|
300
|
-
packs.push({
|
|
301
|
-
name: '`web-dashboard-development`',
|
|
302
|
-
source: 'Next.js components, page routes, and middleware rules',
|
|
303
|
-
whenToLoad: 'When building UI dashboard layouts, state management, or styling components.',
|
|
304
|
-
savings: 'Keeps CSS and layout instructions out of core engines and CLI builds.',
|
|
305
|
-
});
|
|
306
|
-
}
|
|
307
|
-
if (classified.some((c) => c.classification === 'on-demand' && c.suggestedFile === 'docs/ai/deployment.md')) {
|
|
308
|
-
packs.push({
|
|
309
|
-
name: '`deployment-and-ci`',
|
|
310
|
-
source: 'Vercel, CI/CD, and release commands checklists',
|
|
311
|
-
whenToLoad: 'When debugging GitHub Actions workflows or preparing production releases.',
|
|
312
|
-
savings: 'Keeps long validation check scripts out of the standard iteration loop.',
|
|
313
|
-
});
|
|
314
|
-
}
|
|
315
|
-
if (packs.length > 0) {
|
|
316
|
-
lines.push('## Suggested Context Packs');
|
|
317
|
-
lines.push('');
|
|
318
|
-
lines.push('Consider defining task-specific context bundles so agents only load rules relevant to their active focus area:');
|
|
319
|
-
lines.push('');
|
|
320
|
-
lines.push('| Pack Name | Source Sections | When to Load | Token Benefit |');
|
|
321
|
-
lines.push('|---|---|---|---|');
|
|
322
|
-
for (const p of packs) {
|
|
323
|
-
lines.push(`| ${p.name} | ${p.source} | ${p.whenToLoad} | ${p.savings} |`);
|
|
324
|
-
}
|
|
325
|
-
lines.push('');
|
|
326
|
-
}
|
|
327
|
-
return lines.join('\n');
|
|
328
|
-
}
|
|
329
|
-
//# sourceMappingURL=context-recommender.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"context-recommender.js","sourceRoot":"","sources":["../src/context-recommender.ts"],"names":[],"mappings":"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"}
|
package/dist/llm.d.ts
DELETED
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Lightweight LLM Client wrapper using Node's native fetch.
|
|
3
|
-
* Gated by OPENAI_API_KEY and ANTHROPIC_API_KEY.
|
|
4
|
-
*/
|
|
5
|
-
export declare function callLlm(systemPrompt: string, userPrompt: string, responseFormatJson?: boolean): Promise<string>;
|
|
6
|
-
//# sourceMappingURL=llm.d.ts.map
|
package/dist/llm.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"llm.d.ts","sourceRoot":"","sources":["../src/llm.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,wBAAsB,OAAO,CAC3B,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,EAClB,kBAAkB,GAAE,OAAe,GAClC,OAAO,CAAC,MAAM,CAAC,CAgFjB"}
|