specsmith 0.17.0.dev647__tar.gz → 0.17.1.dev651__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {specsmith-0.17.0.dev647/src/specsmith.egg-info → specsmith-0.17.1.dev651}/PKG-INFO +1 -1
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/pyproject.toml +1 -1
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/__init__.py +1 -1
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/ci_manager.py +4 -1
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/cli.py +25 -13
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/config.py +22 -1
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/differ.py +15 -9
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/doctor.py +6 -3
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/exporter.py +3 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/profiles.py +4 -2
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/updater.py +3 -3
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/upgrader.py +4 -1
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/validator.py +26 -20
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/vcs_commands.py +9 -5
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651/src/specsmith.egg-info}/PKG-INFO +1 -1
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/tests/test_cli.py +4 -2
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/LICENSE +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/README.md +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/setup.cfg +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/epistemic/__init__.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/epistemic/belief.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/epistemic/certainty.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/epistemic/failure_graph.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/epistemic/py.typed +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/epistemic/recovery.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/epistemic/session.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/epistemic/stress_tester.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/epistemic/trace.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/__main__.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/agent/__init__.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/agent/broker.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/agent/chat_runner.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/agent/cleanup.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/agent/context_seed.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/agent/core.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/agent/dispatch/__init__.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/agent/dispatch/_status.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/agent/dispatch/dag.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/agent/dispatch/dispatcher.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/agent/dispatch/events.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/agent/dispatch/result.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/agent/endpoints.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/agent/events.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/agent/execution_profiles.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/agent/fallback.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/agent/hf_leaderboard.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/agent/hf_sync.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/agent/indexer.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/agent/llm_client.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/agent/mcp.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/agent/memory.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/agent/model_intelligence.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/agent/model_profiles.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/agent/model_router.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/agent/orchestrator.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/agent/permissions.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/agent/profiles.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/agent/provider_registry.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/agent/repl.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/agent/router.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/agent/rules.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/agent/runner.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/agent/safety.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/agent/spawner.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/agent/suggester.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/agent/teams.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/agent/tools.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/agent/verifier.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/agent/voice.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/approvals.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/architect.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/auditor.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/auth.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/block_export.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/channel.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/commands/__init__.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/commands/intelligence.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/commands/issues_policy.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/commands/reporting.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/compliance/__init__.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/compliance/_compat.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/compliance/checker.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/compliance/evidence.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/compliance/regulations.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/compliance/reporter.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/compressor.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/console_utils.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/context_orchestrator.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/context_window.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/credit_analyzer.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/credits.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/dashboard.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/datasources/__init__.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/datasources/base.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/datasources/citations.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/datasources/fpd.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/datasources/odp.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/datasources/patentsview.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/datasources/pfw.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/datasources/ppubs.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/datasources/ptab.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/drive.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/editor.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/epistemic/__init__.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/epistemic/belief.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/epistemic/certainty.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/epistemic/failure_graph.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/epistemic/recovery.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/epistemic/stress_tester.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/esdb/__init__.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/esdb/_license.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/esdb/bridge.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/esdb/sqlite_store.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/eval/__init__.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/eval/builtins.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/eval/runner.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/executor.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/governance_logic.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/governance_store.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/governance_yaml.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/governed_pr.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/gui/__init__.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/gui/app.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/gui/main_window.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/gui/session_tab.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/gui/theme.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/gui/widgets/__init__.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/gui/widgets/chat_view.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/gui/widgets/input_bar.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/gui/widgets/provider_bar.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/gui/widgets/token_meter.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/gui/widgets/tool_panel.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/gui/widgets/update_checker.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/gui/worker.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/history_search.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/importer.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/instinct.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/integrations/__init__.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/integrations/agent_skill.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/integrations/aider.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/integrations/base.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/integrations/claude_code.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/integrations/codity.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/integrations/copilot.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/integrations/cursor.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/integrations/gemini.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/integrations/windsurf.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/issue_reporter.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/languages.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/ledger.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/local_model.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/mcp_generator.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/mcp_server.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/migrations/__init__.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/migrations/m001_governance_yaml.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/migrations/m002_agents_slim.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/migrations/m003_compliance_init.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/migrations/m004_ledger_esdb.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/migrations/m005_agent_run_tool.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/migrations/m006_session_governance.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/migrations/m007_yaml_first.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/migrations/runner.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/ollama_cmds.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/patent.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/paths.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/phase.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/plugins.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/policy.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/project_metrics.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/quality_report.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/rate_limits.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/recover.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/releaser.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/requirements.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/requirements_parser.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/retrieval.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/risk.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/safe_write.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/scaffolder.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/serve.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/session.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/session_init.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/session_store.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/skills/__init__.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/skills/ai_agents.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/skills/cloud.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/skills/corporate.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/skills/cross_platform.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/skills/data_engineering.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/skills/devops.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/skills/docs.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/skills/embedded.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/skills/governance.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/skills/hardware.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/skills/mobile.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/skills/platform_engineering.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/skills/productivity.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/skills/software_engineering.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/skills/specsmith_skills.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/skills/ssh.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/skills/web_backend.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/skills_builder.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/sync.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/templates/agents.md.j2 +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/templates/community/bug_report.md.j2 +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/templates/community/code_of_conduct.md.j2 +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/templates/community/contributing.md.j2 +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/templates/community/feature_request.md.j2 +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/templates/community/license-Apache-2.0.j2 +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/templates/community/license-MIT.j2 +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/templates/community/pull_request_template.md.j2 +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/templates/community/security.md.j2 +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/templates/docs/architecture.md.j2 +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/templates/docs/mkdocs.yml.j2 +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/templates/docs/readthedocs.yaml.j2 +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/templates/docs/requirements.md.j2 +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/templates/docs/test-spec.md.j2 +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/templates/editorconfig.j2 +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/templates/gitattributes.j2 +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/templates/gitignore.j2 +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/templates/go/go.mod.j2 +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/templates/go/main.go.j2 +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/templates/governance/belief-registry.md.j2 +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/templates/governance/context-budget.md.j2 +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/templates/governance/drift-metrics.md.j2 +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/templates/governance/epistemic-axioms.md.j2 +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/templates/governance/failure-modes.md.j2 +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/templates/governance/lifecycle.md.j2 +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/templates/governance/roles.md.j2 +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/templates/governance/rules.md.j2 +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/templates/governance/session-protocol.md.j2 +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/templates/governance/uncertainty-map.md.j2 +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/templates/governance/verification.md.j2 +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/templates/js/package.json.j2 +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/templates/ledger.md.j2 +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/templates/python/cli.py.j2 +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/templates/python/init.py.j2 +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/templates/python/pyproject.toml.j2 +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/templates/readme.md.j2 +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/templates/rust/Cargo.toml.j2 +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/templates/rust/main.rs.j2 +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/templates/scripts/exec.cmd.j2 +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/templates/scripts/exec.sh.j2 +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/templates/scripts/run.cmd.j2 +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/templates/scripts/run.sh.j2 +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/templates/scripts/setup.cmd.j2 +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/templates/scripts/setup.sh.j2 +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/templates/workflows/release.yml.j2 +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/tool_installer.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/toolrules.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/tools.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/trace.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/transcripts.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/vcs/__init__.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/vcs/base.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/vcs/bitbucket.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/vcs/github.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/vcs/gitlab.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/wi_store.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/wireframes.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/workspace.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith.egg-info/SOURCES.txt +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith.egg-info/dependency_links.txt +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith.egg-info/entry_points.txt +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith.egg-info/requires.txt +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith.egg-info/top_level.txt +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/tests/test_CMD_001.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/tests/test_agent_profiles.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/tests/test_agent_run_feedback.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/tests/test_agent_runner_ready.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/tests/test_ai_client.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/tests/test_ai_intelligence.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/tests/test_architect_interview.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/tests/test_architect_v2.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/tests/test_architecture.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/tests/test_auditor.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/tests/test_channel.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/tests/test_chat_diff_decision.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/tests/test_chat_runner_openai_compat.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/tests/test_chat_stdin_protocol.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/tests/test_cleanup_cmd.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/tests/test_cli_regressions.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/tests/test_cli_workflows_history_drive.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/tests/test_compliance.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/tests/test_compliance_governance.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/tests/test_compressor.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/tests/test_dispatch.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/tests/test_e2e_nexus.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/tests/test_endpoints_cli.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/tests/test_endpoints_store.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/tests/test_epistemic.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/tests/test_esdb_backend_switch.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/tests/test_esdb_enforcement.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/tests/test_esdb_license.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/tests/test_esdb_sqlite.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/tests/test_esdb_verify_chain_cli.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/tests/test_fallback_chain.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/tests/test_golden_path.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/tests/test_importer.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/tests/test_init_modes.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/tests/test_integrations.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/tests/test_integrations_codity.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/tests/test_intelligence.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/tests/test_issue_policy_features.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/tests/test_issue_reporter.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/tests/test_issues_263_264.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/tests/test_local_model.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/tests/test_markdown_deprecation.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/tests/test_mcp_client.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/tests/test_mcp_server.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/tests/test_migration_direction.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/tests/test_model_router.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/tests/test_new_modules.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/tests/test_nexus.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/tests/test_permissions.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/tests/test_phase1_4_new.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/tests/test_phase34_completion.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/tests/test_project_metrics.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/tests/test_quality_report.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/tests/test_rate_limits.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/tests/test_reporting_commands.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/tests/test_req_248_262.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/tests/test_req_358_359.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/tests/test_scaffolder.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/tests/test_schema_migrations.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/tests/test_skill_marketplace.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/tests/test_skills_mcp.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/tests/test_smoke.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/tests/test_suggester.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/tests/test_tools.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/tests/test_typing_guardrails.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/tests/test_validator.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/tests/test_vcs.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/tests/test_warp_parity.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/tests/test_warp_parity_followup.py +0 -0
- {specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/tests/test_wi_lifecycle.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: specsmith
|
|
3
|
-
Version: 0.17.
|
|
3
|
+
Version: 0.17.1.dev651
|
|
4
4
|
Summary: AEE governance toolkit for AI-assisted development — session preflight gates, multi-agent dispatch, requirements↔test traceability, ESDB persistence, MCP server, and skills for Warp, Cursor, Claude Code, Copilot, Windsurf, and Aider.
|
|
5
5
|
Author: Layer1Labs Silicon, Inc.
|
|
6
6
|
License-Expression: MIT
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "specsmith"
|
|
7
|
-
version = "0.17.
|
|
7
|
+
version = "0.17.1.dev651"
|
|
8
8
|
description = "AEE governance toolkit for AI-assisted development — session preflight gates, multi-agent dispatch, requirements↔test traceability, ESDB persistence, MCP server, and skills for Warp, Cursor, Claude Code, Copilot, Windsurf, and Aider."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
license = "MIT"
|
|
@@ -8,4 +8,4 @@ from importlib.metadata import version as _pkg_version
|
|
|
8
8
|
try:
|
|
9
9
|
__version__: str = _pkg_version("specsmith")
|
|
10
10
|
except PackageNotFoundError: # running from source without install
|
|
11
|
-
__version__ = "0.17.
|
|
11
|
+
__version__ = "0.17.1" # fallback: keep in sync with pyproject.toml
|
|
@@ -157,11 +157,14 @@ class CiManager:
|
|
|
157
157
|
|
|
158
158
|
import yaml
|
|
159
159
|
|
|
160
|
+
from specsmith.config import _normalize_scaffold_raw
|
|
161
|
+
|
|
160
162
|
raw = yaml.safe_load(scaffold_path.read_text(encoding="utf-8")) or {}
|
|
163
|
+
raw = _normalize_scaffold_raw(raw)
|
|
161
164
|
try:
|
|
162
165
|
config = ProjectConfig(**raw)
|
|
163
166
|
except Exception as exc:
|
|
164
|
-
raise RuntimeError(f"Invalid scaffold
|
|
167
|
+
raise RuntimeError(f"Invalid scaffold config: {exc}") from exc
|
|
165
168
|
|
|
166
169
|
p_name = platform or _detect_platform(self.root)
|
|
167
170
|
self._platform_name = p_name
|
|
@@ -2935,16 +2935,20 @@ main.add_command(test)
|
|
|
2935
2935
|
@click.option("--project-dir", type=click.Path(exists=True), default=".")
|
|
2936
2936
|
def migrate(new_type: str, project_dir: str) -> None:
|
|
2937
2937
|
"""Change the project type and regenerate type-dependent files."""
|
|
2938
|
+
from specsmith.config import _normalize_scaffold_raw
|
|
2939
|
+
from specsmith.paths import find_scaffold
|
|
2940
|
+
|
|
2938
2941
|
root = Path(project_dir).resolve()
|
|
2939
|
-
scaffold_path = root
|
|
2942
|
+
scaffold_path = find_scaffold(root)
|
|
2940
2943
|
|
|
2941
|
-
if not scaffold_path.exists():
|
|
2942
|
-
console.print("[red]No scaffold.yml
|
|
2944
|
+
if not scaffold_path or not scaffold_path.exists():
|
|
2945
|
+
console.print("[red]No scaffold config found (docs/SPECSMITH.yml or scaffold.yml).[/red]")
|
|
2943
2946
|
raise SystemExit(1)
|
|
2944
2947
|
|
|
2945
2948
|
with open(scaffold_path) as f:
|
|
2946
2949
|
raw = yaml.safe_load(f)
|
|
2947
2950
|
|
|
2951
|
+
raw = _normalize_scaffold_raw(raw or {})
|
|
2948
2952
|
old_type = raw.get("type", "unknown")
|
|
2949
2953
|
raw["type"] = new_type
|
|
2950
2954
|
|
|
@@ -3103,17 +3107,21 @@ def verify_release() -> None:
|
|
|
3103
3107
|
help="Project root directory.",
|
|
3104
3108
|
)
|
|
3105
3109
|
def apply(project_dir: str) -> None:
|
|
3106
|
-
"""Regenerate CI and agent files from current scaffold.
|
|
3110
|
+
"""Regenerate CI and agent files from current scaffold config."""
|
|
3111
|
+
from specsmith.config import _normalize_scaffold_raw
|
|
3112
|
+
from specsmith.paths import find_scaffold
|
|
3113
|
+
|
|
3107
3114
|
root = Path(project_dir).resolve()
|
|
3108
|
-
scaffold_path = root
|
|
3115
|
+
scaffold_path = find_scaffold(root)
|
|
3109
3116
|
|
|
3110
|
-
if not scaffold_path.exists():
|
|
3111
|
-
console.print("[red]No scaffold.yml
|
|
3117
|
+
if not scaffold_path or not scaffold_path.exists():
|
|
3118
|
+
console.print("[red]No scaffold config found (docs/SPECSMITH.yml or scaffold.yml).[/red]")
|
|
3112
3119
|
raise SystemExit(1)
|
|
3113
3120
|
|
|
3114
3121
|
with open(scaffold_path) as f:
|
|
3115
3122
|
raw = yaml.safe_load(f)
|
|
3116
3123
|
|
|
3124
|
+
raw = _normalize_scaffold_raw(raw or {})
|
|
3117
3125
|
config = ProjectConfig(**raw)
|
|
3118
3126
|
created: list[Path] = []
|
|
3119
3127
|
|
|
@@ -8032,19 +8040,21 @@ def tools_scan_cmd(project_dir: str, as_json: bool, fpga: bool) -> None:
|
|
|
8032
8040
|
|
|
8033
8041
|
import yaml
|
|
8034
8042
|
|
|
8035
|
-
from specsmith.config import ProjectConfig
|
|
8043
|
+
from specsmith.config import ProjectConfig, _normalize_scaffold_raw
|
|
8036
8044
|
from specsmith.doctor import _check_tool
|
|
8045
|
+
from specsmith.paths import find_scaffold
|
|
8037
8046
|
|
|
8038
8047
|
root = Path(project_dir).resolve()
|
|
8039
|
-
scaffold_path = root
|
|
8048
|
+
scaffold_path = find_scaffold(root)
|
|
8040
8049
|
|
|
8041
8050
|
checks: list[dict] = []
|
|
8042
8051
|
|
|
8043
8052
|
# Standard project tools via doctor
|
|
8044
|
-
if scaffold_path.exists():
|
|
8053
|
+
if scaffold_path and scaffold_path.exists():
|
|
8045
8054
|
try:
|
|
8046
8055
|
with open(scaffold_path) as f:
|
|
8047
8056
|
raw = yaml.safe_load(f) or {}
|
|
8057
|
+
raw = _normalize_scaffold_raw(raw)
|
|
8048
8058
|
config = ProjectConfig(**raw)
|
|
8049
8059
|
from specsmith.tools import get_tools
|
|
8050
8060
|
|
|
@@ -8075,10 +8085,10 @@ def tools_scan_cmd(project_dir: str, as_json: bool, fpga: bool) -> None:
|
|
|
8075
8085
|
)
|
|
8076
8086
|
except Exception as e: # noqa: BLE001
|
|
8077
8087
|
if not as_json:
|
|
8078
|
-
console.print(f"[yellow]Could not read scaffold
|
|
8088
|
+
console.print(f"[yellow]Could not read scaffold config: {e}[/yellow]")
|
|
8079
8089
|
|
|
8080
8090
|
# FPGA/HDL tools from scaffold.yml fpga_tools list
|
|
8081
|
-
if fpga and scaffold_path.exists():
|
|
8091
|
+
if fpga and scaffold_path and scaffold_path.exists():
|
|
8082
8092
|
try:
|
|
8083
8093
|
with open(scaffold_path) as f:
|
|
8084
8094
|
raw = yaml.safe_load(f) or {}
|
|
@@ -8143,7 +8153,9 @@ def tools_scan_cmd(project_dir: str, as_json: bool, fpga: bool) -> None:
|
|
|
8143
8153
|
return
|
|
8144
8154
|
|
|
8145
8155
|
if not checks:
|
|
8146
|
-
console.print(
|
|
8156
|
+
console.print(
|
|
8157
|
+
"[yellow]No tools found. Does docs/SPECSMITH.yml (or scaffold.yml) exist?[/yellow]"
|
|
8158
|
+
)
|
|
8147
8159
|
return
|
|
8148
8160
|
|
|
8149
8161
|
installed_count = sum(1 for c in checks if c["installed"])
|
|
@@ -141,7 +141,7 @@ class ProjectConfig(BaseModel):
|
|
|
141
141
|
),
|
|
142
142
|
)
|
|
143
143
|
language: str = Field(default="python", description="Primary language/runtime")
|
|
144
|
-
spec_version: str = Field(default="0.
|
|
144
|
+
spec_version: str = Field(default="0.17.1", description="Spec version to scaffold from")
|
|
145
145
|
description: str = Field(default="", description="Short project description")
|
|
146
146
|
|
|
147
147
|
# Options
|
|
@@ -529,6 +529,27 @@ class ProjectConfig(BaseModel):
|
|
|
529
529
|
return None
|
|
530
530
|
|
|
531
531
|
|
|
532
|
+
# ---------------------------------------------------------------------------
|
|
533
|
+
# Legacy key normalisation helper
|
|
534
|
+
# ---------------------------------------------------------------------------
|
|
535
|
+
|
|
536
|
+
|
|
537
|
+
def _normalize_scaffold_raw(raw: dict[str, Any]) -> dict[str, Any]:
|
|
538
|
+
"""Normalise legacy scaffold YAML keys to the current schema.
|
|
539
|
+
|
|
540
|
+
Call this before ``ProjectConfig(**raw)`` whenever raw YAML is loaded from
|
|
541
|
+
disk so that projects created by older specsmith versions continue to parse
|
|
542
|
+
correctly after a key rename.
|
|
543
|
+
|
|
544
|
+
Migrations handled:
|
|
545
|
+
- ``project`` → ``name`` (renamed in specsmith ≤ 0.9)
|
|
546
|
+
"""
|
|
547
|
+
if raw and "project" in raw and "name" not in raw:
|
|
548
|
+
raw = dict(raw)
|
|
549
|
+
raw["name"] = raw.pop("project")
|
|
550
|
+
return raw
|
|
551
|
+
|
|
552
|
+
|
|
532
553
|
# Keys are str (ProjectType enum values) for compatibility now that config.type is str
|
|
533
554
|
_TYPE_LABELS: dict[str, str] = {
|
|
534
555
|
ProjectType.BACKEND_FRONTEND: "Python backend + web frontend",
|
|
@@ -10,7 +10,8 @@ from pathlib import Path
|
|
|
10
10
|
import yaml
|
|
11
11
|
from jinja2 import Environment, PackageLoader, select_autoescape
|
|
12
12
|
|
|
13
|
-
from specsmith.config import ProjectConfig
|
|
13
|
+
from specsmith.config import ProjectConfig, _normalize_scaffold_raw
|
|
14
|
+
from specsmith.paths import find_scaffold
|
|
14
15
|
|
|
15
16
|
_GOVERNANCE_FILES: list[tuple[str, str]] = [
|
|
16
17
|
("governance/rules.md.j2", "docs/governance/RULES.md"),
|
|
@@ -28,17 +29,18 @@ def run_diff(root: Path) -> list[tuple[str, str]]:
|
|
|
28
29
|
|
|
29
30
|
Returns list of (relative_path, status) where status is 'match', 'differs', or 'missing'.
|
|
30
31
|
"""
|
|
31
|
-
scaffold_path = root
|
|
32
|
-
if not scaffold_path.exists():
|
|
33
|
-
return [("
|
|
32
|
+
scaffold_path = find_scaffold(root)
|
|
33
|
+
if not scaffold_path or not scaffold_path.exists():
|
|
34
|
+
return [("docs/SPECSMITH.yml", "missing")]
|
|
34
35
|
|
|
35
36
|
with open(scaffold_path) as f:
|
|
36
37
|
raw = yaml.safe_load(f)
|
|
37
38
|
|
|
39
|
+
raw = _normalize_scaffold_raw(raw or {})
|
|
38
40
|
try:
|
|
39
41
|
config = ProjectConfig(**raw)
|
|
40
42
|
except Exception:
|
|
41
|
-
return [(
|
|
43
|
+
return [(scaffold_path.name, "invalid")]
|
|
42
44
|
|
|
43
45
|
env = Environment(
|
|
44
46
|
loader=PackageLoader("specsmith", "templates"),
|
|
@@ -116,17 +118,21 @@ def run_diff_html(root: Path) -> str:
|
|
|
116
118
|
"""Generate an HTML diff report with side-by-side views."""
|
|
117
119
|
import difflib
|
|
118
120
|
|
|
119
|
-
scaffold_path = root
|
|
120
|
-
if not scaffold_path.exists():
|
|
121
|
-
return
|
|
121
|
+
scaffold_path = find_scaffold(root)
|
|
122
|
+
if not scaffold_path or not scaffold_path.exists():
|
|
123
|
+
return (
|
|
124
|
+
"<html><body><p>No scaffold config found"
|
|
125
|
+
" (docs/SPECSMITH.yml or scaffold.yml).</p></body></html>"
|
|
126
|
+
)
|
|
122
127
|
|
|
123
128
|
with open(scaffold_path) as f:
|
|
124
129
|
raw = yaml.safe_load(f)
|
|
125
130
|
|
|
131
|
+
raw = _normalize_scaffold_raw(raw or {})
|
|
126
132
|
try:
|
|
127
133
|
config = ProjectConfig(**raw)
|
|
128
134
|
except Exception:
|
|
129
|
-
return "<html><body><p>Invalid scaffold
|
|
135
|
+
return "<html><body><p>Invalid scaffold config.</p></body></html>"
|
|
130
136
|
|
|
131
137
|
from specsmith.tools import get_tools
|
|
132
138
|
|
|
@@ -118,7 +118,10 @@ def run_doctor(root: Path) -> DoctorReport:
|
|
|
118
118
|
2. File-based heuristics for embedded/hardware/mobile/cloud projects.
|
|
119
119
|
3. Always-available base tools (git, python3) surfaced for every project.
|
|
120
120
|
"""
|
|
121
|
-
|
|
121
|
+
from specsmith.config import ProjectConfig, _normalize_scaffold_raw
|
|
122
|
+
from specsmith.paths import find_scaffold
|
|
123
|
+
|
|
124
|
+
scaffold_path = find_scaffold(root)
|
|
122
125
|
report = DoctorReport()
|
|
123
126
|
|
|
124
127
|
# Always check the absolute basics
|
|
@@ -126,15 +129,15 @@ def run_doctor(root: Path) -> DoctorReport:
|
|
|
126
129
|
report.checks.append(_check_tool(exe, category, root=root))
|
|
127
130
|
|
|
128
131
|
# Scaffold-driven checks
|
|
129
|
-
if scaffold_path.exists():
|
|
132
|
+
if scaffold_path and scaffold_path.exists():
|
|
130
133
|
import yaml
|
|
131
134
|
|
|
132
|
-
from specsmith.config import ProjectConfig
|
|
133
135
|
from specsmith.tools import get_tools
|
|
134
136
|
|
|
135
137
|
try:
|
|
136
138
|
with open(scaffold_path) as f:
|
|
137
139
|
raw = yaml.safe_load(f)
|
|
140
|
+
raw = _normalize_scaffold_raw(raw or {})
|
|
138
141
|
config = ProjectConfig(**raw)
|
|
139
142
|
except Exception: # noqa: BLE001
|
|
140
143
|
config = None
|
|
@@ -30,6 +30,9 @@ def run_export(root: Path) -> str:
|
|
|
30
30
|
|
|
31
31
|
with open(scaffold_path) as f:
|
|
32
32
|
raw = yaml.safe_load(f)
|
|
33
|
+
from specsmith.config import _normalize_scaffold_raw
|
|
34
|
+
|
|
35
|
+
raw = _normalize_scaffold_raw(raw or {})
|
|
33
36
|
try:
|
|
34
37
|
config = ProjectConfig(**raw)
|
|
35
38
|
tools = get_tools(config)
|
|
@@ -306,8 +306,10 @@ def load_from_scaffold(project_dir: str) -> ExecutionProfile:
|
|
|
306
306
|
except ImportError:
|
|
307
307
|
return PROFILES[DEFAULT_PROFILE_NAME]
|
|
308
308
|
|
|
309
|
-
|
|
310
|
-
|
|
309
|
+
from specsmith.paths import find_scaffold
|
|
310
|
+
|
|
311
|
+
scaffold = find_scaffold(Path(project_dir))
|
|
312
|
+
if not scaffold or not scaffold.exists():
|
|
311
313
|
return PROFILES[DEFAULT_PROFILE_NAME]
|
|
312
314
|
|
|
313
315
|
try:
|
|
@@ -214,14 +214,14 @@ def run_migration(root: Path, *, dry_run: bool = False) -> list[str]:
|
|
|
214
214
|
raw["spec_version"] = __version__
|
|
215
215
|
with open(scaffold_path, "w") as f:
|
|
216
216
|
yaml.dump(raw, f, default_flow_style=False, sort_keys=False)
|
|
217
|
-
actions.append("Updated
|
|
217
|
+
actions.append(f"Updated {scaffold_path.name}")
|
|
218
218
|
|
|
219
219
|
# Regenerate governance templates
|
|
220
|
-
from specsmith.config import ProjectConfig
|
|
220
|
+
from specsmith.config import ProjectConfig, _normalize_scaffold_raw
|
|
221
221
|
from specsmith.upgrader import run_upgrade
|
|
222
222
|
|
|
223
223
|
try:
|
|
224
|
-
ProjectConfig(**raw) # Validate config
|
|
224
|
+
ProjectConfig(**_normalize_scaffold_raw(raw)) # Validate config
|
|
225
225
|
if not dry_run:
|
|
226
226
|
result = run_upgrade(root, target_version=__version__)
|
|
227
227
|
for updated_file in result.updated_files:
|
|
@@ -125,10 +125,13 @@ def run_upgrade(
|
|
|
125
125
|
with open(scaffold_path) as f:
|
|
126
126
|
raw = yaml.safe_load(f)
|
|
127
127
|
|
|
128
|
+
from specsmith.config import _normalize_scaffold_raw
|
|
129
|
+
|
|
130
|
+
raw = _normalize_scaffold_raw(raw or {})
|
|
128
131
|
try:
|
|
129
132
|
config = ProjectConfig(**raw)
|
|
130
133
|
except Exception as e:
|
|
131
|
-
return UpgradeResult(message=f"Invalid scaffold
|
|
134
|
+
return UpgradeResult(message=f"Invalid scaffold config: {e}")
|
|
132
135
|
|
|
133
136
|
new_version = target_version or __version__
|
|
134
137
|
old_version = config.spec_version
|
|
@@ -84,20 +84,24 @@ _SLEEP_LOOP_CONTEXT = (
|
|
|
84
84
|
|
|
85
85
|
|
|
86
86
|
def _check_scaffold_yml(root: Path) -> list[ValidationResult]:
|
|
87
|
-
"""Check that scaffold
|
|
87
|
+
"""Check that the scaffold config exists and is valid YAML."""
|
|
88
|
+
from specsmith.config import _normalize_scaffold_raw
|
|
89
|
+
from specsmith.paths import find_scaffold
|
|
90
|
+
|
|
88
91
|
results: list[ValidationResult] = []
|
|
89
|
-
scaffold_path = root
|
|
92
|
+
scaffold_path = find_scaffold(root)
|
|
90
93
|
|
|
91
|
-
if not scaffold_path.exists():
|
|
94
|
+
if not scaffold_path or not scaffold_path.exists():
|
|
92
95
|
results.append(
|
|
93
96
|
ValidationResult(
|
|
94
97
|
name="scaffold-yml",
|
|
95
98
|
passed=True,
|
|
96
|
-
message="No scaffold
|
|
99
|
+
message="No scaffold config found (project may not have been created by specsmith)",
|
|
97
100
|
)
|
|
98
101
|
)
|
|
99
102
|
return results
|
|
100
103
|
|
|
104
|
+
cfg_name = scaffold_path.name
|
|
101
105
|
try:
|
|
102
106
|
import yaml
|
|
103
107
|
|
|
@@ -108,31 +112,33 @@ def _check_scaffold_yml(root: Path) -> list[ValidationResult]:
|
|
|
108
112
|
ValidationResult(
|
|
109
113
|
name="scaffold-yml",
|
|
110
114
|
passed=False,
|
|
111
|
-
message="
|
|
112
|
-
)
|
|
113
|
-
)
|
|
114
|
-
elif "name" not in data or "type" not in data:
|
|
115
|
-
results.append(
|
|
116
|
-
ValidationResult(
|
|
117
|
-
name="scaffold-yml",
|
|
118
|
-
passed=False,
|
|
119
|
-
message="scaffold.yml missing required fields: name, type",
|
|
115
|
+
message=f"{cfg_name} is not a valid YAML mapping",
|
|
120
116
|
)
|
|
121
117
|
)
|
|
122
118
|
else:
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
119
|
+
data = _normalize_scaffold_raw(data)
|
|
120
|
+
if "name" not in data or "type" not in data:
|
|
121
|
+
results.append(
|
|
122
|
+
ValidationResult(
|
|
123
|
+
name="scaffold-yml",
|
|
124
|
+
passed=False,
|
|
125
|
+
message=f"{cfg_name} missing required fields: name, type",
|
|
126
|
+
)
|
|
127
|
+
)
|
|
128
|
+
else:
|
|
129
|
+
results.append(
|
|
130
|
+
ValidationResult(
|
|
131
|
+
name="scaffold-yml",
|
|
132
|
+
passed=True,
|
|
133
|
+
message=f"{cfg_name} valid: project={data['name']}, type={data['type']}",
|
|
134
|
+
)
|
|
128
135
|
)
|
|
129
|
-
)
|
|
130
136
|
except Exception as e:
|
|
131
137
|
results.append(
|
|
132
138
|
ValidationResult(
|
|
133
139
|
name="scaffold-yml",
|
|
134
140
|
passed=False,
|
|
135
|
-
message=f"
|
|
141
|
+
message=f"{cfg_name} parse error: {e}",
|
|
136
142
|
)
|
|
137
143
|
)
|
|
138
144
|
|
|
@@ -145,8 +145,10 @@ def run_push(root: Path, *, force: bool = False) -> GitResult:
|
|
|
145
145
|
return GitResult(success=False, message="Not on any branch")
|
|
146
146
|
|
|
147
147
|
# Safety: check branching strategy
|
|
148
|
-
|
|
149
|
-
|
|
148
|
+
from specsmith.paths import find_scaffold
|
|
149
|
+
|
|
150
|
+
scaffold_path = find_scaffold(root)
|
|
151
|
+
if scaffold_path and scaffold_path.exists() and not force:
|
|
150
152
|
with open(scaffold_path) as f:
|
|
151
153
|
raw = yaml.safe_load(f) or {}
|
|
152
154
|
strategy = raw.get("branching_strategy", "gitflow")
|
|
@@ -215,7 +217,7 @@ def run_sync(root: Path) -> GitResult:
|
|
|
215
217
|
|
|
216
218
|
# Check if governance files were in the pull.
|
|
217
219
|
# Use ORIG_HEAD (set by git pull) rather than HEAD~1 — works even on first pull.
|
|
218
|
-
gov_files = ["AGENTS.md", "LEDGER.md", "scaffold.yml", "docs/governance/"]
|
|
220
|
+
gov_files = ["AGENTS.md", "LEDGER.md", "scaffold.yml", "docs/SPECSMITH.yml", "docs/governance/"]
|
|
219
221
|
warnings: list[str] = []
|
|
220
222
|
diff_result = _run_git(root, ["diff", "--name-only", "ORIG_HEAD..HEAD"])
|
|
221
223
|
if diff_result.success:
|
|
@@ -310,11 +312,13 @@ def create_pr(
|
|
|
310
312
|
"""Create a PR via platform CLI with governance context."""
|
|
311
313
|
import yaml
|
|
312
314
|
|
|
313
|
-
|
|
315
|
+
from specsmith.paths import find_scaffold
|
|
316
|
+
|
|
317
|
+
scaffold_path = find_scaffold(root)
|
|
314
318
|
platform = "github"
|
|
315
319
|
base_branch = "develop"
|
|
316
320
|
|
|
317
|
-
if scaffold_path.exists():
|
|
321
|
+
if scaffold_path and scaffold_path.exists():
|
|
318
322
|
with open(scaffold_path) as f:
|
|
319
323
|
raw = yaml.safe_load(f) or {}
|
|
320
324
|
platform = raw.get("vcs_platform", "github")
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: specsmith
|
|
3
|
-
Version: 0.17.
|
|
3
|
+
Version: 0.17.1.dev651
|
|
4
4
|
Summary: AEE governance toolkit for AI-assisted development — session preflight gates, multi-agent dispatch, requirements↔test traceability, ESDB persistence, MCP server, and skills for Warp, Cursor, Claude Code, Copilot, Windsurf, and Aider.
|
|
5
5
|
Author: Layer1Labs Silicon, Inc.
|
|
6
6
|
License-Expression: MIT
|
|
@@ -112,6 +112,8 @@ class TestCLIUpgrade:
|
|
|
112
112
|
assert "Already at spec version" in result.output
|
|
113
113
|
|
|
114
114
|
def test_upgrade_to_new_version(self, tmp_path: Path) -> None:
|
|
115
|
+
from specsmith import __version__
|
|
116
|
+
|
|
115
117
|
target = _scaffold_governed(tmp_path)
|
|
116
118
|
# Backdate spec_version so there is an actual upgrade to perform.
|
|
117
119
|
# Without this the scaffold is already at __version__ and the
|
|
@@ -124,14 +126,14 @@ class TestCLIUpgrade:
|
|
|
124
126
|
yaml.dump(data, fh, default_flow_style=False)
|
|
125
127
|
runner = CliRunner()
|
|
126
128
|
result = runner.invoke(
|
|
127
|
-
main, ["upgrade", "--project-dir", str(target), "--spec-version",
|
|
129
|
+
main, ["upgrade", "--project-dir", str(target), "--spec-version", __version__]
|
|
128
130
|
)
|
|
129
131
|
assert result.exit_code == 0
|
|
130
132
|
assert "Upgraded" in result.output
|
|
131
133
|
# Verify scaffold.yml spec_version was updated to the target version
|
|
132
134
|
with open(target / "scaffold.yml") as fh:
|
|
133
135
|
data = yaml.safe_load(fh)
|
|
134
|
-
assert data["spec_version"] ==
|
|
136
|
+
assert data["spec_version"] == __version__
|
|
135
137
|
|
|
136
138
|
|
|
137
139
|
class TestCLICreditsLimits:
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/agent/dispatch/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/agent/dispatch/dispatcher.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/agent/execution_profiles.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/agent/model_intelligence.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{specsmith-0.17.0.dev647 → specsmith-0.17.1.dev651}/src/specsmith/agent/provider_registry.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|