3.3 KiB
Implementation Plan: Copy-Paste Detection Quality Gate
Branch: 015-add-jscpd-gate | Date: 2026-03-06 | Spec: spec.md
Input: Feature specification from /specs/015-add-jscpd-gate/spec.md
Summary
Add jscpd as a copy-paste detection tool to the project, configured with appropriate thresholds for TypeScript/TSX source files. Integrate it into the existing pre-commit quality gate (pnpm check) via Lefthook, and expose a standalone pnpm jscpd command for on-demand scanning. This is a tooling/configuration feature — no domain, application, or adapter code changes are required.
Technical Context
Language/Version: TypeScript 5.8 (strict mode, verbatimModuleSyntax) Primary Dependencies: jscpd (new dev dependency), Lefthook (existing), Biome 2.0 (existing), Knip (existing) Storage: N/A (no storage changes) Testing: Vitest (existing) — verification via manual/script testing of jscpd config and pre-commit hook behavior Target Platform: Node.js / developer workstation (macOS, Linux) Project Type: Monorepo workspace (pnpm) — web app with domain/application/adapter layers Performance Goals: Scan completes in under 10 seconds for the current codebase Constraints: Must not introduce false positives on structurally repeated patterns (imports, type declarations) Scale/Scope: ~3 workspace packages, small codebase
Constitution Check
GATE: Must pass before Phase 0 research. Re-check after Phase 1 design.
| Principle | Status | Notes |
|---|---|---|
| I. Deterministic Domain Core | N/A | No domain changes |
| II. Layered Architecture | N/A | No layer changes — tooling config only |
| III. Agent Boundary | N/A | No agent layer involvement |
| IV. Clarification-First | PASS | Feature scope is clear from spec |
| V. Escalation Gates | PASS | All work within spec scope |
| VI. MVP Baseline Language | PASS | Scope boundaries use MVP baseline language |
| VII. No Gameplay Rules | N/A | Not applicable |
| Dev Workflow: Merge gate | PASS | Integrates into existing pnpm check gate |
| Dev Workflow: Spec-first | PASS | Spec exists at specs/015-add-jscpd-gate/spec.md |
All gates pass. No violations to justify.
Project Structure
Documentation (this feature)
specs/015-add-jscpd-gate/
├── plan.md
├── research.md
├── data-model.md
├── quickstart.md
└── tasks.md # Created by /speckit.tasks
Source Code (repository root)
(root)
├── package.json # Add jscpd devDependency + "jscpd" script, update "check" script
├── lefthook.yml # Already runs `pnpm check` — no changes needed
└── .jscpd.json # New: jscpd configuration file (thresholds, patterns, ignore)
Structure Decision: This feature is purely tooling configuration at the workspace root. No changes to packages/ or apps/ directories. The jscpd config file (.jscpd.json) lives at the repo root alongside existing config files (biome.json, knip.json). The pnpm check script in package.json already serves as the Lefthook pre-commit command, so adding jscpd to the check script chain automatically integrates it into the pre-commit gate.
Complexity Tracking
No constitution violations. Table not applicable.