cap-pro 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 (275) hide show
  1. package/.claude-plugin/README.md +26 -0
  2. package/.claude-plugin/marketplace.json +24 -0
  3. package/.claude-plugin/plugin.json +24 -0
  4. package/LICENSE +21 -0
  5. package/README.ja-JP.md +834 -0
  6. package/README.ko-KR.md +823 -0
  7. package/README.md +806 -0
  8. package/README.pt-BR.md +452 -0
  9. package/README.zh-CN.md +800 -0
  10. package/agents/cap-architect.md +269 -0
  11. package/agents/cap-brainstormer.md +207 -0
  12. package/agents/cap-curator.md +276 -0
  13. package/agents/cap-debugger.md +365 -0
  14. package/agents/cap-designer.md +246 -0
  15. package/agents/cap-historian.md +464 -0
  16. package/agents/cap-migrator.md +291 -0
  17. package/agents/cap-prototyper.md +197 -0
  18. package/agents/cap-validator.md +308 -0
  19. package/bin/install.js +5433 -0
  20. package/cap/bin/cap-tools.cjs +853 -0
  21. package/cap/bin/lib/arc-scanner.cjs +344 -0
  22. package/cap/bin/lib/cap-affinity-engine.cjs +862 -0
  23. package/cap/bin/lib/cap-anchor.cjs +228 -0
  24. package/cap/bin/lib/cap-annotation-writer.cjs +340 -0
  25. package/cap/bin/lib/cap-checkpoint.cjs +434 -0
  26. package/cap/bin/lib/cap-cluster-detect.cjs +945 -0
  27. package/cap/bin/lib/cap-cluster-display.cjs +52 -0
  28. package/cap/bin/lib/cap-cluster-format.cjs +245 -0
  29. package/cap/bin/lib/cap-cluster-helpers.cjs +295 -0
  30. package/cap/bin/lib/cap-cluster-io.cjs +212 -0
  31. package/cap/bin/lib/cap-completeness.cjs +540 -0
  32. package/cap/bin/lib/cap-deps.cjs +583 -0
  33. package/cap/bin/lib/cap-design-families.cjs +332 -0
  34. package/cap/bin/lib/cap-design.cjs +966 -0
  35. package/cap/bin/lib/cap-divergence-detector.cjs +400 -0
  36. package/cap/bin/lib/cap-doctor.cjs +752 -0
  37. package/cap/bin/lib/cap-feature-map-internals.cjs +19 -0
  38. package/cap/bin/lib/cap-feature-map-migrate.cjs +335 -0
  39. package/cap/bin/lib/cap-feature-map-monorepo.cjs +885 -0
  40. package/cap/bin/lib/cap-feature-map-shard.cjs +315 -0
  41. package/cap/bin/lib/cap-feature-map.cjs +1943 -0
  42. package/cap/bin/lib/cap-fitness-score.cjs +1075 -0
  43. package/cap/bin/lib/cap-impact-analysis.cjs +652 -0
  44. package/cap/bin/lib/cap-learn-review.cjs +1072 -0
  45. package/cap/bin/lib/cap-learning-signals.cjs +627 -0
  46. package/cap/bin/lib/cap-loader.cjs +227 -0
  47. package/cap/bin/lib/cap-logger.cjs +57 -0
  48. package/cap/bin/lib/cap-memory-bridge.cjs +764 -0
  49. package/cap/bin/lib/cap-memory-confidence.cjs +452 -0
  50. package/cap/bin/lib/cap-memory-dir.cjs +987 -0
  51. package/cap/bin/lib/cap-memory-engine.cjs +698 -0
  52. package/cap/bin/lib/cap-memory-extends.cjs +398 -0
  53. package/cap/bin/lib/cap-memory-graph.cjs +790 -0
  54. package/cap/bin/lib/cap-memory-migrate.cjs +2015 -0
  55. package/cap/bin/lib/cap-memory-pin.cjs +183 -0
  56. package/cap/bin/lib/cap-memory-platform.cjs +490 -0
  57. package/cap/bin/lib/cap-memory-prune.cjs +707 -0
  58. package/cap/bin/lib/cap-memory-schema.cjs +812 -0
  59. package/cap/bin/lib/cap-migrate-tags.cjs +309 -0
  60. package/cap/bin/lib/cap-migrate.cjs +540 -0
  61. package/cap/bin/lib/cap-pattern-apply.cjs +1203 -0
  62. package/cap/bin/lib/cap-pattern-pipeline.cjs +1034 -0
  63. package/cap/bin/lib/cap-plugin-manifest.cjs +80 -0
  64. package/cap/bin/lib/cap-realtime-affinity.cjs +399 -0
  65. package/cap/bin/lib/cap-reconcile.cjs +570 -0
  66. package/cap/bin/lib/cap-research-gate.cjs +218 -0
  67. package/cap/bin/lib/cap-scope-filter.cjs +402 -0
  68. package/cap/bin/lib/cap-semantic-pipeline.cjs +1038 -0
  69. package/cap/bin/lib/cap-session-extract.cjs +987 -0
  70. package/cap/bin/lib/cap-session.cjs +445 -0
  71. package/cap/bin/lib/cap-snapshot-linkage.cjs +963 -0
  72. package/cap/bin/lib/cap-stack-docs.cjs +646 -0
  73. package/cap/bin/lib/cap-tag-observer.cjs +371 -0
  74. package/cap/bin/lib/cap-tag-scanner.cjs +1766 -0
  75. package/cap/bin/lib/cap-telemetry.cjs +466 -0
  76. package/cap/bin/lib/cap-test-audit.cjs +1438 -0
  77. package/cap/bin/lib/cap-thread-migrator.cjs +307 -0
  78. package/cap/bin/lib/cap-thread-synthesis.cjs +545 -0
  79. package/cap/bin/lib/cap-thread-tracker.cjs +519 -0
  80. package/cap/bin/lib/cap-trace.cjs +399 -0
  81. package/cap/bin/lib/cap-trust-mode.cjs +336 -0
  82. package/cap/bin/lib/cap-ui-design-editor.cjs +642 -0
  83. package/cap/bin/lib/cap-ui-mind-map.cjs +712 -0
  84. package/cap/bin/lib/cap-ui-thread-nav.cjs +693 -0
  85. package/cap/bin/lib/cap-ui.cjs +1245 -0
  86. package/cap/bin/lib/cap-upgrade.cjs +1028 -0
  87. package/cap/bin/lib/cli/arg-helpers.cjs +49 -0
  88. package/cap/bin/lib/cli/frontmatter-router.cjs +31 -0
  89. package/cap/bin/lib/cli/init-router.cjs +68 -0
  90. package/cap/bin/lib/cli/phase-router.cjs +102 -0
  91. package/cap/bin/lib/cli/state-router.cjs +61 -0
  92. package/cap/bin/lib/cli/template-router.cjs +37 -0
  93. package/cap/bin/lib/cli/uat-router.cjs +29 -0
  94. package/cap/bin/lib/cli/validation-router.cjs +26 -0
  95. package/cap/bin/lib/cli/verification-router.cjs +31 -0
  96. package/cap/bin/lib/cli/workstream-router.cjs +39 -0
  97. package/cap/bin/lib/commands.cjs +961 -0
  98. package/cap/bin/lib/config.cjs +467 -0
  99. package/cap/bin/lib/convention-reader.cjs +258 -0
  100. package/cap/bin/lib/core.cjs +1241 -0
  101. package/cap/bin/lib/feature-aggregator.cjs +423 -0
  102. package/cap/bin/lib/frontmatter.cjs +337 -0
  103. package/cap/bin/lib/init.cjs +1443 -0
  104. package/cap/bin/lib/manifest-generator.cjs +383 -0
  105. package/cap/bin/lib/milestone.cjs +253 -0
  106. package/cap/bin/lib/model-profiles.cjs +69 -0
  107. package/cap/bin/lib/monorepo-context.cjs +226 -0
  108. package/cap/bin/lib/monorepo-migrator.cjs +509 -0
  109. package/cap/bin/lib/phase.cjs +889 -0
  110. package/cap/bin/lib/profile-output.cjs +989 -0
  111. package/cap/bin/lib/profile-pipeline.cjs +540 -0
  112. package/cap/bin/lib/roadmap.cjs +330 -0
  113. package/cap/bin/lib/security.cjs +394 -0
  114. package/cap/bin/lib/session-manager.cjs +292 -0
  115. package/cap/bin/lib/skeleton-generator.cjs +179 -0
  116. package/cap/bin/lib/state.cjs +1032 -0
  117. package/cap/bin/lib/template.cjs +231 -0
  118. package/cap/bin/lib/test-detector.cjs +62 -0
  119. package/cap/bin/lib/uat.cjs +283 -0
  120. package/cap/bin/lib/verify.cjs +889 -0
  121. package/cap/bin/lib/workspace-detector.cjs +371 -0
  122. package/cap/bin/lib/workstream.cjs +492 -0
  123. package/cap/commands/gsd/workstreams.md +63 -0
  124. package/cap/references/arc-standard.md +315 -0
  125. package/cap/references/cap-agent-architecture.md +101 -0
  126. package/cap/references/cap-gitignore-template +9 -0
  127. package/cap/references/cap-zero-deps.md +158 -0
  128. package/cap/references/checkpoints.md +778 -0
  129. package/cap/references/continuation-format.md +249 -0
  130. package/cap/references/contract-test-templates.md +312 -0
  131. package/cap/references/feature-map-template.md +25 -0
  132. package/cap/references/git-integration.md +295 -0
  133. package/cap/references/git-planning-commit.md +38 -0
  134. package/cap/references/model-profiles.md +174 -0
  135. package/cap/references/phase-numbering.md +126 -0
  136. package/cap/references/planning-config.md +202 -0
  137. package/cap/references/property-test-templates.md +316 -0
  138. package/cap/references/security-test-templates.md +347 -0
  139. package/cap/references/session-template.json +8 -0
  140. package/cap/references/tdd.md +263 -0
  141. package/cap/references/user-profiling.md +681 -0
  142. package/cap/references/verification-patterns.md +612 -0
  143. package/cap/templates/UAT.md +265 -0
  144. package/cap/templates/claude-md.md +175 -0
  145. package/cap/templates/codebase/architecture.md +255 -0
  146. package/cap/templates/codebase/concerns.md +310 -0
  147. package/cap/templates/codebase/conventions.md +307 -0
  148. package/cap/templates/codebase/integrations.md +280 -0
  149. package/cap/templates/codebase/stack.md +186 -0
  150. package/cap/templates/codebase/structure.md +285 -0
  151. package/cap/templates/codebase/testing.md +480 -0
  152. package/cap/templates/config.json +44 -0
  153. package/cap/templates/context.md +352 -0
  154. package/cap/templates/continue-here.md +78 -0
  155. package/cap/templates/copilot-instructions.md +7 -0
  156. package/cap/templates/debug-subagent-prompt.md +91 -0
  157. package/cap/templates/discussion-log.md +63 -0
  158. package/cap/templates/milestone-archive.md +123 -0
  159. package/cap/templates/milestone.md +115 -0
  160. package/cap/templates/phase-prompt.md +610 -0
  161. package/cap/templates/planner-subagent-prompt.md +117 -0
  162. package/cap/templates/project.md +186 -0
  163. package/cap/templates/requirements.md +231 -0
  164. package/cap/templates/research-project/ARCHITECTURE.md +204 -0
  165. package/cap/templates/research-project/FEATURES.md +147 -0
  166. package/cap/templates/research-project/PITFALLS.md +200 -0
  167. package/cap/templates/research-project/STACK.md +120 -0
  168. package/cap/templates/research-project/SUMMARY.md +170 -0
  169. package/cap/templates/research.md +552 -0
  170. package/cap/templates/roadmap.md +202 -0
  171. package/cap/templates/state.md +176 -0
  172. package/cap/templates/summary.md +364 -0
  173. package/cap/templates/user-preferences.md +498 -0
  174. package/cap/templates/verification-report.md +322 -0
  175. package/cap/workflows/add-phase.md +112 -0
  176. package/cap/workflows/add-tests.md +351 -0
  177. package/cap/workflows/add-todo.md +158 -0
  178. package/cap/workflows/audit-milestone.md +340 -0
  179. package/cap/workflows/audit-uat.md +109 -0
  180. package/cap/workflows/autonomous.md +891 -0
  181. package/cap/workflows/check-todos.md +177 -0
  182. package/cap/workflows/cleanup.md +152 -0
  183. package/cap/workflows/complete-milestone.md +767 -0
  184. package/cap/workflows/diagnose-issues.md +231 -0
  185. package/cap/workflows/discovery-phase.md +289 -0
  186. package/cap/workflows/discuss-phase-assumptions.md +653 -0
  187. package/cap/workflows/discuss-phase.md +1049 -0
  188. package/cap/workflows/do.md +104 -0
  189. package/cap/workflows/execute-phase.md +846 -0
  190. package/cap/workflows/execute-plan.md +514 -0
  191. package/cap/workflows/fast.md +105 -0
  192. package/cap/workflows/forensics.md +265 -0
  193. package/cap/workflows/health.md +181 -0
  194. package/cap/workflows/help.md +660 -0
  195. package/cap/workflows/insert-phase.md +130 -0
  196. package/cap/workflows/list-phase-assumptions.md +178 -0
  197. package/cap/workflows/list-workspaces.md +56 -0
  198. package/cap/workflows/manager.md +362 -0
  199. package/cap/workflows/map-codebase.md +377 -0
  200. package/cap/workflows/milestone-summary.md +223 -0
  201. package/cap/workflows/new-milestone.md +486 -0
  202. package/cap/workflows/new-project.md +1250 -0
  203. package/cap/workflows/new-workspace.md +237 -0
  204. package/cap/workflows/next.md +97 -0
  205. package/cap/workflows/node-repair.md +92 -0
  206. package/cap/workflows/note.md +156 -0
  207. package/cap/workflows/pause-work.md +176 -0
  208. package/cap/workflows/plan-milestone-gaps.md +273 -0
  209. package/cap/workflows/plan-phase.md +857 -0
  210. package/cap/workflows/plant-seed.md +169 -0
  211. package/cap/workflows/pr-branch.md +129 -0
  212. package/cap/workflows/profile-user.md +449 -0
  213. package/cap/workflows/progress.md +507 -0
  214. package/cap/workflows/quick.md +757 -0
  215. package/cap/workflows/remove-phase.md +155 -0
  216. package/cap/workflows/remove-workspace.md +90 -0
  217. package/cap/workflows/research-phase.md +82 -0
  218. package/cap/workflows/resume-project.md +326 -0
  219. package/cap/workflows/review.md +228 -0
  220. package/cap/workflows/session-report.md +146 -0
  221. package/cap/workflows/settings.md +283 -0
  222. package/cap/workflows/ship.md +228 -0
  223. package/cap/workflows/stats.md +60 -0
  224. package/cap/workflows/transition.md +671 -0
  225. package/cap/workflows/ui-phase.md +298 -0
  226. package/cap/workflows/ui-review.md +161 -0
  227. package/cap/workflows/update.md +323 -0
  228. package/cap/workflows/validate-phase.md +170 -0
  229. package/cap/workflows/verify-phase.md +254 -0
  230. package/cap/workflows/verify-work.md +637 -0
  231. package/commands/cap/annotate.md +165 -0
  232. package/commands/cap/brainstorm.md +393 -0
  233. package/commands/cap/checkpoint.md +106 -0
  234. package/commands/cap/completeness.md +94 -0
  235. package/commands/cap/continue.md +72 -0
  236. package/commands/cap/debug.md +588 -0
  237. package/commands/cap/deps.md +169 -0
  238. package/commands/cap/design.md +479 -0
  239. package/commands/cap/init.md +354 -0
  240. package/commands/cap/iterate.md +249 -0
  241. package/commands/cap/learn.md +459 -0
  242. package/commands/cap/memory.md +275 -0
  243. package/commands/cap/migrate-feature-map.md +91 -0
  244. package/commands/cap/migrate-memory.md +108 -0
  245. package/commands/cap/migrate-tags.md +91 -0
  246. package/commands/cap/migrate.md +131 -0
  247. package/commands/cap/prototype.md +510 -0
  248. package/commands/cap/reconcile.md +121 -0
  249. package/commands/cap/review.md +360 -0
  250. package/commands/cap/save.md +72 -0
  251. package/commands/cap/scan.md +404 -0
  252. package/commands/cap/start.md +356 -0
  253. package/commands/cap/status.md +118 -0
  254. package/commands/cap/test-audit.md +262 -0
  255. package/commands/cap/test.md +394 -0
  256. package/commands/cap/trace.md +133 -0
  257. package/commands/cap/ui.md +167 -0
  258. package/hooks/dist/cap-check-update.js +115 -0
  259. package/hooks/dist/cap-context-monitor.js +185 -0
  260. package/hooks/dist/cap-learn-review-hook.js +114 -0
  261. package/hooks/dist/cap-learning-hook.js +192 -0
  262. package/hooks/dist/cap-memory.js +299 -0
  263. package/hooks/dist/cap-prompt-guard.js +97 -0
  264. package/hooks/dist/cap-statusline.js +157 -0
  265. package/hooks/dist/cap-tag-observer.js +115 -0
  266. package/hooks/dist/cap-version-check.js +112 -0
  267. package/hooks/dist/cap-workflow-guard.js +175 -0
  268. package/hooks/hooks.json +55 -0
  269. package/package.json +58 -0
  270. package/scripts/base64-scan.sh +262 -0
  271. package/scripts/build-hooks.js +93 -0
  272. package/scripts/cap-removal-checklist.md +202 -0
  273. package/scripts/prompt-injection-scan.sh +199 -0
  274. package/scripts/run-tests.cjs +181 -0
  275. package/scripts/secret-scan.sh +227 -0
