github/spec-kit
💫 Toolkit to help you get started with SDD or any other process!
Python★ 147,443+808 that day#4 on trending
C56.3/100
Duplication50
8.5% in python, bash, powershellDead code96
0.4%Complexity38
71% The score is jscpd's own --health model: markup, data and text left out, tests kept. The numbers below are the trending scan's.
3.62%duplicated code · 3,297 of 91,161 lines
232clones in code
331code files of 1,083 scanned
12.23%duplicated over all files · 2,541 clones
Most complex files
- src/specify_cli/extensions/__init__.py1208 cx
- tests/test_workflows.py710 cx
- tests/specify_cli/integrations/test_installed_adapters.py657 cx
- src/specify_cli/events/__init__.py394 cx
- src/specify_cli/integrations/installer.py348 cx
- src/specify_cli/workflows/_commands.py321 cx
- tests/workflows/test_composition_execution.py317 cx
- src/specify_cli/workflows/_execution.py311 cx
- tests/integrations/test_integration_generic.py310 cx
- tests/specify_cli/workflows/test_command_add.py265 cx
Dead code 0.41% unused · 94 findings
- src/specify_cli/workflows/overlay/merge.pyunused-file
- src/specify_cli/workflows/overlay/layer_sources.pyunused-file
- src/specify_cli/workflows/overlay/composer.pyunused-file
- src/specify_cli/workflows/overlay/resolver.pyunused-file
- src/specify_cli/authentication/github_http.py:build_github_requestunused-export
- src/specify_cli/workflows/_commands.py:_check_json_byte_budgetunused-symbol
- src/specify_cli/workflows/_commands.py:_validate_local_workflow_packageunused-symbol
- src/specify_cli/command_version.py:_json_resultunused-symbol
- src/specify_cli/workflows/_commands.py:_workflow_versions_matchunused-symbol
- src/specify_cli/bundles/resolver.py:load_manifest_from_dirunused-export
The code number leaves out tests, fixtures, docs, examples, data files, styles, translations and vendored code.
Largest clones in the code
- 10 lines in 10 placespython67 tokenssrc/specify_cli/integrations/agy/__init__.py:59–68src/specify_cli/integrations/base.py:271–280src/specify_cli/integrations/codex/__init__.py:47–56src/specify_cli/integrations/docker_agent/__init__.py:81–90src/specify_cli/integrations/droid/__init__.py:168–177and 5 more
59def build_exec_args( 60 self, 61 prompt: str, 62 *, 63 model: str | None = None, 64 output_json: bool = True, 65 integration_args: Sequence[str] | None = None, 66 integration_options: Mapping[str, Any] | None = None, 67 project_root: Path | None = None, 68) -> list[str] | None: - 7 lines in 13 placespython50 tokenssrc/specify_cli/integrations/base.py:275–281src/specify_cli/integrations/cursor_agent/__init__.py:68–74src/specify_cli/integrations/devin/__init__.py:63–69src/specify_cli/integrations/docker_agent/__init__.py:85–91src/specify_cli/integrations/droid/__init__.py:172–178and 8 more
275 model: str | None = None, 276 output_json: bool = True, 277 integration_args: Sequence[str] | None = None, 278 integration_options: Mapping[str, Any] | None = None, 279 project_root: Path | None = None, 280) -> list[str] | None: 281 """Build CLI arguments for non-interactive execution.68 model: str | None = None, 69 output_json: bool = True, 70 integration_args: Sequence[str] | None = None, 71 integration_options: Mapping[str, Any] | None = None, 72 project_root: Path | None = None, 73) -> list[str] | None: 74 """Build CLI arguments for non-interactive ``cursor-agent`` execution. - 46 lines in 2 placespowershell342 tokens
447# Priority 2: Installed presets (sorted by priority from .registry) 448$presetsDir = Join-Path $RepoRoot '.specify/presets' 449if (Test-Path $presetsDir) { 450 $registryFile = Join-Path $presetsDir '.registry' 451 $sortedPresets = @() 452 $registryParsed = $false 453 if (Test-Path $registryFile) { 454 try { 455 $registryData = [System.IO.File]::ReadAllText($registryFile, [System.Text.Encoding]::UTF8) | ConvertFrom-Json 456 if ($null -eq $registryData -or $registryData -isnot [PSCustomObject]) {First 10 of 46 lines.
7 more
- 48 lines in 2 placespython277 tokens
- 54 lines in 2 placespython240 tokens
- 13 lines in 4 placespython69 tokens
- 20 lines in 2 placesbash200 tokens
- 44 lines in 2 placespython192 tokens
- 32 lines in 2 placespython182 tokens
- 40 lines in 2 placespython181 tokens
Largest clones over all files, tests and data included
- 700 lines in 2 placesyamldata files4,451 tokens.github/workflows/add-community-extension.lock.yml:592–1291.github/workflows/add-community-preset.lock.yml:602–1301
592 "create_pull_request": " CONSTRAINTS: Maximum 1 pull request(s) can be created. Title will be prefixed with \"[extension] \". Labels [\"extension-submiss… 593 "remove_labels": " CONSTRAINTS: Only these labels can be removed: [validation-passed validation-failed]." 594 }, 595 "repo_params": {}, 596 "dynamic_tools": [] 597 } 598GH_AW_VALIDATION_JSON: | 599 { 600 "add_comment": { 601 "defaultMax": 1,First 10 of 700 lines.
- 698 lines in 2 placesyamldata files4,447 tokens.github/workflows/add-community-bundle.lock.yml:594–1291.github/workflows/add-community-extension.lock.yml:594–1291
594 }, 595 "repo_params": {}, 596 "dynamic_tools": [] 597 } 598GH_AW_VALIDATION_JSON: | 599 { 600 "add_comment": { 601 "defaultMax": 1, 602 "fields": { 603 "body": {First 10 of 698 lines.
- 35 lines in 8 placesyamldata files574 tokens.github/workflows/add-community-bundle.lock.yml:428–462.github/workflows/add-community-extension.lock.yml:428–462.github/workflows/add-community-preset.lock.yml:429–463.github/workflows/add-community-workflow-step.lock.yml:422–456.github/workflows/bug-assess.lock.yml:421–455and 3 more
428outputs: 429 agentic_engine_timeout: ${{ steps.detect-agent-errors.outputs.agentic_engine_timeout || 'false' }} 430 ai_credits_rate_limit_error: ${{ steps.parse-mcp-gateway.outputs.ai_credits_rate_limit_error || 'false' }} 431 aic: ${{ steps.parse-mcp-gateway.outputs.aic }} 432 ambient_context: ${{ steps.parse-mcp-gateway.outputs.ambient_context }} 433 checkout_pr_success: ${{ steps.checkout-pr.outputs.checkout_pr_success || 'true' }} 434 effective_tokens: ${{ steps.parse-mcp-gateway.outputs.effective_tokens }} 435 has_patch: ${{ steps.collect_output.outputs.has_patch }} 436 http_400_response_error: ${{ steps.detect-agent-errors.outputs.http_400_response_error || 'false' }} 437 inference_access_error: ${{ steps.detect-agent-errors.outputs.inference_access_error || 'false' }}First 10 of 35 lines.
- 137 lines in 4 placesyamldata files1,265 tokens
- 99 lines in 5 placesyamldata files918 tokens
By format, code only
| Format | Files | Lines | Clones | Duplicated lines | Duplication |
|---|---|---|---|---|---|
| python | 306 | 84,136 | 199 | 2,872 | 3.41% |
| powershell | 12 | 3,280 | 19 | 228 | 6.95% |
| bash | 13 | 3,745 | 14 | 197 | 5.26% |
By format, all files
| Format | Files | Lines | Clones | Duplicated lines | Duplication |
|---|---|---|---|---|---|
| python | 640 | 267,456 | 1,747 | 22,958 | 8.58% |
| yaml | 84 | 22,936 | 581 | 16,509 | 71.98% |
| markdown | 228 | 37,527 | 172 | 2,544 | 6.78% |
| powershell | 12 | 3,280 | 19 | 228 | 6.95% |
| bash | 52 | 4,426 | 17 | 205 | 4.63% |
| text | 30 | 599 | 3 | 42 | 7.01% |
| json | 30 | 10,032 | 2 | 40 | 0.4% |
| txt | 1 | 876 | 0 | 0 | 0% |
| css | 1 | 278 | 0 | 0 | 0% |
| toml | 1 | 97 | 0 | 0 | 0% |
Trending appearances
| Day | Rank | Stars | Files | Lines | Clones | All files | Code | Health | Commit |
|---|---|---|---|---|---|---|---|---|---|
| Nov 5, 2026 | #4 | 147,443 (+808) | 1,083 | 347,583 | 2,541 | 12.23% | 3.62% | C 56.3 | ec9a6f3 |
Want this for your own project? Install jscpd and run jscpd ., or measure it the way the baselines were measured.