Implement the 015-add-jscpd-gate feature that adds copy-paste detection to the quality gate using jscpd with a 5% duplication threshold integrated into pnpm check

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Lukas
2026-03-06 00:13:32 +01:00
parent 56bced8481
commit 2793a66672
11 changed files with 1183 additions and 1 deletions

View File

@@ -0,0 +1,66 @@
# Implementation Plan: Copy-Paste Detection Quality Gate
**Branch**: `015-add-jscpd-gate` | **Date**: 2026-03-06 | **Spec**: [spec.md](./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)
```text
specs/015-add-jscpd-gate/
├── plan.md
├── research.md
├── data-model.md
├── quickstart.md
└── tasks.md # Created by /speckit.tasks
```
### Source Code (repository root)
```text
(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.