@pipemd-core/pipemd 1.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/AI_SETUP_PIPEMD.md +184 -0
- package/CHANGELOG.md +47 -0
- package/LICENSE +15 -0
- package/README.md +535 -0
- package/dist/index.js +6647 -0
- package/dist/plugins/opencode-server.js +235 -0
- package/dist/plugins/opencode-tui.js +914 -0
- package/dist/templates/agent-decision-tree.md +113 -0
- package/dist/templates/static-rules.md +7 -0
- package/package.json +68 -0
- package/scripts/C-CPP/architecture/arch.sh +229 -0
- package/scripts/C-CPP/lib/limit.sh +146 -0
- package/scripts/C-CPP/project/class-diagram.sh +96 -0
- package/scripts/C-CPP/project/cmake-targets.sh +68 -0
- package/scripts/C-CPP/project/deps.sh +44 -0
- package/scripts/C-CPP/project/find-todos.sh +6 -0
- package/scripts/C-CPP/project/include-graph.sh +110 -0
- package/scripts/C-CPP/project/interfaces.sh +108 -0
- package/scripts/C-CPP/project/tree.sh +5 -0
- package/scripts/C-CPP/quality/lint.sh +14 -0
- package/scripts/C-CPP/quality/test-summary.sh +22 -0
- package/scripts/C-CPP/quality/type-check.sh +26 -0
- package/scripts/DevOps/architecture/arch.sh +186 -0
- package/scripts/DevOps/devops/aws-context.sh +34 -0
- package/scripts/DevOps/devops/docker-stats.sh +42 -0
- package/scripts/DevOps/devops/k8s-unhealthy.sh +41 -0
- package/scripts/DevOps/devops/tf-state.sh +65 -0
- package/scripts/DevOps/lib/limit.sh +143 -0
- package/scripts/Generic/architecture/arch.sh +570 -0
- package/scripts/Generic/lib/limit.sh +140 -0
- package/scripts/Go/architecture/arch.sh +79 -0
- package/scripts/Go/lib/limit.sh +142 -0
- package/scripts/Go/project/deps.sh +35 -0
- package/scripts/Go/project/find-todos.sh +6 -0
- package/scripts/Go/project/go-interfaces.sh +18 -0
- package/scripts/Go/project/go-packages.sh +28 -0
- package/scripts/Go/project/tree.sh +5 -0
- package/scripts/Go/quality/lint.sh +16 -0
- package/scripts/Go/quality/test-summary.sh +16 -0
- package/scripts/Go/quality/type-check.sh +16 -0
- package/scripts/Node-TypeScript/api/express-routes.sh +14 -0
- package/scripts/Node-TypeScript/api/nest-controllers.sh +18 -0
- package/scripts/Node-TypeScript/architecture/arch.sh +174 -0
- package/scripts/Node-TypeScript/frontend/angular-routes.sh +15 -0
- package/scripts/Node-TypeScript/frontend/nextjs-app-router.sh +13 -0
- package/scripts/Node-TypeScript/frontend/react-components.sh +20 -0
- package/scripts/Node-TypeScript/lib/limit.sh +146 -0
- package/scripts/Node-TypeScript/project/deps.sh +15 -0
- package/scripts/Node-TypeScript/project/find-todos.sh +6 -0
- package/scripts/Node-TypeScript/quality/lint.sh +10 -0
- package/scripts/Node-TypeScript/quality/test-summary.sh +39 -0
- package/scripts/Node-TypeScript/quality/type-check.sh +10 -0
- package/scripts/Python/api/fastapi-routes.sh +12 -0
- package/scripts/Python/architecture/arch.sh +220 -0
- package/scripts/Python/db/django-models.sh +12 -0
- package/scripts/Python/db/sqlalchemy.sh +17 -0
- package/scripts/Python/lib/limit.sh +144 -0
- package/scripts/Python/project/deps.sh +28 -0
- package/scripts/Python/project/find-todos.sh +6 -0
- package/scripts/Python/quality/lint.sh +13 -0
- package/scripts/Python/quality/test-summary.sh +11 -0
- package/scripts/Python/quality/type-check.sh +10 -0
- package/scripts/Rust/architecture/arch.sh +176 -0
- package/scripts/Rust/lib/limit.sh +142 -0
- package/scripts/Rust/project/cargo-deps.sh +42 -0
- package/scripts/Rust/project/cargo-features.sh +26 -0
- package/scripts/Rust/project/find-todos.sh +6 -0
- package/scripts/Rust/project/tree.sh +5 -0
- package/scripts/Rust/quality/lint.sh +16 -0
- package/scripts/Rust/quality/test-summary.sh +16 -0
- package/scripts/Rust/quality/type-check.sh +16 -0
- package/scripts/Shared/api/express-routes.sh +11 -0
- package/scripts/Shared/api/fastapi-routes.sh +10 -0
- package/scripts/Shared/api/nest-controllers.sh +22 -0
- package/scripts/Shared/architecture/normalize.sh +178 -0
- package/scripts/Shared/crew/crew.sh +15 -0
- package/scripts/Shared/db/django-models.sh +11 -0
- package/scripts/Shared/db/prisma.sh +33 -0
- package/scripts/Shared/db/sqlalchemy.sh +12 -0
- package/scripts/Shared/frontend/angular-routes.sh +11 -0
- package/scripts/Shared/frontend/nextjs-app-router.sh +13 -0
- package/scripts/Shared/frontend/react-components.sh +11 -0
- package/scripts/Shared/git/diff-stat.sh +6 -0
- package/scripts/Shared/git/git-branch.sh +16 -0
- package/scripts/Shared/git/git-log.sh +6 -0
- package/scripts/Shared/git/git-status.sh +6 -0
- package/scripts/Shared/lib/limit.sh +144 -0
- package/scripts/Shared/project/compose-md.sh +182 -0
- package/scripts/Shared/project/deps.sh +69 -0
- package/scripts/Shared/project/find-todos.sh +6 -0
- package/scripts/Shared/project/tree.sh +5 -0
- package/scripts/Shared/quality/lint.sh +81 -0
- package/scripts/Shared/quality/test-summary.sh +103 -0
- package/scripts/Shared/quality/type-check.sh +114 -0
- package/scripts/copy-plugins.mjs +4 -0
- package/scripts/copy-templates.mjs +5 -0
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
set -uo pipefail
|
|
3
|
+
# limit.sh — Smart output limiter with compact fallbacks
|
|
4
|
+
# TOKEN profile multiplier (override via PMD_TOKEN_PROFILE env var)
|
|
5
|
+
PMD_TOKEN_PROFILE="${PMD_TOKEN_PROFILE:-medium}"
|
|
6
|
+
case "$PMD_TOKEN_PROFILE" in
|
|
7
|
+
low) MULT_NUM=1; MULT_DEN=2 ;;
|
|
8
|
+
medium) MULT_NUM=1; MULT_DEN=1 ;;
|
|
9
|
+
high) MULT_NUM=3; MULT_DEN=2 ;;
|
|
10
|
+
xhigh) MULT_NUM=2; MULT_DEN=1 ;;
|
|
11
|
+
unlimited) PMD_UNLIMITED=1 ;;
|
|
12
|
+
*) MULT_NUM=1; MULT_DEN=1 ;;
|
|
13
|
+
esac
|
|
14
|
+
|
|
15
|
+
# Token budget constants (override via PMD_MAX_* env vars, scaled by profile)
|
|
16
|
+
if [ "${PMD_UNLIMITED:-0}" = "1" ]; then
|
|
17
|
+
MAX_TREE=${PMD_MAX_TREE:-99999}
|
|
18
|
+
MAX_DEPS=${PMD_MAX_DEPS:-99999}
|
|
19
|
+
MAX_TODOS=${PMD_MAX_TODOS:-99999}
|
|
20
|
+
MAX_LOG=${PMD_MAX_LOG:-99999}
|
|
21
|
+
MAX_BRANCH=${PMD_MAX_BRANCH:-99999}
|
|
22
|
+
MAX_STATUS=${PMD_MAX_STATUS:-99999}
|
|
23
|
+
MAX_DIFF=${PMD_MAX_DIFF:-99999}
|
|
24
|
+
MAX_TYPECHECK=${PMD_MAX_TYPECHECK:-99999}
|
|
25
|
+
MAX_LINT=${PMD_MAX_LINT:-99999}
|
|
26
|
+
MAX_TEST=${PMD_MAX_TEST:-99999}
|
|
27
|
+
MAX_PRISMA=${PMD_MAX_PRISMA:-99999}
|
|
28
|
+
MAX_EXPRESS=${PMD_MAX_EXPRESS:-99999}
|
|
29
|
+
MAX_FASTAPI=${PMD_MAX_FASTAPI:-99999}
|
|
30
|
+
MAX_DJANGO=${PMD_MAX_DJANGO:-99999}
|
|
31
|
+
MAX_SQLALCHEMY=${PMD_MAX_SQLALCHEMY:-99999}
|
|
32
|
+
MAX_NEST=${PMD_MAX_NEST:-99999}
|
|
33
|
+
MAX_NEXTJS=${PMD_MAX_NEXTJS:-99999}
|
|
34
|
+
MAX_REACT=${PMD_MAX_REACT:-99999}
|
|
35
|
+
MAX_ANGULAR=${PMD_MAX_ANGULAR:-99999}
|
|
36
|
+
MAX_CMAKE=${PMD_MAX_CMAKE:-99999}
|
|
37
|
+
MAX_CLASS=${PMD_MAX_CLASS:-99999}
|
|
38
|
+
MAX_INTERFACE=${PMD_MAX_INTERFACE:-99999}
|
|
39
|
+
MAX_INCLUDE=${PMD_MAX_INCLUDE:-99999}
|
|
40
|
+
MAX_CARGO=${PMD_MAX_CARGO:-99999}
|
|
41
|
+
MAX_GO_PKGS=${PMD_MAX_GO_PKGS:-99999}
|
|
42
|
+
MAX_CARGO_FEATURES=${PMD_MAX_CARGO_FEATURES:-99999}
|
|
43
|
+
MAX_GO_INTERFACES=${PMD_MAX_GO_INTERFACES:-99999}
|
|
44
|
+
MAX_DOCKER=${PMD_MAX_DOCKER:-99999}
|
|
45
|
+
MAX_K8S=${PMD_MAX_K8S:-99999}
|
|
46
|
+
MAX_TF=${PMD_MAX_TF:-99999}
|
|
47
|
+
MAX_AWS=${PMD_MAX_AWS:-99999}
|
|
48
|
+
MAX_ARCH=${PMD_MAX_ARCH:-99999}
|
|
49
|
+
MAX_COMPOSE=${PMD_MAX_COMPOSE:-99999}
|
|
50
|
+
MAX_CREW=${PMD_MAX_CREW:-99999}
|
|
51
|
+
else
|
|
52
|
+
MAX_TREE=$(( (${PMD_MAX_TREE:-50} * MULT_NUM) / MULT_DEN ))
|
|
53
|
+
MAX_DEPS=$(( (${PMD_MAX_DEPS:-40} * MULT_NUM) / MULT_DEN ))
|
|
54
|
+
MAX_TODOS=$(( (${PMD_MAX_TODOS:-20} * MULT_NUM) / MULT_DEN ))
|
|
55
|
+
MAX_LOG=$(( (${PMD_MAX_LOG:-20} * MULT_NUM) / MULT_DEN ))
|
|
56
|
+
MAX_BRANCH=$(( (${PMD_MAX_BRANCH:-20} * MULT_NUM) / MULT_DEN ))
|
|
57
|
+
MAX_STATUS=$(( (${PMD_MAX_STATUS:-30} * MULT_NUM) / MULT_DEN ))
|
|
58
|
+
MAX_DIFF=$(( (${PMD_MAX_DIFF:-30} * MULT_NUM) / MULT_DEN ))
|
|
59
|
+
MAX_TYPECHECK=$(( (${PMD_MAX_TYPECHECK:-30} * MULT_NUM) / MULT_DEN ))
|
|
60
|
+
MAX_LINT=$(( (${PMD_MAX_LINT:-20} * MULT_NUM) / MULT_DEN ))
|
|
61
|
+
MAX_TEST=$(( (${PMD_MAX_TEST:-10} * MULT_NUM) / MULT_DEN ))
|
|
62
|
+
MAX_PRISMA=$(( (${PMD_MAX_PRISMA:-40} * MULT_NUM) / MULT_DEN ))
|
|
63
|
+
MAX_EXPRESS=$(( (${PMD_MAX_EXPRESS:-30} * MULT_NUM) / MULT_DEN ))
|
|
64
|
+
MAX_FASTAPI=$(( (${PMD_MAX_FASTAPI:-30} * MULT_NUM) / MULT_DEN ))
|
|
65
|
+
MAX_DJANGO=$(( (${PMD_MAX_DJANGO:-40} * MULT_NUM) / MULT_DEN ))
|
|
66
|
+
MAX_SQLALCHEMY=$(( (${PMD_MAX_SQLALCHEMY:-40} * MULT_NUM) / MULT_DEN ))
|
|
67
|
+
MAX_NEST=$(( (${PMD_MAX_NEST:-30} * MULT_NUM) / MULT_DEN ))
|
|
68
|
+
MAX_NEXTJS=$(( (${PMD_MAX_NEXTJS:-30} * MULT_NUM) / MULT_DEN ))
|
|
69
|
+
MAX_REACT=$(( (${PMD_MAX_REACT:-30} * MULT_NUM) / MULT_DEN ))
|
|
70
|
+
MAX_ANGULAR=$(( (${PMD_MAX_ANGULAR:-30} * MULT_NUM) / MULT_DEN ))
|
|
71
|
+
MAX_CMAKE=$(( (${PMD_MAX_CMAKE:-40} * MULT_NUM) / MULT_DEN ))
|
|
72
|
+
MAX_CLASS=$(( (${PMD_MAX_CLASS:-40} * MULT_NUM) / MULT_DEN ))
|
|
73
|
+
MAX_INTERFACE=$(( (${PMD_MAX_INTERFACE:-30} * MULT_NUM) / MULT_DEN ))
|
|
74
|
+
MAX_INCLUDE=$(( (${PMD_MAX_INCLUDE:-40} * MULT_NUM) / MULT_DEN ))
|
|
75
|
+
MAX_CARGO=$(( (${PMD_MAX_CARGO:-40} * MULT_NUM) / MULT_DEN ))
|
|
76
|
+
MAX_GO_PKGS=$(( (${PMD_MAX_GO_PKGS:-40} * MULT_NUM) / MULT_DEN ))
|
|
77
|
+
MAX_CARGO_FEATURES=$(( (${PMD_MAX_CARGO_FEATURES:-20} * MULT_NUM) / MULT_DEN ))
|
|
78
|
+
MAX_GO_INTERFACES=$(( (${PMD_MAX_GO_INTERFACES:-30} * MULT_NUM) / MULT_DEN ))
|
|
79
|
+
MAX_DOCKER=$(( (${PMD_MAX_DOCKER:-30} * MULT_NUM) / MULT_DEN ))
|
|
80
|
+
MAX_K8S=$(( (${PMD_MAX_K8S:-20} * MULT_NUM) / MULT_DEN ))
|
|
81
|
+
MAX_TF=$(( (${PMD_MAX_TF:-40} * MULT_NUM) / MULT_DEN ))
|
|
82
|
+
MAX_AWS=$(( (${PMD_MAX_AWS:-10} * MULT_NUM) / MULT_DEN ))
|
|
83
|
+
MAX_ARCH=$(( (${PMD_MAX_ARCH:-100} * MULT_NUM) / MULT_DEN ))
|
|
84
|
+
MAX_COMPOSE=$(( (${PMD_MAX_COMPOSE:-150} * MULT_NUM) / MULT_DEN ))
|
|
85
|
+
MAX_CREW=$(( (${PMD_MAX_CREW:-40} * MULT_NUM) / MULT_DEN ))
|
|
86
|
+
fi
|
|
87
|
+
|
|
88
|
+
TREE_EXCLUDES="${PMD_TREE_EXCLUDES:-.git|.pipemd}"
|
|
89
|
+
|
|
90
|
+
limit_output() {
|
|
91
|
+
local text="$1"
|
|
92
|
+
local max="${2:-25}"
|
|
93
|
+
local fallback="$3"
|
|
94
|
+
local lines
|
|
95
|
+
lines=$(echo "$text" | wc -l)
|
|
96
|
+
if [ "$lines" -le "$max" ]; then
|
|
97
|
+
echo "$text"
|
|
98
|
+
else
|
|
99
|
+
echo "$fallback"
|
|
100
|
+
fi
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
limit_tree() {
|
|
104
|
+
local max="${1:-$MAX_TREE}"
|
|
105
|
+
local excl="${TREE_EXCLUDES}"
|
|
106
|
+
|
|
107
|
+
if command -v tree &>/dev/null; then
|
|
108
|
+
local out3
|
|
109
|
+
out3=$(tree -L 3 -I "$excl" --dirsfirst 2>/dev/null)
|
|
110
|
+
local lines3=$(echo "$out3" | wc -l)
|
|
111
|
+
|
|
112
|
+
if [ "$lines3" -le "$max" ]; then
|
|
113
|
+
echo "$out3"
|
|
114
|
+
return
|
|
115
|
+
fi
|
|
116
|
+
|
|
117
|
+
local out2
|
|
118
|
+
out2=$(tree -L 2 -I "$excl" --dirsfirst 2>/dev/null)
|
|
119
|
+
local lines2=$(echo "$out2" | wc -l)
|
|
120
|
+
|
|
121
|
+
if [ "$lines2" -le "$max" ]; then
|
|
122
|
+
echo "$out2"
|
|
123
|
+
echo "(${lines3} lines at depth 3, showing depth 2)"
|
|
124
|
+
return
|
|
125
|
+
fi
|
|
126
|
+
|
|
127
|
+
local out1
|
|
128
|
+
out1=$(tree -L 1 -I "$excl" --dirsfirst 2>/dev/null)
|
|
129
|
+
echo "$out1"
|
|
130
|
+
echo "(${lines3} lines at depth 3, showing depth 1)"
|
|
131
|
+
else
|
|
132
|
+
echo "Project structure:"
|
|
133
|
+
find . -maxdepth 3 \
|
|
134
|
+
-not -path '*/.git/*' \
|
|
135
|
+
-not -path '*/.pipemd/*' \
|
|
136
|
+
-not -name '.git' \
|
|
137
|
+
-not -name '.pipemd' \
|
|
138
|
+
2>/dev/null | head -"$max" | sort
|
|
139
|
+
fi
|
|
140
|
+
}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
set -uo pipefail
|
|
3
|
+
# Architecture map — Go module dependencies
|
|
4
|
+
source "$(dirname "$0")/../lib/limit.sh"
|
|
5
|
+
|
|
6
|
+
: "${MAX_ARCH:=100}"
|
|
7
|
+
|
|
8
|
+
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
|
9
|
+
NORMALIZE="$SCRIPT_DIR/normalize.sh"
|
|
10
|
+
[ -f "$NORMALIZE" ] || NORMALIZE="$SCRIPT_DIR/../../Shared/architecture/normalize.sh"
|
|
11
|
+
|
|
12
|
+
if [ ! -f go.mod ]; then
|
|
13
|
+
echo "No go.mod found"
|
|
14
|
+
exit 0
|
|
15
|
+
fi
|
|
16
|
+
|
|
17
|
+
MODULE=$(awk '/^module /{print $2; exit}' go.mod 2>/dev/null)
|
|
18
|
+
if [ -z "$MODULE" ]; then
|
|
19
|
+
echo "Could not parse module path from go.mod"
|
|
20
|
+
exit 0
|
|
21
|
+
fi
|
|
22
|
+
|
|
23
|
+
GO_STDLIB='archive,tar,zip,bufio,builtin,bytes,compress,bzip2,flate,gzip,lzo,zlib,container,heap,list,ring,context,crypto,aes,cipher,des,dsa,ecdsa,ed25519,elliptic,hmac,md5,rand,rc4,rsa,sha256,sha512,subtle,tls,x509,pkix,database,sql,driver,debug,dwarf,elf,macho,pe,plan9obj,buildinfo,dwarf,runtime,encoding,ascii85,asn1,binary,csv,hex,json,jose,gob,base32,base64,pem,xml,errors,expvar,flag,fmt,go,ast,build,constant,doc,format,importer,parser,printer,scanner,token,typecheck,hash,adler32,crc32,crc64,fnv,maphash,html,template,image,color,draw,gif,jpeg,png,font,ccitt,dxt5,gaussian,riff,index,suffixarray,io,ioutil,log,syslog,maps,math,big,cmplx,rand,mime,multipart,quotedprintable,net,http,cgi,cookiejar,fcgi,httputil,pprof,trace,mail,rpc,jsonrpc,smtp,url,text,scanner,tabwriter,template,time,unicode,utf16,utf8,unsafe,os,exec,signal,user,filepath,syscall,unattended,path,reflect,regexp,syntax,runtime,cgo,debug,msan,pprof,race,trace,search,slices,sort,strconv,strings,sync,atomic,map,testing,fstest,iotest,mock,quick,internal'
|
|
24
|
+
|
|
25
|
+
(
|
|
26
|
+
find . -name "*.go" \
|
|
27
|
+
-not -name "*_test.go" \
|
|
28
|
+
-not -path "*/vendor/*" \
|
|
29
|
+
-not -path "*/.git/*" \
|
|
30
|
+
-not -path "*/.pipemd/*" \
|
|
31
|
+
2>/dev/null | while IFS= read -r gofile; do
|
|
32
|
+
rel="${gofile#./}"
|
|
33
|
+
pkg_dir="$(dirname "$rel")"
|
|
34
|
+
[ "$pkg_dir" = "." ] && pkg_name="main" || pkg_name="$(basename "$pkg_dir")"
|
|
35
|
+
|
|
36
|
+
awk -v pkg="$pkg_name" -v module="$MODULE" '
|
|
37
|
+
/^import[[:space:]]*\(/ { in_block=1; next }
|
|
38
|
+
in_block && /^\)[[:space:]]*$/ { in_block=0; next }
|
|
39
|
+
in_block && /"/ {
|
|
40
|
+
match($0, /"[^"]*"/)
|
|
41
|
+
imp = substr($0, RSTART+1, RLENGTH-2)
|
|
42
|
+
if (imp != "") print pkg "\t" imp
|
|
43
|
+
}
|
|
44
|
+
/^import[[:space:]]+"[^"]*"/ {
|
|
45
|
+
match($0, /"[^"]*"/)
|
|
46
|
+
imp = substr($0, RSTART+1, RLENGTH-2)
|
|
47
|
+
if (imp != "") print pkg "\t" imp
|
|
48
|
+
}
|
|
49
|
+
' "$gofile" 2>/dev/null
|
|
50
|
+
done
|
|
51
|
+
|
|
52
|
+
) | awk -v module="$MODULE" -v go_stdlib="$GO_STDLIB" '
|
|
53
|
+
BEGIN {
|
|
54
|
+
n = split(go_stdlib, a, ",")
|
|
55
|
+
for (i = 1; i <= n; i++) stdlib[a[i]] = 1
|
|
56
|
+
}
|
|
57
|
+
{
|
|
58
|
+
pkg = $1; imp = $2
|
|
59
|
+
if (imp == "") next
|
|
60
|
+
if (index(imp, module) == 1) {
|
|
61
|
+
rest = substr(imp, length(module) + 1)
|
|
62
|
+
gsub(/^\/+/, "", rest)
|
|
63
|
+
n = split(rest, parts, "/")
|
|
64
|
+
if (n > 0 && parts[1] != "") {
|
|
65
|
+
dep = parts[1]
|
|
66
|
+
if (pkg != dep) print pkg "\t" dep
|
|
67
|
+
}
|
|
68
|
+
} else {
|
|
69
|
+
n = split(imp, parts, "/")
|
|
70
|
+
dep_name = parts[n]
|
|
71
|
+
if (dep_name == "") next
|
|
72
|
+
first = parts[1]
|
|
73
|
+
if (first in stdlib) next
|
|
74
|
+
if (match(dep_name, /\./) || match(imp, /^github\.com/) || match(imp, /^golang\.org/) || match(imp, /^google\.golang\.org/) || match(imp, /^go\.uber\.org/) || match(imp, /^cloud\.google\.com/) || match(imp, /^sigs\.k8s\.io/)) {
|
|
75
|
+
print pkg "\text:" dep_name
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
' | sort -u | MAX_ARCH="$MAX_ARCH" bash "$NORMALIZE"
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
set -uo pipefail
|
|
3
|
+
# limit.sh — Smart output limiter with compact fallbacks
|
|
4
|
+
# TOKEN profile multiplier (override via PMD_TOKEN_PROFILE env var)
|
|
5
|
+
PMD_TOKEN_PROFILE="${PMD_TOKEN_PROFILE:-medium}"
|
|
6
|
+
case "$PMD_TOKEN_PROFILE" in
|
|
7
|
+
low) MULT_NUM=1; MULT_DEN=2 ;;
|
|
8
|
+
medium) MULT_NUM=1; MULT_DEN=1 ;;
|
|
9
|
+
high) MULT_NUM=3; MULT_DEN=2 ;;
|
|
10
|
+
xhigh) MULT_NUM=2; MULT_DEN=1 ;;
|
|
11
|
+
unlimited) PMD_UNLIMITED=1 ;;
|
|
12
|
+
*) MULT_NUM=1; MULT_DEN=1 ;;
|
|
13
|
+
esac
|
|
14
|
+
|
|
15
|
+
# Token budget constants (override via PMD_MAX_* env vars, scaled by profile)
|
|
16
|
+
if [ "${PMD_UNLIMITED:-0}" = "1" ]; then
|
|
17
|
+
MAX_TREE=${PMD_MAX_TREE:-99999}
|
|
18
|
+
MAX_DEPS=${PMD_MAX_DEPS:-99999}
|
|
19
|
+
MAX_TODOS=${PMD_MAX_TODOS:-99999}
|
|
20
|
+
MAX_LOG=${PMD_MAX_LOG:-99999}
|
|
21
|
+
MAX_BRANCH=${PMD_MAX_BRANCH:-99999}
|
|
22
|
+
MAX_STATUS=${PMD_MAX_STATUS:-99999}
|
|
23
|
+
MAX_DIFF=${PMD_MAX_DIFF:-99999}
|
|
24
|
+
MAX_TYPECHECK=${PMD_MAX_TYPECHECK:-99999}
|
|
25
|
+
MAX_LINT=${PMD_MAX_LINT:-99999}
|
|
26
|
+
MAX_TEST=${PMD_MAX_TEST:-99999}
|
|
27
|
+
MAX_PRISMA=${PMD_MAX_PRISMA:-99999}
|
|
28
|
+
MAX_EXPRESS=${PMD_MAX_EXPRESS:-99999}
|
|
29
|
+
MAX_FASTAPI=${PMD_MAX_FASTAPI:-99999}
|
|
30
|
+
MAX_DJANGO=${PMD_MAX_DJANGO:-99999}
|
|
31
|
+
MAX_SQLALCHEMY=${PMD_MAX_SQLALCHEMY:-99999}
|
|
32
|
+
MAX_NEST=${PMD_MAX_NEST:-99999}
|
|
33
|
+
MAX_NEXTJS=${PMD_MAX_NEXTJS:-99999}
|
|
34
|
+
MAX_REACT=${PMD_MAX_REACT:-99999}
|
|
35
|
+
MAX_ANGULAR=${PMD_MAX_ANGULAR:-99999}
|
|
36
|
+
MAX_CMAKE=${PMD_MAX_CMAKE:-99999}
|
|
37
|
+
MAX_CLASS=${PMD_MAX_CLASS:-99999}
|
|
38
|
+
MAX_INTERFACE=${PMD_MAX_INTERFACE:-99999}
|
|
39
|
+
MAX_INCLUDE=${PMD_MAX_INCLUDE:-99999}
|
|
40
|
+
MAX_CARGO=${PMD_MAX_CARGO:-99999}
|
|
41
|
+
MAX_GO_PKGS=${PMD_MAX_GO_PKGS:-99999}
|
|
42
|
+
MAX_CARGO_FEATURES=${PMD_MAX_CARGO_FEATURES:-99999}
|
|
43
|
+
MAX_GO_INTERFACES=${PMD_MAX_GO_INTERFACES:-99999}
|
|
44
|
+
MAX_DOCKER=${PMD_MAX_DOCKER:-99999}
|
|
45
|
+
MAX_K8S=${PMD_MAX_K8S:-99999}
|
|
46
|
+
MAX_TF=${PMD_MAX_TF:-99999}
|
|
47
|
+
MAX_AWS=${PMD_MAX_AWS:-99999}
|
|
48
|
+
MAX_ARCH=${PMD_MAX_ARCH:-99999}
|
|
49
|
+
MAX_COMPOSE=${PMD_MAX_COMPOSE:-99999}
|
|
50
|
+
MAX_CREW=${PMD_MAX_CREW:-99999}
|
|
51
|
+
else
|
|
52
|
+
MAX_TREE=$(( (${PMD_MAX_TREE:-50} * MULT_NUM) / MULT_DEN ))
|
|
53
|
+
MAX_DEPS=$(( (${PMD_MAX_DEPS:-40} * MULT_NUM) / MULT_DEN ))
|
|
54
|
+
MAX_TODOS=$(( (${PMD_MAX_TODOS:-20} * MULT_NUM) / MULT_DEN ))
|
|
55
|
+
MAX_LOG=$(( (${PMD_MAX_LOG:-20} * MULT_NUM) / MULT_DEN ))
|
|
56
|
+
MAX_BRANCH=$(( (${PMD_MAX_BRANCH:-20} * MULT_NUM) / MULT_DEN ))
|
|
57
|
+
MAX_STATUS=$(( (${PMD_MAX_STATUS:-30} * MULT_NUM) / MULT_DEN ))
|
|
58
|
+
MAX_DIFF=$(( (${PMD_MAX_DIFF:-30} * MULT_NUM) / MULT_DEN ))
|
|
59
|
+
MAX_TYPECHECK=$(( (${PMD_MAX_TYPECHECK:-30} * MULT_NUM) / MULT_DEN ))
|
|
60
|
+
MAX_LINT=$(( (${PMD_MAX_LINT:-20} * MULT_NUM) / MULT_DEN ))
|
|
61
|
+
MAX_TEST=$(( (${PMD_MAX_TEST:-10} * MULT_NUM) / MULT_DEN ))
|
|
62
|
+
MAX_PRISMA=$(( (${PMD_MAX_PRISMA:-40} * MULT_NUM) / MULT_DEN ))
|
|
63
|
+
MAX_EXPRESS=$(( (${PMD_MAX_EXPRESS:-30} * MULT_NUM) / MULT_DEN ))
|
|
64
|
+
MAX_FASTAPI=$(( (${PMD_MAX_FASTAPI:-30} * MULT_NUM) / MULT_DEN ))
|
|
65
|
+
MAX_DJANGO=$(( (${PMD_MAX_DJANGO:-40} * MULT_NUM) / MULT_DEN ))
|
|
66
|
+
MAX_SQLALCHEMY=$(( (${PMD_MAX_SQLALCHEMY:-40} * MULT_NUM) / MULT_DEN ))
|
|
67
|
+
MAX_NEST=$(( (${PMD_MAX_NEST:-30} * MULT_NUM) / MULT_DEN ))
|
|
68
|
+
MAX_NEXTJS=$(( (${PMD_MAX_NEXTJS:-30} * MULT_NUM) / MULT_DEN ))
|
|
69
|
+
MAX_REACT=$(( (${PMD_MAX_REACT:-30} * MULT_NUM) / MULT_DEN ))
|
|
70
|
+
MAX_ANGULAR=$(( (${PMD_MAX_ANGULAR:-30} * MULT_NUM) / MULT_DEN ))
|
|
71
|
+
MAX_CMAKE=$(( (${PMD_MAX_CMAKE:-40} * MULT_NUM) / MULT_DEN ))
|
|
72
|
+
MAX_CLASS=$(( (${PMD_MAX_CLASS:-40} * MULT_NUM) / MULT_DEN ))
|
|
73
|
+
MAX_INTERFACE=$(( (${PMD_MAX_INTERFACE:-30} * MULT_NUM) / MULT_DEN ))
|
|
74
|
+
MAX_INCLUDE=$(( (${PMD_MAX_INCLUDE:-40} * MULT_NUM) / MULT_DEN ))
|
|
75
|
+
MAX_CARGO=$(( (${PMD_MAX_CARGO:-40} * MULT_NUM) / MULT_DEN ))
|
|
76
|
+
MAX_GO_PKGS=$(( (${PMD_MAX_GO_PKGS:-40} * MULT_NUM) / MULT_DEN ))
|
|
77
|
+
MAX_CARGO_FEATURES=$(( (${PMD_MAX_CARGO_FEATURES:-20} * MULT_NUM) / MULT_DEN ))
|
|
78
|
+
MAX_GO_INTERFACES=$(( (${PMD_MAX_GO_INTERFACES:-30} * MULT_NUM) / MULT_DEN ))
|
|
79
|
+
MAX_DOCKER=$(( (${PMD_MAX_DOCKER:-30} * MULT_NUM) / MULT_DEN ))
|
|
80
|
+
MAX_K8S=$(( (${PMD_MAX_K8S:-20} * MULT_NUM) / MULT_DEN ))
|
|
81
|
+
MAX_TF=$(( (${PMD_MAX_TF:-40} * MULT_NUM) / MULT_DEN ))
|
|
82
|
+
MAX_AWS=$(( (${PMD_MAX_AWS:-10} * MULT_NUM) / MULT_DEN ))
|
|
83
|
+
MAX_ARCH=$(( (${PMD_MAX_ARCH:-100} * MULT_NUM) / MULT_DEN ))
|
|
84
|
+
MAX_COMPOSE=$(( (${PMD_MAX_COMPOSE:-150} * MULT_NUM) / MULT_DEN ))
|
|
85
|
+
MAX_CREW=$(( (${PMD_MAX_CREW:-40} * MULT_NUM) / MULT_DEN ))
|
|
86
|
+
fi
|
|
87
|
+
|
|
88
|
+
TREE_EXCLUDES="${PMD_TREE_EXCLUDES:-vendor|.git|.pipemd|node_modules|bin}"
|
|
89
|
+
|
|
90
|
+
limit_output() {
|
|
91
|
+
local text="$1"
|
|
92
|
+
local max="${2:-25}"
|
|
93
|
+
local fallback="$3"
|
|
94
|
+
local lines
|
|
95
|
+
lines=$(echo "$text" | wc -l)
|
|
96
|
+
if [ "$lines" -le "$max" ]; then
|
|
97
|
+
echo "$text"
|
|
98
|
+
else
|
|
99
|
+
echo "$fallback"
|
|
100
|
+
fi
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
limit_tree() {
|
|
104
|
+
local max="${1:-$MAX_TREE}"
|
|
105
|
+
local excl="${TREE_EXCLUDES}"
|
|
106
|
+
|
|
107
|
+
if command -v tree &>/dev/null; then
|
|
108
|
+
local out3
|
|
109
|
+
out3=$(tree -L 3 -I "$excl" --dirsfirst 2>/dev/null)
|
|
110
|
+
local lines3=$(echo "$out3" | wc -l)
|
|
111
|
+
|
|
112
|
+
if [ "$lines3" -le "$max" ]; then
|
|
113
|
+
echo "$out3"
|
|
114
|
+
return
|
|
115
|
+
fi
|
|
116
|
+
|
|
117
|
+
local out2
|
|
118
|
+
out2=$(tree -L 2 -I "$excl" --dirsfirst 2>/dev/null)
|
|
119
|
+
local lines2=$(echo "$out2" | wc -l)
|
|
120
|
+
|
|
121
|
+
if [ "$lines2" -le "$max" ]; then
|
|
122
|
+
echo "$out2"
|
|
123
|
+
echo "(${lines3} lines at depth 3, showing depth 2)"
|
|
124
|
+
return
|
|
125
|
+
fi
|
|
126
|
+
|
|
127
|
+
local out1
|
|
128
|
+
out1=$(tree -L 1 -I "$excl" --dirsfirst 2>/dev/null)
|
|
129
|
+
echo "$out1"
|
|
130
|
+
echo "(${lines3} lines at depth 3, showing depth 1)"
|
|
131
|
+
else
|
|
132
|
+
echo "Project structure:"
|
|
133
|
+
find . -maxdepth 3 \
|
|
134
|
+
-not -path '*/vendor/*' \
|
|
135
|
+
-not -path '*/.git/*' \
|
|
136
|
+
-not -path '*/.pipemd/*' \
|
|
137
|
+
-not -name 'vendor' \
|
|
138
|
+
-not -name '.git' \
|
|
139
|
+
-not -name '.pipemd' \
|
|
140
|
+
2>/dev/null | head -"$max" | sort
|
|
141
|
+
fi
|
|
142
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
set -uo pipefail
|
|
3
|
+
# Go dependencies — parse go.mod require directives
|
|
4
|
+
source "$(dirname "$0")/../lib/limit.sh"
|
|
5
|
+
|
|
6
|
+
if [ ! -f go.mod ]; then
|
|
7
|
+
echo "No go.mod found"
|
|
8
|
+
exit 0
|
|
9
|
+
fi
|
|
10
|
+
|
|
11
|
+
# Prefer go list -m all if go is available
|
|
12
|
+
if command -v go &>/dev/null; then
|
|
13
|
+
out=$(go list -m all 2>/dev/null | tail -n +2 | head -"$MAX_DEPS")
|
|
14
|
+
if [ -n "$out" ]; then
|
|
15
|
+
echo "Dependencies:"
|
|
16
|
+
echo "$out"
|
|
17
|
+
exit 0
|
|
18
|
+
fi
|
|
19
|
+
fi
|
|
20
|
+
|
|
21
|
+
# Fallback: parse go.mod with awk
|
|
22
|
+
out=$(awk '
|
|
23
|
+
/^require[[:space:]]*\(/ { in_req=1; next }
|
|
24
|
+
in_req && /^\)[[:space:]]*$/ { in_req=0; next }
|
|
25
|
+
in_req && /^[[:space:]]+[^/]/ { print $1, $2 }
|
|
26
|
+
/^require[[:space:]]+/ && !/\(/ { print $2, $3 }
|
|
27
|
+
' go.mod 2>/dev/null | head -"$MAX_DEPS")
|
|
28
|
+
|
|
29
|
+
if [ -z "$out" ]; then
|
|
30
|
+
echo "No dependencies found in go.mod"
|
|
31
|
+
exit 0
|
|
32
|
+
fi
|
|
33
|
+
|
|
34
|
+
echo "Dependencies:"
|
|
35
|
+
echo "$out"
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
set -uo pipefail
|
|
3
|
+
# Find TODO, FIXME, HACK in Go source files
|
|
4
|
+
source "$(dirname "$0")/../lib/limit.sh"
|
|
5
|
+
out=$(grep -rn --include="*.go" 'TODO\|FIXME\|HACK\|XXX' . 2>/dev/null | grep -v '/.git/' | grep -v '/.pipemd/' | grep -v '/vendor/')
|
|
6
|
+
limit_output "$out" "$MAX_TODOS" "$(echo "$out" | head -3 && echo "... and $(($(echo "$out" | wc -l) - 3)) more items")"
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
set -uo pipefail
|
|
3
|
+
# Go interfaces — extract interface definitions from source
|
|
4
|
+
source "$(dirname "$0")/../lib/limit.sh"
|
|
5
|
+
|
|
6
|
+
out=$(grep -rn --include="*.go" -E 'type\s+\w+\s+interface\s*\{' . 2>/dev/null \
|
|
7
|
+
| grep -v '/vendor/' | grep -v '/.git/' \
|
|
8
|
+
| sed -E 's/(.*):type\s+(\w+)\s+interface.*/\2 (\1)/' \
|
|
9
|
+
| sort -u \
|
|
10
|
+
| head -"$MAX_GO_INTERFACES")
|
|
11
|
+
|
|
12
|
+
if [ -z "$out" ]; then
|
|
13
|
+
echo "No Go interfaces found"
|
|
14
|
+
exit 0
|
|
15
|
+
fi
|
|
16
|
+
|
|
17
|
+
echo "Interfaces:"
|
|
18
|
+
echo "$out"
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
set -uo pipefail
|
|
3
|
+
# Go packages — list packages from go.mod and source directories
|
|
4
|
+
source "$(dirname "$0")/../lib/limit.sh"
|
|
5
|
+
|
|
6
|
+
if [ ! -f go.mod ]; then
|
|
7
|
+
echo "No go.mod found"
|
|
8
|
+
exit 0
|
|
9
|
+
fi
|
|
10
|
+
|
|
11
|
+
module=$(awk '/^module /{print $2}' go.mod 2>/dev/null | head -1)
|
|
12
|
+
if [ -n "$module" ]; then
|
|
13
|
+
echo "Module: $module"
|
|
14
|
+
fi
|
|
15
|
+
|
|
16
|
+
out=$(find . -name "*.go" -not -path "*/vendor/*" -not -path "*/.git/*" 2>/dev/null \
|
|
17
|
+
| xargs grep -l "^package " 2>/dev/null \
|
|
18
|
+
| sed 's|/[^/]*\.go$||;s|^\./||' \
|
|
19
|
+
| sort -u \
|
|
20
|
+
| head -"$MAX_GO_PKGS")
|
|
21
|
+
|
|
22
|
+
if [ -z "$out" ]; then
|
|
23
|
+
echo "No Go packages found"
|
|
24
|
+
exit 0
|
|
25
|
+
fi
|
|
26
|
+
|
|
27
|
+
echo "Packages:"
|
|
28
|
+
echo "$out"
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
set -uo pipefail
|
|
3
|
+
# Go lint — go vet
|
|
4
|
+
source "$(dirname "$0")/../lib/limit.sh"
|
|
5
|
+
|
|
6
|
+
if ! command -v go &>/dev/null; then
|
|
7
|
+
echo "go not found"
|
|
8
|
+
exit 0
|
|
9
|
+
fi
|
|
10
|
+
|
|
11
|
+
out=$(go vet ./... 2>&1 | head -30)
|
|
12
|
+
if [ -z "$out" ]; then
|
|
13
|
+
echo "No go vet issues"
|
|
14
|
+
exit 0
|
|
15
|
+
fi
|
|
16
|
+
limit_output "$out" "$MAX_LINT" "$(echo "$out" | head -3 && echo '... more go vet warnings')"
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
set -uo pipefail
|
|
3
|
+
# Go test summary — go test
|
|
4
|
+
source "$(dirname "$0")/../lib/limit.sh"
|
|
5
|
+
|
|
6
|
+
if ! command -v go &>/dev/null; then
|
|
7
|
+
echo "go not found"
|
|
8
|
+
exit 0
|
|
9
|
+
fi
|
|
10
|
+
|
|
11
|
+
out=$(go test ./... 2>&1 | tail -5)
|
|
12
|
+
if [ -z "$out" ]; then
|
|
13
|
+
echo "No test results"
|
|
14
|
+
exit 0
|
|
15
|
+
fi
|
|
16
|
+
echo "$out"
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
set -uo pipefail
|
|
3
|
+
# Go type check — go build check
|
|
4
|
+
source "$(dirname "$0")/../lib/limit.sh"
|
|
5
|
+
|
|
6
|
+
if ! command -v go &>/dev/null; then
|
|
7
|
+
echo "go not found"
|
|
8
|
+
exit 0
|
|
9
|
+
fi
|
|
10
|
+
|
|
11
|
+
out=$(go build ./... 2>&1 | head -20)
|
|
12
|
+
if [ -z "$out" ]; then
|
|
13
|
+
echo "No build errors"
|
|
14
|
+
exit 0
|
|
15
|
+
fi
|
|
16
|
+
limit_output "$out" "$MAX_TYPECHECK" "$(echo "$out" | head -3 && echo '... more build errors')"
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
set -uo pipefail
|
|
3
|
+
# Express route metadata — method + path signatures
|
|
4
|
+
source "$(dirname "$0")/../lib/limit.sh"
|
|
5
|
+
out=$(grep -rn --include='*.js' --include='*.ts' --include='*.mjs' \
|
|
6
|
+
-E '(app|router)\.(get|post|put|delete|patch|all)\(' \
|
|
7
|
+
src/ routes/ app/ lib/ 2>/dev/null | grep -v 'node_modules' \
|
|
8
|
+
| sed -E 's/.*\.(get|post|put|delete|patch|all)\([[:space:]]*['\''"](\/[^'\''"]*)['\''"].*/\U\1 \2/' \
|
|
9
|
+
| head -"$MAX_EXPRESS")
|
|
10
|
+
if [ -z "$out" ]; then
|
|
11
|
+
echo "No Express routes found"
|
|
12
|
+
exit 0
|
|
13
|
+
fi
|
|
14
|
+
echo "$out"
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
set -uo pipefail
|
|
3
|
+
# NestJS controller metadata — decorators, routes, methods
|
|
4
|
+
source "$(dirname "$0")/../lib/limit.sh"
|
|
5
|
+
files=$(grep -rl --include='*.ts' '@Controller\|@Get\|@Post\|@Put\|@Delete\|@Patch' src/ 2>/dev/null | grep -v '/node_modules/' | head -10)
|
|
6
|
+
[ -z "$files" ] && echo "No NestJS controllers found" && exit 0
|
|
7
|
+
|
|
8
|
+
echo "$files" | while IFS= read -r f; do
|
|
9
|
+
[ -z "$f" ] && continue
|
|
10
|
+
controller=$(grep -E '@Controller\s*\(\s*['\''"](\/[^'\''"]*)' "$f" 2>/dev/null | sed -E "s/@Controller\s*\(\s*['\"]//;s/['\"].*//")
|
|
11
|
+
methods=$(grep -E '@(Get|Post|Put|Delete|Patch)\s*\(\s*['\''"](\/[^'\''"]*)' "$f" 2>/dev/null | sed -E "s/@(Get|Post|Put|Delete|Patch)\s*\(\s*['\"]//;s/['\"].*//")
|
|
12
|
+
if [ -n "$controller" ]; then
|
|
13
|
+
echo "Controller: $controller"
|
|
14
|
+
echo "$methods" | while IFS= read -r m; do
|
|
15
|
+
[ -n "$m" ] && echo " $m"
|
|
16
|
+
done
|
|
17
|
+
fi
|
|
18
|
+
done | head -"$MAX_NEST"
|