💫 Toolkit to help you get started with Spec-Driven Development
This report presents the forensic synthetic code analysis of github/spec-kit, a Python project with 120,771 GitHub stars. SynthScan v2.0 examined 138,925 lines of code across 436 source files, recording 3399 pattern matches distributed across 20 syntactic categories. The overall adjusted score of 26.5 places this repository in the Moderate AI signal band.
The scanner applied 160+ deterministic lexical heuristics, multi-line block detectors, abstract syntax tree depth profilers, and a cross-file Jaccard similarity matrix to construct a statistically normalised synthetic code estimate. All matches are individually weighted by severity coefficient and contextual multiplier before summation, and the resulting headline score is temporally discounted to account for the repository's development history relative to the commercial emergence of large language model coding tooling (November 2022 onward).
This chart maps the temporal evolution of the adjusted synthetic code score across successive scan runs. An upward trajectory indicates ongoing incorporation of AI-generated code or expanding LLM-assisted scaffolding; a stable or declining trajectory may reflect active human refactoring, code removal, or the adoption of stricter authorship policies. The dashed secondary line (right axis) independently tracks total raw pattern hit count, which can diverge from the normalised score when codebase size changes significantly between scans.
Classifies detected patterns by their diagnostic confidence and structural impact. CRITICAL patterns (coefficient 10) represent definitive synthetic signatures — hallucinated imports, explicit LLM attribution metadata — virtually never produced by human authors. HIGH (5) indicates strong structural tells such as cross-file repetition or cross-linguistic idioms. MEDIUM (2) covers recognisable conversational padding and AI-specific vocabulary. LOW (1) captures subtle indicators like tautological comments and generic boilerplate that require density to carry independent signal.
This horizontal bar chart decomposes the repository's raw synthetic code score by top-level directory, allowing you to pinpoint precisely which modules or components carry the highest AI authorship density. Directories with disproportionately high scores relative to their size warrant targeted manual review: concentrated AI signatures often trace back to mass-generated configuration layers, auto-ported test suites, LLM-scaffolded boilerplate classes, or entire subsystems authored under heavy copilot assistance. Use this view to prioritise your human code-review effort.
The scanner identified 3399 distinct pattern matches across 20 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a statistically significant AI authorship indicator. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the diagnostic confidence level (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — comment-context matches receive a ×1.5 weight because LLMs systematically over-annotate. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier as dense clusters constitute far stronger evidence of synthetic authorship than isolated hits.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test_shared_infra_integrity.py | 23 | def test_matching_digest_passes(): | CODE |
| LOW | tests/test_shared_infra_integrity.py | 30 | def test_mismatch_raises_error_cls(): | CODE |
| LOW | tests/test_shared_infra_integrity.py | 43 | def test_comparison_is_case_insensitive(): | CODE |
| LOW | tests/test_shared_infra_integrity.py | 50 | def test_malformed_digest_is_rejected(): | CODE |
| LOW | tests/test_shared_infra_integrity.py | 75 | def test_absent_digest_skips_and_logs_debug(caplog): | CODE |
| LOW | tests/test_shared_infra_integrity.py | 90 | def test_blank_declared_digest_is_rejected(): | CODE |
| LOW | tests/test_check_prerequisites_python_parity.py | 149 | def test_python_json_output_matches_bash(prereq_repo: Path, args: tuple[str, ...]) -> None: | CODE |
| LOW | tests/test_check_prerequisites_python_parity.py | 169 | def test_python_text_output_matches_bash(prereq_repo: Path) -> None: | CODE |
| LOW | tests/test_check_prerequisites_python_parity.py | 185 | def test_python_help_output_matches_bash(prereq_repo: Path) -> None: | CODE |
| LOW | tests/test_check_prerequisites_python_parity.py | 195 | def test_python_unknown_option_matches_bash_error_shape(prereq_repo: Path) -> None: | CODE |
| LOW | tests/test_check_prerequisites_python_parity.py | 223 | def test_python_json_output_matches_powershell( | CODE |
| LOW | tests/test_check_prerequisites_python_parity.py | 244 | def test_python_repo_copy_script_file_fallback_finds_repo_root(tmp_path: Path) -> None: | CODE |
| LOW | tests/test_check_prerequisites_python_parity.py | 265 | def test_python_paths_only_does_not_persist_feature_json(prereq_repo: Path) -> None: | CODE |
| LOW | tests/test_check_prerequisites_python_parity.py | 281 | def test_python_normal_mode_persists_feature_json(prereq_repo: Path) -> None: | CODE |
| LOW | tests/test_check_prerequisites_python_parity.py | 308 | def test_python_negative_errors_are_stderr_only( | CODE |
| LOW | tests/test_check_prerequisites_python_parity.py | 332 | def test_python_branch_falls_back_to_feature_dir_basename(prereq_repo: Path) -> None: | CODE |
| LOW⚡ | tests/test_workflows.py | 118 | def test_get_step_type_missing(self): | CODE |
| LOW⚡ | tests/test_workflows.py | 123 | def test_register_step_duplicate_raises(self): | CODE |
| LOW⚡ | tests/test_workflows.py | 130 | def test_register_step_empty_key_raises(self): | CODE |
| LOW⚡ | tests/test_workflows.py | 212 | def test_step_output_reference(self): | CODE |
| LOW⚡ | tests/test_workflows.py | 221 | def test_string_interpolation(self): | CODE |
| LOW⚡ | tests/test_workflows.py | 229 | def test_multi_expression_no_surrounding_text(self): | CODE |
| LOW⚡ | tests/test_workflows.py | 512 | def test_filter_from_json_parses_object(self): | CODE |
| LOW⚡ | tests/test_workflows.py | 522 | def test_filter_from_json_invalid_json_raises(self): | CODE |
| LOW⚡ | tests/test_workflows.py | 531 | def test_filter_from_json_non_string_raises(self): | CODE |
| LOW⚡ | tests/test_workflows.py | 540 | def test_filter_from_json_rejects_malformed_forms(self): | CODE |
| LOW⚡ | tests/test_workflows.py | 1554 | def test_validate_rejects_non_positive_timeout(self): | CODE |
| LOW⚡ | tests/test_workflows.py | 1562 | def test_validate_rejects_non_numeric_timeout(self): | CODE |
| LOW⚡ | tests/test_workflows.py | 1572 | def test_validate_rejects_non_finite_timeout(self): | CODE |
| LOW⚡ | tests/test_workflows.py | 2528 | def test_validate_empty_wait_for(self): | CODE |
| LOW⚡ | tests/test_workflows.py | 2535 | def test_validate_wait_for_not_list(self): | CODE |
| LOW⚡ | tests/test_workflows.py | 2543 | def test_validate_rejects_non_mapping_output(self, bad_output): | CODE |
| LOW⚡ | tests/test_workflows.py | 2609 | def test_sequential_default_preserves_order(self, tmp_path): | CODE |
| LOW⚡ | tests/test_workflows.py | 2613 | def test_concurrent_runs_all_items_in_item_order(self, tmp_path): | CODE |
| LOW⚡ | tests/test_workflows.py | 2617 | def test_sequential_and_concurrent_agree(self, tmp_path): | CODE |
| LOW⚡ | tests/test_workflows.py | 2623 | def test_shuffled_completion_preserves_item_order(self, tmp_path): | CODE |
| LOW⚡ | tests/test_workflows.py | 2665 | def test_invalid_max_concurrency_coerces_to_sequential(self, tmp_path, bad): | CODE |
| LOW⚡ | tests/test_workflows.py | 2669 | def test_string_max_concurrency_is_honored(self, tmp_path): | CODE |
| LOW⚡ | tests/test_workflows.py | 2673 | def test_context_item_isolation_across_threads(self, tmp_path): | CODE |
| LOW⚡ | tests/test_workflows.py | 2682 | def test_concurrent_halt_status_not_clobbered_by_later_item(self, tmp_path): | CODE |
| LOW⚡ | tests/test_workflows.py | 5571 | def test_remove_catalog_invalid_index(self, project_dir): | CODE |
| LOW⚡ | tests/test_workflows.py | 5580 | def test_remove_catalog_no_config(self, project_dir): | CODE |
| LOW⚡ | tests/test_workflows.py | 5587 | def test_add_catalog_wraps_write_oserror(self, project_dir, monkeypatch): | CODE |
| LOW | tests/test_workflows.py | 102 | def test_all_step_types_registered(self): | CODE |
| LOW | tests/test_workflows.py | 148 | def test_step_context_defaults(self): | CODE |
| LOW | tests/test_workflows.py | 158 | def test_step_context_with_data(self): | CODE |
| LOW | tests/test_workflows.py | 170 | def test_step_result_defaults(self): | CODE |
| LOW | tests/test_workflows.py | 241 | def test_multi_expression_adjacent_no_separator(self): | CODE |
| LOW | tests/test_workflows.py | 250 | def test_single_expression_with_literal_braces_preserves_type(self): | CODE |
| LOW | tests/test_workflows.py | 263 | def test_multi_expression_with_literal_close_brace_in_argument(self): | CODE |
| LOW | tests/test_workflows.py | 285 | def test_multi_expression_with_literal_open_brace_in_argument(self): | CODE |
| LOW | tests/test_workflows.py | 297 | def test_multi_expression_unbalanced_quote_still_raises(self): | CODE |
| LOW | tests/test_workflows.py | 325 | def test_comparison_not_equals(self): | CODE |
| LOW | tests/test_workflows.py | 345 | def test_ordering_comparison_of_non_numeric_strings(self): | CODE |
| LOW | tests/test_workflows.py | 388 | def test_list_literal_preserves_quoted_commas(self): | CODE |
| LOW | tests/test_workflows.py | 406 | def test_operator_splitting_is_quote_aware(self): | CODE |
| LOW | tests/test_workflows.py | 442 | def test_pipe_detection_is_quote_aware(self): | CODE |
| LOW | tests/test_workflows.py | 463 | def test_membership_against_non_iterable_is_false_not_error(self): | CODE |
| LOW | tests/test_workflows.py | 565 | def test_filter_unknown_name_raises(self): | CODE |
| LOW | tests/test_workflows.py | 577 | def test_filter_unknown_name_with_args_raises(self): | CODE |
| 2589 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | tests/test_workflows.py | 26 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_workflows.py | 28 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/conftest.py | 71 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/conftest.py | 73 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_self_upgrade_execution.py | 17 | # =========================================================================== | COMMENT |
| MEDIUM | tests/test_self_upgrade_execution.py | 19 | # =========================================================================== | COMMENT |
| MEDIUM⚡ | tests/test_self_upgrade_detection.py | 599 | # =========================================================================== | COMMENT |
| MEDIUM⚡ | tests/test_self_upgrade_detection.py | 601 | # =========================================================================== | COMMENT |
| MEDIUM⚡ | tests/test_setup_tasks.py | 181 | # =========================================================================== | COMMENT |
| MEDIUM⚡ | tests/test_setup_tasks.py | 183 | # =========================================================================== | COMMENT |
| MEDIUM⚡ | tests/test_setup_tasks.py | 667 | # =========================================================================== | COMMENT |
| MEDIUM⚡ | tests/test_setup_tasks.py | 669 | # =========================================================================== | COMMENT |
| MEDIUM | tests/test_setup_tasks.py | 26 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_setup_tasks.py | 28 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_setup_tasks.py | 150 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_setup_tasks.py | 152 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_setup_tasks.py | 907 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_setup_tasks.py | 910 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_live_transient_windows.py | 18 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_live_transient_windows.py | 20 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_live_transient_windows.py | 63 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_live_transient_windows.py | 65 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_setup_plan_no_overwrite.py | 90 | # ── Bash tests ──────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | tests/test_setup_plan_no_overwrite.py | 178 | # ── PowerShell tests ────────────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | tests/test_timestamp_branches.py | 357 | # ── check_feature_branch Tests ─────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | tests/test_timestamp_branches.py | 371 | # ── find_feature_dir_by_prefix Tests ───────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | tests/test_timestamp_branches.py | 382 | # ── get_feature_paths + single-prefix integration ─────────────────────────── | COMMENT |
| MEDIUM⚡ | tests/test_timestamp_branches.py | 655 | # ── Dry-Run Tests ──────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | tests/test_timestamp_branches.py | 1101 | # ── Feature Directory Resolution Tests ─────────────────────────────────────── | COMMENT |
| MEDIUM | tests/test_timestamp_branches.py | 179 | # ── Timestamp Branch Tests ─────────────────────────────────────────────────── | COMMENT |
| MEDIUM | tests/test_timestamp_branches.py | 225 | # ── Sequential Branch Tests ────────────────────────────────────────────────── | COMMENT |
| MEDIUM | tests/test_timestamp_branches.py | 425 | # ── get_current_branch Tests ───────────────────────────────────────────────── | COMMENT |
| MEDIUM | tests/test_timestamp_branches.py | 436 | # ── No-git Tests ───────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | tests/test_timestamp_branches.py | 449 | # ── E2E Flow Tests ─────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | tests/test_timestamp_branches.py | 516 | # ── Allow Existing Branch Tests ────────────────────────────────────────────── | COMMENT |
| MEDIUM | tests/test_timestamp_branches.py | 869 | # ── PowerShell Dry-Run Tests ───────────────────────────────────────────────── | COMMENT |
| MEDIUM | tests/test_timestamp_branches.py | 953 | # ── Short-Word / Acronym Branch-Name Tests ────────────────────────────────── | COMMENT |
| MEDIUM | tests/test_timestamp_branches.py | 999 | # ── GIT_BRANCH_NAME Override Tests ────────────────────────────────────────── | COMMENT |
| MEDIUM | tests/test_timestamp_branches.py | 1257 | # ── Description Quoting Tests (issue #2339) ────────────────────────────────── | COMMENT |
| MEDIUM | tests/test_self_upgrade_guidance.py | 13 | # =========================================================================== | COMMENT |
| MEDIUM | tests/test_self_upgrade_guidance.py | 15 | # =========================================================================== | COMMENT |
| MEDIUM⚡ | tests/test_init_dir.py | 105 | # ── Bash: positive cases ──────────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | tests/test_init_dir.py | 340 | # ubuntu/windows runners ship pwsh, so these DO run there) ───────────────── | COMMENT |
| MEDIUM | tests/test_init_dir.py | 189 | # ── Bash: negative / contract cases ───────────────────────────────────────── | COMMENT |
| MEDIUM | tests/test_init_dir.py | 282 | # ── Bash: bundled Git extension entrypoint ────────────────────────────────── | COMMENT |
| MEDIUM⚡ | tests/test_authentication.py | 69 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_authentication.py | 71 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_authentication.py | 342 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_authentication.py | 344 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_authentication.py | 382 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_authentication.py | 384 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_authentication.py | 543 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_authentication.py | 545 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_authentication.py | 709 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_authentication.py | 711 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_authentication.py | 780 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_authentication.py | 782 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_authentication.py | 935 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_authentication.py | 937 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_authentication.py | 33 | # --------------------------------------------------------------------------- | COMMENT |
| 123 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | tests/integrations/test_integration_base_markdown.py | 0 | the generated plan skill must not carry a context-file placeholder. agent context files are owned entirely by the opt-in | STRING |
| HIGH | tests/integrations/test_integration_base_toml.py | 0 | the generated plan skill must not carry a context-file placeholder. agent context files are owned entirely by the opt-in | STRING |
| HIGH | tests/integrations/test_integration_base_yaml.py | 0 | the generated plan skill must not carry a context-file placeholder. agent context files are owned entirely by the opt-in | STRING |
| HIGH | tests/integrations/test_integration_base_skills.py | 0 | the generated plan skill must not carry a context-file placeholder. agent context files are owned entirely by the opt-in | STRING |
| HIGH | tests/integrations/test_integration_base_markdown.py | 0 | setup must not create or manage any agent context file — that is owned entirely by the opt-in agent-context extension. | STRING |
| HIGH | tests/integrations/test_integration_base_skills.py | 0 | setup must not create or manage any agent context file — that is owned entirely by the opt-in agent-context extension. | STRING |
| HIGH | tests/integrations/test_integration_base_toml.py | 0 | setup must not create or manage any agent context file — that is owned entirely by the opt-in agent-context extension. | STRING |
| HIGH | tests/integrations/test_integration_base_yaml.py | 0 | setup must not create or manage any agent context file — that is owned entirely by the opt-in agent-context extension. | STRING |
| HIGH | tests/integrations/test_integration_base_markdown.py | 0 | a user-authored context file must survive setup + teardown untouched. | STRING |
| HIGH | tests/integrations/test_integration_base_skills.py | 0 | a user-authored context file must survive setup + teardown untouched. | STRING |
| HIGH | tests/integrations/test_integration_base_toml.py | 0 | a user-authored context file must survive setup + teardown untouched. | STRING |
| HIGH | tests/integrations/test_integration_base_yaml.py | 0 | a user-authored context file must survive setup + teardown untouched. | STRING |
| HIGH | tests/integrations/test_integration_base_markdown.py | 0 | build the expected file list for this integration + script variant. | STRING |
| HIGH | tests/integrations/test_integration_base_toml.py | 0 | build the expected file list for this integration + script variant. | STRING |
| HIGH | tests/integrations/test_integration_base_yaml.py | 0 | build the expected file list for this integration + script variant. | STRING |
| HIGH | tests/integrations/test_integration_base_markdown.py | 0 | every file produced by specify init --integration <key> --script sh. | STRING |
| HIGH | tests/integrations/test_integration_base_skills.py | 0 | every file produced by specify init --integration <key> --script sh. | STRING |
| HIGH | tests/integrations/test_integration_base_toml.py | 0 | every file produced by specify init --integration <key> --script sh. | STRING |
| HIGH | tests/integrations/test_integration_base_yaml.py | 0 | every file produced by specify init --integration <key> --script sh. | STRING |
| HIGH | tests/integrations/test_integration_base_markdown.py | 0 | every file produced by specify init --integration <key> --script ps. | STRING |
| HIGH | tests/integrations/test_integration_base_skills.py | 0 | every file produced by specify init --integration <key> --script ps. | STRING |
| HIGH | tests/integrations/test_integration_base_toml.py | 0 | every file produced by specify init --integration <key> --script ps. | STRING |
| HIGH | tests/integrations/test_integration_base_yaml.py | 0 | every file produced by specify init --integration <key> --script ps. | STRING |
| HIGH | tests/integrations/test_integration_claude.py | 0 | skills without hook sections should not get the note. | STRING |
| HIGH | tests/integrations/test_integration_agy.py | 0 | skills without hook sections should not get the note. | STRING |
| HIGH | tests/integrations/test_integration_codex.py | 0 | skills without hook sections should not get the note. | STRING |
| HIGH | tests/integrations/test_integration_hermes.py | 0 | the core plan command must not carry a context-file placeholder — agent context files are owned by the opt-in agent-cont | STRING |
| HIGH | tests/integrations/test_integration_copilot.py | 0 | the core plan command must not carry a context-file placeholder — agent context files are owned by the opt-in agent-cont | STRING |
| HIGH | tests/integrations/test_integration_codex.py | 0 | the core plan command must not carry a context-file placeholder — agent context files are owned by the opt-in agent-cont | STRING |
| HIGH | tests/integrations/test_integration_forge.py | 0 | the core plan command must not carry a context-file placeholder — agent context files are owned by the opt-in agent-cont | STRING |
| HIGH | tests/integrations/test_integration_generic.py | 0 | the core plan command must not carry a context-file placeholder — agent context files are owned by the opt-in agent-cont | STRING |
| HIGH | src/specify_cli/catalogs.py | 0 | represents a single step catalog source in the catalog stack. | STRING |
| HIGH | src/specify_cli/workflows/catalog.py | 0 | represents a single step catalog source in the catalog stack. | STRING |
| HIGH | src/specify_cli/integrations/catalog.py | 0 | represents a single step catalog source in the catalog stack. | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test_shared_infra_integrity.py | 9 | CODE | |
| LOW | tests/test_check_prerequisites_python_parity.py | 3 | CODE | |
| LOW | tests/test_workflows.py | 13 | CODE | |
| LOW | tests/test_utils.py | 3 | CODE | |
| LOW | tests/test_github_workflows.py | 3 | CODE | |
| LOW | tests/bundler_helpers.py | 8 | CODE | |
| LOW | tests/test_post_process.py | 10 | CODE | |
| LOW | tests/self_upgrade_helpers.py | 13 | CODE | |
| LOW | tests/self_upgrade_helpers.py | 13 | CODE | |
| LOW | tests/self_upgrade_helpers.py | 13 | CODE | |
| LOW | tests/self_upgrade_helpers.py | 13 | CODE | |
| LOW | tests/self_upgrade_helpers.py | 13 | CODE | |
| LOW | tests/self_upgrade_helpers.py | 20 | CODE | |
| LOW | tests/self_upgrade_helpers.py | 21 | CODE | |
| LOW | tests/test_live_transient_windows.py | 12 | CODE | |
| LOW | tests/test_authentication.py | 14 | CODE | |
| LOW | tests/auth_helpers.py | 3 | CODE | |
| LOW | tests/unit/test_bundler_resolver.py | 2 | CODE | |
| LOW | tests/unit/test_bundler_records.py | 2 | CODE | |
| LOW | tests/unit/test_bundler_adapters.py | 2 | CODE | |
| LOW | tests/unit/test_bundler_versioning.py | 2 | CODE | |
| LOW | tests/unit/test_bundler_validator.py | 2 | CODE | |
| LOW | tests/unit/test_bundler_primitives.py | 7 | CODE | |
| LOW | tests/unit/test_bundler_references.py | 6 | CODE | |
| LOW | tests/unit/test_bundler_catalog_config.py | 2 | CODE | |
| LOW | tests/unit/test_bundler_conflict.py | 2 | CODE | |
| LOW | tests/unit/test_bundler_packager.py | 2 | CODE | |
| LOW | tests/contract/test_bundle_cli.py | 7 | CODE | |
| LOW | tests/contract/test_manifest_schema.py | 6 | CODE | |
| LOW | tests/contract/test_catalog_schema.py | 6 | CODE | |
| LOW | tests/integration/test_bundler_offline.py | 7 | CODE | |
| LOW | tests/integration/test_bundler_catalog_stack.py | 2 | CODE | |
| LOW | tests/integration/test_bundler_init_install.py | 8 | CODE | |
| LOW | tests/integration/test_bundler_local_install.py | 7 | CODE | |
| LOW | tests/integration/test_bundler_install_flow.py | 6 | CODE | |
| LOW | tests/integration/test_bundler_security_paths.py | 6 | CODE | |
| LOW | …/extensions/test_update_agent_context_python_parity.py | 10 | CODE | |
| LOW | tests/extensions/test_agent_context_cli_free.py | 11 | CODE | |
| LOW | tests/extensions/test_extension_agent_context.py | 3 | CODE | |
| LOW | …s/extensions/test_update_agent_context_feature_json.py | 3 | CODE | |
| LOW | …s/extensions/test_update_agent_context_feature_json.py | 13 | CODE | |
| LOW | tests/extensions/bug/test_bug_extension.py | 12 | CODE | |
| LOW | tests/integrations/test_home_isolation.py | 3 | CODE | |
| LOW | tests/integrations/test_integration_rovodev.py | 3 | CODE | |
| LOW | …s/agent-context/scripts/python/update_agent_context.py | 18 | CODE | |
| LOW | scripts/python/check_prerequisites.py | 4 | CODE | |
| LOW | scripts/python/common.py | 3 | CODE | |
| LOW | src/specify_cli/_console.py | 8 | CODE | |
| LOW | src/specify_cli/_toml_string.py | 10 | CODE | |
| LOW | src/specify_cli/_version.py | 10 | CODE | |
| LOW | src/specify_cli/catalogs.py | 9 | CODE | |
| LOW | src/specify_cli/_assets.py | 6 | CODE | |
| LOW | src/specify_cli/_invocation_style.py | 9 | CODE | |
| LOW | src/specify_cli/__init__.py | 43 | CODE | |
| LOW | src/specify_cli/__init__.py | 43 | CODE | |
| LOW | src/specify_cli/__init__.py | 43 | CODE | |
| LOW | src/specify_cli/__init__.py | 43 | CODE | |
| LOW | src/specify_cli/__init__.py | 54 | CODE | |
| LOW | src/specify_cli/__init__.py | 54 | CODE | |
| LOW | src/specify_cli/__init__.py | 54 | CODE | |
| 113 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | src/specify_cli/extensions/__init__.py | 704 | Collect command and alias names declared by a manifest. Performs install-time validation for extension-specific | STRING |
| HIGH | src/specify_cli/extensions/__init__.py | 1291 | Check if extension is compatible with current spec-kit version. Args: manifest: Extension manifest | STRING |
| HIGH | src/specify_cli/extensions/__init__.py | 1329 | Install extension from a local directory. Args: source_dir: Path to extension directory | STRING |
| HIGH | src/specify_cli/extensions/__init__.py | 1482 | Install extension from ZIP file. Args: zip_path: Path to extension ZIP file speckit_ver | STRING |
| HIGH | src/specify_cli/extensions/__init__.py | 2204 | Fetch a single catalog with per-URL caching. For the DEFAULT_CATALOG_URL, uses legacy cache files (self.cache_f | STRING |
| HIGH | src/specify_cli/extensions/__init__.py | 2324 | Fetch and merge extensions from all active catalogs. Higher-priority (lower priority number) catalogs win on co | STRING |
| HIGH | src/specify_cli/extensions/__init__.py | 2423 | Fetch extension catalog from URL or cache. Args: force_refresh: If True, bypass cache and fetch fro | STRING |
| HIGH | src/specify_cli/extensions/__init__.py | 2574 | Download extension ZIP from catalog. Args: extension_id: ID of the extension to download | STRING |
| HIGH | src/specify_cli/extensions/_commands.py | 90 | Resolve an extension argument (ID or display name) to an installed extension. Args: argument: Extension ID | STRING |
| HIGH | src/specify_cli/integrations/cline/__init__.py | 23 | Convert command name to Cline-compatible hyphenated format. Cline handles slash-commands optimally when they use hy | STRING |
| HIGH | src/specify_cli/integrations/forge/__init__.py | 20 | Convert command name to Forge-compatible hyphenated format. Forge requires command names to use hyphens instead of | STRING |
| HIGH | src/specify_cli/presets/__init__.py | 562 | Check if preset is compatible with current spec-kit version. Args: manifest: Preset manifest | STRING |
| HIGH | src/specify_cli/presets/__init__.py | 1521 | Install preset from a local directory. Args: source_dir: Path to preset directory speck | STRING |
| HIGH | src/specify_cli/presets/__init__.py | 1640 | Install preset from ZIP file. Args: zip_path: Path to preset ZIP file speckit_version: | STRING |
| HIGH | src/specify_cli/presets/__init__.py | 1967 | Load catalog stack configuration from a YAML file. Args: config_path: Path to preset-catalogs.yml | STRING |
| HIGH | src/specify_cli/presets/__init__.py | 2155 | Fetch a single catalog with per-URL caching. Args: entry: PresetCatalogEntry describing the catalog | STRING |
| HIGH | src/specify_cli/presets/__init__.py | 2304 | Fetch preset catalog from URL or cache. Args: force_refresh: If True, bypass cache and fetch from n | STRING |
| HIGH | src/specify_cli/presets/__init__.py | 2460 | Download preset ZIP from catalog. Args: pack_id: ID of the preset to download target_di | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test_extensions.py | 1290 | CODE | |
| LOW | …s/agent-context/scripts/python/update_agent_context.py | 44 | CODE | |
| LOW | …s/agent-context/scripts/python/update_agent_context.py | 140 | CODE | |
| LOW | …s/agent-context/scripts/python/update_agent_context.py | 243 | CODE | |
| LOW | scripts/python/check_prerequisites.py | 54 | CODE | |
| LOW | src/specify_cli/_console.py | 147 | CODE | |
| LOW | src/specify_cli/_console.py | 90 | CODE | |
| LOW | src/specify_cli/_console.py | 198 | CODE | |
| LOW | src/specify_cli/_toml_string.py | 36 | CODE | |
| LOW | src/specify_cli/_version.py | 473 | CODE | |
| LOW | src/specify_cli/_assets.py | 104 | CODE | |
| LOW | src/specify_cli/__init__.py | 210 | CODE | |
| LOW | src/specify_cli/agents.py | 590 | CODE | |
| LOW | src/specify_cli/agents.py | 974 | CODE | |
| LOW | src/specify_cli/agents.py | 1120 | CODE | |
| LOW | src/specify_cli/agents.py | 1181 | CODE | |
| LOW | src/specify_cli/integration_scaffold.py | 203 | CODE | |
| LOW | src/specify_cli/shared_infra.py | 356 | CODE | |
| LOW | src/specify_cli/integration_status.py | 130 | CODE | |
| LOW | src/specify_cli/_utils.py | 147 | CODE | |
| LOW | src/specify_cli/_utils.py | 157 | CODE | |
| LOW | src/specify_cli/workflows/catalog.py | 324 | CODE | |
| LOW | src/specify_cli/workflows/catalog.py | 392 | CODE | |
| LOW | src/specify_cli/workflows/catalog.py | 939 | CODE | |
| LOW | src/specify_cli/workflows/catalog.py | 1010 | CODE | |
| LOW | src/specify_cli/workflows/expressions.py | 44 | CODE | |
| LOW | src/specify_cli/workflows/expressions.py | 149 | CODE | |
| LOW | src/specify_cli/workflows/expressions.py | 186 | CODE | |
| LOW | src/specify_cli/workflows/expressions.py | 265 | CODE | |
| LOW | src/specify_cli/workflows/expressions.py | 299 | CODE | |
| LOW | src/specify_cli/workflows/__init__.py | 75 | CODE | |
| LOW | src/specify_cli/workflows/engine.py | 124 | CODE | |
| LOW | src/specify_cli/workflows/engine.py | 268 | CODE | |
| LOW | src/specify_cli/workflows/engine.py | 825 | CODE | |
| LOW | src/specify_cli/workflows/engine.py | 1059 | CODE | |
| LOW | src/specify_cli/workflows/engine.py | 1222 | CODE | |
| LOW | src/specify_cli/workflows/engine.py | 1301 | CODE | |
| LOW | src/specify_cli/workflows/_commands.py | 581 | CODE | |
| LOW | src/specify_cli/workflows/_commands.py | 941 | CODE | |
| LOW | src/specify_cli/workflows/_commands.py | 1473 | CODE | |
| LOW | src/specify_cli/workflows/steps/init/__init__.py | 74 | CODE | |
| LOW | src/specify_cli/workflows/steps/gate/__init__.py | 150 | CODE | |
| LOW | src/specify_cli/extensions/__init__.py | 199 | CODE | |
| LOW | src/specify_cli/extensions/__init__.py | 703 | CODE | |
| LOW | src/specify_cli/extensions/__init__.py | 778 | CODE | |
| LOW | src/specify_cli/extensions/__init__.py | 978 | CODE | |
| LOW | src/specify_cli/extensions/__init__.py | 1152 | CODE | |
| LOW | src/specify_cli/extensions/__init__.py | 1320 | CODE | |
| LOW | src/specify_cli/extensions/__init__.py | 1475 | CODE | |
| LOW | src/specify_cli/extensions/__init__.py | 1540 | CODE | |
| LOW | src/specify_cli/extensions/__init__.py | 1625 | CODE | |
| LOW | src/specify_cli/extensions/__init__.py | 1705 | CODE | |
| LOW | src/specify_cli/extensions/__init__.py | 2201 | CODE | |
| LOW | src/specify_cli/extensions/__init__.py | 3117 | CODE | |
| LOW | src/specify_cli/extensions/_commands.py | 143 | CODE | |
| LOW | src/specify_cli/extensions/_commands.py | 398 | CODE | |
| LOW | src/specify_cli/extensions/_commands.py | 730 | CODE | |
| LOW | src/specify_cli/extensions/_commands.py | 810 | CODE | |
| LOW | src/specify_cli/extensions/_commands.py | 1005 | CODE | |
| LOW | src/specify_cli/extensions/_commands.py | 1451 | CODE | |
| 37 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/integrations/test_integration_base_toml.py | 316 | except Exception as exc: | CODE |
| LOW | tests/integrations/test_integration_base_yaml.py | 152 | except Exception as exc: | CODE |
| LOW | …s/agent-context/scripts/python/update_agent_context.py | 82 | except Exception: | CODE |
| LOW | …s/agent-context/scripts/python/update_agent_context.py | 95 | except Exception: | CODE |
| LOW | …s/agent-context/scripts/python/update_agent_context.py | 151 | except Exception: | CODE |
| LOW | …s/agent-context/scripts/python/update_agent_context.py | 309 | except Exception as exc: | CODE |
| LOW | …ons/agent-context/scripts/bash/update-agent-context.sh | 86 | except Exception as exc: | CODE |
| LOW | …ons/agent-context/scripts/bash/update-agent-context.sh | 138 | except Exception: | CODE |
| LOW | …ons/agent-context/scripts/bash/update-agent-context.sh | 151 | except Exception: | CODE |
| LOW | …ons/agent-context/scripts/bash/update-agent-context.sh | 192 | except Exception: | CODE |
| LOW | …ons/agent-context/scripts/bash/update-agent-context.sh | 265 | except Exception: | CODE |
| LOW | scripts/bash/common.sh | 284 | except Exception: | CODE |
| LOW | scripts/bash/common.sh | 433 | except Exception: | CODE |
| LOW | scripts/bash/common.sh | 521 | except Exception: | CODE |
| LOW | scripts/bash/common.sh | 552 | except Exception: | CODE |
| LOW | src/specify_cli/_console.py | 87 | except Exception: | STRING |
| LOW | src/specify_cli/_assets.py | 108 | except Exception: | CODE |
| LOW | src/specify_cli/_assets.py | 117 | except Exception: | CODE |
| LOW | src/specify_cli/__init__.py | 231 | except Exception: | CODE |
| LOW | src/specify_cli/__init__.py | 248 | except Exception as e: | CODE |
| LOW | src/specify_cli/_utils.py | 188 | except Exception: | CODE |
| LOW | src/specify_cli/_utils.py | 210 | except Exception as e: | CODE |
| LOW | src/specify_cli/_utils.py | 246 | except Exception as e: | CODE |
| LOW | src/specify_cli/workflows/catalog.py | 362 | except Exception as exc: | CODE |
| LOW | src/specify_cli/workflows/catalog.py | 979 | except Exception as exc: | CODE |
| LOW | src/specify_cli/workflows/__init__.py | 199 | except Exception: # noqa: BLE001 | CODE |
| LOW | src/specify_cli/workflows/engine.py | 720 | except Exception as exc: | CODE |
| LOW | src/specify_cli/workflows/engine.py | 797 | except Exception as exc: | CODE |
| LOW | src/specify_cli/workflows/engine.py | 1193 | except Exception: | CODE |
| LOW | src/specify_cli/workflows/_commands.py | 381 | except Exception as exc: | CODE |
| LOW | src/specify_cli/workflows/_commands.py | 439 | except Exception as exc: | CODE |
| LOW | src/specify_cli/workflows/_commands.py | 691 | except Exception as exc: | CODE |
| LOW | src/specify_cli/workflows/_commands.py | 798 | except Exception as exc: | CODE |
| LOW | src/specify_cli/workflows/_commands.py | 1318 | except Exception as exc: | CODE |
| LOW | src/specify_cli/workflows/_commands.py | 1327 | except Exception as exc: | CODE |
| LOW | src/specify_cli/workflows/_commands.py | 1411 | except Exception as exc: | CODE |
| LOW | src/specify_cli/workflows/_commands.py | 1547 | except Exception as restore_exc: # noqa: BLE001 | CODE |
| LOW | src/specify_cli/extensions/__init__.py | 1785 | except Exception as skills_err: | CODE |
| LOW | src/specify_cli/extensions/__init__.py | 1813 | except Exception as ext_err: | CODE |
| LOW | src/specify_cli/extensions/__init__.py | 3298 | except Exception: | CODE |
| LOW | src/specify_cli/extensions/_commands.py | 67 | except Exception as e: | CODE |
| LOW | src/specify_cli/extensions/_commands.py | 1314 | except Exception as e: | CODE |
| LOW | src/specify_cli/extensions/_commands.py | 1428 | except Exception as rollback_error: | CODE |
| LOW | src/specify_cli/integrations/_migrate_commands.py | 275 | except Exception as exc: | CODE |
| LOW | src/specify_cli/integrations/_migrate_commands.py | 279 | except Exception as rollback_err: | CODE |
| LOW | src/specify_cli/integrations/_migrate_commands.py | 469 | except Exception as exc: | CODE |
| LOW | src/specify_cli/integrations/_install_commands.py | 165 | except Exception as exc: | CODE |
| LOW | src/specify_cli/integrations/_install_commands.py | 169 | except Exception as rollback_err: | CODE |
| LOW | src/specify_cli/integrations/_helpers.py | 372 | except Exception as ext_err: | CODE |
| LOW | src/specify_cli/integrations/kimi/__init__.py | 335 | except Exception: | CODE |
| LOW | src/specify_cli/commands/init.py | 62 | except Exception as e: | CODE |
| LOW | src/specify_cli/commands/init.py | 516 | except Exception as wf_err: | CODE |
| LOW | src/specify_cli/commands/init.py | 599 | except Exception as preset_err: | CODE |
| LOW | src/specify_cli/commands/init.py | 611 | except Exception as e: | CODE |
| LOW | src/specify_cli/commands/bundle/__init__.py | 867 | except Exception as exc: # noqa: BLE001 | CODE |
| LOW | src/specify_cli/commands/bundle/__init__.py | 893 | except Exception as exc: # noqa: BLE001 | CODE |
| LOW | src/specify_cli/commands/bundle/__init__.py | 918 | except Exception as exc: # noqa: BLE001 | CODE |
| LOW | src/specify_cli/presets/__init__.py | 784 | except Exception: | CODE |
| LOW | src/specify_cli/presets/__init__.py | 909 | except Exception: | CODE |
| LOW | src/specify_cli/presets/__init__.py | 1084 | except Exception: | CODE |
| 20 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | tests/test_workflows.py | 5962 | # Create an orphaned step directory (no registry entry) | COMMENT |
| MEDIUM | tests/test_setup_tasks.py | 221 | # Create the override | COMMENT |
| MEDIUM | tests/test_extensions.py | 1214 | # Create a config file in the installed extension directory | COMMENT |
| MEDIUM | tests/test_extensions.py | 1300 | # Create a ZIP of the extension in a temp directory (not NamedTemporaryFile, | COMMENT |
| MEDIUM | tests/test_extensions.py | 1546 | # Create a config file | COMMENT |
| MEDIUM | tests/test_presets.py | 4602 | # Create a template in the preset directory | COMMENT |
| MEDIUM | tests/test_presets.py | 5236 | # Create a preset command dir with a wrap-strategy command | COMMENT |
| MEDIUM | tests/test_presets.py | 6575 | # Create a gemini commands dir so reconciliation writes there | COMMENT |
| MEDIUM | tests/test_extension_registration.py | 69 | # Create a mock manifest | COMMENT |
| MEDIUM | tests/test_extension_registration.py | 117 | # Create a manifest with hooks | COMMENT |
| MEDIUM | tests/test_extension_registration.py | 175 | # Create a corrupted config (root is a list) | COMMENT |
| MEDIUM | tests/test_extension_registration.py | 330 | # Create a manifest with a hook for the same event | COMMENT |
| MEDIUM | tests/test_workflow_run_without_project.py | 19 | # Create a minimal workflow YAML with a shell step | COMMENT |
| MEDIUM | tests/extensions/git/test_git_extension.py | 1006 | # Create a file to commit | COMMENT |
| MEDIUM | tests/integrations/test_integration_hermes.py | 179 | # Create a foreign skill in the global dir first | COMMENT |
| MEDIUM⚡ | tests/integrations/test_integration_forge.py | 292 | # Create a mock extension command file | COMMENT |
| MEDIUM⚡ | tests/integrations/test_integration_forge.py | 298 | # Create a test command with dot notation name | COMMENT |
| MEDIUM | tests/integrations/test_integration_forge.py | 343 | # Create a mock extension command file | COMMENT |
| MEDIUM | tests/integrations/test_integration_forge.py | 391 | # Create a mock extension command file | COMMENT |
| MEDIUM⚡ | tests/integrations/test_integration_opencode.py | 75 | # Create a source command file for the registrar | COMMENT |
| MEDIUM | tests/integrations/test_integration_opencode.py | 162 | # Create a source command file for the registrar | COMMENT |
| MEDIUM | scripts/bash/setup-plan.sh | 60 | # Create a basic plan file if template doesn't exist | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | spec-driven.md | 123 | # Step 1: Create the feature specification (5 minutes) | COMMENT |
| LOW⚡ | spec-driven.md | 131 | # Step 2: Generate implementation plan (5 minutes) | COMMENT |
| LOW⚡ | spec-driven.md | 134 | # Step 3: Generate executable tasks (5 minutes) | COMMENT |
| LOW | docs/quickstart.md | 21 | ### Step 1: Install Specify | COMMENT |
| LOW⚡ | docs/quickstart.md | 54 | ### Step 2: Define Your Constitution | COMMENT |
| LOW⚡ | docs/quickstart.md | 62 | ### Step 3: Create the Spec | COMMENT |
| LOW⚡ | docs/quickstart.md | 70 | ### Step 4: Refine and Validate the Spec | COMMENT |
| LOW⚡ | docs/quickstart.md | 78 | ### Step 5: Create a Technical Implementation Plan | COMMENT |
| LOW | docs/quickstart.md | 92 | ### Step 6: Break Down, Analyze, and Implement | COMMENT |
| LOW | docs/quickstart.md | 119 | ### Step 1: Define Constitution | COMMENT |
| LOW | docs/quickstart.md | 127 | ### Step 2: Define Requirements with `/speckit.specify` | COMMENT |
| LOW | docs/quickstart.md | 139 | ### Step 3: Refine the Specification | COMMENT |
| LOW⚡ | docs/quickstart.md | 153 | ### Step 4: Generate Technical Plan with `/speckit.plan` | COMMENT |
| LOW⚡ | docs/quickstart.md | 161 | ### Step 5: Validate the Spec | COMMENT |
| LOW⚡ | docs/quickstart.md | 169 | ### Step 6: Define Tasks | COMMENT |
| LOW⚡ | docs/quickstart.md | 177 | ### Step 7: Validate and Implement | COMMENT |
| LOW | docs/quickstart.md | 191 | ### Step 8: Converge | COMMENT |
| LOW | docs/install/air-gapped.md | 5 | ## Step 1: Build the wheel on a connected machine | COMMENT |
| LOW⚡ | docs/install/air-gapped.md | 22 | ## Step 2: Transfer the `dist/` directory | COMMENT |
| LOW⚡ | docs/install/air-gapped.md | 26 | ## Step 3: Install on the air-gapped machine | COMMENT |
| LOW⚡ | docs/install/air-gapped.md | 32 | ## Step 4: Initialize a project | COMMENT |
| LOW | extensions/EXTENSION-API-REFERENCE.md | 449 | ### Step 1: Description | COMMENT |
| LOW | extensions/EXTENSION-API-REFERENCE.md | 457 | ### Step 2: Another Step | COMMENT |
| LOW | extensions/selftest/commands/selftest.md | 16 | ### Step 1: Catalog Discovery Validation | COMMENT |
| LOW | extensions/selftest/commands/selftest.md | 25 | ### Step 2: Simulate Installation | COMMENT |
| LOW | extensions/selftest/commands/selftest.md | 40 | ### Step 3: Registration Verification | COMMENT |
| LOW | extensions/selftest/commands/selftest.md | 49 | ### Step 4: Verification Report | COMMENT |
| LOW⚡ | extensions/template/EXAMPLE-README.md | 116 | # Step 1: Create specification | COMMENT |
| LOW⚡ | extensions/template/EXAMPLE-README.md | 119 | # Step 2: Generate tasks | COMMENT |
| LOW⚡ | extensions/template/EXAMPLE-README.md | 122 | # Step 3: Use extension | COMMENT |
| LOW | extensions/template/commands/example.md | 32 | ### Step 1: Load Configuration | COMMENT |
| LOW | extensions/template/commands/example.md | 66 | ### Step 2: Perform Main Action | COMMENT |
| LOW | extensions/template/commands/example.md | 81 | ### Step 3: Process Results | COMMENT |
| LOW | extensions/template/commands/example.md | 97 | ### Step 4: Save Output (Optional) | COMMENT |
| LOW⚡ | src/specify_cli/extensions/__init__.py | 368 | # Step 1: apply any rename from the auto-correction pass. | COMMENT |
| LOW⚡ | src/specify_cli/extensions/__init__.py | 370 | # Step 2: lift alias-form '{ext_id}.cmd' to canonical 'speckit.{ext_id}.cmd'. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | spec-driven.md | 121 | COMMENT | |
| LOW | tests/test_workflows.py | 4381 | COMMENT | |
| LOW | tests/integrations/test_extra_args.py | 481 | # SPECKIT_INTEGRATION_<KEY>_EXECUTABLE tests | COMMENT |
| LOW | extensions/template/extension.yml | 81 | description: "Demonstrates hook functionality" | COMMENT |
| LOW | extensions/template/config-template.yml | 61 | COMMENT | |
| LOW | extensions/agent-context/agent-context-config.yml | 1 | # Coding Agent Context Extension Configuration | COMMENT |
| LOW | …ons/agent-context/scripts/bash/update-agent-context.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | extensions/git/git-config.yml | 1 | # Git Branching Workflow Extension Configuration | COMMENT |
| LOW | extensions/git/config-template.yml | 1 | # Git Branching Workflow Extension Configuration | COMMENT |
| LOW | scripts/bash/common.sh | 21 | prev_dir="$dir" | COMMENT |
| LOW | scripts/bash/check-prerequisites.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | .github/workflows/add-community-extension.lock.yml | 1 | # gh-aw-metadata: {"schema_version":"v4","frontmatter_hash":"687ea37b376b3b918331c13fce6cdbf5b9898bab8e514ca57b662b92b6d | COMMENT |
| LOW | .github/workflows/add-community-extension.lock.yml | 21 | # gh aw compile | COMMENT |
| LOW | .github/workflows/add-community-extension.lock.yml | 41 | # - github/gh-aw-actions/setup@c0338fef4749d08c21f8f975fb0e37efa17dda47 # v0.79.8 | COMMENT |
| LOW | .github/workflows/add-community-extension.lock.yml | 841 | # --allow-tool shell(cat) | COMMENT |
| LOW | .github/workflows/bug-test.lock.yml | 1 | # gh-aw-metadata: {"schema_version":"v4","frontmatter_hash":"ed734f6b123dcce3257c147be573cae4eaa6383018b65759a0e8d74049a | COMMENT |
| LOW | .github/workflows/bug-test.lock.yml | 21 | # gh aw compile | COMMENT |
| LOW | .github/workflows/bug-test.lock.yml | 41 | # | COMMENT |
| LOW | .github/workflows/bug-test.lock.yml | 801 | # --allow-tool shell(echo) | COMMENT |
| LOW | .github/workflows/bug-test.lock.yml | 821 | # --allow-tool shell(safeoutputs:*) | COMMENT |
| LOW | .github/workflows/add-community-preset.lock.yml | 1 | # gh-aw-metadata: {"schema_version":"v4","frontmatter_hash":"b4ba1db5fdec754fa825cc3160879924118bc454a781eed70ef6c90beab | COMMENT |
| LOW | .github/workflows/add-community-preset.lock.yml | 21 | # gh aw compile | COMMENT |
| LOW | .github/workflows/add-community-preset.lock.yml | 41 | # - github/gh-aw-actions/setup@c0338fef4749d08c21f8f975fb0e37efa17dda47 # v0.79.8 | COMMENT |
| LOW | .github/workflows/add-community-preset.lock.yml | 841 | # --allow-tool shell(cat) | COMMENT |
| LOW | .github/workflows/bug-fix.lock.yml | 1 | # gh-aw-metadata: {"schema_version":"v4","frontmatter_hash":"aafdb01f262d603577971994522575829802b93d9042d62446313955485 | COMMENT |
| LOW | .github/workflows/bug-fix.lock.yml | 21 | # gh aw compile | COMMENT |
| LOW | .github/workflows/bug-fix.lock.yml | 41 | # - github/gh-aw-actions/setup@c0338fef4749d08c21f8f975fb0e37efa17dda47 # v0.79.8 | COMMENT |
| LOW | .github/workflows/bug-fix.lock.yml | 841 | # --allow-tool shell(cargo:*) | COMMENT |
| LOW | .github/workflows/bug-fix.lock.yml | 861 | # --allow-tool shell(printf) | COMMENT |
| LOW | .github/workflows/bug-assess.lock.yml | 1 | # gh-aw-metadata: {"schema_version":"v4","frontmatter_hash":"00c226f69fb7ec2b63755304328cee6ecddbcedbe4a9840310e5f430bd3 | COMMENT |
| LOW | .github/workflows/bug-assess.lock.yml | 21 | # gh aw compile | COMMENT |
| LOW | .github/workflows/bug-assess.lock.yml | 41 | # | COMMENT |
| LOW | .github/workflows/bug-assess.lock.yml | 801 | # --allow-tool shell(jq) | COMMENT |
| LOW | presets/scaffold/preset.yml | 21 | COMMENT | |
| LOW | presets/scaffold/preset.yml | 41 | # $CORE_SCRIPT placeholder (scripts), replaced with lower-priority content | COMMENT |
| LOW | presets/scaffold/preset.yml | 61 | # | COMMENT |
| LOW | src/specify_cli/__init__.py | 1 | #!/usr/bin/env python3 | COMMENT |
| LOW | src/specify_cli/workflows/expressions.py | 401 | expr = expr.strip() | COMMENT |
| LOW | src/specify_cli/workflows/engine.py | 61 | # see ``_RECOGNIZED_REQUIRES_KEYS``) but NOT enforced at run time — they | COMMENT |
| LOW | src/specify_cli/workflows/engine.py | 221 | errors.append( | COMMENT |
| LOW | src/specify_cli/workflows/engine.py | 921 | # result (including exit_code, stderr, status) is | COMMENT |
| LOW | src/specify_cli/workflows/steps/gate/__init__.py | 61 | "choice": None, | COMMENT |
| LOW | src/specify_cli/extensions/__init__.py | 1761 | else: | COMMENT |
| LOW | src/specify_cli/extensions/__init__.py | 2261 | # poisoned cache (older spec-kit version, manual edit, upstream | COMMENT |
| LOW | src/specify_cli/extensions/__init__.py | 2461 | # Validate catalog structure. Reuses the same helper as | COMMENT |
| LOW | src/specify_cli/extensions/__init__.py | 2761 | continue | COMMENT |
| LOW | src/specify_cli/integrations/claude/__init__.py | 21 | "taskstoissues": "Optional filter or label for GitHub issues", | COMMENT |
| LOW | src/specify_cli/presets/__init__.py | 61 | # Derive the short name (strip "speckit." prefix) used by core command templates. | COMMENT |
| LOW | src/specify_cli/presets/__init__.py | 2181 | # Cache is best-effort: a JSON-decode failure, an OS-level | COMMENT |
| LOW | src/specify_cli/presets/__init__.py | 2341 | catalog_data = json.loads(response.read()) | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test_extensions.py | 509 | # Set ext_id to match the legacy namespace so correction is valid | COMMENT |
| LOW | …tensions/git/scripts/bash/create-new-feature-branch.sh | 278 | # Check if git is available at this repo root | COMMENT |
| LOW | extensions/git/scripts/bash/git-common.sh | 6 | # Check if we have git available at the repo root | COMMENT |
| LOW | extensions/git/scripts/bash/auto-commit.sh | 34 | # Check if git is available | COMMENT |
| LOW | extensions/git/scripts/bash/auto-commit.sh | 106 | # Check if event section existed at all | COMMENT |
| LOW | extensions/git/scripts/bash/auto-commit.sh | 120 | # Check if there are changes to commit | COMMENT |
| LOW | extensions/git/scripts/bash/initialize-repo.sh | 37 | # Check if git is available | COMMENT |
| LOW | extensions/git/scripts/bash/initialize-repo.sh | 43 | # Check if already a git repo | COMMENT |
| LOW | scripts/bash/common.sh | 233 | # Check if jq is available for safe JSON construction | COMMENT |
| LOW | scripts/bash/common.sh | 636 | # Check if any layer uses a non-replace strategy | COMMENT |
| LOW | scripts/bash/setup-plan.sh | 65 | # Output results | COMMENT |
| LOW | scripts/bash/setup-tasks.sh | 60 | # Output results | COMMENT |
| LOW | scripts/bash/check-prerequisites.sh | 159 | # Output results | COMMENT |
| LOW | scripts/bash/create-new-feature.sh | 32 | # Check if the next argument is another option (starts with --) | COMMENT |
| LOW | src/specify_cli/workflows/_commands.py | 1611 | # Check if it's a built-in | COMMENT |
| LOW | src/specify_cli/workflows/steps/prompt/__init__.py | 119 | # Check if the CLI tool is actually installed. | COMMENT |
| LOW | src/specify_cli/workflows/steps/command/__init__.py | 156 | # Check if the CLI tool is actually installed. | COMMENT |
| LOW | src/specify_cli/extensions/__init__.py | 1045 | # Check if skill already exists before creating the directory | COMMENT |
| LOW | src/specify_cli/extensions/__init__.py | 1359 | # Check if already installed | COMMENT |
| LOW | src/specify_cli/extensions/__init__.py | 1525 | # Check if manifest is in a subdirectory | COMMENT |
| LOW | src/specify_cli/extensions/_commands.py | 559 | # Check if extension exists in catalog (supports both ID and display name) | COMMENT |
| LOW | src/specify_cli/extensions/_commands.py | 1065 | # Check if installation is allowed from this catalog | COMMENT |
| LOW | src/specify_cli/presets/__init__.py | 996 | # Check if any preset previously registered this skill | COMMENT |
| LOW | src/specify_cli/presets/_commands.py | 382 | # Check if installed locally first | COMMENT |
| LOW | src/specify_cli/presets/_commands.py | 457 | # Check if preset is installed | COMMENT |
| LOW | src/specify_cli/presets/_commands.py | 503 | # Check if preset is installed | COMMENT |
| LOW | src/specify_cli/presets/_commands.py | 537 | # Check if preset is installed | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | tests/test_extension_update_hardening.py | 80 | # Write config with hooks: null; get_project_config() normalizes this to {} | COMMENT |
| HIGH | tests/test_extension_registration.py | 303 | """Regression: hooks: {after_tasks: null} must not crash in unregister_hooks().""" | STRING |
| HIGH | tests/extensions/test_extension_agent_context.py | 175 | "command -v cygpath >/dev/null 2>&1 && cygpath -u \"$1\"", | CODE |
| HIGH | src/specify_cli/workflows/expressions.py | 520 | In every such case the membership relation is undefined, so treat it as | STRING |
| HIGH | src/specify_cli/workflows/engine.py | 235 | # valid, but any present-but-non-mapping value — ``requires:`` (YAML null), | COMMENT |
| HIGH | src/specify_cli/extensions/__init__.py | 2089 | ``{"extensions": []}`` or ``{"extensions": null}`` slip through | STRING |
| HIGH | src/specify_cli/presets/__init__.py | 1933 | ``{"presets": []}`` or ``{"presets": null}`` slip through here and | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | CONTRIBUTING.md | 85 | 1. **Run focused automated checks first** — use the quick verification commands [below](#automated-checks) to catch scaf | CODE |
| MEDIUM | newsletters/2026-March.md | 75 | - **End-to-end workflow automation** -- an open issue (#1966) proposes a built-in pipeline command. The community-built | CODE |
| MEDIUM | newsletters/2026-May.md | 135 | - **Multi-agent workflows** — multi-install support (#2389) was the most-requested feature. The next frontier is orchest | CODE |
| MEDIUM | newsletters/2026-June.md | 21 | **v0.11.0–v0.11.10** (June 16–29) was the largest release cluster of the month and centered on **workflows** and the new | CODE |
| MEDIUM | newsletters/2026-June.md | 47 | Beyond converge and bundles, June was the month the **workflow engine grew up**. The **step catalog** (#2394) made steps | CODE |
| MEDIUM | tests/integrations/test_cli.py | 141 | # Aborted before scaffolding: the pre-existing file is untouched. | COMMENT |
| MEDIUM | docs/reference/integrations.md | 21 | | [GitHub Copilot](https://code.visualstudio.com/) | `copilot` | Defaults to | CODE |
| MEDIUM | presets/ARCHITECTURE.md | 145 | │ ├── README.md # Guide for customizing the scaffold | CODE |
| MEDIUM | src/specify_cli/integrations/_scaffold_commands.py | 35 | # scaffold targets the Spec Kit *source* repo layout (_is_spec_kit_repo_root), | COMMENT |
| MEDIUM | src/specify_cli/integrations/copilot/__init__.py | 121 | # Mutable flag set by setup() — indicates the active scaffolding mode. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | src/specify_cli/workflows/engine.py | 1116 | # not the outer closure — clearer and robust if StepContext copying | COMMENT |
| MEDIUM | src/specify_cli/workflows/_commands.py | 1398 | # ensuring the traversal check is robust even on non-canonical paths. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | extensions/template/EXAMPLE-README.md | 52 | api_key: "your-api-key" | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | .github/PULL_REQUEST_TEMPLATE.md | 21 | <!-- If you used AI, briefly describe how (e.g., "Code generated by Copilot", "Consulted ChatGPT for approach"): --> | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | …s/extensions/test_update_agent_context_feature_json.py | 22 | def _setup_project(root: Path, context_file: str = "CLAUDE.md") -> None: | CODE |
| LOW | src/specify_cli/shared_infra.py | 17 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/specify_cli/workflows/engine.py | 476 | def set_step_output(self, step_id: str, output: Any) -> None: | CODE |
| LOW⚡ | src/specify_cli/integrations/_helpers.py | 340 | def _set_default_integration_or_exit(*args: Any, **kwargs: Any) -> None: | CODE |
| LOW | src/specify_cli/bundler/__init__.py | 10 | __all__ = ["BundlerError"] | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | src/specify_cli/extensions/__init__.py | 368 | # Step 1: apply any rename from the auto-correction pass. | COMMENT |
| LOW⚡ | src/specify_cli/extensions/__init__.py | 370 | # Step 2: lift alias-form '{ext_id}.cmd' to canonical 'speckit.{ext_id}.cmd'. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | tests/test_github_http.py | 147 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | src/specify_cli/commands/init.py | 74 | CODE |