127 lines
5.3 KiB
Markdown
127 lines
5.3 KiB
Markdown
# Tasks: Copy-Paste Detection Quality Gate
|
|
|
|
**Input**: Design documents from `/specs/015-add-jscpd-gate/`
|
|
**Prerequisites**: plan.md (required), spec.md (required for user stories), research.md, data-model.md, quickstart.md
|
|
|
|
**Tests**: Not explicitly requested in the spec. Test tasks are omitted.
|
|
|
|
**Organization**: Tasks are grouped by user story to enable independent implementation and testing of each story.
|
|
|
|
## Format: `[ID] [P?] [Story] Description`
|
|
|
|
- **[P]**: Can run in parallel (different files, no dependencies)
|
|
- **[Story]**: Which user story this task belongs to (e.g., US1, US2, US3)
|
|
- Include exact file paths in descriptions
|
|
|
|
---
|
|
|
|
## Phase 1: Setup
|
|
|
|
**Purpose**: Install jscpd and create its configuration file
|
|
|
|
- [x] T001 Install jscpd as a dev dependency by adding it to `package.json` devDependencies and running `pnpm install`
|
|
- [x] T002 Create jscpd configuration file at `.jscpd.json` with threshold (5%), minLines (5), minTokens (50), pattern for TypeScript/TSX files, ignore list for `node_modules`, `dist`, `build`, `coverage`, `.specify`, `specs`, and add a standalone `"jscpd": "jscpd"` script to `package.json`
|
|
|
|
**Checkpoint**: jscpd is installed and `pnpm jscpd` runs successfully, scanning TypeScript/TSX files and producing a report
|
|
|
|
---
|
|
|
|
## Phase 2: User Story 1 - Automated Copy-Paste Detection on Commit (Priority: P1) 🎯 MVP
|
|
|
|
**Goal**: Pre-commit hook blocks commits when code duplication exceeds the configured threshold
|
|
|
|
**Independent Test**: Introduce a duplicated code block across two files, attempt to commit, and verify the commit is blocked with a clear duplication report. Remove the duplication and verify the commit succeeds.
|
|
|
|
### Implementation for User Story 1
|
|
|
|
- [x] T003 [US1] Add `jscpd` to the `"check"` script chain in `package.json` so it runs as part of the merge gate (e.g., `"check": "knip && biome check . && tsc --build && vitest run && jscpd"`)
|
|
|
|
**Checkpoint**: Running `pnpm check` now includes jscpd. Since Lefthook runs `pnpm check` as the pre-commit hook, commits are automatically gated by copy-paste detection. A commit with duplicated code above threshold is blocked.
|
|
|
|
---
|
|
|
|
## Phase 3: User Story 2 - On-Demand Duplication Scanning (Priority: P2)
|
|
|
|
**Goal**: Developers can run duplication scanning independently via a standalone command
|
|
|
|
**Independent Test**: Run `pnpm jscpd` on the codebase and verify it produces a duplication report with file paths and line numbers for any detected duplicates, or exits cleanly if none found.
|
|
|
|
### Implementation for User Story 2
|
|
|
|
No additional tasks — `pnpm jscpd` was already configured in T002. This story is satisfied by the setup phase.
|
|
|
|
**Checkpoint**: `pnpm jscpd` runs independently and produces a readable duplication report
|
|
|
|
---
|
|
|
|
## Phase 4: User Story 3 - Integration with Existing Quality Gate (Priority: P3)
|
|
|
|
**Goal**: Copy-paste detection runs as part of the unified `pnpm check` command alongside all other checks
|
|
|
|
**Independent Test**: Run `pnpm check` and verify jscpd output appears in the results alongside knip, biome, tsc, and vitest output.
|
|
|
|
### Implementation for User Story 3
|
|
|
|
No additional tasks — integration into `pnpm check` was completed in T003. This story is satisfied by the US1 implementation.
|
|
|
|
**Checkpoint**: `pnpm check` includes jscpd and the full gate passes on a clean codebase
|
|
|
|
---
|
|
|
|
## Phase 5: Polish & Cross-Cutting Concerns
|
|
|
|
**Purpose**: Validate the full workflow end-to-end
|
|
|
|
- [x] T004 Verify `pnpm check` passes on the current codebase (no existing duplication above threshold), confirm scan completes within 10 seconds (SC-002), verify no false positives on import statements or type declarations (SC-003), and adjust threshold or ignore patterns in `.jscpd.json` if needed
|
|
- [x] T005 Verify Knip does not flag jscpd as an unused dependency by running `pnpm knip`
|
|
|
|
---
|
|
|
|
## Dependencies & Execution Order
|
|
|
|
### Phase Dependencies
|
|
|
|
- **Setup (Phase 1)**: No dependencies — T001 then T002
|
|
- **US1 (Phase 2)**: Depends on T002
|
|
- **US2 (Phase 3)**: Satisfied by T002 (no additional work)
|
|
- **US3 (Phase 4)**: Satisfied by T003 (no additional work)
|
|
- **Polish (Phase 5)**: Depends on T003
|
|
|
|
### Execution Order
|
|
|
|
```
|
|
T001 → T002 → T003 → T004, T005 (parallel)
|
|
```
|
|
|
|
### Parallel Opportunities
|
|
|
|
- T004 and T005 can run in parallel (independent validations)
|
|
- This is a small, linear feature — limited parallelism needed
|
|
|
|
---
|
|
|
|
## Implementation Strategy
|
|
|
|
### MVP First (User Story 1 Only)
|
|
|
|
1. Complete Phase 1: Install jscpd + configure (T001, T002)
|
|
2. Complete Phase 2: Add to check script (T003)
|
|
3. **STOP and VALIDATE**: Attempt a commit with duplicated code — verify it's blocked
|
|
4. All three user stories are satisfied at this point
|
|
|
|
### Incremental Delivery
|
|
|
|
This feature is small enough that all stories are delivered in a single pass:
|
|
1. T001-T002: Setup → `pnpm jscpd` works (US2 done)
|
|
2. T003: Add to check → pre-commit gate works (US1 done), quality gate works (US3 done)
|
|
3. T004-T005: Polish → verify everything integrates cleanly
|
|
|
|
---
|
|
|
|
## Notes
|
|
|
|
- This is a tooling/configuration feature — no domain, application, or adapter code changes
|
|
- All changes are at the workspace root (`package.json`, `.jscpd.json`)
|
|
- Lefthook config (`lefthook.yml`) does NOT need changes — it already runs `pnpm check`
|
|
- US2 and US3 are naturally satisfied by the setup and US1 implementation with no additional tasks
|