@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.
Files changed (96) hide show
  1. package/AI_SETUP_PIPEMD.md +184 -0
  2. package/CHANGELOG.md +47 -0
  3. package/LICENSE +15 -0
  4. package/README.md +535 -0
  5. package/dist/index.js +6647 -0
  6. package/dist/plugins/opencode-server.js +235 -0
  7. package/dist/plugins/opencode-tui.js +914 -0
  8. package/dist/templates/agent-decision-tree.md +113 -0
  9. package/dist/templates/static-rules.md +7 -0
  10. package/package.json +68 -0
  11. package/scripts/C-CPP/architecture/arch.sh +229 -0
  12. package/scripts/C-CPP/lib/limit.sh +146 -0
  13. package/scripts/C-CPP/project/class-diagram.sh +96 -0
  14. package/scripts/C-CPP/project/cmake-targets.sh +68 -0
  15. package/scripts/C-CPP/project/deps.sh +44 -0
  16. package/scripts/C-CPP/project/find-todos.sh +6 -0
  17. package/scripts/C-CPP/project/include-graph.sh +110 -0
  18. package/scripts/C-CPP/project/interfaces.sh +108 -0
  19. package/scripts/C-CPP/project/tree.sh +5 -0
  20. package/scripts/C-CPP/quality/lint.sh +14 -0
  21. package/scripts/C-CPP/quality/test-summary.sh +22 -0
  22. package/scripts/C-CPP/quality/type-check.sh +26 -0
  23. package/scripts/DevOps/architecture/arch.sh +186 -0
  24. package/scripts/DevOps/devops/aws-context.sh +34 -0
  25. package/scripts/DevOps/devops/docker-stats.sh +42 -0
  26. package/scripts/DevOps/devops/k8s-unhealthy.sh +41 -0
  27. package/scripts/DevOps/devops/tf-state.sh +65 -0
  28. package/scripts/DevOps/lib/limit.sh +143 -0
  29. package/scripts/Generic/architecture/arch.sh +570 -0
  30. package/scripts/Generic/lib/limit.sh +140 -0
  31. package/scripts/Go/architecture/arch.sh +79 -0
  32. package/scripts/Go/lib/limit.sh +142 -0
  33. package/scripts/Go/project/deps.sh +35 -0
  34. package/scripts/Go/project/find-todos.sh +6 -0
  35. package/scripts/Go/project/go-interfaces.sh +18 -0
  36. package/scripts/Go/project/go-packages.sh +28 -0
  37. package/scripts/Go/project/tree.sh +5 -0
  38. package/scripts/Go/quality/lint.sh +16 -0
  39. package/scripts/Go/quality/test-summary.sh +16 -0
  40. package/scripts/Go/quality/type-check.sh +16 -0
  41. package/scripts/Node-TypeScript/api/express-routes.sh +14 -0
  42. package/scripts/Node-TypeScript/api/nest-controllers.sh +18 -0
  43. package/scripts/Node-TypeScript/architecture/arch.sh +174 -0
  44. package/scripts/Node-TypeScript/frontend/angular-routes.sh +15 -0
  45. package/scripts/Node-TypeScript/frontend/nextjs-app-router.sh +13 -0
  46. package/scripts/Node-TypeScript/frontend/react-components.sh +20 -0
  47. package/scripts/Node-TypeScript/lib/limit.sh +146 -0
  48. package/scripts/Node-TypeScript/project/deps.sh +15 -0
  49. package/scripts/Node-TypeScript/project/find-todos.sh +6 -0
  50. package/scripts/Node-TypeScript/quality/lint.sh +10 -0
  51. package/scripts/Node-TypeScript/quality/test-summary.sh +39 -0
  52. package/scripts/Node-TypeScript/quality/type-check.sh +10 -0
  53. package/scripts/Python/api/fastapi-routes.sh +12 -0
  54. package/scripts/Python/architecture/arch.sh +220 -0
  55. package/scripts/Python/db/django-models.sh +12 -0
  56. package/scripts/Python/db/sqlalchemy.sh +17 -0
  57. package/scripts/Python/lib/limit.sh +144 -0
  58. package/scripts/Python/project/deps.sh +28 -0
  59. package/scripts/Python/project/find-todos.sh +6 -0
  60. package/scripts/Python/quality/lint.sh +13 -0
  61. package/scripts/Python/quality/test-summary.sh +11 -0
  62. package/scripts/Python/quality/type-check.sh +10 -0
  63. package/scripts/Rust/architecture/arch.sh +176 -0
  64. package/scripts/Rust/lib/limit.sh +142 -0
  65. package/scripts/Rust/project/cargo-deps.sh +42 -0
  66. package/scripts/Rust/project/cargo-features.sh +26 -0
  67. package/scripts/Rust/project/find-todos.sh +6 -0
  68. package/scripts/Rust/project/tree.sh +5 -0
  69. package/scripts/Rust/quality/lint.sh +16 -0
  70. package/scripts/Rust/quality/test-summary.sh +16 -0
  71. package/scripts/Rust/quality/type-check.sh +16 -0
  72. package/scripts/Shared/api/express-routes.sh +11 -0
  73. package/scripts/Shared/api/fastapi-routes.sh +10 -0
  74. package/scripts/Shared/api/nest-controllers.sh +22 -0
  75. package/scripts/Shared/architecture/normalize.sh +178 -0
  76. package/scripts/Shared/crew/crew.sh +15 -0
  77. package/scripts/Shared/db/django-models.sh +11 -0
  78. package/scripts/Shared/db/prisma.sh +33 -0
  79. package/scripts/Shared/db/sqlalchemy.sh +12 -0
  80. package/scripts/Shared/frontend/angular-routes.sh +11 -0
  81. package/scripts/Shared/frontend/nextjs-app-router.sh +13 -0
  82. package/scripts/Shared/frontend/react-components.sh +11 -0
  83. package/scripts/Shared/git/diff-stat.sh +6 -0
  84. package/scripts/Shared/git/git-branch.sh +16 -0
  85. package/scripts/Shared/git/git-log.sh +6 -0
  86. package/scripts/Shared/git/git-status.sh +6 -0
  87. package/scripts/Shared/lib/limit.sh +144 -0
  88. package/scripts/Shared/project/compose-md.sh +182 -0
  89. package/scripts/Shared/project/deps.sh +69 -0
  90. package/scripts/Shared/project/find-todos.sh +6 -0
  91. package/scripts/Shared/project/tree.sh +5 -0
  92. package/scripts/Shared/quality/lint.sh +81 -0
  93. package/scripts/Shared/quality/test-summary.sh +103 -0
  94. package/scripts/Shared/quality/type-check.sh +114 -0
  95. package/scripts/copy-plugins.mjs +4 -0
  96. 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,5 @@
1
+ #!/usr/bin/env bash
2
+ set -uo pipefail
3
+ # Go project tree — progressive depth fallback
4
+ source "$(dirname "$0")/../lib/limit.sh"
5
+ limit_tree "$MAX_TREE"
@@ -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"