@@ -0,0 +1,55 @@
1
+ {
2
+ "hooks": {
3
+ "SessionStart": [
4
+ {
5
+ "hooks": [
6
+ {
7
+ "type": "command",
8
+ "command": "${CLAUDE_PLUGIN_ROOT}/hooks/dist/cap-version-check.js",
9
+ "timeout": 2
10
+ }
11
+ ]
12
+ }
13
+ ],
14
+ "Stop": [
15
+ {
16
+ "hooks": [
17
+ {
18
+ "type": "command",
19
+ "command": "${CLAUDE_PLUGIN_ROOT}/hooks/dist/cap-memory.js",
20
+ "timeout": 10
21
+ },
22
+ {
23
+ "type": "command",
24
+ "command": "${CLAUDE_PLUGIN_ROOT}/hooks/dist/cap-learn-review-hook.js",
25
+ "timeout": 5
26
+ }
27
+ ]
28
+ }
29
+ ],
30
+ "PostToolUse": [
31
+ {
32
+ "matcher": "Edit|Write|MultiEdit|NotebookEdit",
33
+ "hooks": [
34
+ {
35
+ "type": "command",
36
+ "command": "${CLAUDE_PLUGIN_ROOT}/hooks/dist/cap-tag-observer.js"
37
+ },
38
+ {
39
+ "type": "command",
40
+ "command": "${CLAUDE_PLUGIN_ROOT}/hooks/dist/cap-learning-hook.js"
41
+ }
42
+ ]
43
+ },
44
+ {
45
+ "matcher": "Read",
46
+ "hooks": [
47
+ {
48
+ "type": "command",
49
+ "command": "${CLAUDE_PLUGIN_ROOT}/hooks/dist/cap-learning-hook.js"
50
+ }
51
+ ]
52
+ }
53
+ ]
54
+ }
55
+ }
package/package.json ADDED
@@ -0,0 +1,58 @@
1
+ {
2
+ "name": "cap-pro",
3
+ "version": "1.0.0",
4
+ "description": "CAP Pro — Code-First engineering framework for Claude Code, OpenCode, Gemini, Codex, Copilot, Antigravity, Cursor & Windsurf. Build first, plan from code.",
5
+ "bin": {
6
+ "cap": "bin/install.js"
7
+ },
8
+ "files": [
9
+ "bin",
10
+ "commands",
11
+ "cap",
12
+ "agents",
13
+ "hooks/dist",
14
+ "hooks/hooks.json",
15
+ ".claude-plugin",
16
+ "scripts"
17
+ ],
18
+ "keywords": [
19
+ "cap",
20
+ "cap-pro",
21
+ "claude",
22
+ "claude-code",
23
+ "ai",
24
+ "code-first",
25
+ "code-as-plan",
26
+ "engineering-framework",
27
+ "prototype-driven",
28
+ "annotation-driven",
29
+ "farley"
30
+ ],
31
+ "author": "TÂCHES",
32
+ "license": "MIT",
33
+ "repository": {
34
+ "type": "git",
35
+ "url": "git+https://github.com/dwall-sys/code-as-plan.git"
36
+ },
37
+ "homepage": "https://github.com/dwall-sys/code-as-plan",
38
+ "bugs": {
39
+ "url": "https://github.com/dwall-sys/code-as-plan/issues"
40
+ },
41
+ "engines": {
42
+ "node": ">=20.0.0"
43
+ },
44
+ "devDependencies": {
45
+ "esbuild": "^0.24.0",
46
+ "vitepress": "^1.5.0",
47
+ "vitest": "^4.1.2"
48
+ },
49
+ "scripts": {
50
+ "build:hooks": "node scripts/build-hooks.js",
51
+ "prepublishOnly": "npm run build:hooks",
52
+ "test": "node scripts/run-tests.cjs",
53
+ "test:coverage": "node scripts/run-tests.cjs --coverage",
54
+ "docs:dev": "vitepress dev docs-site",
55
+ "docs:build": "vitepress build docs-site",
56
+ "docs:preview": "vitepress preview docs-site"
57
+ }
58
+ }
@@ -0,0 +1,262 @@
1
+ #!/usr/bin/env bash
2
+ # base64-scan.sh — Detect base64-obfuscated prompt injection in source files
3
+ #
4
+ # Extracts base64 blobs >= 40 chars, decodes them, and checks decoded content
5
+ # against the same injection patterns used by prompt-injection-scan.sh.
6
+ #
7
+ # Usage:
8
+ # scripts/base64-scan.sh --diff origin/main # CI mode: scan changed files
9
+ # scripts/base64-scan.sh --file path/to/file # Scan a single file
10
+ # scripts/base64-scan.sh --dir agents/ # Scan all files in a directory
11
+ #
12
+ # Exit codes:
13
+ # 0 = clean
14
+ # 1 = findings detected
15
+ # 2 = usage error
16
+ set -euo pipefail
17
+
18
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
19
+ MIN_BLOB_LENGTH=40
20
+
21
+ # ─── Injection Patterns (decoded content) ────────────────────────────────────
22
+ # Subset of patterns — if someone base64-encoded something, check for the
23
+ # most common injection indicators.
24
+ DECODED_PATTERNS=(
25
+ 'ignore[[:space:]]+(all[[:space:]]+)?previous[[:space:]]+instructions'
26
+ 'you[[:space:]]+are[[:space:]]+now[[:space:]]+'
27
+ 'system[[:space:]]+prompt'
28
+ '</?system>'
29
+ '</?assistant>'
30
+ '\[SYSTEM\]'
31
+ '\[INST\]'
32
+ '<<SYS>>'
33
+ 'override[[:space:]]+(system|safety|security)'
34
+ 'pretend[[:space:]]+(you|to)[[:space:]]'
35
+ 'act[[:space:]]+as[[:space:]]+(a|an|if)'
36
+ 'jailbreak'
37
+ 'bypass[[:space:]]+(safety|content|security)'
38
+ 'eval[[:space:]]*\('
39
+ 'exec[[:space:]]*\('
40
+ 'rm[[:space:]]+-rf'
41
+ 'curl[[:space:]].*\|[[:space:]]*sh'
42
+ 'wget[[:space:]].*\|[[:space:]]*sh'
43
+ )
44
+
45
+ # ─── Ignorelist ──────────────────────────────────────────────────────────────
46
+
47
+ IGNOREFILE=".base64scanignore"
48
+ IGNORED_PATTERNS=()
49
+
50
+ load_ignorelist() {
51
+ if [[ -f "$IGNOREFILE" ]]; then
52
+ while IFS= read -r line; do
53
+ # Skip comments and empty lines
54
+ [[ "$line" =~ ^[[:space:]]*# ]] && continue
55
+ [[ -z "${line// }" ]] && continue
56
+ IGNORED_PATTERNS+=("$line")
57
+ done < "$IGNOREFILE"
58
+ fi
59
+ }
60
+
61
+ is_ignored() {
62
+ local blob="$1"
63
+ if [[ ${#IGNORED_PATTERNS[@]} -eq 0 ]]; then
64
+ return 1
65
+ fi
66
+ for pattern in "${IGNORED_PATTERNS[@]}"; do
67
+ if [[ "$blob" == "$pattern" ]]; then
68
+ return 0
69
+ fi
70
+ done
71
+ return 1
72
+ }
73
+
74
+ # ─── Skip Rules ──────────────────────────────────────────────────────────────
75
+
76
+ should_skip_file() {
77
+ local file="$1"
78
+ # Skip binary files
79
+ case "$file" in
80
+ *.png|*.jpg|*.jpeg|*.gif|*.ico|*.woff|*.woff2|*.ttf|*.eot|*.otf) return 0 ;;
81
+ *.zip|*.tar|*.gz|*.bz2|*.xz|*.7z) return 0 ;;
82
+ *.pdf|*.doc|*.docx|*.xls|*.xlsx) return 0 ;;
83
+ esac
84
+ # Skip lockfiles and node_modules
85
+ case "$file" in
86
+ */node_modules/*) return 0 ;;
87
+ */package-lock.json) return 0 ;;
88
+ */yarn.lock) return 0 ;;
89
+ */pnpm-lock.yaml) return 0 ;;
90
+ esac
91
+ # Skip the scan scripts themselves and test files
92
+ case "$file" in
93
+ */base64-scan.sh) return 0 ;;
94
+ */security-scan.test.cjs) return 0 ;;
95
+ esac
96
+ return 1
97
+ }
98
+
99
+ is_data_uri() {
100
+ local context="$1"
101
+ # data:image/png;base64,... or data:application/font-woff;base64,...
102
+ echo "$context" | grep -qE 'data:[a-zA-Z]+/[a-zA-Z0-9.+-]+;base64,' 2>/dev/null
103
+ }
104
+
105
+ # ─── File Collection ─────────────────────────────────────────────────────────
106
+
107
+ collect_files() {
108
+ local mode="$1"
109
+ shift
110
+
111
+ case "$mode" in
112
+ --diff)
113
+ local base="${1:-origin/main}"
114
+ git diff --name-only --diff-filter=ACMR "$base"...HEAD 2>/dev/null \
115
+ | grep -vE '\.(png|jpg|jpeg|gif|ico|woff|woff2|ttf|eot|otf|zip|tar|gz|pdf)$' || true
116
+ ;;
117
+ --file)
118
+ if [[ -f "$1" ]]; then
119
+ echo "$1"
120
+ else
121
+ echo "Error: file not found: $1" >&2
122
+ exit 2
123
+ fi
124
+ ;;
125
+ --dir)
126
+ local dir="$1"
127
+ if [[ ! -d "$dir" ]]; then
128
+ echo "Error: directory not found: $dir" >&2
129
+ exit 2
130
+ fi
131
+ find "$dir" -type f ! -path '*/node_modules/*' ! -path '*/.git/*' ! -path '*/dist/*' \
132
+ ! -name '*.png' ! -name '*.jpg' ! -name '*.gif' ! -name '*.woff*' 2>/dev/null || true
133
+ ;;
134
+ --stdin)
135
+ cat
136
+ ;;
137
+ *)
138
+ echo "Usage: $0 --diff [base] | --file <path> | --dir <path> | --stdin" >&2
139
+ exit 2
140
+ ;;
141
+ esac
142
+ }
143
+
144
+ # ─── Scanner ─────────────────────────────────────────────────────────────────
145
+
146
+ extract_and_check_blobs() {
147
+ local file="$1"
148
+ local found=0
149
+ local line_num=0
150
+
151
+ while IFS= read -r line; do
152
+ line_num=$((line_num + 1))
153
+
154
+ # Skip data URIs — legitimate base64 usage
155
+ if is_data_uri "$line"; then
156
+ continue
157
+ fi
158
+
159
+ # Extract base64-like blobs (alphanumeric + / + = padding, >= MIN_BLOB_LENGTH)
160
+ local blobs
161
+ blobs=$(echo "$line" | grep -oE '[A-Za-z0-9+/]{'"$MIN_BLOB_LENGTH"',}={0,3}' 2>/dev/null || true)
162
+
163
+ if [[ -z "$blobs" ]]; then
164
+ continue
165
+ fi
166
+
167
+ while IFS= read -r blob; do
168
+ [[ -z "$blob" ]] && continue
169
+
170
+ # Check ignorelist
171
+ if [[ ${#IGNORED_PATTERNS[@]} -gt 0 ]] && is_ignored "$blob"; then
172
+ continue
173
+ fi
174
+
175
+ # Try to decode — if it fails, not valid base64
176
+ local decoded
177
+ decoded=$(echo "$blob" | base64 -d 2>/dev/null || echo "")
178
+
179
+ if [[ -z "$decoded" ]]; then
180
+ continue
181
+ fi
182
+
183
+ # Check if decoded content is mostly printable text (not random binary)
184
+ local printable_ratio
185
+ local total_chars=${#decoded}
186
+ if [[ $total_chars -eq 0 ]]; then
187
+ continue
188
+ fi
189
+
190
+ # Count printable ASCII characters
191
+ local printable_count
192
+ printable_count=$(echo -n "$decoded" | tr -cd '[:print:]' | wc -c | tr -d ' ')
193
+ # Skip if less than 70% printable (likely binary data, not obfuscated text)
194
+ if [[ $((printable_count * 100 / total_chars)) -lt 70 ]]; then
195
+ continue
196
+ fi
197
+
198
+ # Scan decoded content against injection patterns
199
+ for pattern in "${DECODED_PATTERNS[@]}"; do
200
+ if echo "$decoded" | grep -iqE "$pattern" 2>/dev/null; then
201
+ if [[ $found -eq 0 ]]; then
202
+ echo "FAIL: $file"
203
+ found=1
204
+ fi
205
+ echo " line $line_num: base64 blob decodes to suspicious content"
206
+ echo " blob: ${blob:0:60}..."
207
+ echo " decoded: ${decoded:0:120}"
208
+ echo " matched: $pattern"
209
+ break
210
+ fi
211
+ done
212
+ done <<< "$blobs"
213
+ done < "$file"
214
+
215
+ return $found
216
+ }
217
+
218
+ # ─── Main ────────────────────────────────────────────────────────────────────
219
+
220
+ main() {
221
+ if [[ $# -eq 0 ]]; then
222
+ echo "Usage: $0 --diff [base] | --file <path> | --dir <path>" >&2
223
+ exit 2
224
+ fi
225
+
226
+ load_ignorelist
227
+
228
+ local mode="$1"
229
+ shift
230
+
231
+ local files
232
+ files=$(collect_files "$mode" "$@")
233
+
234
+ if [[ -z "$files" ]]; then
235
+ echo "base64-scan: no files to scan"
236
+ exit 0
237
+ fi
238
+
239
+ local total=0
240
+ local failed=0
241
+
242
+ while IFS= read -r file; do
243
+ [[ -z "$file" ]] && continue
244
+ if should_skip_file "$file"; then
245
+ continue
246
+ fi
247
+ total=$((total + 1))
248
+ if ! extract_and_check_blobs "$file"; then
249
+ failed=$((failed + 1))
250
+ fi
251
+ done <<< "$files"
252
+
253
+ echo ""
254
+ echo "base64-scan: scanned $total files, $failed with findings"
255
+
256
+ if [[ $failed -gt 0 ]]; then
257
+ exit 1
258
+ fi
259
+ exit 0
260
+ }
261
+
262
+ main "$@"
@@ -0,0 +1,93 @@
1
+ #!/usr/bin/env node
2
+ // @cap-feature(feature:F-009) Hooks System — build script (syntax validation + dist copy)
3
+ // @cap-history(sessions:3, edits:4, since:2026-04-01, learned:2026-04-03) Frequently modified — 3 sessions, 4 edits
4
+ /**
5
+ * Copy CAP hooks to dist for installation.
6
+ * Validates JavaScript syntax before copying to prevent shipping broken hooks.
7
+ * See #1107, #1109, #1125, #1161 — a duplicate const declaration shipped
8
+ * in dist and caused PostToolUse hook errors for all users.
9
+ */
10
+
11
+ const fs = require('fs');
12
+ const path = require('path');
13
+ const vm = require('vm');
14
+
15
+ const HOOKS_DIR = path.join(__dirname, '..', 'hooks');
16
+ const DIST_DIR = path.join(HOOKS_DIR, 'dist');
17
+
18
+ // Hooks to copy (pure Node.js, no bundling needed)
19
+ // @cap-decision(F-084/iter1) Stage-2 #1 fix: SessionStart hook registered in plugin manifest + dist build + manifest-test.
20
+ // `cap-version-check.js` MUST be in this list so the dist build copies it; otherwise
21
+ // hooks/hooks.json points at a missing file for npx-installed users (lesson-13: any
22
+ // feature shipping a hook MUST register it in BOTH hooks.json AND HOOKS_TO_COPY).
23
+ const HOOKS_TO_COPY = [
24
+ 'cap-check-update.js',
25
+ 'cap-context-monitor.js',
26
+ 'cap-learn-review-hook.js',
27
+ 'cap-learning-hook.js',
28
+ 'cap-memory.js',
29
+ 'cap-prompt-guard.js',
30
+ 'cap-statusline.js',
31
+ 'cap-tag-observer.js',
32
+ 'cap-version-check.js',
33
+ 'cap-workflow-guard.js'
34
+ ];
35
+
36
+ /**
37
+ * Validate JavaScript syntax without executing the file.
38
+ * Catches SyntaxError (duplicate const, missing brackets, etc.)
39
+ * before the hook gets shipped to users.
40
+ */
41
+ function validateSyntax(filePath) {
42
+ const content = fs.readFileSync(filePath, 'utf8');
43
+ try {
44
+ // Use vm.compileFunction to check syntax without executing
45
+ new vm.Script(content, { filename: path.basename(filePath) });
46
+ return null; // No error
47
+ } catch (e) {
48
+ if (e instanceof SyntaxError) {
49
+ return e.message;
50
+ }
51
+ throw e;
52
+ }
53
+ }
54
+
55
+ function build() {
56
+ // Ensure dist directory exists
57
+ if (!fs.existsSync(DIST_DIR)) {
58
+ fs.mkdirSync(DIST_DIR, { recursive: true });
59
+ }
60
+
61
+ let hasErrors = false;
62
+
63
+ // Copy hooks to dist with syntax validation
64
+ for (const hook of HOOKS_TO_COPY) {
65
+ const src = path.join(HOOKS_DIR, hook);
66
+ const dest = path.join(DIST_DIR, hook);
67
+
68
+ if (!fs.existsSync(src)) {
69
+ console.warn(`Warning: ${hook} not found, skipping`);
70
+ continue;
71
+ }
72
+
73
+ // Validate syntax before copying
74
+ const syntaxError = validateSyntax(src);
75
+ if (syntaxError) {
76
+ console.error(`\x1b[31m✗ ${hook}: SyntaxError — ${syntaxError}\x1b[0m`);
77
+ hasErrors = true;
78
+ continue;
79
+ }
80
+
81
+ console.log(`\x1b[32m✓\x1b[0m Copying ${hook}...`);
82
+ fs.copyFileSync(src, dest);
83
+ }
84
+
85
+ if (hasErrors) {
86
+ console.error('\n\x1b[31mBuild failed: fix syntax errors above before publishing.\x1b[0m');
87
+ process.exit(1);
88
+ }
89
+
90
+ console.log('\nBuild complete.');
91
+ }
92
+
93
+ build();
@@ -0,0 +1,202 @@
1
+ # CAP v2.0 -- GSD Removal Checklist
2
+
3
+ <!-- @cap-context This document defines the COMPLETE removal plan for transitioning from GSD to CAP. It is NOT executed during prototyping -- it documents what gets removed when the clean break is made. -->
4
+ <!-- @cap-decision Removal is documented as a checklist, not executed during prototype. This allows the current GSD infrastructure to keep working during development while clearly defining the target end state. -->
5
+
6
+ <!-- @cap-todo(ref:AC-71) All /gsd:* commands shall be removed from the codebase -->
7
+ <!-- @cap-todo(ref:AC-72) All gsd-* agent files shall be removed from the agents/ directory -->
8
+ <!-- @cap-todo(ref:AC-73) Explicitly killed agents: gsd-discuss, gsd-planner, gsd-milestone-*, gsd-executor, gsd-annotator, and all discuss/plan phase agents -->
9
+ <!-- @cap-todo(ref:AC-74) Artifacts no longer created or referenced: ROADMAP.md, REQUIREMENTS.md, STATE.md, MILESTONES.md, VERIFICATION.md, PLAN.md -->
10
+ <!-- @cap-todo(ref:AC-75) CODE-INVENTORY.md evolved into enriched FEATURE-MAP.md -- standalone file removed -->
11
+ <!-- @cap-todo(ref:AC-76) bin/install.js updated to reference CAP branding and commands -->
12
+ <!-- @cap-todo(ref:AC-77) package.json name updated to cap (or code-as-plan fallback) -->
13
+
14
+ ---
15
+
16
+ ## 1. Agent Files to Remove (AC-72, AC-73)
17
+
18
+ The following agent files in `agents/` shall be deleted:
19
+
20
+ ### Explicitly Killed Agents (AC-73)
21
+
22
+ These agents represent the discuss/plan workflow that CAP eliminates:
23
+
24
+ - [ ] `agents/gsd-planner.md` -- replaced by Feature Map + cap-prototyper
25
+ - [ ] `agents/gsd-executor.md` -- replaced by cap-prototyper (prototype/iterate modes)
26
+ - [ ] `agents/gsd-annotator.md` -- replaced by cap-prototyper (annotate mode)
27
+ - [ ] `agents/gsd-brainstormer.md` -- replaced by cap-brainstormer
28
+ - [ ] `agents/gsd-roadmapper.md` -- ROADMAP.md no longer exists
29
+ - [ ] `agents/gsd-plan-checker.md` -- no plan phase to check
30
+ - [ ] `agents/gsd-reviewer.md` -- replaced by cap-reviewer
31
+ - [ ] `agents/gsd-tester.md` -- replaced by cap-tester
32
+ - [ ] `agents/gsd-debugger.md` -- replaced by cap-debugger
33
+
34
+ ### Supporting Agents to Remove
35
+
36
+ - [ ] `agents/gsd-advisor-researcher.md`
37
+ - [ ] `agents/gsd-arc-executor.md`
38
+ - [ ] `agents/gsd-arc-planner.md`
39
+ - [ ] `agents/gsd-assumptions-analyzer.md`
40
+ - [ ] `agents/gsd-code-planner.md`
41
+ - [ ] `agents/gsd-codebase-mapper.md`
42
+ - [ ] `agents/gsd-integration-checker.md`
43
+ - [ ] `agents/gsd-nyquist-auditor.md`
44
+ - [ ] `agents/gsd-phase-researcher.md`
45
+ - [ ] `agents/gsd-project-researcher.md`
46
+ - [ ] `agents/gsd-prototyper.md`
47
+ - [ ] `agents/gsd-research-synthesizer.md`
48
+ - [ ] `agents/gsd-ui-auditor.md`
49
+ - [ ] `agents/gsd-ui-checker.md`
50
+ - [ ] `agents/gsd-ui-researcher.md`
51
+ - [ ] `agents/gsd-user-profiler.md`
52
+ - [ ] `agents/gsd-verifier.md`
53
+
54
+ **Agents to KEEP (CAP v2.0 agent set per AC-67):**
55
+ - `agents/cap-brainstormer.md`
56
+ - `agents/cap-prototyper.md`
57
+ - `agents/cap-tester.md`
58
+ - `agents/cap-reviewer.md`
59
+ - `agents/cap-debugger.md`
60
+
61
+ ---
62
+
63
+ ## 2. Command Files to Remove (AC-71)
64
+
65
+ All files in `commands/gsd/` shall be deleted. Current GSD commands:
66
+
67
+ - [ ] `commands/gsd/add-backlog.md`
68
+ - [ ] `commands/gsd/add-phase.md`
69
+ - [ ] `commands/gsd/add-tests.md`
70
+ - [ ] `commands/gsd/add-todo.md`
71
+ - [ ] `commands/gsd/annotate.md`
72
+ - [ ] `commands/gsd/audit-milestone.md`
73
+ - [ ] `commands/gsd/audit-uat.md`
74
+ - [ ] `commands/gsd/autonomous.md`
75
+ - [ ] `commands/gsd/brainstorm.md`
76
+ - [ ] `commands/gsd/check-todos.md`
77
+ - [ ] `commands/gsd/cleanup.md`
78
+ - [ ] `commands/gsd/complete-milestone.md`
79
+ - [ ] `commands/gsd/debug.md`
80
+ - [ ] `commands/gsd/deep-plan.md`
81
+ - [ ] `commands/gsd/discuss-phase.md`
82
+ - [ ] `commands/gsd/do.md`
83
+ - [ ] `commands/gsd/execute-phase.md`
84
+ - [ ] `commands/gsd/extract-plan.md`
85
+ - [ ] `commands/gsd/fast.md`
86
+ - [ ] `commands/gsd/forensics.md`
87
+ - [ ] All remaining `commands/gsd/*.md` files
88
+
89
+ **Commands to KEEP (CAP v2.0 command set):**
90
+ - `commands/cap/init.md`
91
+ - `commands/cap/brainstorm.md`
92
+ - `commands/cap/prototype.md`
93
+ - `commands/cap/iterate.md`
94
+ - `commands/cap/annotate.md`
95
+ - `commands/cap/scan.md`
96
+ - `commands/cap/test.md`
97
+ - `commands/cap/review.md`
98
+ - `commands/cap/debug.md`
99
+ - `commands/cap/status.md`
100
+ - `commands/cap/start.md`
101
+ - `commands/cap/refresh-docs.md`
102
+
103
+ ---
104
+
105
+ ## 3. Artifact References to Remove (AC-74)
106
+
107
+ These planning artifacts shall no longer be created or referenced anywhere in the codebase:
108
+
109
+ - [ ] `ROADMAP.md` -- eliminated; features are in FEATURE-MAP.md
110
+ - [ ] `REQUIREMENTS.md` -- eliminated; ACs are in FEATURE-MAP.md
111
+ - [ ] `STATE.md` -- eliminated; state is in SESSION.json
112
+ - [ ] `MILESTONES.md` -- eliminated; no milestone concept in CAP
113
+ - [ ] `VERIFICATION.md` -- eliminated; review output goes to .cap/REVIEW.md
114
+ - [ ] `PLAN.md` -- eliminated; code is the plan
115
+ - [ ] `CODE-INVENTORY.md` -- evolved into FEATURE-MAP.md (AC-75)
116
+
117
+ ### Files to grep and update:
118
+ - [ ] `CLAUDE.md` -- remove all references to gsd:* commands and GSD workflow
119
+ - [ ] `cap/references/arc-standard.md` -- update @gsd-* references to @cap-* or archive
120
+ - [ ] Any README or documentation referencing GSD commands
121
+
122
+ ---
123
+
124
+ ## 4. Package Configuration Changes (AC-76, AC-77)
125
+
126
+ ### package.json updates (AC-77)
127
+
128
+ ```json
129
+ {
130
+ "name": "cap",
131
+ "description": "CAP (Code As Plan) -- AI-native development where code IS the plan",
132
+ "bin": {
133
+ "cap": "bin/install.js"
134
+ },
135
+ "keywords": [
136
+ "cap",
137
+ "code-as-plan",
138
+ "claude",
139
+ "claude-code",
140
+ "ai",
141
+ "development-workflow"
142
+ ]
143
+ }
144
+ ```
145
+
146
+ Fallback name if `cap` is taken on npm: `code-as-plan`
147
+
148
+ ### bin/install.js updates (AC-76)
149
+
150
+ - [ ] Update branding strings from "GSD" / "Get Shit Done" to "CAP" / "Code As Plan"
151
+ - [ ] Update command references from `/gsd:*` to `/cap:*`
152
+ - [ ] Update binary name from `cap-cc` to `cap`
153
+ - [ ] Update repository URLs if repo is renamed
154
+
155
+ ### npm files array update (AC-99)
156
+
157
+ ```json
158
+ {
159
+ "files": [
160
+ "bin",
161
+ "commands/cap",
162
+ "cap",
163
+ "agents",
164
+ "hooks/dist",
165
+ "scripts"
166
+ ]
167
+ }
168
+ ```
169
+
170
+ Note: `commands/cap` instead of `commands` to exclude `commands/gsd/` from distribution.
171
+
172
+ ---
173
+
174
+ ## 5. Distribution Changes (AC-97, AC-98, AC-99)
175
+
176
+ - [ ] Package installable via `npx cap@latest` (AC-97)
177
+ - [ ] Build uses esbuild following `scripts/build-hooks.js` pattern (AC-98)
178
+ - [ ] npm `files` array includes: bin, commands/cap, agents, hooks/dist, scripts (AC-99)
179
+
180
+ ---
181
+
182
+ ## 6. Post-Removal Verification
183
+
184
+ After executing the removal:
185
+
186
+ 1. [ ] `ls agents/` shows only 5 cap-* files
187
+ 2. [ ] `ls commands/` shows only `commands/cap/` directory
188
+ 3. [ ] `grep -r "gsd:" commands/ agents/` returns no results
189
+ 4. [ ] `grep -r "ROADMAP\|REQUIREMENTS\|STATE\.md\|MILESTONES\|VERIFICATION\|PLAN\.md" commands/ agents/` returns no results
190
+ 5. [ ] `npm test` passes
191
+ 6. [ ] `npx cap@latest` installs and runs
192
+ 7. [ ] `/cap:init` creates correct structure
193
+ 8. [ ] `/cap:scan` detects tags correctly
194
+
195
+ ---
196
+
197
+ ## Execution Notes
198
+
199
+ - This removal should be executed as a SINGLE atomic operation (one commit)
200
+ - All tests must be updated to reference CAP instead of GSD before removal
201
+ - The `.planning/` directory contents are NOT part of the distributed package and can remain as historical reference
202
+ - The `cap/` directory name is a legacy artifact that may be renamed in a future pass (low priority)