pi-lens 2.2.9 → 3.0.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/CHANGELOG.md +198 -0
- package/README.md +709 -519
- package/clients/__tests__/file-time.test.js +216 -0
- package/clients/__tests__/file-time.test.ts +276 -0
- package/clients/__tests__/format-service.test.js +245 -0
- package/clients/__tests__/format-service.test.ts +339 -0
- package/clients/__tests__/formatters.test.js +271 -0
- package/clients/__tests__/formatters.test.ts +401 -0
- package/clients/amain-types.js +164 -0
- package/clients/amain-types.ts +165 -0
- package/clients/architect-client.js +56 -12
- package/clients/architect-client.ts +81 -16
- package/clients/ast-grep-client.js +2 -2
- package/clients/ast-grep-client.ts +14 -39
- package/clients/ast-grep-parser.ts +1 -1
- package/clients/ast-grep-rule-manager.js +8 -0
- package/clients/ast-grep-rule-manager.ts +10 -1
- package/clients/ast-grep-types.js +9 -0
- package/clients/ast-grep-types.ts +106 -0
- package/clients/auto-loop.js +10 -0
- package/clients/auto-loop.ts +14 -1
- package/clients/biome-client.js +81 -19
- package/clients/biome-client.ts +103 -22
- package/clients/bus/bus.js +191 -0
- package/clients/bus/bus.ts +251 -0
- package/clients/bus/events.js +214 -0
- package/clients/bus/events.ts +279 -0
- package/clients/bus/index.js +8 -0
- package/clients/bus/index.ts +9 -0
- package/clients/bus/integration.js +158 -0
- package/clients/bus/integration.ts +214 -0
- package/clients/complexity-client.js +13 -7
- package/clients/complexity-client.ts +13 -7
- package/clients/config-validator.js +465 -0
- package/clients/config-validator.ts +558 -0
- package/clients/dependency-checker.js +4 -10
- package/clients/dependency-checker.ts +4 -10
- package/clients/dispatch/__tests__/autofix-integration.test.js +245 -0
- package/clients/dispatch/__tests__/autofix-integration.test.ts +300 -0
- package/clients/dispatch/__tests__/runner-registration.test.js +236 -0
- package/clients/dispatch/__tests__/runner-registration.test.ts +282 -0
- package/clients/dispatch/bus-dispatcher.js +177 -0
- package/clients/dispatch/bus-dispatcher.ts +251 -0
- package/clients/dispatch/dispatcher.edge.test.js +82 -0
- package/clients/dispatch/dispatcher.edge.test.ts +100 -0
- package/clients/dispatch/dispatcher.format.test.js +46 -0
- package/clients/dispatch/dispatcher.format.test.ts +58 -0
- package/clients/dispatch/dispatcher.inline.test.js +74 -0
- package/clients/dispatch/dispatcher.inline.test.ts +93 -0
- package/clients/dispatch/dispatcher.js +19 -53
- package/clients/dispatch/dispatcher.ts +20 -67
- package/clients/dispatch/plan.js +9 -4
- package/clients/dispatch/plan.ts +9 -4
- package/clients/dispatch/runners/architect.js +21 -7
- package/clients/dispatch/runners/architect.test.js +138 -0
- package/clients/dispatch/runners/architect.test.ts +162 -0
- package/clients/dispatch/runners/architect.ts +22 -7
- package/clients/dispatch/runners/ast-grep-napi.js +462 -0
- package/clients/dispatch/runners/ast-grep-napi.test.js +111 -0
- package/clients/dispatch/runners/ast-grep-napi.test.ts +133 -0
- package/clients/dispatch/runners/ast-grep-napi.ts +506 -0
- package/clients/dispatch/runners/ast-grep.js +62 -19
- package/clients/dispatch/runners/ast-grep.ts +70 -18
- package/clients/dispatch/runners/biome.js +29 -53
- package/clients/dispatch/runners/biome.ts +29 -63
- package/clients/dispatch/runners/config-validation.js +67 -0
- package/clients/dispatch/runners/config-validation.ts +82 -0
- package/clients/dispatch/runners/go-vet.js +4 -28
- package/clients/dispatch/runners/go-vet.ts +4 -32
- package/clients/dispatch/runners/index.js +30 -10
- package/clients/dispatch/runners/index.ts +30 -10
- package/clients/dispatch/runners/oxlint.js +141 -0
- package/clients/dispatch/runners/oxlint.test.js +230 -0
- package/clients/dispatch/runners/oxlint.test.ts +303 -0
- package/clients/dispatch/runners/oxlint.ts +175 -0
- package/clients/dispatch/runners/pyright.js +40 -70
- package/clients/dispatch/runners/pyright.test.js +16 -2
- package/clients/dispatch/runners/pyright.test.ts +14 -2
- package/clients/dispatch/runners/pyright.ts +48 -91
- package/clients/dispatch/runners/python-slop.js +97 -0
- package/clients/dispatch/runners/python-slop.test.js +203 -0
- package/clients/dispatch/runners/python-slop.test.ts +298 -0
- package/clients/dispatch/runners/python-slop.ts +124 -0
- package/clients/dispatch/runners/ruff.js +18 -71
- package/clients/dispatch/runners/ruff.ts +19 -79
- package/clients/dispatch/runners/rust-clippy.js +28 -32
- package/clients/dispatch/runners/rust-clippy.ts +29 -31
- package/clients/dispatch/runners/scan_codebase.test.js +89 -0
- package/clients/dispatch/runners/scan_codebase.test.ts +105 -0
- package/clients/dispatch/runners/shellcheck.js +147 -0
- package/clients/dispatch/runners/shellcheck.test.js +98 -0
- package/clients/dispatch/runners/shellcheck.test.ts +129 -0
- package/clients/dispatch/runners/shellcheck.ts +188 -0
- package/clients/dispatch/runners/similarity.js +230 -0
- package/clients/dispatch/runners/similarity.ts +339 -0
- package/clients/dispatch/runners/spellcheck.js +106 -0
- package/clients/dispatch/runners/spellcheck.test.js +158 -0
- package/clients/dispatch/runners/spellcheck.test.ts +214 -0
- package/clients/dispatch/runners/spellcheck.ts +136 -0
- package/clients/dispatch/runners/tree-sitter.js +107 -0
- package/clients/dispatch/runners/tree-sitter.ts +135 -0
- package/clients/dispatch/runners/ts-lsp.js +104 -33
- package/clients/dispatch/runners/ts-lsp.ts +120 -38
- package/clients/dispatch/runners/ts-slop.js +113 -0
- package/clients/dispatch/runners/ts-slop.test.js +180 -0
- package/clients/dispatch/runners/ts-slop.test.ts +230 -0
- package/clients/dispatch/runners/ts-slop.ts +142 -0
- package/clients/dispatch/runners/utils/diagnostic-parsers.js +134 -0
- package/clients/dispatch/runners/utils/diagnostic-parsers.ts +186 -0
- package/clients/dispatch/runners/utils/runner-helpers.js +115 -0
- package/clients/dispatch/runners/utils/runner-helpers.ts +167 -0
- package/clients/dispatch/runners/utils.js +2 -4
- package/clients/dispatch/runners/utils.ts +2 -4
- package/clients/dispatch/types.ts +1 -1
- package/clients/dispatch/utils/format-utils.js +49 -0
- package/clients/dispatch/utils/format-utils.ts +60 -0
- package/clients/dogfood.test.js +201 -0
- package/clients/dogfood.test.ts +269 -0
- package/clients/file-time.js +152 -0
- package/clients/file-time.ts +208 -0
- package/clients/file-utils.js +40 -0
- package/clients/file-utils.ts +44 -0
- package/clients/fix-scanners.js +10 -20
- package/clients/fix-scanners.ts +10 -22
- package/clients/format-service.js +172 -0
- package/clients/format-service.ts +254 -0
- package/clients/formatters.js +435 -0
- package/clients/formatters.ts +508 -0
- package/clients/go-client.js +5 -14
- package/clients/go-client.ts +5 -13
- package/clients/installer/index.js +356 -0
- package/clients/installer/index.ts +426 -0
- package/clients/jscpd-client.js +11 -9
- package/clients/jscpd-client.ts +12 -8
- package/clients/knip-client.js +3 -7
- package/clients/knip-client.ts +3 -6
- package/clients/lsp/__tests__/client.test.js +325 -0
- package/clients/lsp/__tests__/client.test.ts +434 -0
- package/clients/lsp/__tests__/config.test.js +166 -0
- package/clients/lsp/__tests__/config.test.ts +209 -0
- package/clients/lsp/__tests__/error-recovery.test.js +213 -0
- package/clients/lsp/__tests__/error-recovery.test.ts +279 -0
- package/clients/lsp/__tests__/integration.test.js +127 -0
- package/clients/lsp/__tests__/integration.test.ts +160 -0
- package/clients/lsp/__tests__/launch.test.js +260 -0
- package/clients/lsp/__tests__/launch.test.ts +329 -0
- package/clients/lsp/__tests__/server.test.js +259 -0
- package/clients/lsp/__tests__/server.test.ts +332 -0
- package/clients/lsp/__tests__/service.test.js +417 -0
- package/clients/lsp/__tests__/service.test.ts +499 -0
- package/clients/lsp/client.js +235 -0
- package/clients/lsp/client.ts +328 -0
- package/clients/lsp/config.js +115 -0
- package/clients/lsp/config.ts +149 -0
- package/clients/lsp/index.js +222 -0
- package/clients/lsp/index.ts +280 -0
- package/clients/lsp/installer/index.js +391 -0
- package/clients/lsp/interactive-install.js +210 -0
- package/clients/lsp/interactive-install.ts +251 -0
- package/clients/lsp/language.js +170 -0
- package/clients/lsp/language.ts +216 -0
- package/clients/lsp/launch.js +174 -0
- package/clients/lsp/launch.ts +240 -0
- package/clients/lsp/lsp/launch.js +116 -0
- package/clients/lsp/lsp/server.js +532 -0
- package/clients/lsp/lsp-index.js +10 -0
- package/clients/lsp/lsp-index.ts +11 -0
- package/clients/lsp/path-utils.js +48 -0
- package/clients/lsp/path-utils.ts +52 -0
- package/clients/lsp/server.js +615 -0
- package/clients/lsp/server.ts +800 -0
- package/clients/lsp/test-py-spawn/requirements.txt +1 -0
- package/clients/lsp/test-py-spawn/test.py +3 -0
- package/clients/lsp/test-py-svc/requirements.txt +1 -0
- package/clients/lsp/test-py-svc/test.py +3 -0
- package/clients/lsp/test-python-project/requirements.txt +1 -0
- package/clients/lsp/test-python-project/test.py +5 -0
- package/clients/metrics-history.js +2 -2
- package/clients/metrics-history.ts +2 -2
- package/clients/production-readiness.js +522 -0
- package/clients/production-readiness.ts +556 -0
- package/clients/project-index.js +255 -0
- package/clients/project-index.ts +383 -0
- package/clients/project-metadata.js +531 -0
- package/clients/project-metadata.ts +624 -0
- package/clients/ruff-client.js +56 -16
- package/clients/ruff-client.ts +72 -15
- package/clients/runner-tracker.js +152 -0
- package/clients/runner-tracker.ts +213 -0
- package/clients/rust-client.js +4 -11
- package/clients/rust-client.ts +5 -11
- package/clients/safe-spawn.js +96 -0
- package/clients/safe-spawn.ts +128 -0
- package/clients/scan-architectural-debt.js +3 -6
- package/clients/scan-architectural-debt.ts +3 -6
- package/clients/scan-utils.js +5 -20
- package/clients/scan-utils.ts +5 -29
- package/clients/secrets-scanner.js +3 -17
- package/clients/secrets-scanner.ts +4 -20
- package/clients/services/__tests__/effect-integration.test.js +86 -0
- package/clients/services/__tests__/effect-integration.test.ts +111 -0
- package/clients/services/effect-integration.js +194 -0
- package/clients/services/effect-integration.ts +268 -0
- package/clients/services/index.js +7 -0
- package/clients/services/index.ts +8 -0
- package/clients/services/runner-service.js +105 -0
- package/clients/services/runner-service.ts +179 -0
- package/clients/sg-runner.js +87 -13
- package/clients/sg-runner.ts +97 -13
- package/clients/state-matrix.js +160 -0
- package/clients/state-matrix.ts +202 -0
- package/clients/subprocess-client.js +10 -9
- package/clients/subprocess-client.ts +10 -8
- package/clients/test-runner-client.js +3 -7
- package/clients/test-runner-client.ts +3 -6
- package/clients/tool-availability.js +4 -10
- package/clients/tool-availability.ts +4 -9
- package/clients/tree-sitter-client.js +564 -0
- package/clients/tree-sitter-client.ts +797 -0
- package/clients/tree-sitter-query-loader.js +355 -0
- package/clients/tree-sitter-query-loader.ts +425 -0
- package/clients/type-coverage-client.js +3 -7
- package/clients/type-coverage-client.ts +3 -6
- package/clients/typescript-client.codefix.test.js +157 -0
- package/clients/typescript-client.codefix.test.ts +186 -0
- package/clients/typescript-client.js +43 -0
- package/clients/typescript-client.ts +98 -0
- package/commands/booboo.js +799 -219
- package/commands/booboo.ts +1004 -225
- package/commands/clients/ast-grep-client.js +250 -0
- package/commands/clients/ast-grep-parser.js +86 -0
- package/commands/clients/ast-grep-rule-manager.js +91 -0
- package/commands/clients/ast-grep-types.js +9 -0
- package/commands/clients/biome-client.js +380 -0
- package/commands/clients/complexity-client.js +667 -0
- package/commands/clients/file-kinds.js +177 -0
- package/commands/clients/file-utils.js +40 -0
- package/commands/clients/jscpd-client.js +169 -0
- package/commands/clients/knip-client.js +211 -0
- package/commands/clients/ruff-client.js +297 -0
- package/commands/clients/safe-spawn.js +88 -0
- package/commands/clients/scan-utils.js +83 -0
- package/commands/clients/sg-runner.js +190 -0
- package/commands/clients/types.js +11 -0
- package/commands/clients/typescript-client.js +505 -0
- package/commands/fix-from-booboo.js +398 -0
- package/commands/fix-from-booboo.ts +485 -0
- package/commands/fix-simplified.js +618 -0
- package/commands/fix-simplified.ts +768 -0
- package/commands/rate.js +10 -14
- package/commands/rate.ts +9 -16
- package/default-architect.yaml +59 -15
- package/index.ts +342 -429
- package/package.json +16 -3
- package/rules/ast-grep-rules/rules/empty-catch.yml +38 -13
- package/rules/ast-grep-rules/rules/no-array-constructor.yml +1 -0
- package/rules/ast-grep-rules/rules/no-debugger.yml +2 -0
- package/rules/python-slop-rules/.sgconfig.yml +4 -0
- package/rules/python-slop-rules/rules/slop-rules.yml +647 -0
- package/rules/tree-sitter-queries/python/bare-except.yml +54 -0
- package/rules/tree-sitter-queries/python/eval-exec.yml +50 -0
- package/rules/tree-sitter-queries/python/is-vs-equals.yml +60 -0
- package/rules/tree-sitter-queries/python/mutable-default-arg.yml +57 -0
- package/rules/tree-sitter-queries/python/unreachable-except.yml +60 -0
- package/rules/tree-sitter-queries/python/wildcard-import.yml +46 -0
- package/rules/tree-sitter-queries/tsx/dangerously-set-inner-html.yml +63 -0
- package/rules/tree-sitter-queries/typescript/await-in-loop.yml +56 -0
- package/rules/tree-sitter-queries/typescript/console-statement.yml +47 -0
- package/rules/tree-sitter-queries/typescript/debugger.yml +47 -0
- package/rules/tree-sitter-queries/typescript/deep-nesting.yml +117 -0
- package/rules/tree-sitter-queries/typescript/deep-promise-chain.yml +73 -0
- package/rules/tree-sitter-queries/typescript/empty-catch.yml +64 -0
- package/rules/tree-sitter-queries/typescript/eval.yml +48 -0
- package/rules/tree-sitter-queries/typescript/hardcoded-secrets.yml +78 -0
- package/rules/tree-sitter-queries/typescript/long-parameter-list.yml +62 -0
- package/rules/tree-sitter-queries/typescript/mixed-async-styles.yml +49 -0
- package/rules/tree-sitter-queries/typescript/nested-ternary.yml +45 -0
- package/rules/ts-slop-rules/.sgconfig.yml +4 -0
- package/rules/ts-slop-rules/rules/in-correct-optional-input-type.yml +10 -0
- package/rules/ts-slop-rules/rules/jwt-no-verify.yml +13 -0
- package/rules/ts-slop-rules/rules/no-architecture-violation.yml +10 -0
- package/rules/ts-slop-rules/rules/no-case-declarations.yml +10 -0
- package/rules/ts-slop-rules/rules/no-dangerously-set-inner-html.yml +10 -0
- package/rules/ts-slop-rules/rules/no-debugger.yml +10 -0
- package/rules/ts-slop-rules/rules/no-dupe-args.yml +10 -0
- package/rules/ts-slop-rules/rules/no-dupe-class-members.yml +10 -0
- package/rules/ts-slop-rules/rules/no-dupe-keys.yml +10 -0
- package/rules/ts-slop-rules/rules/no-eval.yml +13 -0
- package/rules/ts-slop-rules/rules/no-hardcoded-secrets.yml +12 -0
- package/rules/ts-slop-rules/rules/no-implied-eval.yml +12 -0
- package/rules/ts-slop-rules/rules/no-inner-html.yml +13 -0
- package/rules/ts-slop-rules/rules/no-javascript-url.yml +10 -0
- package/rules/ts-slop-rules/rules/no-mutable-default.yml +10 -0
- package/rules/ts-slop-rules/rules/no-nested-links.yml +12 -0
- package/rules/ts-slop-rules/rules/no-new-symbol.yml +10 -0
- package/rules/ts-slop-rules/rules/no-new-wrappers.yml +13 -0
- package/rules/ts-slop-rules/rules/no-open-redirect.yml +16 -0
- package/rules/ts-slop-rules/rules/slop-rules.yml +455 -0
- package/rules/ts-slop-rules/rules/weak-rsa-key.yml +12 -0
- package/skills/ast-grep/SKILL.md +182 -0
- package/clients/dispatch/runners/secrets.js +0 -109
- package/commands/fix.js +0 -244
- package/commands/fix.ts +0 -373
- package/rules/ast-grep-rules/rules/no-lonely-if.yml +0 -13
package/commands/rate.js
CHANGED
|
@@ -4,9 +4,10 @@
|
|
|
4
4
|
* Provides a visual scoring breakdown of code quality across multiple dimensions.
|
|
5
5
|
* Uses existing scan data to calculate scores.
|
|
6
6
|
*/
|
|
7
|
-
import * as childProcess from "node:child_process";
|
|
8
7
|
import * as nodeFs from "node:fs";
|
|
9
8
|
import * as path from "node:path";
|
|
9
|
+
import { safeSpawn } from "../clients/safe-spawn.js";
|
|
10
|
+
import { EXCLUDED_DIRS, isTestFile } from "../clients/file-utils.js";
|
|
10
11
|
import { getSourceFiles } from "../clients/scan-utils.js";
|
|
11
12
|
/**
|
|
12
13
|
* Run all scans and calculate scores
|
|
@@ -69,7 +70,7 @@ export async function gatherScores(targetPath, clients) {
|
|
|
69
70
|
let securityScore = 100;
|
|
70
71
|
const securityIssues = [];
|
|
71
72
|
let secretsFound = 0;
|
|
72
|
-
// Check for secrets in source files
|
|
73
|
+
// Check for secrets in source files (skip test files)
|
|
73
74
|
const secretPatterns = [
|
|
74
75
|
{ name: "API Key (sk-)", pattern: /sk-[a-zA-Z0-9]{20,}/ },
|
|
75
76
|
{ name: "GitHub Token", pattern: /ghp_[a-zA-Z0-9]{36}/ },
|
|
@@ -82,6 +83,9 @@ export async function gatherScores(targetPath, clients) {
|
|
|
82
83
|
},
|
|
83
84
|
];
|
|
84
85
|
for (const file of files.slice(0, 100)) {
|
|
86
|
+
// Skip test files
|
|
87
|
+
if (isTestFile(file))
|
|
88
|
+
continue;
|
|
85
89
|
try {
|
|
86
90
|
const content = nodeFs.readFileSync(file, "utf-8");
|
|
87
91
|
for (const line of content.split("\n")) {
|
|
@@ -97,8 +101,9 @@ export async function gatherScores(targetPath, clients) {
|
|
|
97
101
|
}
|
|
98
102
|
}
|
|
99
103
|
}
|
|
100
|
-
catch {
|
|
104
|
+
catch (err) {
|
|
101
105
|
// Skip unreadable files
|
|
106
|
+
void err;
|
|
102
107
|
}
|
|
103
108
|
}
|
|
104
109
|
securityScore = Math.max(0, 100 - secretsFound * 15);
|
|
@@ -118,14 +123,7 @@ export async function gatherScores(targetPath, clients) {
|
|
|
118
123
|
for (const entry of nodeFs.readdirSync(dir, { withFileTypes: true })) {
|
|
119
124
|
const full = path.join(dir, entry.name);
|
|
120
125
|
if (entry.isDirectory()) {
|
|
121
|
-
if (
|
|
122
|
-
"node_modules",
|
|
123
|
-
".git",
|
|
124
|
-
"dist",
|
|
125
|
-
"build",
|
|
126
|
-
".next",
|
|
127
|
-
".pi-lens",
|
|
128
|
-
].includes(entry.name))
|
|
126
|
+
if (EXCLUDED_DIRS.includes(entry.name))
|
|
129
127
|
continue;
|
|
130
128
|
scanDir(full);
|
|
131
129
|
}
|
|
@@ -181,10 +179,8 @@ export async function gatherScores(targetPath, clients) {
|
|
|
181
179
|
const testIssues = [];
|
|
182
180
|
// Quick test run
|
|
183
181
|
try {
|
|
184
|
-
const testResult =
|
|
185
|
-
encoding: "utf-8",
|
|
182
|
+
const testResult = safeSpawn("npx", ["vitest", "run", "--reporter=basic"], {
|
|
186
183
|
timeout: 60000,
|
|
187
|
-
shell: true,
|
|
188
184
|
cwd: targetPath,
|
|
189
185
|
});
|
|
190
186
|
if (testResult.status !== 0) {
|
package/commands/rate.ts
CHANGED
|
@@ -8,10 +8,12 @@
|
|
|
8
8
|
import * as childProcess from "node:child_process";
|
|
9
9
|
import * as nodeFs from "node:fs";
|
|
10
10
|
import * as path from "node:path";
|
|
11
|
+
import { safeSpawn } from "../clients/safe-spawn.js";
|
|
11
12
|
import type { ExtensionContext } from "@mariozechner/pi-coding-agent";
|
|
12
13
|
import type { ArchitectClient } from "../clients/architect-client.js";
|
|
13
14
|
import type { ComplexityClient } from "../clients/complexity-client.js";
|
|
14
15
|
import type { KnipClient } from "../clients/knip-client.js";
|
|
16
|
+
import { EXCLUDED_DIRS, isTestFile } from "../clients/file-utils.js";
|
|
15
17
|
import { getSourceFiles } from "../clients/scan-utils.js";
|
|
16
18
|
import type { TypeCoverageClient } from "../clients/type-coverage-client.js";
|
|
17
19
|
|
|
@@ -105,7 +107,7 @@ export async function gatherScores(
|
|
|
105
107
|
const securityIssues: string[] = [];
|
|
106
108
|
let secretsFound = 0;
|
|
107
109
|
|
|
108
|
-
// Check for secrets in source files
|
|
110
|
+
// Check for secrets in source files (skip test files)
|
|
109
111
|
const secretPatterns = [
|
|
110
112
|
{ name: "API Key (sk-)", pattern: /sk-[a-zA-Z0-9]{20,}/ },
|
|
111
113
|
{ name: "GitHub Token", pattern: /ghp_[a-zA-Z0-9]{36}/ },
|
|
@@ -119,6 +121,8 @@ export async function gatherScores(
|
|
|
119
121
|
];
|
|
120
122
|
|
|
121
123
|
for (const file of files.slice(0, 100)) {
|
|
124
|
+
// Skip test files
|
|
125
|
+
if (isTestFile(file)) continue;
|
|
122
126
|
try {
|
|
123
127
|
const content = nodeFs.readFileSync(file, "utf-8");
|
|
124
128
|
for (const line of content.split("\n")) {
|
|
@@ -133,8 +137,9 @@ export async function gatherScores(
|
|
|
133
137
|
}
|
|
134
138
|
}
|
|
135
139
|
}
|
|
136
|
-
} catch {
|
|
140
|
+
} catch (err) {
|
|
137
141
|
// Skip unreadable files
|
|
142
|
+
void err;
|
|
138
143
|
}
|
|
139
144
|
}
|
|
140
145
|
securityScore = Math.max(0, 100 - secretsFound * 15);
|
|
@@ -156,17 +161,7 @@ export async function gatherScores(
|
|
|
156
161
|
for (const entry of nodeFs.readdirSync(dir, { withFileTypes: true })) {
|
|
157
162
|
const full = path.join(dir, entry.name);
|
|
158
163
|
if (entry.isDirectory()) {
|
|
159
|
-
if (
|
|
160
|
-
[
|
|
161
|
-
"node_modules",
|
|
162
|
-
".git",
|
|
163
|
-
"dist",
|
|
164
|
-
"build",
|
|
165
|
-
".next",
|
|
166
|
-
".pi-lens",
|
|
167
|
-
].includes(entry.name)
|
|
168
|
-
)
|
|
169
|
-
continue;
|
|
164
|
+
if (EXCLUDED_DIRS.includes(entry.name)) continue;
|
|
170
165
|
scanDir(full);
|
|
171
166
|
} else if (/\.(ts|tsx|js|jsx|py|go|rs)$/.test(entry.name)) {
|
|
172
167
|
const relPath = path.relative(targetPath, full).replace(/\\/g, "/");
|
|
@@ -226,13 +221,11 @@ export async function gatherScores(
|
|
|
226
221
|
|
|
227
222
|
// Quick test run
|
|
228
223
|
try {
|
|
229
|
-
const testResult =
|
|
224
|
+
const testResult = safeSpawn(
|
|
230
225
|
"npx",
|
|
231
226
|
["vitest", "run", "--reporter=basic"],
|
|
232
227
|
{
|
|
233
|
-
encoding: "utf-8",
|
|
234
228
|
timeout: 60000,
|
|
235
|
-
shell: true,
|
|
236
229
|
cwd: targetPath,
|
|
237
230
|
},
|
|
238
231
|
);
|
package/default-architect.yaml
CHANGED
|
@@ -7,7 +7,39 @@
|
|
|
7
7
|
# IMPORTANT: Patterns are JavaScript regex syntax. Use single quotes for patterns
|
|
8
8
|
# containing double quotes, and escape backslashes appropriately.
|
|
9
9
|
|
|
10
|
-
version: "1.
|
|
10
|
+
version: "1.2"
|
|
11
|
+
|
|
12
|
+
# =============================================================================
|
|
13
|
+
# FILE SIZE LIMITS (per file type)
|
|
14
|
+
# =============================================================================
|
|
15
|
+
|
|
16
|
+
# Services: focused, single-purpose modules
|
|
17
|
+
- pattern: "**/services/**/*.ts"
|
|
18
|
+
max_lines: 500
|
|
19
|
+
must_not:
|
|
20
|
+
# TUNED: Was (8+ spaces, 5 lines), now (12+ spaces, 10 lines)
|
|
21
|
+
- pattern: '(?:\s{12,}.*\n){10,}'
|
|
22
|
+
message: "Extreme nesting detected (6+ levels). Refactor into smaller functions."
|
|
23
|
+
|
|
24
|
+
# Clients: can be larger but still bounded
|
|
25
|
+
- pattern: "**/clients/**/*.ts|**/commands/**/*.ts"
|
|
26
|
+
max_lines: 1000
|
|
27
|
+
must_not:
|
|
28
|
+
# TUNED: Was (8+ spaces, 5 lines), now (12+ spaces, 10 lines)
|
|
29
|
+
- pattern: '(?:\s{12,}.*\n){10,}'
|
|
30
|
+
message: "Extreme nesting detected (6+ levels). Refactor into smaller functions."
|
|
31
|
+
|
|
32
|
+
# General limit for other files (higher than before)
|
|
33
|
+
- pattern: "**/*.{ts,tsx,js,jsx,py,go,rs}"
|
|
34
|
+
max_lines: 3000
|
|
35
|
+
must_not:
|
|
36
|
+
# TUNED: Was (8+ spaces, 5 lines), now (12+ spaces, 10 lines) for extreme nesting only
|
|
37
|
+
- pattern: '(?:\s{12,}.*\n){10,}'
|
|
38
|
+
message: "Extreme nesting detected (6+ levels). Refactor into smaller functions."
|
|
39
|
+
|
|
40
|
+
# Test files: more relaxed (structure is different)
|
|
41
|
+
- pattern: "**/*.test.ts|**/*.test.js|**/*.spec.ts|**/*.spec.js"
|
|
42
|
+
max_lines: 5000
|
|
11
43
|
|
|
12
44
|
# =============================================================================
|
|
13
45
|
# LANGUAGE-AGNOSTIC RULES (The "Universal Truths")
|
|
@@ -19,27 +51,33 @@ rules:
|
|
|
19
51
|
must_not:
|
|
20
52
|
- pattern: '[a-zA-Z]:\\(?:Users|Program Files|Windows|Temp)\\[^\\]*'
|
|
21
53
|
message: "No absolute Windows paths — breaks CI and cross-platform builds."
|
|
54
|
+
fix: "Use path.join(__dirname, 'relative/path') or process.cwd()"
|
|
22
55
|
- pattern: '/(?:home|Users|usr|etc|var)/[a-zA-Z0-9_-]+/'
|
|
23
56
|
message: "Potential absolute Unix path detected — use relative paths or path.join()."
|
|
57
|
+
fix: "Use path.join(process.cwd(), 'relative/path') or path.resolve()"
|
|
24
58
|
- pattern: 'https?://localhost:[0-9]+'
|
|
25
59
|
message: "No hardcoded localhost URLs — use environment variables or a config service."
|
|
60
|
+
fix: "Use process.env.API_URL || 'http://localhost:3000'"
|
|
26
61
|
|
|
27
62
|
# --- Complexity & Technical Debt ---
|
|
28
63
|
- pattern: "**/*.{ts,tsx,js,jsx,py,go,rs}"
|
|
29
|
-
max_lines: 3000
|
|
30
64
|
must_not:
|
|
31
|
-
- pattern: '(?:\s{8,}.*\n){5,}'
|
|
32
|
-
message: "Deep nesting detected (4+ levels). Refactor into smaller functions to reduce cognitive load."
|
|
33
65
|
- pattern: '(?:(?://|#).*\n){10,}'
|
|
34
66
|
message: "Large block of commented-out code detected. This is dead code — delete it and rely on Git history."
|
|
67
|
+
fix: "Delete the commented code. Git history preserves it if needed later."
|
|
35
68
|
|
|
36
69
|
# --- Reliability & Fragility ---
|
|
37
70
|
- pattern: "**/*.{ts,tsx,js,jsx,py,go,rs}"
|
|
38
71
|
must_not:
|
|
39
72
|
- pattern: '(?:catch|except)\s*\(?.*?\)?\s*\{\s*\}'
|
|
40
73
|
message: "No empty catch/except blocks. Swallowing errors makes debugging impossible — at least log the error."
|
|
74
|
+
fix: |
|
|
75
|
+
console.error(`[context] Operation failed:`, err);
|
|
76
|
+
// or: throw err;
|
|
77
|
+
// or: return null;
|
|
41
78
|
- pattern: '\b(?:password|secret|api_?key|token|private_?key)\b\s*[:=]\s*(?:"|'')[^''"]{8,}(?:"|'')'
|
|
42
79
|
message: "No hardcoded secrets — use environment variables or a secrets manager."
|
|
80
|
+
fix: "Use process.env.SECRET_NAME and add to .env.example (not .env!)"
|
|
43
81
|
|
|
44
82
|
# =============================================================================
|
|
45
83
|
# JS/TS-SPECIFIC RULES (Node.js & Frontend)
|
|
@@ -50,28 +88,34 @@ rules:
|
|
|
50
88
|
must_not:
|
|
51
89
|
- pattern: ':\s*any\b|as\s+any\b'
|
|
52
90
|
message: "No 'any' types — use 'unknown' or define a proper interface to maintain type safety."
|
|
91
|
+
fix: |
|
|
92
|
+
// Instead of: x as any
|
|
93
|
+
x as unknown as SpecificType
|
|
94
|
+
// Or define proper interface and use it
|
|
53
95
|
must:
|
|
54
96
|
- "Use strict TypeScript mode"
|
|
55
97
|
|
|
56
98
|
# --- Configuration & IO ---
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
99
|
+
# REMOVED: no process.env rule - extensions and CLI tools need env access
|
|
100
|
+
# If you want this rule for your project, add it to your .pi-lens/architect.yaml:
|
|
101
|
+
# - pattern: "**/services/**/*.ts|**/domain/**/*.ts"
|
|
102
|
+
# must_not:
|
|
103
|
+
# - pattern: 'process\.env'
|
|
104
|
+
# message: "Domain/Service logic must not read env vars directly — inject config."
|
|
63
105
|
|
|
64
106
|
# --- Async Patterns ---
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
107
|
+
# DISABLED: .then() rule was too aggressive - flagged all promise usage
|
|
108
|
+
# Only flag in specific contexts (3+ level chains) via tree-sitter instead
|
|
109
|
+
# - pattern: "**/*.{ts,tsx,js,jsx}"
|
|
110
|
+
# must_not:
|
|
111
|
+
# - pattern: '\.then\('
|
|
112
|
+
# message: "Prefer async/await over .then() chains for better readability."
|
|
69
113
|
|
|
70
114
|
# --- Grep-ability & Agent Search ---
|
|
71
115
|
# Note: 'export default' is acceptable for entry points (index.ts)
|
|
72
116
|
- pattern: "**/*.{ts,tsx}"
|
|
73
117
|
must_not:
|
|
74
|
-
- pattern: "from
|
|
118
|
+
- pattern: "from\\s+['\"]\.\./\.\./\.\./"
|
|
75
119
|
message: "Avoid deep relative imports (3+ levels) — use absolute imports (@app/...) for agent reasoning."
|
|
76
120
|
|
|
77
121
|
# =============================================================================
|