specsmith 0.22.2__tar.gz → 0.22.3__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.22.2/src/specsmith.egg-info → specsmith-0.22.3}/PKG-INFO +1 -1
- {specsmith-0.22.2 → specsmith-0.22.3}/pyproject.toml +1 -1
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/__init__.py +1 -1
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/cli.py +12 -10
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/config.py +1 -1
- {specsmith-0.22.2 → specsmith-0.22.3/src/specsmith.egg-info}/PKG-INFO +1 -1
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith.egg-info/SOURCES.txt +1 -0
- specsmith-0.22.3/tests/test_issue_305.py +78 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/LICENSE +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/README.md +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/setup.cfg +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/epistemic/__init__.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/epistemic/belief.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/epistemic/certainty.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/epistemic/failure_graph.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/epistemic/py.typed +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/epistemic/recovery.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/epistemic/session.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/epistemic/stress_tester.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/epistemic/trace.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/__main__.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/advanced_code_analysis.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/agent/__init__.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/agent/broker.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/agent/chat_runner.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/agent/cleanup.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/agent/context_seed.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/agent/core.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/agent/dispatch/__init__.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/agent/dispatch/_status.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/agent/dispatch/dag.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/agent/dispatch/dispatcher.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/agent/dispatch/events.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/agent/dispatch/result.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/agent/endpoints.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/agent/events.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/agent/execution_profiles.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/agent/fallback.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/agent/hf_leaderboard.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/agent/hf_sync.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/agent/indexer.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/agent/llm_client.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/agent/mcp.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/agent/memory.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/agent/model_intelligence.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/agent/model_profiles.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/agent/model_router.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/agent/orchestrator.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/agent/permissions.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/agent/profiles.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/agent/provider_registry.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/agent/repl.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/agent/router.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/agent/rules.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/agent/runner.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/agent/safety.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/agent/spawner.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/agent/suggester.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/agent/teams.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/agent/terminal_env.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/agent/token_pricing.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/agent/tools.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/agent/verifier.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/agent/voice.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/approvals.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/architect.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/auditor.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/auth.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/block_export.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/channel.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/chat_handoff.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/ci_manager.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/code_analysis.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/commands/__init__.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/commands/intelligence.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/commands/issues_policy.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/commands/reporting.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/commands/zoo_code.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/compliance/__init__.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/compliance/_compat.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/compliance/checker.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/compliance/evidence.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/compliance/regulations.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/compliance/reporter.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/compressor.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/console_utils.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/context_orchestrator.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/context_window.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/credit_analyzer.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/credits.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/dashboard.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/datasources/__init__.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/datasources/base.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/datasources/citations.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/datasources/fpd.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/datasources/odp.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/datasources/patentsview.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/datasources/pfw.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/datasources/ppubs.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/datasources/ptab.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/differ.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/doctor.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/drive.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/editor.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/efficiency.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/epistemic/__init__.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/epistemic/belief.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/epistemic/certainty.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/epistemic/failure_graph.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/epistemic/recovery.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/epistemic/stress_tester.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/esdb/__init__.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/esdb/_license.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/esdb/bridge.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/esdb/sqlite_store.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/esdb_sweep.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/esdb_writer.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/eval/__init__.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/eval/builtins.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/eval/runner.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/executor.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/exporter.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/governance_logic.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/governance_store.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/governance_yaml.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/governed_pr.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/gui/__init__.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/gui/app.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/gui/main_window.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/gui/session_tab.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/gui/theme.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/gui/widgets/__init__.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/gui/widgets/chat_view.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/gui/widgets/input_bar.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/gui/widgets/provider_bar.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/gui/widgets/token_meter.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/gui/widgets/tool_panel.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/gui/widgets/update_checker.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/gui/worker.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/history_search.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/importer.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/improvement_tracker.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/instinct.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/integrations/__init__.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/integrations/agent_skill.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/integrations/aider.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/integrations/base.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/integrations/claude_code.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/integrations/codity.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/integrations/copilot.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/integrations/cursor.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/integrations/gemini.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/integrations/warp.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/integrations/windsurf.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/issue_reporter.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/languages.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/ledger.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/local_model.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/mcp_generator.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/mcp_server.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/migrations/__init__.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/migrations/m001_governance_yaml.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/migrations/m002_agents_slim.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/migrations/m003_compliance_init.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/migrations/m004_ledger_esdb.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/migrations/m005_agent_run_tool.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/migrations/m006_session_governance.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/migrations/m007_yaml_first.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/migrations/m008_esdb_full_coverage.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/migrations/m009_esdb_first.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/migrations/m010_post_esdb_cleanup.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/migrations/m011_windows_skill_shell.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/migrations/m012_normalize_skill_shell.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/migrations/runner.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/model_optimizer.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/model_registry.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/ollama_cmds.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/patent.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/paths.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/phase.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/plugins.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/policy.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/profiles.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/project_metrics.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/quality_report.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/rate_limits.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/recover.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/release_guard.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/releaser.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/requirements.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/requirements_parser.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/retrieval.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/risk.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/safe_write.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/scaffolder.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/serve.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/session.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/session_init.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/session_store.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/skills/__init__.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/skills/ai_agents.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/skills/cloud.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/skills/corporate.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/skills/cross_platform.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/skills/data_engineering.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/skills/devops.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/skills/docs.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/skills/embedded.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/skills/governance.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/skills/hardware.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/skills/mobile.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/skills/platform_engineering.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/skills/productivity.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/skills/software_engineering.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/skills/specsmith_core_commands.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/skills/specsmith_operations.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/skills/specsmith_skills.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/skills/ssh.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/skills/web_backend.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/skills_builder.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/sync.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/templates/agents.md.j2 +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/templates/community/bug_report.md.j2 +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/templates/community/code_of_conduct.md.j2 +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/templates/community/contributing.md.j2 +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/templates/community/feature_request.md.j2 +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/templates/community/license-Apache-2.0.j2 +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/templates/community/license-MIT.j2 +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/templates/community/pull_request_template.md.j2 +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/templates/community/security.md.j2 +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/templates/docs/architecture.md.j2 +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/templates/docs/mkdocs.yml.j2 +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/templates/docs/readthedocs.yaml.j2 +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/templates/docs/requirements.md.j2 +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/templates/docs/test-spec.md.j2 +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/templates/editorconfig.j2 +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/templates/gitattributes.j2 +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/templates/gitignore.j2 +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/templates/go/go.mod.j2 +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/templates/go/main.go.j2 +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/templates/governance/belief-registry.md.j2 +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/templates/governance/context-budget.md.j2 +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/templates/governance/drift-metrics.md.j2 +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/templates/governance/epistemic-axioms.md.j2 +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/templates/governance/failure-modes.md.j2 +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/templates/governance/lifecycle.md.j2 +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/templates/governance/roles.md.j2 +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/templates/governance/rules.md.j2 +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/templates/governance/session-protocol.md.j2 +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/templates/governance/uncertainty-map.md.j2 +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/templates/governance/verification.md.j2 +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/templates/js/package.json.j2 +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/templates/ledger.md.j2 +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/templates/python/cli.py.j2 +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/templates/python/init.py.j2 +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/templates/python/pyproject.toml.j2 +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/templates/readme.md.j2 +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/templates/rust/Cargo.toml.j2 +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/templates/rust/main.rs.j2 +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/templates/scripts/exec.cmd.j2 +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/templates/scripts/exec.sh.j2 +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/templates/scripts/run.cmd.j2 +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/templates/scripts/run.sh.j2 +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/templates/scripts/setup.cmd.j2 +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/templates/scripts/setup.sh.j2 +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/templates/workflows/release.yml.j2 +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/tool_installer.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/toolrules.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/tools.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/trace.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/transcripts.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/updater.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/upgrader.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/validator.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/vcs/__init__.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/vcs/base.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/vcs/bitbucket.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/vcs/github.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/vcs/gitlab.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/vcs_commands.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/wi_store.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/wireframes.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/workspace.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith.egg-info/dependency_links.txt +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith.egg-info/entry_points.txt +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith.egg-info/requires.txt +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith.egg-info/top_level.txt +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_CMD_001.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_agent_profiles.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_agent_run_feedback.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_agent_runner_ready.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_ai_client.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_ai_intelligence.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_architect_interview.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_architect_v2.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_architecture.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_audit_governance.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_auditor.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_benchmark_harness.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_branch_workflow.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_broker_scope.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_channel.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_chat_diff_decision.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_chat_handoff.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_chat_runner_openai_compat.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_chat_stdin_protocol.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_cleanup_cmd.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_cli.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_cli_regressions.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_cli_workflows_history_drive.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_compliance.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_compliance_governance.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_compressor.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_deprecation_registry.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_dispatch.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_docs_artifacts.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_dual_write.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_e2e_nexus.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_efficiency.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_endpoints_cli.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_endpoints_store.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_epistemic.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_esdb_backend_switch.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_esdb_enforcement.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_esdb_integration.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_esdb_license.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_esdb_migrate_wal_repair.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_esdb_sqlite.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_esdb_status_integrity.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_esdb_status_output.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_esdb_sweep.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_esdb_verify_chain_cli.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_esdb_writer.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_fallback_chain.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_golden_path.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_importer.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_improvement_tracker.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_init_modes.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_integrations.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_integrations_codity.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_integrations_warp.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_intelligence.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_issue_policy_features.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_issue_reporter.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_issues_263_264.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_local_model.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_markdown_deprecation.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_mcp_client.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_mcp_server.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_metrics_flush.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_migration_direction.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_migrations_skill_shell.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_model_registry.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_model_router.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_new_modules.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_nexus.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_parallel_agents.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_permissions.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_phase1_4_new.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_phase34_completion.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_project_metrics.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_quality_report.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_rate_limits.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_release_guard.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_release_version_contract.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_releaser.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_repl.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_repl_extended.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_reporting_commands.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_req_248_262.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_req_358_359.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_resume_command.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_rtd_deploy_workflow.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_scaffolder.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_schema_migrations.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_session_events.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_skill_marketplace.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_skills_mcp.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_smoke.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_sqlite_parity.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_suggester.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_sync_reconcile.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_terminal_env.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_token_cost.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_tools.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_trace_vault_esdb.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_typing_guardrails.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_updater.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_validator.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_vcs.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_vcs_commands.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_warp_parity.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_warp_parity_followup.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_wi_lifecycle.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_wi_lifecycle_extended.py +0 -0
- {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_windows_launcher.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: specsmith
|
|
3
|
-
Version: 0.22.
|
|
3
|
+
Version: 0.22.3
|
|
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.22.
|
|
7
|
+
version = "0.22.3"
|
|
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.22.
|
|
11
|
+
__version__ = "0.22.3" # fallback: keep in sync with pyproject.toml
|
|
@@ -3373,6 +3373,17 @@ def save_cmd(project_dir: str, message: str, no_push: bool, force: bool, as_json
|
|
|
3373
3373
|
except Exception as exc: # noqa: BLE001
|
|
3374
3374
|
steps.append({"step": "esdb_backup", "ok": False, "error": str(exc)})
|
|
3375
3375
|
|
|
3376
|
+
# Persist the save metric before committing. ChronoStore appends this
|
|
3377
|
+
# dual-write to its tracked WAL, so writing it after the commit leaves the
|
|
3378
|
+
# worktree dirty even when save otherwise reports success.
|
|
3379
|
+
try:
|
|
3380
|
+
from specsmith.project_metrics import MetricsRecord, MetricsStore
|
|
3381
|
+
|
|
3382
|
+
pre_commit_ok = all(step["ok"] for step in steps)
|
|
3383
|
+
MetricsStore(root).append(MetricsRecord.new(command="save", passed=pre_commit_ok))
|
|
3384
|
+
except Exception: # noqa: BLE001 # metrics remain best-effort
|
|
3385
|
+
pass
|
|
3386
|
+
|
|
3376
3387
|
# 2. Commit
|
|
3377
3388
|
if not has_uncommitted_changes(root):
|
|
3378
3389
|
steps.append({"step": "commit", "ok": True, "note": "Nothing to commit"})
|
|
@@ -3436,15 +3447,6 @@ def save_cmd(project_dir: str, message: str, no_push: bool, force: bool, as_json
|
|
|
3436
3447
|
note = step.get("message") or step.get("note") or step.get("error") or ""
|
|
3437
3448
|
console.print(f" [{color}]{icon}[/{color}] {step['step']}: {note}")
|
|
3438
3449
|
|
|
3439
|
-
# Auto-record a minimal metrics row for lifetime tracking
|
|
3440
|
-
try:
|
|
3441
|
-
from specsmith.project_metrics import MetricsRecord, MetricsStore
|
|
3442
|
-
|
|
3443
|
-
_store = MetricsStore(root)
|
|
3444
|
-
_store.append(MetricsRecord.new(command="save", passed=ok))
|
|
3445
|
-
except Exception: # noqa: BLE001 # intentional: metrics are best-effort; never block save
|
|
3446
|
-
pass
|
|
3447
|
-
|
|
3448
3450
|
if not ok:
|
|
3449
3451
|
raise SystemExit(1)
|
|
3450
3452
|
|
|
@@ -3855,7 +3857,7 @@ def channel_set_cmd(channel: str) -> None:
|
|
|
3855
3857
|
if channel == "stable" and is_prerelease_version(__version__):
|
|
3856
3858
|
raise click.UsageError(
|
|
3857
3859
|
"Cannot select stable while a prerelease is installed. "
|
|
3858
|
-
f"Install a stable build first: {version_mismatch_remediation('0.22.
|
|
3860
|
+
f"Install a stable build first: {version_mismatch_remediation('0.22.3')}"
|
|
3859
3861
|
)
|
|
3860
3862
|
|
|
3861
3863
|
set_persisted_channel(channel)
|
|
@@ -140,7 +140,7 @@ class ProjectConfig(BaseModel):
|
|
|
140
140
|
),
|
|
141
141
|
)
|
|
142
142
|
language: str = Field(default="python", description="Primary language/runtime")
|
|
143
|
-
spec_version: str = Field(default="0.22.
|
|
143
|
+
spec_version: str = Field(default="0.22.3", description="Spec version to scaffold from")
|
|
144
144
|
description: str = Field(default="", description="Short project description")
|
|
145
145
|
|
|
146
146
|
# Options
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: specsmith
|
|
3
|
-
Version: 0.22.
|
|
3
|
+
Version: 0.22.3
|
|
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
|
|
@@ -337,6 +337,7 @@ tests/test_integrations.py
|
|
|
337
337
|
tests/test_integrations_codity.py
|
|
338
338
|
tests/test_integrations_warp.py
|
|
339
339
|
tests/test_intelligence.py
|
|
340
|
+
tests/test_issue_305.py
|
|
340
341
|
tests/test_issue_policy_features.py
|
|
341
342
|
tests/test_issue_reporter.py
|
|
342
343
|
tests/test_issues_263_264.py
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
# Copyright (c) 2026 Layer1Labs Silicon, Inc. All rights reserved.
|
|
2
|
+
"""Regression coverage for issue #305 (TEST-480)."""
|
|
3
|
+
|
|
4
|
+
from __future__ import annotations
|
|
5
|
+
|
|
6
|
+
import json
|
|
7
|
+
import subprocess
|
|
8
|
+
from pathlib import Path
|
|
9
|
+
|
|
10
|
+
from click.testing import CliRunner
|
|
11
|
+
|
|
12
|
+
from specsmith.cli import main
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def _git(root: Path, *args: str) -> str:
|
|
16
|
+
result = subprocess.run(
|
|
17
|
+
["git", *args],
|
|
18
|
+
cwd=root,
|
|
19
|
+
check=True,
|
|
20
|
+
capture_output=True,
|
|
21
|
+
text=True,
|
|
22
|
+
)
|
|
23
|
+
return result.stdout
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def _init_git_repo(root: Path) -> None:
|
|
27
|
+
_git(root, "init")
|
|
28
|
+
_git(root, "config", "user.name", "SpecSmith Test")
|
|
29
|
+
_git(root, "config", "user.email", "specsmith-test@example.invalid")
|
|
30
|
+
(root / ".gitignore").write_text(
|
|
31
|
+
".chronomemory/*\n!.chronomemory/events.wal\n.specsmith/*.sqlite3\n",
|
|
32
|
+
encoding="utf-8",
|
|
33
|
+
)
|
|
34
|
+
wal = root / ".chronomemory" / "events.wal"
|
|
35
|
+
wal.parent.mkdir()
|
|
36
|
+
wal.write_text("", encoding="utf-8")
|
|
37
|
+
(root / "README.md").write_text("fixture\n", encoding="utf-8")
|
|
38
|
+
(root / ".specsmith").mkdir()
|
|
39
|
+
_git(root, "add", "-A")
|
|
40
|
+
_git(root, "commit", "-m", "test: initialize fixture")
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
def test_save_commits_chronomemory_metric_wal_before_reporting_success(
|
|
44
|
+
tmp_path: Path, monkeypatch
|
|
45
|
+
) -> None: # type: ignore[no-untyped-def]
|
|
46
|
+
"""A successful save must not leave its own tracked ChronoMemory WAL dirty."""
|
|
47
|
+
_init_git_repo(tmp_path)
|
|
48
|
+
|
|
49
|
+
class _Store:
|
|
50
|
+
def __enter__(self) -> _Store:
|
|
51
|
+
return self
|
|
52
|
+
|
|
53
|
+
def __exit__(self, *_args: object) -> None:
|
|
54
|
+
return None
|
|
55
|
+
|
|
56
|
+
def backup(self) -> Path:
|
|
57
|
+
backup = tmp_path / ".chronomemory" / "backup" / "save.wal"
|
|
58
|
+
backup.parent.mkdir(exist_ok=True)
|
|
59
|
+
backup.write_text("backup\n", encoding="utf-8")
|
|
60
|
+
return backup
|
|
61
|
+
|
|
62
|
+
def _append_metric(self, _record: object) -> None: # type: ignore[no-untyped-def]
|
|
63
|
+
wal = self._root / ".chronomemory" / "events.wal"
|
|
64
|
+
with wal.open("a", encoding="utf-8") as stream:
|
|
65
|
+
stream.write('{"kind":"session_metric","command":"save"}\n')
|
|
66
|
+
|
|
67
|
+
monkeypatch.setattr("specsmith.esdb.ESDB_BACKEND", "chronomemory")
|
|
68
|
+
monkeypatch.setattr("specsmith.esdb.open_default_store", lambda *_args, **_kwargs: _Store())
|
|
69
|
+
monkeypatch.setattr("specsmith.project_metrics.MetricsStore.append", _append_metric)
|
|
70
|
+
|
|
71
|
+
result = CliRunner().invoke(
|
|
72
|
+
main, ["save", "--project-dir", str(tmp_path), "--no-push", "--json"]
|
|
73
|
+
)
|
|
74
|
+
|
|
75
|
+
assert result.exit_code == 0, result.output
|
|
76
|
+
assert json.loads(result.output)["ok"] is True
|
|
77
|
+
assert _git(tmp_path, "status", "--short") == ""
|
|
78
|
+
assert ".chronomemory/events.wal" in _git(tmp_path, "show", "--format=", "--name-only", "HEAD")
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|