specsmith 0.11.3.dev433__tar.gz → 0.11.3.dev435__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.11.3.dev433/src/specsmith.egg-info → specsmith-0.11.3.dev435}/PKG-INFO +1 -1
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/pyproject.toml +1 -1
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/config.py +65 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/phase.py +147 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/skills/devops.py +186 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/skills/governance.py +140 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/tools.py +8 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435/src/specsmith.egg-info}/PKG-INFO +1 -1
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/LICENSE +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/README.md +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/setup.cfg +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/epistemic/__init__.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/epistemic/belief.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/epistemic/certainty.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/epistemic/failure_graph.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/epistemic/py.typed +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/epistemic/recovery.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/epistemic/session.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/epistemic/stress_tester.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/epistemic/trace.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/__init__.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/__main__.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/agent/__init__.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/agent/broker.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/agent/chat_runner.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/agent/cleanup.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/agent/context_seed.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/agent/core.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/agent/dispatch/__init__.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/agent/dispatch/_status.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/agent/dispatch/dag.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/agent/dispatch/dispatcher.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/agent/dispatch/events.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/agent/dispatch/result.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/agent/endpoints.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/agent/events.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/agent/execution_profiles.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/agent/fallback.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/agent/hf_leaderboard.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/agent/hf_sync.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/agent/indexer.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/agent/llm_client.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/agent/mcp.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/agent/memory.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/agent/model_intelligence.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/agent/model_profiles.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/agent/orchestrator.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/agent/permissions.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/agent/profiles.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/agent/provider_registry.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/agent/repl.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/agent/router.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/agent/rules.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/agent/runner.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/agent/safety.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/agent/spawner.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/agent/suggester.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/agent/teams.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/agent/tools.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/agent/verifier.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/agent/voice.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/architect.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/auditor.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/auth.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/block_export.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/channel.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/ci_manager.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/cli.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/commands/__init__.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/commands/intelligence.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/compliance/__init__.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/compliance/_compat.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/compliance/checker.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/compliance/evidence.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/compliance/regulations.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/compliance/reporter.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/compressor.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/console_utils.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/context_orchestrator.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/context_window.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/credit_analyzer.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/credits.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/datasources/__init__.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/datasources/base.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/datasources/citations.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/datasources/fpd.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/datasources/odp.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/datasources/patentsview.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/datasources/pfw.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/datasources/ppubs.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/datasources/ptab.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/differ.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/doctor.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/drive.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/editor.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/epistemic/__init__.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/epistemic/belief.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/epistemic/certainty.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/epistemic/failure_graph.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/epistemic/recovery.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/epistemic/stress_tester.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/esdb/__init__.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/esdb/bridge.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/eval/__init__.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/eval/builtins.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/eval/runner.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/executor.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/exporter.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/governance_logic.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/governance_store.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/governance_yaml.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/gui/__init__.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/gui/app.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/gui/main_window.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/gui/session_tab.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/gui/theme.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/gui/widgets/__init__.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/gui/widgets/chat_view.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/gui/widgets/input_bar.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/gui/widgets/provider_bar.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/gui/widgets/token_meter.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/gui/widgets/tool_panel.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/gui/widgets/update_checker.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/gui/worker.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/history_search.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/importer.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/instinct.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/integrations/__init__.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/integrations/agent_skill.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/integrations/aider.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/integrations/base.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/integrations/claude_code.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/integrations/copilot.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/integrations/cursor.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/integrations/gemini.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/integrations/windsurf.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/issue_reporter.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/languages.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/ledger.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/mcp_generator.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/migrations/__init__.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/migrations/m001_governance_yaml.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/migrations/m002_agents_slim.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/migrations/m003_compliance_init.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/migrations/m004_ledger_esdb.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/migrations/m005_agent_run_tool.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/migrations/runner.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/ollama_cmds.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/patent.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/paths.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/plugins.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/profiles.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/rate_limits.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/releaser.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/requirements.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/requirements_parser.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/retrieval.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/safe_write.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/scaffolder.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/serve.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/session.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/session_init.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/session_store.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/skills/__init__.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/skills/cloud.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/skills/corporate.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/skills/cross_platform.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/skills/docs.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/skills/embedded.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/skills/hardware.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/skills/mobile.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/skills/productivity.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/skills/ssh.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/skills_builder.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/sync.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/templates/agents.md.j2 +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/templates/community/bug_report.md.j2 +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/templates/community/code_of_conduct.md.j2 +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/templates/community/contributing.md.j2 +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/templates/community/feature_request.md.j2 +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/templates/community/license-Apache-2.0.j2 +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/templates/community/license-MIT.j2 +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/templates/community/pull_request_template.md.j2 +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/templates/community/security.md.j2 +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/templates/docs/architecture.md.j2 +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/templates/docs/mkdocs.yml.j2 +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/templates/docs/readthedocs.yaml.j2 +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/templates/docs/requirements.md.j2 +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/templates/docs/test-spec.md.j2 +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/templates/editorconfig.j2 +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/templates/gitattributes.j2 +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/templates/gitignore.j2 +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/templates/go/go.mod.j2 +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/templates/go/main.go.j2 +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/templates/governance/belief-registry.md.j2 +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/templates/governance/context-budget.md.j2 +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/templates/governance/drift-metrics.md.j2 +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/templates/governance/epistemic-axioms.md.j2 +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/templates/governance/failure-modes.md.j2 +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/templates/governance/lifecycle.md.j2 +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/templates/governance/roles.md.j2 +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/templates/governance/rules.md.j2 +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/templates/governance/session-protocol.md.j2 +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/templates/governance/uncertainty-map.md.j2 +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/templates/governance/verification.md.j2 +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/templates/js/package.json.j2 +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/templates/ledger.md.j2 +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/templates/python/cli.py.j2 +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/templates/python/init.py.j2 +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/templates/python/pyproject.toml.j2 +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/templates/readme.md.j2 +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/templates/rust/Cargo.toml.j2 +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/templates/rust/main.rs.j2 +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/templates/scripts/exec.cmd.j2 +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/templates/scripts/exec.sh.j2 +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/templates/scripts/run.cmd.j2 +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/templates/scripts/run.sh.j2 +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/templates/scripts/setup.cmd.j2 +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/templates/scripts/setup.sh.j2 +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/templates/workflows/release.yml.j2 +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/tool_installer.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/toolrules.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/trace.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/updater.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/upgrader.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/validator.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/vcs/__init__.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/vcs/base.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/vcs/bitbucket.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/vcs/github.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/vcs/gitlab.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/vcs_commands.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/wireframes.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith/workspace.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith.egg-info/SOURCES.txt +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith.egg-info/dependency_links.txt +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith.egg-info/entry_points.txt +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith.egg-info/requires.txt +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/src/specsmith.egg-info/top_level.txt +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/tests/test_CMD_001.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/tests/test_agent_profiles.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/tests/test_agent_runner_ready.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/tests/test_ai_client.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/tests/test_ai_intelligence.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/tests/test_auditor.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/tests/test_channel.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/tests/test_chat_diff_decision.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/tests/test_chat_runner_openai_compat.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/tests/test_chat_stdin_protocol.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/tests/test_cli.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/tests/test_cli_workflows_history_drive.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/tests/test_compliance.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/tests/test_compressor.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/tests/test_dispatch.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/tests/test_e2e_nexus.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/tests/test_endpoints_cli.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/tests/test_endpoints_store.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/tests/test_epistemic.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/tests/test_fallback_chain.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/tests/test_importer.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/tests/test_integrations.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/tests/test_intelligence.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/tests/test_issue_reporter.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/tests/test_mcp_client.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/tests/test_new_modules.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/tests/test_nexus.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/tests/test_permissions.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/tests/test_phase1_4_new.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/tests/test_phase34_completion.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/tests/test_rate_limits.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/tests/test_req_248_262.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/tests/test_scaffolder.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/tests/test_skill_marketplace.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/tests/test_skills_mcp.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/tests/test_smoke.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/tests/test_suggester.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/tests/test_tools.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/tests/test_validator.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/tests/test_vcs.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/tests/test_warp_parity.py +0 -0
- {specsmith-0.11.3.dev433 → specsmith-0.11.3.dev435}/tests/test_warp_parity_followup.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: specsmith
|
|
3
|
-
Version: 0.11.3.
|
|
3
|
+
Version: 0.11.3.dev435
|
|
4
4
|
Summary: Applied Epistemic Engineering toolkit — AEE agent sessions, execution profiles, FPGA/HDL governance, tool installer, 50+ CLI commands.
|
|
5
5
|
Author: BitConcepts
|
|
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.11.3.
|
|
7
|
+
version = "0.11.3.dev435"
|
|
8
8
|
description = "Applied Epistemic Engineering toolkit — AEE agent sessions, execution profiles, FPGA/HDL governance, tool installer, 50+ CLI commands."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
license = "MIT"
|
|
@@ -66,6 +66,8 @@ class ProjectType(str, Enum):
|
|
|
66
66
|
EMBEDDED_PYTHON_HMI = "embedded-python-hmi" # #109: hardware-interfacing kiosk/HMI
|
|
67
67
|
RESEARCH_PYTHON = "research-python" # #153: experiment/research packages (no CLI)
|
|
68
68
|
SAFETY_CRITICAL = "safety-critical" # #129: IEC 60204-1/62061/61508 safety-critical
|
|
69
|
+
# IP / Patent
|
|
70
|
+
PATENT_PROSECUTION = "patent-prosecution" # #177: IP prosecution with USPTO MCP lifecycle
|
|
69
71
|
|
|
70
72
|
|
|
71
73
|
class Platform(str, Enum):
|
|
@@ -194,6 +196,67 @@ class ProjectConfig(BaseModel):
|
|
|
194
196
|
),
|
|
195
197
|
)
|
|
196
198
|
|
|
199
|
+
# Fallback type — used when this project type is not yet supported
|
|
200
|
+
# by the installed specsmith version. specsmith silently falls back to
|
|
201
|
+
# this type for scaffolding purposes while still recording the intended type.
|
|
202
|
+
fallback_type: str = Field(
|
|
203
|
+
default="",
|
|
204
|
+
description=(
|
|
205
|
+
"Fallback project type for scaffold generation when `type` is not yet "
|
|
206
|
+
"supported by the installed specsmith version (e.g. 'spec-document' as "
|
|
207
|
+
"fallback for 'patent-prosecution')."
|
|
208
|
+
),
|
|
209
|
+
)
|
|
210
|
+
|
|
211
|
+
# IP prosecution fields (used when type == 'patent-prosecution')
|
|
212
|
+
provisional_app_number: str = Field(
|
|
213
|
+
default="", description="USPTO provisional application number (e.g. '63/980,251')"
|
|
214
|
+
)
|
|
215
|
+
provisional_filed_date: str = Field(
|
|
216
|
+
default="", description="Date the provisional was filed (YYYY-MM-DD)"
|
|
217
|
+
)
|
|
218
|
+
non_provisional_deadline: str = Field(
|
|
219
|
+
default="",
|
|
220
|
+
description="12-month non-provisional conversion deadline (YYYY-MM-DD)",
|
|
221
|
+
)
|
|
222
|
+
entity_status: str = Field(default="", description="USPTO entity status: small, micro, large")
|
|
223
|
+
assignee: str = Field(default="", description="Patent assignee / rights holder")
|
|
224
|
+
counsel: str = Field(default="", description="Patent counsel firm name")
|
|
225
|
+
inventors: list[dict[str, str]] = Field(
|
|
226
|
+
default_factory=list,
|
|
227
|
+
description="List of inventors with name and role keys",
|
|
228
|
+
)
|
|
229
|
+
ip_families: list[dict[str, Any]] = Field(
|
|
230
|
+
default_factory=list,
|
|
231
|
+
description=(
|
|
232
|
+
"IP patent families. Each entry: {id, name, phase, provisional, themes, "
|
|
233
|
+
"anchor_spec, ...}."
|
|
234
|
+
),
|
|
235
|
+
)
|
|
236
|
+
claim_themes: list[dict[str, Any]] = Field(
|
|
237
|
+
default_factory=list,
|
|
238
|
+
description=(
|
|
239
|
+
"Claim themes for the primary IP family. Each entry: {id, name, description, "
|
|
240
|
+
"risk, primary_comparator, last_par_run}."
|
|
241
|
+
),
|
|
242
|
+
)
|
|
243
|
+
specs_dir: str = Field(
|
|
244
|
+
default="docs/ip/specs",
|
|
245
|
+
description="Normative specification directory for IP repos",
|
|
246
|
+
)
|
|
247
|
+
prosecution_dir: str = Field(
|
|
248
|
+
default="docs/ip/prosecution",
|
|
249
|
+
description="Prior-art protocol and prosecution planning directory",
|
|
250
|
+
)
|
|
251
|
+
strategy_dir: str = Field(
|
|
252
|
+
default="docs/ip/strategy",
|
|
253
|
+
description="IP strategy documents directory",
|
|
254
|
+
)
|
|
255
|
+
filings_dir: str = Field(
|
|
256
|
+
default="docs/ip/filings",
|
|
257
|
+
description="Immutable filed artifacts directory",
|
|
258
|
+
)
|
|
259
|
+
|
|
197
260
|
# FPGA-specific
|
|
198
261
|
fpga_vendor: str = Field(
|
|
199
262
|
default="",
|
|
@@ -471,6 +534,8 @@ _TYPE_LABELS: dict[str, str] = {
|
|
|
471
534
|
ProjectType.EMBEDDED_PYTHON_HMI: "Embedded Python HMI / kiosk (hardware-interfacing)",
|
|
472
535
|
ProjectType.RESEARCH_PYTHON: "Research Python (experiments, no CLI distribution)",
|
|
473
536
|
ProjectType.SAFETY_CRITICAL: "Safety-critical embedded (IEC 60204-1/62061/61508)",
|
|
537
|
+
# IP / Patent
|
|
538
|
+
ProjectType.PATENT_PROSECUTION: "Patent prosecution repository (USPTO IP lifecycle)",
|
|
474
539
|
}
|
|
475
540
|
|
|
476
541
|
_SECTION_REFS: dict[str, str] = {
|
|
@@ -398,6 +398,153 @@ PHASES: list[Phase] = [
|
|
|
398
398
|
PHASE_MAP: dict[str, Phase] = {p.key: p for p in PHASES}
|
|
399
399
|
PHASE_ORDER: list[str] = [p.key for p in PHASES]
|
|
400
400
|
|
|
401
|
+
# ---------------------------------------------------------------------------
|
|
402
|
+
# IP Prosecution phases (patent-prosecution project type — issue #177)
|
|
403
|
+
# ---------------------------------------------------------------------------
|
|
404
|
+
|
|
405
|
+
PROSECUTION_PHASES: list[Phase] = [
|
|
406
|
+
Phase(
|
|
407
|
+
key="provisional-draft",
|
|
408
|
+
label="Provisional Draft",
|
|
409
|
+
emoji="\U0001f4dd",
|
|
410
|
+
description="Invention disclosure and provisional specification being written.",
|
|
411
|
+
checks=[
|
|
412
|
+
PhaseCheck("AGENTS.md exists", _file_exists("AGENTS.md")),
|
|
413
|
+
PhaseCheck("docs/ip/specs/ exists", _file_exists("docs/ip/specs")),
|
|
414
|
+
PhaseCheck("scaffold.yml has ip_families field", _scaffold_field("ip_families")),
|
|
415
|
+
],
|
|
416
|
+
commands=["specsmith audit", 'specsmith ledger add "Provisional draft in progress"'],
|
|
417
|
+
next_phase="filing",
|
|
418
|
+
),
|
|
419
|
+
Phase(
|
|
420
|
+
key="filing",
|
|
421
|
+
label="Filing",
|
|
422
|
+
emoji="\U0001f4e8",
|
|
423
|
+
description="Provisional application prepared and submitted to USPTO.",
|
|
424
|
+
checks=[
|
|
425
|
+
PhaseCheck("docs/ip/filings/ exists", _file_exists("docs/ip/filings")),
|
|
426
|
+
PhaseCheck(
|
|
427
|
+
"scaffold.yml has provisional_app_number",
|
|
428
|
+
_scaffold_field("provisional_app_number"),
|
|
429
|
+
),
|
|
430
|
+
PhaseCheck(
|
|
431
|
+
"scaffold.yml has provisional_filed_date",
|
|
432
|
+
_scaffold_field("provisional_filed_date"),
|
|
433
|
+
),
|
|
434
|
+
],
|
|
435
|
+
commands=[
|
|
436
|
+
'specsmith ledger add "Provisional filed at USPTO — App. <number>"',
|
|
437
|
+
'specsmith trace seal milestone "Provisional filed"',
|
|
438
|
+
],
|
|
439
|
+
next_phase="prior-art-search",
|
|
440
|
+
),
|
|
441
|
+
Phase(
|
|
442
|
+
key="prior-art-search",
|
|
443
|
+
label="Prior-Art Search",
|
|
444
|
+
emoji="\U0001f50e",
|
|
445
|
+
description="Systematic prior-art protocol executed across all claim themes.",
|
|
446
|
+
checks=[
|
|
447
|
+
PhaseCheck(
|
|
448
|
+
"scaffold.yml has provisional_app_number",
|
|
449
|
+
_scaffold_field("provisional_app_number"),
|
|
450
|
+
),
|
|
451
|
+
PhaseCheck(
|
|
452
|
+
"LEDGER.md has PAR run entry",
|
|
453
|
+
lambda root: any(
|
|
454
|
+
"PAR-" in (root / c).read_text(encoding="utf-8", errors="ignore")
|
|
455
|
+
for c in ["docs/LEDGER.md", "LEDGER.md"]
|
|
456
|
+
if (root / c).exists()
|
|
457
|
+
),
|
|
458
|
+
),
|
|
459
|
+
PhaseCheck("docs/ip/prosecution/ exists", _file_exists("docs/ip/prosecution")),
|
|
460
|
+
],
|
|
461
|
+
commands=[
|
|
462
|
+
"prior-art protocol: start Themes A-H (USPTO MCP)",
|
|
463
|
+
'specsmith ledger add "PAR-YYYY-MM-DD-001 complete — Themes A-H"',
|
|
464
|
+
],
|
|
465
|
+
next_phase="claim-hardening",
|
|
466
|
+
),
|
|
467
|
+
Phase(
|
|
468
|
+
key="claim-hardening",
|
|
469
|
+
label="Claim Hardening",
|
|
470
|
+
emoji="\U0001f527",
|
|
471
|
+
description="Claim language refined based on prior-art findings; §101/§102/§103 addressed.",
|
|
472
|
+
checks=[
|
|
473
|
+
PhaseCheck(
|
|
474
|
+
"LEDGER.md has PAR run entry",
|
|
475
|
+
lambda root: any(
|
|
476
|
+
"PAR-" in (root / c).read_text(encoding="utf-8", errors="ignore")
|
|
477
|
+
for c in ["docs/LEDGER.md", "LEDGER.md"]
|
|
478
|
+
if (root / c).exists()
|
|
479
|
+
),
|
|
480
|
+
),
|
|
481
|
+
PhaseCheck("docs/ip/specs/ has content", _file_min_lines("docs/ip/specs", 1)),
|
|
482
|
+
PhaseCheck("docs/ip/strategy/ exists", _file_exists("docs/ip/strategy")),
|
|
483
|
+
],
|
|
484
|
+
commands=[
|
|
485
|
+
'specsmith ledger add "Claim hardening session — Theme <X> hardened"',
|
|
486
|
+
'specsmith trace seal decision "Claim strategy approved by counsel"',
|
|
487
|
+
],
|
|
488
|
+
next_phase="non-provisional-draft",
|
|
489
|
+
),
|
|
490
|
+
Phase(
|
|
491
|
+
key="non-provisional-draft",
|
|
492
|
+
label="Non-Provisional Draft",
|
|
493
|
+
emoji="\U0001f4c4",
|
|
494
|
+
description="Anchor non-provisional and continuation drafts being prepared by counsel.",
|
|
495
|
+
checks=[
|
|
496
|
+
PhaseCheck(
|
|
497
|
+
"scaffold.yml has non_provisional_deadline",
|
|
498
|
+
_scaffold_field("non_provisional_deadline"),
|
|
499
|
+
),
|
|
500
|
+
PhaseCheck("docs/ip/filings/ exists", _file_exists("docs/ip/filings")),
|
|
501
|
+
PhaseCheck("docs/ip/strategy/ exists", _file_exists("docs/ip/strategy")),
|
|
502
|
+
],
|
|
503
|
+
commands=[
|
|
504
|
+
'specsmith ledger add "Non-provisional draft v<N> submitted to counsel"',
|
|
505
|
+
],
|
|
506
|
+
next_phase="examination",
|
|
507
|
+
),
|
|
508
|
+
Phase(
|
|
509
|
+
key="examination",
|
|
510
|
+
label="Examination",
|
|
511
|
+
emoji="\U0001f50d",
|
|
512
|
+
description="Application under examination at USPTO. Responding to office actions.",
|
|
513
|
+
checks=[
|
|
514
|
+
PhaseCheck("docs/ip/filings/ exists", _file_exists("docs/ip/filings")),
|
|
515
|
+
PhaseCheck(
|
|
516
|
+
"scaffold.yml has provisional_app_number",
|
|
517
|
+
_scaffold_field("provisional_app_number"),
|
|
518
|
+
),
|
|
519
|
+
],
|
|
520
|
+
commands=[
|
|
521
|
+
'specsmith ledger add "OA response filed — <date>"',
|
|
522
|
+
'specsmith trace seal milestone "Office action response submitted"',
|
|
523
|
+
],
|
|
524
|
+
next_phase="allowance",
|
|
525
|
+
),
|
|
526
|
+
Phase(
|
|
527
|
+
key="allowance",
|
|
528
|
+
label="Allowance",
|
|
529
|
+
emoji="\u2705",
|
|
530
|
+
description="Patent allowed or continuation strategy in execution.",
|
|
531
|
+
checks=[
|
|
532
|
+
PhaseCheck("docs/ip/filings/ exists", _file_exists("docs/ip/filings")),
|
|
533
|
+
PhaseCheck("Trace vault has seals", _trace_vault_exists()),
|
|
534
|
+
],
|
|
535
|
+
commands=[
|
|
536
|
+
'specsmith ledger add "NOA received — patent allowed"',
|
|
537
|
+
'specsmith trace seal milestone "Patent allowed"',
|
|
538
|
+
],
|
|
539
|
+
next_phase=None,
|
|
540
|
+
),
|
|
541
|
+
]
|
|
542
|
+
|
|
543
|
+
# Merge prosecution phases into PHASE_MAP so read_phase() can find them.
|
|
544
|
+
# Prosecution phases are intentionally NOT in PHASE_ORDER (the AEE sequence).
|
|
545
|
+
PROSECUTION_PHASE_MAP: dict[str, Phase] = {p.key: p for p in PROSECUTION_PHASES}
|
|
546
|
+
PHASE_MAP.update(PROSECUTION_PHASE_MAP)
|
|
547
|
+
|
|
401
548
|
|
|
402
549
|
# ---------------------------------------------------------------------------
|
|
403
550
|
# scaffold.yml I/O
|
|
@@ -4,6 +4,192 @@
|
|
|
4
4
|
from specsmith.skills import SkillDomain, SkillEntry
|
|
5
5
|
|
|
6
6
|
SKILLS: list[SkillEntry] = [
|
|
7
|
+
SkillEntry(
|
|
8
|
+
slug="github-health-check",
|
|
9
|
+
name="GitHub Health Check — CI/PR/security/code-quality triage",
|
|
10
|
+
description=(
|
|
11
|
+
"Systematic triage playbook for GitHub repository health: CI failures, "
|
|
12
|
+
"open PRs and review status, CodeQL security alerts, Dependabot alerts, "
|
|
13
|
+
"and code quality issues. Uses gh CLI and gh api exclusively."
|
|
14
|
+
),
|
|
15
|
+
domain=SkillDomain.DEVOPS,
|
|
16
|
+
tags=[
|
|
17
|
+
"ci",
|
|
18
|
+
"github",
|
|
19
|
+
"security",
|
|
20
|
+
"codeql",
|
|
21
|
+
"dependabot",
|
|
22
|
+
"pr",
|
|
23
|
+
"triage",
|
|
24
|
+
"alerts",
|
|
25
|
+
"code-quality",
|
|
26
|
+
"gh",
|
|
27
|
+
],
|
|
28
|
+
platforms=["linux", "windows", "macos"],
|
|
29
|
+
prerequisites=["gh"],
|
|
30
|
+
body="""\
|
|
31
|
+
# GitHub Health Check Skill
|
|
32
|
+
|
|
33
|
+
## Triage order (always run in this sequence)
|
|
34
|
+
1. **CI status** — are the latest runs passing?
|
|
35
|
+
2. **Open PRs** — any blocked, unreviewed, or failing PRs?
|
|
36
|
+
3. **CodeQL / security alerts** — any open code-scanning alerts?
|
|
37
|
+
4. **Dependabot alerts** — any vulnerable dependencies?
|
|
38
|
+
5. **Code quality / policy violations** — any rule violations?
|
|
39
|
+
|
|
40
|
+
---
|
|
41
|
+
|
|
42
|
+
## 1. CI status
|
|
43
|
+
```bash
|
|
44
|
+
# Latest runs on a branch (all workflows)
|
|
45
|
+
gh run list --repo <owner>/<repo> --branch <branch> --limit 5
|
|
46
|
+
|
|
47
|
+
# Check conclusion of the single latest run
|
|
48
|
+
gh run list --repo <owner>/<repo> --branch <branch> --limit 1 --json conclusion,status,name,databaseId
|
|
49
|
+
|
|
50
|
+
# View failure logs for the latest failed run
|
|
51
|
+
gh run view --repo <owner>/<repo> --log-failed \
|
|
52
|
+
$(gh run list --repo <owner>/<repo> --branch <branch> --limit 1 --json databaseId --jq '.[0].databaseId')
|
|
53
|
+
|
|
54
|
+
# Wait for a specific run (never use sleep)
|
|
55
|
+
gh run watch --repo <owner>/<repo> <run-id>
|
|
56
|
+
```
|
|
57
|
+
```pwsh
|
|
58
|
+
# PowerShell
|
|
59
|
+
$runId = (gh run list --repo <owner>/<repo> --branch <branch> --limit 1 --json databaseId | ConvertFrom-Json).databaseId
|
|
60
|
+
gh run watch --repo <owner>/<repo> $runId
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
**Reading status:**
|
|
64
|
+
- `conclusion: success` — green
|
|
65
|
+
- `conclusion: failure` — red; use `--log-failed` to triage
|
|
66
|
+
- `conclusion: null` + `status: in_progress` — still running; use `gh run watch`
|
|
67
|
+
- `conclusion: cancelled` — was aborted; re-run if stale
|
|
68
|
+
|
|
69
|
+
---
|
|
70
|
+
|
|
71
|
+
## 2. Open PRs and review status
|
|
72
|
+
```bash
|
|
73
|
+
# List all open PRs with review state
|
|
74
|
+
gh pr list --repo <owner>/<repo> --state open --json number,title,reviewDecision,statusCheckRollup,author
|
|
75
|
+
|
|
76
|
+
# PRs with failed CI
|
|
77
|
+
gh pr list --repo <owner>/<repo> --state open --json number,title,statusCheckRollup \
|
|
78
|
+
--jq '[.[] | select(.statusCheckRollup[] | .conclusion == "FAILURE")]'
|
|
79
|
+
|
|
80
|
+
# PRs awaiting review (no decision yet)
|
|
81
|
+
gh pr list --repo <owner>/<repo> --state open --json number,title,reviewDecision \
|
|
82
|
+
--jq '[.[] | select(.reviewDecision == null or .reviewDecision == "REVIEW_REQUIRED")]'
|
|
83
|
+
|
|
84
|
+
# Full PR detail
|
|
85
|
+
gh pr view <number> --repo <owner>/<repo>
|
|
86
|
+
gh pr checks <number> --repo <owner>/<repo> # all CI check results for a PR
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
**Review decision values:**
|
|
90
|
+
- `APPROVED` — at least one approval, no blockers
|
|
91
|
+
- `CHANGES_REQUESTED` — blocked by reviewer
|
|
92
|
+
- `REVIEW_REQUIRED` — no reviews yet
|
|
93
|
+
- `null` — no review policy configured
|
|
94
|
+
|
|
95
|
+
---
|
|
96
|
+
|
|
97
|
+
## 3. CodeQL / code-scanning alerts
|
|
98
|
+
```bash
|
|
99
|
+
# All open code-scanning (CodeQL) alerts
|
|
100
|
+
gh api /repos/<owner>/<repo>/code-scanning/alerts?state=open --paginate \
|
|
101
|
+
--jq '.[] | {number: .number, rule: .rule.id, severity: .rule.severity, file: .most_recent_instance.location.path}'
|
|
102
|
+
|
|
103
|
+
# High/critical only
|
|
104
|
+
gh api "/repos/<owner>/<repo>/code-scanning/alerts?state=open&severity=high" --paginate
|
|
105
|
+
gh api "/repos/<owner>/<repo>/code-scanning/alerts?state=open&severity=critical" --paginate
|
|
106
|
+
|
|
107
|
+
# Dismiss a false-positive alert (requires security_events permission)
|
|
108
|
+
gh api --method PATCH /repos/<owner>/<repo>/code-scanning/alerts/<number> \
|
|
109
|
+
-f dismissed_reason='false positive' \
|
|
110
|
+
-f dismissed_comment='CodeQL does not track custom sanitizer <function_name>'
|
|
111
|
+
|
|
112
|
+
# Alert count summary
|
|
113
|
+
gh api /repos/<owner>/<repo>/code-scanning/alerts?state=open --paginate --jq 'length'
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
**Severity triage order:** `critical` → `high` → `error` → `warning` → `note`
|
|
117
|
+
|
|
118
|
+
---
|
|
119
|
+
|
|
120
|
+
## 4. Dependabot alerts
|
|
121
|
+
```bash
|
|
122
|
+
# All open Dependabot vulnerability alerts
|
|
123
|
+
gh api /repos/<owner>/<repo>/dependabot/alerts?state=open --paginate \
|
|
124
|
+
--jq '.[] | {number: .number, severity: .security_advisory.severity, package: .dependency.package.name, cve: .security_advisory.cve_id}'
|
|
125
|
+
|
|
126
|
+
# Critical/high only
|
|
127
|
+
gh api "/repos/<owner>/<repo>/dependabot/alerts?state=open&severity=critical" --paginate
|
|
128
|
+
gh api "/repos/<owner>/<repo>/dependabot/alerts?state=open&severity=high" --paginate
|
|
129
|
+
|
|
130
|
+
# Check for auto-generated Dependabot PRs
|
|
131
|
+
gh pr list --repo <owner>/<repo> --author 'dependabot[bot]' --state open
|
|
132
|
+
|
|
133
|
+
# Dismiss an alert (requires correct permission)
|
|
134
|
+
gh api --method PATCH /repos/<owner>/<repo>/dependabot/alerts/<number> \
|
|
135
|
+
-f state=dismissed \
|
|
136
|
+
-f dismissed_reason='tolerable_risk' \
|
|
137
|
+
-f dismissed_comment='Not reachable in production'
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
**Severity triage order:** `critical` → `high` → `medium` → `low`
|
|
141
|
+
|
|
142
|
+
---
|
|
143
|
+
|
|
144
|
+
## 5. Code quality / policy violations
|
|
145
|
+
```bash
|
|
146
|
+
# Repository rule violations (branch protection)
|
|
147
|
+
gh api /repos/<owner>/<repo>/rules/branches/<branch> 2>/dev/null | \
|
|
148
|
+
jq '.rules[] | {type: .type, enforcement: .enforcement}'
|
|
149
|
+
|
|
150
|
+
# Recent workflow runs with bypass violations
|
|
151
|
+
gh run list --repo <owner>/<repo> --limit 20 --json event,conclusion,displayTitle \
|
|
152
|
+
--jq '[.[] | select(.conclusion == "failure")]'
|
|
153
|
+
|
|
154
|
+
# Check branch protection status
|
|
155
|
+
gh api /repos/<owner>/<repo>/branches/<branch>/protection 2>/dev/null
|
|
156
|
+
|
|
157
|
+
# Secret scanning alerts (requires advanced security)
|
|
158
|
+
gh api /repos/<owner>/<repo>/secret-scanning/alerts?state=open 2>/dev/null --paginate
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
---
|
|
162
|
+
|
|
163
|
+
## Full health snapshot (one-shot)
|
|
164
|
+
```bash
|
|
165
|
+
#!/usr/bin/env bash
|
|
166
|
+
REPO="<owner>/<repo>"
|
|
167
|
+
BRANCH="<branch>"
|
|
168
|
+
|
|
169
|
+
echo "=== CI (latest 3 runs) ==="
|
|
170
|
+
gh run list --repo $REPO --branch $BRANCH --limit 3
|
|
171
|
+
|
|
172
|
+
echo "=== Open PRs ==="
|
|
173
|
+
gh pr list --repo $REPO --state open --json number,title,reviewDecision,author \
|
|
174
|
+
--jq '.[] | "#\\(.number) \\(.title) [\\(.reviewDecision // "NO_REVIEW")] by \\(.author.login)"'
|
|
175
|
+
|
|
176
|
+
echo "=== CodeQL alerts (open) ==="
|
|
177
|
+
gh api /repos/$REPO/code-scanning/alerts?state=open --paginate --jq 'length'
|
|
178
|
+
|
|
179
|
+
echo "=== Dependabot alerts (open) ==="
|
|
180
|
+
gh api /repos/$REPO/dependabot/alerts?state=open --paginate --jq 'length' 2>/dev/null || echo "N/A"
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
---
|
|
184
|
+
|
|
185
|
+
## Key rules
|
|
186
|
+
- **Always triage in order**: CI → PRs → CodeQL → Dependabot → policy.
|
|
187
|
+
- Never dismiss a CodeQL alert as false positive without a specific comment explaining why.
|
|
188
|
+
- Dependabot `tolerable_risk` dismissals require a comment with the CVE and reachability rationale.
|
|
189
|
+
- `gh api` requires the `repo` or `security_events` scope depending on alert type.
|
|
190
|
+
- Check `gh auth status` first if any API calls return 401/403.
|
|
191
|
+
""",
|
|
192
|
+
),
|
|
7
193
|
SkillEntry(
|
|
8
194
|
slug="github-actions-ci",
|
|
9
195
|
name="GitHub Actions CI — Layer1Labs pattern (zero-trust, parallel, coverage-gated)",
|
|
@@ -390,6 +390,146 @@ gh run list --repo <owner>/<repo> --branch <branch> --limit 1 --json databaseId,
|
|
|
390
390
|
"""
|
|
391
391
|
),
|
|
392
392
|
),
|
|
393
|
+
SkillEntry(
|
|
394
|
+
slug="patent-prosecution-workflow",
|
|
395
|
+
name="Patent Prosecution Workflow — prior-art protocol, USPTO MCP, claim themes",
|
|
396
|
+
description=(
|
|
397
|
+
"IP prosecution workflow for patent-prosecution type projects: prior-art protocol "
|
|
398
|
+
"execution, USPTO MCP server selection, PPUBS\u2192PatentsView fallback, PAR ID "
|
|
399
|
+
"assignment, claim theme tracking, and ledger entry format."
|
|
400
|
+
),
|
|
401
|
+
domain=SkillDomain.GOVERNANCE,
|
|
402
|
+
tags=[
|
|
403
|
+
"patent",
|
|
404
|
+
"patent-prosecution",
|
|
405
|
+
"prior-art",
|
|
406
|
+
"uspto",
|
|
407
|
+
"mcp",
|
|
408
|
+
"ppubs",
|
|
409
|
+
"patentsview",
|
|
410
|
+
"claim-themes",
|
|
411
|
+
"ip",
|
|
412
|
+
"par",
|
|
413
|
+
],
|
|
414
|
+
prerequisites=[],
|
|
415
|
+
body="""\
|
|
416
|
+
# Patent Prosecution Workflow Skill
|
|
417
|
+
|
|
418
|
+
For use with `type: patent-prosecution` projects (e.g. cpsc-core).
|
|
419
|
+
All MCP tool outputs are INFORMATIONAL. Never alter normative specifications
|
|
420
|
+
based on MCP output. No legal conclusions from tool output.
|
|
421
|
+
|
|
422
|
+
## Prior-art protocol trigger
|
|
423
|
+
|
|
424
|
+
When a user issues a command beginning with `prior-art protocol:`, follow
|
|
425
|
+
this sequence:
|
|
426
|
+
|
|
427
|
+
1. Re-read the current protocol text from `docs/ip/prosecution/` and `docs/ip/strategy/`.
|
|
428
|
+
2. Identify which themes/claims are covered and which MCP sources are available.
|
|
429
|
+
3. Execute the relevant portions using the appropriate MCP servers (see selection below).
|
|
430
|
+
4. Assign a Run ID: `PAR-YYYY-MM-DD-NNN` (e.g. `PAR-2026-05-19-001`).
|
|
431
|
+
5. Append a ledger entry (see format below).
|
|
432
|
+
|
|
433
|
+
Recognised command patterns (not a closed list):
|
|
434
|
+
```
|
|
435
|
+
prior-art protocol: start Themes A-H (PPUBS only)
|
|
436
|
+
prior-art protocol: start Themes A-H (PTAB+PFW+CitA only)
|
|
437
|
+
prior-art protocol: status (USPTO MCP)
|
|
438
|
+
prior-art protocol: rerun since <reason> (USPTO MCP)
|
|
439
|
+
```
|
|
440
|
+
|
|
441
|
+
## MCP server selection matrix
|
|
442
|
+
|
|
443
|
+
| Need | Server |
|
|
444
|
+
|---|---|
|
|
445
|
+
| Front-door full-text patent search | `patents` (PPUBS / PatentsView) |
|
|
446
|
+
| PatentsView landscape query (CPC) | `patents` (`patentsview_search_by_cpc`) |
|
|
447
|
+
| PTAB trial / appeal research | `uspto_ptab` |
|
|
448
|
+
| File-wrapper, claim evolution, NOAs, office actions, examiner citations | `uspto_pfw` |
|
|
449
|
+
| Final petition decisions | `uspto_fpd` |
|
|
450
|
+
| Enriched citation analysis | `uspto_enriched_citations` |
|
|
451
|
+
|
|
452
|
+
For theme-based prior-art protocols: treat `uspto_ptab`, `uspto_pfw`, `uspto_fpd`,
|
|
453
|
+
`uspto_enriched_citations` as **primary** structured sources. Treat `patents`
|
|
454
|
+
(PPUBS/PatentsView) as **complementary** front-door search.
|
|
455
|
+
|
|
456
|
+
## PPUBS → PatentsView fallback
|
|
457
|
+
|
|
458
|
+
When `patents` MCP returns HTTP 500 `INTERNAL_SERVER_ERROR` with
|
|
459
|
+
`"Unable to Process"` developer message:
|
|
460
|
+
|
|
461
|
+
1. This is an **upstream PPUBS service issue** — not a misconfiguration.
|
|
462
|
+
2. Immediately fall back to `patentsview_search_patents` (or `patentsview_search_by_cpc`).
|
|
463
|
+
3. Continue the protocol using PatentsView + USPTO v3 MCP servers.
|
|
464
|
+
4. Note explicitly in the response: *PPUBS 500 — results based on PatentsView / USPTO MCP*.
|
|
465
|
+
|
|
466
|
+
PPUBS 500s MUST NOT block prior-art protocol execution.
|
|
467
|
+
|
|
468
|
+
## Claim theme tracking
|
|
469
|
+
|
|
470
|
+
Themes are defined in `scaffold.yml` under `claim_themes`. Each theme has:
|
|
471
|
+
- `id` — letter (A, B, C...)
|
|
472
|
+
- `name` — human description
|
|
473
|
+
- `risk` — `101-alice`, `103-low`, `103-moderate-high`, `none`, etc.
|
|
474
|
+
- `primary_comparator` — US patent number or null
|
|
475
|
+
- `last_par_run` — PAR ID of the most recent covering run
|
|
476
|
+
|
|
477
|
+
Before running a protocol, check which themes have stale `last_par_run`
|
|
478
|
+
values (run predates the most recent spec update).
|
|
479
|
+
|
|
480
|
+
## PAR ID format
|
|
481
|
+
|
|
482
|
+
```
|
|
483
|
+
PAR-YYYY-MM-DD-NNN
|
|
484
|
+
PAR-2026-05-19-001 # first run on 2026-05-19
|
|
485
|
+
PAR-2026-05-19-002 # second run same day
|
|
486
|
+
```
|
|
487
|
+
|
|
488
|
+
Increment NNN by scanning existing PAR entries in `docs/LEDGER.md`.
|
|
489
|
+
|
|
490
|
+
## Ledger entry format (append to docs/LEDGER.md)
|
|
491
|
+
|
|
492
|
+
```markdown
|
|
493
|
+
## PAR-YYYY-MM-DD-NNN — Prior-Art Run
|
|
494
|
+
|
|
495
|
+
- **Date**: YYYY-MM-DD
|
|
496
|
+
- **Trigger**: <user command or reason>
|
|
497
|
+
- **Themes**: A, B, C (or ALL)
|
|
498
|
+
- **MCP sources**: PPUBS, PatentsView, uspto_ptab, uspto_pfw, uspto_fpd, uspto_enriched_citations
|
|
499
|
+
- **Risk levels**: Theme A: 101-alice — Theme B: 103-moderate-high — ...
|
|
500
|
+
- **Conclusion summary**: <1-3 sentence summary of findings>
|
|
501
|
+
- **Stale themes post-run**: <list any themes needing re-run or NONE>
|
|
502
|
+
```
|
|
503
|
+
|
|
504
|
+
## Prosecution phases (patent-prosecution lifecycle)
|
|
505
|
+
|
|
506
|
+
| Phase | Key milestone |
|
|
507
|
+
|---|---|
|
|
508
|
+
| `provisional-draft` | Invention disclosure written; at least one embodiment documented |
|
|
509
|
+
| `filing` | Filed PDF in `docs/ip/filings/`; SHA-256 recorded in LEDGER.md |
|
|
510
|
+
| `prior-art-search` | All themes searched; each has ≥1 PAR run; risk levels assigned |
|
|
511
|
+
| `claim-hardening` | PAR findings applied to draft claims; counsel reviewed |
|
|
512
|
+
| `non-provisional-draft` | Draft complete; figures rendered; claim set approved by counsel |
|
|
513
|
+
| `examination` | Filed non-provisional; examiner assigned; responding to OAs |
|
|
514
|
+
| `allowance` | NOA received OR continuation filed |
|
|
515
|
+
|
|
516
|
+
## Roles (agents in IP repos)
|
|
517
|
+
|
|
518
|
+
| Role | What they may do |
|
|
519
|
+
|---|---|
|
|
520
|
+
| **Spec Drafter** | Draft spec text; NOT finalize |
|
|
521
|
+
| **Reviewer** | Analyze, comment; NOT modify normative text |
|
|
522
|
+
| **Example Generator** | Non-normative folders only |
|
|
523
|
+
| **Implementation Assistant** | Cannot modify specs |
|
|
524
|
+
|
|
525
|
+
## Invariants (NEVER violate)
|
|
526
|
+
- No legal conclusions from MCP tool output.
|
|
527
|
+
- No new semantics introduced without inventor approval.
|
|
528
|
+
- Filed artifacts in `docs/ip/filings/` are immutable.
|
|
529
|
+
- Normative content lives under `docs/ip/specs/` only.
|
|
530
|
+
- Experiment data belongs in `cpsc-engine-rtl`, not cpsc-core.
|
|
531
|
+
""",
|
|
532
|
+
),
|
|
393
533
|
SkillEntry(
|
|
394
534
|
slug="issue-triage",
|
|
395
535
|
name="Issue Triage — classify and prioritise GitHub issues",
|
|
@@ -311,6 +311,14 @@ _TOOL_REGISTRY: dict[ProjectType, ToolSet] = {
|
|
|
311
311
|
build=["vivado -mode batch"],
|
|
312
312
|
format=["ruff format"],
|
|
313
313
|
),
|
|
314
|
+
# --- IP / Patent prosecution ---
|
|
315
|
+
ProjectType.PATENT_PROSECUTION: ToolSet(
|
|
316
|
+
lint=["vale", "cspell"],
|
|
317
|
+
format=["prettier"],
|
|
318
|
+
build=["pandoc"],
|
|
319
|
+
compliance=["specsmith trace verify", "claim-ref-check"],
|
|
320
|
+
test=["markdown-link-check"],
|
|
321
|
+
),
|
|
314
322
|
# --- AEE / Epistemic project types ---
|
|
315
323
|
ProjectType.EPISTEMIC_PIPELINE: ToolSet(
|
|
316
324
|
lint=["ruff check", "specsmith stress-test"],
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: specsmith
|
|
3
|
-
Version: 0.11.3.
|
|
3
|
+
Version: 0.11.3.dev435
|
|
4
4
|
Summary: Applied Epistemic Engineering toolkit — AEE agent sessions, execution profiles, FPGA/HDL governance, tool installer, 50+ CLI commands.
|
|
5
5
|
Author: BitConcepts
|
|
6
6
|
License-Expression: MIT
|
|
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
|