diff --git a/.github/agents/architect.agent.md b/.github/agents/architect.agent.md index 5148f163..b2f2d339 100644 --- a/.github/agents/architect.agent.md +++ b/.github/agents/architect.agent.md @@ -227,4 +227,4 @@ Keep this list lean. Use additional installed domain skills only when needed. - `@#threat-model` — design-time threat modeling (STRIDE-first, with DREAD/PASTA as needed) - + diff --git a/.github/agents/designer.agent.md b/.github/agents/designer.agent.md index 40e5cfd8..dbc08ac4 100644 --- a/.github/agents/designer.agent.md +++ b/.github/agents/designer.agent.md @@ -241,4 +241,4 @@ Keep this list lean. Use additional installed domain skills only when needed. - `@#simplify` — simplify proposals and designs while preserving required outcomes - + diff --git a/.github/agents/engineer.agent.md b/.github/agents/engineer.agent.md index 0bf301b1..441c7422 100644 --- a/.github/agents/engineer.agent.md +++ b/.github/agents/engineer.agent.md @@ -228,4 +228,4 @@ Keep this list lean. Use additional installed domain skills only when needed. - `@#verify` — run tests, fix issues, re-verify loop - + diff --git a/.github/agents/planner.agent.md b/.github/agents/planner.agent.md index b47ccfc0..5e609943 100644 --- a/.github/agents/planner.agent.md +++ b/.github/agents/planner.agent.md @@ -291,4 +291,4 @@ that requires changes to upstream items, flag it and trigger a reverse handoff. - `@#simplify` - simplify stage plans and handoffs while preserving gate requirements - + diff --git a/.github/agents/product.agent.md b/.github/agents/product.agent.md index 3b135237..f18b86f4 100644 --- a/.github/agents/product.agent.md +++ b/.github/agents/product.agent.md @@ -213,4 +213,4 @@ Keep this list lean. Use additional installed domain skills only when needed. - `@#vision` — vision document writing and review - + diff --git a/.github/agents/release.agent.md b/.github/agents/release.agent.md index 9d803278..cda0452a 100644 --- a/.github/agents/release.agent.md +++ b/.github/agents/release.agent.md @@ -203,4 +203,4 @@ Keep this list lean. Use additional installed domain skills only when needed. - `@#simplify` — simplify release scope and release steps while preserving controls - + diff --git a/.github/agents/tester.agent.md b/.github/agents/tester.agent.md index fa6dfc53..bf2186f0 100644 --- a/.github/agents/tester.agent.md +++ b/.github/agents/tester.agent.md @@ -220,4 +220,4 @@ Keep this list lean. Use additional installed domain skills only when needed. - `@#threat-model` — structured threat analysis and mitigation prioritization - + diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md index 4785cd29..0866e62c 100644 --- a/.github/copilot-instructions.md +++ b/.github/copilot-instructions.md @@ -17,23 +17,22 @@ vstack provides structured skills for backend/microservice development, executab - Agents are for roles and handoffs. - Skills are for reusable procedures. - Instructions are for always-on policies. -- Prompts are for one-shot task framing. - Hooks are for repository-level automation. When proposals span multiple artifact types, split them into small independent changes. ## Reasoning & Critical Thinking -Evidence-based reasoning is available as an explicit opt-in framework via `prompt/reasoning`. +Evidence-based reasoning is available as an explicit opt-in framework via `skill/reasoning`. -When `prompt/reasoning` is invoked, apply these principles: +When `skill/reasoning` is invoked, apply these principles: - **Truth > agreement** — evaluate correctness, not user preference - **Evidence > opinion** — support claims with facts, logic, or explicit assumptions - **Critical thinking > people-pleasing** — challenge premises before accepting them -For structured adversarial review workflows, agents invoke `skill/advise`, which can reference `prompt/reasoning` when deeper critical analysis is needed. +For structured adversarial review workflows, agents invoke `skill/advise`, which can reference `skill/reasoning` when deeper critical analysis is needed. -**For downstream users:** Add `prompt/reasoning` to your vstack installation (in your `.vstack/vstack.json` manifest or via your preferred vstack distribution mechanism), then run `vstack install` to generate `.github/prompts/reasoning.prompt.md` in your repository. Agents and skills can invoke it by reference. +**For downstream users:** Run `vstack install` to generate `.github/skills/reasoning/SKILL.md`, then invoke `/reasoning` explicitly when needed. The install manifest is generated state, not a hand-edited selection file. ## System Structure @@ -47,24 +46,26 @@ src/vstack/_templates/ ├── agents// │ ├── template.md ← agent instructions body │ └── config.yaml ← agent frontmatter fields -├── instructions// -│ ├── template.md ← instruction file body -│ └── config.yaml -└── prompts// - ├── template.md ← prompt file body +└── instructions// + ├── template.md ← instruction file body └── config.yaml docs/ ← overview.md, design.md, skills.md, workflow.md, roadmap.md, adr/ -.github/ ← generated output (never edit directly*) +.github/ ← generated output plus hand-authored exceptions* ├── skills//SKILL.md ├── agents/.agent.md -├── instructions/.instructions.md -└── prompts/.prompt.md +└── instructions/.instructions.md .vstack/ ← project-scope vstack state and config └── vstack.json ← install manifest (generated) ``` *Hand-authored exceptions in `.github/`: `copilot-instructions.md`, `CODEOWNERS`, -`PULL_REQUEST_TEMPLATE/`, `ISSUE_TEMPLATE/`, `workflows/`. +`PULL_REQUEST_TEMPLATE/`, `ISSUE_TEMPLATE/`, `workflows/`, and repository-only skills +such as `skills/artifact-integrity/SKILL.md`. + +Repository-only skills live directly in `.github/skills//SKILL.md`. +They have no template under `src/vstack/_templates/`, no generation footer, and no +entry in `.vstack/vstack.json`. They are not packaged or installed for consumers. +Edit these files directly; the template-first rules apply only to distributed artifacts. Generated files are written to `.github/` at install time: @@ -76,14 +77,14 @@ python3 -m vstack install When vstack is installed inside its own repo (`.github/agents/` and `.github/skills/` exist): -**Source of truth is always in `src/vstack/_templates/`.** After every change: +**Source of truth for distributed artifacts is in `src/vstack/_templates/`.** +Repository-only skills are hand-authored exceptions. After every template change: | What changed | Command to run | |---|---| | `src/vstack/_templates/agents//config.yaml` or `template.md` | `python3 -m vstack install` | | `src/vstack/_templates/skills//template.md` or `_partials/*.md` | `python3 -m vstack install` | | `src/vstack/_templates/instructions//template.md` | `python3 -m vstack install` | -| `src/vstack/_templates/prompts//template.md` | `python3 -m vstack install` | A single command handles all artifact types: @@ -91,7 +92,7 @@ A single command handles all artifact types: python3 -m vstack install ``` -Never edit `.github/agents/`, `.github/skills/`, `.github/instructions/`, or `.github/prompts/` directly — changes will be overwritten. +Never edit generated files in `.github/agents/`, `.github/skills/`, or `.github/instructions/` directly — changes will be overwritten. Repository-only skills are edited directly and remain outside manifest ownership. Legacy managed prompts are retired by install/init only when safe. ## Execution Model diff --git a/.github/instructions/git.instructions.md b/.github/instructions/git.instructions.md index 18590e6c..fde263e4 100644 --- a/.github/instructions/git.instructions.md +++ b/.github/instructions/git.instructions.md @@ -41,4 +41,4 @@ Use these Git and release hygiene conventions. 1. Prefer local verification before pushing release-impacting changes. - + diff --git a/.github/instructions/helm.instructions.md b/.github/instructions/helm.instructions.md index 021ea13d..6f5b67f0 100644 --- a/.github/instructions/helm.instructions.md +++ b/.github/instructions/helm.instructions.md @@ -45,4 +45,4 @@ Use these Helm conventions. - [Helm chart best practices](https://helm.sh/docs/chart_best_practices/) - + diff --git a/.github/instructions/java.instructions.md b/.github/instructions/java.instructions.md index f78e6dad..0a8ab548 100644 --- a/.github/instructions/java.instructions.md +++ b/.github/instructions/java.instructions.md @@ -56,4 +56,4 @@ Use these Java conventions. 1. Do not suppress static analysis warnings without a documented, task-specific reason. - + diff --git a/.github/instructions/k8s.instructions.md b/.github/instructions/k8s.instructions.md index 169122b8..47f5a32f 100644 --- a/.github/instructions/k8s.instructions.md +++ b/.github/instructions/k8s.instructions.md @@ -51,4 +51,4 @@ Use these Kubernetes conventions. - [Kubernetes API reference](https://kubernetes.io/docs/reference/kubernetes-api/) - + diff --git a/.github/instructions/markdown.instructions.md b/.github/instructions/markdown.instructions.md index 9ab85f0c..67f76e16 100644 --- a/.github/instructions/markdown.instructions.md +++ b/.github/instructions/markdown.instructions.md @@ -51,4 +51,4 @@ Use these Markdown conventions. 1. Keep examples accurate and runnable. - + diff --git a/.github/instructions/python.instructions.md b/.github/instructions/python.instructions.md index efa1a430..6e4ae028 100644 --- a/.github/instructions/python.instructions.md +++ b/.github/instructions/python.instructions.md @@ -42,4 +42,4 @@ Use these Python conventions. 1. Do not silence lint/type errors unless there is a documented, task-specific reason. - + diff --git a/.github/instructions/rancher.instructions.md b/.github/instructions/rancher.instructions.md index 78b94e64..75f8fe18 100644 --- a/.github/instructions/rancher.instructions.md +++ b/.github/instructions/rancher.instructions.md @@ -44,4 +44,4 @@ Use these Rancher conventions. - [Fleet docs](https://fleet.rancher.io/) - + diff --git a/.github/instructions/security.instructions.md b/.github/instructions/security.instructions.md index 6d313413..f399d021 100644 --- a/.github/instructions/security.instructions.md +++ b/.github/instructions/security.instructions.md @@ -42,4 +42,4 @@ Use these security policies. 1. Keep privileged logic minimal, auditable, and separate from business logic. - + diff --git a/.github/instructions/terraform.instructions.md b/.github/instructions/terraform.instructions.md index c8d9d7d5..6cc5b8cd 100644 --- a/.github/instructions/terraform.instructions.md +++ b/.github/instructions/terraform.instructions.md @@ -60,4 +60,4 @@ Use these Terraform conventions. - [tfsec](https://aquasecurity.github.io/tfsec/) · [checkov](https://www.checkov.io/) - + diff --git a/.github/instructions/terragrunt.instructions.md b/.github/instructions/terragrunt.instructions.md index d84c5ee2..43092df4 100644 --- a/.github/instructions/terragrunt.instructions.md +++ b/.github/instructions/terragrunt.instructions.md @@ -57,4 +57,4 @@ Use these Terragrunt conventions. - [Terragrunt CLI reference](https://terragrunt.gruntwork.io/docs/reference/cli-options/) - + diff --git a/.github/instructions/testing.instructions.md b/.github/instructions/testing.instructions.md index 40052f20..0138061e 100644 --- a/.github/instructions/testing.instructions.md +++ b/.github/instructions/testing.instructions.md @@ -43,4 +43,4 @@ Use these testing conventions. 1. Treat flaky tests as bugs. - + diff --git a/.github/instructions/typescript.instructions.md b/.github/instructions/typescript.instructions.md index d45110d9..1d2bab9c 100644 --- a/.github/instructions/typescript.instructions.md +++ b/.github/instructions/typescript.instructions.md @@ -49,4 +49,4 @@ Use these TypeScript conventions. 1. Do not suppress lint or type errors with inline disable comments unless there is a documented, task-specific reason. - + diff --git a/.github/prompts/api-design-review.prompt.md b/.github/prompts/api-design-review.prompt.md deleted file mode 100644 index 3e506c0b..00000000 --- a/.github/prompts/api-design-review.prompt.md +++ /dev/null @@ -1,57 +0,0 @@ ---- -description: 'Review an API design or OpenAPI spec for correctness, completeness, and consistency.' -name: api-design-review -argument-hint: '[OpenAPI spec file, design doc, or endpoint scope]' -agent: designer -tools: - - read - - search ---- -Review the provided API design or OpenAPI specification for correctness, completeness, and consistency. - -Focus on consumer impact: breaking contracts, ambiguous semantics, missing errors, and inconsistent conventions. -Ignore implementation details and tooling preferences. - -Output exactly in this format: - -## Contract Issues - -List problems that would break or confuse consumers. - -For each item: - -- endpoint or field reference -- what the problem is in one sentence -- concrete fix - -## Naming and Consistency - -List naming violations, inconsistencies across endpoints, and deviations from REST conventions. - -## Missing Error Cases - -List expected error responses that are undocumented or missing status codes (400, 401, 403, 404, 409, 422, 500). - -## Schema Completeness - -List fields or objects that are missing required constraints, descriptions, or examples. - -## Versioning and Compatibility - -- versioning strategy present: yes | no | partial -- breaking changes relative to previous version: yes | no | unknown -- backward compatibility risk: low | medium | high - -## Security Scheme Check - -- authentication documented: yes | no -- authorization scopes documented where relevant: yes | no | partial -- sensitive fields handled appropriately: yes | no | partial - -## Verdict - -- approve | approve-with-conditions | reject -- top priority fix in one sentence - - - diff --git a/.github/prompts/architecture-risk.prompt.md b/.github/prompts/architecture-risk.prompt.md deleted file mode 100644 index ff918d2d..00000000 --- a/.github/prompts/architecture-risk.prompt.md +++ /dev/null @@ -1,54 +0,0 @@ ---- -description: 'Identify architectural risks, tradeoffs, and mitigation priorities for a proposed design.' -name: architecture-risk -argument-hint: '[design doc, ADR, or architecture scope]' -agent: architect -tools: - - read - - search ---- -Evaluate the provided architecture for delivery and runtime risk. - -Prioritize issues that could cause outages, data loss, severe operability pain, or major rework. -Ignore stylistic preferences. - -Output exactly in this format: - -## High-Severity Risks - -List risks that can materially fail production or block safe delivery. - -For each risk: - -- impacted boundary (service, data, contract, deployment, observability, security) -- why it is risky in one sentence -- mitigation with smallest viable change -- owner role - -## Medium Risks - -List important but non-blocking risks. - -## Tradeoff Notes - -List major tradeoffs and what is being optimized. - -## Missing Decisions - -List decisions that should become ADRs before implementation. - -## Recommended Sequence - -Provide an ordered mitigation sequence (step 1..N). - -## Security Considerations - -List security-specific risks not covered above: auth boundaries, sensitive data exposure, trust model assumptions, supply chain concerns. - -## Go/No-Go - -- go | conditional-go | no-go -- one-sentence rationale - - - diff --git a/.github/prompts/ci-triage.prompt.md b/.github/prompts/ci-triage.prompt.md deleted file mode 100644 index 7f7dcfb7..00000000 --- a/.github/prompts/ci-triage.prompt.md +++ /dev/null @@ -1,45 +0,0 @@ ---- -description: 'Triage CI failures into root-cause clusters and prioritize the fastest safe recovery path.' -name: ci-triage -argument-hint: '[workflow run, failing job, or log scope]' -agent: engineer -tools: - - read - - search ---- -Triage CI failures into root-cause clusters and prioritize the fastest safe recovery path. - -Use failing job logs, workflow config, and changed files. - -Output exactly in this format: - -## Failure Clusters - -For each cluster: - -- jobs affected -- probable root cause -- confidence: HIGH | MEDIUM | LOW - -## Priority Fix Order - -Ordered by unblock value. - -- fix action -- expected unblocked jobs -- owner role - -## Risk Notes - -- risky quick fixes to avoid -- possible hidden regressions - -## Recovery Checklist - -- [ ] apply highest-priority fix -- [ ] rerun targeted jobs -- [ ] rerun full workflow -- [ ] confirm no new failures - - - diff --git a/.github/prompts/dependency-audit.prompt.md b/.github/prompts/dependency-audit.prompt.md deleted file mode 100644 index 12efd04b..00000000 --- a/.github/prompts/dependency-audit.prompt.md +++ /dev/null @@ -1,62 +0,0 @@ ---- -description: 'Audit dependencies for vulnerabilities, outdated versions, licence risks, and supply chain hygiene.' -name: dependency-audit -argument-hint: '[dependency manifest, lockfile, or package scope]' -agent: tester -tools: - - read - - search ---- -Audit the provided dependency manifest or lockfile for vulnerabilities, outdated packages, licence risks, and supply chain hygiene. - -Prefer evidence from the manifest itself; flag items that need external verification. - -Output exactly in this format: - -## Vulnerabilities - -List dependencies with known CVEs or security advisories. - -For each item: - -- package name and version -- CVE or advisory reference if known -- severity: critical | high | medium | low -- recommended action (upgrade, replace, or accept with rationale) - -## Outdated Packages - -List dependencies significantly behind latest stable releases where risk is meaningful. -Do not list low-impact minor version differences. - -For each item: - -- package name: current version → latest stable -- risk of staying on current version in one sentence - -## Licence Risks - -List licences that may conflict with the project's distribution model. - -For each item: - -- package name -- licence identifier -- conflict or concern in one sentence - -## Pinning and Version Policy - -- all direct dependencies pinned: yes | no | partial -- unpinned transitive dependencies with risk: list or none -- version ranges that allow breaking upgrades: list or none - -## Supply Chain Hygiene - -List packages with unusual provenance concerns: abandoned maintainers, single-maintainer projects, recent ownership transfers, or typosquatting risk. - -## Recommended Actions - -Ordered action list by priority (critical first). - - - diff --git a/.github/prompts/incident-timeline.prompt.md b/.github/prompts/incident-timeline.prompt.md deleted file mode 100644 index dd11f432..00000000 --- a/.github/prompts/incident-timeline.prompt.md +++ /dev/null @@ -1,59 +0,0 @@ ---- -description: 'Build a structured, evidence-based incident timeline and action-oriented postmortem summary.' -name: incident-timeline -argument-hint: '[logs, alerts, timeline notes, or incident ID]' -agent: tester -tools: - - read - - search ---- -Construct a blameless incident timeline from the provided evidence. - -Anchor claims to available logs, alerts, traces, and change events. -If evidence is missing, explicitly mark uncertainty. - -Output exactly in this format: - -## Incident Snapshot - -- incident title -- impact window -- affected systems/users -- current status - -## Timeline (UTC) - -List timestamped events in order. - -For each event: - -- time -- event description -- evidence source -- confidence: high | medium | low - -## Root Cause Analysis - -- primary cause -- contributing factors -- what made detection/recovery slower - -## What Worked / What Failed - -Two short lists. - -## Corrective Actions - -For each action: - -- action description -- owner role -- priority: P0 | P1 | P2 -- due expectation (short horizon) - -## Prevention Check - -List the minimum controls needed to reduce repeat probability. - - - diff --git a/.github/prompts/migration-plan.prompt.md b/.github/prompts/migration-plan.prompt.md deleted file mode 100644 index c15b7d69..00000000 --- a/.github/prompts/migration-plan.prompt.md +++ /dev/null @@ -1,45 +0,0 @@ ---- -description: 'Produce a safe migration plan with sequencing, fallback paths, and verification checkpoints.' -name: migration-plan -argument-hint: '[migration scope or affected components]' -agent: engineer -tools: - - read - - search ---- -Produce a safe migration plan with sequencing, fallback paths, and verification checkpoints. - -Use source changes, schema/contracts, and deployment constraints. - -Output exactly in this format: - -## Migration Overview - -- scope -- dependencies -- compatibility strategy - -## Execution Plan - -For each phase: - -- phase -- changes applied -- validation checkpoint - -## Rollback Plan - -For each phase: - -- rollback trigger -- rollback steps -- data integrity check - -## Post-Migration Validation - -- required tests -- smoke checks -- success criteria - - - diff --git a/.github/prompts/migration-safety.prompt.md b/.github/prompts/migration-safety.prompt.md deleted file mode 100644 index 9c89dc22..00000000 --- a/.github/prompts/migration-safety.prompt.md +++ /dev/null @@ -1,54 +0,0 @@ ---- -description: 'Review database migration safety, rollback strategy, and zero-downtime risk.' -name: migration-safety -argument-hint: '[migration files, schema, or rollout plan]' -agent: engineer -tools: - - read - - search - - edit ---- -Review the selected migration plan and code for production safety. - -Focus on forward compatibility, rollback feasibility, data integrity, and operational risk. -Assume a live system with concurrent reads and writes. - -Output exactly in this format: - -## Must Fix Before Apply - -List migration blockers. - -For each item: - -- file/section -- failure mode in one sentence -- concrete safe fix - -## Should Fix Soon - -List non-blocking risks with meaningful impact. - -## Rollback Plan Check - -- rollback feasible: yes | no | partial -- missing rollback prerequisites -- specific rollback procedure recommendation - -## Zero-Downtime Check - -- compatible with old and new app versions: yes | no | partial -- lock/contention risk: low | medium | high -- required phased rollout steps - -## Test Gaps - -List missing migration tests (forward, backward, data invariants, load-sensitive paths). - -## Final Recommendation - -- apply now | apply after fixes -- biggest remaining risk in one sentence - - - diff --git a/.github/prompts/ops-readiness.prompt.md b/.github/prompts/ops-readiness.prompt.md deleted file mode 100644 index e82add80..00000000 --- a/.github/prompts/ops-readiness.prompt.md +++ /dev/null @@ -1,44 +0,0 @@ ---- -description: 'Assess operational readiness across observability, runbooks, failure handling, and supportability.' -name: ops-readiness -argument-hint: '[service, component, or release scope]' -agent: tester -tools: - - read - - search ---- -Assess operational readiness across observability, runbooks, failure handling, and supportability. - -Use evidence from code, tests, docs, and runbooks. - -Output exactly in this format: - -## Ops Readiness Scorecard - -- observability: READY | PARTIAL | MISSING -- alerting: READY | PARTIAL | MISSING -- runbooks: READY | PARTIAL | MISSING -- failure handling: READY | PARTIAL | MISSING - -## Gaps - -For each gap: - -- area -- finding -- risk if unresolved -- owner role - -## Must-Fix Before Release - -- blocker -- required evidence - -## Follow-up Actions - -- action -- owner role -- target milestone - - - diff --git a/.github/prompts/quick-review.prompt.md b/.github/prompts/quick-review.prompt.md deleted file mode 100644 index 6c7997c7..00000000 --- a/.github/prompts/quick-review.prompt.md +++ /dev/null @@ -1,53 +0,0 @@ ---- -description: 'Review a change for bugs, regressions, and missing tests.' -name: quick-review -argument-hint: '[scope or files to review]' -agent: engineer -tools: - - read - - search - - edit ---- -Review the selected code or diff for production risk. - -Focus only on issues with real impact: - -- correctness and edge cases -- security and data exposure -- performance and scalability -- maintainability and ownership boundaries -- missing tests for changed behavior -- API contract changes: breaking changes, schema drift, missing versioning - -Ignore: - -- style-only preferences with no runtime impact -- speculative risks without evidence in this change - -Output exactly in this format: - -## Must fix - -List blocking issues that should be resolved before merge. - -## Should consider - -List non-blocking improvements worth addressing now. - -## Looks good - -List intentional strengths in this change. - -For each item: - -- cite the relevant file/section -- explain why it matters in one short sentence -- give one concrete fix suggestion - -End with: - -- Merge recommendation: yes / no / yes-with-conditions -- Biggest remaining risk: one sentence - - - diff --git a/.github/prompts/release-check.prompt.md b/.github/prompts/release-check.prompt.md deleted file mode 100644 index 5fe0239d..00000000 --- a/.github/prompts/release-check.prompt.md +++ /dev/null @@ -1,48 +0,0 @@ ---- -description: 'Evaluate release gate readiness using required reports, artifacts, and sign-off evidence.' -name: release-check -argument-hint: '[release scope or target branch]' -agent: release -tools: - - read - - search ---- -Evaluate release gate readiness using required reports, artifacts, and sign-off evidence. - -Use repository evidence only. - -Output exactly in this format: - -## Release Gate Status - -- overall status: READY | NOT-READY -- scope reviewed -- evidence sources checked - -## Missing or Stale Evidence - -For each item: - -- artifact -- issue: MISSING | STALE | INCOMPLETE -- impact -- owner role - -## Sign-off Gaps - -For each required role: - -- role -- verdict: OK | NOK | NOT-RECORDED -- blocking reason - -## Release Actions - -Ordered actions to reach READY. - -- action -- owner role -- verification step - - - diff --git a/.github/prompts/repo-assessment.prompt.md b/.github/prompts/repo-assessment.prompt.md deleted file mode 100644 index a7fab703..00000000 --- a/.github/prompts/repo-assessment.prompt.md +++ /dev/null @@ -1,56 +0,0 @@ ---- -description: 'Assess a repository for production-readiness gaps and prioritized improvements.' -name: repo-assessment -argument-hint: '[repository scope or component path]' -agent: engineer -tools: - - read - - search ---- -Assess this repository for production-readiness gaps and prioritized improvements. - -Base findings on evidence in source files, tests, CI config, docs, and manifests. -Prefer concrete findings over speculation. - -Output exactly in this format: - -## Critical Risks - -List only issues that block safe production operation right now. - -For each item: - -- location: file or component reference -- risk: one sentence describing the production impact -- remediation: concrete action with owner role - -## High-ROI Improvements - -List high-value improvements that reduce operational risk or developer friction, ranked by impact versus effort. - -For each item: - -- area: the domain (security | reliability | observability | dx | performance | maintainability) -- finding: what is missing or suboptimal -- suggested action: one clear improvement step - -## Testing and Verification Gaps - -List untested behavioral paths or areas where coverage may give false confidence. - -For each item: - -- uncovered behavior: what scenario is missing -- risk if untested: what could go wrong in production -- suggested test type: unit | integration | contract | e2e - -## Suggested Next Sprint Backlog - -Provide a short, actionable next-sprint task list ordered from highest to lowest priority. - -- task title -- owner role (product | architect | designer | engineer | tester | release) -- one-line rationale - - - diff --git a/.github/prompts/template-impact.prompt.md b/.github/prompts/template-impact.prompt.md deleted file mode 100644 index fdd044b0..00000000 --- a/.github/prompts/template-impact.prompt.md +++ /dev/null @@ -1,45 +0,0 @@ ---- -description: 'Assess impact of a template change on generated artifacts, tests, and release risk.' -name: template-impact -argument-hint: '[template path or change scope]' -agent: engineer -tools: - - read - - search ---- -Assess impact of a template change on generated artifacts, tests, and release risk. - -Use source-template and generated-artifact evidence. - -Output exactly in this format: - -## Change Surface - -- template scope -- affected artifact types -- likely generated paths - -## Impact Findings - -For each finding: - -- impacted path -- impact type: BEHAVIOR | DOCS | TESTS | TOOLING -- risk -- required validation - -## Regression Risk - -List highest-risk regressions first. - -- scenario -- likelihood: HIGH | MEDIUM | LOW -- mitigation - -## Verification Plan - -- commands to run -- expected pass criteria - - - diff --git a/.github/prompts/test-gaps.prompt.md b/.github/prompts/test-gaps.prompt.md deleted file mode 100644 index 8b195180..00000000 --- a/.github/prompts/test-gaps.prompt.md +++ /dev/null @@ -1,42 +0,0 @@ ---- -description: 'Identify missing behavioral coverage and prioritize test additions by production risk.' -name: test-gaps -argument-hint: '[component, feature, or repository scope]' -agent: tester -tools: - - read - - search ---- -Identify missing behavioral coverage and prioritize test additions by production risk. - -Focus on observable behavior and realistic failure paths. - -Output exactly in this format: - -## Coverage Gaps - -For each gap: - -- behavior -- current coverage weakness -- production risk -- suggested test type: unit | integration | contract | e2e - -## False Confidence Risks - -List tests that pass but may not protect real behavior. - -- location -- why confidence is false -- correction - -## Priority Test Backlog - -Ordered from highest to lowest risk reduction. - -- test title -- owner role -- acceptance check - - - diff --git a/.github/prompts/upgrade-plan.prompt.md b/.github/prompts/upgrade-plan.prompt.md deleted file mode 100644 index a0566d8c..00000000 --- a/.github/prompts/upgrade-plan.prompt.md +++ /dev/null @@ -1,45 +0,0 @@ ---- -description: 'Build a safe upgrade plan with sequencing, compatibility checks, and rollback points.' -name: upgrade-plan -argument-hint: '[target version, component, or full repo]' -agent: tester -tools: - - read - - search ---- -Build a safe upgrade plan with sequencing, compatibility checks, and rollback points. - -Use repository docs, manifests, and test constraints. - -Output exactly in this format: - -## Upgrade Scope - -- target -- baseline version -- compatibility boundaries - -## Step Plan - -Ordered upgrade steps. - -- step -- dependency/precondition -- success check - -## Risk and Rollback - -For each major step: - -- risk -- trigger to rollback -- rollback action - -## Verification Matrix - -- check -- command -- pass criteria - - - diff --git a/.github/prompts/workflow-check.prompt.md b/.github/prompts/workflow-check.prompt.md deleted file mode 100644 index f0c8fa22..00000000 --- a/.github/prompts/workflow-check.prompt.md +++ /dev/null @@ -1,48 +0,0 @@ ---- -description: 'Review workflow stage flow, gate usage, and handoff integrity across role artifacts.' -name: workflow-check -argument-hint: '[workflow scope or stage list]' -agent: planner -tools: - - read - - search ---- -Review workflow stage flow, gate usage, and handoff integrity across role artifacts. - -Focus on evidence in workflow config, role templates, and docs. - -Output exactly in this format: - -## Flow Summary - -- workflow scope -- current stage order -- gate model used - -## Gate and Handoff Findings - -For each finding: - -- location: file path and section -- issue: one sentence -- impact: what can fail in execution -- fix: concrete correction - -## Blocking Risks - -List only issues that block reliable workflow execution. - -- blocker -- owner role -- required action - -## Recommended Next Steps - -Provide an ordered short list of actions. - -- action -- owner role -- expected result - - - diff --git a/.github/skills/adr/SKILL.md b/.github/skills/adr/SKILL.md index ffcffa3b..46671667 100644 --- a/.github/skills/adr/SKILL.md +++ b/.github/skills/adr/SKILL.md @@ -180,4 +180,4 @@ is a kebab-case title. After writing, state the file path and summary so the architect or product role can review. - + diff --git a/.github/skills/advise/SKILL.md b/.github/skills/advise/SKILL.md index d76d9ad2..350d96e1 100644 --- a/.github/skills/advise/SKILL.md +++ b/.github/skills/advise/SKILL.md @@ -83,7 +83,7 @@ Always consider: --- -**Related:** See `prompt/reasoning` for the underlying reasoning framework. +**Related:** See `skill/reasoning` for the underlying reasoning framework. - + diff --git a/.github/skills/analyse/SKILL.md b/.github/skills/analyse/SKILL.md index 76009629..07050298 100644 --- a/.github/skills/analyse/SKILL.md +++ b/.github/skills/analyse/SKILL.md @@ -214,4 +214,4 @@ State conclusions with confidence level: ``` - + diff --git a/.github/skills/architecture/SKILL.md b/.github/skills/architecture/SKILL.md index 7ee7b520..77975ce4 100644 --- a/.github/skills/architecture/SKILL.md +++ b/.github/skills/architecture/SKILL.md @@ -278,4 +278,4 @@ For each significant structural decision made during this review (technology cho - Update `docs/architecture/overview.md` to reflect the final decisions. - + diff --git a/.github/prompts/artifact-integrity.prompt.md b/.github/skills/artifact-integrity/SKILL.md similarity index 53% rename from .github/prompts/artifact-integrity.prompt.md rename to .github/skills/artifact-integrity/SKILL.md index b8fe1e53..8e19d7f3 100644 --- a/.github/prompts/artifact-integrity.prompt.md +++ b/.github/skills/artifact-integrity/SKILL.md @@ -1,16 +1,43 @@ --- -description: 'Check source templates against generated artifacts and identify drift or missing regeneration.' name: artifact-integrity +description: 'Audit source templates and generated artifacts in the vstack source repository only.' +allowed-tools: 'read search' argument-hint: '[artifact type, path, or full repo]' -agent: tester -tools: - - read - - search +user-invocable: true +disable-model-invocation: true --- +## Skill Context + +This hand-authored skill maintains the **vstack source repository** only. +It is not a distributable template and is not installed by `vstack install`. + +### AskUserQuestion Format + +When you need clarification, use this exact format — never invent or guess: + +> **Question:** [The specific question] +> **Options:** A) … | B) … | C) … +> **Default if no response:** [What you'll do] + +Never ask more than one question at a time without waiting for the answer. + +### Diagram Convention + +When producing hand-authored Markdown outputs, prefer Mermaid for flow, +interaction, lifecycle, state, topology, dependency, and decision diagrams when +the format is supported and improves clarity. Use ASCII as a fallback when +Mermaid is unsupported or would be less readable. Keep ASCII/text trees for +directory structures and other scan-friendly hierarchies. + +# artifact-integrity - Generated Artifact Audit + Check source templates against generated artifacts and identify drift. +Report only; do not regenerate, edit, or delete files. Compare `src/vstack/_templates/` sources with installed artifacts in `.github/` and the manifest at `.vstack/vstack.json`. Surface mismatches, stale output, or gaps. +Repository-local skills, including this one, intentionally have no source template, +generation footer, or install-manifest entry. Do not report them as drift. Output exactly in this format: @@ -53,6 +80,3 @@ Provide a checklist to confirm the repository is clean after regeneration. - [ ] `make test-local` passes with 100% coverage - [ ] `make markdown-format` reports no changes - [ ] All regenerated files match their source checksums in `.vstack/vstack.json` - - - diff --git a/.github/skills/ask/SKILL.md b/.github/skills/ask/SKILL.md index 0be3d25b..29885cd1 100644 --- a/.github/skills/ask/SKILL.md +++ b/.github/skills/ask/SKILL.md @@ -124,4 +124,4 @@ Use this format: - If it requires risk/impact comparison, hand off to `analyse`. - + diff --git a/.github/skills/aws-cli/SKILL.md b/.github/skills/aws-cli/SKILL.md index bf76e9e7..47f50f65 100644 --- a/.github/skills/aws-cli/SKILL.md +++ b/.github/skills/aws-cli/SKILL.md @@ -374,4 +374,4 @@ aws ce get-cost-and-usage \ - [AWS CLI named profiles](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-profiles.html) - + diff --git a/.github/skills/changedoc/SKILL.md b/.github/skills/changedoc/SKILL.md index 9811c2ea..36dba336 100644 --- a/.github/skills/changedoc/SKILL.md +++ b/.github/skills/changedoc/SKILL.md @@ -142,4 +142,4 @@ Escalate before implementation when: - required stakeholders have not approved transition to `BUILD` - + diff --git a/.github/skills/cicd/SKILL.md b/.github/skills/cicd/SKILL.md index fe6d466b..f4323d9f 100644 --- a/.github/skills/cicd/SKILL.md +++ b/.github/skills/cicd/SKILL.md @@ -221,4 +221,4 @@ Configure these in GitHub → Settings → Branches. - [GitHub-hosted runners](https://docs.github.com/en/actions/using-github-hosted-runners/using-github-hosted-runners/about-github-hosted-runners) - + diff --git a/.github/skills/cloudformation/SKILL.md b/.github/skills/cloudformation/SKILL.md index 3d1b026e..690a9d21 100644 --- a/.github/skills/cloudformation/SKILL.md +++ b/.github/skills/cloudformation/SKILL.md @@ -344,4 +344,4 @@ AppSecurityGroup: - [AWS SAM documentation](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/) - + diff --git a/.github/skills/code-review/SKILL.md b/.github/skills/code-review/SKILL.md index 045e1154..e85eddef 100644 --- a/.github/skills/code-review/SKILL.md +++ b/.github/skills/code-review/SKILL.md @@ -218,4 +218,4 @@ Confidence: [HIGH/MEDIUM/LOW — explain if not HIGH] ``` - + diff --git a/.github/skills/codeql/SKILL.md b/.github/skills/codeql/SKILL.md index 7faacb14..7274e07a 100644 --- a/.github/skills/codeql/SKILL.md +++ b/.github/skills/codeql/SKILL.md @@ -251,4 +251,4 @@ GITHUB_TOKEN= codeql github upload-results \ - [Supported languages and frameworks](https://docs.github.com/en/code-security/code-scanning/introduction-to-code-scanning/codeql-code-scanning-for-compiled-languages) - + diff --git a/.github/skills/concise/SKILL.md b/.github/skills/concise/SKILL.md index 6c439267..82242a53 100644 --- a/.github/skills/concise/SKILL.md +++ b/.github/skills/concise/SKILL.md @@ -147,4 +147,4 @@ Current mode unchanged: - [ ] User confirmation/status returned in deterministic format - + diff --git a/.github/skills/consult/SKILL.md b/.github/skills/consult/SKILL.md index f2c7a420..7b869ce5 100644 --- a/.github/skills/consult/SKILL.md +++ b/.github/skills/consult/SKILL.md @@ -218,4 +218,4 @@ reason: [one sentence] ``` - + diff --git a/.github/skills/container/SKILL.md b/.github/skills/container/SKILL.md index 8585679b..43ca1791 100644 --- a/.github/skills/container/SKILL.md +++ b/.github/skills/container/SKILL.md @@ -153,4 +153,4 @@ For production-like local testing, write a separate `docker-compose.prod.yml` wi - [Docker official images](https://hub.docker.com/search?image_filter=official) - + diff --git a/.github/skills/conventional-commit/SKILL.md b/.github/skills/conventional-commit/SKILL.md index 0c856e8f..89986ecc 100644 --- a/.github/skills/conventional-commit/SKILL.md +++ b/.github/skills/conventional-commit/SKILL.md @@ -155,4 +155,4 @@ Remaining changes: If commit is blocked, report exact reason and proposed fix. - + diff --git a/.github/skills/copilot-ops/SKILL.md b/.github/skills/copilot-ops/SKILL.md index 956b8512..578dbac4 100644 --- a/.github/skills/copilot-ops/SKILL.md +++ b/.github/skills/copilot-ops/SKILL.md @@ -87,4 +87,4 @@ Provide this structure: Escalate when permissions are insufficient, settings conflict across scopes, or policy intent is ambiguous. - + diff --git a/.github/skills/debug/SKILL.md b/.github/skills/debug/SKILL.md index 6b50ec4c..2c0fd88f 100644 --- a/.github/skills/debug/SKILL.md +++ b/.github/skills/debug/SKILL.md @@ -258,4 +258,4 @@ Prevention: [any follow-up items] ``` - + diff --git a/.github/skills/dependabot/SKILL.md b/.github/skills/dependabot/SKILL.md index 9b8dfcfa..61cce513 100644 --- a/.github/skills/dependabot/SKILL.md +++ b/.github/skills/dependabot/SKILL.md @@ -320,4 +320,4 @@ updates: - [Dependabot security updates](https://docs.github.com/en/code-security/dependabot/dependabot-security-updates/about-dependabot-security-updates) - + diff --git a/.github/skills/dependency/SKILL.md b/.github/skills/dependency/SKILL.md index 58606a84..032fa9d2 100644 --- a/.github/skills/dependency/SKILL.md +++ b/.github/skills/dependency/SKILL.md @@ -318,4 +318,4 @@ Action items (priority order): - [PyPI / npm / crates.io / Maven Central](https://pypi.org) (replace with the relevant registry) - + diff --git a/.github/skills/design/SKILL.md b/.github/skills/design/SKILL.md index 5684aa47..e5dae070 100644 --- a/.github/skills/design/SKILL.md +++ b/.github/skills/design/SKILL.md @@ -243,4 +243,4 @@ Output a complete design document to `docs/design/overview.md` or `openapi.yaml` ``` - + diff --git a/.github/skills/docs/SKILL.md b/.github/skills/docs/SKILL.md index 855299a2..2adbfe9a 100644 --- a/.github/skills/docs/SKILL.md +++ b/.github/skills/docs/SKILL.md @@ -151,4 +151,4 @@ Skipped (n/a): ``` - + diff --git a/.github/skills/explore/SKILL.md b/.github/skills/explore/SKILL.md index 5398f9b8..40072a0f 100644 --- a/.github/skills/explore/SKILL.md +++ b/.github/skills/explore/SKILL.md @@ -149,4 +149,4 @@ For `thorough` mode, append: - main risk hotspots (coupling, missing tests, unclear ownership) - + diff --git a/.github/skills/gdpr/SKILL.md b/.github/skills/gdpr/SKILL.md index 285adadf..6a688cd4 100644 --- a/.github/skills/gdpr/SKILL.md +++ b/.github/skills/gdpr/SKILL.md @@ -246,4 +246,4 @@ Use `@example.com` for all test email addresses. - [EDPB guidelines](https://www.edpb.europa.eu/our-work-tools/general-guidance/guidelines-recommendations-best-practices_en) - + diff --git a/.github/skills/gh-issues/SKILL.md b/.github/skills/gh-issues/SKILL.md index 7fa6d094..9bc14e63 100644 --- a/.github/skills/gh-issues/SKILL.md +++ b/.github/skills/gh-issues/SKILL.md @@ -230,4 +230,4 @@ https://github.com///issues/ - [GitHub Issues documentation](https://docs.github.com/en/issues) - + diff --git a/.github/skills/gh-release/SKILL.md b/.github/skills/gh-release/SKILL.md index 2ef5510d..e961fedd 100644 --- a/.github/skills/gh-release/SKILL.md +++ b/.github/skills/gh-release/SKILL.md @@ -214,4 +214,4 @@ If blocked, report exact blocker and required user action. - [GitHub Releases documentation](https://docs.github.com/en/repositories/releasing-projects-on-github/about-releases) - + diff --git a/.github/skills/guardrails/SKILL.md b/.github/skills/guardrails/SKILL.md index 930eb036..e22c3b75 100644 --- a/.github/skills/guardrails/SKILL.md +++ b/.github/skills/guardrails/SKILL.md @@ -72,4 +72,4 @@ Activate careful mode for this session. Two behaviors are now enabled. Explicitly ask to "disable guardrails". - + diff --git a/.github/skills/helm/SKILL.md b/.github/skills/helm/SKILL.md index d547c78d..c13fff72 100644 --- a/.github/skills/helm/SKILL.md +++ b/.github/skills/helm/SKILL.md @@ -140,4 +140,4 @@ Practices: - [Chart best practices](https://helm.sh/docs/chart_best_practices/) - + diff --git a/.github/skills/incident/SKILL.md b/.github/skills/incident/SKILL.md index 293543c2..f0b570d6 100644 --- a/.github/skills/incident/SKILL.md +++ b/.github/skills/incident/SKILL.md @@ -251,4 +251,4 @@ Next: invoke @#rca and @#postmortem to produce written artifacts. ``` - + diff --git a/.github/skills/inspect/SKILL.md b/.github/skills/inspect/SKILL.md index 00142882..34fc9402 100644 --- a/.github/skills/inspect/SKILL.md +++ b/.github/skills/inspect/SKILL.md @@ -155,4 +155,4 @@ Confirm for changed paths: ``` - + diff --git a/.github/skills/k8s/SKILL.md b/.github/skills/k8s/SKILL.md index a6ef501e..b4fd7108 100644 --- a/.github/skills/k8s/SKILL.md +++ b/.github/skills/k8s/SKILL.md @@ -144,4 +144,4 @@ Common failure classes: - [Kubernetes API reference](https://kubernetes.io/docs/reference/kubernetes-api/) - + diff --git a/.github/skills/lazy/SKILL.md b/.github/skills/lazy/SKILL.md index 22770985..69ab820b 100644 --- a/.github/skills/lazy/SKILL.md +++ b/.github/skills/lazy/SKILL.md @@ -160,4 +160,4 @@ Stop and escalate when: - The task is under-specified and any minimal patch would be guesswork. - + diff --git a/.github/skills/migrate/SKILL.md b/.github/skills/migrate/SKILL.md index dfe93eff..3dbad91d 100644 --- a/.github/skills/migrate/SKILL.md +++ b/.github/skills/migrate/SKILL.md @@ -320,4 +320,4 @@ Pre-deploy checklist: ``` - + diff --git a/.github/skills/migration-plan/SKILL.md b/.github/skills/migration-plan/SKILL.md new file mode 100644 index 00000000..4e638532 --- /dev/null +++ b/.github/skills/migration-plan/SKILL.md @@ -0,0 +1,69 @@ +--- +name: migration-plan +description: 'Produce a safe migration plan with sequencing, fallback paths, and verification checkpoints.' +allowed-tools: 'read search' +argument-hint: '[migration scope or affected components]' +user-invocable: true +disable-model-invocation: true +--- +## Skill Context + +This skill is part of **vstack** — a VS Code-native AI engineering workflow system. + +### AskUserQuestion Format + +When you need clarification, use this exact format — never invent or guess: + +> **Question:** [The specific question] +> **Options:** A) … | B) … | C) … +> **Default if no response:** [What you'll do] + +Never ask more than one question at a time without waiting for the answer. + +### Diagram Convention + +When producing hand-authored Markdown outputs, prefer Mermaid for flow, +interaction, lifecycle, state, topology, dependency, and decision diagrams when +the format is supported and improves clarity. Use ASCII as a fallback when +Mermaid is unsupported or would be less readable. Keep ASCII/text trees for +directory structures and other scan-friendly hierarchies. + +# migration-plan - Cross-Component Migration Planning + +Produce a safe migration plan with sequencing, fallback paths, and verification checkpoints. +Plan only; do not apply migrations or change files. + +Use source changes, schema/contracts, and deployment constraints. + +Output exactly in this format: + +## Migration Overview + +- scope +- dependencies +- compatibility strategy + +## Execution Plan + +For each phase: + +- phase +- changes applied +- validation checkpoint + +## Rollback Plan + +For each phase: + +- rollback trigger +- rollback steps +- data integrity check + +## Post-Migration Validation + +- required tests +- smoke checks +- success criteria + + + diff --git a/.github/skills/onboard/SKILL.md b/.github/skills/onboard/SKILL.md index 5d34f4cf..b46ddc99 100644 --- a/.github/skills/onboard/SKILL.md +++ b/.github/skills/onboard/SKILL.md @@ -302,4 +302,4 @@ Gaps remaining (if any): ``` - + diff --git a/.github/skills/openapi/SKILL.md b/.github/skills/openapi/SKILL.md index ebfbd7a4..96cbb6f4 100644 --- a/.github/skills/openapi/SKILL.md +++ b/.github/skills/openapi/SKILL.md @@ -403,4 +403,4 @@ Summary: [N critical, N warnings, N info] - [Redocly CLI (linting)](https://redocly.com/docs/cli/) - + diff --git a/.github/skills/performance/SKILL.md b/.github/skills/performance/SKILL.md index ddcd1db0..72596379 100644 --- a/.github/skills/performance/SKILL.md +++ b/.github/skills/performance/SKILL.md @@ -242,4 +242,4 @@ For each bottleneck identified: ``` - + diff --git a/.github/skills/postmortem/SKILL.md b/.github/skills/postmortem/SKILL.md index a8d018f3..461f4de9 100644 --- a/.github/skills/postmortem/SKILL.md +++ b/.github/skills/postmortem/SKILL.md @@ -184,4 +184,4 @@ Status: Draft — ready for team review ``` - + diff --git a/.github/skills/pr/SKILL.md b/.github/skills/pr/SKILL.md index 4372fe98..bc794a29 100644 --- a/.github/skills/pr/SKILL.md +++ b/.github/skills/pr/SKILL.md @@ -151,4 +151,4 @@ Next steps depend on the repository CI/CD configuration: ``` - + diff --git a/.github/skills/rancher/SKILL.md b/.github/skills/rancher/SKILL.md index e4c59340..baae344a 100644 --- a/.github/skills/rancher/SKILL.md +++ b/.github/skills/rancher/SKILL.md @@ -113,4 +113,4 @@ Checks: - [Fleet documentation](https://fleet.rancher.io/) - + diff --git a/.github/skills/rca/SKILL.md b/.github/skills/rca/SKILL.md index b01b4000..77e26108 100644 --- a/.github/skills/rca/SKILL.md +++ b/.github/skills/rca/SKILL.md @@ -207,4 +207,4 @@ Status: Draft — ready for review ``` - + diff --git a/.github/prompts/reasoning.prompt.md b/.github/skills/reasoning/SKILL.md similarity index 68% rename from .github/prompts/reasoning.prompt.md rename to .github/skills/reasoning/SKILL.md index cfd42735..8bac8374 100644 --- a/.github/prompts/reasoning.prompt.md +++ b/.github/skills/reasoning/SKILL.md @@ -1,12 +1,36 @@ --- -description: 'Evidence-based reasoning framework for one-shot evaluation tasks. -Use when you need to apply critical thinking to a specific decision, proposal, or evaluation. -' name: reasoning +description: 'Evidence-based reasoning framework for one-shot evaluation tasks. Use when you need to apply critical thinking to a specific decision, proposal, or evaluation.' +allowed-tools: 'read search' +argument-hint: '[decision, proposal, or evaluation]' +user-invocable: true +disable-model-invocation: true --- +## Skill Context + +This skill is part of **vstack** — a VS Code-native AI engineering workflow system. + +### AskUserQuestion Format + +When you need clarification, use this exact format — never invent or guess: + +> **Question:** [The specific question] +> **Options:** A) … | B) … | C) … +> **Default if no response:** [What you'll do] + +Never ask more than one question at a time without waiting for the answer. + +### Diagram Convention + +When producing hand-authored Markdown outputs, prefer Mermaid for flow, +interaction, lifecycle, state, topology, dependency, and decision diagrams when +the format is supported and improves clarity. Use ASCII as a fallback when +Mermaid is unsupported or would be less readable. Keep ASCII/text trees for +directory structures and other scan-friendly hierarchies. + # Evidence-Based Reasoning Framework -Use this prompt when you need to apply critical thinking to a specific decision, proposal, idea, or evaluation. +Use this skill when you need to apply critical thinking to a specific decision, proposal, idea, or evaluation. ## Core Mindset @@ -91,4 +115,4 @@ Always ask internally: **Related:** See `skill/advise` for structured adversarial review workflows. - + diff --git a/.github/skills/refactor/SKILL.md b/.github/skills/refactor/SKILL.md index e4fecc45..cbb1bff7 100644 --- a/.github/skills/refactor/SKILL.md +++ b/.github/skills/refactor/SKILL.md @@ -375,4 +375,4 @@ Behavior changed: No ``` - + diff --git a/.github/skills/release-check/SKILL.md b/.github/skills/release-check/SKILL.md new file mode 100644 index 00000000..1716ccf1 --- /dev/null +++ b/.github/skills/release-check/SKILL.md @@ -0,0 +1,72 @@ +--- +name: release-check +description: 'Evaluate release gate readiness using required reports, artifacts, and sign-off evidence.' +allowed-tools: 'read search' +argument-hint: '[release scope or target branch]' +user-invocable: true +disable-model-invocation: true +--- +## Skill Context + +This skill is part of **vstack** — a VS Code-native AI engineering workflow system. + +### AskUserQuestion Format + +When you need clarification, use this exact format — never invent or guess: + +> **Question:** [The specific question] +> **Options:** A) … | B) … | C) … +> **Default if no response:** [What you'll do] + +Never ask more than one question at a time without waiting for the answer. + +### Diagram Convention + +When producing hand-authored Markdown outputs, prefer Mermaid for flow, +interaction, lifecycle, state, topology, dependency, and decision diagrams when +the format is supported and improves clarity. Use ASCII as a fallback when +Mermaid is unsupported or would be less readable. Keep ASCII/text trees for +directory structures and other scan-friendly hierarchies. + +# release-check - Release Evidence Audit + +Evaluate release gate readiness using required reports, artifacts, and sign-off evidence. +Report only; do not create a release, tag, pull request, or sign-off. + +Use repository evidence only. + +Output exactly in this format: + +## Release Gate Status + +- overall status: READY | NOT-READY +- scope reviewed +- evidence sources checked + +## Missing or Stale Evidence + +For each item: + +- artifact +- issue: MISSING | STALE | INCOMPLETE +- impact +- owner role + +## Sign-off Gaps + +For each required role: + +- role +- verdict: OK | NOK | NOT-RECORDED +- blocking reason + +## Release Actions + +Ordered actions to reach READY. + +- action +- owner role +- verification step + + + diff --git a/.github/skills/release-notes/SKILL.md b/.github/skills/release-notes/SKILL.md index dc3e5157..76e1aa9a 100644 --- a/.github/skills/release-notes/SKILL.md +++ b/.github/skills/release-notes/SKILL.md @@ -147,4 +147,4 @@ Prepend a new entry at the top of `CHANGELOG.md`: Keep existing entries intact. - + diff --git a/.github/skills/requirements/SKILL.md b/.github/skills/requirements/SKILL.md index 83cee491..b807df24 100644 --- a/.github/skills/requirements/SKILL.md +++ b/.github/skills/requirements/SKILL.md @@ -199,4 +199,4 @@ Write all findings to `docs/product/requirements.md`: After writing, summarize what was decided so the architect role can start. - + diff --git a/.github/skills/secret-scan/SKILL.md b/.github/skills/secret-scan/SKILL.md index 0b5bc6af..ba811fea 100644 --- a/.github/skills/secret-scan/SKILL.md +++ b/.github/skills/secret-scan/SKILL.md @@ -240,4 +240,4 @@ credential formats. - [Supported secret patterns](https://docs.github.com/en/code-security/secret-scanning/introduction/supported-secret-scanning-patterns) - + diff --git a/.github/skills/security/SKILL.md b/.github/skills/security/SKILL.md index dd9e1c0d..b460585f 100644 --- a/.github/skills/security/SKILL.md +++ b/.github/skills/security/SKILL.md @@ -295,4 +295,4 @@ Scope: [full/diff/dependency/config] - [STRIDE threat modeling (Microsoft)](https://learn.microsoft.com/en-us/azure/security/develop/threat-modeling-tool-threats) - + diff --git a/.github/skills/simplify/SKILL.md b/.github/skills/simplify/SKILL.md index c2b9c133..d95a34f9 100644 --- a/.github/skills/simplify/SKILL.md +++ b/.github/skills/simplify/SKILL.md @@ -155,4 +155,4 @@ Escalate instead of over-simplifying when: - Required outcomes are underspecified. - + diff --git a/.github/skills/space-setup/SKILL.md b/.github/skills/space-setup/SKILL.md index 3fb527b3..acde29c8 100644 --- a/.github/skills/space-setup/SKILL.md +++ b/.github/skills/space-setup/SKILL.md @@ -87,4 +87,4 @@ Provide this structure: Escalate when required docs are missing, stale, or inconsistent across product/architecture/design baselines. - + diff --git a/.github/skills/terraform/SKILL.md b/.github/skills/terraform/SKILL.md index 12ac7218..1a294ce6 100644 --- a/.github/skills/terraform/SKILL.md +++ b/.github/skills/terraform/SKILL.md @@ -335,4 +335,4 @@ Run `terraform plan` after every state operation to verify the outcome. - [tfsec rules](https://aquasecurity.github.io/tfsec/latest/checks/aws/) · [checkov checks](https://www.checkov.io/5.Policy%20Index/terraform.html) - + diff --git a/.github/skills/terragrunt/SKILL.md b/.github/skills/terragrunt/SKILL.md index 687d7f79..052994ec 100644 --- a/.github/skills/terragrunt/SKILL.md +++ b/.github/skills/terragrunt/SKILL.md @@ -307,4 +307,4 @@ Use `--terragrunt-non-interactive` in CI to prevent hanging on prompts. - [Gruntwork module registry](https://www.gruntwork.io/) - + diff --git a/.github/skills/threat-model/SKILL.md b/.github/skills/threat-model/SKILL.md index 4785498d..595d9437 100644 --- a/.github/skills/threat-model/SKILL.md +++ b/.github/skills/threat-model/SKILL.md @@ -245,4 +245,4 @@ For each high-priority threat include: - Final report is written to `docs/architecture/threat-model.md`. - + diff --git a/.github/skills/upgrade-plan/SKILL.md b/.github/skills/upgrade-plan/SKILL.md new file mode 100644 index 00000000..d7b11a50 --- /dev/null +++ b/.github/skills/upgrade-plan/SKILL.md @@ -0,0 +1,69 @@ +--- +name: upgrade-plan +description: 'Build a safe upgrade plan with sequencing, compatibility checks, and rollback points.' +allowed-tools: 'read search' +argument-hint: '[target version, component, or full repo]' +user-invocable: true +disable-model-invocation: true +--- +## Skill Context + +This skill is part of **vstack** — a VS Code-native AI engineering workflow system. + +### AskUserQuestion Format + +When you need clarification, use this exact format — never invent or guess: + +> **Question:** [The specific question] +> **Options:** A) … | B) … | C) … +> **Default if no response:** [What you'll do] + +Never ask more than one question at a time without waiting for the answer. + +### Diagram Convention + +When producing hand-authored Markdown outputs, prefer Mermaid for flow, +interaction, lifecycle, state, topology, dependency, and decision diagrams when +the format is supported and improves clarity. Use ASCII as a fallback when +Mermaid is unsupported or would be less readable. Keep ASCII/text trees for +directory structures and other scan-friendly hierarchies. + +# upgrade-plan - Upgrade Planning + +Build a safe upgrade plan with sequencing, compatibility checks, and rollback points. +Plan only; do not install packages, apply upgrades, or change files. + +Use repository docs, manifests, and test constraints. + +Output exactly in this format: + +## Upgrade Scope + +- target +- baseline version +- compatibility boundaries + +## Step Plan + +Ordered upgrade steps. + +- step +- dependency/precondition +- success check + +## Risk and Rollback + +For each major step: + +- risk +- trigger to rollback +- rollback action + +## Verification Matrix + +- check +- command +- pass criteria + + + diff --git a/.github/skills/verify/SKILL.md b/.github/skills/verify/SKILL.md index a58be95f..88dc94b7 100644 --- a/.github/skills/verify/SKILL.md +++ b/.github/skills/verify/SKILL.md @@ -266,4 +266,4 @@ scope: [path/component/full] ``` - + diff --git a/.github/skills/vision/SKILL.md b/.github/skills/vision/SKILL.md index c5c1f2d7..2a3cdedc 100644 --- a/.github/skills/vision/SKILL.md +++ b/.github/skills/vision/SKILL.md @@ -206,4 +206,4 @@ For each finding: explain the tradeoff, give an opinionated recommendation, ask Present as: "Overall assessment: [READY/NEEDS REVISION/SCOPE CHANGE] because [1-2 sentence reason]." - + diff --git a/.github/skills/workflow-check/SKILL.md b/.github/skills/workflow-check/SKILL.md new file mode 100644 index 00000000..dc7ec077 --- /dev/null +++ b/.github/skills/workflow-check/SKILL.md @@ -0,0 +1,74 @@ +--- +name: workflow-check +description: 'Review workflow stage flow, gate usage, and handoff integrity across role artifacts.' +allowed-tools: 'read search' +argument-hint: '[workflow scope or stage list]' +user-invocable: true +disable-model-invocation: true +--- +## Skill Context + +This skill is part of **vstack** — a VS Code-native AI engineering workflow system. + +### AskUserQuestion Format + +When you need clarification, use this exact format — never invent or guess: + +> **Question:** [The specific question] +> **Options:** A) … | B) … | C) … +> **Default if no response:** [What you'll do] + +Never ask more than one question at a time without waiting for the answer. + +### Diagram Convention + +When producing hand-authored Markdown outputs, prefer Mermaid for flow, +interaction, lifecycle, state, topology, dependency, and decision diagrams when +the format is supported and improves clarity. Use ASCII as a fallback when +Mermaid is unsupported or would be less readable. Keep ASCII/text trees for +directory structures and other scan-friendly hierarchies. + +# workflow-check - Workflow Contract Audit + +Review workflow stage flow, gate usage, and handoff integrity across role artifacts. +Report only; do not change workflow configuration or role artifacts. + +Focus on the current project's workflow configuration, installed agent files, +role documents, and handoff definitions. These are consumer-project artifacts; +the vstack source repository and its template directories are not required. + +Output exactly in this format: + +## Flow Summary + +- workflow scope +- current stage order +- gate model used + +## Gate and Handoff Findings + +For each finding: + +- location: file path and section +- issue: one sentence +- impact: what can fail in execution +- fix: concrete correction + +## Blocking Risks + +List only issues that block reliable workflow execution. + +- blocker +- owner role +- required action + +## Recommended Next Steps + +Provide an ordered short list of actions. + +- action +- owner role +- expected result + + + diff --git a/.github/workflows/README.md b/.github/workflows/README.md index 1ecf5b7b..b79719fe 100644 --- a/.github/workflows/README.md +++ b/.github/workflows/README.md @@ -9,7 +9,7 @@ For the full CI/CD design and release model, see `docs/design/cicd.md`. | Workflow | Trigger | Purpose | | --- | --- | --- | | `commit.yml` | push to non-main branches and PRs to `main` | Commit/branch policy and lint/typecheck | -| `check.yml` | push to non-main branches and PRs to `main` | Single-version unit test feedback (py3.11) | +| `check.yml` | push to non-main branches and PRs to `main` | Single-version unit test feedback (py3.14) | | `verify.yml` | pull_request to `main` | Required verification checks: cross-version test matrix + artifact verify | | `security.yml` | pull_request to `main` | Required security checks | | `codeql.yml` | push/pull_request to `main` + weekly schedule | Code scanning for Actions and Python with CodeQL | diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml index 192f15a2..338e6525 100644 --- a/.github/workflows/check.yml +++ b/.github/workflows/check.yml @@ -24,7 +24,7 @@ permissions: contents: read env: - PYTHON_VERSION: "3.11" + PYTHON_VERSION: "3.14" POETRY_VERSION: "2.4.1" POETRY_VIRTUALENVS_IN_PROJECT: "true" FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: "true" diff --git a/.github/workflows/commit.yml b/.github/workflows/commit.yml index 1ab8d487..bbe31c33 100644 --- a/.github/workflows/commit.yml +++ b/.github/workflows/commit.yml @@ -25,7 +25,7 @@ permissions: contents: read env: - PYTHON_VERSION: "3.11" + PYTHON_VERSION: "3.14" POETRY_VERSION: "2.4.1" POETRY_VIRTUALENVS_IN_PROJECT: "true" FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: "true" @@ -125,7 +125,7 @@ jobs: fi quality: - # Lint, format, and typecheck on the baseline Python version. + # Run tools on the default Python; compatibility targets stay at the minimum. name: Format Lint Typecheck runs-on: ubuntu-latest diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 702eae8b..adaaafd2 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -18,7 +18,7 @@ permissions: id-token: write env: - PYTHON_VERSION: "3.11" + PYTHON_VERSION: "3.14" POETRY_VERSION: "2.4.1" FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: "true" TRUSTED_RELEASE_ACTORS: "vstack-release-bot[bot],eschaar" diff --git a/.github/workflows/security.yml b/.github/workflows/security.yml index 9b04280a..fcd211e3 100644 --- a/.github/workflows/security.yml +++ b/.github/workflows/security.yml @@ -19,7 +19,7 @@ permissions: env: # Keep scanner runtime consistent across runs. - PYTHON_VERSION: "3.11" + PYTHON_VERSION: "3.14" # Pin Poetry CLI version for deterministic CI behavior. POETRY_VERSION: "2.4.1" # Keep Poetry virtual environments inside the workspace for deterministic paths. @@ -60,7 +60,7 @@ jobs: - name: Secret scan # Scan only PR diff range to reduce noise and speed up checks. - uses: trufflesecurity/trufflehog@20652fbbdefffcdaa493a5bf57ab2ac6b1db715b + uses: trufflesecurity/trufflehog@363923b901c911a9164f50b6c423f47c15372b1c with: path: ./ base: ${{ github.event.pull_request.base.sha }} diff --git a/.github/workflows/verify.yml b/.github/workflows/verify.yml index e322dde5..27ce56bd 100644 --- a/.github/workflows/verify.yml +++ b/.github/workflows/verify.yml @@ -19,7 +19,7 @@ permissions: env: # Shared interpreter version for reproducible CI behavior. - PYTHON_VERSION: "3.11" + PYTHON_VERSION: "3.14" # Pin Poetry CLI version for deterministic CI behavior. POETRY_VERSION: "2.4.1" # Keep Poetry virtual environments inside the workspace for deterministic paths. @@ -35,7 +35,7 @@ jobs: strategy: fail-fast: false matrix: - python-version: ["3.11", "3.12", "3.13", "3.14"] + python-version: ["3.11", "3.12", "3.13", "3.14", "3.15"] steps: - name: Checkout diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index a31a4568..9d5339b8 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -29,7 +29,7 @@ repos: additional_dependencies: - mdformat-gfm files: \.(md)$ - exclude: ^(\.github/|tests/_fixtures/golden/|src/vstack/_templates/(prompts/reasoning/template\.md|skills/advise/template\.md)$) + exclude: ^(\.github/|tests/_fixtures/golden/|src/vstack/_templates/skills/(reasoning|advise)/template\.md$) - repo: https://github.com/DavidAnson/markdownlint-cli2 rev: v0.22.1 diff --git a/.python-version b/.python-version index ef3e413c..be0c7e98 100644 --- a/.python-version +++ b/.python-version @@ -1,4 +1,5 @@ -3.14.3 -3.13.12 -3.12.12 -3.11.14 +3.14.8 +3.15.0 +3.13.16 +3.12.15 +3.11.17 diff --git a/.vstack/vstack.json b/.vstack/vstack.json index 925c701c..fddd006c 100644 --- a/.vstack/vstack.json +++ b/.vstack/vstack.json @@ -1,365 +1,400 @@ { "manifest_version": 2, "hash_algorithm": "sha256", - "vstack_version": "3.6.0", - "installed_at": "2026-06-27T13:12:59.787877+00:00", + "vstack_version": "3.7.8", + "installed_at": "2026-10-17T13:59:31.708252+00:00", "artifacts": { "skills": [ { "name": "adr", "file": "skills/adr/SKILL.md", "version": "20260421003", - "checksum": "b6d6c1774467f339cce476f009b130e267d5fdbf217243bfc45b939ee11e9abe", + "checksum": "72eda96c3453eac00ec5330fae911ee85002e95eff342063c470fd68505df8fb", "checksum_algorithm": "sha256" }, { "name": "advise", "file": "skills/advise/SKILL.md", - "version": "20260626001", - "checksum": "4d2ca25d75d54d61600c192ee81674144c8dc6d14a49182798f1ae27bd83acef", + "version": "20261017001", + "checksum": "2def57807e24d3bab21019c624dfb4e020ba8890d35fb4fc4f0e312fd52fc7cf", "checksum_algorithm": "sha256" }, { "name": "analyse", "file": "skills/analyse/SKILL.md", "version": "20260421004", - "checksum": "4071c106b0842b3cd1fc674cb8e144c5598ec046feb85fcb204acca7cac654e3", + "checksum": "8bcbeab92d87042b11984d43fdb2e5848b91d7eba2a5b32762f2bb7e38e54eee", "checksum_algorithm": "sha256" }, { "name": "architecture", "file": "skills/architecture/SKILL.md", "version": "20260421005", - "checksum": "c30e38796267ad9e522f9ddbac0cd357c049383314c5bb89a75ffd9ea2859e20", + "checksum": "951f1263fa436776c03c600f03b90aa8c5e70f38725eebd208cfa59fd8332835", "checksum_algorithm": "sha256" }, { "name": "ask", "file": "skills/ask/SKILL.md", "version": "20260618001", - "checksum": "2c3311eea1529295c6c4159082c75b4bb859deb8356b63206b83bc8566b349c3", + "checksum": "d4afd5223334735dc5bf71691c04355d72d58cbf7a48e7357c7ad69204fbb859", "checksum_algorithm": "sha256" }, { "name": "aws-cli", "file": "skills/aws-cli/SKILL.md", "version": "20260502033", - "checksum": "9a04a1bd230a74847e2ff5c9d9b9c2231fd8ecc14bdc2a063104998cb9f642b6", + "checksum": "b82ffa42102b2142d57e66b3c2957d9483d7d33e3e3dfa86ff4980f8f9884a6a", "checksum_algorithm": "sha256" }, { "name": "changedoc", "file": "skills/changedoc/SKILL.md", "version": "20260625001", - "checksum": "0acae9195c58277a7b9a4b19abafefa1d2ec2e1e4c1e5b0efbed1415502d61a0", + "checksum": "e2d5c3f920be7e651d90f6e4092940fd9bcd7444d7814e606f95b10317e1435d", "checksum_algorithm": "sha256" }, { "name": "cicd", "file": "skills/cicd/SKILL.md", "version": "20260421006", - "checksum": "b9f90d35d08e2baa45ef6d93c0e97e28751cd8d667114a8533a78c81445e94e8", + "checksum": "b4678e25b122d8cd296427b01ae34879ab6877c2122addd55c4cb5aadd90dcd6", "checksum_algorithm": "sha256" }, { "name": "cloudformation", "file": "skills/cloudformation/SKILL.md", "version": "20260502032", - "checksum": "ff5b9f34ce26347e2785d5c88ac549344942c625ededa389f1a902200f90544e", + "checksum": "78d31157b5f4de679a017372a1fffe41f7a797762832ba5f95b572d0254c7679", "checksum_algorithm": "sha256" }, { "name": "code-review", "file": "skills/code-review/SKILL.md", "version": "20260421007", - "checksum": "52dcd1c837112205ffb2e6bd12cb4ec02c1150418159727ae32818605e818a63", + "checksum": "13338dfae6a5bfd70cb6dd7d3fbe085fa128c0cd8fe16add745614ba160cafd9", "checksum_algorithm": "sha256" }, { "name": "codeql", "file": "skills/codeql/SKILL.md", "version": "20260502026", - "checksum": "ff55a96e69da8649e2474d333311e143649a937e33cab426fce75e085bad2694", + "checksum": "3fff3656238acab6ac67d5af31c9486294efb22cfa02e6f02b845b3dcacda1be", "checksum_algorithm": "sha256" }, { "name": "concise", "file": "skills/concise/SKILL.md", "version": "20260421008", - "checksum": "5820b551f432a042cf9b8e61569799130b710ea85d6688749fd6f83518d4fc29", + "checksum": "b512650d9194412a18ed783f02756b0e1d6d9ea97dcebda75090bffe1109e798", "checksum_algorithm": "sha256" }, { "name": "consult", "file": "skills/consult/SKILL.md", "version": "20260421009", - "checksum": "bc3a441398d5ef60a63ee3a44d75133f7b52c15ef247280810f165d4dff7f0de", + "checksum": "2d19fc019765961b80c32ffdb5dad11f83e394255a7d4954786cecca7767bb0a", "checksum_algorithm": "sha256" }, { "name": "container", "file": "skills/container/SKILL.md", "version": "20260421010", - "checksum": "fa710b8a9aede396e357346a2b4975e63d8bfda6c564a0b0babb6d15495ad856", + "checksum": "b4b48e05480bc26519d997ccef254158db48ef209d1b3267da8983162ecc77df", "checksum_algorithm": "sha256" }, { "name": "conventional-commit", "file": "skills/conventional-commit/SKILL.md", "version": "20260502024", - "checksum": "0f9348d4613d0d2aaba4e9803dcc90890bc53cd5e89113aff2f529e1826afe21", + "checksum": "2d92c9c1efb79a7cd15d37cd5d244307693056c78373af94fb8480e10067827b", "checksum_algorithm": "sha256" }, { "name": "copilot-ops", "file": "skills/copilot-ops/SKILL.md", "version": "20260513012", - "checksum": "582735a432d636f79a69853e9811b7ef2c23a4d32e00e1c46412a009492527c1", + "checksum": "29fa2f9968fe62ed9fb0cd3f104e9f5ab59f648e8b501bdada8ffbd58f878a8d", "checksum_algorithm": "sha256" }, { "name": "debug", "file": "skills/debug/SKILL.md", "version": "20260421011", - "checksum": "f30c6f27f1900d7d60739ba711e46dd7f386c14d0dcebf534b9cea7346d4f3a3", + "checksum": "8be2e80664a06f288703cb4585210482d3151fff7190e6b7a5f9e5cf524acb62", "checksum_algorithm": "sha256" }, { "name": "dependabot", "file": "skills/dependabot/SKILL.md", "version": "20260502027", - "checksum": "433d5bbae6f10b21140aa0ad85885085606d588c2854b95d74e75b39845d6c57", + "checksum": "ed8d4e5851a3c3c1a24d8765f1e38a7467e6970508fb878335a3e0d7bb24aa0b", "checksum_algorithm": "sha256" }, { "name": "dependency", "file": "skills/dependency/SKILL.md", "version": "20260421012", - "checksum": "7bf1218cd64b5d56e300c5dfc92c2f34712a26fb6dc106ffc3f6ab7c3954c2e4", + "checksum": "d8419ccccf92f27fa2f557b2d5aaad1dcf2dd8f07b9b2ae60f323a56adf657cd", "checksum_algorithm": "sha256" }, { "name": "design", "file": "skills/design/SKILL.md", "version": "20260421013", - "checksum": "3d1330bfe022d024e1e6ce0920559d537701928827219fc2fadf6b13b03a2b71", + "checksum": "79db85fea4d04eebe34f7f09664bfc79ecd483bb4040ff0466b2d8252b042aca", "checksum_algorithm": "sha256" }, { "name": "docs", "file": "skills/docs/SKILL.md", "version": "20260421014", - "checksum": "ea276109c096130af6730e9b03124ec81ac6b2a338096a0175e0f2c09f83f14b", + "checksum": "3c00ecce65a66f041ad0c10894349a8c8428a59aa31c21795e6895dab2bd2ef1", "checksum_algorithm": "sha256" }, { "name": "explore", "file": "skills/explore/SKILL.md", "version": "20260611001", - "checksum": "73ae9db2c19ef0b92e8770d7ca6e742cb5345451c7b7f0170fd89aeeebaa2a68", + "checksum": "03d1fb8539e2372c33046c56c90af82b13b43615e71dc9c2d9916c33a7755118", "checksum_algorithm": "sha256" }, { "name": "gdpr", "file": "skills/gdpr/SKILL.md", "version": "20260502029", - "checksum": "c59511181cafdef780a0190d555ca953002d5f194c886ebf0bb1d7cdd3742b60", + "checksum": "fdbafa43a37eb6fe9657c08f6a63e97c482763124aec5a5a92a9277300dad767", "checksum_algorithm": "sha256" }, { "name": "gh-issues", "file": "skills/gh-issues/SKILL.md", "version": "20260502025", - "checksum": "cf88898d3cd08483723504f6bd22450a79b03b28c23f3c39efa6380131116601", + "checksum": "0766599fb6133caa0628615883ed3f95e41b498c01e7957fd4a44d021651830d", "checksum_algorithm": "sha256" }, { "name": "gh-release", "file": "skills/gh-release/SKILL.md", "version": "20260502023", - "checksum": "7d425d32a35a2ffa6f7dbd3dd6e52ac6d83bf140eca4454f8844d569046906a8", + "checksum": "7382cd0752d617847fb70bdcc77c13a2c23aff609c4e0431e9890aa488c74220", "checksum_algorithm": "sha256" }, { "name": "guardrails", "file": "skills/guardrails/SKILL.md", "version": "20260421016", - "checksum": "1fe600ae0a5f5e9fc974d81aca8cb1ffdc50d1b5a7ced9fdd3ec400ddec9db4d", + "checksum": "13ff3280958b14b2c0160b33e08b5bd37a474fd5556f211b22e67d2c3cfd6d31", "checksum_algorithm": "sha256" }, { "name": "helm", "file": "skills/helm/SKILL.md", "version": "20260502037", - "checksum": "d03178606be8fbc8152b97d95b146ad757061b97ac969207e5d92bda04ee7454", + "checksum": "a2abc7e1d1614d55990be395ddf299fc4a0b08d6e51f16495751a244d59912c9", "checksum_algorithm": "sha256" }, { "name": "incident", "file": "skills/incident/SKILL.md", "version": "20260503002", - "checksum": "ef1f63deb5c361d995e41c393ff63c55d1556f3a216515a2afe7dc564a80f561", + "checksum": "581de57435857e3b81b740ed43030db99fa6c5604c6880672fa916e01bc1f85f", "checksum_algorithm": "sha256" }, { "name": "inspect", "file": "skills/inspect/SKILL.md", "version": "20260421018", - "checksum": "7bdc6776309a7130fbb47ae8f2be8f07511d4dca67dd3e42c7170b1fb0524d9c", + "checksum": "0d26174e8afadea8b26e5ebf83cf1115d1ab96600c9d03d49ece71d07ada5aa3", "checksum_algorithm": "sha256" }, { "name": "k8s", "file": "skills/k8s/SKILL.md", "version": "20260502036", - "checksum": "d9ab4f7f08b6b1b2083034fcc068826871ad63fdb0d3861189c799e1679ca5b6", + "checksum": "536efea082ff4c26dfdf6e22af7504da852447813deb61d1cb99f2b5b0651061", "checksum_algorithm": "sha256" }, { "name": "lazy", "file": "skills/lazy/SKILL.md", "version": "20260625001", - "checksum": "9367ee448e3be8dedf2f361d8d9c37bed08673ced4082d8d38b5facb98195d3b", + "checksum": "6e455e539e8534194d9e017ce4bbccc77fb5fa1fd65e41d24b7c40958c1a49a0", "checksum_algorithm": "sha256" }, { "name": "migrate", "file": "skills/migrate/SKILL.md", "version": "20260421019", - "checksum": "eafa22586141e152b686c0148d20af3c482424b79cd1f7195f0fdbe8f1c75928", + "checksum": "f3794467cce63919af9d6595aa17e4c0a9d7246e52373364cc321c109fbf6562", + "checksum_algorithm": "sha256" + }, + { + "name": "migration-plan", + "file": "skills/migration-plan/SKILL.md", + "version": "20261017001", + "checksum": "36b4591572c18a07f5c6048d180bebca95202c4809c518129a2d509984de3dc1", "checksum_algorithm": "sha256" }, { "name": "onboard", "file": "skills/onboard/SKILL.md", "version": "20260421020", - "checksum": "67cfa95ebacb72fab6c7289238315cf7d73bdec665f9d9775ba616ecf9827d09", + "checksum": "680e5f0031ab810e476f2345a88e92d29896ab5cf0ec85ef69a08b827728faf7", "checksum_algorithm": "sha256" }, { "name": "openapi", "file": "skills/openapi/SKILL.md", "version": "20260421021", - "checksum": "6be2f0350a71826b0c70506331f8236075a767c3a66272d485efbfc31e02116c", + "checksum": "77a00cc691d80d005206d6386b2b660c310a7cffa427eb8dc6e6390d0984d9f2", "checksum_algorithm": "sha256" }, { "name": "performance", "file": "skills/performance/SKILL.md", "version": "20260421022", - "checksum": "f1b3de41ddb049e1e6c11fee5305d1ede50fec6d7b8c2fbee424684cdbafbfe1", + "checksum": "e25e3983ce8be1b2218edfab23cae831eea75a675a715bd781123ce0e21005ee", "checksum_algorithm": "sha256" }, { "name": "postmortem", "file": "skills/postmortem/SKILL.md", "version": "20260503001", - "checksum": "e66a8637020c5d4f49667d68cb82cb23454f9b8e4bcae0d2306f8a14492d5a35", + "checksum": "5ffcfb1109f517545b4eb8eb994e64b18beaa49e88639ceacf754488067ecb6e", "checksum_algorithm": "sha256" }, { "name": "pr", "file": "skills/pr/SKILL.md", "version": "20260502013", - "checksum": "10e21fea3fe695fd8b9375314570caf6d55994a3e92be9a560a8ca84c50b6685", + "checksum": "c78d09eb0f127b68b5e82ef4b678ed5e95edcacfb39b5ddb9a536beb2a5b9dd4", "checksum_algorithm": "sha256" }, { "name": "rancher", "file": "skills/rancher/SKILL.md", "version": "20260502038", - "checksum": "585fca26d9085339c3c4cbb51dae9aca92029cc95819ea645f0f1339a3e408f0", + "checksum": "08822bed0bab149168ff63ea3b58363ecec2e88e8b05dcf603e8906945457cb4", "checksum_algorithm": "sha256" }, { "name": "rca", "file": "skills/rca/SKILL.md", "version": "20260503001", - "checksum": "18f67a9fe20eb252ad3552112abe15cdc9b478b893a7f28368a36341a020398a", + "checksum": "e2922ee44a376117779a6e3d09a1f6c75bd7eff0e8ce34353c319856836cdf55", + "checksum_algorithm": "sha256" + }, + { + "name": "reasoning", + "file": "skills/reasoning/SKILL.md", + "version": "20261017001", + "checksum": "211eba9546932db6636f5158336ed25b9d327117d1a8f0b0f7cd2ef9d070e922", "checksum_algorithm": "sha256" }, { "name": "refactor", "file": "skills/refactor/SKILL.md", "version": "20260421023", - "checksum": "42fedb61708cb469f8325d738dc5a75688e7c34b981e8cad4abd257015e57520", + "checksum": "cdc4a2b846353ccb8b5255bab6095477885cd1228cba7815cab3638b6d71f570", + "checksum_algorithm": "sha256" + }, + { + "name": "release-check", + "file": "skills/release-check/SKILL.md", + "version": "20261017001", + "checksum": "fccdb0eee1f9949737a086306e6881b44040406151c9f001cbd60e2275714753", "checksum_algorithm": "sha256" }, { "name": "release-notes", "file": "skills/release-notes/SKILL.md", "version": "20260502014", - "checksum": "1d7daef61af9010f0afd53daa8d5524d26b71a0ddd5794e5b4fca89dd59d80a2", + "checksum": "fb499779b035a4cb205f2ee8b2d68cb171b6dbd0a77190352faefa1a5b80b5c1", "checksum_algorithm": "sha256" }, { "name": "requirements", "file": "skills/requirements/SKILL.md", "version": "20260421024", - "checksum": "87460b5b0dacb0df5a68c36662fab194a666f02cbe140a473b8d418d69421f7f", + "checksum": "ccc0512888c77f1982420d75f25058d703229c2c8ec20cef6859c1c473b83ac5", "checksum_algorithm": "sha256" }, { "name": "secret-scan", "file": "skills/secret-scan/SKILL.md", "version": "20260502028", - "checksum": "51bf8cc673fc6984aad45589a54aacbcc7a4cbdb7c3089d47110ef38a3fcbe4d", + "checksum": "b3c6e70d8b7069b36e38668afb48d55cce542d938bd3b25bced6e9db356c906c", "checksum_algorithm": "sha256" }, { "name": "security", "file": "skills/security/SKILL.md", "version": "20260421025", - "checksum": "53bca57d167a78c01b0edf1fca3ad6200fe4165fdb27d1cc19722dfee7ba6521", + "checksum": "f6f154b990cea5d39d189409801c4478d5351cb5d445f246c07120cbadd24425", "checksum_algorithm": "sha256" }, { "name": "simplify", "file": "skills/simplify/SKILL.md", "version": "20260625001", - "checksum": "146fb31d0945c5e6af086607ff46c11aea5c8e6d8e230076bc083c3574ae18f3", + "checksum": "6c60f49f9561fe30e699cbfcdab19259c1aa4b34cd917d7bf1ac531adb32ac74", "checksum_algorithm": "sha256" }, { "name": "space-setup", "file": "skills/space-setup/SKILL.md", "version": "20260513011", - "checksum": "5064b3e7f397fa026bfe10eb9ee7b14545acbab12f4c19b98764256380e50686", + "checksum": "67a5c30d448b7d1a1fd550cc69dc8c7b050af2d836ce1bb67d1d0c84d78ad769", "checksum_algorithm": "sha256" }, { "name": "terraform", "file": "skills/terraform/SKILL.md", "version": "20260502030", - "checksum": "599a1e19f900d98683d710bbecdbe897d0bcf919934419d1bbaf1474914db0c5", + "checksum": "58d82a79f299a6ab227ff36dd0a1cc39c71e51259f1eda78d1adf4917a216946", "checksum_algorithm": "sha256" }, { "name": "terragrunt", "file": "skills/terragrunt/SKILL.md", "version": "20260502031", - "checksum": "ca39ff5191a5edfa16fd38e6d2d617cfc4288206079698bcbfb30229c50d315a", + "checksum": "89910e245a0712b613be361f682b262c1492ef45fb8e6800d159613779a5b987", "checksum_algorithm": "sha256" }, { "name": "threat-model", "file": "skills/threat-model/SKILL.md", "version": "20260502021", - "checksum": "050590189a5d84faed9edc9253fc55297d2b86980c83438aed2b721346fa964a", + "checksum": "68d2f41fdc7217c0df316f8417fa3f386e0f17562caa09ecd10405f925abd82f", + "checksum_algorithm": "sha256" + }, + { + "name": "upgrade-plan", + "file": "skills/upgrade-plan/SKILL.md", + "version": "20261017001", + "checksum": "e78c6489648b9574d87f5fb807ce2706f9e03a6f57a890f0ce1a9388a8354edb", "checksum_algorithm": "sha256" }, { "name": "verify", "file": "skills/verify/SKILL.md", "version": "20260421026", - "checksum": "72d2979131d2609ec90e9130b1109ec8c42467e5683493336e81f3b571c65915", + "checksum": "ee676a885b9aa2764078458161160a2e0367174f91c10fcb25aacf659bc8f2f0", "checksum_algorithm": "sha256" }, { "name": "vision", "file": "skills/vision/SKILL.md", "version": "20260421027", - "checksum": "8d688153c93138fe7ac97e748c3ee94f86fe8a03c78550d895400ac38303e256", + "checksum": "0b6a83f54c77620f30e2b114869ca4b4964f500cc47af4ed4a468733847fa0a8", + "checksum_algorithm": "sha256" + }, + { + "name": "workflow-check", + "file": "skills/workflow-check/SKILL.md", + "version": "20261017002", + "checksum": "aa68d768a44fed5e142ddc1d66c8958fdf1636284294ecf93dc255e7011b1428", "checksum_algorithm": "sha256" } ], @@ -368,49 +403,49 @@ "name": "architect", "file": "agents/architect.agent.md", "version": "20260514001", - "checksum": "df80bf7a7e63a435866be49a7f0c9222fda5003945b9f7629a03a8d9f74375a3", + "checksum": "32e78f403e974932d315c8efa4dbfe863e1c4d7e0a546769e63f7cee199f87a1", "checksum_algorithm": "sha256" }, { "name": "designer", "file": "agents/designer.agent.md", "version": "20260514001", - "checksum": "5c2125fb4ae1fca15d1b4c621c8e6da0a5512bb4c4938a52a36f25534dae78d5", + "checksum": "b2e3dd6aa205ff11e44dcda1f06b80e01b2b44c1011b0a1cbee8962e79cb4c2b", "checksum_algorithm": "sha256" }, { "name": "engineer", "file": "agents/engineer.agent.md", "version": "20260514001", - "checksum": "a59ef1d8321c7fbe2e04428409c29354ebf85cc039bc3fe74a0bebcc2b3aa29b", + "checksum": "8239b7e880aa26414aa9e0b3524818e0aad8bb892b7ca0af9af6d1a0f253e5a8", "checksum_algorithm": "sha256" }, { "name": "planner", "file": "agents/planner.agent.md", "version": "20260514001", - "checksum": "8a54e9202b9dcb2ca8b479eeae709e7dae4f2f30a9d782bac3aeb463a6dd52af", + "checksum": "e648dcc71fea5989c275af5f4bf204a76615e3bd8195d2ab00e81aaa7a741d4c", "checksum_algorithm": "sha256" }, { "name": "product", "file": "agents/product.agent.md", "version": "20260514001", - "checksum": "570272a093eed52edb7918c0ec4f753eb9fdea4372a7886c628e997ba727cd71", + "checksum": "55b55479eef30115bb00f48a3a1869992f22ba33d1782a096cda059394692bf2", "checksum_algorithm": "sha256" }, { "name": "release", "file": "agents/release.agent.md", "version": "20260514001", - "checksum": "f96cc7bf9907c68d5da1c65d564de302ab1734fbe549ad52a96adf5f841fc74a", + "checksum": "a8879577a8fa1f664c9731104775ea463d5a38c7d76c036c1d766a7a11202b7b", "checksum_algorithm": "sha256" }, { "name": "tester", "file": "agents/tester.agent.md", "version": "20260514001", - "checksum": "4497a4ee20f393101a526e6caeb1c17a64cf3c60aefe638ea5f04655c82a9443", + "checksum": "2e3dc966d3e78e11a381c01bc331e56107164818cf0aceea3528d3cacce59bb9", "checksum_algorithm": "sha256" } ], @@ -418,49 +453,49 @@ { "name": "agent-call-audit", "file": "hooks/agent-call-audit.json", - "version": "3.6.0", + "version": "3.7.8", "checksum": "a03cc5df031670dd4902599048a9fc955a852862b2cb73408f5889ee74baa636", "checksum_algorithm": "sha256" }, { "name": "log-retention-cleanup", "file": "hooks/log-retention-cleanup.json", - "version": "3.6.0", + "version": "3.7.8", "checksum": "2c3048637dc0f85b7196934b0f6c5a2ee9a21739b45bc7a529e2f5531f2b2609", "checksum_algorithm": "sha256" }, { "name": "post-commit-security-scan", "file": "hooks/post-commit-security-scan.json", - "version": "3.6.0", + "version": "3.7.8", "checksum": "154305889deb5676a6b7d686400b14b4237687be130438d19843341addbdff8e", "checksum_algorithm": "sha256" }, { "name": "post-edit-format", "file": "hooks/post-edit-format.json", - "version": "3.6.0", + "version": "3.7.8", "checksum": "5911a2fc0211b268749e5200db8d43eec953f456294c8cbc5556cea9ab11f875", "checksum_algorithm": "sha256" }, { "name": "post-edit-markdown-quality", "file": "hooks/post-edit-markdown-quality.json", - "version": "3.6.0", + "version": "3.7.8", "checksum": "b8ef6b1805492a580902675ccd16564c693ec2ccf30fdb81d6b1d8dce610ab22", "checksum_algorithm": "sha256" }, { "name": "pre-tool-safety-gate", "file": "hooks/pre-tool-safety-gate.json", - "version": "3.6.0", + "version": "3.7.8", "checksum": "1d55d6c9cee6137472e37c9e16febb5a96419fc0813c4c474af5a50ee03ee5a0", "checksum_algorithm": "sha256" }, { "name": "session-audit", "file": "hooks/session-audit.json", - "version": "3.6.0", + "version": "3.7.8", "checksum": "0190aa65dfea26b2129ad8a5304377b2d40febf03779f561194e788bb8b27bfa", "checksum_algorithm": "sha256" } @@ -470,205 +505,84 @@ "name": "git", "file": "instructions/git.instructions.md", "version": "20260421001", - "checksum": "98b80a1ac1bc6449205bbb47ab55e1883db96408a00b387b13ba89c1bc3e607f", + "checksum": "b41e3da9ce908e6143053832353829be0d0c3a0dae99140fedb7ed83d7189f84", "checksum_algorithm": "sha256" }, { "name": "helm", "file": "instructions/helm.instructions.md", "version": "20260502040", - "checksum": "98074afe634848f3746b719785bb6ea193954c8a2d18b5be384a283d5037d1f8", + "checksum": "dd90cca8401be666a8ca7703a6fd0917df546ec9904f142b56e14e851b51a5ac", "checksum_algorithm": "sha256" }, { "name": "java", "file": "instructions/java.instructions.md", "version": "20260502001", - "checksum": "898d7bec68b530f4bebdf06b0f5187a723235dcfadbf7b5543458ce8c57d3bbd", + "checksum": "5556bbc815d2406472fb168e143b1df2eabe2d7935e24ac466c1e9802d80ae64", "checksum_algorithm": "sha256" }, { "name": "k8s", "file": "instructions/k8s.instructions.md", "version": "20260502039", - "checksum": "988deef8f67a0014fc5048cc1b9176a8fcaa2ddbc31974ee51c69d79e415d942", + "checksum": "25f892ec4c459aa9d7c924197d3bd3f094c7f987d586f6b46b54f243329d5d73", "checksum_algorithm": "sha256" }, { "name": "markdown", "file": "instructions/markdown.instructions.md", "version": "20260502002", - "checksum": "7fd126db0f2aee3a85eb77ce93b50bb38d5027acdd4ae7cd5849a92a7b7c6ceb", + "checksum": "d03f1da80b1a0913231972bbe9dc37833194f96f5dfebefe888e724191734080", "checksum_algorithm": "sha256" }, { "name": "python", "file": "instructions/python.instructions.md", "version": "20260421002", - "checksum": "b1629161e831aeca03c29b5bc3ff03e1d06d6a90bb6d8f746a1a1a44086f3f2e", + "checksum": "c31f929e489c28c4be92cab4483b13eeb575baf6e4d3995b1c806f81d69800c3", "checksum_algorithm": "sha256" }, { "name": "rancher", "file": "instructions/rancher.instructions.md", "version": "20260502041", - "checksum": "3bd18bea97ca1515f6fac7543ddd242181c740ee529494e2f2c7a7801ef04ab5", + "checksum": "796d1c16f97b4bbe890293b254949935e1af97eb58ec52c9504d1f5323459628", "checksum_algorithm": "sha256" }, { "name": "security", "file": "instructions/security.instructions.md", "version": "20260502003", - "checksum": "004ca7d875f1d3aa81d25f721db2a5a08429ccad7013ae83b2bb90e5fcdffe1c", + "checksum": "001d506762be4e2323cb7c672cd29fdc00cf94a6ef68e08e049cb61690f3e76a", "checksum_algorithm": "sha256" }, { "name": "terraform", "file": "instructions/terraform.instructions.md", "version": "20260502034", - "checksum": "881d4c803a647da37c36b805071343a7d57840e901efc71cb4ec9e160501025a", + "checksum": "ecf3257ebae88d937253e25b6a8b2a121ab53d62bf7f70ecbd76d784d01731e0", "checksum_algorithm": "sha256" }, { "name": "terragrunt", "file": "instructions/terragrunt.instructions.md", "version": "20260502035", - "checksum": "7cb98962ba3457d1163c7498efd05240b63d0c3a94d763aeb3527ae4e227e045", + "checksum": "6660677347ba0cb52e858f81f3dcb1177b42dfba02148cddb865dc08a2adb4df", "checksum_algorithm": "sha256" }, { "name": "testing", "file": "instructions/testing.instructions.md", "version": "20260502004", - "checksum": "c0652c822f66494b8e1cabbccdacb3197a6bb723f7ac0d33f7d10a2f08d2db07", + "checksum": "417c388a626a7c6dbd9072f5ab8f6ff47e7d2cabe8218cae61aefae415668aed", "checksum_algorithm": "sha256" }, { "name": "typescript", "file": "instructions/typescript.instructions.md", "version": "20260502005", - "checksum": "34c518a65b1e0cc4e95cca54c1b10fa2d3a597af658def40934ff83edf3a88c4", - "checksum_algorithm": "sha256" - } - ], - "prompts": [ - { - "name": "api-design-review", - "file": "prompts/api-design-review.prompt.md", - "version": "20260502006", - "checksum": "2b545504fe2ca6ed04b5a7d97cc8f1a8ce029a1d650c3ce169de8bca679547a3", - "checksum_algorithm": "sha256" - }, - { - "name": "architecture-risk", - "file": "prompts/architecture-risk.prompt.md", - "version": "20260502007", - "checksum": "49c8c803f6da959bdecad75acef6532180adbd663f20acf3e4bc47a92ef69b35", - "checksum_algorithm": "sha256" - }, - { - "name": "artifact-integrity", - "file": "prompts/artifact-integrity.prompt.md", - "version": "20260513002", - "checksum": "7ebc3d7b0bb4a16353e5e19064d8968c5bd176f988b71b58b19e7a3b6d99d2a3", - "checksum_algorithm": "sha256" - }, - { - "name": "ci-triage", - "file": "prompts/ci-triage.prompt.md", - "version": "20260513006", - "checksum": "9d61be0f0df49541fd460784dd008b014e8e6d8397305a5d88bdd80e4f8ebbdc", - "checksum_algorithm": "sha256" - }, - { - "name": "dependency-audit", - "file": "prompts/dependency-audit.prompt.md", - "version": "20260502009", - "checksum": "0f3e97dd31b2e3fbbe42165922580c148c5341cba6d8d895154445f008dc129d", - "checksum_algorithm": "sha256" - }, - { - "name": "incident-timeline", - "file": "prompts/incident-timeline.prompt.md", - "version": "20260502010", - "checksum": "e5ef64a53a5533a491d357f9ed021ae50f929e19229556f6942a2730f911ded0", - "checksum_algorithm": "sha256" - }, - { - "name": "migration-plan", - "file": "prompts/migration-plan.prompt.md", - "version": "20260513010", - "checksum": "ea4aaf48901af5a4dec17a92d560eec717910f904a3190fbc0c1fe0c473cd846", - "checksum_algorithm": "sha256" - }, - { - "name": "migration-safety", - "file": "prompts/migration-safety.prompt.md", - "version": "20260502011", - "checksum": "6a8e7d995c24391d66e064f46dde67d220b870c8e9b583df0ecc89f4195c9cfb", - "checksum_algorithm": "sha256" - }, - { - "name": "ops-readiness", - "file": "prompts/ops-readiness.prompt.md", - "version": "20260513009", - "checksum": "f6c9cbb326dd178e92faf9e412041b3a9a015ddccab41415fa3da078a23d5edc", - "checksum_algorithm": "sha256" - }, - { - "name": "quick-review", - "file": "prompts/quick-review.prompt.md", - "version": "20260502008", - "checksum": "7d4362e35180953f32c58b15b8bde51303ed69bce06349c19b148908a5c83c85", - "checksum_algorithm": "sha256" - }, - { - "name": "reasoning", - "file": "prompts/reasoning.prompt.md", - "version": "20260626001", - "checksum": "0afebccdc84d0c31aa44858d40f02183c678c3707cfb63db29401b1d27860418", - "checksum_algorithm": "sha256" - }, - { - "name": "release-check", - "file": "prompts/release-check.prompt.md", - "version": "20260513004", - "checksum": "75cd201e04fa59ffd4de8e7f75568d8b13405493d3a6be12188155d90a7edde9", - "checksum_algorithm": "sha256" - }, - { - "name": "repo-assessment", - "file": "prompts/repo-assessment.prompt.md", - "version": "20260513001", - "checksum": "130674bddb0ae0954cac5af9518566e320b7caef4e314faaa0ec84682df286f1", - "checksum_algorithm": "sha256" - }, - { - "name": "template-impact", - "file": "prompts/template-impact.prompt.md", - "version": "20260513005", - "checksum": "e584f8e0ac38ac3baabe1b3181a8f0f43151b2250c8f4ffd754370cc026b88d9", - "checksum_algorithm": "sha256" - }, - { - "name": "test-gaps", - "file": "prompts/test-gaps.prompt.md", - "version": "20260513007", - "checksum": "7386004b8e6f38608122e3357aa65f8927a9005b4bfd5f336865ea2b049d8d63", - "checksum_algorithm": "sha256" - }, - { - "name": "upgrade-plan", - "file": "prompts/upgrade-plan.prompt.md", - "version": "20260513008", - "checksum": "e3c8c94fefbe59333b109fb164983612285929b189c1d2534bd75b4d19a535d4", - "checksum_algorithm": "sha256" - }, - { - "name": "workflow-check", - "file": "prompts/workflow-check.prompt.md", - "version": "20260513003", - "checksum": "02cd2971f68172888528eb19c2dd559c35e1ce060628dddc7e4bef2ca8192f9b", + "checksum": "a320659b42fdda47e5548a36b451d907c7c13daf93e4267721cf97a566e51101", "checksum_algorithm": "sha256" } ] diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 38f59e9c..ec4fb272 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -4,9 +4,16 @@ Thanks for your interest in contributing to vstack. ## Prerequisites -- Python 3.11-3.14 +- Python 3.11-3.15 (Python 3.14 is the default development and CI runtime) - Virtual environment enabled +The repository's `.python-version` selects Python 3.14.8 by default and lists +the patch versions used for the 3.11-3.15 test matrix. With pyenv, +run `pyenv install --skip-existing 3.14.8` before setup and install the other +listed versions before running the full test matrix. +CI selects the latest available patch release for each minor version. +Python 3.11 remains supported while it receives upstream security updates. + ## Setup ```bash @@ -57,14 +64,14 @@ make check Use this table to find the minimum set of checks to run after each type of change. Run `make check` before opening a PR when your change touches multiple areas. -| Change type | Required checks | -| ----------------------------------------------------------------------- | ---------------------------------------------------------------------- | -| `src/vstack/_templates/agents/`, `skills/`, `instructions/`, `prompts/` | `python3 -m vstack install`, `make test-local`, `make markdown-format` | -| `src/vstack/_templates/hooks/` | `python3 -m vstack install`, `make test-local` | -| `docs/**/*.md` | `make markdown-format` | -| `src/**/*.py` or `tests/**/*.py` | `make test-local` (run `make check` before merge) | -| CLI behavior, manifest logic, or workflow contract | `make check` | -| `pyproject.toml`, `Makefile`, or CI workflow files | `make check` | +| Change type | Required checks | +| ----------------------------------------------------------- | ---------------------------------------------------------------------- | +| `src/vstack/_templates/agents/`, `skills/`, `instructions/` | `python3 -m vstack install`, `make test-local`, `make markdown-format` | +| `src/vstack/_templates/hooks/` | `python3 -m vstack install`, `make test-local` | +| `docs/**/*.md` | `make markdown-format` | +| `src/**/*.py` or `tests/**/*.py` | `make test-local` (run `make check` before merge) | +| CLI behavior, manifest logic, or workflow contract | `make check` | +| `pyproject.toml`, `Makefile`, or CI workflow files | `make check` | ### Coverage requirement @@ -115,7 +122,7 @@ type(optional-scope)!: short summary - Domain and backend areas: `api`, `auth`, `permissions`, `serializer`, `viewset`, `orm`, `migrations`, `admin`, `settings`. - Tooling and workflow areas: `deps`, `ci`, `docs`, `build`, `style`, `release`, `workflow`. - Quality and test areas: `test`, `tests`. -- Project modules: `cli`, `agents`, `skills`, `instructions`, `prompts`, `frontmatter`, `artifacts`. +- Project modules: `cli`, `agents`, `skills`, `instructions`, `hooks`, `frontmatter`, `artifacts`. ### 5) Examples diff --git a/Makefile b/Makefile index 1f33ced5..1da0a0af 100644 --- a/Makefile +++ b/Makefile @@ -30,14 +30,14 @@ help: @echo " make setup - create .venv, install dev tools, install pre-commit hook" @echo " make format - format Python and Markdown" @echo " make lint - lint Python" - @echo " make test - run tests on Python 3.11-3.14 via tox" + @echo " make test - run tests on Python 3.11-3.15 via tox" @echo " make test-local - run pytest on current interpreter only" @echo " make test-fixtures - run fixture-only generator tests without coverage" @echo " make check - full local quality gate" @echo " make verify-fast - fast deterministic checks: format-check + lint + typecheck + test-local" @echo " make verify-full - full verification profile: check + vstack-validate" @echo " make ci - check + vstack template validation" - @echo " make tox - run pytest across Python 3.11-3.14 (if interpreters are available)" + @echo " make tox - run pytest across Python 3.11-3.15 (if interpreters are available)" @echo " make clean - remove build/cache artifacts" @echo " make vstack-install - install generated artifacts into target" @echo "" @@ -62,14 +62,14 @@ help-all: @echo " make markdown-format-check - run markdown formatting check hook (may rewrite files)" @echo " make markdown-lint - lint Markdown via pre-commit markdownlint hook" @echo " make typecheck - run mypy on src/ and tests/" - @echo " make test - run pytest matrix via tox (py311, py312, py313, py314)" + @echo " make test - run pytest matrix via tox (py311, py312, py313, py314, py315)" @echo " make test-local - run pytest on current interpreter only" @echo " make test-fixtures - run fixture-only generator tests without coverage" @echo " make check - run format-check + markdown checks + lint + typecheck + test" @echo " make verify-fast - run format-check + lint + typecheck + test-local" @echo " make verify-full - run check + vstack-validate" @echo " make ci - run check + vstack-validate" - @echo " make tox - run tox pytest matrix (py311, py312, py313, py314)" + @echo " make tox - run tox pytest matrix (py311, py312, py313, py314, py315)" @echo " make tox-all - run all tox envs (tests + lint + type)" @echo " make vstack-validate - run vstack validate" @echo " make vstack-install - run vstack install --target (default .)" @@ -138,7 +138,7 @@ test-fixtures: $(VENV_PYTHON) -m pytest -q tests/vstack/artifacts/test_generator.py -k "golden_fixture or defect_fixture" --no-cov test: - $(TOX_PYTHON) -m tox -e py311,py312,py313,py314 + $(TOX_PYTHON) -m tox -e py311,py312,py313,py314,py315 check: format-check markdown-lint lint typecheck test @@ -149,7 +149,7 @@ verify-full: check vstack-validate ci: check vstack-validate tox: - $(TOX_PYTHON) -m tox -e py311,py312,py313,py314 + $(TOX_PYTHON) -m tox -e py311,py312,py313,py314,py315 tox-all: $(TOX_PYTHON) -m tox diff --git a/README-pypi.md b/README-pypi.md index ccdfc0b2..c24cbf07 100644 --- a/README-pypi.md +++ b/README-pypi.md @@ -3,7 +3,7 @@

[![PyPI version](https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fpypi.org%2Fpypi%2Fvstack%2Fjson&query=%24.info.version&label=PyPI&color=0B8A6F&cacheSeconds=300)](https://pypi.org/project/vstack/) -[![Python version](https://img.shields.io/badge/python-3.11--3.14-0B8A6F)](https://github.com/eschaar/vstack/blob/main/pyproject.toml) +[![Python version](https://img.shields.io/badge/python-3.11--3.15-0B8A6F)](https://github.com/eschaar/vstack/blob/main/pyproject.toml) [![Verify status](https://img.shields.io/github/actions/workflow/status/eschaar/vstack/verify.yml?label=verify&color=1D6FA5)](https://github.com/eschaar/vstack/actions/workflows/verify.yml) [![Security checks](https://img.shields.io/github/actions/workflow/status/eschaar/vstack/security.yml?label=security&color=B15E00)](https://github.com/eschaar/vstack/actions/workflows/security.yml) [![Runtime: PyYAML](https://img.shields.io/badge/runtime-PyYAML-5B6C8F)](https://github.com/eschaar/vstack/blob/main/pyproject.toml) @@ -12,7 +12,7 @@ The VS Code-native AI workflow system for backend engineering. -vstack installs structured agents, skills, instructions, and prompts into `.github/` so GitHub Copilot Agent Mode can run repeatable backend workflows with clear role boundaries. +vstack installs structured agents, skills, instructions, and hooks into `.github/` so GitHub Copilot Agent Mode can run repeatable backend workflows with clear role boundaries. It provides six delivery roles for end-to-end software work: `product`, `architect`, `designer`, `engineer`, `tester`, and `release`, coordinated by `planner`. diff --git a/README.md b/README.md index 797112d4..a6ca6416 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ [![PyPI version](https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fpypi.org%2Fpypi%2Fvstack%2Fjson&query=%24.info.version&label=PyPI&color=0B8A6F&cacheSeconds=300 "Latest PyPI release")](https://pypi.org/project/vstack/) -[![Python version](https://img.shields.io/badge/python-3.11--3.14-0B8A6F "Supported Python versions")](pyproject.toml) +[![Python version](https://img.shields.io/badge/python-3.11--3.15-0B8A6F "Supported Python versions")](pyproject.toml) [![Verify status](https://img.shields.io/github/actions/workflow/status/eschaar/vstack/verify.yml?label=verify&color=1D6FA5 "Build and test status")](https://github.com/eschaar/vstack/actions/workflows/verify.yml) [![Security checks](https://img.shields.io/github/actions/workflow/status/eschaar/vstack/security.yml?label=security&color=B15E00 "Security workflow status")](https://github.com/eschaar/vstack/actions/workflows/security.yml) [![Runtime: PyYAML](https://img.shields.io/badge/runtime-PyYAML-5B6C8F "One runtime dependency: PyYAML")](pyproject.toml) @@ -18,7 +18,7 @@ vstack is a VS Code-native AI engineering workflow system for backend services, libraries, APIs, and adjacent platform work. It installs structured agents, -skills, instructions, and prompts into `.github/` so GitHub Copilot Agent Mode +skills, instructions, and hooks into `.github/` so GitHub Copilot Agent Mode has a clear operating model instead of ad hoc chat prompts. What gets built is determined by the product vision. vstack fixes the delivery @@ -115,7 +115,7 @@ ______________________________________________________________________ - [CLI commands reference](docs/user/reference/cli-commands.md) - [Configuration reference](docs/user/reference/configuration.md) - [Hooks reference](docs/user/reference/hooks.md) -- [Prompts overview](docs/user/reference/prompts-overview.md) +- [Prompt-to-skill migration](docs/user/reference/prompt-migration.md) - [Skills overview](docs/user/reference/skills-overview.md) - [Instructions overview](docs/user/reference/instructions-overview.md) - [Workflow modes explanation](docs/user/explanation/workflow-modes.md) diff --git a/docs/architecture/adr/007-python-runtime.md b/docs/architecture/adr/007-python-runtime.md index 82341628..ca188c4e 100644 --- a/docs/architecture/adr/007-python-runtime.md +++ b/docs/architecture/adr/007-python-runtime.md @@ -35,12 +35,27 @@ Zero external Python dependencies at runtime. All runtime code uses stdlib only: ## rationale -Python 3.11–3.14 is the supported range, matching CI and type-checking compatibility -requirements. The package is distributed via PyPI with no runtime dependencies beyond -the Python standard library. +Python 3.11–3.15 is the supported and tested range. Python 3.14 is the default +development, build, and single-version CI runtime; compatibility targets for +linters and type checkers remain at Python 3.11. + +As of 2026-10-17, the project adds Python 3.15 while retaining Python 3.11, +which receives upstream security support until October 2027. Dropping 3.11 +would reduce the validation range but unnecessarily exclude existing consumers; +defaulting to 3.15 would adopt the newest runtime immediately. Instead, 3.14 +remains the stable default while the full suite validates 3.11 through 3.15. +Package metadata declares `>=3.11` without an upper bound; future versions are +not claimed as tested until added to the matrix. + +The repository pins the default interpreter to Python 3.14.8 and lists exact +patch versions for the other supported minors in `.python-version`. CI uses the +latest available patch in each selected minor. Existing virtual environments +are not automatically recreated when these pins change. ## impact on future orchestrated pipeline The future orchestrated pipeline runner will be implemented in Python. `asyncio` + `subprocess` provide sufficient primitives for sequential and parallel stage execution. +Any future orchestrated pipeline runner must also support Python 3.11–3.15; +the default interpreter does not permit using Python 3.14-only APIs in shared code. diff --git a/docs/architecture/adr/032-skills-replace-prompts.md b/docs/architecture/adr/032-skills-replace-prompts.md new file mode 100644 index 00000000..affa8582 --- /dev/null +++ b/docs/architecture/adr/032-skills-replace-prompts.md @@ -0,0 +1,66 @@ +# ADR-032: Skills Replace Prompt Artifacts + +**Date:** 2026-10-17 +**Status:** accepted + +## Context + +The VS Code Copilot harness uses skills for reusable workflows and does not load +`*.prompt.md` files. The Local harness still supports them, but vstack should +provide one portable workflow surface rather than duplicate skills and prompts. +Existing installations contain tracked prompts that must not be orphaned. + +## Decision + +Remove the prompt artifact family in the next major release. Reuse existing +skills where workflows overlap and convert unique prompts to skills with +`disable-model-invocation: true`. + +Distribute only workflows useful to consumer projects. Keep the source-specific +`artifact-integrity` audit as a hand-authored repository-only skill under +`.github/skills/`, without a package template, generation footer, or manifest +ownership. Its old prompt maps to the distributed `inspect` skill. + +Keep legacy manifest data readable solely for migration. `install` and `init` +automatically retire known prompts when skills are selected, replacement skills +are successfully available, and the old files match their stored checksums. +Preserve and report unmanaged, modified, unknown, or unsafe files. + +## Alternatives Considered + +- Keep prompts unchanged: compatible with Local sessions but unavailable to the + Copilot harness. Rejected. +- Generate both prompts and skills: retains compatibility but duplicates command + discovery and maintenance. Rejected. +- Retire prompts with safe migration: one workflow surface with an explicit + breaking-change boundary. Selected. +- Distribute repository maintenance skills or add a local-template generator: + unnecessary consumer coupling and configuration. Rejected in favor of native, + hand-authored repository skills. + +## Rationale + +Roles belong to agents and reusable procedures belong to skills. A separate prompt +generator no longer provides sufficient value. Reusing manifest checksums and the +existing conservative install policy prevents loss of local work. Missing or +conflicting replacement skills defer cleanup instead of removing usable workflows. + +## Consequences + +Prompt selectors, public generator imports, and some old command names disappear. +Users with custom prompt templates must convert those themselves. The migration +guide records replacement commands. Existing skills keep their invocation policy; +converted skills remain opt-in and do not reproduce prompt-specific agent, +model, or tool selection. + +For the Option B pipeline, role boundaries and handoff prompt strings remain +unchanged. Stages invoke skills rather than prompt artifacts. +Repository-only maintenance skills are not dependencies of consumer pipeline stages. + +## Related ADRs + +- [ADR-005](005-vscode-prompt-format.md): superseded prompt-generation direction. +- [ADR-012](012-flat-templates-install-time-generation.md): retains source-first, + install-time generation for the remaining families. +- [ADR-015](015-conservative-install-by-default.md): preserves local modifications. +- [ADR-020](020-install-init-command-semantics.md): both commands share migration. diff --git a/docs/architecture/homebrew-publish-plan.md b/docs/architecture/homebrew-publish-plan.md index 2b35bbe3..4f6a30aa 100644 --- a/docs/architecture/homebrew-publish-plan.md +++ b/docs/architecture/homebrew-publish-plan.md @@ -117,7 +117,7 @@ class Vstack < Formula license "MIT" head "https://github.com/eschaar/vstack.git", branch: "main" - depends_on "python@3.11" + depends_on "python@3.14" resource "pyyaml" do url "https://files.pythonhosted.org/packages/source/P/PyYAML/PyYAML-6.0.2.tar.gz" diff --git a/docs/architecture/overview.md b/docs/architecture/overview.md index ab558ceb..9773b96f 100644 --- a/docs/architecture/overview.md +++ b/docs/architecture/overview.md @@ -6,7 +6,7 @@ ## overview vstack is a VS Code–native AI engineering workflow system. It provides template-driven -skills, agents, hooks, instructions, and prompts for planning, reviewing, verifying, and +skills, agents, hooks, and instructions for planning, reviewing, verifying, and releasing software via GitHub Copilot Agent Mode. **System style:** `platform` — a standalone CLI tool and SDK. vstack installs @@ -32,12 +32,11 @@ vstack/ │ ├── skills/ ← SKILL_SCHEMA, SKILL_TYPE │ ├── agents/ ← AGENT_SCHEMA, AGENT_TYPE │ ├── instructions/ ← instruction config and wrappers -│ ├── prompts/ ← prompt config and wrappers │ ├── hooks/ ← hook config and YAML-to-JSON generator │ ├── manifest/ ← Manifest, ManifestFile, ArtifactEntry, checksums │ ├── cli/ ← interface, registry, service, per-command handlers, helpers │ └── _templates/ ← source templates for all artifact types -│ ├── skills/, agents/, hooks/, instructions/, prompts/ +│ ├── skills/, agents/, hooks/, instructions/ │ ├── docs/ ← baseline doc stubs (seeded by vstack install) │ └── project/ ← .vstack/ config and artifact starter templates ├── docs/ @@ -53,15 +52,19 @@ vstack/ │ │ └── session/ ← planner-run cache files (gitignored) │ ├── vstack.json ← machine-generated manifest (JSON) │ └── templates/ ← project-owned artifact starter templates (seeded by vstack install) -├── .github/ ← generated Copilot artifacts (never edit directly) +├── .github/ ← generated artifacts plus hand-authored repository skills │ ├── skills//SKILL.md │ ├── agents/.agent.md │ ├── hooks/.json -│ ├── instructions/.instructions.md -│ └── prompts/.prompt.md +│ └── instructions/.instructions.md └── README.md ``` +Distributed skills are template-backed and manifest-managed. Repository-only +skills, such as `.github/skills/artifact-integrity/SKILL.md`, are hand-authored +in this repository, have no templates or manifest entries, and are not packaged +or installed for consumers. Generated files remain template-owned. + ______________________________________________________________________ ## components @@ -117,7 +120,7 @@ have defined skill access and artifact ownership. See ### 5. manifest (`.vstack/vstack.json`) Generated at install time at `.vstack/vstack.json`. Tracks every `.github/` artifact -installed by `vstack init` (skills, agents, hooks, instructions, and prompts), including a +installed by `vstack init` (skills, agents, hooks, and instructions), including a per-file SHA-256 checksum, version, and algorithm so that: - `vstack uninstall` removes exactly the files it installed. @@ -133,6 +136,12 @@ The manifest schema is versioned (`manifest_version` field). Operations that req the current schema fail fast with an upgrade hint rather than silently misbehaving. See ADR-014 and ADR-020. +Legacy `prompts` entries remain readable for migration only. When skills are +selected, `install` and `init` automatically remove known, unchanged prompts after +their replacement skills are available. Modified, unknown, or unsafe files remain +tracked and are reported for manual review. See +[ADR-032](adr/032-skills-replace-prompts.md). + Writes are atomic: content is staged to a sibling `.tmp` file and promoted with `os.replace` so a crash or `KeyboardInterrupt` cannot produce a partially-written manifest. See ADR-016. @@ -209,7 +218,7 @@ These bind architecture decisions. Full list in `docs/product/requirements.md`. | ID | Requirement | Architectural binding | | ----- | ----------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------- | | NFR-1 | No external binary dependencies in skill template content | ADR-006; one pip dependency (`pyyaml`) allowed per ADR-025 | -| NFR-2 | Python 3.11–3.14 compatibility | ADR-007 | +| NFR-2 | Python 3.11–3.15 compatibility; Python 3.14 by default | ADR-007 | | NFR-3 | Manifest writes are atomic | ADR-016 | | NFR-4 | All public behavior covered by automated tests; CI enforces test pass | `tests/` structure, `verify.yml` workflow | | NFR-5 | CLI operates standalone; no VS Code process required for CLI operations | ADR-006; only `pyyaml` required at runtime (ADR-025) | diff --git a/docs/changes/retire-prompts_skill_migration_20261017.md b/docs/changes/retire-prompts_skill_migration_20261017.md new file mode 100644 index 00000000..3b223fde --- /dev/null +++ b/docs/changes/retire-prompts_skill_migration_20261017.md @@ -0,0 +1,82 @@ +# Retire Prompts in Favor of Skills + +## Metadata + +```yaml +status: IMPLEMENTED +type: migration +reference: user-request-20261017 +last_modified: 2026-10-17 +``` + +## Goal and Context + +Retire the prompt artifact family because the Copilot harness does not load +prompt files. Preserve reusable workflows as skills without maintaining duplicate +procedures. This is a breaking change intended for the next major release. + +## AS-IS + +vstack generates 17 built-in prompts alongside skills, agents, instructions, and +hooks. `init --prune` can remove obsolete artifacts only for selected, registered +families. Removing the prompt generator alone would leave installed prompts and +their manifest entries behind. + +## TO-BE + +- Remove the prompt generator, schema, CLI type, and source templates. +- Reuse existing skills for overlapping workflows. +- Convert unique workflows to manually invoked skills. +- During `install` and `init` with skills selected, remove unchanged legacy prompts + only after their replacement skills are successfully available with no unresolved + template placeholders. +- Preserve unmanaged, modified, checksum-less, unsafe-path, and unknown prompts. + Report why migration was deferred and retain manifest tracking for retry. +- Keep legacy manifest parsing, dry-run behavior, and scoped installs intact. +- Do not change agent handoff prompt strings or release/tag automation. + +## Impact (High Level) + +- Architecture: four active artifact families; legacy prompt data is migration-only. +- API/data/model: remove `prompt` selectors and public prompt generator imports. +- Security/privacy: require manifest ownership, checksums, canonical paths, and + non-symlink destinations before deleting a legacy file. +- Operations: upgrade with `vstack install` or `vstack init`; repeated runs are + idempotent. Custom prompt workflows require manual conversion. +- Option B: roles and handoffs remain unchanged; reusable procedures use skills. + +## Acceptance Criteria + +1. Fresh installs produce no prompt files and expose no prompt artifact type. +1. Each retired built-in has a documented replacement skill. +1. Unique workflows retain their instructions and explicit invocation behavior. +1. Upgrades install replacements before removing safe legacy prompts. +1. Unsafe or modified files remain untouched, tracked, and explicitly reported. +1. Dry runs and non-skill installs do not remove prompts. +1. Tests cover fresh installs, upgrades, collisions, exclusions, and repeat runs. + +## Test Scenarios + +- Upgrade an old manifest containing all built-in prompts. +- Preserve a modified, untracked, checksum-less, unknown, or symlinked prompt. +- Preserve prompts when replacement skills are excluded or collide with local files. +- Reject unsafe manifest paths without accessing files outside the install root. +- Retry a partially completed migration and clear entries for already missing files. +- Confirm dry-run leaves files and manifest bytes unchanged. +- Preserve prompts when a replacement partial is missing, including install, + update, unchanged, and dry-run paths; retry retirement after repairing the partial. +- Confirm CLI rejection of removed selectors and valid output for all four families. +- Run lint, type checking, tests with 100% coverage, and source validation. + +## Verification + +- Full suite: 698 tests passed with 100% coverage on Python 3.14. +- Ruff lint, Python formatting, and mypy passed. +- Shipped templates validate; installed artifact checksums and metadata verify. +- Repository migration removed all 17 tracked prompts and installed six explicit-only skills. +- A repeat update dry-run reports no installations, updates, or preserved conflicts. +- Changed Markdown passes mdformat with the repository's GFM plugin; local links resolve. +- The pre-commit wrapper could not initialize its remote hook environments because + GitHub SSH authentication is unavailable. Markdownlint was not run. The full + Ruff formatting command also reports an unrelated pre-existing formatting issue + in the `refactor` skill's Python examples; those examples were left unchanged. diff --git a/docs/design/cicd.md b/docs/design/cicd.md index 18b6f203..a350391c 100644 --- a/docs/design/cicd.md +++ b/docs/design/cicd.md @@ -1,7 +1,7 @@ # vstack CI/CD Pipeline > Maintained by: **designer** role\ -> Last updated: 2026-06-02 +> Last updated: 2026-10-17 ## Overview @@ -22,8 +22,8 @@ Their jobs are merge-blocking when configured as required status checks in the ` | Workflow | Trigger | Responsibility | | --------------------------------- | ------------------------------------------------- | ----------------------------------------------------------------------------------- | | `.github/workflows/commit.yml` | push to non-main branches, pull_request to `main` | Commit/branch policy and lint/typecheck | -| `.github/workflows/check.yml` | push to non-main branches, pull_request to `main` | Single-version unit tests (py3.11) | -| `.github/workflows/verify.yml` | pull_request to `main` | Cross-version test matrix (py3.11–3.14), fixture tests, and artifact install verify | +| `.github/workflows/check.yml` | push to non-main branches, pull_request to `main` | Single-version unit tests (py3.14) | +| `.github/workflows/verify.yml` | pull_request to `main` | Cross-version test matrix (py3.11–3.15), fixture tests, and artifact install verify | | `.github/workflows/security.yml` | pull_request to `main` | Dependency vulnerability scan and secret scan | | `.github/workflows/codeql.yml` | push/pull_request to `main` + weekly schedule | Code scanning for GitHub Actions and Python | | `.github/workflows/automerge.yml` | pull_request_target to `main` | Dependabot auto-approve/auto-merge policy gate | @@ -46,13 +46,13 @@ sequenceDiagram Dev->>GH: [1] Push commit to feature branch GH->>GH: [2a] commit.yml / Validate Commit Messages GH->>GH: [2b] commit.yml / Format Lint Typecheck - GH->>GH: [2c] check.yml / Unit Tests (py3.11) + GH->>GH: [2c] check.yml / Unit Tests (py3.14) Dev->>GH: [3] Open PR to main GH->>GH: [4a] commit.yml / Validate Commit Messages GH->>GH: [4b] commit.yml / Format Lint Typecheck - GH->>GH: [4c] check.yml / Unit Tests (py3.11) - GH->>GH: [4d] verify.yml / Tests (py3.11) — Tests (py3.14) [matrix ×4] + Fixture Tests (fast) + GH->>GH: [4c] check.yml / Unit Tests (py3.14) + GH->>GH: [4d] verify.yml / Tests (py3.11) — Tests (py3.15) [matrix ×5] + Fixture Tests (fast) GH->>GH: [4e] verify.yml / Artifact Install Verify GH->>GH: [4f] security.yml / Dependency and Secret Scan Dev->>GH: [5] Approve and merge PR @@ -60,7 +60,7 @@ sequenceDiagram GH->>GH: [6] Push to main triggers release.yml GH->>RP: [7] release.yml / Release Please (PR + Tag + Notes) RP-->>GH: [8] Create or update release PR branch + PR - GH->>GH: [9a] verify.yml / Tests (py3.11) — Tests (py3.14) [matrix ×4] + Fixture Tests (fast) + GH->>GH: [9a] verify.yml / Tests (py3.11) — Tests (py3.15) [matrix ×5] + Fixture Tests (fast) GH->>GH: [9b] verify.yml / Artifact Install Verify GH->>GH: [9c] security.yml / Dependency and Secret Scan @@ -82,13 +82,13 @@ sequenceDiagram 1. `[1]` Push commit to feature branch. 1. `[2a]` `commit.yml / Validate Commit Messages` — checks commit format, branch name, and reserved scope policy. -1. `[2b]` `commit.yml / Format Lint Typecheck` — runs `make format-check`, `make lint`, `make typecheck` on py3.11. -1. `[2c]` `check.yml / Unit Tests` — runs `make test-local` on py3.11. +1. `[2b]` `commit.yml / Format Lint Typecheck` — runs `make format-check`, `make lint`, `make typecheck` on py3.14, targeting compatibility with py3.11. +1. `[2c]` `check.yml / Unit Tests` — runs `make test-local` on py3.14. 1. `[3]` Open PR to `main`. 1. `[4a]` `commit.yml / Validate Commit Messages` — validates commit messages, branch policy, and reserved `docs(changelog)` scope. -1. `[4b]` `commit.yml / Format Lint Typecheck` — runs `make format-check`, `make lint`, `make typecheck` on py3.11. -1. `[4c]` `check.yml / Unit Tests` — runs `make test-local` on py3.11. -1. `[4d]` `verify.yml / Tests (py3.11)` through `Tests (py3.14)` plus `Fixture Tests (fast)` — matrix jobs run `make test-local`; fixture job runs `make test-fixtures`. +1. `[4b]` `commit.yml / Format Lint Typecheck` — runs `make format-check`, `make lint`, `make typecheck` on py3.14, targeting compatibility with py3.11. +1. `[4c]` `check.yml / Unit Tests` — runs `make test-local` on py3.14. +1. `[4d]` `verify.yml / Tests (py3.11)` through `Tests (py3.15)` plus `Fixture Tests (fast)` — matrix jobs run `make test-local`; fixture job runs `make test-fixtures`. 1. `[4e]` `verify.yml / Artifact Install Verify` — installs vstack into a temp dir and runs `vstack verify`. 1. `[4f]` `security.yml / Dependency and Secret Scan` — pip-audit + trufflehog diff scan. 1. `[5]` Approve and merge PR. @@ -119,13 +119,13 @@ sequenceDiagram DB->>GH: [1] Push dependency branch update GH->>GH: [2a] commit.yml / Validate Commit Messages GH->>GH: [2b] commit.yml / Format Lint Typecheck - GH->>GH: [2c] check.yml / Unit Tests (py3.11) + GH->>GH: [2c] check.yml / Unit Tests (py3.14) DB->>GH: [3] Open dependency PR to main GH->>GH: [4a] commit.yml / Validate Commit Messages GH->>GH: [4b] commit.yml / Format Lint Typecheck - GH->>GH: [4c] check.yml / Unit Tests (py3.11) - GH->>GH: [4d] verify.yml / Tests (py3.11) — Tests (py3.14) [matrix ×4] + GH->>GH: [4c] check.yml / Unit Tests (py3.14) + GH->>GH: [4d] verify.yml / Tests (py3.11) — Tests (py3.15) [matrix ×5] GH->>GH: [4e] verify.yml / Artifact Install Verify GH->>GH: [4f] security.yml / Dependency and Secret Scan Note over GH: [5] automerge.yml job runs only if actor == dependabot[bot] @@ -145,7 +145,7 @@ sequenceDiagram GH->>GH: [11] Push to main triggers release.yml GH->>RP: [12] release.yml / Release Please (PR + Tag + Notes) RP-->>GH: [13] Create or update release PR branch + PR - GH->>GH: [14a] verify.yml / Tests (py3.11) — Tests (py3.14) [matrix ×4] + Fixture Tests (fast) + GH->>GH: [14a] verify.yml / Tests (py3.11) — Tests (py3.15) [matrix ×5] + Fixture Tests (fast) GH->>GH: [14b] verify.yml / Artifact Install Verify GH->>GH: [14c] security.yml / Dependency and Secret Scan @@ -162,13 +162,13 @@ sequenceDiagram 1. `[1]` Dependabot pushes dependency update branch. 1. `[2a]` `commit.yml / Validate Commit Messages` — commit format and branch name validated (`chore(deps)` / `chore(ci)` prefix, `dependabot/` branch). -1. `[2b]` `commit.yml / Format Lint Typecheck` — lint/typecheck on py3.11. -1. `[2c]` `check.yml / Unit Tests` — `make test-local` on py3.11. +1. `[2b]` `commit.yml / Format Lint Typecheck` — lint/typecheck on py3.14, targeting compatibility with py3.11. +1. `[2c]` `check.yml / Unit Tests` — `make test-local` on py3.14. 1. `[3]` Dependabot opens PR to `main`. 1. `[4a]` `commit.yml / Validate Commit Messages` — commit message policy on PR commits. 1. `[4b]` `commit.yml / Format Lint Typecheck`. 1. `[4c]` `check.yml / Unit Tests`. -1. `[4d]` `verify.yml / Tests (py3.11)` through `Tests (py3.14)` plus `Fixture Tests (fast)`. +1. `[4d]` `verify.yml / Tests (py3.11)` through `Tests (py3.15)` plus `Fixture Tests (fast)`. 1. `[4e]` `verify.yml / Artifact Install Verify`. 1. `[4f]` `security.yml / Dependency and Secret Scan`. 1. `[5]` `automerge.yml` job runs only when `github.actor == 'dependabot[bot]'`. @@ -204,7 +204,7 @@ Configure via **Settings → Rules → Rulesets** on GitHub. - `Commit / Validate Commit Messages` - `Commit / Format Lint Typecheck` - `Check / Unit Tests` -- `Verify / Tests (py3.11)`, `Verify / Tests (py3.12)`, `Verify / Tests (py3.13)`, `Verify / Tests (py3.14)` +- `Verify / Tests (py3.11)`, `Verify / Tests (py3.12)`, `Verify / Tests (py3.13)`, `Verify / Tests (py3.14)`, `Verify / Tests (py3.15)` - `Verify / Fixture Tests (fast)` - `Verify / Artifact Install Verify` - `Security / Dependency and Secret Scan` @@ -214,6 +214,10 @@ Configure via **Settings → Rules → Rulesets** on GitHub. - **Allowed merge methods**: must include **Squash** — required for `automerge.yml` to enable auto-merge for Dependabot PRs. - **Restrict force pushes**: enabled. +When extending the Python support range, add the required `py3.15` check +to the GitHub Ruleset while retaining `py3.11`. Workflow changes do not update +repository settings automatically. + ### Actions permissions Configure via **Settings → Actions → General**. diff --git a/docs/design/overview.md b/docs/design/overview.md index dfc45266..4920a1d7 100644 --- a/docs/design/overview.md +++ b/docs/design/overview.md @@ -25,7 +25,7 @@ ______________________________________________________________________ ### 1.1 artifact lifecycle states -An artifact (skill, agent, instruction, prompt, hook) exists in one of these states relative +An artifact (skill, agent, instruction, hook) exists in one of these states relative to the target `.github/` directory: ```text @@ -83,8 +83,7 @@ stateDiagram-v2 ], "agents": [], "hooks": [], - "instructions": [], - "prompts": [] + "instructions": [] } } ``` @@ -390,13 +389,29 @@ guidance, field semantics, examples, and template structure, see the dedicated d | `description` | string | **yes** | When this instruction applies | | `applyTo` | string | no | Glob pattern e.g. `"**/*.py"` or `"**/*"` | -### 3.4 prompt frontmatter (`config.yaml`) +### 3.4 retired prompt migration -| Field | Type | Required | Notes | -| ------------- | ------ | -------- | ----------------------------------- | -| `name` | string | **yes** | Matches directory name; kebab-case | -| `description` | string | **yes** | What this prompt does | -| `mode` | string | no | `"ask"` \| `"edit"` \| `"generate"` | +The prompt generator and frontmatter schema are removed in the next major release. +The manifest remains schema v2 and accepts legacy `prompts` entries for migration. + +After successful skill generation, `InitCommand` compares legacy entries with the +canonical prompt-to-skill mapping. Only known entries at +`prompts/.prompt.md`, without symlinked paths, with matching stored checksums, +and with successfully installed or unchanged replacement skills can be retired. +Unknown, conflicting, modified, or unreadable entries are retained and reported. +Dry-run simulates both generation and retirement without changing files or state. +Non-skill installs preserve prompt tracking unchanged. + +Converted skills are explicitly invoked (`disable-model-invocation: true`). +Overlapping workflows use existing skills without command aliases. See +[Prompt migration](../user/reference/prompt-migration.md) for the complete mapping. + +Repository-only skills live directly in `.github/skills/`, not in the package's +template root or canonical skill catalog. They have no generation metadata or +manifest entry. Existing template discovery and manifest-scoped verification +therefore ignore them without a new generator mode. The vstack source audit +`artifact-integrity` is local; its retired prompt maps to distributed `inspect`. +Previously managed copies use the existing conservative obsolete/prune policy. ______________________________________________________________________ @@ -439,7 +454,7 @@ Every generated artifact ends with this block when `auto_gen_footer=True`: - Human-readable line: constant in `src/vstack/artifacts/constants.py` - Machine-readable `VSTACK-META` line: emitted by `GenericArtifactGenerator._build_footer` -- Markdown artifact types (`skill`, `agent`, `instruction`, `prompt`) use +- Markdown artifact types (`skill`, `agent`, `instruction`) use `auto_gen_footer=True`; JSON hooks use `auto_gen_footer=False` ______________________________________________________________________ diff --git a/docs/design/skills.md b/docs/design/skills.md index fa7b92df..4ade7867 100644 --- a/docs/design/skills.md +++ b/docs/design/skills.md @@ -25,6 +25,16 @@ Unlike custom instructions that primarily define coding preferences and guardrai skills package specialized, reusable workflows with optional scripts, examples, and references. +### distributed and repository-only skills + +Distributed skills have sources under `src/vstack/_templates/skills/` and are +installed into consumer repositories. Repository-only maintenance skills are +hand-authored directly in `.github/skills/`, outside the package and install +manifest. They have no generation footer and are not regenerated. + +`artifact-integrity` is repository-only: it audits vstack's own template sources +and generated output. It is not part of the distributed skill catalog below. + Boundary rule: - Policies belong in instructions. @@ -80,6 +90,7 @@ List skills in alphabetical order by skill name in every catalog or role skill l | `k8s` | Write, review, and troubleshoot Kubernetes manifests and operations. Covers rollout safety, probes, RBAC, namespace isolation, and diagnostics. | engineer, tester | Kubernetes manifests | | `lazy` | Engineer-focused minimal-change execution. Prefer avoid/delete/reuse/stdlib/native solutions before writing new code while keeping safety guarantees. | engineer | minimal safe implementation report + changes | | `migrate` | Database migration review and authoring. Forwards/backwards compatibility, zero-downtime strategies, rollback plans, data integrity, index safety. | engineer, tester | reviewed/corrected migration SQL | +| `migration-plan` | Explicit-only cross-component migration planning with validation and rollback. | engineer | migration plan | | `onboard` | Generate a contributor onboarding guide. Prerequisites, setup, tests, env vars, architecture overview, good first issues. | product | `CONTRIBUTING.md` + README dev section | | `openapi` | Write and review OpenAPI 3.1 specifications. Resource naming, HTTP semantics, status codes, error conventions, pagination, security schemes. | designer, engineer | `openapi.yaml` | | `performance` | Performance profiling and regression detection. Establishes baselines, detects regressions, profiles bottlenecks. | engineer, tester | perf report | @@ -87,7 +98,9 @@ List skills in alphabetical order by skill name in every catalog or role skill l | `pr` | Commit, push, and open a pull request from the current branch to main. | release | commit + PR | | `rancher` | Operate Kubernetes workloads and governance through Rancher. Covers project scope, RBAC, Fleet/GitOps basics, and multi-cluster checks. | engineer, tester | Rancher/Fleet config | | `rca` | Root cause analysis for incidents and bugs. Guides a systematic technical investigation and produces an RCA document linked to the triggering issue. | engineer, tester | technical RCA | +| `reasoning` | Explicit-only evidence-based critical thinking framework. | all roles | evaluation | | `refactor` | Structured refactoring without behavior change. Identify smells, plan incremental steps, execute, verify correctness. | engineer | refactored code + green tests | +| `release-check` | Explicit-only release evidence and sign-off audit; does not publish. | release, tester | readiness report | | `release-notes` | Prepare release artifacts: write release notes, own CHANGELOG updates, produce `docs/releases/YYYY-MM-DD.md`. | release | CHANGELOG + release doc | | `requirements` | Collaborative requirements gathering. Clarifies what must be built, defines success criteria and NFRs. | product | `docs/product/requirements.md` | | `secret-scan` | Configure GitHub secret scanning and push protection. Path exclusions, custom patterns, alert triage, and credential remediation. | tester, engineer | `.github/secret_scanning.yml` | @@ -97,8 +110,15 @@ List skills in alphabetical order by skill name in every catalog or role skill l | `terraform` | Write, review, and refactor Terraform IaC. Module structure, state management, variable conventions, provider pinning, and security hardening. | engineer | Terraform config files | | `terragrunt` | Write, review, and refactor Terragrunt DRY multi-environment IaC. Root config, dependency blocks, `_envcommon`, and run-all workflows. | engineer | `terragrunt.hcl` files | | `threat-model` | Threat modeling with STRIDE-first identification, optional DREAD prioritization, and selective PASTA depth for critical systems. | architect, tester, engineer, designer | `docs/architecture/threat-model.md` | +| `upgrade-plan` | Explicit-only upgrade plan with compatibility and rollback checks. | engineer, tester | upgrade plan | | `verify` | Verification fix-loop with mode routing (quick/standard/exhaustive). Runs targeted checks, fixes by severity, and re-verifies impacted paths. | engineer, tester | fixes + verification report | | `vision` | CEO/founder-mode plan review. Rethink from first principles, validate ambition, find the 10x solution. | product | `docs/product/vision.md` | +| `workflow-check` | Explicit-only stage, gate, and handoff audit using project configuration, installed agents, and role documents; no vstack source templates required. | planner, tester | workflow report | + +The next major release removes prompt artifacts in favor of skills. +Converted workflows retain their bodies and output sections, but do not select +an agent or model. Existing replacement skills keep their own invocation policy. +See [Prompt migration](../user/reference/prompt-migration.md) for all replacements. ### changedoc ownership model diff --git a/docs/design/workflow.md b/docs/design/workflow.md index 73145bfc..3a08f8b7 100644 --- a/docs/design/workflow.md +++ b/docs/design/workflow.md @@ -18,6 +18,14 @@ For authoring boundaries between reusable guidance mechanisms: - [013-instructions-vs-skills-boundary.md](../architecture/adr/013-instructions-vs-skills-boundary.md) - [028-dag-dependency-semantics.md](../architecture/adr/028-dag-dependency-semantics.md) +Reusable workflows use skills, not prompt files. The five distributed converted planning and +audit skills remain explicitly invoked; overlapping former prompts route users +to existing skills. Role selection, handoff prompt strings, and the Option B +pipeline are unchanged. See [Prompt migration](../user/reference/prompt-migration.md). + +The source-specific `artifact-integrity` audit is a hand-authored repository-only +skill, not an installed workflow. Consumers use `inspect` for repository audits. + ______________________________________________________________________ ## workflow modes @@ -233,8 +241,8 @@ and easy to reason about. | Workflow | Trigger | Responsibility | | --------------------------------- | ----------------------------------------------------- | ------------------------------------------------------------------------------------------------------ | | `.github/workflows/commit.yml` | Push to non-main branches and pull requests to `main` | Commit/branch policy and lint/typecheck gate. | -| `.github/workflows/check.yml` | Push to non-main branches and pull requests to `main` | Single-version unit tests (py3.11) for fast feedback. | -| `.github/workflows/verify.yml` | Pull request to `main` | Cross-version test matrix (py3.11–3.14) and artifact install/verify flow. | +| `.github/workflows/check.yml` | Push to non-main branches and pull requests to `main` | Single-version unit tests (py3.14) for fast feedback. | +| `.github/workflows/verify.yml` | Pull request to `main` | Cross-version test matrix (py3.11–3.15) and artifact install/verify flow. | | `.github/workflows/security.yml` | Pull request to `main` | Dependency vulnerability audit and secret scan. | | `.github/workflows/codeql.yml` | Push/pull request to `main` + weekly schedule | Code scanning for GitHub Actions and Python. | | `.github/workflows/automerge.yml` | Pull request target to `main` | Dependabot safe auto-merge policy for eligible updates. | diff --git a/docs/product/requirements.md b/docs/product/requirements.md index 6bc77890..e2e037fc 100644 --- a/docs/product/requirements.md +++ b/docs/product/requirements.md @@ -8,7 +8,7 @@ ______________________________________________________________________ ## context vstack is a VS Code-native AI engineering workflow system. It installs structured -agents, skills, instructions, and prompts into `.github/` so GitHub Copilot Agent +agents, skills, instructions, and hooks into `.github/` so GitHub Copilot Agent Mode has a clear operating model. vstack is distributed as a standalone Python CLI tool via PyPI (`pipx install vstack`) with a single runtime dependency (`pyyaml>=6.0`) for YAML frontmatter parsing (see ADR-025). A Homebrew private tap @@ -24,8 +24,7 @@ ______________________________________________________________________ - Source templates live under `src/vstack/_templates///`. - Supported artifact types: `skill` (`.github/skills//SKILL.md`), `agent` (`.github/agents/.agent.md`), `instruction` - (`.github/instructions/.instructions.md`), `prompt` - (`.github/prompts/.prompt.md`), `hook` + (`.github/instructions/.instructions.md`), `hook` (`.github/hooks/.json`). - At generation time the generator resolves `{{TOKEN}}` placeholders from shared partials and injects frontmatter validated against the artifact schema. @@ -58,6 +57,11 @@ ______________________________________________________________________ - `--update` rewrites only when a newer version is available and the tracked file is still clean. Mutually exclusive with `--force`. - `--dry-run` prints what would change without writing any files. +- The next major release retires the prompt family. `install` and `init` with + skills selected install replacements before removing known, unchanged, + manifest-tracked prompts. Unsafe, custom, or modified files remain tracked and + reported; force options do not bypass retirement safeguards. See + [Prompt migration](../user/reference/prompt-migration.md) and ADR-032. ### FR-5 — uninstall @@ -120,7 +124,7 @@ ______________________________________________________________________ | ID | Requirement | | ----- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | NFR-1 | One runtime dependency only: PyYAML (`pyyaml>=6.0`) for YAML frontmatter parsing. | -| NFR-2 | Python 3.11–3.14 compatibility. | +| NFR-2 | Python 3.11–3.15 compatibility; Python 3.14 is the default development and CI runtime. | | NFR-3 | Manifest writes are atomic: write to a temporary file, then replace atomically. | | NFR-4 | All public behavior exercised by automated tests (pytest). CI gate enforces test pass. | | NFR-5 | CLI operates standalone; no VS Code process required for `install`, `verify`, or `validate`. | @@ -153,5 +157,5 @@ ______________________________________________________________________ at runtime. 1. Manifest schema is versioned; old manifests require explicit upgrade before further use. -1. CLI behavior must be reproducible across Python 3.11–3.14. +1. CLI behavior must be reproducible across Python 3.11–3.15. 1. No cloud, network, or VS Code process dependency for CLI operations. diff --git a/docs/product/roadmap.md b/docs/product/roadmap.md index 718bea8c..068b0c0c 100644 --- a/docs/product/roadmap.md +++ b/docs/product/roadmap.md @@ -7,51 +7,52 @@ ______________________________________________________________________ ## feature status table -| Feature | Version | Status | Notes | -| --------------------------------------------- | ------- | ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| foundation | v1.0.0 | shipped | Core template-driven install model is in place | -| backend-first verification | v1.0.0 | shipped | Verify/inspect focus on contracts, observability, security | -| VS Code agent migration | v1.x | shipped | Native `.github/agents/*.agent.md` output format implemented | -| role model + doc restructure | v1.1.0 | shipped | 6-role model, agent templates, and docs baseline established | -| CLI modularisation | v2.0.0 | shipped | 12 focused CLI modules; BaseCommand + CommandContext contract | -| manifest package | v2.0.0 | shipped | Dedicated `manifest/` package; atomic writes (ADR-016) | -| mypy type checking | v2.0.0 | shipped | Full mypy coverage enforced in CI; 100% test coverage gate | -| manifest schema versioning | v2.0.0 | shipped | `manifest_version: 2`; upgrade path via `manifest upgrade` (ADR-014) | -| checksum backfill | v2.0.0 | shipped | `manifest upgrade --backfill` adds SHA-256 for VSTACK-META-tagged files (ADR-017) | -| conservative install | v2.0.0 | shipped | Untracked files never overwritten; checksum-gated update (ADR-015, superseded by ADR-020) | -| dry-run install | v2.1.0 | shipped | `vstack install --dry-run` previews actions; type/name selectors in summary | -| new skill scaffolding | v2.2.0 | shipped | 47-skill set with canonical naming | -| agent skill wiring | v2.2.0 | shipped | Role-to-skill mapping, handoffs, and concise modes wired into all agents | -| project-scope directory | v3.0.0 | shipped | `.vstack/` directory: `config.yaml`, manifest, delta templates (ADR-019) | -| install/init command semantics | v3.0.0 | shipped | `install` = first-run setup; `init` = idempotent CI regeneration (ADR-020, breaking change) | -| manifest relocation | v3.0.0 | shipped | `vstack.json` moves from `.github/` to `.vstack/`; migration via `manifest upgrade` (ADR-014) | -| selective install | v3.0.0 | shipped | Per-type and per-name exclusions via `exclude:` in `.vstack/config.yaml`; agents always installed (ADR-022) | -| workflow contract source-of-truth | v3.1.0 | shipped | `workflow:` block in `.vstack/config.yaml`; `gate`, `hitl`, `handoffs` schema; `vstack migrate` command (ADR-023, ADR-026) | -| agent hooks support | v3.2.0 | shipped | First-class `hook` artifact type: generate `.github/hooks/.json` from templates and track in manifest | -| optional orchestrated role pipeline | v3.2.0 | shipped | `planner` coordinator agent implemented with mode-aware generation; default mode is `agentic` (`manual` and `hybrid` also supported) | -| parallel workflow via DAG model | v3.3.0 | shipped | `depends_on` DAG semantics and planner parallel scheduling are shipped in v3.3.0 | -| new skills (next batch) | v3.3.0 | shipped | `space-setup`: set up Copilot Spaces; `copilot-ops`: operate Copilot governance settings with audit-first checks | -| golden-fixture coverage expansion | v3.3.0 | shipped | Extend deterministic golden fixtures to cover additional high-impact templates per artifact type. | -| defect-fixture matrix expansion | v3.3.0 | shipped | Expand defect fixtures across artifact types and failure classes with stable expected error assertions. | -| planner routing refinement | v3.4.0 | shipped | Planner/orchestrator routing follow-up to the DAG work | -| Homebrew distribution | v3.5.0 | shipped | Homebrew tap/formula publish flow added for install and upgrade via `brew` | -| configurable skill output paths | t.b.d. | candidate | Replace hardcoded skill artifact/output paths (for example changedoc location conventions) with project-configurable path settings while preserving safe defaults. | -| docs information architecture (Diataxis) | t.b.d. | candidate | `docs/user/` scaffold and navigation are in place with segmented tutorials/how-to/reference/explanation routes; broader migration and fully realized IA come later | -| team customization layer | t.b.d. | candidate | Deferred major update after VS Code-first model proves itself; custompacks, overlay merge rules, and install profiles all add major maintenance surface | -| multi-IDE support (IntelliJ first) | t.b.d. | candidate | Deferred until vstack proves stable in VS Code; likely a major follow-up because it needs separate targets, schemas, and more maintenance | -| plugin/bundle distribution model | t.b.d. | candidate | A self-contained, versioned bundle of vstack artifacts as a distribution model with no external registry or repository mapping | -| artifact integrity and verification hardening | t.b.d. | candidate | Layered checks, generated-artifact drift detection, and deterministic fixtures to reduce release risk. | -| hook telemetry parser hardening (P2) | t.b.d. | candidate | Optional deeper payload normalization for actor/tool/model extraction across broader event shapes without adding runtime dependencies. | -| planner analytics enrichment (P2) | t.b.d. | candidate | Optional aggregation/reporting on stage-report telemetry (`planner_run_id`, `model_used`, `subagents_invoked`) for post-run analysis. | -| template-change-aware fixture CI gate | t.b.d. | candidate | Require fixture drift checks automatically in CI whenever template sources are modified. | -| fixture update policy in PR workflow | t.b.d. | candidate | Enforce contributor guidance that intended generated-output changes include fixture updates in the same pull request. | -| deeper targeted verify tier | t.b.d. | candidate | Define and run a deeper pre-merge/release verification tier covering integration, fixture, and contract checks. | -| obsolete artifact pruning for init | v3.5.x | shipped | `init --prune` removes safe obsolete tracked artifacts; default run reports candidates and preserves files; hook generator trailing-newline stability fix included. | -| heavy agent runtime framework | — | not planned | Keeps runtime lightweight and transparent | -| cloud control plane dependency | — | not planned | Keeps operation local/offline-capable | -| VS Code extension packaging | — | not planned | Not required for current install model | -| browser automation as default dependency | — | not planned | Backend/microservice-first remains default | -| install target directory override | — | not planned | Won't implement unless a concrete tool incompatibility with `.github/` arises | +| Feature | Version | Status | Notes | +| --------------------------------------------- | ---------- | ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| foundation | v1.0.0 | shipped | Core template-driven install model is in place | +| backend-first verification | v1.0.0 | shipped | Verify/inspect focus on contracts, observability, security | +| VS Code agent migration | v1.x | shipped | Native `.github/agents/*.agent.md` output format implemented | +| role model + doc restructure | v1.1.0 | shipped | 6-role model, agent templates, and docs baseline established | +| CLI modularisation | v2.0.0 | shipped | 12 focused CLI modules; BaseCommand + CommandContext contract | +| manifest package | v2.0.0 | shipped | Dedicated `manifest/` package; atomic writes (ADR-016) | +| mypy type checking | v2.0.0 | shipped | Full mypy coverage enforced in CI; 100% test coverage gate | +| manifest schema versioning | v2.0.0 | shipped | `manifest_version: 2`; upgrade path via `manifest upgrade` (ADR-014) | +| checksum backfill | v2.0.0 | shipped | `manifest upgrade --backfill` adds SHA-256 for VSTACK-META-tagged files (ADR-017) | +| conservative install | v2.0.0 | shipped | Untracked files never overwritten; checksum-gated update (ADR-015, superseded by ADR-020) | +| dry-run install | v2.1.0 | shipped | `vstack install --dry-run` previews actions; type/name selectors in summary | +| new skill scaffolding | v2.2.0 | shipped | 47-skill set with canonical naming | +| agent skill wiring | v2.2.0 | shipped | Role-to-skill mapping, handoffs, and concise modes wired into all agents | +| project-scope directory | v3.0.0 | shipped | `.vstack/` directory: `config.yaml`, manifest, delta templates (ADR-019) | +| install/init command semantics | v3.0.0 | shipped | `install` = first-run setup; `init` = idempotent CI regeneration (ADR-020, breaking change) | +| manifest relocation | v3.0.0 | shipped | `vstack.json` moves from `.github/` to `.vstack/`; migration via `manifest upgrade` (ADR-014) | +| selective install | v3.0.0 | shipped | Per-type and per-name exclusions via `exclude:` in `.vstack/config.yaml`; agents always installed (ADR-022) | +| workflow contract source-of-truth | v3.1.0 | shipped | `workflow:` block in `.vstack/config.yaml`; `gate`, `hitl`, `handoffs` schema; `vstack migrate` command (ADR-023, ADR-026) | +| agent hooks support | v3.2.0 | shipped | First-class `hook` artifact type: generate `.github/hooks/.json` from templates and track in manifest | +| optional orchestrated role pipeline | v3.2.0 | shipped | `planner` coordinator agent implemented with mode-aware generation; default mode is `agentic` (`manual` and `hybrid` also supported) | +| parallel workflow via DAG model | v3.3.0 | shipped | `depends_on` DAG semantics and planner parallel scheduling are shipped in v3.3.0 | +| new skills (next batch) | v3.3.0 | shipped | `space-setup`: set up Copilot Spaces; `copilot-ops`: operate Copilot governance settings with audit-first checks | +| golden-fixture coverage expansion | v3.3.0 | shipped | Extend deterministic golden fixtures to cover additional high-impact templates per artifact type. | +| defect-fixture matrix expansion | v3.3.0 | shipped | Expand defect fixtures across artifact types and failure classes with stable expected error assertions. | +| planner routing refinement | v3.4.0 | shipped | Planner/orchestrator routing follow-up to the DAG work | +| Homebrew distribution | v3.5.0 | shipped | Homebrew tap/formula publish flow added for install and upgrade via `brew` | +| skills replace prompt artifacts | next major | implemented | Retire prompts, reuse 12 existing workflows, distribute five converted skills, keep the source audit repository-only, and safely clean tracked prompts (ADR-032). | +| configurable skill output paths | t.b.d. | candidate | Replace hardcoded skill artifact/output paths (for example changedoc location conventions) with project-configurable path settings while preserving safe defaults. | +| docs information architecture (Diataxis) | t.b.d. | candidate | `docs/user/` scaffold and navigation are in place with segmented tutorials/how-to/reference/explanation routes; broader migration and fully realized IA come later | +| team customization layer | t.b.d. | candidate | Deferred major update after VS Code-first model proves itself; custompacks, overlay merge rules, and install profiles all add major maintenance surface | +| multi-IDE support (IntelliJ first) | t.b.d. | candidate | Deferred until vstack proves stable in VS Code; likely a major follow-up because it needs separate targets, schemas, and more maintenance | +| plugin/bundle distribution model | t.b.d. | candidate | A self-contained, versioned bundle of vstack artifacts as a distribution model with no external registry or repository mapping | +| artifact integrity and verification hardening | t.b.d. | candidate | Layered checks, generated-artifact drift detection, and deterministic fixtures to reduce release risk. | +| hook telemetry parser hardening (P2) | t.b.d. | candidate | Optional deeper payload normalization for actor/tool/model extraction across broader event shapes without adding runtime dependencies. | +| planner analytics enrichment (P2) | t.b.d. | candidate | Optional aggregation/reporting on stage-report telemetry (`planner_run_id`, `model_used`, `subagents_invoked`) for post-run analysis. | +| template-change-aware fixture CI gate | t.b.d. | candidate | Require fixture drift checks automatically in CI whenever template sources are modified. | +| fixture update policy in PR workflow | t.b.d. | candidate | Enforce contributor guidance that intended generated-output changes include fixture updates in the same pull request. | +| deeper targeted verify tier | t.b.d. | candidate | Define and run a deeper pre-merge/release verification tier covering integration, fixture, and contract checks. | +| obsolete artifact pruning for init | v3.5.x | shipped | `init --prune` removes safe obsolete tracked artifacts; default run reports candidates and preserves files; hook generator trailing-newline stability fix included. | +| heavy agent runtime framework | — | not planned | Keeps runtime lightweight and transparent | +| cloud control plane dependency | — | not planned | Keeps operation local/offline-capable | +| VS Code extension packaging | — | not planned | Not required for current install model | +| browser automation as default dependency | — | not planned | Backend/microservice-first remains default | +| install target directory override | — | not planned | Won't implement unless a concrete tool incompatibility with `.github/` arises | ______________________________________________________________________ @@ -305,7 +306,7 @@ Rules: - **Agents** — can be customized (description, tools, handoffs, prompt body); cannot be removed (the six-role chain is an atomic unit, ADR-022) - **Skills** — can be overridden entirely with a company version, or supplemented with new skills -- **Instructions and prompts** — fully under team control; vstack defaults are a starting point +- **Instructions** — fully under team control; vstack defaults are a starting point - **Custompacks** — a named bundle of overrides and additions tracked in the manifest alongside first-party artifacts Planned direction: @@ -313,7 +314,7 @@ Planned direction: - Define a `custompack` artifact type: a directory of templates with the same structure as `src/vstack/_templates/` that a team maintains in their own repo - `vstack install --pack ` installs the custompack after the base set; team artifacts - win on conflict for skills, instructions, and prompts; agents are merged, not replaced + win on conflict for skills and instructions; agents are merged, not replaced - Track custompack artifacts in `vstack.json` with a `source: custompack` marker so `vstack status` and `uninstall` can distinguish first-party from team-owned files - Add a `vstack pack init` scaffold command to create a well-structured custompack starter @@ -321,7 +322,7 @@ Planned direction: Overlay model (template source priority): - Multiple template sources resolved in priority order: upstream vstack first, custompack second -- Conflict resolution is deterministic: custompack wins for skills, instructions, and prompts; +- Conflict resolution is deterministic: custompack wins for skills and instructions; agents are merged (custompack fields override, core structure preserved) - Source-aware checksums in `vstack.json` so updates can be applied safely per origin - Longer term, if still justified: `vstack install --profile company` for named install profiles @@ -527,7 +528,7 @@ Reference: ### portable bundle format [candidate — t.b.d.] A portable bundle packages a curated set of vstack artifacts — agents, skills, instructions, -prompts, and hooks — as a single versioned unit. The bundle can be distributed and installed +and hooks — as a single versioned unit. The bundle can be distributed and installed without coupling to any external registry or specific repository. Scope to evaluate: @@ -556,8 +557,10 @@ guidance on which checks apply after each class of change. - Add a change-trigger validation matrix to `CONTRIBUTING.md` that maps change types to required checks (e.g. template change → `python3 -m vstack install` + `make test-local`). -- Expand the prompt catalog with `repo-assessment` and `artifact-integrity` prompts so engineers - can run structured repository and drift assessments on demand. +- Use distributed `inspect` for repository assessment and repository-only + `artifact-integrity` for vstack source-to-generated drift audits. + The next major release replaces the old + prompt catalog with skills; see [Prompt migration](../user/reference/prompt-migration.md). **Phase B — generated-artifact drift guard:** @@ -611,7 +614,7 @@ Tracked as dedicated candidate items in the feature status table: template-chang - Contributors always know which checks to run after any class of change. - Regressions in artifact generation are caught before they reach main. -- Structured prompt artifacts enable repeatable repo-health reviews and drift audits. +- Structured skills enable repeatable repo-health reviews and drift audits. - The verify loop is both faster for day-to-day work and more thorough at the release gate. ______________________________________________________________________ @@ -647,10 +650,18 @@ ______________________________________________________________________ `vstack install --global` is now scoped to VS Code user-profile artifacts only: - `agents/` -- `prompts/` - `instructions/` - `skills/` - `hooks/` All global-supported artifact types are included above. vstack provides generic, reusable behavior; project-specific customization is out of scope. + +### prompt retirement [next major] + +Remove the prompt generator and selectors, retain legacy manifest parsing for safe +upgrade cleanup, and use skills for reusable workflows. Six converted skills remain +explicit-only; eleven overlapping prompts reuse existing skills. Role agents and +Option B stage/handoff contracts remain unchanged. Historical shipped prompt-fixture +milestones above describe earlier releases, not the current artifact inventory. +See [ADR-032](../architecture/adr/032-skills-replace-prompts.md). diff --git a/docs/user/README.md b/docs/user/README.md index 3825d76c..da24af12 100644 --- a/docs/user/README.md +++ b/docs/user/README.md @@ -17,7 +17,7 @@ This subtree contains user-facing documentation. - [Reinitialize](how-to/reinitialize.md) - [Partial upgrade](how-to/partial-upgrade.md) - [Configure workflow modes](how-to/configure-workflow-modes.md) - - [Choose agent, skill, or prompt](how-to/choose-agent-skill-or-prompt.md) + - [Choose agent or skill](how-to/choose-agent-or-skill.md) - [How to install a skill](how-to/how-to-install-a-skill.md) - [Install and upgrade](how-to/install-and-upgrade.md) - [Troubleshooting](how-to/troubleshooting.md) @@ -25,7 +25,7 @@ This subtree contains user-facing documentation. - [CLI commands](reference/cli-commands.md) - [Configuration](reference/configuration.md) - [Hooks](reference/hooks.md) - - [Prompts overview](reference/prompts-overview.md) + - [Prompt migration](reference/prompt-migration.md) - [Skills overview](reference/skills-overview.md) - [Instructions overview](reference/instructions-overview.md) - [Artifact checks](reference/artifact-checks.md) diff --git a/docs/user/how-to/README.md b/docs/user/how-to/README.md index f56be71f..23ebd443 100644 --- a/docs/user/how-to/README.md +++ b/docs/user/how-to/README.md @@ -6,7 +6,7 @@ Use this section when you already know what you want to achieve and need direct, Each guide should focus on one outcome and avoid conceptual digressions. - [How to install a skill](how-to-install-a-skill.md) -- [Choose agent, skill, or prompt](choose-agent-skill-or-prompt.md) +- [Choose agent or skill](choose-agent-or-skill.md) - [Install and upgrade](install-and-upgrade.md) - [Global install](global-install.md) - [Uninstall](uninstall.md) diff --git a/docs/user/how-to/choose-agent-skill-or-prompt.md b/docs/user/how-to/choose-agent-or-skill.md similarity index 83% rename from docs/user/how-to/choose-agent-skill-or-prompt.md rename to docs/user/how-to/choose-agent-or-skill.md index 6f506d48..25c3930f 100644 --- a/docs/user/how-to/choose-agent-skill-or-prompt.md +++ b/docs/user/how-to/choose-agent-or-skill.md @@ -1,4 +1,4 @@ -# Choose agent, skill, or prompt +# Choose Agent or Skill Use this guide to decide how to run work in Copilot Chat with vstack. @@ -16,11 +16,8 @@ Use a skill when: - you already know the scope and want a direct playbook, - you do not need full multi-role orchestration. -Use a prompt when: - -- you need lightweight, one-off guidance, -- you want to adapt wording for a specific context quickly, -- you are not changing the role model or skill inventory. +Use an ordinary chat message for one-off questions that need no reusable +procedure. vstack no longer generates prompt files. ## Practical examples @@ -29,14 +26,14 @@ Use a prompt when: | Plan and execute a feature across design, implementation, and verification | Agent (`planner`) | Planner coordinates role flow and handoffs. | | Fix failing checks before merge | Skill (`verify`) | Verify provides targeted fix-loop behavior. | | Investigate a production bug cause | Skill (`debug`) | Debug is optimized for root-cause-first investigation. | -| Ask for a one-off API naming suggestion | Prompt | Fast and local, no orchestration needed. | +| Ask for a one-off API naming suggestion | Chat message | Fast and local, no orchestration needed. | | Generate release artifacts from completed work | Agent (`release`) | Release role owns release gating outputs. | ## Escalation pattern Start small, then escalate only when needed: -1. Start with a prompt for low-risk, narrow tasks. +1. Start with a chat message for low-risk, narrow tasks. 1. Move to a skill for repeatable specialist work. 1. Move to an agent when ownership boundaries and workflow handoffs matter. @@ -45,5 +42,5 @@ Start small, then escalate only when needed: - [Start Here](../start-here.md) - [First planner run](../tutorials/first-planner-run.md) - [Skills overview](../reference/skills-overview.md) -- [Prompts overview](../reference/prompts-overview.md) +- [Prompt migration](../reference/prompt-migration.md) - [Work items](../reference/work-items.md) diff --git a/docs/user/how-to/global-install.md b/docs/user/how-to/global-install.md index 4afa1e9d..66cf554b 100644 --- a/docs/user/how-to/global-install.md +++ b/docs/user/how-to/global-install.md @@ -21,7 +21,7 @@ vstack install --global Install selected artifact families only: ```bash -vstack install --global --only agent skill prompt instruction hook +vstack install --global --only agent skill instruction hook ``` ## Update global artifacts diff --git a/docs/user/how-to/partial-upgrade.md b/docs/user/how-to/partial-upgrade.md index b4e06c4b..675c0e72 100644 --- a/docs/user/how-to/partial-upgrade.md +++ b/docs/user/how-to/partial-upgrade.md @@ -20,7 +20,7 @@ vstack init --only agent Multiple types: ```bash -vstack init --only skill prompt instruction +vstack init --only skill instruction ``` Hooks only: @@ -47,6 +47,8 @@ vstack manifest verify --target . --only agent - Partial upgrade can leave other artifact types on older generated output. - For broad CLI upgrades, a full `vstack init` is still the safest final step. +- Safe prompt retirement runs only when skills are selected. See + [Prompt migration](../reference/prompt-migration.md). ## Related Docs diff --git a/docs/user/how-to/reinitialize.md b/docs/user/how-to/reinitialize.md index 9ed41b4d..f1c5c9e1 100644 --- a/docs/user/how-to/reinitialize.md +++ b/docs/user/how-to/reinitialize.md @@ -26,7 +26,7 @@ Use `--only` when you want a narrower regeneration scope: ```bash vstack init --only agent -vstack init --only skill prompt +vstack init --only skill vstack init --only hook ``` @@ -44,6 +44,10 @@ Preview prune actions without writing files: vstack init --prune --dry-run ``` +Retired built-in prompts are a targeted migration exception: `init` and `install` +remove safe tracked prompts automatically after their replacement skills are +available. See [Prompt migration](../reference/prompt-migration.md). + ## Verify the Reinitialized State ```bash diff --git a/docs/user/how-to/upgrade.md b/docs/user/how-to/upgrade.md index f4fc8949..90f2ddea 100644 --- a/docs/user/how-to/upgrade.md +++ b/docs/user/how-to/upgrade.md @@ -17,6 +17,12 @@ vstack init `vstack init` is idempotent. You can run it repeatedly after upgrades. +The next major release replaces prompts with skills. `init` and `install` +automatically retire unchanged, tracked built-in prompts once their replacement +skills are available. Modified and unmanaged files are preserved. +Preview with `vstack init --dry-run`; see [Prompt migration](../reference/prompt-migration.md) +for the command mapping, exclusions, and manual recovery. + ## 3. Verify After Upgrade The commands in this guide assume you run them from the repository root, so `--target` is omitted. diff --git a/docs/user/reference/README.md b/docs/user/reference/README.md index b3664f63..547997c8 100644 --- a/docs/user/reference/README.md +++ b/docs/user/reference/README.md @@ -15,7 +15,7 @@ Reference pages should be precise, complete, and free of tutorial flow. - [CLI commands](cli-commands.md) - [Configuration](configuration.md) - [Hooks](hooks.md) -- [Prompts overview](prompts-overview.md) +- [Prompt migration](prompt-migration.md) - [Skills overview](skills-overview.md) - [Instructions overview](instructions-overview.md) - [Artifact checks](artifact-checks.md) diff --git a/docs/user/reference/cli-commands.md b/docs/user/reference/cli-commands.md index 7a9d0fb7..f892dbaf 100644 --- a/docs/user/reference/cli-commands.md +++ b/docs/user/reference/cli-commands.md @@ -56,6 +56,12 @@ vstack manifest upgrade --target . Both commands default to current working directory when `--target` is omitted. +The active artifact types are `skill`, `agent`, `instruction`, and `hook`. +The `prompt` family is retired. With skills selected, both install commands +automatically retire safe, tracked legacy prompts after replacements are +available; no `--prune` flag is needed for this migration. +See [Prompt migration](prompt-migration.md) for safeguards and replacement commands. + `vstack init --prune` applies only to obsolete tracked artifacts where the current file content still matches the manifest checksum. Locally modified or untracked files are never removed by this flag. For manual-edit preservation and force-overwrite flows, see [Update managed artifacts](../how-to/update-managed-artifacts.md). diff --git a/docs/user/reference/configuration.md b/docs/user/reference/configuration.md index 0b4bcc9a..a242f3aa 100644 --- a/docs/user/reference/configuration.md +++ b/docs/user/reference/configuration.md @@ -20,7 +20,6 @@ exclude: - helm - k8s instructions: all - prompts: all hook: all ``` @@ -29,6 +28,8 @@ Rules: - `type: all` skips an entire artifact type. - `type: [name, ...]` skips only listed artifacts. - Use exclusions to reduce generated surface for team needs. +- `exclude.prompts` is retired and emits a warning. Configure replacement skills + instead; see [Prompt migration](prompt-migration.md). ## Workflow mode diff --git a/docs/user/reference/instructions-overview.md b/docs/user/reference/instructions-overview.md index f566a2c3..b8f859db 100644 --- a/docs/user/reference/instructions-overview.md +++ b/docs/user/reference/instructions-overview.md @@ -35,4 +35,4 @@ In vstack, instructions are generated into `.github/instructions/*.instructions. - [Configuration](configuration.md) - [Skills overview](skills-overview.md) -- [Prompts overview](prompts-overview.md) +- [Prompt migration](prompt-migration.md) diff --git a/docs/user/reference/prompt-migration.md b/docs/user/reference/prompt-migration.md new file mode 100644 index 00000000..26d9039a --- /dev/null +++ b/docs/user/reference/prompt-migration.md @@ -0,0 +1,114 @@ +# Prompt Migration + +The next major version removes vstack's prompt artifact family. The VS Code Copilot +harness does not load `*.prompt.md` files; Local harness sessions still support +them. vstack now supplies reusable workflows as skills in +`.github/skills//SKILL.md`. + +## Replacement Commands + +| Retired prompt | Replacement skill | Change | +| -------------------- | ----------------- | ------------------------------------------------------------------------ | +| `api-design-review` | `openapi` | Reuse API contract writing and review. | +| `architecture-risk` | `architecture` | Reuse architecture and execution-plan review. | +| `artifact-integrity` | `inspect` | Reuse repository auditing; the source-specific skill is repository-only. | +| `ci-triage` | `debug` | Reuse root-cause investigation for CI failures. | +| `dependency-audit` | `dependency` | Reuse dependency health auditing. | +| `incident-timeline` | `postmortem` | Reuse incident timeline and postmortem workflow. | +| `migration-plan` | `migration-plan` | New explicit-only cross-component planning skill. | +| `migration-safety` | `migrate` | Reuse database migration review. | +| `ops-readiness` | `inspect` | Reuse reliability and observability auditing. | +| `quick-review` | `code-review` | Reuse pre-landing review. | +| `reasoning` | `reasoning` | New explicit-only reasoning framework. | +| `release-check` | `release-check` | New explicit-only release evidence audit, not release publication. | +| `repo-assessment` | `inspect` | Reuse repository verification audit. | +| `template-impact` | `analyse` | Reuse impact analysis. | +| `test-gaps` | `inspect` | Reuse test and verification auditing. | +| `upgrade-plan` | `upgrade-plan` | New explicit-only upgrade planning skill. | +| `workflow-check` | `workflow-check` | New explicit-only stage, gate, and handoff audit. | + +Invoke skills with `/name`, for example `/code-review`. References such as +`prompt/reasoning` become `skill/reasoning`. Existing replacement skills keep their +own procedure and output format; the old prompt output contracts are not aliases. +For example, `debug` may proceed to a fix and `inspect` can run checks; request a +report-only scope when that is what you need. + +Converted skills have `user-invocable: true` and `disable-model-invocation: true`. +Their bodies and output sections are preserved, but prompt-specific `agent`, +`model`, and `tools` selection is not. Select a role agent separately when needed. +The skills' `allowed-tools` metadata is not a replacement for runtime permissions. + +## Upgrade Safely + +After upgrading the CLI, preview and apply the artifact migration: + +```bash +vstack init --dry-run +vstack init +vstack manifest verify +``` + +`vstack install` performs the same artifact migration. `vstack migrate` handles +role-document paths, not prompt conversion. Installing the Python package alone +does not change repository files. + +During an install with skills selected: + +1. Generate and install replacement skills using conservative install rules. +1. Inspect legacy `prompts` entries in the install manifest. +1. Remove only known, canonical, non-symlinked prompt files matching their stored + checksum and whose fully resolved replacement skill was installed or verified + unchanged. +1. Remove their manifest entries and empty prompt directories. + +No `--prune` flag is needed for this targeted retirement. Other obsolete artifact +cleanup still requires `init --prune`. + +`artifact-integrity` is maintained only in the vstack source repository as a +hand-authored skill. Fresh installations do not receive it. If an earlier build +installed a managed copy, `init` reports it as obsolete; `init --prune` removes +it only when its stored checksum still matches. Locally modified copies are +preserved. Untracked repository-only skills remain untouched, including with +`--force` and `--prune`. + +Untracked files are never touched. Modified, unreadable, checksum-less, unknown, +or unsafe-path prompts are preserved, reported, and kept in the manifest for +retry. Missing old files can be cleared from tracking after the replacement is +available. `--force` does not bypass prompt deletion safeguards. + +If skills are not selected, or a replacement skill is excluded, locally modified, +untracked, or merely adopted, migration is deferred. Resolve the reported conflict +and rerun `vstack init`. Review and migrate preserved custom workflows manually; +vstack does not delete unknown custom prompts or scan directories for ownership. + +An unresolved replacement template also defers retirement, even when the skill +was installed, updated, or unchanged. For example, a missing partial can leave +`{{SKILL_CONTEXT}}` in its output. The unresolved-token warning and deferred +migration are reported; the legacy prompt and its manifest entry remain intact. +Restore the missing template input and rerun `vstack init` to regenerate tracked +skills. `--update` can skip an existing skill at the same template version; +such a skill does not permit retirement if its installed content is unresolved. + +Deletion errors are reported with a nonzero exit code. The prompt's manifest entry +is retained, so you can resolve the filesystem error and retry without losing +ownership information. + +## Breaking Interfaces + +- `--only prompt` is no longer a valid CLI filter. +- `prompt/` is no longer an install, force, or adoption selector. +- `vstack.prompts`, `PromptGenerator`, and `PROMPT_SCHEMA` are removed. +- Custom template packs must replace their prompt templates with skill templates. +- `exclude.prompts` is retired and warns when read. Replace it with appropriate + `exclude.skills` entries; it no longer disables the replacement workflows. +- Legacy manifest `prompts` entries remain readable for safe migration. Do not + hand-edit the manifest to claim ownership of files. + +See [ADR-032](../../architecture/adr/032-skills-replace-prompts.md) and the +[VS Code migration guide](https://code.visualstudio.com/docs/agent-customization/migrate-customizations#_convert-prompt-files-to-skills). + +## Related Docs + +- [Skills overview](skills-overview.md) +- [Instructions overview](instructions-overview.md) +- [Work items](work-items.md) diff --git a/docs/user/reference/prompts-overview.md b/docs/user/reference/prompts-overview.md deleted file mode 100644 index e0844e71..00000000 --- a/docs/user/reference/prompts-overview.md +++ /dev/null @@ -1,38 +0,0 @@ -# Prompts Overview - -This page lists prompt templates built into the installed vstack package and explains what they are for. - -## What Prompts Are - -Prompts are reusable review and analysis templates that guide a focused task. - -In vstack, prompts are generated into `.github/prompts/*.prompt.md`. - -Prompt files should stay model-agnostic by default. Leave `model` out unless a prompt has a specific, justified need to pin a model for reproducibility or model-specific behavior. - -## Built-in Prompts - -| Prompt | Scope | What It Helps With | -| -------------------- | ----------------- | --------------------------------------------------------------------------------------------------- | -| `api-design-review` | `general-purpose` | Review an API design or OpenAPI spec for correctness, completeness, and consistency. | -| `architecture-risk` | `general-purpose` | Identify architectural risks, tradeoffs, and mitigation priorities for a proposed design. | -| `artifact-integrity` | `vstack-internal` | Check source templates against generated artifacts and identify drift or missing regeneration. | -| `ci-triage` | `general-purpose` | Triage CI failures into root-cause clusters and prioritize the fastest safe recovery path. | -| `quick-review` | `general-purpose` | Review a change for bugs, regressions, and missing tests. | -| `dependency-audit` | `general-purpose` | Audit dependencies for vulnerabilities, outdated versions, licence risks, and supply chain hygiene. | -| `incident-timeline` | `general-purpose` | Build a structured, evidence-based incident timeline and action-oriented postmortem summary. | -| `migration-plan` | `general-purpose` | Produce a safe migration plan with sequencing, fallback paths, and verification checkpoints. | -| `migration-safety` | `general-purpose` | Review database migration safety, rollback strategy, and zero-downtime risk. | -| `ops-readiness` | `general-purpose` | Assess operational readiness across observability, runbooks, failure handling, and supportability. | -| `release-check` | `general-purpose` | Evaluate release gate readiness using required reports, artifacts, and sign-off evidence. | -| `repo-assessment` | `general-purpose` | Assess a repository for production-readiness gaps and prioritized improvements. | -| `template-impact` | `general-purpose` | Assess impact of a template change on generated artifacts, tests, and release risk. | -| `test-gaps` | `general-purpose` | Identify missing behavioral coverage and prioritize test additions by production risk. | -| `upgrade-plan` | `general-purpose` | Build a safe upgrade plan with sequencing, compatibility checks, and rollback points. | -| `workflow-check` | `general-purpose` | Review workflow stage flow, gate usage, and handoff integrity across role artifacts. | - -## Related Docs - -- [Skills overview](skills-overview.md) -- [Instructions overview](instructions-overview.md) -- [Work items](work-items.md) diff --git a/docs/user/reference/skills-overview.md b/docs/user/reference/skills-overview.md index 1476619e..6be9afdc 100644 --- a/docs/user/reference/skills-overview.md +++ b/docs/user/reference/skills-overview.md @@ -8,63 +8,73 @@ Skills provide domain-specific execution playbooks. Agents use them to perform f In vstack, skills are generated into `.github/skills//SKILL.md`. +Projects may also hand-author repository-only skills in that directory. These +have no vstack template or manifest entry and are not distributed by vstack. +The vstack source repository's `artifact-integrity` maintenance skill is one +such local skill, not a built-in command for consumer installations. + ## Built-in Skills -| Skill | What It Helps With | -| --------------------- | ------------------------------------------------------------------------------------------------------------------- | -| `adr` | Architecture Decision Record writing for significant technical decisions. | -| `analyse` | Cross-cutting impact, tradeoff, and feasibility analysis. | -| `architecture` | Engineering-lead architecture and execution-plan review. | -| `ask` | Read-only technical Q&A with code-backed evidence and clear guidance. | -| `aws-cli` | AWS CLI operations across core AWS services. | -| `cicd` | GitHub Actions CI/CD workflow authoring and hardening. | -| `changedoc` | Per-change planning docs for existing repositories; product starts it, other roles enrich it, planner orchestrates. | -| `cloudformation` | CloudFormation template authoring and review. | -| `code-review` | Pre-merge review for bugs, regressions, and risk gaps. | -| `codeql` | CodeQL scanning setup and workflow configuration. | -| `concise` | Runtime response-density control (normal/compact/ultra). | -| `consult` | DX-focused review with prioritized usability improvements. | -| `container` | Dockerfile and container runtime setup and hardening. | -| `conventional-commit` | Conventional Commit message preparation and validation. | -| `copilot-ops` | Copilot policy/configuration operations and governance. | -| `debug` | Root-cause-first debugging using scientific investigation flow. | -| `dependabot` | Dependabot configuration strategy for update hygiene. | -| `dependency` | Dependency health audit, upgrade strategy, and supply-chain checks. | -| `design` | API and service interface design standards and contracts. | -| `docs` | Post-release documentation alignment with shipped behavior. | -| `explore` | Fast codebase exploration, reuse discovery, and architecture mapping. | -| `gdpr` | GDPR-compliant engineering review for data handling and flows. | -| `gh-issues` | GitHub issue lifecycle management via `gh`. | -| `gh-release` | GitHub Release drafting and publication flow via `gh`. | -| `guardrails` | Session safety controls for destructive-command confirmation. | -| `helm` | Helm chart authoring, upgrade, and release troubleshooting. | -| `incident` | Incident coordination, sequencing, and action definition. | -| `inspect` | Read-only verification audit with severity-ranked findings. | -| `k8s` | Kubernetes manifest authoring and operational troubleshooting. | -| `lazy` | Engineer-first minimal-change implementation with safety guardrails. | -| `migrate` | Safe database migration planning and review. | -| `onboard` | Contributor onboarding guide creation. | -| `openapi` | OpenAPI 3.1 specification writing and review. | -| `performance` | Benchmarking, profiling, and performance regression analysis. | -| `postmortem` | Blameless stakeholder-facing incident postmortem writing. | -| `pr` | Commit/push and pull-request creation workflow support. | -| `rancher` | Rancher and Fleet workload/governance operations. | -| `rca` | Technical root cause analysis for incidents and defects. | -| `refactor` | Behavior-preserving structural refactoring. | -| `release-notes` | Release note artifact and changelog preparation. | -| `requirements` | Structured requirements gathering and documentation. | -| `secret-scan` | Secret scanning and push-protection setup and triage. | -| `security` | OWASP/STRIDE security audit across code and config. | -| `simplify` | Generic simplification of plans and proposals while preserving outcomes. | -| `space-setup` | Copilot Space setup and context quality management. | -| `terraform` | Terraform IaC authoring and review. | -| `terragrunt` | Terragrunt DRY multi-environment configuration design. | -| `threat-model` | Threat modeling with STRIDE-first prioritization. | -| `verify` | Verification fix-loop with targeted re-checking. | -| `vision` | Scope and strategy review from first principles. | +| Skill | What It Helps With | +| --------------------- | ---------------------------------------------------------------------------------------------------------------------- | +| `adr` | Architecture Decision Record writing for significant technical decisions. | +| `analyse` | Cross-cutting impact, tradeoff, and feasibility analysis. | +| `architecture` | Engineering-lead architecture and execution-plan review. | +| `ask` | Read-only technical Q&A with code-backed evidence and clear guidance. | +| `aws-cli` | AWS CLI operations across core AWS services. | +| `cicd` | GitHub Actions CI/CD workflow authoring and hardening. | +| `changedoc` | Per-change planning docs for existing repositories; product starts it, other roles enrich it, planner orchestrates. | +| `cloudformation` | CloudFormation template authoring and review. | +| `code-review` | Pre-merge review for bugs, regressions, and risk gaps. | +| `codeql` | CodeQL scanning setup and workflow configuration. | +| `concise` | Runtime response-density control (normal/compact/ultra). | +| `consult` | DX-focused review with prioritized usability improvements. | +| `container` | Dockerfile and container runtime setup and hardening. | +| `conventional-commit` | Conventional Commit message preparation and validation. | +| `copilot-ops` | Copilot policy/configuration operations and governance. | +| `debug` | Root-cause-first debugging using scientific investigation flow. | +| `dependabot` | Dependabot configuration strategy for update hygiene. | +| `dependency` | Dependency health audit, upgrade strategy, and supply-chain checks. | +| `design` | API and service interface design standards and contracts. | +| `docs` | Post-release documentation alignment with shipped behavior. | +| `explore` | Fast codebase exploration, reuse discovery, and architecture mapping. | +| `gdpr` | GDPR-compliant engineering review for data handling and flows. | +| `gh-issues` | GitHub issue lifecycle management via `gh`. | +| `gh-release` | GitHub Release drafting and publication flow via `gh`. | +| `guardrails` | Session safety controls for destructive-command confirmation. | +| `helm` | Helm chart authoring, upgrade, and release troubleshooting. | +| `incident` | Incident coordination, sequencing, and action definition. | +| `inspect` | Read-only verification audit with severity-ranked findings. | +| `k8s` | Kubernetes manifest authoring and operational troubleshooting. | +| `lazy` | Engineer-first minimal-change implementation with safety guardrails. | +| `migrate` | Safe database migration planning and review. | +| `migration-plan` | Explicit-only cross-component migration planning with checkpoints and rollback. | +| `onboard` | Contributor onboarding guide creation. | +| `openapi` | OpenAPI 3.1 specification writing and review. | +| `performance` | Benchmarking, profiling, and performance regression analysis. | +| `postmortem` | Blameless stakeholder-facing incident postmortem writing. | +| `pr` | Commit/push and pull-request creation workflow support. | +| `rancher` | Rancher and Fleet workload/governance operations. | +| `rca` | Technical root cause analysis for incidents and defects. | +| `reasoning` | Explicit-only evidence-based critical thinking and evaluation framework. | +| `refactor` | Behavior-preserving structural refactoring. | +| `release-check` | Explicit-only release evidence and sign-off audit without publishing. | +| `release-notes` | Release note artifact and changelog preparation. | +| `requirements` | Structured requirements gathering and documentation. | +| `secret-scan` | Secret scanning and push-protection setup and triage. | +| `security` | OWASP/STRIDE security audit across code and config. | +| `simplify` | Generic simplification of plans and proposals while preserving outcomes. | +| `space-setup` | Copilot Space setup and context quality management. | +| `terraform` | Terraform IaC authoring and review. | +| `terragrunt` | Terragrunt DRY multi-environment configuration design. | +| `threat-model` | Threat modeling with STRIDE-first prioritization. | +| `upgrade-plan` | Explicit-only upgrade planning with compatibility and rollback checks. | +| `verify` | Verification fix-loop with targeted re-checking. | +| `vision` | Scope and strategy review from first principles. | +| `workflow-check` | Explicit-only stage, gate, and handoff review using the project's installed agents, configuration, and role documents. | ## Related Docs -- [Prompts overview](prompts-overview.md) +- [Prompt migration](prompt-migration.md) - [Instructions overview](instructions-overview.md) - [Work items](work-items.md) diff --git a/docs/user/reference/work-items.md b/docs/user/reference/work-items.md index 64051da9..6cf8a2a0 100644 --- a/docs/user/reference/work-items.md +++ b/docs/user/reference/work-items.md @@ -43,5 +43,5 @@ They provide durable handoff context between stages. - [Workflow modes explanation](../explanation/workflow-modes.md) - [Configure workflow modes](../how-to/configure-workflow-modes.md) - [Configuration](configuration.md) -- [Prompts overview](prompts-overview.md) +- [Prompt migration](prompt-migration.md) - [Skills overview](skills-overview.md) diff --git a/docs/user/start-here.md b/docs/user/start-here.md index 233c5b88..68a2d7e9 100644 --- a/docs/user/start-here.md +++ b/docs/user/start-here.md @@ -43,7 +43,7 @@ vstack manifest verify --target . ## 3. Operations Path 1. Set operating behavior in [Configure workflow modes](how-to/configure-workflow-modes.md). -1. Choose execution style with [Choose agent, skill, or prompt](how-to/choose-agent-skill-or-prompt.md). +1. Choose execution style with [Choose agent or skill](how-to/choose-agent-or-skill.md). 1. Tune project settings in [Configuration](reference/configuration.md). 1. Manage automation points in [Hooks](reference/hooks.md). 1. Review role-owned outputs and handoff artifacts in [Work items](reference/work-items.md). diff --git a/docs/user/tutorials/first-planner-run.md b/docs/user/tutorials/first-planner-run.md index a9695a01..03ef9c45 100644 --- a/docs/user/tutorials/first-planner-run.md +++ b/docs/user/tutorials/first-planner-run.md @@ -51,6 +51,6 @@ If output does not look role-structured, verify that Agent mode is enabled and ` ## Next steps -1. Practice role targeting with [Choose agent, skill, or prompt](../how-to/choose-agent-skill-or-prompt.md). +1. Practice role targeting with [Choose agent or skill](../how-to/choose-agent-or-skill.md). 1. Learn upgrade checks with [Upgrade with checks](upgrade-with-checks.md). 1. Keep command behavior handy with [CLI commands](../reference/cli-commands.md). diff --git a/poetry.lock b/poetry.lock index 9e1fba2d..5e57b18c 100644 --- a/poetry.lock +++ b/poetry.lock @@ -2,46 +2,69 @@ [[package]] name = "ast-serialize" -version = "0.6.0" +version = "0.13.1" description = "Python bindings for mypy AST serialization" optional = false python-versions = ">=3.7" groups = ["dev"] files = [ - {file = "ast_serialize-0.6.0-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:a7520b672827885bafeae7501f684d14d47d17e5f45256f9df547686cca52264"}, - {file = "ast_serialize-0.6.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:a14191beec7e0c078d2fc1f6edc0aee88bcd4db9f18e1bc9f8052b559c22dddc"}, - {file = "ast_serialize-0.6.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:32ef62ec34cf6be20ad77d4799556638fbdf187f3ae10698dfb20ef9f2c89516"}, - {file = "ast_serialize-0.6.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:13b7769970a39983b0adf2f38917b1cd3b8946f76df045756c3d741bc689f089"}, - {file = "ast_serialize-0.6.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6f7a408601bb3edaefb3bc67a4c01f5235e3253653b6a5729a2ee2382b35341c"}, - {file = "ast_serialize-0.6.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8670bfa51208a2c0c8d138928e40e998fab158f9200d53bb80c088b5b8eda7b8"}, - {file = "ast_serialize-0.6.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a4826809eb8597a8cd59fd924b6d7c285b8969a1e0007e2cb652cab62376270f"}, - {file = "ast_serialize-0.6.0-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:577a6c189068686869f5f1ddc38363f3ae1808a4753b577266f9202071a7bb66"}, - {file = "ast_serialize-0.6.0-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:085de7f62dc9cc247eb01e965a362707d1d90b1d89a82c5bf78301a60a3c417b"}, - {file = "ast_serialize-0.6.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:9f8a8b78b13173de6a9ec22111d9be674874cd5bdccda04f14ae5ebc2bef403a"}, - {file = "ast_serialize-0.6.0-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:f2ff3baffc3a29c1f15bc9098aa0c09763410262d5e6cef42116f7356c184554"}, - {file = "ast_serialize-0.6.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:0067b25fce104eaae5b88383de9ab803faeb671831e14ca698b771b356e2600f"}, - {file = "ast_serialize-0.6.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:c617417f9cbb0cb144f6283c3cbe0d2e0f01beaf9f608f662b21191058a626ec"}, - {file = "ast_serialize-0.6.0-cp314-cp314t-win32.whl", hash = "sha256:5337cb256dcea3df9288205213d1601581536526b8f4da44b6974f1180f3252a"}, - {file = "ast_serialize-0.6.0-cp314-cp314t-win_amd64.whl", hash = "sha256:2d947e45cafc4b09bd7528917fa84c517654a43de173c79785574b7b3068ac24"}, - {file = "ast_serialize-0.6.0-cp314-cp314t-win_arm64.whl", hash = "sha256:6e15ec740436e1a0d62de848641abe5f3a2f89a7f94907d534795ac91bbacf14"}, - {file = "ast_serialize-0.6.0-cp39-abi3-macosx_10_12_x86_64.whl", hash = "sha256:093cb8bb91b720d8523580498d031791bb1bbaa048599c3d21085d380e11a596"}, - {file = "ast_serialize-0.6.0-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:e61580a69faf47e3689795367ed211f2a10fd741478cc0f36a0f128793360aad"}, - {file = "ast_serialize-0.6.0-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:305802f2ce2a7c4e87835078ea85c58b586ddda8095b92fe2ead9364ae19c80a"}, - {file = "ast_serialize-0.6.0-cp39-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c7b8b8f0c42f752ea00b2b7d7c090b3f80d9c1c5c75cadf16423790a0cc74081"}, - {file = "ast_serialize-0.6.0-cp39-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cd5b91b9e6f2356ace3a556963b0cd783b395fbbb0bb17b4defc283415466e77"}, - {file = "ast_serialize-0.6.0-cp39-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4d6ef91590258ada18909b9caea344dac4de2013906b035473cd674a43f4b790"}, - {file = "ast_serialize-0.6.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dcbed41e9386059fc0261d602445ede0976c2ecec2939688bcbcb9ed0b6f28b7"}, - {file = "ast_serialize-0.6.0-cp39-abi3-manylinux_2_31_riscv64.whl", hash = "sha256:cdc4e6f930b9090c2f92c9036ad12ffb8e6e44d4a5ba06f1458a05d60f203f7b"}, - {file = "ast_serialize-0.6.0-cp39-abi3-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:897ac47b5637be41c0c07061c8a912fafa967ef1dc73fa115e4bfa70882a093b"}, - {file = "ast_serialize-0.6.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:c4af9a1386166e40ed01464991806f89038a2d89782576c7774876fa77034e32"}, - {file = "ast_serialize-0.6.0-cp39-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:c901adbd750029b9ac4ad3d6aa56853e0ad4875119fbf52b7b8298afc223828b"}, - {file = "ast_serialize-0.6.0-cp39-abi3-musllinux_1_2_i686.whl", hash = "sha256:3ae22a366b752ab4496191525b78b097b5b72d531752e3c1dd7e383a8f2c8a1a"}, - {file = "ast_serialize-0.6.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:4ed29121da8b3fdc291002801a1de0f76248fa07dce89157a5f277842cf6126e"}, - {file = "ast_serialize-0.6.0-cp39-abi3-pyemscripten_2026_0_wasm32.whl", hash = "sha256:b1dac4e09d341c1300ba69cdcbe62867b32a8c75d90db9bf4d083bec3b039f0b"}, - {file = "ast_serialize-0.6.0-cp39-abi3-win32.whl", hash = "sha256:82c312a7844d2fdeb4d5c48bd3d215bf940dafd4704e1a9bcf252a99010a99b1"}, - {file = "ast_serialize-0.6.0-cp39-abi3-win_amd64.whl", hash = "sha256:113b58346f9ceb664352032770caca817d4a3c86f611c6088e6ef65ddaa70f0e"}, - {file = "ast_serialize-0.6.0-cp39-abi3-win_arm64.whl", hash = "sha256:ccd132fe8db56f61fe743b1f644d01b8d65b83248a8da506f3132bda86d6ed5e"}, - {file = "ast_serialize-0.6.0.tar.gz", hash = "sha256:aadd3ffcf4858c9726bf3515f7b199c7eadbe504f96028e4a87172c0da65a8fe"}, + {file = "ast_serialize-0.13.1-cp314-cp314-pyemscripten_2026_0_wasm32.whl", hash = "sha256:3e129d44b0cffbea24a7f40117ce49e30993c3d119e584d4817ebd6f87246456"}, + {file = "ast_serialize-0.13.1-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:523d45bab16ddaf1399c04c4fe81bbf180f81e33c2f7bcbe76be56b0f7311ab4"}, + {file = "ast_serialize-0.13.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:638333fb8ae72c62753f9e794fda20290883ddc65b0d85e26e08f8bb227567ad"}, + {file = "ast_serialize-0.13.1-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc34c670747d85d4232834665e247009413eaebe47c69eaf60a5c439aaecaed9"}, + {file = "ast_serialize-0.13.1-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8c8ebd419811c435812d242fb2a173e57dfede198c9ac9a0a584666ebc9b9331"}, + {file = "ast_serialize-0.13.1-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8899c038b1c15ae8b98e379057fb3ef398ceb0b21d1737a8156dd5a0923b7e51"}, + {file = "ast_serialize-0.13.1-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e14c4de98f965647a74e6eaf37e20207124e45451ccd36e84a6f6ebab45e0372"}, + {file = "ast_serialize-0.13.1-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f3e8a3eff69af640db985360fef35073fb46956dfc3e5c614cf00920d2746dd"}, + {file = "ast_serialize-0.13.1-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:75d7750fe98f6f35a96c43aba8d98a2e623e22c778a0c17ab9ede92eb10f5d82"}, + {file = "ast_serialize-0.13.1-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:43e8ddd63e80fc280c2f790157386f27f9b9f6ccb9c4f8e803b863cbfb085769"}, + {file = "ast_serialize-0.13.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:9221e09496fb942901993c1812ee87950cc0ecbb514c7c0f1f5fa6d78f701ed8"}, + {file = "ast_serialize-0.13.1-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:7a5c38bdb93669c596f94fb7204dd6ebe4fadb19058ac9a2faf2948c2a175f96"}, + {file = "ast_serialize-0.13.1-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:acf4e9f055d75058ab01536da330648746f2f82b7697a85230547f2d5ebe895c"}, + {file = "ast_serialize-0.13.1-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:87427913c325adc811e81e7c9a757b061f47ef1e29114ac479aa0953a2687a98"}, + {file = "ast_serialize-0.13.1-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:ad88921f95b92bc144d9ad059a0e16f8c1ae69f5239f2d3c6536fd2774f73dfe"}, + {file = "ast_serialize-0.13.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:f8b17e2921e56621bcb46792bd3e0b82ca3b85de78d5936e7b8174ba1758b0aa"}, + {file = "ast_serialize-0.13.1-cp314-cp314t-win32.whl", hash = "sha256:2f9a9ce8b0994f757b941f7f7fe384a6666b4162b941ebc5c248081baea18e47"}, + {file = "ast_serialize-0.13.1-cp314-cp314t-win_amd64.whl", hash = "sha256:5d99910e6b9a9b9360bcca2ae99aee36cc912ce058df2a57d1c33099b6cb2593"}, + {file = "ast_serialize-0.13.1-cp314-cp314t-win_arm64.whl", hash = "sha256:a789cbe14d0a0e9ec9b32a456e5abc81ad8799479c3cfd88a29e3442262aebe6"}, + {file = "ast_serialize-0.13.1-cp315-abi3.abi3t-macosx_10_12_x86_64.whl", hash = "sha256:23d768369b89d551077dc173da6892fad00443338417523b6732f4e8ba4a7ed5"}, + {file = "ast_serialize-0.13.1-cp315-abi3.abi3t-macosx_11_0_arm64.whl", hash = "sha256:68f8829d114dab6c9db4a8bbb8d0e342958faee1b5e15a29022678df639960f8"}, + {file = "ast_serialize-0.13.1-cp315-abi3.abi3t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e385b17d5bde892a6184003a9aff3518387908b73f8f5ea539313c07c8c0ede"}, + {file = "ast_serialize-0.13.1-cp315-abi3.abi3t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:02686b281ec9b8e9614f6f0db27e12e4cac515f336c5d05b678bc9eb73ff2af5"}, + {file = "ast_serialize-0.13.1-cp315-abi3.abi3t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a8ab2c2585b2e22e48cd4aff2136fce4eab4ced569b85f150ef9a5a5d6f34d49"}, + {file = "ast_serialize-0.13.1-cp315-abi3.abi3t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c652d9f5d52d8b81eff3ff2c95c9dd0f281de45f6ad5d3fa95527550c396454a"}, + {file = "ast_serialize-0.13.1-cp315-abi3.abi3t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:121e1d08d58b75c15491cc3003609cbad71ac2b0016043c36d30a6b2032b6605"}, + {file = "ast_serialize-0.13.1-cp315-abi3.abi3t-manylinux_2_31_riscv64.whl", hash = "sha256:30cf89b6a6844542d116c758725d13de5b97b9410a51ee577715f761270d0c1c"}, + {file = "ast_serialize-0.13.1-cp315-abi3.abi3t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:732aaae9e498c973fc63fd7f308009b57c4afa6ff59d0b674d894e57d0bca01a"}, + {file = "ast_serialize-0.13.1-cp315-abi3.abi3t-musllinux_1_2_aarch64.whl", hash = "sha256:d9c1a920b2aa0c1e016bed7721689717034ca0dba64ac3a3ff243b003d4e8dd8"}, + {file = "ast_serialize-0.13.1-cp315-abi3.abi3t-musllinux_1_2_armv7l.whl", hash = "sha256:847cad4c22953823f5e76d0b126c6f9da670cfa45b1df41b9324e22189d77611"}, + {file = "ast_serialize-0.13.1-cp315-abi3.abi3t-musllinux_1_2_i686.whl", hash = "sha256:aca07de3ca8e3d9f2b716c3c31f4f384fe4bd2d03e09912417cff7a3e08036f7"}, + {file = "ast_serialize-0.13.1-cp315-abi3.abi3t-musllinux_1_2_ppc64le.whl", hash = "sha256:5db12d843d931b9d1f1519ce66b9cbfe72d8563b75c1204d255322254d1964dd"}, + {file = "ast_serialize-0.13.1-cp315-abi3.abi3t-musllinux_1_2_riscv64.whl", hash = "sha256:fb8021f4dc3296de18737e3b8b34994411da725374d74a0b9eb32a738f2a23d0"}, + {file = "ast_serialize-0.13.1-cp315-abi3.abi3t-musllinux_1_2_x86_64.whl", hash = "sha256:0d764913374ba21df8cd618045b371ed104ce55c6276de7c59e554a4f5ba26fd"}, + {file = "ast_serialize-0.13.1-cp315-abi3.abi3t-win32.whl", hash = "sha256:2bad302ae2427454ef9dab71bd5c3ad67188860c39d36daee38f72031edb39c4"}, + {file = "ast_serialize-0.13.1-cp315-abi3.abi3t-win_amd64.whl", hash = "sha256:032b09d86c785c3984e975378b7861f2a68ac44e22ba7b07b93a536b2524eeb8"}, + {file = "ast_serialize-0.13.1-cp315-abi3.abi3t-win_arm64.whl", hash = "sha256:929eda0c419e622ab49df3a4c45f81c57dcc10874bbad55d0470a4a03324dac3"}, + {file = "ast_serialize-0.13.1-cp315-cp315-pyemscripten_2026_5_wasm32.whl", hash = "sha256:bf53a3ba1cbe45399fc1e4ccd684b8f2a11cca450f89706b79122f478534c6f5"}, + {file = "ast_serialize-0.13.1-cp39-abi3-macosx_10_12_x86_64.whl", hash = "sha256:4bcf1d5f4eefecaa325a34ecf079b2741189e7d0821523f92cb343a389a67489"}, + {file = "ast_serialize-0.13.1-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:1b158f1c9e3a0d386913924c57995d6df78224868a4d0f215bdd41587c97b34a"}, + {file = "ast_serialize-0.13.1-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77a6201b69ce42e919f2fd9a559138d5410b5d8afff7c3a6b1f500b0481ff7d8"}, + {file = "ast_serialize-0.13.1-cp39-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6eb0be64c9b8f1ed26637eef345abe75ea90351c92c85a8aec7838b3af971011"}, + {file = "ast_serialize-0.13.1-cp39-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7f2427bddfca208e84de700044fadf9aef2769a70bae740a1bdabb89ee9e1117"}, + {file = "ast_serialize-0.13.1-cp39-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:88df960e67184a71874e5b2ee014f87d1254a0dbc1f903c7bd7b1ab7733ecaef"}, + {file = "ast_serialize-0.13.1-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f99786e0d62082a5b121b3437f3167562133711df22128de1e9886f57f0b226"}, + {file = "ast_serialize-0.13.1-cp39-abi3-manylinux_2_31_riscv64.whl", hash = "sha256:a01b515b25a03184eff4acef25b981ae007916379682e908fc8785b342a0bf3e"}, + {file = "ast_serialize-0.13.1-cp39-abi3-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:29422d7bcd9e7f39411571c36cec45ce8a7a9b3ad4b2e7aa64497c15a9e397f6"}, + {file = "ast_serialize-0.13.1-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:6ffb0f548a7dc126067fdfb7b2325ab5dfcdeecc29faf5e0f0461c96d6ebfa3d"}, + {file = "ast_serialize-0.13.1-cp39-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:2876444a5f87a7c76f371af3c07c2fda563a08bc8af52568df812e8aba4bf568"}, + {file = "ast_serialize-0.13.1-cp39-abi3-musllinux_1_2_i686.whl", hash = "sha256:885a62ec6481ce58ab24c6357360d7a82023b62dd7e5e7ceccf59e9662a3272b"}, + {file = "ast_serialize-0.13.1-cp39-abi3-musllinux_1_2_ppc64le.whl", hash = "sha256:2015fd0165e463aac3b1aadc6a1fa1e5820c14ca950821f4fe02f8a3f6a388d6"}, + {file = "ast_serialize-0.13.1-cp39-abi3-musllinux_1_2_riscv64.whl", hash = "sha256:eb41e1906502ac80d24ff343f45008552a3f5b5158607959fe6a07dbfc6eb037"}, + {file = "ast_serialize-0.13.1-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:ca9acc67f796aa2554fa3037dccc022a4b08b38b2ad153edfac9c9bb7cb1f3c6"}, + {file = "ast_serialize-0.13.1-cp39-abi3-win32.whl", hash = "sha256:4f98da562e5901d69c7dd30885594c5438f859edf354e9ac7517d188fb026c3a"}, + {file = "ast_serialize-0.13.1-cp39-abi3-win_amd64.whl", hash = "sha256:ddf7cbc9c8abf70102c4a088efe154bb86bfb825b0a10e556d2b15972cf99bd7"}, + {file = "ast_serialize-0.13.1-cp39-abi3-win_arm64.whl", hash = "sha256:48f11d96c9ec71119612f8e79a8c55c12f2b136716d68347433c561d27a25f43"}, + {file = "ast_serialize-0.13.1.tar.gz", hash = "sha256:401cc84e8888d4d76f2c8d296fa006ed1a5ff993b6aff90dd777c03973efd025"}, ] [[package]] @@ -237,175 +260,223 @@ files = [ [[package]] name = "librt" -version = "0.13.0" +version = "0.16.0" description = "Mypyc runtime library" optional = false python-versions = ">=3.9" groups = ["dev"] markers = "platform_python_implementation != \"PyPy\"" files = [ - {file = "librt-0.13.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:34e47058fcc69a313293d6dee94216a4f30c929ae6f2476e58c5ba635aa639d5"}, - {file = "librt-0.13.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:dbdd5b6509d0c2a8fe72cf494c299a61dbd58142a90a4190664ae159e4a7b547"}, - {file = "librt-0.13.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2e56ea4ee4df77585a6b5c138f6538680886024fa559f5b55bd14b12e98e67b2"}, - {file = "librt-0.13.0-cp310-cp310-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:f1f9cc4d09a46d9cb3c2063ae100629d3f52a6517c3c08c2f4c9828261883929"}, - {file = "librt-0.13.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f125f5d46b20f89dc5587a55cc416b4ba2a5b2ffda36d048ee120e17598a653a"}, - {file = "librt-0.13.0-cp310-cp310-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:2608d3b39f9e0b4a66a130d9150c615cba40a5090d25eeeaa225e0e46de8c0ac"}, - {file = "librt-0.13.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:9fd35e95ab5e45c3901d37110263c7db85a961110f5460588fe37f8c131f88a7"}, - {file = "librt-0.13.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:5f31b0aa13c9b04370d4da6be1ab7779776b3a075cceb6747a39a4be85fe1e40"}, - {file = "librt-0.13.0-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:0b795f5fc70fbbb787ceaf79bb3a0d627bcc33c53de51741755263ec406b775a"}, - {file = "librt-0.13.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:36b306a623aaad96fe4b378692b54f9c0789fccd833b9851753d5fbf6138cfde"}, - {file = "librt-0.13.0-cp310-cp310-win32.whl", hash = "sha256:a3762e75fcac8c9e4dacaaf438bffd9003e2ca2c531b756f3c0035deefa674c8"}, - {file = "librt-0.13.0-cp310-cp310-win_amd64.whl", hash = "sha256:d63bae12a8aeb51380be3438e4dc4bd27354d0f8e19166b2f44e3e94d6f552dc"}, - {file = "librt-0.13.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1b5a7bbff495baedbd9b916c367d66854008f8f3b575908ded477c499dc60082"}, - {file = "librt-0.13.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:34bc7938b9fdf14fe32a406c19c71faf894c5cee7e7474bd0be2f17200b82d14"}, - {file = "librt-0.13.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f40e56b61b41be5f7dec938cfeffd660668cf4b5e72c78e7bd671d66b7bc2c79"}, - {file = "librt-0.13.0-cp311-cp311-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:9c5d02b89de5acd0379a51ec44a89476fb03df6145442e1c8ecd6bee2f91b176"}, - {file = "librt-0.13.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7db9a3ff32ef5f7d1703d93831a3316cdf0b537de6a1cc03cc8fdd09b9194e89"}, - {file = "librt-0.13.0-cp311-cp311-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:3dbb2a31882456cadc7053378e81ad7ed7693db4ac9f98ab5f81ef034aa8ec9f"}, - {file = "librt-0.13.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c6014e3c80f9c1fe268ef8b0e0ef113bac672cc032f2f93866e7ddad4f3e663d"}, - {file = "librt-0.13.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:091b60a4d2174fc1ec5c34cdc0b72efb6224753d76b7da61ebeab7a191aec8bd"}, - {file = "librt-0.13.0-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:66cb1138f384a191a6d75f986064841fcfdc0cea98f7bd9c9ab9b38049917588"}, - {file = "librt-0.13.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:17221a7569f8f292aa0014226e48aa25b8c2b08da18088cd230953d0ea0f9cd1"}, - {file = "librt-0.13.0-cp311-cp311-win32.whl", hash = "sha256:fc67741da44c6eaa90e01eafb586bbba9b51eb5b6ed381ee6f5ae72eb3316d21"}, - {file = "librt-0.13.0-cp311-cp311-win_amd64.whl", hash = "sha256:cc99dfb62b23c9207c33d0be8a2e2af7a42e21e6ea388b380a0c948c7b88953b"}, - {file = "librt-0.13.0-cp311-cp311-win_arm64.whl", hash = "sha256:40ccd13c252d3fe473ffc8a57be7565abc8b64cf1b108344c859d5164f7f3e0c"}, - {file = "librt-0.13.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:30536798f4504c0fad0885b1d371b0539abb081e4570c9d7c641cb51141b49f0"}, - {file = "librt-0.13.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:93d24ebb82aa4420b1409c389e7857bc35bd0b668007ac8172427d5c73cc8cc5"}, - {file = "librt-0.13.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cb8a1adce42d8b75485a5d56a9623a50bcab995b6079f1dac59fc44034dd93d9"}, - {file = "librt-0.13.0-cp312-cp312-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:0763ca2ab66058174f9dee426dc64f5e0a89c24a7df8d3fe3f1836c04e25de4b"}, - {file = "librt-0.13.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b222493da6e7b6199db9bd79502436cf5a27da3c1f7fa83c7e285444fc93fd03"}, - {file = "librt-0.13.0-cp312-cp312-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:fadc63331f4388c3dc90090448f682a7e9feafc11481391c1e94f2f907a3976e"}, - {file = "librt-0.13.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:70d9c62a4cffd9f23396cd5ef93fc5d11b31596b9b7d6306074abe3d5fcf09bd"}, - {file = "librt-0.13.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:66c0e7e6b02a155576df2c77ec933a70b72da726e248c494abf690923e624348"}, - {file = "librt-0.13.0-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:ac04bcd3328eb91d99dfedf6a60d9c1f15d3434e6f6daf922f0420f7d90b85c7"}, - {file = "librt-0.13.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:db327e7271e653c32040b85ae6188059c924b57d7e1e29f935523fa017cd4e82"}, - {file = "librt-0.13.0-cp312-cp312-win32.whl", hash = "sha256:860bd1d8ba48456ce08feaf8d343a8aaeb2fa086f2bcaa2a923fa3f7a3ff9aa3"}, - {file = "librt-0.13.0-cp312-cp312-win_amd64.whl", hash = "sha256:e54a315caf843c8d77e388cadc56ea9ded569935ee2d2347d7ea94992e5aa6fa"}, - {file = "librt-0.13.0-cp312-cp312-win_arm64.whl", hash = "sha256:c718e99a0992127af84385378460db624103b559ab260435abcfe77a4e4ed1c1"}, - {file = "librt-0.13.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a468951af16155824e88bdd8326ebe5bdb371f3ec0ac04642994b98201d914f3"}, - {file = "librt-0.13.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:ae01d8512cc17079e53425635327dbf3f7ff57a42c00dec348bf79791c56444c"}, - {file = "librt-0.13.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:32c26893cd085c1efe83219e78d866da23fb20a066101b8f68210004361d224c"}, - {file = "librt-0.13.0-cp313-cp313-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:5929da1981a46bcf4b28b1b9499905f0ff58e2419da402a048234e9783acbc4b"}, - {file = "librt-0.13.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:94b85d664d777bab6c0d709416cb42938251fda9e221b79e3a2215d85df5f4f9"}, - {file = "librt-0.13.0-cp313-cp313-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:531b2df3e9fe96b1fcf73a6d165921e4656be5f58d631d384ebce344298368db"}, - {file = "librt-0.13.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:109b84a9edf69ad89dc1f66358659e14a031baca95e3e5b0060bd903ede8efd6"}, - {file = "librt-0.13.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:1304368a3e7ffc3e9db986796cc5326fdb5943a3567ecc137cff318e4240c0e7"}, - {file = "librt-0.13.0-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:e4f9b472e7d308d94b62c801982065661158c6ed02790d6c7ddb4337cea0f9c1"}, - {file = "librt-0.13.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9f836c37478f167a81200d8c8b2c920a22224564bed2c23d7aeec760965c367a"}, - {file = "librt-0.13.0-cp313-cp313-pyemscripten_2025_0_wasm32.whl", hash = "sha256:4000d961ff9598ac6ea603c6c836a5ed49bc205ade5fc378b998dfe1e2c36628"}, - {file = "librt-0.13.0-cp313-cp313-win32.whl", hash = "sha256:79e44cff71750d299d61a678e49995b0d5935a9cda238c2574daeca3ba536927"}, - {file = "librt-0.13.0-cp313-cp313-win_amd64.whl", hash = "sha256:54dab44a847d5ad1acd05c8a83fe518ae685516ecf4d3f7cc6e3df2a66767650"}, - {file = "librt-0.13.0-cp313-cp313-win_arm64.whl", hash = "sha256:d4cb6fbfdf874340ab5e51450753c0f817b6958a3621125ee695bbc3de866566"}, - {file = "librt-0.13.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:25218d94b1d2cbc0ba1d8a3f9dc9af578d9646e5ed16443a70cde1dfdcce6d71"}, - {file = "librt-0.13.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:f26629539d4893c2957a16c41bb058e1e135c1f150f6a2e25ed047f64cf3f5c6"}, - {file = "librt-0.13.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a4517d47b2b8af26975a406fba7d314de9696d864252e0257c6ea90238cfe27f"}, - {file = "librt-0.13.0-cp314-cp314-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:f19e181de5b3a1148bb3420b8c4b0b0ea0fce6950099724ad151d6cea5acc180"}, - {file = "librt-0.13.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:22034924f5b42d5a56371cf271771bfeaabf235a7a8b6264bef2d20013f786c6"}, - {file = "librt-0.13.0-cp314-cp314-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c7897db4e95e22468bdda33d8e012ceacd0182abf001e6389d763f0def6286b9"}, - {file = "librt-0.13.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:1ce61b3746545029d4f5c17d6bd74b676254ad98433086c846ffb5e8fa73f007"}, - {file = "librt-0.13.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:46c330e82565962c761dbce7941be2cff7db674ee807455a8d0cadc5f9b759b0"}, - {file = "librt-0.13.0-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:375f5af8f99cbaa99dd293af986e3d57caabc9ba81a5d3f021603764854197a1"}, - {file = "librt-0.13.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:9320d34c3376ae204b2cd176e8d4883a013934e0aef822f1aed9c536490c275d"}, - {file = "librt-0.13.0-cp314-cp314-pyemscripten_2026_0_wasm32.whl", hash = "sha256:9af313c66157a69dc69ea0059a66961692250e0dc95af9c385a48ffb770a0d16"}, - {file = "librt-0.13.0-cp314-cp314-win32.whl", hash = "sha256:f2a7253458e34f33543551394ae4fe104b497ec2a65ac266074de64c1df82e37"}, - {file = "librt-0.13.0-cp314-cp314-win_amd64.whl", hash = "sha256:a3dfe4edf10e8ed7e55b026a8bfc2c2a8704218b659cd4bffdf604fab966dc39"}, - {file = "librt-0.13.0-cp314-cp314-win_arm64.whl", hash = "sha256:68a5faee4bba381cb93b5961f684a514cf0053cb92308ff9c792c2fea0b174c6"}, - {file = "librt-0.13.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:a38fb81d8376dfa2f8963b265fec07637802b0d01e2a127c19c66cb070fb24f5"}, - {file = "librt-0.13.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:d4c8d9bd5abce34b2e75edb3bf37ab0f34e49b1f915a40ae8468eb7c85bc5b46"}, - {file = "librt-0.13.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:387e2f1d27e89bffe0d3f520f0da0662c973fd607ca16c1808f8a5085419485e"}, - {file = "librt-0.13.0-cp314-cp314t-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:4f6db193d2e5e0ed60359b9a5a682cd67205d0d3b1e459a867dd4b5c4e7eaa7a"}, - {file = "librt-0.13.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0d38604854e8d22faadf683ec6c02bb0f886e2ba56ef981a1c36ee275f21ea22"}, - {file = "librt-0.13.0-cp314-cp314t-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:371f7ce73026815dafd51c50ce38416e91428b28c4b2ec97cd39271164b0045c"}, - {file = "librt-0.13.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:3aaedf52171bee90860704c560bc798fe83b76247df47568e0197e9b13c735a0"}, - {file = "librt-0.13.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:96bad8725a4f196a798366c25ce075d1f7543a4ec045ffc13e6a7ec095cdab04"}, - {file = "librt-0.13.0-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:6bf6a559ffe4a93bbea6cf31ddf01a7fd9ba342ef51f27beb178e318b74acd61"}, - {file = "librt-0.13.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:301067672387902c55f94b51d5022304b36c966ea9fe1f21caab99a9bef487c9"}, - {file = "librt-0.13.0-cp314-cp314t-win32.whl", hash = "sha256:5fdcf34f86de8fb66d7dc7589f96ba91c4aa46671200d400e6fd6f109a483f18"}, - {file = "librt-0.13.0-cp314-cp314t-win_amd64.whl", hash = "sha256:260c33e92263fa629b4f6d3c51967a1c2158fe6c33237aaa3ebeac586b085259"}, - {file = "librt-0.13.0-cp314-cp314t-win_arm64.whl", hash = "sha256:2f281549a4c52ac7bb97997f14353f8bd0e53a34ca0dad1c905cfd0b4a58ae99"}, - {file = "librt-0.13.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f442e3954b1addc759faae22a7c9a3f1e16d7d1db3f484279dc27d62e06968fa"}, - {file = "librt-0.13.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9e786428f291dd2d2f1cbfc0e0caa45a2e395fab0ad3e2c9314daa8873414390"}, - {file = "librt-0.13.0-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:21b7ac084f701a9cdff6139745a6620579d65a9379ac2d9d50a86368b109e63c"}, - {file = "librt-0.13.0-cp39-cp39-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:a6e556d6aba31c93dd97ce661d66614d2429c0a3923f9dc8f0af7e8df10223a4"}, - {file = "librt-0.13.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3657346f867469e962549435aa05fd15330b1d6a92829f8e27988e194382d005"}, - {file = "librt-0.13.0-cp39-cp39-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:791aa18a373b90da8ac3c44fc77544f33fdf53ae403acdce9b39f1c26b4a3b94"}, - {file = "librt-0.13.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:d6fb0eaa108814581c4d3bfbd068c3fb6757812a81415008d1bae08267cca360"}, - {file = "librt-0.13.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:a001519c315d5db40710f2665d32c4791f1d4779fc96a9423fd18d92c8b9ac7b"}, - {file = "librt-0.13.0-cp39-cp39-musllinux_1_2_riscv64.whl", hash = "sha256:d9188caac26e47671b52836a5e2a49873a7fc11c673b0c122d22515f98bc14e1"}, - {file = "librt-0.13.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:05d96b80b95d3a2721b619f8982b8558848b04875bb4772fd54842b59f61dd97"}, - {file = "librt-0.13.0-cp39-cp39-win32.whl", hash = "sha256:c3cd253cf32fe4f4662960d6bf7d55cb8be0c31a5d644a4d48aeafebaff3409a"}, - {file = "librt-0.13.0-cp39-cp39-win_amd64.whl", hash = "sha256:b15e26cc0fe622d0c67e98bee6ef6bc8f792e20ee3006aa12627a00463d9399f"}, - {file = "librt-0.13.0.tar.gz", hash = "sha256:1d2a610c14ac0d0750ee0a3ab8548e83155258387891caaca04def4bf7289781"}, + {file = "librt-0.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:96f576f2711f8519152ec76d0e599243555c1f07679fa73606ca8c8c868c0be6"}, + {file = "librt-0.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2bec3818c7da7c96ceae0ef5915a3d16c52dd08f3ea913bf1fe8568c447c7978"}, + {file = "librt-0.16.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:64c79520414a3fdfc6aabd7593e6169afa14d5f8d9908d4b498db068868b08dd"}, + {file = "librt-0.16.0-cp310-cp310-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:f81b5b19ce748ef68d4746656b7929762eb2fe99269b266e4be07e2ee4de7144"}, + {file = "librt-0.16.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c71d1b76210a36729fedfc5115069b50a3d8619054745f8758fe5d6f19e86671"}, + {file = "librt-0.16.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:473eebc7866bb0a0c8849a292b5e7157c1aba5d14d0f0f610c52158d6d964262"}, + {file = "librt-0.16.0-cp310-cp310-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:4eb1313a19847089ee81e88742abedf285c60538816640b99742d8534b81d26a"}, + {file = "librt-0.16.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:ebefd60b42e2a82b32d136bb5f7c94eadfcd29f772b547df6f3291d1ed855a1c"}, + {file = "librt-0.16.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:6c5da27e8056439f927ea896735da60e616c477a8293feaa3233d4e7781a6726"}, + {file = "librt-0.16.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:67e718c7a43f8db325abbbf1404e2d535f12f8f7a1a82259568385cc5274b82a"}, + {file = "librt-0.16.0-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:314e703f0c19320dc8094e7a784b9cf29e1b67402515abf580069a6363c0b4f1"}, + {file = "librt-0.16.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:943c6bbecbdf7fa575a4f2952fcfd848c88ef95507c3fca411e89d4ac3ff8143"}, + {file = "librt-0.16.0-cp310-cp310-win32.whl", hash = "sha256:7cc365f006891afb006b52d5ee5ee74c09306ffa20e2f8705a32a4450af2f3ba"}, + {file = "librt-0.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:0314058469f4d2fd279ce7c62ac274ac82c3918ef7db62ef0697c4c359370155"}, + {file = "librt-0.16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:fe4372c52d4849096c6cc1cda2817d293ec51440c890474ed59ef38d46556f18"}, + {file = "librt-0.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c72c5295a84bd249526da9bdca38f2e176d15c31c13bb0063c5053f4ca023421"}, + {file = "librt-0.16.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:be56ba9c884143495b517f23fe794ae367d58cd89ea0fdd6d437e3c024a87f9f"}, + {file = "librt-0.16.0-cp311-cp311-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:ef46c1a29ffb8c72e882e22618ec618778eacd0578fb22c6e7cf9c11d15f357b"}, + {file = "librt-0.16.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:d3c94211ee0c4f8d649ec06b7c115c0ec4eadb873a0e3154ca15cef3f814b071"}, + {file = "librt-0.16.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:94aed6a8308818b91677957d1bd03188869cd7aeb23c5dba7912a6c0402f7602"}, + {file = "librt-0.16.0-cp311-cp311-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:349c0bcb87ebd07481b6ff781e25cdc699723dbe2212e57dabb27f7a13b7b87d"}, + {file = "librt-0.16.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:001bfd59a7d45b17e3e75f2a8c6405280b35e7b84471792778e718c4f368950e"}, + {file = "librt-0.16.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:28e038895b998d7a0c7798922ce8a1dc157675df5cf1c9ef0aca809ed804b7a1"}, + {file = "librt-0.16.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:0dbe4096a7ecc00fa835d24510ad8545a4efef738dac96e0e63516783ccde905"}, + {file = "librt-0.16.0-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:5cd5b092441053364af968ea12084692cb9d4a22f3ce9524e377880bf028761e"}, + {file = "librt-0.16.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3ddeb3c9dedb461bb457c6c7d9aa7fbf35329da313d1a7543d00c8d0f3473c96"}, + {file = "librt-0.16.0-cp311-cp311-win32.whl", hash = "sha256:e05108e0849966f53a8d2d3112a7af881d0efaa479bc735bba91108f9f2350a7"}, + {file = "librt-0.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:5f49cff01bd608ef7d97104cb035c75455e79c2d70bf4a506cf773338ac1860d"}, + {file = "librt-0.16.0-cp311-cp311-win_arm64.whl", hash = "sha256:1d28ae980ae2218f9c5b95d191e947296f918c9bf0b400d467a9430275bbe678"}, + {file = "librt-0.16.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fe52bf4641069e7978a14253b036cb9002def1926317e710f2e249f8a8c47742"}, + {file = "librt-0.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5bcc2c4726ced915b00de0c9856a4eeabfb3fddb93e10e0b8f735b7709358b6d"}, + {file = "librt-0.16.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ff7baa55f8e7c69851419e50a666015d02a74198716fd45c0125a2112e0a389f"}, + {file = "librt-0.16.0-cp312-cp312-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:b95d5d92ab83d39e760a52091bb1baba664f3a2351e39b1e16801e5747c2f0e9"}, + {file = "librt-0.16.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b6d085d70bce51d43c5c7c36d63490770180d8779e71c49305c87b4213918de7"}, + {file = "librt-0.16.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:36e53948e99bbe3ffea257124cfcae1cfb01831555c9a9c903c9f9a72db7fd07"}, + {file = "librt-0.16.0-cp312-cp312-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:54d11f726aae9df5a6ffbbf0a03a52449bbac84a53ef03669cb41cdfd4ae41bf"}, + {file = "librt-0.16.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4323193ac0cd025f85af531df8ba91bf24d1973b401697347a6282e8fd3fcf5e"}, + {file = "librt-0.16.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:e42f8e098b9c5396fefa05fb1cc7e33b0e08fc51da106b5de4a45fd22aac6743"}, + {file = "librt-0.16.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:39ec1d5a14e37baf1450a6cabf03fe552340808bf1ad9d71824ab90117716459"}, + {file = "librt-0.16.0-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:d1aabe3925cbb4a08d15b7b20ba4011b53019da0c4173a25155139b7b1baed65"}, + {file = "librt-0.16.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:300c3ffdc459f4a779a8411ecb188e3ac0b1ff3a3a7b099642555dedae06c69b"}, + {file = "librt-0.16.0-cp312-cp312-win32.whl", hash = "sha256:c17194318e4c0c0348b36f36c2ec7534436fe0a4c15582403162a4f08c80797a"}, + {file = "librt-0.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:25a58a19ea8d83b68209f04912df765e9260635ef77646542ed4b4abe6bc7940"}, + {file = "librt-0.16.0-cp312-cp312-win_arm64.whl", hash = "sha256:f7be7cf555bc30ec12622e9447299cc4a9b8ff307548b634794353db0c2065dc"}, + {file = "librt-0.16.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c5e6144e68b577f157519f2ba88ca20e3ed61c29b00e5cdfa76cd2d45acf059a"}, + {file = "librt-0.16.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:33f41443a1f4e1f099331b3d8120e409fbff84b9760bc1cc9ea496f37ddaa5cc"}, + {file = "librt-0.16.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7e510b7770bee609617a3374a96548eb114cae048023e3f049ee449e7ff2db32"}, + {file = "librt-0.16.0-cp313-cp313-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:efc49c462d4516b8a58b00b490078fa64689fd1fe66970cc190131d7afb8027e"}, + {file = "librt-0.16.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:92caf82ebef5e12d21c72242b70d1e92536f1711cf2a727a4c276de4b4469087"}, + {file = "librt-0.16.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:17bac7f7a16b328fff77e440287693eb017abde913595b5827ebccbc21ecd8a6"}, + {file = "librt-0.16.0-cp313-cp313-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:5b976054553670829985ed767feb78fb6bcede0175327c4844dd5c281c1be659"}, + {file = "librt-0.16.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0058f9d68721094105917254c72ac0569117bb7b13b9769cf45d26d89f9d21cd"}, + {file = "librt-0.16.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:30b7beaf3f4487b7d8adef1f158b49067cb4d5a19fa7a3bf31a4e7a820e435c5"}, + {file = "librt-0.16.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:468df902df016a06eb0e40b0747dc8d14e47d7a38b18b63b1fb167d85cb94d63"}, + {file = "librt-0.16.0-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:aea7b1f2b125dad5de85f049136651bff256c883c65e6b9209b2da0a1ac3cdef"}, + {file = "librt-0.16.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a8afb6557920860b7a3a596eb804cf37e09e7cf8a803db2478c202acc72d8c2e"}, + {file = "librt-0.16.0-cp313-cp313-pyemscripten_2025_0_wasm32.whl", hash = "sha256:77c7a2b4fe2c1369e0d5aa1cade26740a7b14be32fbc9a5535d617d20065c39d"}, + {file = "librt-0.16.0-cp313-cp313-win32.whl", hash = "sha256:02d89c813d5ff74b17df72d3a34819d132cd168e56b81bf755b809bd9e46b8c4"}, + {file = "librt-0.16.0-cp313-cp313-win_amd64.whl", hash = "sha256:14ed6ebe3e4f85f326d7920011ad30ff49ed9334e62cf88caef9ba973d9e3a92"}, + {file = "librt-0.16.0-cp313-cp313-win_arm64.whl", hash = "sha256:83d4041a3d9b2fd053a8a4e1f22878b3e5833e2712956382d5c048d791454e91"}, + {file = "librt-0.16.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:931a0bb0fcac88f263e269e46eb30ba8e21402cd3c62ca40cb97034c0693fab1"}, + {file = "librt-0.16.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:1bc17e54e5305f8d40b7ca203671ff5a9e59c1d0f8ea0f625dcca53a3984de11"}, + {file = "librt-0.16.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:877698bf6bca5721d8be345f2fe09778e40ecadea8b58c73075f2b1a53666bf2"}, + {file = "librt-0.16.0-cp314-cp314-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:5981c011b306781ce561e18e14230a14524a3d8109b97553666c942c18f31a96"}, + {file = "librt-0.16.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:afced3dfc17cd805ecf7a3d77996a71cf5f2c75aa66eb0c21a9930f4fc992f86"}, + {file = "librt-0.16.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ca8052401c55d7511dda6760719fda7618067e83535d7d0010096d216c34b667"}, + {file = "librt-0.16.0-cp314-cp314-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:1e511762a074005bb0aa569166779834e75e438370226930d0ce1866d4b6a33b"}, + {file = "librt-0.16.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:f1e8591bd8a5a628cd7f07954c6a1592359a878bf032957a8e9057a41d644311"}, + {file = "librt-0.16.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:a4aaefb4ba6c07e1aeebb2795c8958148f1d6f9af3b555b53d23d766edb6d67a"}, + {file = "librt-0.16.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:d92db7a0f6aee44f1baee94750457e8d2d1c6ccea41842de6268d34e8dc7eddd"}, + {file = "librt-0.16.0-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:378dfaffb38e59c24a87cde5713cd865d51ff7383fa12947f3907f306ea1ca55"}, + {file = "librt-0.16.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:3e0c39bdc85370422e8b637be76eb1fd07d30967551b03e62267dd156f553152"}, + {file = "librt-0.16.0-cp314-cp314-pyemscripten_2026_0_wasm32.whl", hash = "sha256:1b384b90ab79a7bc30b566895809a636e0666f21f3cf12b54823d025b7e83839"}, + {file = "librt-0.16.0-cp314-cp314-win32.whl", hash = "sha256:52327da75a94012e7f932f913d20d3876bed3c102be00e6c3e8600ff7bdd58a7"}, + {file = "librt-0.16.0-cp314-cp314-win_amd64.whl", hash = "sha256:3f0b8114c44b2ac06ff5dacd08e07e8e807ff4f46083f2a1602685122559be41"}, + {file = "librt-0.16.0-cp314-cp314-win_arm64.whl", hash = "sha256:8caf96a4ef8fb27d0ac0d1ad8337d26a240acd4a02fe4345d0a8f264753e8f99"}, + {file = "librt-0.16.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:953107e2f68d0f3512c48f898b0dbf0ce5cc52bba0f318d847c985dc555ee4cc"}, + {file = "librt-0.16.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:ad37d5b9abd49c9a655dcda7ea52a8a752884062ef1ee71ae17c2f2a0f81fe6a"}, + {file = "librt-0.16.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2c4aa329c17bd1aaea4f6e89335d8ccd494b3a5830b6654462273e50e11023f0"}, + {file = "librt-0.16.0-cp314-cp314t-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:0ead24d2562a49473dddd9efef8581f020007eb0054389c3ee3ffad38b1ca4c9"}, + {file = "librt-0.16.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:02118f56a9c36ddd07dfd9b919d9ecc117ba20a90987d56aa4c429fa34509188"}, + {file = "librt-0.16.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4e29522c62e28595ff7e324c6834ade51127707f0e255b18d1c1cf03d39c1048"}, + {file = "librt-0.16.0-cp314-cp314t-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:3ff4b2367926b69c6215635902cccb04048e73094e9862900d27cb2c6bbff143"}, + {file = "librt-0.16.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:c6f1b27bf1632a7e016af9f145f82be95e1edd7721a646505c21059257cb5a04"}, + {file = "librt-0.16.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:5696d7f52e7b37217cb3a8f92c744fe835942602fdd4c1a8bc4741d3bfdce15e"}, + {file = "librt-0.16.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:6072e92dd876ff6ceeb6cf371e35e51f479349837391341f479b08df4564242b"}, + {file = "librt-0.16.0-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:39ca4f2f2fe05de8e63493da592d84311adabe5bef52b193851981da9816b302"}, + {file = "librt-0.16.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:f9807485a908f00355820f18e91e045ffdcdc5adb68aaec40a1e2b88c5f7bba1"}, + {file = "librt-0.16.0-cp314-cp314t-win32.whl", hash = "sha256:94be5cb7bca4df6201f4183e9e4fa2086c655283d20b38cd84500a69057575a7"}, + {file = "librt-0.16.0-cp314-cp314t-win_amd64.whl", hash = "sha256:d46ca272b251d033dd4527b0dec5f261a28a52bd5fa0f99c117b0a1f8588cc2d"}, + {file = "librt-0.16.0-cp314-cp314t-win_arm64.whl", hash = "sha256:b9d6d4b14e92d876f8026b54c20c445f36425214c1081dc76f74e40db386b82b"}, + {file = "librt-0.16.0-cp315-cp315-macosx_10_15_x86_64.whl", hash = "sha256:6fe436af2eaf630474f491af5d032cbe45f93fcff5c3b9fe4ab194a7255b20ff"}, + {file = "librt-0.16.0-cp315-cp315-macosx_11_0_arm64.whl", hash = "sha256:8ff5d26c529336be9bd7ae04483235d77778ee7d6444a95353102b542601ce81"}, + {file = "librt-0.16.0-cp315-cp315-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:909d8e3c1faee44cb762b1c519ff8613dcc5ceae5c99987a00917b5a31fd1d6a"}, + {file = "librt-0.16.0-cp315-cp315-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:6d4a64283ee61824b5790de882bc68e2d9d7a5143537cb7a966f7354f71646d4"}, + {file = "librt-0.16.0-cp315-cp315-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:5810ba811297fdf37a1531a57667cb8ace0842013ca8606bf9eb7c24cf4be154"}, + {file = "librt-0.16.0-cp315-cp315-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e56aaf8c167548dc8e5d6f3bd0f48dcdd299a23c73be3f744aab79d99e9c7f5d"}, + {file = "librt-0.16.0-cp315-cp315-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:8f36c58e33b304b525c6c9c5076399c6ebf1109e17b9051a05a407b091b9215b"}, + {file = "librt-0.16.0-cp315-cp315-musllinux_1_2_aarch64.whl", hash = "sha256:242e00b3d4fa37c3d3c1ca5f5c9adb7d909ddb1eac9c41f2787320d00caa0af2"}, + {file = "librt-0.16.0-cp315-cp315-musllinux_1_2_i686.whl", hash = "sha256:0253721561787b8df8443eb347b7a6461015354e5bdd37ee38a41fef220d2bb0"}, + {file = "librt-0.16.0-cp315-cp315-musllinux_1_2_ppc64le.whl", hash = "sha256:3e483a8d69ede8067db70c0e83007423b6925de6fd53afed01d66160f2e9398c"}, + {file = "librt-0.16.0-cp315-cp315-musllinux_1_2_riscv64.whl", hash = "sha256:69ba927445cfaaffb4081003ef5224c55a5c2ab67ef956f416ef744916e44121"}, + {file = "librt-0.16.0-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:d6a365f2ab45a984d0e00eee0dd17f599ceab8cadab6ea07b6111c8132fc0e42"}, + {file = "librt-0.16.0-cp315-cp315-pyemscripten_2026_5_wasm32.whl", hash = "sha256:f01f3805f2dae4781c0c34b440e31740d082950bdaf89a6f601ad589a28af57a"}, + {file = "librt-0.16.0-cp315-cp315-win32.whl", hash = "sha256:b0e3e721c75d2e79a76d4422c79d7ba705fe1bbafec907037fe7a657a480a0e3"}, + {file = "librt-0.16.0-cp315-cp315-win_amd64.whl", hash = "sha256:bc02954b1295de798bbdb0b4e2d8a28c2117de8b5c73dcbeb27dc32572dfb971"}, + {file = "librt-0.16.0-cp315-cp315-win_arm64.whl", hash = "sha256:c5db585d43449a5f54303d4b2774e45e1babd975cfe1630a3d708c0b80c3e560"}, + {file = "librt-0.16.0-cp315-cp315t-macosx_10_15_x86_64.whl", hash = "sha256:f06c689cb14afd9b612727553a5ec5a40febf113ca41c4413a2b0b334285884b"}, + {file = "librt-0.16.0-cp315-cp315t-macosx_11_0_arm64.whl", hash = "sha256:13b4e8aba90b0b1c82474e9844aa9ffe7ad3faa484350e1da64cb8188d903134"}, + {file = "librt-0.16.0-cp315-cp315t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5a269c46ae327d8e6f8c1f85f7516cb52c0fa48127565a1105a4f4a05ff2a0b4"}, + {file = "librt-0.16.0-cp315-cp315t-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:a33e0dae1f8592146a4764d54ce842b278732d21a84e17c3bbe6b1bc158a2248"}, + {file = "librt-0.16.0-cp315-cp315t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:47ada6ea32636492c61aa8ad27ae3b9404bfe7a97e3ba946d1984236cc741da0"}, + {file = "librt-0.16.0-cp315-cp315t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c43bd6e642d8a248c114327f98dd25ac5a7cb5aa168ef02f0559b91874df16b8"}, + {file = "librt-0.16.0-cp315-cp315t-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c3d1bb7841a816ace6449bb26d3f9560dbfa20e71c568d23f0f62bf1e68f50b1"}, + {file = "librt-0.16.0-cp315-cp315t-musllinux_1_2_aarch64.whl", hash = "sha256:3931f7a3db322e7f44e02a280e3949326ce9579ad388ee8d691dc7c76da9fb70"}, + {file = "librt-0.16.0-cp315-cp315t-musllinux_1_2_i686.whl", hash = "sha256:f4462528b6000afe8f16907b5c7c2553abf1df005ba5140e6eb394541c3624c3"}, + {file = "librt-0.16.0-cp315-cp315t-musllinux_1_2_ppc64le.whl", hash = "sha256:80039ba9b6a7d5f1a0175a4cca6bbefead87bd854c80abad1cb30afe47a830db"}, + {file = "librt-0.16.0-cp315-cp315t-musllinux_1_2_riscv64.whl", hash = "sha256:7a1d272724b581bb6bc769dfdafed6da2ecc9886ba2450311de55a4ac2e1e9cd"}, + {file = "librt-0.16.0-cp315-cp315t-musllinux_1_2_x86_64.whl", hash = "sha256:fbe4fb8c5445f7496d7f7f6bb0807875d09d47e6771ffa175fb2df2895fb86ba"}, + {file = "librt-0.16.0-cp315-cp315t-win32.whl", hash = "sha256:375bfe6b572a8f6cfc398709356046173bf27e64c4c5edaf5f7062f051fb4bf9"}, + {file = "librt-0.16.0-cp315-cp315t-win_amd64.whl", hash = "sha256:bd3150023d3dc2bc70f3784e59ffa1140d56ddba3d8125b3d6f9f85221279bfc"}, + {file = "librt-0.16.0-cp315-cp315t-win_arm64.whl", hash = "sha256:8ceafb70f2a4f0826f11031942e59c0728fd98da112dc346d4352bde1e486866"}, + {file = "librt-0.16.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e1967e36ac4cae0c7e9615ad32e1a513cdacff79f9e8afb28bedc91caf48b4f3"}, + {file = "librt-0.16.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:20fe0bf9053885e21c62b3e091fb5e73e1c54d1daf2e70eb388d70763bcd4220"}, + {file = "librt-0.16.0-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6a63610fa76524edfa605b5b259a603915c7a6e10e54f003e5503030506e81de"}, + {file = "librt-0.16.0-cp39-cp39-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:845a511b60ca43b9880dcc84a9784c891d6a2098c829130b320846c69c9c0c68"}, + {file = "librt-0.16.0-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:d608f0bf3b8cbddd0067fe02cb8cab7d13e8eb9386b23a1843d4363044fd9e22"}, + {file = "librt-0.16.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:df183721229ae51eef90108c115b43e98cb169b6155d34480338e5fc6616df00"}, + {file = "librt-0.16.0-cp39-cp39-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:4b6183e2e2e0ee00aac2ec07c7f7d151c97e85666b304f574b71cff0f9fccc4e"}, + {file = "librt-0.16.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:273d00be33792a15189331df10f1f1331621b043881e66c6c4377f7f776e1291"}, + {file = "librt-0.16.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:aa9357a1b4d4fc787bb718a59cb1112c28c8a976d6bfa268b71cc0a4ab8f3a94"}, + {file = "librt-0.16.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:e9ce0bc440e7fd09b5f51f372f0f6640658f854b8fb05260f819cc669c93c42d"}, + {file = "librt-0.16.0-cp39-cp39-musllinux_1_2_riscv64.whl", hash = "sha256:6c8893eae2fd13c5488d94056f3e6e5cf3142bfb1c4acaf136cb33d760c5964b"}, + {file = "librt-0.16.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:7393c9a48dcce4817dbd4b0d8ff6237efe9b0a0609f5b0adaef315f8541726b5"}, + {file = "librt-0.16.0-cp39-cp39-win32.whl", hash = "sha256:71b93b42784e25b975079573c642a8fedb049a7bb31d70a51721b1666b3b2ced"}, + {file = "librt-0.16.0-cp39-cp39-win_amd64.whl", hash = "sha256:5750a105b42a416f930edc59054927a406effb2550cd5bab92ad7a5842ed5d05"}, + {file = "librt-0.16.0.tar.gz", hash = "sha256:ac38d6d8d66bf3d744148dbbc0b8e193e195a51e364ed55e224631f5721891fc"}, ] [[package]] name = "mypy" -version = "2.3.1" +version = "2.4.0" description = "Optional static typing for Python" optional = false python-versions = ">=3.10" groups = ["dev"] files = [ - {file = "mypy-2.3.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:57a936373fc690c43a8cd7e7e12a35148e4ec5aa7698ad7fc0a9f918bdc5be41"}, - {file = "mypy-2.3.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d00d769056bde2f4e69c175071eba45cfb44fa1ed92bdfbfe64a93e0543b0cf0"}, - {file = "mypy-2.3.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2166b29228835e1f88ff411e96639e6ca3c7fdde84b62ec211f70f86b4051167"}, - {file = "mypy-2.3.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:83d36c2924df7426333abe7faf4724a7e1aab0d9fd41625e81b4683034b80c13"}, - {file = "mypy-2.3.1-cp310-cp310-win_amd64.whl", hash = "sha256:f12fdb70459d0060dea40b29e52163a961b156106d68d57882a6a9f648983a53"}, - {file = "mypy-2.3.1-cp310-cp310-win_arm64.whl", hash = "sha256:e099200a1b1b1223a4951f0a90cbff1b8c91b250ba599dab1f7217a628144d90"}, - {file = "mypy-2.3.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:94f04929f1c44c35fb0061e912087edaf504acede963a4a7d00680bd089d8531"}, - {file = "mypy-2.3.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f5d716048611e85ca9eefb2e1baa5d73ede389b5820ded260ea27c757d667af8"}, - {file = "mypy-2.3.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b091a455111214cb5c9d54a57b9618e9a49f9fe2a42e4e1ac86e9d104ed96ce8"}, - {file = "mypy-2.3.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:df12e20c9efd614738c71b390007ecd0181125afc4ccafca04d78a1d2eed2c01"}, - {file = "mypy-2.3.1-cp311-cp311-win_amd64.whl", hash = "sha256:52eaf3a155f35cf80b40220288c861eb45f14a2340c1f6cbfbdb0feff32879d1"}, - {file = "mypy-2.3.1-cp311-cp311-win_arm64.whl", hash = "sha256:9b4eacbee8a69836c06eff6d0dd4e134a07c2b047755b30c08625fe214f322c6"}, - {file = "mypy-2.3.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a32bbbb940af990d3be0b8af321c7b6815bb1b3b48142fe7459b9cc5f58959ff"}, - {file = "mypy-2.3.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ff715e45b2231a8e85de1d163d1b42791e4d7aab8f5145f85fee1b710b735aff"}, - {file = "mypy-2.3.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:858fc57d3d91fa728e33e7ad71def60fc6272694607b306cd3292db53ae39080"}, - {file = "mypy-2.3.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:851833db876e7b650f93719c74b7879a08e338979c96054fdfc3bfd90a486355"}, - {file = "mypy-2.3.1-cp312-cp312-win_amd64.whl", hash = "sha256:4c5095a327483591c94e0c8d3ef9e50d4ab1369b541eae007c1f23bc2a41f6bb"}, - {file = "mypy-2.3.1-cp312-cp312-win_arm64.whl", hash = "sha256:bbfe022634a2a195406bd469e888d2eaf193b02ba7e607391cd7640374aaae3b"}, - {file = "mypy-2.3.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:114dff494000f18bd10d5d95d84b8567b26da60279ecbe838131841df20e635d"}, - {file = "mypy-2.3.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c8637731bb5eee3671eb2c3200827aa3564ed8a9309ecee4d1afe77e6d031bdb"}, - {file = "mypy-2.3.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1c80fbc405ed8020f5ff3802dc18cf060197bcdd3fbdd6a26ef2fd34dfdd5226"}, - {file = "mypy-2.3.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:84081f538ce27375045c02e3d7f81bd11d853400621ae245d87ce7b6c420ec74"}, - {file = "mypy-2.3.1-cp313-cp313-win_amd64.whl", hash = "sha256:e9144ac16fde007096f9563eb2041b4433c2d705c4218edeb79e7e9d01035ee6"}, - {file = "mypy-2.3.1-cp313-cp313-win_arm64.whl", hash = "sha256:77ad9529e67dca28e511f5cd5671436584ce91f6d3bac159a353158187b986ac"}, - {file = "mypy-2.3.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:192abaedf75da1bc0b1cef104927e70ec49c1ef0031cc4825c7ee10a438ed24d"}, - {file = "mypy-2.3.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bf678dffd16efcda2c15cbd30e9ecc0081388e29ea23687a88e686ed92638dc3"}, - {file = "mypy-2.3.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8e036f06b41630f4c8a1d48f9ac6aa26acc65f8be089973f5519da643318f03f"}, - {file = "mypy-2.3.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:71af9c8a894e862b58e92abb08e53b05a384a1e5e5d6dc7cda59126211a53d82"}, - {file = "mypy-2.3.1-cp314-cp314-pyemscripten_2026_0_wasm32.whl", hash = "sha256:3c80cd23d85368bdd9f37d5231dfd97d35bcbf5bf41af96ef3a9b078ad1957f9"}, - {file = "mypy-2.3.1-cp314-cp314-win_amd64.whl", hash = "sha256:4956f34d145e145562a0a0bf367f642bbc85c04ec2baf47ae015947c3169a85d"}, - {file = "mypy-2.3.1-cp314-cp314-win_arm64.whl", hash = "sha256:cfb12e360242d23d91f5e978d94f58ea66acf5804c4fb6f2f794a20d4cb1b595"}, - {file = "mypy-2.3.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:e5f1c50bb05b64e2026b52867e8d21106f01313c744a2c4ecc34c90d12e8d6e2"}, - {file = "mypy-2.3.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:667196b352f4cf304ded4c10f90cfc179263a1acfb3cdcfa984bdfd340d498bc"}, - {file = "mypy-2.3.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b9c53e395c12cad2c6d4b67d5da7c6057638a132d85c08b73646b18f802a0045"}, - {file = "mypy-2.3.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:18162b128c3f9c703cd35f5537446900b0d21a2549aa7a95d21380d2ef643fb0"}, - {file = "mypy-2.3.1-cp314-cp314t-win_amd64.whl", hash = "sha256:30c0477d4aab7b7f39c8397dc877f2c96b9fe5588ec379f372c56eb63d599f63"}, - {file = "mypy-2.3.1-cp314-cp314t-win_arm64.whl", hash = "sha256:6941ab3619377bc3f32ca02876b07d27f216f5201604b664d3937ea0fdd23bb4"}, - {file = "mypy-2.3.1-cp315-cp315-macosx_11_0_arm64.whl", hash = "sha256:6f041a6de52c9217ca125e78ba0a335cb7fd98a1c0580978e49ab2b126f70b57"}, - {file = "mypy-2.3.1-cp315-cp315-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5159ae60f5dbc3a498af5ba8365505808ac8031bc63f9e00304ad545d40bdd9b"}, - {file = "mypy-2.3.1-cp315-cp315-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:47a8a7a0a7f6f6e63995c0ac36fa0c07b127413fdc81f0439b7f3dccafd33561"}, - {file = "mypy-2.3.1-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:2329c0501293d4e1f33bc15d04d6304d65a1cdda967ee93a05c1e681a3923133"}, - {file = "mypy-2.3.1-cp315-cp315-pyemscripten_2026_5_wasm32.whl", hash = "sha256:bb26deed807bdb0457cf3e3f1cd7c4a1cf9d66864eaf1b4a61e06805d4c6b1f9"}, - {file = "mypy-2.3.1-cp315-cp315-win_amd64.whl", hash = "sha256:375d7013876a8233b2d05be185bfa09f689696cd999ce8b1cfe6acac5c80e8a3"}, - {file = "mypy-2.3.1-cp315-cp315-win_arm64.whl", hash = "sha256:586b3612214cceabb3c0f588c97e7d1e535393f06a60e912e994f6b3ace97523"}, - {file = "mypy-2.3.1-cp315-cp315t-macosx_11_0_arm64.whl", hash = "sha256:ef0c6335cda9d807f8193d8ff6204a72bc909fa9882aacbca14f43cdb7188306"}, - {file = "mypy-2.3.1-cp315-cp315t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e598c8c66401d26b150872154a286e6d484cf2789c3bb28a7556806298423021"}, - {file = "mypy-2.3.1-cp315-cp315t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:eda22fd4efa9dcd39331d1dede9b5b8b8a7fd69af07592e778433da98610d29e"}, - {file = "mypy-2.3.1-cp315-cp315t-musllinux_1_2_x86_64.whl", hash = "sha256:2a0ba2e57847849fb0d1fcdabb32786d223095ed8bc121dfe322bcdb3d9c46bc"}, - {file = "mypy-2.3.1-cp315-cp315t-win_amd64.whl", hash = "sha256:3f7e865dd51f235f60a2dbcd8728a1c095f5ca28f095d48a725b84cd935735c4"}, - {file = "mypy-2.3.1-cp315-cp315t-win_arm64.whl", hash = "sha256:8ad80807dc3ab8ea978b1b2b6e4a657194ace1d4ef03e0e731aff1abd517da29"}, - {file = "mypy-2.3.1-py3-none-any.whl", hash = "sha256:6ed5c7e3419083268e5c9258bd1c1ef91af44a9e89374dbcaf37b775716e72eb"}, - {file = "mypy-2.3.1.tar.gz", hash = "sha256:47c1b1207258513a9d93495f69c8be9de73916186f0e52703e8c461b7a623419"}, + {file = "mypy-2.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ffda5244fd1ad71a1e54405e35f50d09b80c3978efa120f58bd1252ae32c62d2"}, + {file = "mypy-2.4.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:615b03922d40e186fd1df73156473db0ba525c639bb4fd1cf28e1694879c9b23"}, + {file = "mypy-2.4.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:13fa24f439c0e48a290a3922fa14ccd22f2762bae99d2142931b3e40a9055080"}, + {file = "mypy-2.4.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3adef556a19eb3b630bf86a79c29d7da3d61e541472d0d897ca01b171c0abf8f"}, + {file = "mypy-2.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:1dc0f64b0a92ae27a49d2175f0bacfa56e15bdc5b420cf92e0c1f79292219cbb"}, + {file = "mypy-2.4.0-cp310-cp310-win_arm64.whl", hash = "sha256:4a378fc15fb33e321f04652c166ce73eeb8833a97c3d218132844e938cd93220"}, + {file = "mypy-2.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5d20e6c7c35fcbf2a0ebdd0eaeacfbc243009dfd33ab7822d54e213912e6dbbd"}, + {file = "mypy-2.4.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3011537be6cf1de4511c0255a324362a812b58184bbe61e15f59c8b31033bd74"}, + {file = "mypy-2.4.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a96b07a49b7b1d025ce59c1b3acbcf24bead9a83da4523c4a6bde1bb94e7a0e1"}, + {file = "mypy-2.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:7c4f8f8d1d1c0e2832d8ee7113dd08f6df6c7aad9e863fcbed9f25832be0b8c4"}, + {file = "mypy-2.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:ba05652540bf12828e52abae807b024b09ca144ff4f75e2450a81d69c376425b"}, + {file = "mypy-2.4.0-cp311-cp311-win_arm64.whl", hash = "sha256:6306086b87cf7f8a29aa618d9fd9bffb56c59247166b9660fdb54d86d7714ecd"}, + {file = "mypy-2.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:e05ff2925d8b37ad26c80c1b9dc43ae5d455da2df1e23c24c095a6425917c57e"}, + {file = "mypy-2.4.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:29243242cf72582b65f9582ad9e56e8cb281566ed3519f4cd70bb8b9f2977e90"}, + {file = "mypy-2.4.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:29eb0b9427a6b11b992e452f6cceb8af724f4dceb47e779d0b35e405e996ea5e"}, + {file = "mypy-2.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e3ebe2f72a2a1156065a9851570ffbf50c0a93cdccadef9c6e05c508a4fd10b1"}, + {file = "mypy-2.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:236e0d68f6941992b0811128e652590f590db444ab29ad8f1324765b9298b946"}, + {file = "mypy-2.4.0-cp312-cp312-win_arm64.whl", hash = "sha256:82d0f94c8587ccb472622ee7795280aaa38a06640d5f45b3f16909d6dd86a989"}, + {file = "mypy-2.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7da85fbcff6dac1abcc636707bed38b45598131fb7a605d9719c70b5cc733af8"}, + {file = "mypy-2.4.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4209da39d85cf240f762af622d8180fcdfcb4727d021f44ade62d613a1a43324"}, + {file = "mypy-2.4.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6be721bd4bd57576193653b75b4af3461c9d0bf7dd8b528f782e9be210dc75bb"}, + {file = "mypy-2.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e1fde197ae65be856a034a91b70ed747a16562ca69577785f06c661548424bf1"}, + {file = "mypy-2.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:295ecf2e57542cd836ca537486951289678c8c7d1ee6ad74ebe29b2168a003cf"}, + {file = "mypy-2.4.0-cp313-cp313-win_arm64.whl", hash = "sha256:bc378bdad4e9f12b5bd96466083d1e71acf00594ec9c7b2bdb5e02816f77f303"}, + {file = "mypy-2.4.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:058165f564ccf559c68c70fec2091fca5891110480210c22594635e3f6683437"}, + {file = "mypy-2.4.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9fa247e02b505a45a2775f69df38d360d197e3790bc60f717595db9eda358b6e"}, + {file = "mypy-2.4.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:20e9a5cd875837520c43db98dea0b6d0c2197833d95c30127d8f570fb9b1f00b"}, + {file = "mypy-2.4.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:9f03a7828cca2b0adcd6662aee8f2711ff8830e1027641fdea3ab0b787483566"}, + {file = "mypy-2.4.0-cp314-cp314-pyemscripten_2026_0_wasm32.whl", hash = "sha256:9279488933040b638c0ab739084c0ca100efeea6db581bf5d7628d8e89de53fe"}, + {file = "mypy-2.4.0-cp314-cp314-win_amd64.whl", hash = "sha256:2106b55105ba5ea9be4f53a24517fc5fa927ff1585edc9bc1a975abb72caef89"}, + {file = "mypy-2.4.0-cp314-cp314-win_arm64.whl", hash = "sha256:528c8744b8b5e3ecb8774f86af38d2376216816e9908317ad055f3c9c2d74799"}, + {file = "mypy-2.4.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:0bb95cf34899e4619c61ab0a8667804e139e580b30d5df12af2102dfe44d0c97"}, + {file = "mypy-2.4.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:86d616fe84c6eab8026f8c50ab5bcb90db780d2ccd233d971e34e92bede9b359"}, + {file = "mypy-2.4.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a3f86fd1313dd69d013e265f1fdcd12ea7a9d606f9875b2a3db946cd334555f3"}, + {file = "mypy-2.4.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:720434d48542ecfe84d32d287b727569d3fc8f5769acd39051130e490a5c295c"}, + {file = "mypy-2.4.0-cp314-cp314t-win_amd64.whl", hash = "sha256:a6e851b82c0661f69f1630fc16172c68787a6a9cf0991e7c6437d60976cdcd76"}, + {file = "mypy-2.4.0-cp314-cp314t-win_arm64.whl", hash = "sha256:3bd0e340f0ebe65c548210f53be3fd8192e83964760caf0c28bef368e68b0d37"}, + {file = "mypy-2.4.0-cp315-cp315-macosx_11_0_arm64.whl", hash = "sha256:afa89837d9be67e0cadfa33bca3bb7efdda98c3b07e74dc3b635ebfb1c8a926a"}, + {file = "mypy-2.4.0-cp315-cp315-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fb443e81057896132d3642d6be219e6efd158691ac7883e3ba8fcb469865f05d"}, + {file = "mypy-2.4.0-cp315-cp315-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7f38f57d344f8b6accb40e01c3d83cfc590498231724d16c07ffb7940f157818"}, + {file = "mypy-2.4.0-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:e76172710bd4e5eeae061abfd68347e5264632e02778be61784671ae3a2132f5"}, + {file = "mypy-2.4.0-cp315-cp315-pyemscripten_2026_5_wasm32.whl", hash = "sha256:f83353e47ab520bf6fd4df8f5897d9fe081211f2fbc4b7d37736a3e3c166cbcf"}, + {file = "mypy-2.4.0-cp315-cp315-win_amd64.whl", hash = "sha256:970b221ed5842213d98e3c480c08f795ace4b1f81fb21e1b126bd0476bce1c34"}, + {file = "mypy-2.4.0-cp315-cp315-win_arm64.whl", hash = "sha256:502b94b0b331f7dafe32fd6b151797ddbb4f32385b362e722c783a025e5954a3"}, + {file = "mypy-2.4.0-cp315-cp315t-macosx_11_0_arm64.whl", hash = "sha256:c9de622fd397495695d0598ddc789222bfcfec9d7c9ec3a1e385c855e3bc5e01"}, + {file = "mypy-2.4.0-cp315-cp315t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9f459f0b4f0596d9d51fe7716b404b35287b99e77da98a7af90a65dd5fd61141"}, + {file = "mypy-2.4.0-cp315-cp315t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f9b028548b3af480e2b1ed8df14ccaac86f99c9f600d1580770ab7ba3dcd40f0"}, + {file = "mypy-2.4.0-cp315-cp315t-musllinux_1_2_x86_64.whl", hash = "sha256:cb734b2668c1f40d07ce093bbeb4407e9527c67901627b0e1679825be3f09975"}, + {file = "mypy-2.4.0-cp315-cp315t-win_amd64.whl", hash = "sha256:172e30b8fea631fe310f0c665477f52d9ea40bb4e99e0c81dc30118563b13710"}, + {file = "mypy-2.4.0-cp315-cp315t-win_arm64.whl", hash = "sha256:5786ef987b3767e51aaa53f20aec104c0252b42ecda7aef8e8b4cbae279b05c5"}, + {file = "mypy-2.4.0-py3-none-any.whl", hash = "sha256:d01c5d26a352acc6d5cf3128225477e1e8465e8d3029d4c345807fbf7f3cf093"}, + {file = "mypy-2.4.0.tar.gz", hash = "sha256:77bdaebd452f43fcfc4cc3ba94352a3ea537cd01e3f2d0879f48673d2ec00d6e"}, ] [package.dependencies] -ast-serialize = ">=0.6.0,<1.0.0" -librt = {version = ">=0.13.0", markers = "platform_python_implementation != \"PyPy\""} +ast-serialize = ">=0.11.2,<1.0.0" +librt = {version = ">=0.16.0", markers = "platform_python_implementation != \"PyPy\""} mypy_extensions = ">=1.0.0" pathspec = ">=1.0.0" -typing_extensions = {version = ">=4.6.0", markers = "python_version < \"3.15\""} +typing_extensions = [ + {version = ">=4.6.0", markers = "python_version < \"3.15\""}, + {version = ">=4.14.0", markers = "python_version >= \"3.15\""}, +] [package.extras] dmypy = ["psutil (>=4.0)"] @@ -588,23 +659,18 @@ testing = ["process-tests", "pytest-xdist", "virtualenv"] [[package]] name = "python-discovery" -version = "1.4.4" +version = "1.6.1" description = "Python interpreter discovery" optional = false python-versions = ">=3.8" groups = ["dev"] files = [ - {file = "python_discovery-1.4.4-py3-none-any.whl", hash = "sha256:abebe9120b43453b68c908acfb1e72a19d1a959ed2cb620ad38fc57d08056dbe"}, - {file = "python_discovery-1.4.4.tar.gz", hash = "sha256:5cad33982d412c1f3ffb8f9ca4ea292c9680bca3942451d30b69c37fce53a4a3"}, + {file = "python_discovery-1.6.1-py3-none-any.whl", hash = "sha256:d43fcdef879fe795352bd13ccf8d185ba5a9f86f36cfcd00529f596e737442b3"}, + {file = "python_discovery-1.6.1.tar.gz", hash = "sha256:cf87d3627dfb4412437fdd5b13eae402607722998d21567993aedbc59b23c15e"}, ] [package.dependencies] filelock = ">=3.15.4" -platformdirs = ">=4.3.6,<5" - -[package.extras] -docs = ["furo (>=2025.12.19)", "sphinx (>=9.1)", "sphinx-autodoc-typehints (>=3.6.3)", "sphinxcontrib-mermaid (>=2)", "sphinxcontrib-towncrier (>=0.4)", "towncrier (>=25.8)"] -testing = ["covdefaults (>=2.3)", "coverage (>=7.5.4)", "pytest (>=8.3.5)", "pytest-mock (>=3.14)", "setuptools (>=75.1)"] [[package]] name = "pyyaml" @@ -691,30 +757,30 @@ files = [ [[package]] name = "ruff" -version = "0.16.4" +version = "0.16.10" description = "An extremely fast Python linter and code formatter, written in Rust." optional = false python-versions = ">=3.7" groups = ["dev"] files = [ - {file = "ruff-0.16.4-py3-none-linux_armv6l.whl", hash = "sha256:df4075f71ddac40b9934af60c3ec8a53047dd5a5fdc43224e6e4e8e9a27cb6f7"}, - {file = "ruff-0.16.4-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:0c95538517af68004306b0fb3214ff2f2af67a65092aee77cd9eb86db6656604"}, - {file = "ruff-0.16.4-py3-none-macosx_11_0_arm64.whl", hash = "sha256:963f83df8e69e575b64d67dd447ebbc917db41a14bf38d4593a4183e7aaa8255"}, - {file = "ruff-0.16.4-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:32a5057c7ff3f6e6480a48fccfb3a412a690f48a3d03ac5cf08177d6c2da3ade"}, - {file = "ruff-0.16.4-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b3dce8d9b0c57c265b91885a66a567d8ea1372e8eb4e250fa8e5e3f579e99cff"}, - {file = "ruff-0.16.4-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7dc651db49283c69f8e72c834eec4fe5573e4c646856aebece0ce385dceb2a80"}, - {file = "ruff-0.16.4-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3817b87dbcabc92f13b05019257c5b89b5b4d51b5fb20f56fb5235ceb723cd07"}, - {file = "ruff-0.16.4-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e9fce1499134b2c8c68e5166f95705a5812062bb93aacc5f9873bb1a27084bc7"}, - {file = "ruff-0.16.4-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2d812e482f5a7e02eee26cd73d2a37ebbdf47d795ea63ba1b89110ae93e9fb3"}, - {file = "ruff-0.16.4-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:6baaf984aa7976edf93d3b627fe2d1d22ee94bbca05fa6f90fc76d73924e3454"}, - {file = "ruff-0.16.4-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:bdfcf0b28662eb890372d50f92c283bb94e67e7635ed93c7fd533970acff7b2b"}, - {file = "ruff-0.16.4-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:b66b02cb9b04f537643cadf5768e5f98dc461890d530cb67113d71c8c76e605d"}, - {file = "ruff-0.16.4-py3-none-musllinux_1_2_i686.whl", hash = "sha256:8528bf9a4b291a60bf02ea453511e8ce6215bd2b982ee80405b66b008b6c30a0"}, - {file = "ruff-0.16.4-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:fbd85d2875fdd67e833213a651f613bbf25303abf6aa822a5121f4531195678d"}, - {file = "ruff-0.16.4-py3-none-win32.whl", hash = "sha256:312769988007aaeb8e189b443ccdd03c0e6374489e053467be6d96518ebff76e"}, - {file = "ruff-0.16.4-py3-none-win_amd64.whl", hash = "sha256:05d9d27a18c4bcbefada602480ec9e01e0bc949d432e0ced5df77edac195919c"}, - {file = "ruff-0.16.4-py3-none-win_arm64.whl", hash = "sha256:a3a61621c9b6f6a89573e938a080e648f1695baa3f58570a3a707bc51ff65a21"}, - {file = "ruff-0.16.4.tar.gz", hash = "sha256:13171aa9d9af2240ee3504e639de73122c67e74036de5ba2e1d01422cd17e3dc"}, + {file = "ruff-0.16.10-py3-none-linux_armv6l.whl", hash = "sha256:488b0fe3f3574210e5cf80d9f59b9e3ab17a127a8155de3f307b392589cfb511"}, + {file = "ruff-0.16.10-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:e748ff95c934c4e978783b8e687bc174e7bd84e8ad24e3243e1ecfcda5e0282d"}, + {file = "ruff-0.16.10-py3-none-macosx_11_0_arm64.whl", hash = "sha256:3031a4a2e8e7b8a46f70be45f198c35a11ece509a94b80334d8d397a33c67550"}, + {file = "ruff-0.16.10-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:494401c86df4c4c25f69b9419605d944467ee98c42fb6ad405ef4fa40b8fb67d"}, + {file = "ruff-0.16.10-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d203abc0ff2b773ee33d00ab8df0bb67046fbc7c07b119332f08b9b345cf8221"}, + {file = "ruff-0.16.10-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bd83d1235a5258d318477bc5b576303974cbdef5df0c01a1bff14efcc23bd12a"}, + {file = "ruff-0.16.10-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bc2610fb269fa56dd8a68669ae470fa6272902668c0fc2ebc3aa112b2633d5b8"}, + {file = "ruff-0.16.10-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3e70175e29cc94c26ea296c80e470180b744b7419026898e58f520c6ab32578e"}, + {file = "ruff-0.16.10-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f33f43a864a8483eebd160e713336c8bab02c934feaff0a33cf5ccb41546d09a"}, + {file = "ruff-0.16.10-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:1dfc6f0088149fb6a362c1c446bcbb3fd2157b3852fe2fa68409276eab9ad9b3"}, + {file = "ruff-0.16.10-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:6553498afc35f580f036030795810b9e6bcea31604b0fd9e8d352795473042e3"}, + {file = "ruff-0.16.10-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:a3b8471dea115d37f123882be852bed13403746d3a76c11de4a19ec5f9ff5a03"}, + {file = "ruff-0.16.10-py3-none-musllinux_1_2_i686.whl", hash = "sha256:92e59a70bcbd9d3a5483656da906ec28edfdacfce00afd99edb8b4e9d15644be"}, + {file = "ruff-0.16.10-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:7ae7375f803b5520dc9f546bed7e3a0acb70b91812e9bb4b19927de22f25b77d"}, + {file = "ruff-0.16.10-py3-none-win32.whl", hash = "sha256:2a12e01cb9156c10c466f63b46eaae5ecea28dfbd21b5836353ae498e7d1349a"}, + {file = "ruff-0.16.10-py3-none-win_amd64.whl", hash = "sha256:97f2015c92aa97105b0eab19eb5d224884399281cfc5da86a92db4ab5e7fb2ca"}, + {file = "ruff-0.16.10-py3-none-win_arm64.whl", hash = "sha256:25a65fe998c4e6861ec079ada5826a2fc605e6cbccbe9dcd7fac1f54e791621b"}, + {file = "ruff-0.16.10.tar.gz", hash = "sha256:eff4728c4eaae93f0955cd264d24b2ab348e74bf59986ccf282ba6dc16b3b017"}, ] [[package]] @@ -731,14 +797,14 @@ files = [ [[package]] name = "tox" -version = "4.60.0" +version = "4.64.10" description = "tox is a generic virtualenv management and test command line tool" optional = false python-versions = ">=3.10" groups = ["dev"] files = [ - {file = "tox-4.60.0-py3-none-any.whl", hash = "sha256:175abbc4cdef615d66874c0843be4f44c353c14aab6d89939bb22246f84122bd"}, - {file = "tox-4.60.0.tar.gz", hash = "sha256:6f93bb580d35e00fc69cfec1116eecbe21155f747753ca5019374f7c69b2eac9"}, + {file = "tox-4.64.10-py3-none-any.whl", hash = "sha256:9f0bd51c4fe770b682d0c9540842efc07bd98c302cc327986201169e319de669"}, + {file = "tox-4.64.10.tar.gz", hash = "sha256:7482b96fefe1e4b49e406a9a62b25b415690bec2cebe9cc0cd59e38af88ce671"}, ] [package.dependencies] @@ -760,14 +826,14 @@ testing = ["devpi-process (>=1.1.1)", "pytest (>=9.0.2)", "pytest-mock (>=3.15.1 [[package]] name = "types-pyyaml" -version = "6.0.12.20260815" +version = "6.0.12.20260906" description = "Typing stubs for PyYAML" optional = false python-versions = ">=3.10" groups = ["dev"] files = [ - {file = "types_pyyaml-6.0.12.20260815-py3-none-any.whl", hash = "sha256:6f332212b7e191f3afd5016a713c510b6340593b7ebec573c7d5d20aa5386d3b"}, - {file = "types_pyyaml-6.0.12.20260815.tar.gz", hash = "sha256:28764110c9cf35846e733da32d8d734df7473c5dde9ef67c3b7332ec0e819858"}, + {file = "types_pyyaml-6.0.12.20260906-py3-none-any.whl", hash = "sha256:bca893ff0d51df5c9053137d5d0e6ccd36e939a196356f1d5c16372422f5137b"}, + {file = "types_pyyaml-6.0.12.20260906.tar.gz", hash = "sha256:f59c1cc05010b833d2d72287bbaa72610106b28d42d89a907313117faba85212"}, ] [[package]] @@ -784,23 +850,23 @@ files = [ [[package]] name = "virtualenv" -version = "21.5.1" +version = "21.7.13" description = "Virtual Python Environment builder" optional = false python-versions = ">=3.9" groups = ["dev"] files = [ - {file = "virtualenv-21.5.1-py3-none-any.whl", hash = "sha256:55aa670b67bbfb991b03fda39bd3276d92c419d702376e98c5df1c9989a26783"}, - {file = "virtualenv-21.5.1.tar.gz", hash = "sha256:dca3bf98275a59c652b69d68e73433e597d977c2da9198882479d1a7188009c8"}, + {file = "virtualenv-21.7.13-py3-none-any.whl", hash = "sha256:1bea5af7463f59c4719db48fe739579a2a4f569c96f26c086edda85c96da9f59"}, + {file = "virtualenv-21.7.13.tar.gz", hash = "sha256:0355558b6f33619aab31347e43643b0ebc97f61ea3acf617b2b69e1f8a843d11"}, ] [package.dependencies] distlib = ">=0.3.7,<1" filelock = {version = ">=3.24.2,<4", markers = "python_version >= \"3.10\""} platformdirs = ">=3.9.1,<5" -python-discovery = ">=1.4.2" +python-discovery = ">=1.6" [metadata] lock-version = "2.1" -python-versions = ">=3.11,<3.15" -content-hash = "289466667e6732d99a4c97d293554faebc87ed1a8bf88b853e984713d93fab78" +python-versions = ">=3.11" +content-hash = "202896408cc529c760b2878348fcf34b40c6e38718db7948f52e5f6ebea0db7e" diff --git a/pyproject.toml b/pyproject.toml index 6ff41b5b..d36e462d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ dynamic = ["version"] description = "VS Code-native AI engineering workflow system for microservices, libraries, and backend systems." license = "MIT" readme = "README-pypi.md" -requires-python = ">=3.11,<3.15" +requires-python = ">=3.11" dependencies = ["pyyaml>=6.0.3"] keywords = [ "github-copilot", @@ -38,6 +38,7 @@ classifiers = [ "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", "Programming Language :: Python :: 3.14", + "Programming Language :: Python :: 3.15", "Environment :: Console", "Intended Audience :: Developers", "Topic :: Software Development :: Build Tools", @@ -79,11 +80,11 @@ poetry-dynamic-versioning = { version = ">=1.10.0,<2.0.0", extras = ["plugin"] } [tool.poetry.group.dev.dependencies] pytest = ">=9.1.1" pytest-cov = ">=7.1.0" -ruff = ">=0.16.4" -mypy = ">=2.3.1" +ruff = ">=0.16.10" +mypy = ">=2.4.0" pre-commit = ">=4.6.2" -tox = ">=4.60.0" -types-PyYAML = ">=6.0.12.20260815" +tox = ">=4.64.10" +types-PyYAML = ">=6.0.12.20260906" # --------------------------------------------------------------------------- @@ -179,7 +180,7 @@ extraPaths = ["scripts"] legacy_tox_ini = """ [tox] min_version = 4.54.0 -env_list = py311, py312, py313, py314, lint, type +env_list = py311, py312, py313, py314, py315, lint, type skip_missing_interpreters = true [testenv] diff --git a/src/vstack/_templates/project/.vstack/config.yaml b/src/vstack/_templates/project/.vstack/config.yaml index 048e3404..103b231a 100644 --- a/src/vstack/_templates/project/.vstack/config.yaml +++ b/src/vstack/_templates/project/.vstack/config.yaml @@ -25,7 +25,6 @@ # hooks: # - post-edit-markdown-quality # instructions: all -# prompts: all # ----------------------------------------------------------------------------- # REPOSITORY HOOKS diff --git a/src/vstack/_templates/prompts/api-design-review/config.yaml b/src/vstack/_templates/prompts/api-design-review/config.yaml deleted file mode 100644 index ffbccd7c..00000000 --- a/src/vstack/_templates/prompts/api-design-review/config.yaml +++ /dev/null @@ -1,8 +0,0 @@ -name: api-design-review -description: Review an API design or OpenAPI spec for correctness, completeness, and consistency. -argument-hint: "[OpenAPI spec file, design doc, or endpoint scope]" -agent: designer -tools: - - read - - search -version: 20260502006 diff --git a/src/vstack/_templates/prompts/api-design-review/template.md b/src/vstack/_templates/prompts/api-design-review/template.md deleted file mode 100644 index 29829807..00000000 --- a/src/vstack/_templates/prompts/api-design-review/template.md +++ /dev/null @@ -1,45 +0,0 @@ -Review the provided API design or OpenAPI specification for correctness, completeness, and consistency. - -Focus on consumer impact: breaking contracts, ambiguous semantics, missing errors, and inconsistent conventions. -Ignore implementation details and tooling preferences. - -Output exactly in this format: - -## Contract Issues - -List problems that would break or confuse consumers. - -For each item: - -- endpoint or field reference -- what the problem is in one sentence -- concrete fix - -## Naming and Consistency - -List naming violations, inconsistencies across endpoints, and deviations from REST conventions. - -## Missing Error Cases - -List expected error responses that are undocumented or missing status codes (400, 401, 403, 404, 409, 422, 500). - -## Schema Completeness - -List fields or objects that are missing required constraints, descriptions, or examples. - -## Versioning and Compatibility - -- versioning strategy present: yes | no | partial -- breaking changes relative to previous version: yes | no | unknown -- backward compatibility risk: low | medium | high - -## Security Scheme Check - -- authentication documented: yes | no -- authorization scopes documented where relevant: yes | no | partial -- sensitive fields handled appropriately: yes | no | partial - -## Verdict - -- approve | approve-with-conditions | reject -- top priority fix in one sentence diff --git a/src/vstack/_templates/prompts/architecture-risk/config.yaml b/src/vstack/_templates/prompts/architecture-risk/config.yaml deleted file mode 100644 index 93d486d0..00000000 --- a/src/vstack/_templates/prompts/architecture-risk/config.yaml +++ /dev/null @@ -1,8 +0,0 @@ -name: architecture-risk -description: Identify architectural risks, tradeoffs, and mitigation priorities for a proposed design. -argument-hint: "[design doc, ADR, or architecture scope]" -agent: architect -tools: - - read - - search -version: 20260502007 diff --git a/src/vstack/_templates/prompts/architecture-risk/template.md b/src/vstack/_templates/prompts/architecture-risk/template.md deleted file mode 100644 index d668c00c..00000000 --- a/src/vstack/_templates/prompts/architecture-risk/template.md +++ /dev/null @@ -1,42 +0,0 @@ -Evaluate the provided architecture for delivery and runtime risk. - -Prioritize issues that could cause outages, data loss, severe operability pain, or major rework. -Ignore stylistic preferences. - -Output exactly in this format: - -## High-Severity Risks - -List risks that can materially fail production or block safe delivery. - -For each risk: - -- impacted boundary (service, data, contract, deployment, observability, security) -- why it is risky in one sentence -- mitigation with smallest viable change -- owner role - -## Medium Risks - -List important but non-blocking risks. - -## Tradeoff Notes - -List major tradeoffs and what is being optimized. - -## Missing Decisions - -List decisions that should become ADRs before implementation. - -## Recommended Sequence - -Provide an ordered mitigation sequence (step 1..N). - -## Security Considerations - -List security-specific risks not covered above: auth boundaries, sensitive data exposure, trust model assumptions, supply chain concerns. - -## Go/No-Go - -- go | conditional-go | no-go -- one-sentence rationale diff --git a/src/vstack/_templates/prompts/artifact-integrity/config.yaml b/src/vstack/_templates/prompts/artifact-integrity/config.yaml deleted file mode 100644 index f646d0c3..00000000 --- a/src/vstack/_templates/prompts/artifact-integrity/config.yaml +++ /dev/null @@ -1,8 +0,0 @@ -name: artifact-integrity -description: Check source templates against generated artifacts and identify drift or missing regeneration. -argument-hint: "[artifact type, path, or full repo]" -agent: tester -tools: - - read - - search -version: 20260513002 diff --git a/src/vstack/_templates/prompts/artifact-integrity/template.md b/src/vstack/_templates/prompts/artifact-integrity/template.md deleted file mode 100644 index 0d9a00b1..00000000 --- a/src/vstack/_templates/prompts/artifact-integrity/template.md +++ /dev/null @@ -1,46 +0,0 @@ -Check source templates against generated artifacts and identify drift. - -Compare `src/vstack/_templates/` sources with installed artifacts in `.github/` -and the manifest at `.vstack/vstack.json`. Surface mismatches, stale output, or gaps. - -Output exactly in this format: - -## Drift Findings - -List all source-to-artifact mismatches. - -For each item: - -- source template: path under `src/vstack/_templates/` -- generated artifact: expected path under `.github/` -- drift type: MISSING | STALE | CHECKSUM-MISMATCH | UNTRACKED -- detail: one sentence describing the discrepancy - -## Regeneration Actions - -List exact commands needed to bring generated artifacts back into sync. - -For each action: - -- command: the shell command to run (e.g. `python3 -m vstack install`) -- scope: which artifact types or names this command covers -- priority: CRITICAL | HIGH | LOW - -## Risk If Unfixed - -Describe production risk if drift is left unresolved. - -For each drift item from above: - -- artifact affected -- risk: what could fail or mislead if the stale artifact ships - -## Verification Steps - -Provide a checklist to confirm the repository is clean after regeneration. - -- [ ] `python3 -m vstack install` completes without errors -- [ ] `vstack validate` reports no unresolved template tokens -- [ ] `make test-local` passes with 100% coverage -- [ ] `make markdown-format` reports no changes -- [ ] All regenerated files match their source checksums in `.vstack/vstack.json` diff --git a/src/vstack/_templates/prompts/ci-triage/config.yaml b/src/vstack/_templates/prompts/ci-triage/config.yaml deleted file mode 100644 index ce2ea6ce..00000000 --- a/src/vstack/_templates/prompts/ci-triage/config.yaml +++ /dev/null @@ -1,8 +0,0 @@ -name: ci-triage -description: Triage CI failures into root-cause clusters and prioritize the fastest safe recovery path. -argument-hint: "[workflow run, failing job, or log scope]" -agent: engineer -tools: - - read - - search -version: 20260513006 diff --git a/src/vstack/_templates/prompts/ci-triage/template.md b/src/vstack/_templates/prompts/ci-triage/template.md deleted file mode 100644 index fb2cdc61..00000000 --- a/src/vstack/_templates/prompts/ci-triage/template.md +++ /dev/null @@ -1,33 +0,0 @@ -Triage CI failures into root-cause clusters and prioritize the fastest safe recovery path. - -Use failing job logs, workflow config, and changed files. - -Output exactly in this format: - -## Failure Clusters - -For each cluster: - -- jobs affected -- probable root cause -- confidence: HIGH | MEDIUM | LOW - -## Priority Fix Order - -Ordered by unblock value. - -- fix action -- expected unblocked jobs -- owner role - -## Risk Notes - -- risky quick fixes to avoid -- possible hidden regressions - -## Recovery Checklist - -- [ ] apply highest-priority fix -- [ ] rerun targeted jobs -- [ ] rerun full workflow -- [ ] confirm no new failures diff --git a/src/vstack/_templates/prompts/dependency-audit/config.yaml b/src/vstack/_templates/prompts/dependency-audit/config.yaml deleted file mode 100644 index 571b4b49..00000000 --- a/src/vstack/_templates/prompts/dependency-audit/config.yaml +++ /dev/null @@ -1,8 +0,0 @@ -name: dependency-audit -description: Audit dependencies for vulnerabilities, outdated versions, licence risks, and supply chain hygiene. -argument-hint: "[dependency manifest, lockfile, or package scope]" -agent: tester -tools: - - read - - search -version: 20260502009 diff --git a/src/vstack/_templates/prompts/dependency-audit/template.md b/src/vstack/_templates/prompts/dependency-audit/template.md deleted file mode 100644 index 931b69f7..00000000 --- a/src/vstack/_templates/prompts/dependency-audit/template.md +++ /dev/null @@ -1,50 +0,0 @@ -Audit the provided dependency manifest or lockfile for vulnerabilities, outdated packages, licence risks, and supply chain hygiene. - -Prefer evidence from the manifest itself; flag items that need external verification. - -Output exactly in this format: - -## Vulnerabilities - -List dependencies with known CVEs or security advisories. - -For each item: - -- package name and version -- CVE or advisory reference if known -- severity: critical | high | medium | low -- recommended action (upgrade, replace, or accept with rationale) - -## Outdated Packages - -List dependencies significantly behind latest stable releases where risk is meaningful. -Do not list low-impact minor version differences. - -For each item: - -- package name: current version → latest stable -- risk of staying on current version in one sentence - -## Licence Risks - -List licences that may conflict with the project's distribution model. - -For each item: - -- package name -- licence identifier -- conflict or concern in one sentence - -## Pinning and Version Policy - -- all direct dependencies pinned: yes | no | partial -- unpinned transitive dependencies with risk: list or none -- version ranges that allow breaking upgrades: list or none - -## Supply Chain Hygiene - -List packages with unusual provenance concerns: abandoned maintainers, single-maintainer projects, recent ownership transfers, or typosquatting risk. - -## Recommended Actions - -Ordered action list by priority (critical first). diff --git a/src/vstack/_templates/prompts/incident-timeline/config.yaml b/src/vstack/_templates/prompts/incident-timeline/config.yaml deleted file mode 100644 index 196baa88..00000000 --- a/src/vstack/_templates/prompts/incident-timeline/config.yaml +++ /dev/null @@ -1,8 +0,0 @@ -name: incident-timeline -description: Build a structured, evidence-based incident timeline and action-oriented postmortem summary. -argument-hint: "[logs, alerts, timeline notes, or incident ID]" -agent: tester -tools: - - read - - search -version: 20260502010 diff --git a/src/vstack/_templates/prompts/incident-timeline/template.md b/src/vstack/_templates/prompts/incident-timeline/template.md deleted file mode 100644 index 9806de44..00000000 --- a/src/vstack/_templates/prompts/incident-timeline/template.md +++ /dev/null @@ -1,47 +0,0 @@ -Construct a blameless incident timeline from the provided evidence. - -Anchor claims to available logs, alerts, traces, and change events. -If evidence is missing, explicitly mark uncertainty. - -Output exactly in this format: - -## Incident Snapshot - -- incident title -- impact window -- affected systems/users -- current status - -## Timeline (UTC) - -List timestamped events in order. - -For each event: - -- time -- event description -- evidence source -- confidence: high | medium | low - -## Root Cause Analysis - -- primary cause -- contributing factors -- what made detection/recovery slower - -## What Worked / What Failed - -Two short lists. - -## Corrective Actions - -For each action: - -- action description -- owner role -- priority: P0 | P1 | P2 -- due expectation (short horizon) - -## Prevention Check - -List the minimum controls needed to reduce repeat probability. diff --git a/src/vstack/_templates/prompts/migration-safety/config.yaml b/src/vstack/_templates/prompts/migration-safety/config.yaml deleted file mode 100644 index 4a7df139..00000000 --- a/src/vstack/_templates/prompts/migration-safety/config.yaml +++ /dev/null @@ -1,9 +0,0 @@ -name: migration-safety -description: Review database migration safety, rollback strategy, and zero-downtime risk. -argument-hint: "[migration files, schema, or rollout plan]" -agent: engineer -tools: - - read - - search - - edit -version: 20260502011 diff --git a/src/vstack/_templates/prompts/migration-safety/template.md b/src/vstack/_templates/prompts/migration-safety/template.md deleted file mode 100644 index be7b06cf..00000000 --- a/src/vstack/_templates/prompts/migration-safety/template.md +++ /dev/null @@ -1,41 +0,0 @@ -Review the selected migration plan and code for production safety. - -Focus on forward compatibility, rollback feasibility, data integrity, and operational risk. -Assume a live system with concurrent reads and writes. - -Output exactly in this format: - -## Must Fix Before Apply - -List migration blockers. - -For each item: - -- file/section -- failure mode in one sentence -- concrete safe fix - -## Should Fix Soon - -List non-blocking risks with meaningful impact. - -## Rollback Plan Check - -- rollback feasible: yes | no | partial -- missing rollback prerequisites -- specific rollback procedure recommendation - -## Zero-Downtime Check - -- compatible with old and new app versions: yes | no | partial -- lock/contention risk: low | medium | high -- required phased rollout steps - -## Test Gaps - -List missing migration tests (forward, backward, data invariants, load-sensitive paths). - -## Final Recommendation - -- apply now | apply after fixes -- biggest remaining risk in one sentence diff --git a/src/vstack/_templates/prompts/ops-readiness/config.yaml b/src/vstack/_templates/prompts/ops-readiness/config.yaml deleted file mode 100644 index 063ab884..00000000 --- a/src/vstack/_templates/prompts/ops-readiness/config.yaml +++ /dev/null @@ -1,8 +0,0 @@ -name: ops-readiness -description: Assess operational readiness across observability, runbooks, failure handling, and supportability. -argument-hint: "[service, component, or release scope]" -agent: tester -tools: - - read - - search -version: 20260513009 diff --git a/src/vstack/_templates/prompts/ops-readiness/template.md b/src/vstack/_templates/prompts/ops-readiness/template.md deleted file mode 100644 index b21f5f97..00000000 --- a/src/vstack/_templates/prompts/ops-readiness/template.md +++ /dev/null @@ -1,32 +0,0 @@ -Assess operational readiness across observability, runbooks, failure handling, and supportability. - -Use evidence from code, tests, docs, and runbooks. - -Output exactly in this format: - -## Ops Readiness Scorecard - -- observability: READY | PARTIAL | MISSING -- alerting: READY | PARTIAL | MISSING -- runbooks: READY | PARTIAL | MISSING -- failure handling: READY | PARTIAL | MISSING - -## Gaps - -For each gap: - -- area -- finding -- risk if unresolved -- owner role - -## Must-Fix Before Release - -- blocker -- required evidence - -## Follow-up Actions - -- action -- owner role -- target milestone diff --git a/src/vstack/_templates/prompts/quick-review/config.yaml b/src/vstack/_templates/prompts/quick-review/config.yaml deleted file mode 100644 index 6ab53b9b..00000000 --- a/src/vstack/_templates/prompts/quick-review/config.yaml +++ /dev/null @@ -1,9 +0,0 @@ -name: quick-review -description: Review a change for bugs, regressions, and missing tests. -argument-hint: "[scope or files to review]" -agent: engineer -tools: - - read - - search - - edit -version: 20260502008 diff --git a/src/vstack/_templates/prompts/quick-review/template.md b/src/vstack/_templates/prompts/quick-review/template.md deleted file mode 100644 index c44a8fab..00000000 --- a/src/vstack/_templates/prompts/quick-review/template.md +++ /dev/null @@ -1,40 +0,0 @@ -Review the selected code or diff for production risk. - -Focus only on issues with real impact: - -- correctness and edge cases -- security and data exposure -- performance and scalability -- maintainability and ownership boundaries -- missing tests for changed behavior -- API contract changes: breaking changes, schema drift, missing versioning - -Ignore: - -- style-only preferences with no runtime impact -- speculative risks without evidence in this change - -Output exactly in this format: - -## Must fix - -List blocking issues that should be resolved before merge. - -## Should consider - -List non-blocking improvements worth addressing now. - -## Looks good - -List intentional strengths in this change. - -For each item: - -- cite the relevant file/section -- explain why it matters in one short sentence -- give one concrete fix suggestion - -End with: - -- Merge recommendation: yes / no / yes-with-conditions -- Biggest remaining risk: one sentence diff --git a/src/vstack/_templates/prompts/repo-assessment/config.yaml b/src/vstack/_templates/prompts/repo-assessment/config.yaml deleted file mode 100644 index 8b20b9ec..00000000 --- a/src/vstack/_templates/prompts/repo-assessment/config.yaml +++ /dev/null @@ -1,8 +0,0 @@ -name: repo-assessment -description: Assess a repository for production-readiness gaps and prioritized improvements. -argument-hint: "[repository scope or component path]" -agent: engineer -tools: - - read - - search -version: 20260513001 diff --git a/src/vstack/_templates/prompts/repo-assessment/template.md b/src/vstack/_templates/prompts/repo-assessment/template.md deleted file mode 100644 index 9ae04ed9..00000000 --- a/src/vstack/_templates/prompts/repo-assessment/template.md +++ /dev/null @@ -1,44 +0,0 @@ -Assess this repository for production-readiness gaps and prioritized improvements. - -Base findings on evidence in source files, tests, CI config, docs, and manifests. -Prefer concrete findings over speculation. - -Output exactly in this format: - -## Critical Risks - -List only issues that block safe production operation right now. - -For each item: - -- location: file or component reference -- risk: one sentence describing the production impact -- remediation: concrete action with owner role - -## High-ROI Improvements - -List high-value improvements that reduce operational risk or developer friction, ranked by impact versus effort. - -For each item: - -- area: the domain (security | reliability | observability | dx | performance | maintainability) -- finding: what is missing or suboptimal -- suggested action: one clear improvement step - -## Testing and Verification Gaps - -List untested behavioral paths or areas where coverage may give false confidence. - -For each item: - -- uncovered behavior: what scenario is missing -- risk if untested: what could go wrong in production -- suggested test type: unit | integration | contract | e2e - -## Suggested Next Sprint Backlog - -Provide a short, actionable next-sprint task list ordered from highest to lowest priority. - -- task title -- owner role (product | architect | designer | engineer | tester | release) -- one-line rationale diff --git a/src/vstack/_templates/prompts/template-impact/config.yaml b/src/vstack/_templates/prompts/template-impact/config.yaml deleted file mode 100644 index 31a3be63..00000000 --- a/src/vstack/_templates/prompts/template-impact/config.yaml +++ /dev/null @@ -1,8 +0,0 @@ -name: template-impact -description: Assess impact of a template change on generated artifacts, tests, and release risk. -argument-hint: "[template path or change scope]" -agent: engineer -tools: - - read - - search -version: 20260513005 diff --git a/src/vstack/_templates/prompts/template-impact/template.md b/src/vstack/_templates/prompts/template-impact/template.md deleted file mode 100644 index bb61e8a0..00000000 --- a/src/vstack/_templates/prompts/template-impact/template.md +++ /dev/null @@ -1,33 +0,0 @@ -Assess impact of a template change on generated artifacts, tests, and release risk. - -Use source-template and generated-artifact evidence. - -Output exactly in this format: - -## Change Surface - -- template scope -- affected artifact types -- likely generated paths - -## Impact Findings - -For each finding: - -- impacted path -- impact type: BEHAVIOR | DOCS | TESTS | TOOLING -- risk -- required validation - -## Regression Risk - -List highest-risk regressions first. - -- scenario -- likelihood: HIGH | MEDIUM | LOW -- mitigation - -## Verification Plan - -- commands to run -- expected pass criteria diff --git a/src/vstack/_templates/prompts/test-gaps/config.yaml b/src/vstack/_templates/prompts/test-gaps/config.yaml deleted file mode 100644 index 92c6bb1c..00000000 --- a/src/vstack/_templates/prompts/test-gaps/config.yaml +++ /dev/null @@ -1,8 +0,0 @@ -name: test-gaps -description: Identify missing behavioral coverage and prioritize test additions by production risk. -argument-hint: "[component, feature, or repository scope]" -agent: tester -tools: - - read - - search -version: 20260513007 diff --git a/src/vstack/_templates/prompts/test-gaps/template.md b/src/vstack/_templates/prompts/test-gaps/template.md deleted file mode 100644 index 7ec9afa6..00000000 --- a/src/vstack/_templates/prompts/test-gaps/template.md +++ /dev/null @@ -1,30 +0,0 @@ -Identify missing behavioral coverage and prioritize test additions by production risk. - -Focus on observable behavior and realistic failure paths. - -Output exactly in this format: - -## Coverage Gaps - -For each gap: - -- behavior -- current coverage weakness -- production risk -- suggested test type: unit | integration | contract | e2e - -## False Confidence Risks - -List tests that pass but may not protect real behavior. - -- location -- why confidence is false -- correction - -## Priority Test Backlog - -Ordered from highest to lowest risk reduction. - -- test title -- owner role -- acceptance check diff --git a/src/vstack/_templates/skills/advise/config.yaml b/src/vstack/_templates/skills/advise/config.yaml index 1ecdc604..10d0ab50 100644 --- a/src/vstack/_templates/skills/advise/config.yaml +++ b/src/vstack/_templates/skills/advise/config.yaml @@ -14,4 +14,4 @@ when_to_use: - Assessing risk or feasibility claims - Stress-testing an approach for hidden failures - Making high-consequence trade-off decisions -version: '20260626001' +version: '20261017001' diff --git a/src/vstack/_templates/skills/advise/template.md b/src/vstack/_templates/skills/advise/template.md index cf5951e0..7a4add70 100644 --- a/src/vstack/_templates/skills/advise/template.md +++ b/src/vstack/_templates/skills/advise/template.md @@ -59,4 +59,4 @@ Always consider: --- -**Related:** See `prompt/reasoning` for the underlying reasoning framework. +**Related:** See `skill/reasoning` for the underlying reasoning framework. diff --git a/src/vstack/_templates/prompts/migration-plan/config.yaml b/src/vstack/_templates/skills/migration-plan/config.yaml similarity index 64% rename from src/vstack/_templates/prompts/migration-plan/config.yaml rename to src/vstack/_templates/skills/migration-plan/config.yaml index f95ad7d6..594ad841 100644 --- a/src/vstack/_templates/prompts/migration-plan/config.yaml +++ b/src/vstack/_templates/skills/migration-plan/config.yaml @@ -1,8 +1,7 @@ name: migration-plan description: Produce a safe migration plan with sequencing, fallback paths, and verification checkpoints. argument-hint: "[migration scope or affected components]" -agent: engineer -tools: - - read - - search -version: 20260513010 +allowed-tools: 'read search' +user-invocable: true +disable-model-invocation: true +version: 20261017001 diff --git a/src/vstack/_templates/prompts/migration-plan/template.md b/src/vstack/_templates/skills/migration-plan/template.md similarity index 80% rename from src/vstack/_templates/prompts/migration-plan/template.md rename to src/vstack/_templates/skills/migration-plan/template.md index 081bfc00..9e066302 100644 --- a/src/vstack/_templates/prompts/migration-plan/template.md +++ b/src/vstack/_templates/skills/migration-plan/template.md @@ -1,4 +1,9 @@ +{{SKILL_CONTEXT}} + +# migration-plan - Cross-Component Migration Planning + Produce a safe migration plan with sequencing, fallback paths, and verification checkpoints. +Plan only; do not apply migrations or change files. Use source changes, schema/contracts, and deployment constraints. diff --git a/src/vstack/_templates/prompts/reasoning/config.yaml b/src/vstack/_templates/skills/reasoning/config.yaml similarity index 54% rename from src/vstack/_templates/prompts/reasoning/config.yaml rename to src/vstack/_templates/skills/reasoning/config.yaml index 280751cf..ab0a7094 100644 --- a/src/vstack/_templates/prompts/reasoning/config.yaml +++ b/src/vstack/_templates/skills/reasoning/config.yaml @@ -2,11 +2,8 @@ name: reasoning description: | Evidence-based reasoning framework for one-shot evaluation tasks. Use when you need to apply critical thinking to a specific decision, proposal, or evaluation. -category: review -keywords: - - critical thinking - - evidence-based reasoning - - adversarial thinking - - evaluation framework -reusable: true -version: '20260626001' +allowed-tools: 'read search' +argument-hint: '[decision, proposal, or evaluation]' +user-invocable: true +disable-model-invocation: true +version: 20261017001 diff --git a/src/vstack/_templates/prompts/reasoning/template.md b/src/vstack/_templates/skills/reasoning/template.md similarity index 95% rename from src/vstack/_templates/prompts/reasoning/template.md rename to src/vstack/_templates/skills/reasoning/template.md index cea84c75..70e00b0d 100644 --- a/src/vstack/_templates/prompts/reasoning/template.md +++ b/src/vstack/_templates/skills/reasoning/template.md @@ -1,6 +1,8 @@ +{{SKILL_CONTEXT}} + # Evidence-Based Reasoning Framework -Use this prompt when you need to apply critical thinking to a specific decision, proposal, idea, or evaluation. +Use this skill when you need to apply critical thinking to a specific decision, proposal, idea, or evaluation. ## Core Mindset diff --git a/src/vstack/_templates/prompts/release-check/config.yaml b/src/vstack/_templates/skills/release-check/config.yaml similarity index 62% rename from src/vstack/_templates/prompts/release-check/config.yaml rename to src/vstack/_templates/skills/release-check/config.yaml index 2647d972..5d78c0aa 100644 --- a/src/vstack/_templates/prompts/release-check/config.yaml +++ b/src/vstack/_templates/skills/release-check/config.yaml @@ -1,8 +1,7 @@ name: release-check description: Evaluate release gate readiness using required reports, artifacts, and sign-off evidence. argument-hint: "[release scope or target branch]" -agent: release -tools: - - read - - search -version: 20260513004 +allowed-tools: 'read search' +user-invocable: true +disable-model-invocation: true +version: 20261017001 diff --git a/src/vstack/_templates/prompts/release-check/template.md b/src/vstack/_templates/skills/release-check/template.md similarity index 81% rename from src/vstack/_templates/prompts/release-check/template.md rename to src/vstack/_templates/skills/release-check/template.md index f75a94a1..4b014605 100644 --- a/src/vstack/_templates/prompts/release-check/template.md +++ b/src/vstack/_templates/skills/release-check/template.md @@ -1,4 +1,9 @@ +{{SKILL_CONTEXT}} + +# release-check - Release Evidence Audit + Evaluate release gate readiness using required reports, artifacts, and sign-off evidence. +Report only; do not create a release, tag, pull request, or sign-off. Use repository evidence only. diff --git a/src/vstack/_templates/prompts/upgrade-plan/config.yaml b/src/vstack/_templates/skills/upgrade-plan/config.yaml similarity index 63% rename from src/vstack/_templates/prompts/upgrade-plan/config.yaml rename to src/vstack/_templates/skills/upgrade-plan/config.yaml index da7302dd..625447c4 100644 --- a/src/vstack/_templates/prompts/upgrade-plan/config.yaml +++ b/src/vstack/_templates/skills/upgrade-plan/config.yaml @@ -1,8 +1,7 @@ name: upgrade-plan description: Build a safe upgrade plan with sequencing, compatibility checks, and rollback points. argument-hint: "[target version, component, or full repo]" -agent: tester -tools: - - read - - search -version: 20260513008 +allowed-tools: 'read search' +user-invocable: true +disable-model-invocation: true +version: 20261017001 diff --git a/src/vstack/_templates/prompts/upgrade-plan/template.md b/src/vstack/_templates/skills/upgrade-plan/template.md similarity index 79% rename from src/vstack/_templates/prompts/upgrade-plan/template.md rename to src/vstack/_templates/skills/upgrade-plan/template.md index e2ff2f06..42faba8e 100644 --- a/src/vstack/_templates/prompts/upgrade-plan/template.md +++ b/src/vstack/_templates/skills/upgrade-plan/template.md @@ -1,4 +1,9 @@ +{{SKILL_CONTEXT}} + +# upgrade-plan - Upgrade Planning + Build a safe upgrade plan with sequencing, compatibility checks, and rollback points. +Plan only; do not install packages, apply upgrades, or change files. Use repository docs, manifests, and test constraints. diff --git a/src/vstack/_templates/prompts/workflow-check/config.yaml b/src/vstack/_templates/skills/workflow-check/config.yaml similarity index 62% rename from src/vstack/_templates/prompts/workflow-check/config.yaml rename to src/vstack/_templates/skills/workflow-check/config.yaml index 0a56dfb6..a5fd77ef 100644 --- a/src/vstack/_templates/prompts/workflow-check/config.yaml +++ b/src/vstack/_templates/skills/workflow-check/config.yaml @@ -1,8 +1,7 @@ name: workflow-check description: Review workflow stage flow, gate usage, and handoff integrity across role artifacts. argument-hint: "[workflow scope or stage list]" -agent: planner -tools: - - read - - search -version: 20260513003 +allowed-tools: 'read search' +user-invocable: true +disable-model-invocation: true +version: 20261017002 diff --git a/src/vstack/_templates/prompts/workflow-check/template.md b/src/vstack/_templates/skills/workflow-check/template.md similarity index 61% rename from src/vstack/_templates/prompts/workflow-check/template.md rename to src/vstack/_templates/skills/workflow-check/template.md index 151a770e..5caf0401 100644 --- a/src/vstack/_templates/prompts/workflow-check/template.md +++ b/src/vstack/_templates/skills/workflow-check/template.md @@ -1,6 +1,13 @@ +{{SKILL_CONTEXT}} + +# workflow-check - Workflow Contract Audit + Review workflow stage flow, gate usage, and handoff integrity across role artifacts. +Report only; do not change workflow configuration or role artifacts. -Focus on evidence in workflow config, role templates, and docs. +Focus on the current project's workflow configuration, installed agent files, +role documents, and handoff definitions. These are consumer-project artifacts; +the vstack source repository and its template directories are not required. Output exactly in this format: diff --git a/src/vstack/artifacts/__init__.py b/src/vstack/artifacts/__init__.py index 3decf7a4..0dcb2909 100644 --- a/src/vstack/artifacts/__init__.py +++ b/src/vstack/artifacts/__init__.py @@ -1,7 +1,6 @@ -"""vstack.artifacts — shared prompt-artifact models, generator, and protocol.""" +"""Shared artifact models, generator, and protocol.""" from vstack.artifacts.config import INSTRUCTION_SCHEMA as INSTRUCTION_SCHEMA -from vstack.artifacts.config import PROMPT_SCHEMA as PROMPT_SCHEMA from vstack.artifacts.config import ArtifactTypeConfig as ArtifactTypeConfig from vstack.artifacts.generator import ( GenericArtifactGenerator as GenericArtifactGenerator, diff --git a/src/vstack/artifacts/config.py b/src/vstack/artifacts/config.py index 9474c665..e62a77d8 100644 --- a/src/vstack/artifacts/config.py +++ b/src/vstack/artifacts/config.py @@ -2,10 +2,10 @@ This module provides: -* :class:`ArtifactTypeConfig` — fully describes one family of prompt artifacts: +* :class:`ArtifactTypeConfig` — fully describes one family of artifacts: where to find source templates, how to derive output paths, which frontmatter schema applies, and what to verify. -* Shared schemas for **prompts** and **instructions**. +* The shared schema for **instructions**. Frontmatter field types (:class:`~vstack.frontmatter.FieldSpec`, :class:`~vstack.frontmatter.FrontmatterSchema`, :data:`~vstack.frontmatter.FieldType`) @@ -28,7 +28,7 @@ @dataclass class ArtifactTypeConfig: - """Describes a family of prompt artifacts and how to process them. + """Describe an artifact family and how to process it. Attributes: type_name: Singular identifier used in log output and internal lookups @@ -89,18 +89,6 @@ def __post_init__(self) -> None: # ── Frontmatter schemas ─────────────────────────────────────────────────────── -#: Fields recognised in VS Code prompt files (``.prompt.md``). -PROMPT_SCHEMA = FrontmatterSchema( - [ - FieldSpec("description"), - FieldSpec("name", quoted=False), - FieldSpec("argument-hint"), - FieldSpec("agent", quoted=False), - FieldSpec("model", quoted=False), - FieldSpec("tools", type="list"), - ] -) - #: Fields recognised in VS Code instruction files (``.instructions.md``). INSTRUCTION_SCHEMA = FrontmatterSchema( [ diff --git a/src/vstack/artifacts/models.py b/src/vstack/artifacts/models.py index f5fc7539..b6543575 100644 --- a/src/vstack/artifacts/models.py +++ b/src/vstack/artifacts/models.py @@ -1,10 +1,4 @@ -"""Shared data models for prompt artifacts. - -A *prompt artifact* is any Markdown file produced by vstack: a skill file, -an agent file, a prompt file, or an instructions file. Some artifact types -always carry YAML front matter (``*.agent.md``, ``SKILL.md``); others do not -(``AGENTS.md``, ``copilot-instructions.md`` — not yet in scope). -""" +"""Shared models for generated skills, agents, instructions, and hooks.""" from __future__ import annotations @@ -16,7 +10,7 @@ @dataclass class RenderedArtifact: - """A single rendered prompt artifact, ready to write to disk. + """Represent a rendered artifact ready to write to disk. Attributes: name: Logical identifier (directory name or stem without suffix). diff --git a/src/vstack/cli/catalog.py b/src/vstack/cli/catalog.py index cd2f84dc..d929304c 100644 --- a/src/vstack/cli/catalog.py +++ b/src/vstack/cli/catalog.py @@ -76,7 +76,7 @@ class ManifestSubcommandConfig: include_scope_group=True, include_only_option=True, scope_help="Verify output in /.github/", - only_help="Verify only these artifact types, e.g. --only agent prompt", + only_help="Verify only these artifact types, e.g. --only agent skill", ), "status": TopLevelCommandConfig( command_factory=StatusCommand, @@ -163,6 +163,6 @@ class ManifestSubcommandConfig: help_text="Verify installed output against manifest ownership and checksums", scope_help="Verify output in /.github/", include_only_option=True, - only_help="Verify only these artifact types, e.g. --only agent prompt", + only_help="Verify only these artifact types, e.g. --only agent skill", ), } diff --git a/src/vstack/cli/constants.py b/src/vstack/cli/constants.py index 63064a39..d272bf32 100644 --- a/src/vstack/cli/constants.py +++ b/src/vstack/cli/constants.py @@ -5,7 +5,6 @@ from vstack.agents.config import AGENT_TYPE from vstack.hooks.config import HOOK_TYPE from vstack.instructions.config import INSTRUCTION_TYPE -from vstack.prompts.config import PROMPT_TYPE from vstack.skills.config import SKILL_TYPE EXPECTED_CANONICAL_NAMES = [ @@ -41,6 +40,7 @@ "k8s", "lazy", "migrate", + "migration-plan", "onboard", "openapi", "performance", @@ -48,7 +48,9 @@ "pr", "rancher", "rca", + "reasoning", "refactor", + "release-check", "release-notes", "requirements", "secret-scan", @@ -58,8 +60,10 @@ "terraform", "terragrunt", "threat-model", + "upgrade-plan", "verify", "vision", + "workflow-check", ] @@ -76,13 +80,12 @@ class Colors: RESET = "\033[0m" -KNOWN_TYPES = [SKILL_TYPE, AGENT_TYPE, HOOK_TYPE, INSTRUCTION_TYPE, PROMPT_TYPE] +KNOWN_TYPES = [SKILL_TYPE, AGENT_TYPE, HOOK_TYPE, INSTRUCTION_TYPE] KNOWN_TYPE_NAMES = [type_config.type_name for type_config in KNOWN_TYPES] GLOBAL_SUPPORTED_TYPE_NAMES = [ AGENT_TYPE.type_name, HOOK_TYPE.type_name, INSTRUCTION_TYPE.type_name, - PROMPT_TYPE.type_name, SKILL_TYPE.type_name, ] @@ -126,23 +129,25 @@ class ArtifactState: "pre-tool-safety-gate", "session-audit", ], - "prompt": [ - "api-design-review", - "architecture-risk", - "artifact-integrity", - "ci-triage", - "dependency-audit", - "incident-timeline", - "migration-plan", - "migration-safety", - "ops-readiness", - "quick-review", - "reasoning", - "release-check", - "repo-assessment", - "template-impact", - "test-gaps", - "upgrade-plan", - "workflow-check", - ], +} + +# Legacy names are retained only to migrate manifest-tracked prompt files. +RETIRED_PROMPT_SKILLS: dict[str, str] = { + "api-design-review": "openapi", + "architecture-risk": "architecture", + "artifact-integrity": "inspect", + "ci-triage": "debug", + "dependency-audit": "dependency", + "incident-timeline": "postmortem", + "migration-plan": "migration-plan", + "migration-safety": "migrate", + "ops-readiness": "inspect", + "quick-review": "code-review", + "reasoning": "reasoning", + "release-check": "release-check", + "repo-assessment": "inspect", + "template-impact": "analyse", + "test-gaps": "inspect", + "upgrade-plan": "upgrade-plan", + "workflow-check": "workflow-check", } diff --git a/src/vstack/cli/init.py b/src/vstack/cli/init.py index b41d5355..544bf3fe 100644 --- a/src/vstack/cli/init.py +++ b/src/vstack/cli/init.py @@ -7,8 +7,9 @@ from pathlib import Path from typing import TYPE_CHECKING +from vstack.artifacts.generator import GenericArtifactGenerator from vstack.cli.base import BaseCommand, CommandContext -from vstack.cli.constants import Colors +from vstack.cli.constants import RETIRED_PROMPT_SKILLS, Colors from vstack.constants import VERSION from vstack.manifest import ( CURRENT_HASH_ALGORITHM, @@ -401,7 +402,7 @@ def _can_prune_obsolete_entry(*, install_dir: Path, entry) -> tuple[bool, str]: checksum_algorithm = (entry.checksum_algorithm or CURRENT_HASH_ALGORITHM).lower() try: current = hash_with_algorithm(out_file.read_text(encoding="utf-8"), checksum_algorithm) - except OSError: + except (OSError, UnicodeError): return False, "file is unreadable" except ValueError: return False, "unknown checksum algorithm" @@ -470,14 +471,14 @@ def _process_obsolete_entry( return "preserve", True reason_suffix = "" if reason == "" else f" — {reason}" - print( - f" {prefix}{colors.CYAN}−{colors.RESET} {rel}" - f" {colors.DIM}removed obsolete tracked artifact ({selector}){reason_suffix}{colors.RESET}" - ) InitCommand._remove_file_if_present( out_file=install_dir / entry.file, dry_run=dry_run, ) + print( + f" {prefix}{colors.CYAN}−{colors.RESET} {rel}" + f" {colors.DIM}removed obsolete tracked artifact ({selector}){reason_suffix}{colors.RESET}" + ) return "prune", False @staticmethod @@ -497,10 +498,11 @@ def _print_summary( adopted = action_counts.get("adopt", 0) obsolete = action_counts.get("obsolete", 0) pruned = action_counts.get("prune", 0) + retired = action_counts.get("retire", 0) install_label = "installed" summary_title = "Summary (dry-run)" if dry_run else "Summary" - total = installed + updated + preserved + skipped + adopted + obsolete + total = installed + updated + preserved + skipped + adopted + obsolete + retired print() print(f" {colors.BOLD}{summary_title}{colors.RESET}") @@ -512,6 +514,8 @@ def _print_summary( print(f" adopted : {colors.BOLD}{adopted}{colors.RESET}") print(f" obsolete : {colors.BOLD}{obsolete}{colors.RESET}") print(f" pruned : {colors.BOLD}{pruned}{colors.RESET}") + if retired: + print(f" retired prompts : {colors.BOLD}{retired}{colors.RESET}") if obsolete and not prune: print() @@ -536,6 +540,10 @@ def _print_summary( if preserved_selectors: for selector in sorted(preserved_selectors): print(f" - {selector}") + if any(selector.startswith("prompt/") for selector in preserved_selectors): + print(" Retired prompts require manual review; --force does not remove them.") + if all(selector.startswith("prompt/") for selector in preserved_selectors): + return print(" Next steps:") print(f" {colors.DIM}--force{colors.RESET} overwrite all") print( @@ -547,6 +555,84 @@ def _print_summary( "take ownership without overwriting" ) + @staticmethod + def _migrate_retired_prompts( + *, + install_dir: Path, + existing_manifest: Manifest | None, + new_entries: dict[str, list[ArtifactEntry]], + available_skills: set[str], + dry_run: bool, + action_counts: dict[str, int], + preserved_selectors: set[str], + colors, + prefix: str, + ) -> bool: + """Retire known prompts only after their replacement skills are available. + + Unsafe or locally modified files remain tracked so a later install can + retry. Return false if a deletion fails. Neither force options nor legacy + metadata bypass checksum checks. + """ + if existing_manifest is None: + return True + all_ok = True + new_entries.pop("prompts", None) + for entry in existing_manifest.entries_for("prompts"): + replacement = RETIRED_PROMPT_SKILLS.get(entry.name) + out_file = install_dir / entry.file + reason = None + if replacement is None: + reason = "unknown retired prompt; convert this custom workflow manually" + elif entry.file != f"prompts/{entry.name}.prompt.md": + reason = "noncanonical legacy prompt path" + elif out_file.is_symlink() or out_file.parent.is_symlink(): + reason = "symlinked legacy prompt path" + elif replacement not in available_skills: + reason = f"replacement skill/{replacement} is unavailable, excluded, or preserved" + + if reason is not None: + print( + f" {prefix}{colors.YELLOW}↷{colors.RESET} {entry.file}" + f" retired prompt preserved — {reason}" + ) + Manifest.preserve_existing_entry( + new_entries=new_entries, + manifest_key="prompts", + existing_entry=entry, + ) + action = "preserve" + preserved = True + else: + print(f" {prefix}Migrating prompt/{entry.name} → skill/{replacement}") + try: + action, preserved = InitCommand._process_obsolete_entry( + install_dir=install_dir, + manifest_key="prompts", + type_name="prompt", + entry=entry, + prune=True, + dry_run=dry_run, + colors=colors, + prefix=prefix, + new_entries=new_entries, + ) + except OSError as exc: + print(f"ERROR: could not retire prompt/{entry.name}: {exc}", file=sys.stderr) + Manifest.preserve_existing_entry( + new_entries=new_entries, + manifest_key="prompts", + existing_entry=entry, + ) + action, preserved = "preserve", True + all_ok = False + if action == "prune": + action = "retire" + action_counts[action] = action_counts.get(action, 0) + 1 + if preserved: + preserved_selectors.add(f"prompt/{entry.name}") + return all_ok + @staticmethod def _warn_unknown_workflow_roles( *, @@ -698,6 +784,7 @@ def execute( all_ok = True action_counts: dict[str, int] = {} preserved_selectors: set[str] = set() + available_skills: set[str] = set() for gen in gens: out_dir = install_dir / gen.config.output_subdir @@ -731,6 +818,18 @@ def execute( action_counts[artifact_action] = action_counts.get(artifact_action, 0) + 1 if artifact_action == "preserve": preserved_selectors.add(f"{gen.config.type_name}/{artifact.name}") + elif ( + gen.config.type_name == "skill" + and artifact_action in {"install", "update", "skip"} + and not artifact.unresolved + ): + installed_content = ( + (out_dir / gen.output_path(artifact.name)).read_text(encoding="utf-8") + if artifact_action == "skip" + else artifact.content + ) + if not GenericArtifactGenerator.find_unresolved(installed_content): + available_skills.add(artifact.name) InitCommand._prune_planner_when_manual_mode( install_dir=install_dir, @@ -776,6 +875,19 @@ def execute( if was_preserved: preserved_selectors.add(f"{type_name}/{entry.name}") + if all_ok and any(gen.config.type_name == "skill" for gen in gens): + all_ok = InitCommand._migrate_retired_prompts( + install_dir=install_dir, + existing_manifest=existing_manifest, + new_entries=new_entries, + available_skills=available_skills, + dry_run=dry_run, + action_counts=action_counts, + preserved_selectors=preserved_selectors, + colors=colors, + prefix=prefix, + ) + InitCommand._print_summary( colors=colors, action_counts=action_counts, diff --git a/src/vstack/cli/interface.py b/src/vstack/cli/interface.py index c2e25630..25e29469 100644 --- a/src/vstack/cli/interface.py +++ b/src/vstack/cli/interface.py @@ -20,7 +20,6 @@ "agents": "agent", "hooks": "hook", "instructions": "instruction", - "prompts": "prompt", "skills": "skill", } @@ -128,6 +127,12 @@ def _read_exclude( excluded_types: set[str] = set() excluded_names: dict[str, list[str]] = {} for config_key, value in raw_exclude.items(): + if config_key == "prompts": + print( + "WARNING: exclude.prompts is retired; configure replacement skill exclusions instead.", + file=sys.stderr, + ) + continue type_name = _CONFIG_TYPE_ALIAS.get(config_key) if type_name is None: continue # unknown key, ignore gracefully diff --git a/src/vstack/cli/parser.py b/src/vstack/cli/parser.py index a035fab1..3a3fbd41 100644 --- a/src/vstack/cli/parser.py +++ b/src/vstack/cli/parser.py @@ -29,6 +29,15 @@ def add_parser(self, name: str, **kwargs: Any) -> argparse.ArgumentParser: class CommandLineParser: """Create the vstack command-line parser and resolve install targets.""" + @staticmethod + def _artifact_selector(value: str) -> str: + """Reject retired prompt selectors with an actionable migration message.""" + if value.strip().startswith("prompt/"): + raise argparse.ArgumentTypeError( + "prompt artifacts are retired; use the replacement skill/ selector" + ) + return value + @staticmethod def _add_scope_group(parser: argparse.ArgumentParser, *, help_text: str) -> None: """Add mutually-exclusive target scope flags to a parser.""" @@ -38,7 +47,7 @@ def _add_scope_group(parser: argparse.ArgumentParser, *, help_text: str) -> None "--global", dest="use_global", action="store_true", - help="VS Code user profile (agents/prompts/instructions/skills)", + help="VS Code user profile (agents/instructions/skills)", ) @staticmethod @@ -177,6 +186,7 @@ def _add_install_command(self, sub: SubparserFactory) -> None: "--force-name", dest="force_names", action="append", + type=self._artifact_selector, metavar="", help=( "Force install one named artifact without overwriting everything. " @@ -188,6 +198,7 @@ def _add_install_command(self, sub: SubparserFactory) -> None: parser.add_argument( "--adopt-name", action="append", + type=self._artifact_selector, default=None, metavar="", help=( @@ -225,6 +236,7 @@ def _add_init_command(self, sub: SubparserFactory) -> None: "--force-name", dest="force_names", action="append", + type=self._artifact_selector, metavar="", help=( "Force regenerate one named artifact without overwriting everything. " @@ -235,6 +247,7 @@ def _add_init_command(self, sub: SubparserFactory) -> None: parser.add_argument( "--adopt-name", action="append", + type=self._artifact_selector, default=None, metavar="", help=( @@ -275,6 +288,7 @@ def _add_uninstall_command(self, sub: SubparserFactory) -> None: "--force-name", dest="force_names", action="append", + type=self._artifact_selector, metavar="", help="Force uninstall one named artifact without removing every modified file", ) diff --git a/src/vstack/prompts/__init__.py b/src/vstack/prompts/__init__.py deleted file mode 100644 index 95c77f16..00000000 --- a/src/vstack/prompts/__init__.py +++ /dev/null @@ -1,5 +0,0 @@ -"""Package initialization for vstack.prompts.""" - -from vstack.prompts.generator import PromptGenerator - -__all__ = ["PromptGenerator"] diff --git a/src/vstack/prompts/config.py b/src/vstack/prompts/config.py deleted file mode 100644 index ab9fd3d1..00000000 --- a/src/vstack/prompts/config.py +++ /dev/null @@ -1,21 +0,0 @@ -"""Prompt artifact type configuration.""" - -from vstack.artifacts.config import PROMPT_SCHEMA, ArtifactTypeConfig -from vstack.prompts.constants import ( - PROMPT_OUTPUT_SUBDIR, - PROMPT_OUTPUT_SUFFIX, - PROMPT_TEMPLATES_SUBDIR, -) - -PROMPT_TYPE = ArtifactTypeConfig( - type_name="prompt", - templates_dir=PROMPT_TEMPLATES_SUBDIR, - output_subdir=PROMPT_OUTPUT_SUBDIR, - output_pattern=f"{{name}}{PROMPT_OUTPUT_SUFFIX}", - add_frontmatter=True, - artifact_is_dir=False, - partials_subdir=None, - auto_gen_footer=True, - fail_on_unresolved=False, - frontmatter_schema=PROMPT_SCHEMA, -) diff --git a/src/vstack/prompts/constants.py b/src/vstack/prompts/constants.py deleted file mode 100644 index 14d2c9d7..00000000 --- a/src/vstack/prompts/constants.py +++ /dev/null @@ -1,9 +0,0 @@ -"""Constants for prompt template and output locations.""" - -from vstack.constants import TEMPLATES_ROOT - -PROMPT_OUTPUT_SUFFIX = ".prompt.md" -PROMPT_TEMPLATES_SUBDIR = "prompts" -PROMPT_OUTPUT_SUBDIR = "prompts" - -PROMPT_TEMPLATES_DIR = TEMPLATES_ROOT / PROMPT_TEMPLATES_SUBDIR diff --git a/src/vstack/prompts/generator.py b/src/vstack/prompts/generator.py deleted file mode 100644 index 59f594be..00000000 --- a/src/vstack/prompts/generator.py +++ /dev/null @@ -1,13 +0,0 @@ -"""Thin prompt generator wrapper over ``GenericArtifactGenerator``.""" - -from vstack.artifacts.generator import GenericArtifactGenerator -from vstack.constants import TEMPLATES_ROOT -from vstack.prompts.config import PROMPT_TYPE - - -class PromptGenerator(GenericArtifactGenerator): - """Generate prompt artifacts using the built-in prompt configuration.""" - - def __init__(self) -> None: - """Create a prompt generator bound to the built-in template root.""" - super().__init__(PROMPT_TYPE, TEMPLATES_ROOT) diff --git a/tests/_fixtures/golden/prompts/api-design-review.prompt.md b/tests/_fixtures/golden/prompts/api-design-review.prompt.md deleted file mode 100644 index a909b91f..00000000 --- a/tests/_fixtures/golden/prompts/api-design-review.prompt.md +++ /dev/null @@ -1,57 +0,0 @@ ---- -description: 'Review an API design or OpenAPI spec for correctness, completeness, and consistency.' -name: api-design-review -argument-hint: '[OpenAPI spec file, design doc, or endpoint scope]' -agent: designer -tools: - - read - - search ---- -Review the provided API design or OpenAPI specification for correctness, completeness, and consistency. - -Focus on consumer impact: breaking contracts, ambiguous semantics, missing errors, and inconsistent conventions. -Ignore implementation details and tooling preferences. - -Output exactly in this format: - -## Contract Issues - -List problems that would break or confuse consumers. - -For each item: - -- endpoint or field reference -- what the problem is in one sentence -- concrete fix - -## Naming and Consistency - -List naming violations, inconsistencies across endpoints, and deviations from REST conventions. - -## Missing Error Cases - -List expected error responses that are undocumented or missing status codes (400, 401, 403, 404, 409, 422, 500). - -## Schema Completeness - -List fields or objects that are missing required constraints, descriptions, or examples. - -## Versioning and Compatibility - -- versioning strategy present: yes | no | partial -- breaking changes relative to previous version: yes | no | unknown -- backward compatibility risk: low | medium | high - -## Security Scheme Check - -- authentication documented: yes | no -- authorization scopes documented where relevant: yes | no | partial -- sensitive fields handled appropriately: yes | no | partial - -## Verdict - -- approve | approve-with-conditions | reject -- top priority fix in one sentence - - - diff --git a/tests/_fixtures/golden/prompts/quick-review.prompt.md b/tests/_fixtures/golden/prompts/quick-review.prompt.md deleted file mode 100644 index d0b734e7..00000000 --- a/tests/_fixtures/golden/prompts/quick-review.prompt.md +++ /dev/null @@ -1,53 +0,0 @@ ---- -description: 'Review a change for bugs, regressions, and missing tests.' -name: quick-review -argument-hint: '[scope or files to review]' -agent: engineer -tools: - - read - - search - - edit ---- -Review the selected code or diff for production risk. - -Focus only on issues with real impact: - -- correctness and edge cases -- security and data exposure -- performance and scalability -- maintainability and ownership boundaries -- missing tests for changed behavior -- API contract changes: breaking changes, schema drift, missing versioning - -Ignore: - -- style-only preferences with no runtime impact -- speculative risks without evidence in this change - -Output exactly in this format: - -## Must fix - -List blocking issues that should be resolved before merge. - -## Should consider - -List non-blocking improvements worth addressing now. - -## Looks good - -List intentional strengths in this change. - -For each item: - -- cite the relevant file/section -- explain why it matters in one short sentence -- give one concrete fix suggestion - -End with: - -- Merge recommendation: yes / no / yes-with-conditions -- Biggest remaining risk: one sentence - - - diff --git a/tests/vstack/artifacts/conftest.py b/tests/vstack/artifacts/conftest.py index 33482bae..2b97acb8 100644 --- a/tests/vstack/artifacts/conftest.py +++ b/tests/vstack/artifacts/conftest.py @@ -36,16 +36,6 @@ def _build(name: str) -> Path: return _build -@pytest.fixture(scope="session", name="prompt_fixture_path") -def fixture_prompt_fixture_path(golden_fixtures_root: Path) -> Callable[[str], Path]: - """Build the fixture path for a prompt artifact.""" - - def _build(name: str) -> Path: - return golden_fixtures_root / "prompts" / f"{name}.prompt.md" - - return _build - - @pytest.fixture(scope="session", name="instruction_fixture_path") def fixture_instruction_fixture_path(golden_fixtures_root: Path) -> Callable[[str], Path]: """Build the fixture path for an instruction artifact.""" diff --git a/tests/vstack/artifacts/test_config.py b/tests/vstack/artifacts/test_config.py index 2970c625..3edfd328 100644 --- a/tests/vstack/artifacts/test_config.py +++ b/tests/vstack/artifacts/test_config.py @@ -2,7 +2,7 @@ from __future__ import annotations -from vstack.artifacts.config import INSTRUCTION_SCHEMA, PROMPT_SCHEMA, ArtifactTypeConfig +from vstack.artifacts.config import INSTRUCTION_SCHEMA, ArtifactTypeConfig class TestArtifactTypeConfig: @@ -23,10 +23,6 @@ def test_post_init_sets_manifest_key(self) -> None: class TestSchemas: """Test cases for Schemas.""" - def test_prompt_schema_has_description(self) -> None: - """Test that prompt schema has description.""" - assert PROMPT_SCHEMA.get("description") is not None - def test_instruction_schema_has_apply_to(self) -> None: """Test that instruction schema has apply to.""" assert INSTRUCTION_SCHEMA.get("applyTo") is not None diff --git a/tests/vstack/artifacts/test_generator.py b/tests/vstack/artifacts/test_generator.py index e97f4648..090e3153 100644 --- a/tests/vstack/artifacts/test_generator.py +++ b/tests/vstack/artifacts/test_generator.py @@ -16,7 +16,6 @@ from vstack.artifacts.generator import GenericArtifactGenerator from vstack.instructions.config import INSTRUCTION_TYPE from vstack.models import ValidationResult -from vstack.prompts.config import PROMPT_TYPE from vstack.skills.config import SKILL_TYPE @@ -302,39 +301,32 @@ def test_render_agent_product_matches_golden_fixture( artifact_label="agent/product", ) - def test_render_prompt_quick_review_matches_golden_fixture( - self, - templates_root: Path, - prompt_fixture_path: Callable[[str], Path], - ) -> None: - """Quick-review prompt rendering must remain byte-for-byte stable.""" - templates = templates_root - template_dir = templates / "prompts" / "quick-review" - expected_fixture = prompt_fixture_path("quick-review") - - artifact = GenericArtifactGenerator(PROMPT_TYPE, templates).render(template_dir) - self._assert_matches_golden_fixture( - artifact_content=artifact.content, - expected_fixture=expected_fixture, - artifact_label="prompt/quick-review", - ) - - def test_render_prompt_api_design_review_matches_golden_fixture( - self, - templates_root: Path, - prompt_fixture_path: Callable[[str], Path], + @pytest.mark.parametrize( + "name, heading", + [ + ("migration-plan", "## Rollback Plan"), + ("reasoning", "## Hallucination Guardrails"), + ("release-check", "## Sign-off Gaps"), + ("upgrade-plan", "## Verification Matrix"), + ("workflow-check", "## Gate and Handoff Findings"), + ], + ) + def test_converted_prompt_is_a_manually_invoked_skill( + self, templates_root: Path, name: str, heading: str ) -> None: - """API-design-review prompt rendering must remain byte-for-byte stable.""" - templates = templates_root - template_dir = templates / "prompts" / "api-design-review" - expected_fixture = prompt_fixture_path("api-design-review") - - artifact = GenericArtifactGenerator(PROMPT_TYPE, templates).render(template_dir) - self._assert_matches_golden_fixture( - artifact_content=artifact.content, - expected_fixture=expected_fixture, - artifact_label="prompt/api-design-review", + """Converted workflows retain their output contracts and require explicit invocation.""" + artifact = GenericArtifactGenerator(SKILL_TYPE, templates_root).render( + templates_root / "skills" / name ) + assert artifact.frontmatter is not None + assert artifact.frontmatter["name"] == name + assert artifact.frontmatter["user-invocable"] is True + assert artifact.frontmatter["disable-model-invocation"] is True + assert "agent" not in artifact.frontmatter + assert "model" not in artifact.frontmatter + assert "tools" not in artifact.frontmatter + assert heading in artifact.content + assert "{{" not in artifact.content def test_render_skill_verify_matches_golden_fixture( self, diff --git a/tests/vstack/cli/test_constants.py b/tests/vstack/cli/test_constants.py index 99602036..ad003a59 100644 --- a/tests/vstack/cli/test_constants.py +++ b/tests/vstack/cli/test_constants.py @@ -38,6 +38,7 @@ "k8s", "lazy", "migrate", + "migration-plan", "onboard", "openapi", "performance", @@ -45,7 +46,9 @@ "pr", "rancher", "rca", + "reasoning", "refactor", + "release-check", "release-notes", "requirements", "secret-scan", @@ -55,8 +58,10 @@ "terraform", "terragrunt", "threat-model", + "upgrade-plan", "verify", "vision", + "workflow-check", ] diff --git a/tests/vstack/cli/test_interface.py b/tests/vstack/cli/test_interface.py index d326469b..9343a43c 100644 --- a/tests/vstack/cli/test_interface.py +++ b/tests/vstack/cli/test_interface.py @@ -154,7 +154,7 @@ def test_run_dispatches_install_with_global_default_types(self, monkeypatch, tmp assert len(command.calls) == 1 assert command.calls[0].args is args assert command.calls[0].install_dir == tmp_path / ".github" - assert command.calls[0].only == ["agent", "hook", "instruction", "prompt", "skill"] + assert command.calls[0].only == ["agent", "hook", "instruction", "skill"] def test_resolve_only_for_scope_rejects_disallowed_global_types(self) -> None: """Global mode rejects unsupported type filters with a helpful message.""" @@ -1298,10 +1298,10 @@ def test_handles_mixed_all_and_list(self, tmp_path: Path) -> None: vstack_dir = tmp_path / ".vstack" vstack_dir.mkdir() (vstack_dir / "config.yaml").write_text( - "exclude:\n prompts: all\n skills:\n - helm\n", encoding="utf-8" + "exclude:\n instructions: all\n skills:\n - helm\n", encoding="utf-8" ) excluded_types, excluded_names = CommandLineInterface._read_exclude(tmp_path / ".github") - assert "prompt" in excluded_types + assert "instruction" in excluded_types assert excluded_names == {"skill": ["helm"]} def test_ignores_unknown_keys(self, tmp_path: Path) -> None: diff --git a/tests/vstack/cli/test_parser.py b/tests/vstack/cli/test_parser.py index 0f2dd0ce..0b18acca 100644 --- a/tests/vstack/cli/test_parser.py +++ b/tests/vstack/cli/test_parser.py @@ -96,11 +96,41 @@ def test_build_parser_has_expected_commands(self) -> None: def test_verify_accepts_only_filter(self) -> None: """Test that verify command supports --only type filters.""" parser = parser_module.CommandLineParser().build() - args = parser.parse_args(["verify", "--only", "agent", "prompt", "--no-source"]) + args = parser.parse_args(["verify", "--only", "agent", "skill", "--no-source"]) assert args.command == "verify" - assert args.only == ["agent", "prompt"] + assert args.only == ["agent", "skill"] assert args.source is False + @pytest.mark.parametrize( + "command", ["install", "init", "verify", "validate", "status", "uninstall"] + ) + def test_prompt_artifact_filter_is_rejected(self, command: str) -> None: + """Removed prompt selectors are rejected instead of silently doing nothing.""" + parser = parser_module.CommandLineParser().build() + with pytest.raises(SystemExit) as exc: + parser.parse_args([command, "--only", "prompt"]) + assert exc.value.code == 2 + + @pytest.mark.parametrize( + "command, option", + [ + ("install", "--force-name"), + ("install", "--adopt-name"), + ("init", "--force-name"), + ("init", "--adopt-name"), + ("uninstall", "--force-name"), + ], + ) + def test_prompt_artifact_selector_is_rejected( + self, command: str, option: str, capsys: pytest.CaptureFixture[str] + ) -> None: + """Removed selectors explain the replacement instead of silently being ignored.""" + parser = parser_module.CommandLineParser().build() + with pytest.raises(SystemExit) as exc: + parser.parse_args([command, option, "prompt/quick-review"]) + assert exc.value.code == 2 + assert "use the replacement skill/" in capsys.readouterr().err + def test_install_accepts_force_name(self) -> None: """Test that install supports targeted force names.""" parser = parser_module.CommandLineParser().build() diff --git a/tests/vstack/cli/test_prompt_migration.py b/tests/vstack/cli/test_prompt_migration.py new file mode 100644 index 00000000..a9dfbcf8 --- /dev/null +++ b/tests/vstack/cli/test_prompt_migration.py @@ -0,0 +1,472 @@ +"""Regression tests for retiring managed prompts during skill installation.""" + +from argparse import Namespace +from pathlib import Path +from shutil import copytree + +import pytest + +from vstack.cli.base import CommandContext +from vstack.cli.constants import RETIRED_PROMPT_SKILLS +from vstack.cli.init import InitCommand +from vstack.cli.install import InstallCommand +from vstack.cli.service import CommandService +from vstack.constants import TEMPLATES_ROOT +from vstack.manifest import ArtifactEntry, Manifest, content_hash +from vstack.models import CheckMessage, ValidationResult + + +@pytest.fixture +def service() -> CommandService: + """Use shipped templates to test upgrades against actual replacement skills.""" + return CommandService(TEMPLATES_ROOT) + + +def track_prompts(service: CommandService, install_dir: Path, names: list[str]) -> Manifest: + """Write a previous-release manifest and clean prompt files.""" + entries = [] + for name in names: + relative_path = f"prompts/{name}.prompt.md" + path = install_dir / relative_path + path.parent.mkdir(parents=True, exist_ok=True) + content = f"Legacy workflow: {name}\n" + path.write_text(content, encoding="utf-8") + entries.append( + ArtifactEntry( + name=name, + file=relative_path, + version="20260513001", + checksum=content_hash(content), + checksum_algorithm="sha256", + ) + ) + manifest = Manifest( + vstack_version="3.7.0", + installed_at="2026-10-01T00:00:00Z", + artifacts={"prompts": entries}, + ) + service.manifest_for(install_dir).write(manifest) + return manifest + + +@pytest.mark.parametrize("command_cls", [InitCommand, InstallCommand]) +def test_upgrade_replaces_all_builtin_prompts_and_is_repeatable( + service: CommandService, tmp_path: Path, command_cls: type[InitCommand] | type[InstallCommand] +) -> None: + """Both upgrade entry points install skills and retire all clean managed prompts.""" + install_dir = tmp_path / ".github" + track_prompts(service, install_dir, list(RETIRED_PROMPT_SKILLS)) + personal_prompt = install_dir / "prompts" / "personal.prompt.md" + personal_prompt.write_text("Personal workflow\n", encoding="utf-8") + context = CommandContext(args=Namespace(), install_dir=install_dir, only=["skill"]) + + command = command_cls(service) + assert command.run(context=context) == 0 + assert command.run(context=context) == 0 + + manifest = service.manifest_for(install_dir).read() + assert manifest is not None + assert "prompts" not in manifest.artifacts + for old_name, skill in RETIRED_PROMPT_SKILLS.items(): + assert not (install_dir / "prompts" / f"{old_name}.prompt.md").exists() + assert (install_dir / "skills" / skill / "SKILL.md").is_file() + assert skill in manifest.names_for("skills") + assert personal_prompt.read_text(encoding="utf-8") == "Personal workflow\n" + + +def test_fresh_install_does_not_generate_or_adopt_prompts( + service: CommandService, tmp_path: Path +) -> None: + """Untracked prompts remain outside vstack ownership on new installations.""" + install_dir = tmp_path / ".github" + prompt = install_dir / "prompts" / "quick-review.prompt.md" + prompt.parent.mkdir(parents=True) + prompt.write_text("My workflow\n", encoding="utf-8") + assert InitCommand.execute(service, install_dir, only=["skill"]) == 0 + manifest = service.manifest_for(install_dir).read() + assert manifest is not None + assert "prompts" not in manifest.artifacts + assert list(prompt.parent.iterdir()) == [prompt] + assert prompt.read_text(encoding="utf-8") == "My workflow\n" + + +@pytest.mark.parametrize("force", [False, True]) +def test_repository_skill_is_not_installed_or_managed( + service: CommandService, tmp_path: Path, force: bool +) -> None: + """Even forced installs with pruning leave repository-owned skills untouched.""" + install_dir = tmp_path / ".github" + local_skill = install_dir / "skills" / "artifact-integrity" / "SKILL.md" + local_skill.parent.mkdir(parents=True) + content = "---\nname: artifact-integrity\ndescription: Local audit.\n---\nLocal procedure.\n" + local_skill.write_text(content, encoding="utf-8") + + assert InitCommand.execute(service, install_dir, only=["skill"], force=force, prune=True) == 0 + assert local_skill.read_text(encoding="utf-8") == content + manifest = service.manifest_for(install_dir).read() + assert manifest is not None + assert "artifact-integrity" not in manifest.names_for("skills") + assert "artifact-integrity" not in { + path.name for gen in service.generators for path in gen.find_templates() + } + + +def test_fresh_install_omits_repository_skill(service: CommandService, tmp_path: Path) -> None: + """Consumer repositories receive product skills, not vstack maintenance skills.""" + install_dir = tmp_path / ".github" + assert InitCommand.execute(service, install_dir, only=["skill"]) == 0 + assert not (install_dir / "skills" / "artifact-integrity").exists() + assert RETIRED_PROMPT_SKILLS["artifact-integrity"] == "inspect" + + +@pytest.mark.parametrize("modified", [False, True]) +def test_previously_distributed_repository_skill_uses_safe_obsolete_cleanup( + service: CommandService, tmp_path: Path, modified: bool +) -> None: + """Old managed copies require pruning and local edits prevent their removal.""" + install_dir = tmp_path / ".github" + local_skill = install_dir / "skills" / "artifact-integrity" / "SKILL.md" + local_skill.parent.mkdir(parents=True) + original = "Previously generated audit skill\n" + local_skill.write_text(original, encoding="utf-8") + manifest = Manifest( + vstack_version="3.7.0", + installed_at="2026-10-01T00:00:00Z", + artifacts={ + "skills": [ + ArtifactEntry( + name="artifact-integrity", + file="skills/artifact-integrity/SKILL.md", + version="20261017001", + checksum=content_hash(original), + checksum_algorithm="sha256", + ) + ] + }, + ) + service.manifest_for(install_dir).write(manifest) + content = "Locally customized audit\n" if modified else original + local_skill.write_text(content, encoding="utf-8") + + assert InitCommand.execute(service, install_dir, only=["skill"]) == 0 + assert local_skill.read_text(encoding="utf-8") == content + assert InitCommand.execute(service, install_dir, only=["skill"], prune=True) == 0 + installed_manifest = service.manifest_for(install_dir).read() + assert installed_manifest is not None + assert ("artifact-integrity" in installed_manifest.names_for("skills")) is modified + assert local_skill.exists() is modified + if modified: + assert local_skill.read_text(encoding="utf-8") == content + + +def test_upgrade_dry_run_preserves_files_and_manifest( + service: CommandService, tmp_path: Path, capsys: pytest.CaptureFixture[str] +) -> None: + """Dry-run simulates replacement installation and deletion without writing either.""" + install_dir = tmp_path / ".github" + track_prompts(service, install_dir, ["quick-review"]) + manifest_file = service.manifest_for(install_dir).path + original_manifest = manifest_file.read_bytes() + prompt = install_dir / "prompts" / "quick-review.prompt.md" + original_content = prompt.read_bytes() + + assert InitCommand.execute(service, install_dir, only=["skill"], dry_run=True) == 0 + assert manifest_file.read_bytes() == original_manifest + assert prompt.read_bytes() == original_content + assert not (install_dir / "skills").exists() + output = capsys.readouterr().out + assert "[dry-run]" in output + assert "Migrating prompt/quick-review" in output + + +def test_non_skill_install_defers_prompt_migration(service: CommandService, tmp_path: Path) -> None: + """Selecting another artifact family leaves old prompts tracked and untouched.""" + install_dir = tmp_path / ".github" + track_prompts(service, install_dir, ["quick-review"]) + assert InitCommand.execute(service, install_dir, only=["instruction"]) == 0 + manifest = service.manifest_for(install_dir).read() + assert manifest is not None + assert manifest.names_for("prompts") == ["quick-review"] + assert (install_dir / "prompts" / "quick-review.prompt.md").is_file() + + +@pytest.mark.parametrize( + "case, expected_reason", + [ + ("modified", "local changes detected"), + ("no-checksum", "no stored checksum"), + ("unknown-algorithm", "unknown checksum algorithm"), + ("invalid-utf8", "file is unreadable"), + ("directory", "file is unreadable"), + ("unknown-prompt", "convert this custom workflow manually"), + ("unsafe-path", "noncanonical legacy prompt path"), + ("file-symlink", "symlinked legacy prompt path"), + ("directory-symlink", "symlinked legacy prompt path"), + ], +) +def test_unsafe_legacy_prompt_is_preserved_even_with_force_and_prune( + service: CommandService, + tmp_path: Path, + capsys: pytest.CaptureFixture[str], + case: str, + expected_reason: str, +) -> None: + """No force mode bypasses ownership, path, or checksum migration safeguards.""" + install_dir = tmp_path / ".github" + name = "custom-workflow" if case == "unknown-prompt" else "quick-review" + manifest = track_prompts(service, install_dir, [name]) + entry = manifest.entries_for("prompts")[0] + prompt = install_dir / entry.file + outside = tmp_path / "outside.prompt.md" + outside.write_text("Do not touch\n", encoding="utf-8") + if case == "modified": + prompt.write_text("Local changes\n", encoding="utf-8") + elif case == "no-checksum": + entry.checksum = None + entry.checksum_algorithm = None + elif case == "unknown-algorithm": + entry.checksum_algorithm = "sha999" + elif case == "invalid-utf8": + prompt.write_bytes(b"\xff") + elif case == "directory": + prompt.unlink() + prompt.mkdir() + elif case == "unsafe-path": + entry.file = "../outside.prompt.md" + entry.checksum = content_hash("Do not touch\n") + elif case == "file-symlink": + prompt.unlink() + prompt.symlink_to(outside) + entry.checksum = content_hash("Do not touch\n") + elif case == "directory-symlink": + prompt.unlink() + prompt.parent.rmdir() + external_dir = tmp_path / "external-prompts" + external_dir.mkdir() + (external_dir / prompt.name).write_text("External workflow\n", encoding="utf-8") + prompt.parent.symlink_to(external_dir, target_is_directory=True) + entry.checksum = content_hash("External workflow\n") + service.manifest_for(install_dir).write(manifest) + + assert InitCommand.execute(service, install_dir, only=["skill"], force=True, prune=True) == 0 + updated = service.manifest_for(install_dir).read() + assert updated is not None + assert updated.entries_for("prompts") == [entry] + assert prompt.exists() + assert outside.read_text(encoding="utf-8") == "Do not touch\n" + output = capsys.readouterr().out + assert expected_reason in output + assert "--force does not remove them" in output + assert "--force-name <" not in output + + +@pytest.mark.parametrize("collision", ["excluded", "untracked", "modified", "adopted"]) +def test_unavailable_replacement_defers_cleanup_and_can_be_retried( + service: CommandService, + tmp_path: Path, + capsys: pytest.CaptureFixture[str], + collision: str, +) -> None: + """Install never deletes a prompt when its replacement was excluded or preserved.""" + install_dir = tmp_path / ".github" + manifest = track_prompts(service, install_dir, ["quick-review"]) + replacement = install_dir / "skills" / "code-review" / "SKILL.md" + if collision != "excluded": + replacement.parent.mkdir(parents=True) + replacement.write_text("Local skill\n", encoding="utf-8") + if collision == "modified": + manifest.artifacts["skills"] = [ + ArtifactEntry( + name="code-review", + file="skills/code-review/SKILL.md", + checksum=content_hash("Original skill\n"), + ) + ] + service.manifest_for(install_dir).write(manifest) + assert ( + InitCommand.execute( + service, + install_dir, + only=["skill"], + excluded_names={"skill": ["code-review"]} if collision == "excluded" else None, + adopt_names=["skill/code-review"] if collision == "adopted" else None, + ) + == 0 + ) + prompt = install_dir / "prompts" / "quick-review.prompt.md" + assert prompt.is_file() + current = service.manifest_for(install_dir).read() + assert current is not None + assert current.names_for("prompts") == ["quick-review"] + assert "replacement skill/code-review is unavailable" in capsys.readouterr().out + if collision != "excluded": + assert replacement.read_text(encoding="utf-8") == "Local skill\n" + assert ( + InitCommand.execute(service, install_dir, only=["skill"], force_names=["skill/code-review"]) + == 0 + ) + assert not prompt.exists() + + +def test_already_missing_prompt_is_removed_from_manifest( + service: CommandService, tmp_path: Path +) -> None: + """Interrupted upgrades are retryable when the old prompt was already deleted.""" + install_dir = tmp_path / ".github" + track_prompts(service, install_dir, ["quick-review"]) + prompt = install_dir / "prompts" / "quick-review.prompt.md" + prompt.unlink() + assert InitCommand.execute(service, install_dir, only=["skill"], update=True) == 0 + manifest = service.manifest_for(install_dir).read() + assert manifest is not None + assert not manifest.entries_for("prompts") + assert not prompt.parent.exists() + + +def test_failed_prompt_deletion_is_reported_and_retryable( + service: CommandService, + tmp_path: Path, + monkeypatch: pytest.MonkeyPatch, + capsys: pytest.CaptureFixture[str], +) -> None: + """A filesystem failure returns nonzero and keeps ownership for a later retry.""" + install_dir = tmp_path / ".github" + track_prompts(service, install_dir, ["quick-review"]) + + def fail_removal(**_kwargs: object) -> None: + raise PermissionError("deletion denied") + + with monkeypatch.context() as patch: + patch.setattr(InitCommand, "_remove_file_if_present", staticmethod(fail_removal)) + assert InitCommand.execute(service, install_dir, only=["skill"]) == 1 + output = capsys.readouterr() + assert "ERROR: could not retire prompt/quick-review: deletion denied" in output.err + assert "removed obsolete tracked artifact" not in output.out + assert (install_dir / "prompts" / "quick-review.prompt.md").exists() + manifest = service.manifest_for(install_dir).read() + assert manifest is not None + assert manifest.names_for("prompts") == ["quick-review"] + assert "code-review" in manifest.names_for("skills") + assert InitCommand.execute(service, install_dir, only=["skill"], update=True) == 0 + assert not (install_dir / "prompts" / "quick-review.prompt.md").exists() + + +def test_profile_scoped_upgrade_uses_the_same_safe_retirement( + service: CommandService, tmp_path: Path +) -> None: + """Existing profile installs migrate relative paths without a project scaffold.""" + install_dir = tmp_path / "User" + track_prompts(service, install_dir, ["reasoning"]) + context = CommandContext( + args=Namespace(use_global=True), install_dir=install_dir, only=["skill"] + ) + assert InstallCommand(service).run(context=context) == 0 + assert not (install_dir / "prompts" / "reasoning.prompt.md").exists() + assert (install_dir / "skills" / "reasoning" / "SKILL.md").exists() + assert not (tmp_path / ".vstack").exists() + + +def test_source_validation_failure_does_not_retire_prompts( + service: CommandService, tmp_path: Path, monkeypatch: pytest.MonkeyPatch +) -> None: + """Failed generation does not trigger cleanup of the previous release's workflows.""" + install_dir = tmp_path / ".github" + track_prompts(service, install_dir, ["quick-review"]) + gen = service.gen_for("skill") + assert gen is not None + monkeypatch.setattr( + gen, + "verify_input", + lambda: ValidationResult(messages=[CheckMessage(level="fail", message="bad source")]), + ) + assert InitCommand.execute(service, install_dir, only=["skill"]) == 1 + assert (install_dir / "prompts" / "quick-review.prompt.md").exists() + manifest = service.manifest_for(install_dir).read() + assert manifest is not None + assert manifest.names_for("prompts") == ["quick-review"] + + +@pytest.mark.parametrize("action", ["install", "update", "skip"]) +@pytest.mark.parametrize("dry_run", [False, True]) +def test_unresolved_replacement_preserves_prompt_until_repaired( + tmp_path: Path, + capsys: pytest.CaptureFixture[str], + action: str, + dry_run: bool, +) -> None: + """Missing partials defer retirement for new, updated, and unchanged replacements.""" + templates = tmp_path / "templates" + copytree(TEMPLATES_ROOT / "skills", templates / "skills") + service = CommandService(templates) + install_dir = tmp_path / ".github" + partial = templates / "skills" / "_partials" / "skill-context.md" + partial_content = partial.read_text(encoding="utf-8") + if action == "skip": + partial.unlink() + if action != "install": + assert InitCommand.execute(service, install_dir, only=["skill"]) == 0 + installed = service.manifest_for(install_dir).read() + manifest = track_prompts(service, install_dir, ["quick-review"]) + if installed is not None: + manifest.artifacts["skills"] = installed.entries_for("skills") + if action == "update": + for entry in manifest.artifacts["skills"]: + entry.version = "1" + service.manifest_for(install_dir).write(manifest) + if action != "skip": + partial.unlink() + service = CommandService(templates) + gen = service.gen_for("skill") + assert gen is not None + assert gen.verify_input().ok + replacement = next(artifact for artifact in gen.render_all() if artifact.name == "code-review") + assert "SKILL_CONTEXT" in replacement.unresolved + prompt = install_dir / "prompts" / "quick-review.prompt.md" + original_prompt = prompt.read_bytes() + original_manifest = service.manifest_for(install_dir).path.read_bytes() + capsys.readouterr() + + assert ( + InitCommand.execute( + service, install_dir, only=["skill"], update=action != "install", dry_run=dry_run + ) + == 0 + ) + assert prompt.read_bytes() == original_prompt + current = service.manifest_for(install_dir).read() + assert current is not None + assert current.names_for("prompts") == ["quick-review"] + output = capsys.readouterr() + assert "replacement skill/code-review is unavailable" in output.out + assert "SKILL_CONTEXT" in output.err + if dry_run: + assert service.manifest_for(install_dir).path.read_bytes() == original_manifest + + partial.write_text(partial_content, encoding="utf-8") + service = CommandService(templates) + if not dry_run or action == "skip": + assert InitCommand.execute(service, install_dir, only=["skill"], update=True) == 0 + assert prompt.read_bytes() == original_prompt + current = service.manifest_for(install_dir).read() + assert current is not None + assert current.names_for("prompts") == ["quick-review"] + assert InitCommand.execute(service, install_dir, only=["skill"]) == 0 + assert not prompt.exists() + repaired = install_dir / "skills" / "code-review" / "SKILL.md" + assert "{{SKILL_CONTEXT}}" not in repaired.read_text(encoding="utf-8") + current = service.manifest_for(install_dir).read() + assert current is not None + assert not current.entries_for("prompts") + + +def test_retired_prompt_exclusions_warn_instead_of_blocking_upgrade( + tmp_path: Path, capsys: pytest.CaptureFixture[str] +) -> None: + """Legacy exclusion keys no longer select a type, and explain their replacement.""" + from vstack.cli.interface import CommandLineInterface + + config = tmp_path / ".vstack" / "config.yaml" + config.parent.mkdir() + config.write_text("exclude:\n prompts: all\n", encoding="utf-8") + assert CommandLineInterface._read_exclude(tmp_path / ".github") == (frozenset(), {}) + assert "exclude.prompts is retired" in capsys.readouterr().err diff --git a/tests/vstack/cli/test_service.py b/tests/vstack/cli/test_service.py index ecc52afb..408d08b6 100644 --- a/tests/vstack/cli/test_service.py +++ b/tests/vstack/cli/test_service.py @@ -64,7 +64,7 @@ def test_cli_class_uses_known_types(self) -> None: """Service generators cover all known artifact families.""" svc = CommandService(templates_root=TEMPLATES_ROOT) names = {g.config.type_name for g in svc.generators} - assert names == {"skill", "agent", "hook", "instruction", "prompt"} + assert names == {"skill", "agent", "hook", "instruction"} def test_custom_items_root_is_passed_to_agent_generator(self, tmp_path: Path) -> None: """items_root kwarg is forwarded to the AgentGenerator instance.""" diff --git a/tests/vstack/cli/test_status.py b/tests/vstack/cli/test_status.py index bc7e6879..9f2f63df 100644 --- a/tests/vstack/cli/test_status.py +++ b/tests/vstack/cli/test_status.py @@ -32,7 +32,7 @@ def _fake_execute(*args, **kwargs): context = CommandContext( args=Namespace(output_format="json", verbose=True, no_color=True), install_dir=tmp_path, - only=["prompt"], + only=["skill"], ) assert StatusCommand(service=cast(CommandService, object())).run(context=context) == 3 assert captured["kwargs"]["output_format"] == "json" diff --git a/tests/vstack/prompts/test___init__.py b/tests/vstack/prompts/test___init__.py deleted file mode 100644 index 65e3f940..00000000 --- a/tests/vstack/prompts/test___init__.py +++ /dev/null @@ -1,19 +0,0 @@ -"""Tests for vstack.prompts package public API.""" - -from __future__ import annotations - -from vstack.prompts import PromptGenerator - - -class TestPromptsInit: - """Test cases for vstack.prompts package exports.""" - - def test_exports_prompt_generator(self) -> None: - """Package exports PromptGenerator at the top level.""" - assert PromptGenerator is not None - - def test_all_contains_prompt_generator(self) -> None: - """__all__ declares PromptGenerator.""" - import vstack.prompts as mod - - assert "PromptGenerator" in mod.__all__ diff --git a/tests/vstack/prompts/test_config.py b/tests/vstack/prompts/test_config.py deleted file mode 100644 index 43311756..00000000 --- a/tests/vstack/prompts/test_config.py +++ /dev/null @@ -1,29 +0,0 @@ -"""Tests for prompt artifact type configuration.""" - -from __future__ import annotations - -from vstack.prompts.config import PROMPT_TYPE - - -class TestPromptType: - """Test cases for PROMPT_TYPE artifact configuration.""" - - def test_type_name_is_prompt(self) -> None: - """type_name must be 'prompt'.""" - assert PROMPT_TYPE.type_name == "prompt" - - def test_output_subdir_is_prompts(self) -> None: - """Output artifacts go under the prompts subdirectory.""" - assert PROMPT_TYPE.output_subdir == "prompts" - - def test_artifact_is_not_dir(self) -> None: - """Prompts produce single-file artifacts, not directories.""" - assert PROMPT_TYPE.artifact_is_dir is False - - def test_add_frontmatter_is_true(self) -> None: - """Prompt artifacts include frontmatter.""" - assert PROMPT_TYPE.add_frontmatter is True - - def test_auto_gen_footer_is_true(self) -> None: - """Prompt artifacts include the auto-gen footer.""" - assert PROMPT_TYPE.auto_gen_footer is True diff --git a/tests/vstack/prompts/test_constants.py b/tests/vstack/prompts/test_constants.py deleted file mode 100644 index 9086d22d..00000000 --- a/tests/vstack/prompts/test_constants.py +++ /dev/null @@ -1,25 +0,0 @@ -"""Tests for prompt module constants.""" - -from __future__ import annotations - -from vstack.prompts.constants import ( - PROMPT_OUTPUT_SUBDIR, - PROMPT_OUTPUT_SUFFIX, - PROMPT_TEMPLATES_SUBDIR, -) - - -class TestPromptConstants: - """Test cases for prompt constant values.""" - - def test_output_suffix_is_prompt_md(self) -> None: - """Output suffix must end with .prompt.md.""" - assert PROMPT_OUTPUT_SUFFIX == ".prompt.md" - - def test_templates_subdir_is_prompts(self) -> None: - """Templates subdir must be 'prompts'.""" - assert PROMPT_TEMPLATES_SUBDIR == "prompts" - - def test_output_subdir_is_prompts(self) -> None: - """Output subdir must be 'prompts'.""" - assert PROMPT_OUTPUT_SUBDIR == "prompts" diff --git a/tests/vstack/prompts/test_generator.py b/tests/vstack/prompts/test_generator.py deleted file mode 100644 index 778cddda..00000000 --- a/tests/vstack/prompts/test_generator.py +++ /dev/null @@ -1,14 +0,0 @@ -"""Tests for prompt generator behavior.""" - -from __future__ import annotations - -from vstack.prompts.generator import PromptGenerator - - -class TestPromptGenerator: - """Test cases for PromptGenerator.""" - - def test_generator_uses_prompt_type(self) -> None: - """Test that generator uses prompt type.""" - gen = PromptGenerator() - assert gen.config.type_name == "prompt"