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:
66
specs/015-add-jscpd-gate/plan.md
Normal file
66
specs/015-add-jscpd-gate/plan.md
Normal 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.
|
||||
Reference in New Issue
Block a user