specsmith 0.18.0.dev698__tar.gz → 0.18.0.dev709__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.18.0.dev698/src/specsmith.egg-info → specsmith-0.18.0.dev709}/PKG-INFO +1 -1
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/pyproject.toml +1 -1
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/sync.py +148 -42
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/templates/gitignore.j2 +14 -17
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709/src/specsmith.egg-info}/PKG-INFO +1 -1
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_esdb_enforcement.py +48 -2
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/LICENSE +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/README.md +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/setup.cfg +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/epistemic/__init__.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/epistemic/belief.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/epistemic/certainty.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/epistemic/failure_graph.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/epistemic/py.typed +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/epistemic/recovery.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/epistemic/session.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/epistemic/stress_tester.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/epistemic/trace.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/__init__.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/__main__.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/agent/__init__.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/agent/broker.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/agent/chat_runner.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/agent/cleanup.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/agent/context_seed.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/agent/core.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/agent/dispatch/__init__.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/agent/dispatch/_status.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/agent/dispatch/dag.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/agent/dispatch/dispatcher.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/agent/dispatch/events.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/agent/dispatch/result.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/agent/endpoints.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/agent/events.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/agent/execution_profiles.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/agent/fallback.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/agent/hf_leaderboard.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/agent/hf_sync.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/agent/indexer.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/agent/llm_client.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/agent/mcp.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/agent/memory.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/agent/model_intelligence.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/agent/model_profiles.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/agent/model_router.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/agent/orchestrator.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/agent/permissions.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/agent/profiles.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/agent/provider_registry.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/agent/repl.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/agent/router.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/agent/rules.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/agent/runner.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/agent/safety.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/agent/spawner.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/agent/suggester.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/agent/teams.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/agent/token_pricing.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/agent/tools.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/agent/verifier.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/agent/voice.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/approvals.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/architect.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/auditor.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/auth.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/block_export.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/channel.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/ci_manager.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/cli.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/commands/__init__.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/commands/intelligence.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/commands/issues_policy.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/commands/reporting.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/compliance/__init__.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/compliance/_compat.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/compliance/checker.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/compliance/evidence.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/compliance/regulations.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/compliance/reporter.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/compressor.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/config.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/console_utils.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/context_orchestrator.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/context_window.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/credit_analyzer.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/credits.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/dashboard.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/datasources/__init__.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/datasources/base.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/datasources/citations.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/datasources/fpd.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/datasources/odp.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/datasources/patentsview.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/datasources/pfw.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/datasources/ppubs.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/datasources/ptab.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/differ.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/doctor.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/drive.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/editor.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/efficiency.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/epistemic/__init__.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/epistemic/belief.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/epistemic/certainty.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/epistemic/failure_graph.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/epistemic/recovery.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/epistemic/stress_tester.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/esdb/__init__.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/esdb/_license.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/esdb/bridge.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/esdb/sqlite_store.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/esdb_sweep.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/esdb_writer.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/eval/__init__.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/eval/builtins.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/eval/runner.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/executor.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/exporter.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/governance_logic.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/governance_store.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/governance_yaml.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/governed_pr.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/gui/__init__.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/gui/app.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/gui/main_window.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/gui/session_tab.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/gui/theme.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/gui/widgets/__init__.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/gui/widgets/chat_view.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/gui/widgets/input_bar.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/gui/widgets/provider_bar.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/gui/widgets/token_meter.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/gui/widgets/tool_panel.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/gui/widgets/update_checker.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/gui/worker.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/history_search.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/importer.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/instinct.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/integrations/__init__.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/integrations/agent_skill.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/integrations/aider.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/integrations/base.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/integrations/claude_code.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/integrations/codity.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/integrations/copilot.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/integrations/cursor.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/integrations/gemini.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/integrations/windsurf.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/issue_reporter.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/languages.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/ledger.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/local_model.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/mcp_generator.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/mcp_server.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/migrations/__init__.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/migrations/m001_governance_yaml.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/migrations/m002_agents_slim.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/migrations/m003_compliance_init.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/migrations/m004_ledger_esdb.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/migrations/m005_agent_run_tool.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/migrations/m006_session_governance.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/migrations/m007_yaml_first.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/migrations/m008_esdb_full_coverage.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/migrations/m009_esdb_first.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/migrations/m010_post_esdb_cleanup.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/migrations/runner.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/ollama_cmds.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/patent.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/paths.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/phase.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/plugins.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/policy.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/profiles.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/project_metrics.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/quality_report.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/rate_limits.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/recover.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/releaser.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/requirements.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/requirements_parser.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/retrieval.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/risk.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/safe_write.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/scaffolder.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/serve.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/session.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/session_init.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/session_store.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/skills/__init__.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/skills/ai_agents.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/skills/cloud.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/skills/corporate.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/skills/cross_platform.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/skills/data_engineering.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/skills/devops.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/skills/docs.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/skills/embedded.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/skills/governance.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/skills/hardware.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/skills/mobile.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/skills/platform_engineering.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/skills/productivity.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/skills/software_engineering.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/skills/specsmith_skills.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/skills/ssh.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/skills/web_backend.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/skills_builder.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/templates/agents.md.j2 +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/templates/community/bug_report.md.j2 +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/templates/community/code_of_conduct.md.j2 +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/templates/community/contributing.md.j2 +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/templates/community/feature_request.md.j2 +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/templates/community/license-Apache-2.0.j2 +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/templates/community/license-MIT.j2 +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/templates/community/pull_request_template.md.j2 +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/templates/community/security.md.j2 +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/templates/docs/architecture.md.j2 +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/templates/docs/mkdocs.yml.j2 +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/templates/docs/readthedocs.yaml.j2 +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/templates/docs/requirements.md.j2 +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/templates/docs/test-spec.md.j2 +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/templates/editorconfig.j2 +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/templates/gitattributes.j2 +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/templates/go/go.mod.j2 +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/templates/go/main.go.j2 +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/templates/governance/belief-registry.md.j2 +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/templates/governance/context-budget.md.j2 +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/templates/governance/drift-metrics.md.j2 +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/templates/governance/epistemic-axioms.md.j2 +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/templates/governance/failure-modes.md.j2 +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/templates/governance/lifecycle.md.j2 +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/templates/governance/roles.md.j2 +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/templates/governance/rules.md.j2 +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/templates/governance/session-protocol.md.j2 +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/templates/governance/uncertainty-map.md.j2 +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/templates/governance/verification.md.j2 +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/templates/js/package.json.j2 +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/templates/ledger.md.j2 +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/templates/python/cli.py.j2 +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/templates/python/init.py.j2 +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/templates/python/pyproject.toml.j2 +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/templates/readme.md.j2 +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/templates/rust/Cargo.toml.j2 +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/templates/rust/main.rs.j2 +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/templates/scripts/exec.cmd.j2 +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/templates/scripts/exec.sh.j2 +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/templates/scripts/run.cmd.j2 +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/templates/scripts/run.sh.j2 +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/templates/scripts/setup.cmd.j2 +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/templates/scripts/setup.sh.j2 +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/templates/workflows/release.yml.j2 +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/tool_installer.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/toolrules.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/tools.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/trace.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/transcripts.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/updater.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/upgrader.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/validator.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/vcs/__init__.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/vcs/base.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/vcs/bitbucket.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/vcs/github.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/vcs/gitlab.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/vcs_commands.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/wi_store.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/wireframes.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/workspace.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith.egg-info/SOURCES.txt +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith.egg-info/dependency_links.txt +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith.egg-info/entry_points.txt +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith.egg-info/requires.txt +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith.egg-info/top_level.txt +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_CMD_001.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_agent_profiles.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_agent_run_feedback.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_agent_runner_ready.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_ai_client.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_ai_intelligence.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_architect_interview.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_architect_v2.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_architecture.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_auditor.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_benchmark_harness.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_channel.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_chat_diff_decision.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_chat_runner_openai_compat.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_chat_stdin_protocol.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_cleanup_cmd.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_cli.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_cli_regressions.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_cli_workflows_history_drive.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_compliance.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_compliance_governance.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_compressor.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_deprecation_registry.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_dispatch.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_dual_write.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_e2e_nexus.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_efficiency.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_endpoints_cli.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_endpoints_store.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_epistemic.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_esdb_backend_switch.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_esdb_integration.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_esdb_license.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_esdb_sqlite.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_esdb_status_integrity.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_esdb_status_output.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_esdb_sweep.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_esdb_verify_chain_cli.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_esdb_writer.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_fallback_chain.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_golden_path.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_importer.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_init_modes.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_integrations.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_integrations_codity.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_intelligence.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_issue_policy_features.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_issue_reporter.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_issues_263_264.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_local_model.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_markdown_deprecation.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_mcp_client.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_mcp_server.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_migration_direction.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_model_router.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_new_modules.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_nexus.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_parallel_agents.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_permissions.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_phase1_4_new.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_phase34_completion.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_project_metrics.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_quality_report.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_rate_limits.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_releaser.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_repl.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_repl_extended.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_reporting_commands.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_req_248_262.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_req_358_359.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_resume_command.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_scaffolder.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_schema_migrations.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_skill_marketplace.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_skills_mcp.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_smoke.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_sqlite_parity.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_suggester.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_token_cost.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_tools.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_trace_vault_esdb.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_typing_guardrails.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_validator.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_vcs.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_warp_parity.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_warp_parity_followup.py +0 -0
- {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_wi_lifecycle.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: specsmith
|
|
3
|
-
Version: 0.18.0.
|
|
3
|
+
Version: 0.18.0.dev709
|
|
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.18.0.
|
|
7
|
+
version = "0.18.0.dev709"
|
|
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"
|
|
@@ -220,79 +220,185 @@ _ESDB_GITIGNORE_FORBIDDEN = frozenset(
|
|
|
220
220
|
}
|
|
221
221
|
)
|
|
222
222
|
|
|
223
|
-
#
|
|
224
|
-
#
|
|
225
|
-
#
|
|
226
|
-
#
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
".
|
|
223
|
+
# Paths that MUST be tracked in git — never emit a bare ignore rule for these.
|
|
224
|
+
# These are governance source-of-truth artifacts that define project state.
|
|
225
|
+
#
|
|
226
|
+
# Decision rationale:
|
|
227
|
+
# config.yml — project identity and settings
|
|
228
|
+
# requirements/testcases — governance canon (YAML-first or JSON cache)
|
|
229
|
+
# esdb.sqlite3 — ESDB SQLite backend (canonical record store)
|
|
230
|
+
# esdb_migration_manifest — which migrations have run; tracked for
|
|
231
|
+
# reproducibility so fresh clones don't re-run
|
|
232
|
+
# events.wal/snapshot — ChronoMemory canonical state (commercial tier)
|
|
233
|
+
_GIT_TRACKED_POLICY: tuple[str, ...] = (
|
|
234
|
+
".specsmith/config.yml",
|
|
235
|
+
".specsmith/requirements.json",
|
|
236
|
+
".specsmith/testcases.json",
|
|
237
|
+
".specsmith/esdb.sqlite3",
|
|
238
|
+
".specsmith/esdb_migration_manifest.json",
|
|
239
|
+
".chronomemory/events.wal",
|
|
240
|
+
".chronomemory/snapshot.json",
|
|
241
|
+
)
|
|
242
|
+
|
|
243
|
+
# Paths that MUST NOT be tracked in git — runtime/ephemeral artifacts.
|
|
244
|
+
# If any of these appear in `git ls-files`, the normalizer will run
|
|
245
|
+
# `git rm --cached` to reconcile tracking state with ignore policy so the
|
|
246
|
+
# ignore rule is immediately effective rather than a dormant no-op.
|
|
247
|
+
#
|
|
248
|
+
# Decision rationale:
|
|
249
|
+
# workitems.json — runtime WI allocation; re-minted by preflight
|
|
250
|
+
# ledger-chain.txt — ephemeral hash-chain cache; DEPRECATED (REQ-420)
|
|
251
|
+
# trace.jsonl — trace log; DEPRECATED by ESDB seal_records (REQ-420)
|
|
252
|
+
# credit-budget.json — session runtime budget; regenerated on start
|
|
253
|
+
# credits.json — runtime credit ledger
|
|
254
|
+
# model-rate-limits — runtime rate-limit state
|
|
255
|
+
# backups/ — timestamped SQLite snapshots; regeneratable via save
|
|
256
|
+
# session_metrics — per-session telemetry; not governance source-of-truth
|
|
257
|
+
# runs/chat/perf/... — transient runtime directories
|
|
258
|
+
# ledger.jsonl — deprecated flat-file ledger (superseded by LEDGER.md)
|
|
259
|
+
# chronomemory/backup — timestamped ChronoMemory backup copies
|
|
260
|
+
_GIT_IGNORED_POLICY: tuple[str, ...] = (
|
|
235
261
|
".specsmith/workitems.json",
|
|
236
|
-
".specsmith/runs/",
|
|
237
|
-
".specsmith/chat/",
|
|
238
|
-
".specsmith/perf/",
|
|
239
|
-
".specsmith/recovery/",
|
|
240
|
-
".specsmith/ledger.jsonl",
|
|
241
262
|
".specsmith/ledger-chain.txt",
|
|
242
263
|
".specsmith/trace.jsonl",
|
|
243
264
|
".specsmith/credit-budget.json",
|
|
244
265
|
".specsmith/credits.json",
|
|
245
266
|
".specsmith/model-rate-limits.json",
|
|
267
|
+
".specsmith/session_metrics.jsonl",
|
|
268
|
+
".specsmith/backups/",
|
|
269
|
+
".specsmith/runs/",
|
|
270
|
+
".specsmith/chat/",
|
|
271
|
+
".specsmith/perf/",
|
|
272
|
+
".specsmith/recovery/",
|
|
246
273
|
".specsmith/pids/",
|
|
247
274
|
".specsmith/logs/",
|
|
248
275
|
".specsmith/sessions/",
|
|
249
276
|
".specsmith/agent-reports/",
|
|
250
277
|
".specsmith/dispatch/",
|
|
251
|
-
".specsmith/
|
|
278
|
+
".specsmith/ledger.jsonl",
|
|
279
|
+
".chronomemory/backup/",
|
|
252
280
|
)
|
|
253
281
|
|
|
282
|
+
# Sentinel comment line that marks the auto-normalized block.
|
|
283
|
+
_POLICY_SENTINEL = "# specsmith ESDB policy (auto-normalized)"
|
|
284
|
+
|
|
285
|
+
|
|
286
|
+
def _untrack_diverged_paths(root: Path, *, dry_run: bool = False) -> list[str]:
|
|
287
|
+
"""Find deny-listed paths that are currently tracked in git and untrack them.
|
|
288
|
+
|
|
289
|
+
For each path in _GIT_IGNORED_POLICY that appears in `git ls-files`, runs
|
|
290
|
+
`git rm --cached <path>` (unless dry_run) so the .gitignore deny rule
|
|
291
|
+
becomes effective instead of a dormant no-op.
|
|
292
|
+
|
|
293
|
+
Returns the list of paths that were (or would be) untracked.
|
|
294
|
+
"""
|
|
295
|
+
import contextlib # noqa: PLC0415 # lazy: only needed when git is present
|
|
296
|
+
import subprocess # noqa: PLC0415 # lazy: only needed when git is present
|
|
297
|
+
|
|
298
|
+
diverged: list[str] = []
|
|
299
|
+
for pattern in _GIT_IGNORED_POLICY:
|
|
300
|
+
bare = pattern.rstrip("/")
|
|
301
|
+
try:
|
|
302
|
+
result = subprocess.run(
|
|
303
|
+
["git", "ls-files", "--", bare],
|
|
304
|
+
cwd=str(root),
|
|
305
|
+
capture_output=True,
|
|
306
|
+
text=True,
|
|
307
|
+
timeout=10,
|
|
308
|
+
)
|
|
309
|
+
tracked = [f for f in result.stdout.splitlines() if f]
|
|
310
|
+
except Exception: # noqa: BLE001 # intentional: git unavailable, skip
|
|
311
|
+
continue
|
|
312
|
+
for tracked_path in tracked:
|
|
313
|
+
diverged.append(tracked_path)
|
|
314
|
+
if not dry_run:
|
|
315
|
+
with contextlib.suppress(Exception): # best-effort: skip if git unavailable
|
|
316
|
+
subprocess.run(
|
|
317
|
+
["git", "rm", "--cached", "--quiet", "--", tracked_path],
|
|
318
|
+
cwd=str(root),
|
|
319
|
+
check=True,
|
|
320
|
+
capture_output=True,
|
|
321
|
+
timeout=10,
|
|
322
|
+
)
|
|
323
|
+
return diverged
|
|
324
|
+
|
|
254
325
|
|
|
255
326
|
def normalize_esdb_gitignore_policy(root: Path, *, dry_run: bool = False) -> bool:
|
|
256
|
-
"""Normalize ESDB gitignore policy
|
|
327
|
+
"""Normalize ESDB gitignore policy (REQ-428).
|
|
328
|
+
|
|
329
|
+
Enforces a single, consistent tracking decision for every governance path:
|
|
257
330
|
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
331
|
+
- Paths in _GIT_TRACKED_POLICY receive ``!``-prefixed allow rules and are
|
|
332
|
+
never given a bare deny rule. The two sets are validated to be disjoint.
|
|
333
|
+
- Paths in _GIT_IGNORED_POLICY receive bare deny rules. Any such path
|
|
334
|
+
currently tracked in git is untracked via ``git rm --cached`` so the deny
|
|
335
|
+
rule is immediately effective rather than a dormant, misleading no-op.
|
|
336
|
+
- Broad directory ignores (``.specsmith/``, ``.chronomemory/``) are removed
|
|
337
|
+
because they would inadvertently hide the canonical ESDB state files.
|
|
338
|
+
|
|
339
|
+
Returns True if any change was made (gitignore written or files untracked).
|
|
261
340
|
"""
|
|
341
|
+
# Disjoint-set invariant: a path cannot appear in both allow and deny lists.
|
|
342
|
+
_tracked_bare = set(_GIT_TRACKED_POLICY)
|
|
343
|
+
_overlap = _tracked_bare & set(_GIT_IGNORED_POLICY)
|
|
344
|
+
if _overlap: # pragma: no cover — programming error
|
|
345
|
+
raise AssertionError(f"BUG: paths in both allow and deny policy: {_overlap}")
|
|
346
|
+
|
|
347
|
+
# --- Read and strip forbidden broad ignores + stale auto-normalized block -
|
|
262
348
|
gitignore_path = root / ".gitignore"
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
original_lines = []
|
|
349
|
+
original_lines = (
|
|
350
|
+
gitignore_path.read_text(encoding="utf-8").splitlines() if gitignore_path.exists() else []
|
|
351
|
+
)
|
|
267
352
|
|
|
268
353
|
normalized_lines: list[str] = []
|
|
269
354
|
removed_forbidden = False
|
|
355
|
+
in_auto_block = False
|
|
270
356
|
for line in original_lines:
|
|
271
|
-
|
|
357
|
+
stripped = line.strip()
|
|
358
|
+
if stripped in _ESDB_GITIGNORE_FORBIDDEN:
|
|
272
359
|
removed_forbidden = True
|
|
273
360
|
continue
|
|
361
|
+
if stripped == _POLICY_SENTINEL:
|
|
362
|
+
in_auto_block = True # drop the old sentinel and everything after it
|
|
363
|
+
continue
|
|
364
|
+
if in_auto_block:
|
|
365
|
+
# Keep lines that are unrelated to the specsmith policy block
|
|
366
|
+
if not (
|
|
367
|
+
stripped.startswith("!.specsmith/")
|
|
368
|
+
or stripped.startswith(".specsmith/")
|
|
369
|
+
or stripped.startswith("!.chronomemory/")
|
|
370
|
+
or stripped.startswith(".chronomemory/")
|
|
371
|
+
or stripped.startswith("# ")
|
|
372
|
+
):
|
|
373
|
+
in_auto_block = False
|
|
374
|
+
normalized_lines.append(line)
|
|
375
|
+
continue
|
|
274
376
|
normalized_lines.append(line)
|
|
275
377
|
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
if not
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
normalized_lines.
|
|
288
|
-
|
|
289
|
-
|
|
378
|
+
# --- Determine which policy lines are missing from the retained content ---
|
|
379
|
+
existing = {ln.strip() for ln in normalized_lines if ln.strip()}
|
|
380
|
+
allow_lines = [f"!{p}" for p in _GIT_TRACKED_POLICY]
|
|
381
|
+
deny_lines = list(_GIT_IGNORED_POLICY)
|
|
382
|
+
missing_allows = [ln for ln in allow_lines if ln not in existing]
|
|
383
|
+
missing_denies = [ln for ln in deny_lines if ln not in existing]
|
|
384
|
+
gitignore_changed = removed_forbidden or bool(missing_allows) or bool(missing_denies)
|
|
385
|
+
|
|
386
|
+
if not dry_run and gitignore_changed:
|
|
387
|
+
if normalized_lines and normalized_lines[-1].strip():
|
|
388
|
+
normalized_lines.append("")
|
|
389
|
+
normalized_lines.append(_POLICY_SENTINEL)
|
|
390
|
+
normalized_lines.append("# Tracked (governance source-of-truth):")
|
|
391
|
+
normalized_lines.extend(missing_allows)
|
|
392
|
+
normalized_lines.append("# Ephemeral runtime paths (never commit):")
|
|
393
|
+
normalized_lines.extend(missing_denies)
|
|
290
394
|
rendered = "\n".join(normalized_lines)
|
|
291
395
|
if rendered and not rendered.endswith("\n"):
|
|
292
396
|
rendered += "\n"
|
|
293
397
|
gitignore_path.write_text(rendered, encoding="utf-8")
|
|
294
398
|
|
|
295
|
-
|
|
399
|
+
# --- Reconcile git index: untrack any deny-listed paths still tracked ----
|
|
400
|
+
untracked = _untrack_diverged_paths(root, dry_run=dry_run)
|
|
401
|
+
return gitignore_changed or bool(untracked)
|
|
296
402
|
|
|
297
403
|
|
|
298
404
|
# ---------------------------------------------------------------------------
|
|
@@ -37,41 +37,38 @@ htmlcov/
|
|
|
37
37
|
.work/
|
|
38
38
|
*.log
|
|
39
39
|
|
|
40
|
-
# specsmith governance data policy
|
|
41
|
-
#
|
|
42
|
-
# -
|
|
43
|
-
# - .specsmith/requirements.json
|
|
44
|
-
# - .specsmith/testcases.json
|
|
45
|
-
# - .specsmith/esdb.sqlite3
|
|
46
|
-
# - .chronomemory/events.wal
|
|
47
|
-
# - .chronomemory/snapshot.json
|
|
48
|
-
# Always track these even if broader ignore rules are added later:
|
|
40
|
+
# specsmith governance data policy (auto-enforced by specsmith sync)
|
|
41
|
+
#
|
|
42
|
+
# Tracked (governance source-of-truth) — always committed:
|
|
49
43
|
!.specsmith/config.yml
|
|
50
44
|
!.specsmith/requirements.json
|
|
51
45
|
!.specsmith/testcases.json
|
|
52
46
|
!.specsmith/esdb.sqlite3
|
|
47
|
+
!.specsmith/esdb_migration_manifest.json
|
|
53
48
|
!.chronomemory/events.wal
|
|
54
49
|
!.chronomemory/snapshot.json
|
|
55
50
|
#
|
|
56
|
-
#
|
|
57
|
-
|
|
51
|
+
# Ephemeral runtime paths — never committed:
|
|
52
|
+
# (specsmith sync will run `git rm --cached` for any of these already tracked)
|
|
58
53
|
.specsmith/workitems.json
|
|
59
|
-
.specsmith/runs/
|
|
60
|
-
.specsmith/chat/
|
|
61
|
-
.specsmith/perf/
|
|
62
|
-
.specsmith/recovery/
|
|
63
|
-
.specsmith/ledger.jsonl
|
|
64
54
|
.specsmith/ledger-chain.txt
|
|
65
55
|
.specsmith/trace.jsonl
|
|
66
56
|
.specsmith/credit-budget.json
|
|
67
57
|
.specsmith/credits.json
|
|
68
58
|
.specsmith/model-rate-limits.json
|
|
59
|
+
.specsmith/session_metrics.jsonl
|
|
60
|
+
.specsmith/backups/
|
|
61
|
+
.specsmith/runs/
|
|
62
|
+
.specsmith/chat/
|
|
63
|
+
.specsmith/perf/
|
|
64
|
+
.specsmith/recovery/
|
|
69
65
|
.specsmith/pids/
|
|
70
66
|
.specsmith/logs/
|
|
71
67
|
.specsmith/sessions/
|
|
72
68
|
.specsmith/agent-reports/
|
|
73
69
|
.specsmith/dispatch/
|
|
74
|
-
.specsmith/
|
|
70
|
+
.specsmith/ledger.jsonl
|
|
71
|
+
.chronomemory/backup/
|
|
75
72
|
{% if project.type in ('cli-rust', 'library-rust') %}
|
|
76
73
|
|
|
77
74
|
# Rust
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: specsmith
|
|
3
|
-
Version: 0.18.0.
|
|
3
|
+
Version: 0.18.0.dev709
|
|
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
|
|
@@ -48,13 +48,59 @@ def test_run_sync_normalizes_legacy_esdb_gitignore(tmp_path: Path) -> None:
|
|
|
48
48
|
for line in (tmp_path / ".gitignore").read_text(encoding="utf-8").splitlines()
|
|
49
49
|
if line.strip()
|
|
50
50
|
}
|
|
51
|
+
# Broad ignores must be gone
|
|
51
52
|
assert ".specsmith/" not in lines
|
|
52
53
|
assert ".chronomemory/" not in lines
|
|
53
|
-
|
|
54
|
-
assert ".specsmith/workitems.json" in lines
|
|
54
|
+
# Allow-list (tracked source-of-truth) must be present
|
|
55
55
|
assert "!.specsmith/esdb.sqlite3" in lines
|
|
56
|
+
assert "!.specsmith/esdb_migration_manifest.json" in lines
|
|
56
57
|
assert "!.chronomemory/events.wal" in lines
|
|
57
58
|
assert "!.chronomemory/snapshot.json" in lines
|
|
59
|
+
# Deny-list (ephemeral runtime) must be present
|
|
60
|
+
assert ".chronomemory/backup/" in lines
|
|
61
|
+
assert ".specsmith/workitems.json" in lines
|
|
62
|
+
assert ".specsmith/ledger-chain.txt" in lines
|
|
63
|
+
assert ".specsmith/trace.jsonl" in lines
|
|
64
|
+
assert ".specsmith/backups/" in lines
|
|
65
|
+
assert ".specsmith/session_metrics.jsonl" in lines
|
|
66
|
+
# esdb_migration_manifest must NOT appear as a bare deny rule
|
|
67
|
+
assert ".specsmith/esdb_migration_manifest.json" not in lines
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
def test_normalizer_policy_sets_are_disjoint() -> None:
|
|
71
|
+
"""_GIT_TRACKED_POLICY and _GIT_IGNORED_POLICY must never overlap."""
|
|
72
|
+
from specsmith.sync import _GIT_IGNORED_POLICY, _GIT_TRACKED_POLICY
|
|
73
|
+
|
|
74
|
+
tracked = set(_GIT_TRACKED_POLICY)
|
|
75
|
+
ignored = set(_GIT_IGNORED_POLICY)
|
|
76
|
+
overlap = tracked & ignored
|
|
77
|
+
assert not overlap, f"Paths in both allow and deny policy: {overlap}"
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
def test_normalizer_idempotent(tmp_path: Path) -> None:
|
|
81
|
+
"""Running normalize twice must not change the file on the second pass."""
|
|
82
|
+
from specsmith.sync import normalize_esdb_gitignore_policy
|
|
83
|
+
|
|
84
|
+
normalize_esdb_gitignore_policy(tmp_path)
|
|
85
|
+
content_after_first = (tmp_path / ".gitignore").read_text(encoding="utf-8")
|
|
86
|
+
normalize_esdb_gitignore_policy(tmp_path)
|
|
87
|
+
content_after_second = (tmp_path / ".gitignore").read_text(encoding="utf-8")
|
|
88
|
+
assert content_after_first == content_after_second
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
def test_normalizer_untrack_dry_run_returns_diverged(tmp_path: Path) -> None:
|
|
92
|
+
"""dry_run=True reports diverged paths without modifying git index."""
|
|
93
|
+
from unittest.mock import MagicMock, patch
|
|
94
|
+
|
|
95
|
+
from specsmith.sync import _untrack_diverged_paths
|
|
96
|
+
|
|
97
|
+
# Simulate git ls-files returning a tracked workitems.json
|
|
98
|
+
fake_result = MagicMock()
|
|
99
|
+
fake_result.stdout = ".specsmith/workitems.json\n"
|
|
100
|
+
with patch("subprocess.run", return_value=fake_result):
|
|
101
|
+
diverged = _untrack_diverged_paths(tmp_path, dry_run=True)
|
|
102
|
+
|
|
103
|
+
assert ".specsmith/workitems.json" in diverged
|
|
58
104
|
|
|
59
105
|
|
|
60
106
|
def test_save_uses_sqlite_store_backup(tmp_path: Path, monkeypatch: pytest.MonkeyPatch) -> None:
|
|
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
|
{specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/agent/dispatch/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/agent/dispatch/dispatcher.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/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.18.0.dev698 → specsmith-0.18.0.dev709}/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.18.0.dev698 → specsmith-0.18.0.dev709}/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
|
|
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
|
{specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/datasources/patentsview.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
|