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.
- package/.claude-plugin/README.md +26 -0
- package/.claude-plugin/marketplace.json +24 -0
- package/.claude-plugin/plugin.json +24 -0
- package/LICENSE +21 -0
- package/README.ja-JP.md +834 -0
- package/README.ko-KR.md +823 -0
- package/README.md +806 -0
- package/README.pt-BR.md +452 -0
- package/README.zh-CN.md +800 -0
- package/agents/cap-architect.md +269 -0
- package/agents/cap-brainstormer.md +207 -0
- package/agents/cap-curator.md +276 -0
- package/agents/cap-debugger.md +365 -0
- package/agents/cap-designer.md +246 -0
- package/agents/cap-historian.md +464 -0
- package/agents/cap-migrator.md +291 -0
- package/agents/cap-prototyper.md +197 -0
- package/agents/cap-validator.md +308 -0
- package/bin/install.js +5433 -0
- package/cap/bin/cap-tools.cjs +853 -0
- package/cap/bin/lib/arc-scanner.cjs +344 -0
- package/cap/bin/lib/cap-affinity-engine.cjs +862 -0
- package/cap/bin/lib/cap-anchor.cjs +228 -0
- package/cap/bin/lib/cap-annotation-writer.cjs +340 -0
- package/cap/bin/lib/cap-checkpoint.cjs +434 -0
- package/cap/bin/lib/cap-cluster-detect.cjs +945 -0
- package/cap/bin/lib/cap-cluster-display.cjs +52 -0
- package/cap/bin/lib/cap-cluster-format.cjs +245 -0
- package/cap/bin/lib/cap-cluster-helpers.cjs +295 -0
- package/cap/bin/lib/cap-cluster-io.cjs +212 -0
- package/cap/bin/lib/cap-completeness.cjs +540 -0
- package/cap/bin/lib/cap-deps.cjs +583 -0
- package/cap/bin/lib/cap-design-families.cjs +332 -0
- package/cap/bin/lib/cap-design.cjs +966 -0
- package/cap/bin/lib/cap-divergence-detector.cjs +400 -0
- package/cap/bin/lib/cap-doctor.cjs +752 -0
- package/cap/bin/lib/cap-feature-map-internals.cjs +19 -0
- package/cap/bin/lib/cap-feature-map-migrate.cjs +335 -0
- package/cap/bin/lib/cap-feature-map-monorepo.cjs +885 -0
- package/cap/bin/lib/cap-feature-map-shard.cjs +315 -0
- package/cap/bin/lib/cap-feature-map.cjs +1943 -0
- package/cap/bin/lib/cap-fitness-score.cjs +1075 -0
- package/cap/bin/lib/cap-impact-analysis.cjs +652 -0
- package/cap/bin/lib/cap-learn-review.cjs +1072 -0
- package/cap/bin/lib/cap-learning-signals.cjs +627 -0
- package/cap/bin/lib/cap-loader.cjs +227 -0
- package/cap/bin/lib/cap-logger.cjs +57 -0
- package/cap/bin/lib/cap-memory-bridge.cjs +764 -0
- package/cap/bin/lib/cap-memory-confidence.cjs +452 -0
- package/cap/bin/lib/cap-memory-dir.cjs +987 -0
- package/cap/bin/lib/cap-memory-engine.cjs +698 -0
- package/cap/bin/lib/cap-memory-extends.cjs +398 -0
- package/cap/bin/lib/cap-memory-graph.cjs +790 -0
- package/cap/bin/lib/cap-memory-migrate.cjs +2015 -0
- package/cap/bin/lib/cap-memory-pin.cjs +183 -0
- package/cap/bin/lib/cap-memory-platform.cjs +490 -0
- package/cap/bin/lib/cap-memory-prune.cjs +707 -0
- package/cap/bin/lib/cap-memory-schema.cjs +812 -0
- package/cap/bin/lib/cap-migrate-tags.cjs +309 -0
- package/cap/bin/lib/cap-migrate.cjs +540 -0
- package/cap/bin/lib/cap-pattern-apply.cjs +1203 -0
- package/cap/bin/lib/cap-pattern-pipeline.cjs +1034 -0
- package/cap/bin/lib/cap-plugin-manifest.cjs +80 -0
- package/cap/bin/lib/cap-realtime-affinity.cjs +399 -0
- package/cap/bin/lib/cap-reconcile.cjs +570 -0
- package/cap/bin/lib/cap-research-gate.cjs +218 -0
- package/cap/bin/lib/cap-scope-filter.cjs +402 -0
- package/cap/bin/lib/cap-semantic-pipeline.cjs +1038 -0
- package/cap/bin/lib/cap-session-extract.cjs +987 -0
- package/cap/bin/lib/cap-session.cjs +445 -0
- package/cap/bin/lib/cap-snapshot-linkage.cjs +963 -0
- package/cap/bin/lib/cap-stack-docs.cjs +646 -0
- package/cap/bin/lib/cap-tag-observer.cjs +371 -0
- package/cap/bin/lib/cap-tag-scanner.cjs +1766 -0
- package/cap/bin/lib/cap-telemetry.cjs +466 -0
- package/cap/bin/lib/cap-test-audit.cjs +1438 -0
- package/cap/bin/lib/cap-thread-migrator.cjs +307 -0
- package/cap/bin/lib/cap-thread-synthesis.cjs +545 -0
- package/cap/bin/lib/cap-thread-tracker.cjs +519 -0
- package/cap/bin/lib/cap-trace.cjs +399 -0
- package/cap/bin/lib/cap-trust-mode.cjs +336 -0
- package/cap/bin/lib/cap-ui-design-editor.cjs +642 -0
- package/cap/bin/lib/cap-ui-mind-map.cjs +712 -0
- package/cap/bin/lib/cap-ui-thread-nav.cjs +693 -0
- package/cap/bin/lib/cap-ui.cjs +1245 -0
- package/cap/bin/lib/cap-upgrade.cjs +1028 -0
- package/cap/bin/lib/cli/arg-helpers.cjs +49 -0
- package/cap/bin/lib/cli/frontmatter-router.cjs +31 -0
- package/cap/bin/lib/cli/init-router.cjs +68 -0
- package/cap/bin/lib/cli/phase-router.cjs +102 -0
- package/cap/bin/lib/cli/state-router.cjs +61 -0
- package/cap/bin/lib/cli/template-router.cjs +37 -0
- package/cap/bin/lib/cli/uat-router.cjs +29 -0
- package/cap/bin/lib/cli/validation-router.cjs +26 -0
- package/cap/bin/lib/cli/verification-router.cjs +31 -0
- package/cap/bin/lib/cli/workstream-router.cjs +39 -0
- package/cap/bin/lib/commands.cjs +961 -0
- package/cap/bin/lib/config.cjs +467 -0
- package/cap/bin/lib/convention-reader.cjs +258 -0
- package/cap/bin/lib/core.cjs +1241 -0
- package/cap/bin/lib/feature-aggregator.cjs +423 -0
- package/cap/bin/lib/frontmatter.cjs +337 -0
- package/cap/bin/lib/init.cjs +1443 -0
- package/cap/bin/lib/manifest-generator.cjs +383 -0
- package/cap/bin/lib/milestone.cjs +253 -0
- package/cap/bin/lib/model-profiles.cjs +69 -0
- package/cap/bin/lib/monorepo-context.cjs +226 -0
- package/cap/bin/lib/monorepo-migrator.cjs +509 -0
- package/cap/bin/lib/phase.cjs +889 -0
- package/cap/bin/lib/profile-output.cjs +989 -0
- package/cap/bin/lib/profile-pipeline.cjs +540 -0
- package/cap/bin/lib/roadmap.cjs +330 -0
- package/cap/bin/lib/security.cjs +394 -0
- package/cap/bin/lib/session-manager.cjs +292 -0
- package/cap/bin/lib/skeleton-generator.cjs +179 -0
- package/cap/bin/lib/state.cjs +1032 -0
- package/cap/bin/lib/template.cjs +231 -0
- package/cap/bin/lib/test-detector.cjs +62 -0
- package/cap/bin/lib/uat.cjs +283 -0
- package/cap/bin/lib/verify.cjs +889 -0
- package/cap/bin/lib/workspace-detector.cjs +371 -0
- package/cap/bin/lib/workstream.cjs +492 -0
- package/cap/commands/gsd/workstreams.md +63 -0
- package/cap/references/arc-standard.md +315 -0
- package/cap/references/cap-agent-architecture.md +101 -0
- package/cap/references/cap-gitignore-template +9 -0
- package/cap/references/cap-zero-deps.md +158 -0
- package/cap/references/checkpoints.md +778 -0
- package/cap/references/continuation-format.md +249 -0
- package/cap/references/contract-test-templates.md +312 -0
- package/cap/references/feature-map-template.md +25 -0
- package/cap/references/git-integration.md +295 -0
- package/cap/references/git-planning-commit.md +38 -0
- package/cap/references/model-profiles.md +174 -0
- package/cap/references/phase-numbering.md +126 -0
- package/cap/references/planning-config.md +202 -0
- package/cap/references/property-test-templates.md +316 -0
- package/cap/references/security-test-templates.md +347 -0
- package/cap/references/session-template.json +8 -0
- package/cap/references/tdd.md +263 -0
- package/cap/references/user-profiling.md +681 -0
- package/cap/references/verification-patterns.md +612 -0
- package/cap/templates/UAT.md +265 -0
- package/cap/templates/claude-md.md +175 -0
- package/cap/templates/codebase/architecture.md +255 -0
- package/cap/templates/codebase/concerns.md +310 -0
- package/cap/templates/codebase/conventions.md +307 -0
- package/cap/templates/codebase/integrations.md +280 -0
- package/cap/templates/codebase/stack.md +186 -0
- package/cap/templates/codebase/structure.md +285 -0
- package/cap/templates/codebase/testing.md +480 -0
- package/cap/templates/config.json +44 -0
- package/cap/templates/context.md +352 -0
- package/cap/templates/continue-here.md +78 -0
- package/cap/templates/copilot-instructions.md +7 -0
- package/cap/templates/debug-subagent-prompt.md +91 -0
- package/cap/templates/discussion-log.md +63 -0
- package/cap/templates/milestone-archive.md +123 -0
- package/cap/templates/milestone.md +115 -0
- package/cap/templates/phase-prompt.md +610 -0
- package/cap/templates/planner-subagent-prompt.md +117 -0
- package/cap/templates/project.md +186 -0
- package/cap/templates/requirements.md +231 -0
- package/cap/templates/research-project/ARCHITECTURE.md +204 -0
- package/cap/templates/research-project/FEATURES.md +147 -0
- package/cap/templates/research-project/PITFALLS.md +200 -0
- package/cap/templates/research-project/STACK.md +120 -0
- package/cap/templates/research-project/SUMMARY.md +170 -0
- package/cap/templates/research.md +552 -0
- package/cap/templates/roadmap.md +202 -0
- package/cap/templates/state.md +176 -0
- package/cap/templates/summary.md +364 -0
- package/cap/templates/user-preferences.md +498 -0
- package/cap/templates/verification-report.md +322 -0
- package/cap/workflows/add-phase.md +112 -0
- package/cap/workflows/add-tests.md +351 -0
- package/cap/workflows/add-todo.md +158 -0
- package/cap/workflows/audit-milestone.md +340 -0
- package/cap/workflows/audit-uat.md +109 -0
- package/cap/workflows/autonomous.md +891 -0
- package/cap/workflows/check-todos.md +177 -0
- package/cap/workflows/cleanup.md +152 -0
- package/cap/workflows/complete-milestone.md +767 -0
- package/cap/workflows/diagnose-issues.md +231 -0
- package/cap/workflows/discovery-phase.md +289 -0
- package/cap/workflows/discuss-phase-assumptions.md +653 -0
- package/cap/workflows/discuss-phase.md +1049 -0
- package/cap/workflows/do.md +104 -0
- package/cap/workflows/execute-phase.md +846 -0
- package/cap/workflows/execute-plan.md +514 -0
- package/cap/workflows/fast.md +105 -0
- package/cap/workflows/forensics.md +265 -0
- package/cap/workflows/health.md +181 -0
- package/cap/workflows/help.md +660 -0
- package/cap/workflows/insert-phase.md +130 -0
- package/cap/workflows/list-phase-assumptions.md +178 -0
- package/cap/workflows/list-workspaces.md +56 -0
- package/cap/workflows/manager.md +362 -0
- package/cap/workflows/map-codebase.md +377 -0
- package/cap/workflows/milestone-summary.md +223 -0
- package/cap/workflows/new-milestone.md +486 -0
- package/cap/workflows/new-project.md +1250 -0
- package/cap/workflows/new-workspace.md +237 -0
- package/cap/workflows/next.md +97 -0
- package/cap/workflows/node-repair.md +92 -0
- package/cap/workflows/note.md +156 -0
- package/cap/workflows/pause-work.md +176 -0
- package/cap/workflows/plan-milestone-gaps.md +273 -0
- package/cap/workflows/plan-phase.md +857 -0
- package/cap/workflows/plant-seed.md +169 -0
- package/cap/workflows/pr-branch.md +129 -0
- package/cap/workflows/profile-user.md +449 -0
- package/cap/workflows/progress.md +507 -0
- package/cap/workflows/quick.md +757 -0
- package/cap/workflows/remove-phase.md +155 -0
- package/cap/workflows/remove-workspace.md +90 -0
- package/cap/workflows/research-phase.md +82 -0
- package/cap/workflows/resume-project.md +326 -0
- package/cap/workflows/review.md +228 -0
- package/cap/workflows/session-report.md +146 -0
- package/cap/workflows/settings.md +283 -0
- package/cap/workflows/ship.md +228 -0
- package/cap/workflows/stats.md +60 -0
- package/cap/workflows/transition.md +671 -0
- package/cap/workflows/ui-phase.md +298 -0
- package/cap/workflows/ui-review.md +161 -0
- package/cap/workflows/update.md +323 -0
- package/cap/workflows/validate-phase.md +170 -0
- package/cap/workflows/verify-phase.md +254 -0
- package/cap/workflows/verify-work.md +637 -0
- package/commands/cap/annotate.md +165 -0
- package/commands/cap/brainstorm.md +393 -0
- package/commands/cap/checkpoint.md +106 -0
- package/commands/cap/completeness.md +94 -0
- package/commands/cap/continue.md +72 -0
- package/commands/cap/debug.md +588 -0
- package/commands/cap/deps.md +169 -0
- package/commands/cap/design.md +479 -0
- package/commands/cap/init.md +354 -0
- package/commands/cap/iterate.md +249 -0
- package/commands/cap/learn.md +459 -0
- package/commands/cap/memory.md +275 -0
- package/commands/cap/migrate-feature-map.md +91 -0
- package/commands/cap/migrate-memory.md +108 -0
- package/commands/cap/migrate-tags.md +91 -0
- package/commands/cap/migrate.md +131 -0
- package/commands/cap/prototype.md +510 -0
- package/commands/cap/reconcile.md +121 -0
- package/commands/cap/review.md +360 -0
- package/commands/cap/save.md +72 -0
- package/commands/cap/scan.md +404 -0
- package/commands/cap/start.md +356 -0
- package/commands/cap/status.md +118 -0
- package/commands/cap/test-audit.md +262 -0
- package/commands/cap/test.md +394 -0
- package/commands/cap/trace.md +133 -0
- package/commands/cap/ui.md +167 -0
- package/hooks/dist/cap-check-update.js +115 -0
- package/hooks/dist/cap-context-monitor.js +185 -0
- package/hooks/dist/cap-learn-review-hook.js +114 -0
- package/hooks/dist/cap-learning-hook.js +192 -0
- package/hooks/dist/cap-memory.js +299 -0
- package/hooks/dist/cap-prompt-guard.js +97 -0
- package/hooks/dist/cap-statusline.js +157 -0
- package/hooks/dist/cap-tag-observer.js +115 -0
- package/hooks/dist/cap-version-check.js +112 -0
- package/hooks/dist/cap-workflow-guard.js +175 -0
- package/hooks/hooks.json +55 -0
- package/package.json +58 -0
- package/scripts/base64-scan.sh +262 -0
- package/scripts/build-hooks.js +93 -0
- package/scripts/cap-removal-checklist.md +202 -0
- package/scripts/prompt-injection-scan.sh +199 -0
- package/scripts/run-tests.cjs +181 -0
- package/scripts/secret-scan.sh +227 -0
package/hooks/hooks.json
ADDED
|
@@ -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)
|