dixi-spec-kit 1.5.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- dixi_spec_kit/__init__.py +1 -0
- dixi_spec_kit/__main__.py +3 -0
- dixi_spec_kit/cli.py +190 -0
- dixi_spec_kit/core.py +399 -0
- dixi_spec_kit/filesystem.py +124 -0
- dixi_spec_kit/locales/en.json +91 -0
- dixi_spec_kit/locales/es.json +91 -0
- dixi_spec_kit/resources/claude/en/CLAUDE.md +21 -0
- dixi_spec_kit/resources/claude/en/agents/dixi-architect.md +36 -0
- dixi_spec_kit/resources/claude/en/agents/dixi-developer.md +36 -0
- dixi_spec_kit/resources/claude/en/agents/dixi-reviewer.md +37 -0
- dixi_spec_kit/resources/claude/en/agents/dixi-tester.md +37 -0
- dixi_spec_kit/resources/claude/en/dixi.ai.md +31 -0
- dixi_spec_kit/resources/claude/en/dixi.analyze.md +31 -0
- dixi_spec_kit/resources/claude/en/dixi.architecture.md +32 -0
- dixi_spec_kit/resources/claude/en/dixi.build.md +33 -0
- dixi_spec_kit/resources/claude/en/dixi.change.md +32 -0
- dixi_spec_kit/resources/claude/en/dixi.clarify.md +31 -0
- dixi_spec_kit/resources/claude/en/dixi.compliance.md +31 -0
- dixi_spec_kit/resources/claude/en/dixi.contract.md +32 -0
- dixi_spec_kit/resources/claude/en/dixi.data.md +31 -0
- dixi_spec_kit/resources/claude/en/dixi.discover.md +32 -0
- dixi_spec_kit/resources/claude/en/dixi.domain.md +32 -0
- dixi_spec_kit/resources/claude/en/dixi.duediligence.md +31 -0
- dixi_spec_kit/resources/claude/en/dixi.finops.md +31 -0
- dixi_spec_kit/resources/claude/en/dixi.handoff.md +32 -0
- dixi_spec_kit/resources/claude/en/dixi.interview.md +34 -0
- dixi_spec_kit/resources/claude/en/dixi.operate.md +31 -0
- dixi_spec_kit/resources/claude/en/dixi.plan.md +32 -0
- dixi_spec_kit/resources/claude/en/dixi.promote.md +31 -0
- dixi_spec_kit/resources/claude/en/dixi.quality.md +31 -0
- dixi_spec_kit/resources/claude/en/dixi.release.md +31 -0
- dixi_spec_kit/resources/claude/en/dixi.review.md +32 -0
- dixi_spec_kit/resources/claude/en/dixi.risk-review.md +36 -0
- dixi_spec_kit/resources/claude/en/dixi.specify.md +32 -0
- dixi_spec_kit/resources/claude/en/dixi.status.md +31 -0
- dixi_spec_kit/resources/claude/en/dixi.tasks.md +31 -0
- dixi_spec_kit/resources/claude/en/dixi.threat-model.md +32 -0
- dixi_spec_kit/resources/claude/en/dixi.verify.md +31 -0
- dixi_spec_kit/resources/claude/es/CLAUDE.md +21 -0
- dixi_spec_kit/resources/claude/es/agents/dixi-architect.md +36 -0
- dixi_spec_kit/resources/claude/es/agents/dixi-developer.md +36 -0
- dixi_spec_kit/resources/claude/es/agents/dixi-reviewer.md +37 -0
- dixi_spec_kit/resources/claude/es/agents/dixi-tester.md +37 -0
- dixi_spec_kit/resources/claude/es/dixi.ai.md +31 -0
- dixi_spec_kit/resources/claude/es/dixi.analyze.md +31 -0
- dixi_spec_kit/resources/claude/es/dixi.architecture.md +32 -0
- dixi_spec_kit/resources/claude/es/dixi.build.md +33 -0
- dixi_spec_kit/resources/claude/es/dixi.change.md +32 -0
- dixi_spec_kit/resources/claude/es/dixi.clarify.md +31 -0
- dixi_spec_kit/resources/claude/es/dixi.compliance.md +31 -0
- dixi_spec_kit/resources/claude/es/dixi.contract.md +32 -0
- dixi_spec_kit/resources/claude/es/dixi.data.md +31 -0
- dixi_spec_kit/resources/claude/es/dixi.discover.md +32 -0
- dixi_spec_kit/resources/claude/es/dixi.domain.md +32 -0
- dixi_spec_kit/resources/claude/es/dixi.duediligence.md +31 -0
- dixi_spec_kit/resources/claude/es/dixi.finops.md +31 -0
- dixi_spec_kit/resources/claude/es/dixi.handoff.md +32 -0
- dixi_spec_kit/resources/claude/es/dixi.interview.md +34 -0
- dixi_spec_kit/resources/claude/es/dixi.operate.md +31 -0
- dixi_spec_kit/resources/claude/es/dixi.plan.md +32 -0
- dixi_spec_kit/resources/claude/es/dixi.promote.md +31 -0
- dixi_spec_kit/resources/claude/es/dixi.quality.md +31 -0
- dixi_spec_kit/resources/claude/es/dixi.release.md +31 -0
- dixi_spec_kit/resources/claude/es/dixi.review.md +32 -0
- dixi_spec_kit/resources/claude/es/dixi.risk-review.md +36 -0
- dixi_spec_kit/resources/claude/es/dixi.specify.md +32 -0
- dixi_spec_kit/resources/claude/es/dixi.status.md +31 -0
- dixi_spec_kit/resources/claude/es/dixi.tasks.md +31 -0
- dixi_spec_kit/resources/claude/es/dixi.threat-model.md +32 -0
- dixi_spec_kit/resources/claude/es/dixi.verify.md +31 -0
- dixi_spec_kit/resources/codex/en/dixi-ai.md +31 -0
- dixi_spec_kit/resources/codex/en/dixi-analyze.md +31 -0
- dixi_spec_kit/resources/codex/en/dixi-architecture.md +32 -0
- dixi_spec_kit/resources/codex/en/dixi-build.md +33 -0
- dixi_spec_kit/resources/codex/en/dixi-change.md +32 -0
- dixi_spec_kit/resources/codex/en/dixi-clarify.md +31 -0
- dixi_spec_kit/resources/codex/en/dixi-compliance.md +31 -0
- dixi_spec_kit/resources/codex/en/dixi-contract.md +32 -0
- dixi_spec_kit/resources/codex/en/dixi-data.md +31 -0
- dixi_spec_kit/resources/codex/en/dixi-discover.md +32 -0
- dixi_spec_kit/resources/codex/en/dixi-domain.md +32 -0
- dixi_spec_kit/resources/codex/en/dixi-duediligence.md +31 -0
- dixi_spec_kit/resources/codex/en/dixi-finops.md +31 -0
- dixi_spec_kit/resources/codex/en/dixi-handoff.md +32 -0
- dixi_spec_kit/resources/codex/en/dixi-interview.md +34 -0
- dixi_spec_kit/resources/codex/en/dixi-operate.md +31 -0
- dixi_spec_kit/resources/codex/en/dixi-plan.md +32 -0
- dixi_spec_kit/resources/codex/en/dixi-promote.md +31 -0
- dixi_spec_kit/resources/codex/en/dixi-quality.md +31 -0
- dixi_spec_kit/resources/codex/en/dixi-release.md +31 -0
- dixi_spec_kit/resources/codex/en/dixi-review.md +32 -0
- dixi_spec_kit/resources/codex/en/dixi-risk-review.md +36 -0
- dixi_spec_kit/resources/codex/en/dixi-specify.md +32 -0
- dixi_spec_kit/resources/codex/en/dixi-status.md +31 -0
- dixi_spec_kit/resources/codex/en/dixi-tasks.md +31 -0
- dixi_spec_kit/resources/codex/en/dixi-threat-model.md +32 -0
- dixi_spec_kit/resources/codex/en/dixi-verify.md +31 -0
- dixi_spec_kit/resources/codex/es/dixi-ai.md +31 -0
- dixi_spec_kit/resources/codex/es/dixi-analyze.md +31 -0
- dixi_spec_kit/resources/codex/es/dixi-architecture.md +32 -0
- dixi_spec_kit/resources/codex/es/dixi-build.md +33 -0
- dixi_spec_kit/resources/codex/es/dixi-change.md +32 -0
- dixi_spec_kit/resources/codex/es/dixi-clarify.md +31 -0
- dixi_spec_kit/resources/codex/es/dixi-compliance.md +31 -0
- dixi_spec_kit/resources/codex/es/dixi-contract.md +32 -0
- dixi_spec_kit/resources/codex/es/dixi-data.md +31 -0
- dixi_spec_kit/resources/codex/es/dixi-discover.md +32 -0
- dixi_spec_kit/resources/codex/es/dixi-domain.md +32 -0
- dixi_spec_kit/resources/codex/es/dixi-duediligence.md +31 -0
- dixi_spec_kit/resources/codex/es/dixi-finops.md +31 -0
- dixi_spec_kit/resources/codex/es/dixi-handoff.md +32 -0
- dixi_spec_kit/resources/codex/es/dixi-interview.md +34 -0
- dixi_spec_kit/resources/codex/es/dixi-operate.md +31 -0
- dixi_spec_kit/resources/codex/es/dixi-plan.md +32 -0
- dixi_spec_kit/resources/codex/es/dixi-promote.md +31 -0
- dixi_spec_kit/resources/codex/es/dixi-quality.md +31 -0
- dixi_spec_kit/resources/codex/es/dixi-release.md +31 -0
- dixi_spec_kit/resources/codex/es/dixi-review.md +32 -0
- dixi_spec_kit/resources/codex/es/dixi-risk-review.md +36 -0
- dixi_spec_kit/resources/codex/es/dixi-specify.md +32 -0
- dixi_spec_kit/resources/codex/es/dixi-status.md +31 -0
- dixi_spec_kit/resources/codex/es/dixi-tasks.md +31 -0
- dixi_spec_kit/resources/codex/es/dixi-threat-model.md +32 -0
- dixi_spec_kit/resources/codex/es/dixi-verify.md +31 -0
- dixi_spec_kit/resources/hooks/guard_attestation.py +141 -0
- dixi_spec_kit/resources/hooks/guard_secrets.py +90 -0
- dixi_spec_kit/resources/hooks/mode_gate.py +139 -0
- dixi_spec_kit/resources/hooks/protect_tests.py +251 -0
- dixi_spec_kit/resources/hooks/verify_on_stop.py +74 -0
- dixi_spec_kit/resources/profiles.json +278 -0
- dixi_spec_kit/resources/project.en.json +16 -0
- dixi_spec_kit/resources/project.es.json +16 -0
- dixi_spec_kit/resources/templates/en/00-governance/ai-governance.md +61 -0
- dixi_spec_kit/resources/templates/en/00-governance/data-governance.md +64 -0
- dixi_spec_kit/resources/templates/en/00-governance/engineering-standards.md +55 -0
- dixi_spec_kit/resources/templates/en/00-governance/environment-strategy.md +56 -0
- dixi_spec_kit/resources/templates/en/00-governance/integration-governance.md +55 -0
- dixi_spec_kit/resources/templates/en/00-governance/observability-standard.md +58 -0
- dixi_spec_kit/resources/templates/en/00-governance/policies/ai-usage-policy.md +61 -0
- dixi_spec_kit/resources/templates/en/00-governance/policies/branching-strategy.md +57 -0
- dixi_spec_kit/resources/templates/en/00-governance/policies/dependency-policy.md +53 -0
- dixi_spec_kit/resources/templates/en/00-governance/policies/documentation-policy.md +70 -0
- dixi_spec_kit/resources/templates/en/00-governance/policies/i18n-policy.md +54 -0
- dixi_spec_kit/resources/templates/en/00-governance/policies/incident-policy.md +63 -0
- dixi_spec_kit/resources/templates/en/00-governance/policies/naming-conventions.md +59 -0
- dixi_spec_kit/resources/templates/en/00-governance/policies/testing-policy.md +52 -0
- dixi_spec_kit/resources/templates/en/00-governance/policies/versioning-policy.md +50 -0
- dixi_spec_kit/resources/templates/en/00-governance/principles.md +66 -0
- dixi_spec_kit/resources/templates/en/00-governance/release-management-standard.md +55 -0
- dixi_spec_kit/resources/templates/en/00-governance/security-baseline.md +70 -0
- dixi_spec_kit/resources/templates/en/01-business/actors/external-partners.md +44 -0
- dixi_spec_kit/resources/templates/en/01-business/actors/internal-roles.md +46 -0
- dixi_spec_kit/resources/templates/en/01-business/actors/personas.md +50 -0
- dixi_spec_kit/resources/templates/en/01-business/domains/bounded-context-map.md +57 -0
- dixi_spec_kit/resources/templates/en/01-business/domains/business-capabilities.md +43 -0
- dixi_spec_kit/resources/templates/en/01-business/domains/domain-map.md +52 -0
- dixi_spec_kit/resources/templates/en/01-business/domains/ubiquitous-language.md +48 -0
- dixi_spec_kit/resources/templates/en/01-business/rules/business-rules.md +52 -0
- dixi_spec_kit/resources/templates/en/01-business/rules/compliance-rules.md +52 -0
- dixi_spec_kit/resources/templates/en/01-business/rules/operational-constraints.md +48 -0
- dixi_spec_kit/resources/templates/en/01-business/rules/pricing-rules.md +52 -0
- dixi_spec_kit/resources/templates/en/01-business/strategic-goals.md +57 -0
- dixi_spec_kit/resources/templates/en/01-business/value-proposition.md +53 -0
- dixi_spec_kit/resources/templates/en/02-platform/cross-product-integrations.md +49 -0
- dixi_spec_kit/resources/templates/en/02-platform/ecosystem-landscape.md +53 -0
- dixi_spec_kit/resources/templates/en/02-platform/identity-and-access-strategy.md +50 -0
- dixi_spec_kit/resources/templates/en/02-platform/platform-overview.md +57 -0
- dixi_spec_kit/resources/templates/en/02-platform/product-map.md +55 -0
- dixi_spec_kit/resources/templates/en/02-platform/products/README.md +48 -0
- dixi_spec_kit/resources/templates/en/02-platform/shared-services-map.md +51 -0
- dixi_spec_kit/resources/templates/en/02-platform/tenant-strategy.md +52 -0
- dixi_spec_kit/resources/templates/en/06-flows/README.md +49 -0
- dixi_spec_kit/resources/templates/en/07-contracts/agent-interfaces/README.md +58 -0
- dixi_spec_kit/resources/templates/en/07-contracts/api/README.md +53 -0
- dixi_spec_kit/resources/templates/en/07-contracts/commands/README.md +53 -0
- dixi_spec_kit/resources/templates/en/07-contracts/events/README.md +53 -0
- dixi_spec_kit/resources/templates/en/07-contracts/external/README.md +48 -0
- dixi_spec_kit/resources/templates/en/07-contracts/mcp/README.md +49 -0
- dixi_spec_kit/resources/templates/en/07-contracts/schemas/README.md +52 -0
- dixi_spec_kit/resources/templates/en/08-data/audit-fields-standard.md +61 -0
- dixi_spec_kit/resources/templates/en/08-data/canonical-data-model.md +67 -0
- dixi_spec_kit/resources/templates/en/08-data/data-architecture.md +65 -0
- dixi_spec_kit/resources/templates/en/08-data/master-data.md +56 -0
- dixi_spec_kit/resources/templates/en/08-data/migrations/data-migration-playbook.md +76 -0
- dixi_spec_kit/resources/templates/en/08-data/migrations/migration-strategy.md +69 -0
- dixi_spec_kit/resources/templates/en/08-data/migrations/zero-downtime-migrations.md +62 -0
- dixi_spec_kit/resources/templates/en/08-data/models/erd-overview.md +56 -0
- dixi_spec_kit/resources/templates/en/08-data/pii-classification.md +62 -0
- dixi_spec_kit/resources/templates/en/08-data/reporting-dimensions.md +55 -0
- dixi_spec_kit/resources/templates/en/08-data/retention-policy.md +59 -0
- dixi_spec_kit/resources/templates/en/09-architecture/adr/README.md +54 -0
- dixi_spec_kit/resources/templates/en/09-architecture/component-diagram.md +52 -0
- dixi_spec_kit/resources/templates/en/09-architecture/container-diagram.md +56 -0
- dixi_spec_kit/resources/templates/en/09-architecture/deployment-architecture.md +62 -0
- dixi_spec_kit/resources/templates/en/09-architecture/event-architecture.md +59 -0
- dixi_spec_kit/resources/templates/en/09-architecture/integration-architecture.md +56 -0
- dixi_spec_kit/resources/templates/en/09-architecture/multi-tenant-architecture.md +58 -0
- dixi_spec_kit/resources/templates/en/09-architecture/offline-sync-architecture.md +63 -0
- dixi_spec_kit/resources/templates/en/09-architecture/performance-architecture.md +50 -0
- dixi_spec_kit/resources/templates/en/09-architecture/resilience-architecture.md +52 -0
- dixi_spec_kit/resources/templates/en/09-architecture/security-architecture.md +64 -0
- dixi_spec_kit/resources/templates/en/09-architecture/system-context.md +54 -0
- dixi_spec_kit/resources/templates/en/10-engineering/api-design-standard.md +61 -0
- dixi_spec_kit/resources/templates/en/10-engineering/coding-standards.md +63 -0
- dixi_spec_kit/resources/templates/en/10-engineering/error-handling-standard.md +56 -0
- dixi_spec_kit/resources/templates/en/10-engineering/event-design-standard.md +60 -0
- dixi_spec_kit/resources/templates/en/10-engineering/logging-standard.md +59 -0
- dixi_spec_kit/resources/templates/en/10-engineering/package-structure-standard.md +57 -0
- dixi_spec_kit/resources/templates/en/10-engineering/secure-coding-standard.md +54 -0
- dixi_spec_kit/resources/templates/en/10-engineering/templates/adr-template.md +69 -0
- dixi_spec_kit/resources/templates/en/10-engineering/templates/agent-spec-template.md +71 -0
- dixi_spec_kit/resources/templates/en/10-engineering/templates/api-template.yaml +158 -0
- dixi_spec_kit/resources/templates/en/10-engineering/templates/domain-template.md +66 -0
- dixi_spec_kit/resources/templates/en/10-engineering/templates/event-template.json +19 -0
- dixi_spec_kit/resources/templates/en/10-engineering/templates/external-integration-template.md +72 -0
- dixi_spec_kit/resources/templates/en/10-engineering/templates/feature-template.md +75 -0
- dixi_spec_kit/resources/templates/en/10-engineering/templates/flow-template.md +76 -0
- dixi_spec_kit/resources/templates/en/10-engineering/templates/mcp-server-template.md +72 -0
- dixi_spec_kit/resources/templates/en/10-engineering/templates/module-template.md +70 -0
- dixi_spec_kit/resources/templates/en/10-engineering/templates/page-template.md +60 -0
- dixi_spec_kit/resources/templates/en/10-engineering/templates/postmortem-template.md +73 -0
- dixi_spec_kit/resources/templates/en/10-engineering/templates/product-template.md +66 -0
- dixi_spec_kit/resources/templates/en/10-engineering/templates/prompt-template.md +67 -0
- dixi_spec_kit/resources/templates/en/10-engineering/templates/runbook-template.md +68 -0
- dixi_spec_kit/resources/templates/en/11-quality/acceptance-strategy.md +54 -0
- dixi_spec_kit/resources/templates/en/11-quality/ai-llm-testing-guide.md +53 -0
- dixi_spec_kit/resources/templates/en/11-quality/bdd-guide.md +56 -0
- dixi_spec_kit/resources/templates/en/11-quality/contract-testing-guide.md +50 -0
- dixi_spec_kit/resources/templates/en/11-quality/engineering-metrics.md +46 -0
- dixi_spec_kit/resources/templates/en/11-quality/mutation-testing-guide.md +53 -0
- dixi_spec_kit/resources/templates/en/11-quality/non-functional-requirements.md +47 -0
- dixi_spec_kit/resources/templates/en/11-quality/performance-budgets/api-latency-budgets.md +47 -0
- dixi_spec_kit/resources/templates/en/11-quality/performance-budgets/web-vitals-budgets.md +44 -0
- dixi_spec_kit/resources/templates/en/11-quality/performance-test-plan.md +50 -0
- dixi_spec_kit/resources/templates/en/11-quality/property-based-testing-guide.md +51 -0
- dixi_spec_kit/resources/templates/en/11-quality/quality-strategy.md +51 -0
- dixi_spec_kit/resources/templates/en/11-quality/regression-plan.md +50 -0
- dixi_spec_kit/resources/templates/en/11-quality/risk-based-review.md +46 -0
- dixi_spec_kit/resources/templates/en/11-quality/security-test-plan.md +47 -0
- dixi_spec_kit/resources/templates/en/11-quality/tdd-guide.md +47 -0
- dixi_spec_kit/resources/templates/en/11-quality/test-pyramid.md +49 -0
- dixi_spec_kit/resources/templates/en/11-quality/verification-ladder.md +54 -0
- dixi_spec_kit/resources/templates/en/12-observability/alerting-rules.md +55 -0
- dixi_spec_kit/resources/templates/en/12-observability/dashboard-map.md +43 -0
- dixi_spec_kit/resources/templates/en/12-observability/logging-map.md +47 -0
- dixi_spec_kit/resources/templates/en/12-observability/metrics-catalog.md +53 -0
- dixi_spec_kit/resources/templates/en/12-observability/observability-strategy.md +61 -0
- dixi_spec_kit/resources/templates/en/12-observability/runbooks/README.md +54 -0
- dixi_spec_kit/resources/templates/en/12-observability/slis-slos-slas.md +52 -0
- dixi_spec_kit/resources/templates/en/12-observability/tracing-strategy.md +55 -0
- dixi_spec_kit/resources/templates/en/13-security/ai-agent-hardening.md +55 -0
- dixi_spec_kit/resources/templates/en/13-security/authn-authz-model.md +51 -0
- dixi_spec_kit/resources/templates/en/13-security/break-glass-access.md +51 -0
- dixi_spec_kit/resources/templates/en/13-security/data-protection-controls.md +53 -0
- dixi_spec_kit/resources/templates/en/13-security/dependency-scanning.md +51 -0
- dixi_spec_kit/resources/templates/en/13-security/incident-response.md +58 -0
- dixi_spec_kit/resources/templates/en/13-security/key-rotation.md +51 -0
- dixi_spec_kit/resources/templates/en/13-security/licensing/approved-licenses.md +52 -0
- dixi_spec_kit/resources/templates/en/13-security/licensing/licensing-policy.md +49 -0
- dixi_spec_kit/resources/templates/en/13-security/licensing/sbom-strategy.md +48 -0
- dixi_spec_kit/resources/templates/en/13-security/llm-application-security.md +50 -0
- dixi_spec_kit/resources/templates/en/13-security/risk-register.md +45 -0
- dixi_spec_kit/resources/templates/en/13-security/secret-management.md +55 -0
- dixi_spec_kit/resources/templates/en/13-security/threat-model.md +67 -0
- dixi_spec_kit/resources/templates/en/13-security/vulnerability-management.md +55 -0
- dixi_spec_kit/resources/templates/en/14-delivery/backup-and-recovery.md +43 -0
- dixi_spec_kit/resources/templates/en/14-delivery/ci-cd-overview.md +56 -0
- dixi_spec_kit/resources/templates/en/14-delivery/continuous-verification.md +49 -0
- dixi_spec_kit/resources/templates/en/14-delivery/cron-jobs.md +48 -0
- dixi_spec_kit/resources/templates/en/14-delivery/deployment-strategy.md +49 -0
- dixi_spec_kit/resources/templates/en/14-delivery/disaster-recovery/bcp-plan.md +59 -0
- dixi_spec_kit/resources/templates/en/14-delivery/disaster-recovery/dr-runbook.md +47 -0
- dixi_spec_kit/resources/templates/en/14-delivery/disaster-recovery/dr-strategy.md +51 -0
- dixi_spec_kit/resources/templates/en/14-delivery/disaster-recovery/rto-rpo-matrix.md +45 -0
- dixi_spec_kit/resources/templates/en/14-delivery/environments.md +48 -0
- dixi_spec_kit/resources/templates/en/14-delivery/infra-modules.md +57 -0
- dixi_spec_kit/resources/templates/en/14-delivery/pipelines/build-pipeline.md +51 -0
- dixi_spec_kit/resources/templates/en/14-delivery/pipelines/migration-pipeline.md +48 -0
- dixi_spec_kit/resources/templates/en/14-delivery/pipelines/release-pipeline.md +50 -0
- dixi_spec_kit/resources/templates/en/14-delivery/rollback-strategy.md +50 -0
- dixi_spec_kit/resources/templates/en/14-delivery/workers-and-queues.md +50 -0
- dixi_spec_kit/resources/templates/en/15-operations/escalation-matrix.md +54 -0
- dixi_spec_kit/resources/templates/en/15-operations/incident-levels.md +53 -0
- dixi_spec_kit/resources/templates/en/15-operations/known-issues.md +47 -0
- dixi_spec_kit/resources/templates/en/15-operations/maintenance-window-policy.md +56 -0
- dixi_spec_kit/resources/templates/en/15-operations/playbooks/comms-breach-customer.md +59 -0
- dixi_spec_kit/resources/templates/en/15-operations/playbooks/comms-outage-customer.md +57 -0
- dixi_spec_kit/resources/templates/en/15-operations/playbooks/comms-outage-internal.md +54 -0
- dixi_spec_kit/resources/templates/en/15-operations/playbooks/cost-spike.md +46 -0
- dixi_spec_kit/resources/templates/en/15-operations/playbooks/data-breach.md +53 -0
- dixi_spec_kit/resources/templates/en/15-operations/playbooks/manual-refund.md +51 -0
- dixi_spec_kit/resources/templates/en/15-operations/playbooks/reprocess-events.md +59 -0
- dixi_spec_kit/resources/templates/en/15-operations/playbooks/restore-service.md +54 -0
- dixi_spec_kit/resources/templates/en/15-operations/playbooks/tenant-onboarding.md +56 -0
- dixi_spec_kit/resources/templates/en/15-operations/service-catalog.md +51 -0
- dixi_spec_kit/resources/templates/en/15-operations/support-model.md +56 -0
- dixi_spec_kit/resources/templates/en/15-operations/team/on-call-rotation.md +56 -0
- dixi_spec_kit/resources/templates/en/15-operations/team/raci-matrix.md +57 -0
- dixi_spec_kit/resources/templates/en/15-operations/vendor-management/sla-matrix.md +46 -0
- dixi_spec_kit/resources/templates/en/15-operations/vendor-management/vendor-catalog.md +53 -0
- dixi_spec_kit/resources/templates/en/15-operations/vendor-management/vendor-risk-assessment.md +56 -0
- dixi_spec_kit/resources/templates/en/16-product/analytics-events-catalog.md +68 -0
- dixi_spec_kit/resources/templates/en/16-product/experimentation-framework.md +66 -0
- dixi_spec_kit/resources/templates/en/16-product/feature-lifecycle.md +62 -0
- dixi_spec_kit/resources/templates/en/16-product/prioritization-framework.md +69 -0
- dixi_spec_kit/resources/templates/en/16-product/release-notes.md +74 -0
- dixi_spec_kit/resources/templates/en/16-product/roadmap.md +64 -0
- dixi_spec_kit/resources/templates/en/17-ux/accessibility-standard.md +72 -0
- dixi_spec_kit/resources/templates/en/17-ux/content-guidelines.md +66 -0
- dixi_spec_kit/resources/templates/en/17-ux/design-principles.md +49 -0
- dixi_spec_kit/resources/templates/en/17-ux/design-tokens.md +65 -0
- dixi_spec_kit/resources/templates/en/17-ux/information-architecture.md +70 -0
- dixi_spec_kit/resources/templates/en/17-ux/navigation-map.md +59 -0
- dixi_spec_kit/resources/templates/en/17-ux/ui-state-catalog.md +52 -0
- dixi_spec_kit/resources/templates/en/18-knowledge-base/acronyms.md +66 -0
- dixi_spec_kit/resources/templates/en/18-knowledge-base/decision-log.md +43 -0
- dixi_spec_kit/resources/templates/en/18-knowledge-base/faq.md +55 -0
- dixi_spec_kit/resources/templates/en/18-knowledge-base/glossary.md +53 -0
- dixi_spec_kit/resources/templates/en/18-knowledge-base/maturity-model.md +51 -0
- dixi_spec_kit/resources/templates/en/18-knowledge-base/onboarding-guide.md +64 -0
- dixi_spec_kit/resources/templates/en/18-knowledge-base/troubleshooting-index.md +50 -0
- dixi_spec_kit/resources/templates/en/19-references/reading-list.md +66 -0
- dixi_spec_kit/resources/templates/en/20-repos/README.md +60 -0
- dixi_spec_kit/resources/templates/en/20-repos/backend-service.md +65 -0
- dixi_spec_kit/resources/templates/en/20-repos/frontend-app.md +64 -0
- dixi_spec_kit/resources/templates/en/20-repos/mcp-server.md +61 -0
- dixi_spec_kit/resources/templates/en/20-repos/mobile-app.md +67 -0
- dixi_spec_kit/resources/templates/en/20-repos/worker.md +65 -0
- dixi_spec_kit/resources/templates/en/21-ai/agents/agent-architecture.md +53 -0
- dixi_spec_kit/resources/templates/en/21-ai/agents/capability-matrix.md +49 -0
- dixi_spec_kit/resources/templates/en/21-ai/agents/guardrails.md +51 -0
- dixi_spec_kit/resources/templates/en/21-ai/agents/human-in-the-loop.md +53 -0
- dixi_spec_kit/resources/templates/en/21-ai/governance/ai-audit-trail.md +53 -0
- dixi_spec_kit/resources/templates/en/21-ai/governance/quality-gates.md +49 -0
- dixi_spec_kit/resources/templates/en/21-ai/governance/responsible-ai.md +62 -0
- dixi_spec_kit/resources/templates/en/21-ai/llm/context-strategy.md +54 -0
- dixi_spec_kit/resources/templates/en/21-ai/llm/model-strategy.md +52 -0
- dixi_spec_kit/resources/templates/en/21-ai/llm/prompt-library.md +56 -0
- dixi_spec_kit/resources/templates/en/21-ai/mcp/mcp-architecture.md +46 -0
- dixi_spec_kit/resources/templates/en/21-ai/mcp/tool-catalog.md +44 -0
- dixi_spec_kit/resources/templates/en/21-ai/memory/memory-architecture.md +50 -0
- dixi_spec_kit/resources/templates/en/21-ai/sdd/adoption-guide.md +52 -0
- dixi_spec_kit/resources/templates/en/21-ai/sdd/methodology.md +46 -0
- dixi_spec_kit/resources/templates/en/21-ai/sdd/spec-lifecycle.md +54 -0
- dixi_spec_kit/resources/templates/en/21-ai/sdd/traceability-matrix.md +53 -0
- dixi_spec_kit/resources/templates/en/21-ai/sdd/validation-rules.md +59 -0
- dixi_spec_kit/resources/templates/en/22-finops/ai-cost-management.md +62 -0
- dixi_spec_kit/resources/templates/en/22-finops/budget-alerts.md +53 -0
- dixi_spec_kit/resources/templates/en/22-finops/cloud-cost-optimization.md +64 -0
- dixi_spec_kit/resources/templates/en/22-finops/cost-allocation-model.md +62 -0
- dixi_spec_kit/resources/templates/en/22-finops/cost-strategy.md +55 -0
- dixi_spec_kit/resources/templates/en/22-finops/templates/cost-report-template.md +61 -0
- dixi_spec_kit/resources/templates/en/23-compliance/compliance-overview.md +59 -0
- dixi_spec_kit/resources/templates/en/23-compliance/dpa-template.md +54 -0
- dixi_spec_kit/resources/templates/en/23-compliance/gdpr/gdpr-readiness.md +47 -0
- dixi_spec_kit/resources/templates/en/23-compliance/gdpr/sub-processors.md +42 -0
- dixi_spec_kit/resources/templates/en/23-compliance/hipaa/README.md +47 -0
- dixi_spec_kit/resources/templates/en/23-compliance/iso-27001/controls-mapping.md +47 -0
- dixi_spec_kit/resources/templates/en/23-compliance/iso-27001/isms-policy.md +66 -0
- dixi_spec_kit/resources/templates/en/23-compliance/iso-27001/iso-27001-readiness.md +51 -0
- dixi_spec_kit/resources/templates/en/23-compliance/iso-soc2-overlap-mapping.md +46 -0
- dixi_spec_kit/resources/templates/en/23-compliance/pci-dss/README.md +51 -0
- dixi_spec_kit/resources/templates/en/23-compliance/regulatory-watch.md +52 -0
- dixi_spec_kit/resources/templates/en/23-compliance/soc2/soc2-controls-matrix.md +43 -0
- dixi_spec_kit/resources/templates/en/23-compliance/soc2/soc2-readiness.md +48 -0
- dixi_spec_kit/resources/templates/en/23-compliance/soc2/system-description.md +57 -0
- dixi_spec_kit/resources/templates/en/23-compliance/soc2/type-i-vs-type-ii.md +51 -0
- dixi_spec_kit/resources/templates/en/24-research/competitive-analysis.md +56 -0
- dixi_spec_kit/resources/templates/en/24-research/discovery-strategy.md +67 -0
- dixi_spec_kit/resources/templates/en/24-research/interview-templates/discovery-interview.md +67 -0
- dixi_spec_kit/resources/templates/en/24-research/interview-templates/usability-test.md +75 -0
- dixi_spec_kit/resources/templates/en/24-research/jobs-to-be-done.md +65 -0
- dixi_spec_kit/resources/templates/en/24-research/persona-template.md +71 -0
- dixi_spec_kit/resources/templates/en/24-research/research-log/README.md +62 -0
- dixi_spec_kit/resources/templates/en/24-research/user-research-plan.md +73 -0
- dixi_spec_kit/resources/templates/en/25-growth/ab-testing-framework.md +63 -0
- dixi_spec_kit/resources/templates/en/25-growth/content-strategy.md +62 -0
- dixi_spec_kit/resources/templates/en/25-growth/conversion-funnel.md +60 -0
- dixi_spec_kit/resources/templates/en/25-growth/growth-strategy.md +67 -0
- dixi_spec_kit/resources/templates/en/25-growth/landing-pages-catalog.md +53 -0
- dixi_spec_kit/resources/templates/en/25-growth/seo-strategy.md +60 -0
- dixi_spec_kit/resources/templates/en/26-customer-success/churn-playbook.md +64 -0
- dixi_spec_kit/resources/templates/en/26-customer-success/help-center-structure.md +68 -0
- dixi_spec_kit/resources/templates/en/26-customer-success/success-strategy.md +61 -0
- dixi_spec_kit/resources/templates/en/26-customer-success/support-tiers.md +66 -0
- dixi_spec_kit/resources/templates/en/27-fixtures/demo-scenarios.md +58 -0
- dixi_spec_kit/resources/templates/en/27-fixtures/fixtures-strategy.md +54 -0
- dixi_spec_kit/resources/templates/en/27-fixtures/sample-data-catalog.md +58 -0
- dixi_spec_kit/resources/templates/en/28-due-diligence/checklist/01-infrastructure.md +49 -0
- dixi_spec_kit/resources/templates/en/28-due-diligence/checklist/02-architecture.md +50 -0
- dixi_spec_kit/resources/templates/en/28-due-diligence/checklist/03-source-code.md +52 -0
- dixi_spec_kit/resources/templates/en/28-due-diligence/checklist/04-security.md +52 -0
- dixi_spec_kit/resources/templates/en/28-due-diligence/checklist/05-data-management.md +51 -0
- dixi_spec_kit/resources/templates/en/28-due-diligence/checklist/06-processes.md +50 -0
- dixi_spec_kit/resources/templates/en/28-due-diligence/checklist/07-team.md +53 -0
- dixi_spec_kit/resources/templates/en/28-due-diligence/checklist/08-financial.md +49 -0
- dixi_spec_kit/resources/templates/en/28-due-diligence/checklist/09-vendors-partners.md +54 -0
- dixi_spec_kit/resources/templates/en/28-due-diligence/checklist/10-innovation.md +47 -0
- dixi_spec_kit/resources/templates/en/28-due-diligence/checklist/11-final-report.md +52 -0
- dixi_spec_kit/resources/templates/en/28-due-diligence/dd-report-template.md +66 -0
- dixi_spec_kit/resources/templates/en/28-due-diligence/dd-strategy.md +66 -0
- dixi_spec_kit/resources/templates/en/28-due-diligence/playbooks/buyer-dd-playbook.md +51 -0
- dixi_spec_kit/resources/templates/en/28-due-diligence/playbooks/enterprise-customer-dd-playbook.md +53 -0
- dixi_spec_kit/resources/templates/en/28-due-diligence/playbooks/internal-audit-dd-playbook.md +53 -0
- dixi_spec_kit/resources/templates/en/28-due-diligence/playbooks/vendor-dd-playbook.md +52 -0
- dixi_spec_kit/resources/templates/es/00-governance/ai-governance.md +61 -0
- dixi_spec_kit/resources/templates/es/00-governance/data-governance.md +64 -0
- dixi_spec_kit/resources/templates/es/00-governance/engineering-standards.md +55 -0
- dixi_spec_kit/resources/templates/es/00-governance/environment-strategy.md +56 -0
- dixi_spec_kit/resources/templates/es/00-governance/integration-governance.md +55 -0
- dixi_spec_kit/resources/templates/es/00-governance/observability-standard.md +58 -0
- dixi_spec_kit/resources/templates/es/00-governance/policies/ai-usage-policy.md +61 -0
- dixi_spec_kit/resources/templates/es/00-governance/policies/branching-strategy.md +57 -0
- dixi_spec_kit/resources/templates/es/00-governance/policies/dependency-policy.md +53 -0
- dixi_spec_kit/resources/templates/es/00-governance/policies/documentation-policy.md +70 -0
- dixi_spec_kit/resources/templates/es/00-governance/policies/i18n-policy.md +54 -0
- dixi_spec_kit/resources/templates/es/00-governance/policies/incident-policy.md +63 -0
- dixi_spec_kit/resources/templates/es/00-governance/policies/naming-conventions.md +59 -0
- dixi_spec_kit/resources/templates/es/00-governance/policies/testing-policy.md +52 -0
- dixi_spec_kit/resources/templates/es/00-governance/policies/versioning-policy.md +50 -0
- dixi_spec_kit/resources/templates/es/00-governance/principles.md +66 -0
- dixi_spec_kit/resources/templates/es/00-governance/release-management-standard.md +55 -0
- dixi_spec_kit/resources/templates/es/00-governance/security-baseline.md +70 -0
- dixi_spec_kit/resources/templates/es/01-business/actors/external-partners.md +44 -0
- dixi_spec_kit/resources/templates/es/01-business/actors/internal-roles.md +46 -0
- dixi_spec_kit/resources/templates/es/01-business/actors/personas.md +51 -0
- dixi_spec_kit/resources/templates/es/01-business/domains/bounded-context-map.md +57 -0
- dixi_spec_kit/resources/templates/es/01-business/domains/business-capabilities.md +44 -0
- dixi_spec_kit/resources/templates/es/01-business/domains/domain-map.md +53 -0
- dixi_spec_kit/resources/templates/es/01-business/domains/ubiquitous-language.md +50 -0
- dixi_spec_kit/resources/templates/es/01-business/rules/business-rules.md +52 -0
- dixi_spec_kit/resources/templates/es/01-business/rules/compliance-rules.md +53 -0
- dixi_spec_kit/resources/templates/es/01-business/rules/operational-constraints.md +50 -0
- dixi_spec_kit/resources/templates/es/01-business/rules/pricing-rules.md +54 -0
- dixi_spec_kit/resources/templates/es/01-business/strategic-goals.md +57 -0
- dixi_spec_kit/resources/templates/es/01-business/value-proposition.md +54 -0
- dixi_spec_kit/resources/templates/es/02-platform/cross-product-integrations.md +50 -0
- dixi_spec_kit/resources/templates/es/02-platform/ecosystem-landscape.md +54 -0
- dixi_spec_kit/resources/templates/es/02-platform/identity-and-access-strategy.md +51 -0
- dixi_spec_kit/resources/templates/es/02-platform/platform-overview.md +58 -0
- dixi_spec_kit/resources/templates/es/02-platform/product-map.md +56 -0
- dixi_spec_kit/resources/templates/es/02-platform/products/README.md +48 -0
- dixi_spec_kit/resources/templates/es/02-platform/shared-services-map.md +53 -0
- dixi_spec_kit/resources/templates/es/02-platform/tenant-strategy.md +53 -0
- dixi_spec_kit/resources/templates/es/06-flows/README.md +50 -0
- dixi_spec_kit/resources/templates/es/07-contracts/agent-interfaces/README.md +58 -0
- dixi_spec_kit/resources/templates/es/07-contracts/api/README.md +53 -0
- dixi_spec_kit/resources/templates/es/07-contracts/commands/README.md +53 -0
- dixi_spec_kit/resources/templates/es/07-contracts/events/README.md +54 -0
- dixi_spec_kit/resources/templates/es/07-contracts/external/README.md +48 -0
- dixi_spec_kit/resources/templates/es/07-contracts/mcp/README.md +52 -0
- dixi_spec_kit/resources/templates/es/07-contracts/schemas/README.md +53 -0
- dixi_spec_kit/resources/templates/es/08-data/audit-fields-standard.md +61 -0
- dixi_spec_kit/resources/templates/es/08-data/canonical-data-model.md +67 -0
- dixi_spec_kit/resources/templates/es/08-data/data-architecture.md +65 -0
- dixi_spec_kit/resources/templates/es/08-data/master-data.md +56 -0
- dixi_spec_kit/resources/templates/es/08-data/migrations/data-migration-playbook.md +76 -0
- dixi_spec_kit/resources/templates/es/08-data/migrations/migration-strategy.md +69 -0
- dixi_spec_kit/resources/templates/es/08-data/migrations/zero-downtime-migrations.md +62 -0
- dixi_spec_kit/resources/templates/es/08-data/models/erd-overview.md +56 -0
- dixi_spec_kit/resources/templates/es/08-data/pii-classification.md +62 -0
- dixi_spec_kit/resources/templates/es/08-data/reporting-dimensions.md +55 -0
- dixi_spec_kit/resources/templates/es/08-data/retention-policy.md +59 -0
- dixi_spec_kit/resources/templates/es/09-architecture/adr/README.md +54 -0
- dixi_spec_kit/resources/templates/es/09-architecture/component-diagram.md +52 -0
- dixi_spec_kit/resources/templates/es/09-architecture/container-diagram.md +56 -0
- dixi_spec_kit/resources/templates/es/09-architecture/deployment-architecture.md +62 -0
- dixi_spec_kit/resources/templates/es/09-architecture/event-architecture.md +59 -0
- dixi_spec_kit/resources/templates/es/09-architecture/integration-architecture.md +56 -0
- dixi_spec_kit/resources/templates/es/09-architecture/multi-tenant-architecture.md +58 -0
- dixi_spec_kit/resources/templates/es/09-architecture/offline-sync-architecture.md +63 -0
- dixi_spec_kit/resources/templates/es/09-architecture/performance-architecture.md +50 -0
- dixi_spec_kit/resources/templates/es/09-architecture/resilience-architecture.md +52 -0
- dixi_spec_kit/resources/templates/es/09-architecture/security-architecture.md +64 -0
- dixi_spec_kit/resources/templates/es/09-architecture/system-context.md +54 -0
- dixi_spec_kit/resources/templates/es/10-engineering/api-design-standard.md +61 -0
- dixi_spec_kit/resources/templates/es/10-engineering/coding-standards.md +63 -0
- dixi_spec_kit/resources/templates/es/10-engineering/error-handling-standard.md +57 -0
- dixi_spec_kit/resources/templates/es/10-engineering/event-design-standard.md +60 -0
- dixi_spec_kit/resources/templates/es/10-engineering/logging-standard.md +59 -0
- dixi_spec_kit/resources/templates/es/10-engineering/package-structure-standard.md +56 -0
- dixi_spec_kit/resources/templates/es/10-engineering/secure-coding-standard.md +54 -0
- dixi_spec_kit/resources/templates/es/10-engineering/templates/adr-template.md +69 -0
- dixi_spec_kit/resources/templates/es/10-engineering/templates/agent-spec-template.md +71 -0
- dixi_spec_kit/resources/templates/es/10-engineering/templates/api-template.yaml +158 -0
- dixi_spec_kit/resources/templates/es/10-engineering/templates/domain-template.md +66 -0
- dixi_spec_kit/resources/templates/es/10-engineering/templates/event-template.json +19 -0
- dixi_spec_kit/resources/templates/es/10-engineering/templates/external-integration-template.md +72 -0
- dixi_spec_kit/resources/templates/es/10-engineering/templates/feature-template.md +75 -0
- dixi_spec_kit/resources/templates/es/10-engineering/templates/flow-template.md +76 -0
- dixi_spec_kit/resources/templates/es/10-engineering/templates/mcp-server-template.md +72 -0
- dixi_spec_kit/resources/templates/es/10-engineering/templates/module-template.md +70 -0
- dixi_spec_kit/resources/templates/es/10-engineering/templates/page-template.md +60 -0
- dixi_spec_kit/resources/templates/es/10-engineering/templates/postmortem-template.md +73 -0
- dixi_spec_kit/resources/templates/es/10-engineering/templates/product-template.md +66 -0
- dixi_spec_kit/resources/templates/es/10-engineering/templates/prompt-template.md +67 -0
- dixi_spec_kit/resources/templates/es/10-engineering/templates/runbook-template.md +69 -0
- dixi_spec_kit/resources/templates/es/11-quality/acceptance-strategy.md +54 -0
- dixi_spec_kit/resources/templates/es/11-quality/ai-llm-testing-guide.md +53 -0
- dixi_spec_kit/resources/templates/es/11-quality/bdd-guide.md +56 -0
- dixi_spec_kit/resources/templates/es/11-quality/contract-testing-guide.md +50 -0
- dixi_spec_kit/resources/templates/es/11-quality/engineering-metrics.md +46 -0
- dixi_spec_kit/resources/templates/es/11-quality/mutation-testing-guide.md +53 -0
- dixi_spec_kit/resources/templates/es/11-quality/non-functional-requirements.md +47 -0
- dixi_spec_kit/resources/templates/es/11-quality/performance-budgets/api-latency-budgets.md +47 -0
- dixi_spec_kit/resources/templates/es/11-quality/performance-budgets/web-vitals-budgets.md +44 -0
- dixi_spec_kit/resources/templates/es/11-quality/performance-test-plan.md +50 -0
- dixi_spec_kit/resources/templates/es/11-quality/property-based-testing-guide.md +51 -0
- dixi_spec_kit/resources/templates/es/11-quality/quality-strategy.md +51 -0
- dixi_spec_kit/resources/templates/es/11-quality/regression-plan.md +50 -0
- dixi_spec_kit/resources/templates/es/11-quality/risk-based-review.md +46 -0
- dixi_spec_kit/resources/templates/es/11-quality/security-test-plan.md +47 -0
- dixi_spec_kit/resources/templates/es/11-quality/tdd-guide.md +47 -0
- dixi_spec_kit/resources/templates/es/11-quality/test-pyramid.md +49 -0
- dixi_spec_kit/resources/templates/es/11-quality/verification-ladder.md +54 -0
- dixi_spec_kit/resources/templates/es/12-observability/alerting-rules.md +55 -0
- dixi_spec_kit/resources/templates/es/12-observability/dashboard-map.md +43 -0
- dixi_spec_kit/resources/templates/es/12-observability/logging-map.md +47 -0
- dixi_spec_kit/resources/templates/es/12-observability/metrics-catalog.md +53 -0
- dixi_spec_kit/resources/templates/es/12-observability/observability-strategy.md +61 -0
- dixi_spec_kit/resources/templates/es/12-observability/runbooks/README.md +54 -0
- dixi_spec_kit/resources/templates/es/12-observability/slis-slos-slas.md +52 -0
- dixi_spec_kit/resources/templates/es/12-observability/tracing-strategy.md +55 -0
- dixi_spec_kit/resources/templates/es/13-security/ai-agent-hardening.md +55 -0
- dixi_spec_kit/resources/templates/es/13-security/authn-authz-model.md +51 -0
- dixi_spec_kit/resources/templates/es/13-security/break-glass-access.md +51 -0
- dixi_spec_kit/resources/templates/es/13-security/data-protection-controls.md +53 -0
- dixi_spec_kit/resources/templates/es/13-security/dependency-scanning.md +51 -0
- dixi_spec_kit/resources/templates/es/13-security/incident-response.md +58 -0
- dixi_spec_kit/resources/templates/es/13-security/key-rotation.md +51 -0
- dixi_spec_kit/resources/templates/es/13-security/licensing/approved-licenses.md +52 -0
- dixi_spec_kit/resources/templates/es/13-security/licensing/licensing-policy.md +49 -0
- dixi_spec_kit/resources/templates/es/13-security/licensing/sbom-strategy.md +48 -0
- dixi_spec_kit/resources/templates/es/13-security/llm-application-security.md +50 -0
- dixi_spec_kit/resources/templates/es/13-security/risk-register.md +45 -0
- dixi_spec_kit/resources/templates/es/13-security/secret-management.md +55 -0
- dixi_spec_kit/resources/templates/es/13-security/threat-model.md +67 -0
- dixi_spec_kit/resources/templates/es/13-security/vulnerability-management.md +55 -0
- dixi_spec_kit/resources/templates/es/14-delivery/backup-and-recovery.md +43 -0
- dixi_spec_kit/resources/templates/es/14-delivery/ci-cd-overview.md +56 -0
- dixi_spec_kit/resources/templates/es/14-delivery/continuous-verification.md +49 -0
- dixi_spec_kit/resources/templates/es/14-delivery/cron-jobs.md +48 -0
- dixi_spec_kit/resources/templates/es/14-delivery/deployment-strategy.md +49 -0
- dixi_spec_kit/resources/templates/es/14-delivery/disaster-recovery/bcp-plan.md +59 -0
- dixi_spec_kit/resources/templates/es/14-delivery/disaster-recovery/dr-runbook.md +47 -0
- dixi_spec_kit/resources/templates/es/14-delivery/disaster-recovery/dr-strategy.md +51 -0
- dixi_spec_kit/resources/templates/es/14-delivery/disaster-recovery/rto-rpo-matrix.md +45 -0
- dixi_spec_kit/resources/templates/es/14-delivery/environments.md +48 -0
- dixi_spec_kit/resources/templates/es/14-delivery/infra-modules.md +57 -0
- dixi_spec_kit/resources/templates/es/14-delivery/pipelines/build-pipeline.md +51 -0
- dixi_spec_kit/resources/templates/es/14-delivery/pipelines/migration-pipeline.md +48 -0
- dixi_spec_kit/resources/templates/es/14-delivery/pipelines/release-pipeline.md +50 -0
- dixi_spec_kit/resources/templates/es/14-delivery/rollback-strategy.md +50 -0
- dixi_spec_kit/resources/templates/es/14-delivery/workers-and-queues.md +50 -0
- dixi_spec_kit/resources/templates/es/15-operations/escalation-matrix.md +54 -0
- dixi_spec_kit/resources/templates/es/15-operations/incident-levels.md +53 -0
- dixi_spec_kit/resources/templates/es/15-operations/known-issues.md +47 -0
- dixi_spec_kit/resources/templates/es/15-operations/maintenance-window-policy.md +56 -0
- dixi_spec_kit/resources/templates/es/15-operations/playbooks/comms-breach-customer.md +59 -0
- dixi_spec_kit/resources/templates/es/15-operations/playbooks/comms-outage-customer.md +57 -0
- dixi_spec_kit/resources/templates/es/15-operations/playbooks/comms-outage-internal.md +54 -0
- dixi_spec_kit/resources/templates/es/15-operations/playbooks/cost-spike.md +46 -0
- dixi_spec_kit/resources/templates/es/15-operations/playbooks/data-breach.md +53 -0
- dixi_spec_kit/resources/templates/es/15-operations/playbooks/manual-refund.md +51 -0
- dixi_spec_kit/resources/templates/es/15-operations/playbooks/reprocess-events.md +59 -0
- dixi_spec_kit/resources/templates/es/15-operations/playbooks/restore-service.md +54 -0
- dixi_spec_kit/resources/templates/es/15-operations/playbooks/tenant-onboarding.md +56 -0
- dixi_spec_kit/resources/templates/es/15-operations/service-catalog.md +51 -0
- dixi_spec_kit/resources/templates/es/15-operations/support-model.md +56 -0
- dixi_spec_kit/resources/templates/es/15-operations/team/on-call-rotation.md +56 -0
- dixi_spec_kit/resources/templates/es/15-operations/team/raci-matrix.md +57 -0
- dixi_spec_kit/resources/templates/es/15-operations/vendor-management/sla-matrix.md +46 -0
- dixi_spec_kit/resources/templates/es/15-operations/vendor-management/vendor-catalog.md +53 -0
- dixi_spec_kit/resources/templates/es/15-operations/vendor-management/vendor-risk-assessment.md +56 -0
- dixi_spec_kit/resources/templates/es/16-product/analytics-events-catalog.md +69 -0
- dixi_spec_kit/resources/templates/es/16-product/experimentation-framework.md +66 -0
- dixi_spec_kit/resources/templates/es/16-product/feature-lifecycle.md +62 -0
- dixi_spec_kit/resources/templates/es/16-product/prioritization-framework.md +69 -0
- dixi_spec_kit/resources/templates/es/16-product/release-notes.md +74 -0
- dixi_spec_kit/resources/templates/es/16-product/roadmap.md +64 -0
- dixi_spec_kit/resources/templates/es/17-ux/accessibility-standard.md +72 -0
- dixi_spec_kit/resources/templates/es/17-ux/content-guidelines.md +66 -0
- dixi_spec_kit/resources/templates/es/17-ux/design-principles.md +49 -0
- dixi_spec_kit/resources/templates/es/17-ux/design-tokens.md +65 -0
- dixi_spec_kit/resources/templates/es/17-ux/information-architecture.md +70 -0
- dixi_spec_kit/resources/templates/es/17-ux/navigation-map.md +59 -0
- dixi_spec_kit/resources/templates/es/17-ux/ui-state-catalog.md +52 -0
- dixi_spec_kit/resources/templates/es/18-knowledge-base/acronyms.md +66 -0
- dixi_spec_kit/resources/templates/es/18-knowledge-base/decision-log.md +43 -0
- dixi_spec_kit/resources/templates/es/18-knowledge-base/faq.md +55 -0
- dixi_spec_kit/resources/templates/es/18-knowledge-base/glossary.md +53 -0
- dixi_spec_kit/resources/templates/es/18-knowledge-base/maturity-model.md +51 -0
- dixi_spec_kit/resources/templates/es/18-knowledge-base/onboarding-guide.md +64 -0
- dixi_spec_kit/resources/templates/es/18-knowledge-base/troubleshooting-index.md +50 -0
- dixi_spec_kit/resources/templates/es/19-references/reading-list.md +66 -0
- dixi_spec_kit/resources/templates/es/20-repos/README.md +60 -0
- dixi_spec_kit/resources/templates/es/20-repos/backend-service.md +65 -0
- dixi_spec_kit/resources/templates/es/20-repos/frontend-app.md +64 -0
- dixi_spec_kit/resources/templates/es/20-repos/mcp-server.md +61 -0
- dixi_spec_kit/resources/templates/es/20-repos/mobile-app.md +67 -0
- dixi_spec_kit/resources/templates/es/20-repos/worker.md +65 -0
- dixi_spec_kit/resources/templates/es/21-ai/agents/agent-architecture.md +53 -0
- dixi_spec_kit/resources/templates/es/21-ai/agents/capability-matrix.md +49 -0
- dixi_spec_kit/resources/templates/es/21-ai/agents/guardrails.md +51 -0
- dixi_spec_kit/resources/templates/es/21-ai/agents/human-in-the-loop.md +53 -0
- dixi_spec_kit/resources/templates/es/21-ai/governance/ai-audit-trail.md +53 -0
- dixi_spec_kit/resources/templates/es/21-ai/governance/quality-gates.md +49 -0
- dixi_spec_kit/resources/templates/es/21-ai/governance/responsible-ai.md +62 -0
- dixi_spec_kit/resources/templates/es/21-ai/llm/context-strategy.md +54 -0
- dixi_spec_kit/resources/templates/es/21-ai/llm/model-strategy.md +52 -0
- dixi_spec_kit/resources/templates/es/21-ai/llm/prompt-library.md +56 -0
- dixi_spec_kit/resources/templates/es/21-ai/mcp/mcp-architecture.md +46 -0
- dixi_spec_kit/resources/templates/es/21-ai/mcp/tool-catalog.md +44 -0
- dixi_spec_kit/resources/templates/es/21-ai/memory/memory-architecture.md +50 -0
- dixi_spec_kit/resources/templates/es/21-ai/sdd/adoption-guide.md +52 -0
- dixi_spec_kit/resources/templates/es/21-ai/sdd/methodology.md +46 -0
- dixi_spec_kit/resources/templates/es/21-ai/sdd/spec-lifecycle.md +54 -0
- dixi_spec_kit/resources/templates/es/21-ai/sdd/traceability-matrix.md +53 -0
- dixi_spec_kit/resources/templates/es/21-ai/sdd/validation-rules.md +59 -0
- dixi_spec_kit/resources/templates/es/22-finops/ai-cost-management.md +62 -0
- dixi_spec_kit/resources/templates/es/22-finops/budget-alerts.md +53 -0
- dixi_spec_kit/resources/templates/es/22-finops/cloud-cost-optimization.md +64 -0
- dixi_spec_kit/resources/templates/es/22-finops/cost-allocation-model.md +62 -0
- dixi_spec_kit/resources/templates/es/22-finops/cost-strategy.md +55 -0
- dixi_spec_kit/resources/templates/es/22-finops/templates/cost-report-template.md +61 -0
- dixi_spec_kit/resources/templates/es/23-compliance/compliance-overview.md +59 -0
- dixi_spec_kit/resources/templates/es/23-compliance/dpa-template.md +54 -0
- dixi_spec_kit/resources/templates/es/23-compliance/gdpr/gdpr-readiness.md +47 -0
- dixi_spec_kit/resources/templates/es/23-compliance/gdpr/sub-processors.md +42 -0
- dixi_spec_kit/resources/templates/es/23-compliance/hipaa/README.md +47 -0
- dixi_spec_kit/resources/templates/es/23-compliance/iso-27001/controls-mapping.md +47 -0
- dixi_spec_kit/resources/templates/es/23-compliance/iso-27001/isms-policy.md +66 -0
- dixi_spec_kit/resources/templates/es/23-compliance/iso-27001/iso-27001-readiness.md +51 -0
- dixi_spec_kit/resources/templates/es/23-compliance/iso-soc2-overlap-mapping.md +46 -0
- dixi_spec_kit/resources/templates/es/23-compliance/pci-dss/README.md +51 -0
- dixi_spec_kit/resources/templates/es/23-compliance/regulatory-watch.md +52 -0
- dixi_spec_kit/resources/templates/es/23-compliance/soc2/soc2-controls-matrix.md +43 -0
- dixi_spec_kit/resources/templates/es/23-compliance/soc2/soc2-readiness.md +48 -0
- dixi_spec_kit/resources/templates/es/23-compliance/soc2/system-description.md +57 -0
- dixi_spec_kit/resources/templates/es/23-compliance/soc2/type-i-vs-type-ii.md +51 -0
- dixi_spec_kit/resources/templates/es/24-research/competitive-analysis.md +56 -0
- dixi_spec_kit/resources/templates/es/24-research/discovery-strategy.md +67 -0
- dixi_spec_kit/resources/templates/es/24-research/interview-templates/discovery-interview.md +67 -0
- dixi_spec_kit/resources/templates/es/24-research/interview-templates/usability-test.md +75 -0
- dixi_spec_kit/resources/templates/es/24-research/jobs-to-be-done.md +65 -0
- dixi_spec_kit/resources/templates/es/24-research/persona-template.md +71 -0
- dixi_spec_kit/resources/templates/es/24-research/research-log/README.md +62 -0
- dixi_spec_kit/resources/templates/es/24-research/user-research-plan.md +73 -0
- dixi_spec_kit/resources/templates/es/25-growth/ab-testing-framework.md +63 -0
- dixi_spec_kit/resources/templates/es/25-growth/content-strategy.md +62 -0
- dixi_spec_kit/resources/templates/es/25-growth/conversion-funnel.md +60 -0
- dixi_spec_kit/resources/templates/es/25-growth/growth-strategy.md +67 -0
- dixi_spec_kit/resources/templates/es/25-growth/landing-pages-catalog.md +53 -0
- dixi_spec_kit/resources/templates/es/25-growth/seo-strategy.md +60 -0
- dixi_spec_kit/resources/templates/es/26-customer-success/churn-playbook.md +64 -0
- dixi_spec_kit/resources/templates/es/26-customer-success/help-center-structure.md +68 -0
- dixi_spec_kit/resources/templates/es/26-customer-success/success-strategy.md +61 -0
- dixi_spec_kit/resources/templates/es/26-customer-success/support-tiers.md +66 -0
- dixi_spec_kit/resources/templates/es/27-fixtures/demo-scenarios.md +58 -0
- dixi_spec_kit/resources/templates/es/27-fixtures/fixtures-strategy.md +54 -0
- dixi_spec_kit/resources/templates/es/27-fixtures/sample-data-catalog.md +58 -0
- dixi_spec_kit/resources/templates/es/28-due-diligence/checklist/01-infrastructure.md +49 -0
- dixi_spec_kit/resources/templates/es/28-due-diligence/checklist/02-architecture.md +50 -0
- dixi_spec_kit/resources/templates/es/28-due-diligence/checklist/03-source-code.md +52 -0
- dixi_spec_kit/resources/templates/es/28-due-diligence/checklist/04-security.md +52 -0
- dixi_spec_kit/resources/templates/es/28-due-diligence/checklist/05-data-management.md +51 -0
- dixi_spec_kit/resources/templates/es/28-due-diligence/checklist/06-processes.md +50 -0
- dixi_spec_kit/resources/templates/es/28-due-diligence/checklist/07-team.md +53 -0
- dixi_spec_kit/resources/templates/es/28-due-diligence/checklist/08-financial.md +49 -0
- dixi_spec_kit/resources/templates/es/28-due-diligence/checklist/09-vendors-partners.md +54 -0
- dixi_spec_kit/resources/templates/es/28-due-diligence/checklist/10-innovation.md +47 -0
- dixi_spec_kit/resources/templates/es/28-due-diligence/checklist/11-final-report.md +52 -0
- dixi_spec_kit/resources/templates/es/28-due-diligence/dd-report-template.md +66 -0
- dixi_spec_kit/resources/templates/es/28-due-diligence/dd-strategy.md +66 -0
- dixi_spec_kit/resources/templates/es/28-due-diligence/playbooks/buyer-dd-playbook.md +51 -0
- dixi_spec_kit/resources/templates/es/28-due-diligence/playbooks/enterprise-customer-dd-playbook.md +53 -0
- dixi_spec_kit/resources/templates/es/28-due-diligence/playbooks/internal-audit-dd-playbook.md +53 -0
- dixi_spec_kit/resources/templates/es/28-due-diligence/playbooks/vendor-dd-playbook.md +52 -0
- dixi_spec_kit/resources/workflows.en.json +77 -0
- dixi_spec_kit/resources/workflows.es.json +77 -0
- dixi_spec_kit/resources/workflows.json +85 -0
- dixi_spec_kit/upgrade.py +54 -0
- dixi_spec_kit/workflows.py +96 -0
- dixi_spec_kit-1.5.0.dist-info/METADATA +44 -0
- dixi_spec_kit-1.5.0.dist-info/RECORD +690 -0
- dixi_spec_kit-1.5.0.dist-info/WHEEL +5 -0
- dixi_spec_kit-1.5.0.dist-info/entry_points.txt +2 -0
- dixi_spec_kit-1.5.0.dist-info/licenses/src/dixi_spec_kit/LICENSE +21 -0
- dixi_spec_kit-1.5.0.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "1.5.0"
|
dixi_spec_kit/cli.py
ADDED
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
import argparse
|
|
2
|
+
from importlib.resources import files
|
|
3
|
+
import json
|
|
4
|
+
from pathlib import Path
|
|
5
|
+
import sys
|
|
6
|
+
|
|
7
|
+
from . import __version__
|
|
8
|
+
from .core import METADATA, PROFILES, check_project, doctor, initialize, message, placeholders, pr_size
|
|
9
|
+
from .filesystem import Issue, read_json, root_directory
|
|
10
|
+
from .upgrade import STATUSES, plan as upgrade_plan
|
|
11
|
+
from .workflows import OPERATIONS, workflow_result
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class Parser(argparse.ArgumentParser):
|
|
15
|
+
def error(self, message):
|
|
16
|
+
raise Issue("invalid_arguments", 2)
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def parser_for(catalog):
|
|
20
|
+
class Formatter(argparse.HelpFormatter):
|
|
21
|
+
def _format_usage(self, usage, actions, groups, prefix):
|
|
22
|
+
return super()._format_usage(usage, actions, groups, prefix or catalog["usage"])
|
|
23
|
+
|
|
24
|
+
parser = Parser(prog="dixi", description=catalog["description"], add_help=False, formatter_class=Formatter)
|
|
25
|
+
parser._positionals.title = catalog["arguments"]
|
|
26
|
+
parser._optionals.title = catalog["options"]
|
|
27
|
+
parser.add_argument("--help", "-h", action="help", help=catalog["help"])
|
|
28
|
+
parser.add_argument("--version", action="version", version=f"dixi {__version__}", help=catalog["version"])
|
|
29
|
+
parser.add_argument("--lang", choices=("es", "en"), default=None, help=catalog["lang"])
|
|
30
|
+
parser.add_argument("--json", action="store_true", help=catalog["json"])
|
|
31
|
+
commands = parser.add_subparsers(dest="command", required=True, title=catalog["commands"])
|
|
32
|
+
for command in ("init", "doctor", "check", "workflow", "upgrade", "placeholders", "pr-size"):
|
|
33
|
+
child = commands.add_parser(command, help=catalog[command], description=catalog[command],
|
|
34
|
+
add_help=False, formatter_class=Formatter)
|
|
35
|
+
child._positionals.title = catalog["arguments"]
|
|
36
|
+
child._optionals.title = catalog["options"]
|
|
37
|
+
child.add_argument("--help", "-h", action="help", help=catalog["help"])
|
|
38
|
+
if command == "init":
|
|
39
|
+
child.add_argument("directory", help=catalog["directory"])
|
|
40
|
+
child.add_argument("--agent", choices=("none", "claude", "codex"), default="none", help=catalog["agent"])
|
|
41
|
+
child.add_argument("--profile", choices=PROFILES, default="minimal", help=catalog["profile_option"])
|
|
42
|
+
child.add_argument("--regulated", action="store_true", help=catalog["regulated_option"])
|
|
43
|
+
child.add_argument("--controls", action="store_true", help=catalog["controls_option"])
|
|
44
|
+
elif command == "placeholders":
|
|
45
|
+
child.add_argument("--strict", action="store_true", help=catalog["placeholders_strict"])
|
|
46
|
+
elif command == "pr-size":
|
|
47
|
+
child.add_argument("--base", default="main", help=catalog["pr_size_base"])
|
|
48
|
+
child.add_argument("--max", type=int, default=1500, dest="limit", help=catalog["pr_size_max"])
|
|
49
|
+
elif command == "upgrade":
|
|
50
|
+
child.add_argument("--dry-run", action="store_true", help=catalog["upgrade_dry_run"])
|
|
51
|
+
child.add_argument("--profile", choices=PROFILES, default=None, help=catalog["profile_option"])
|
|
52
|
+
child.add_argument("--regulated", action="store_true", default=None, help=catalog["regulated_option"])
|
|
53
|
+
child.add_argument("--controls", action="store_true", default=None, help=catalog["controls_option"])
|
|
54
|
+
elif command == "workflow":
|
|
55
|
+
actions = child.add_subparsers(dest="workflow_action", required=True, title=catalog["commands"])
|
|
56
|
+
for action in ("list", "show", "prepare"):
|
|
57
|
+
operation = actions.add_parser(action, help=catalog[f"workflow_{action}"], add_help=False,
|
|
58
|
+
description=catalog[f"workflow_{action}"], formatter_class=Formatter)
|
|
59
|
+
operation._positionals.title = catalog["arguments"]
|
|
60
|
+
operation._optionals.title = catalog["options"]
|
|
61
|
+
operation.add_argument("--help", "-h", action="help", help=catalog["help"])
|
|
62
|
+
if action != "list":
|
|
63
|
+
operation.add_argument("operation", choices=OPERATIONS, help=catalog["workflow_operation"])
|
|
64
|
+
if action == "prepare":
|
|
65
|
+
operation.add_argument("--target", required=True, help=catalog["workflow_target"])
|
|
66
|
+
operation.add_argument("--request", required=True, help=catalog["workflow_request"])
|
|
67
|
+
return parser
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
def project_language():
|
|
71
|
+
try:
|
|
72
|
+
with root_directory(Path.cwd()) as root:
|
|
73
|
+
language = read_json(root, METADATA).get("language")
|
|
74
|
+
except (Issue, OSError, AttributeError):
|
|
75
|
+
return None
|
|
76
|
+
return language if language in ("es", "en") else None
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
def subcommand(argv):
|
|
80
|
+
skip = False
|
|
81
|
+
for arg in argv:
|
|
82
|
+
if skip:
|
|
83
|
+
skip = False
|
|
84
|
+
elif arg == "--lang":
|
|
85
|
+
skip = True
|
|
86
|
+
elif not arg.startswith("-"):
|
|
87
|
+
return arg
|
|
88
|
+
return None
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
def main(argv=None):
|
|
92
|
+
argv = list(sys.argv[1:] if argv is None else argv)
|
|
93
|
+
language = None
|
|
94
|
+
for index, arg in enumerate(argv):
|
|
95
|
+
if arg == "--lang" and index + 1 < len(argv) and argv[index + 1] in ("es", "en"):
|
|
96
|
+
language = argv[index + 1]
|
|
97
|
+
elif arg in ("--lang=es", "--lang=en"):
|
|
98
|
+
language = arg.split("=", 1)[1]
|
|
99
|
+
if language is None and subcommand(argv) != "init":
|
|
100
|
+
language = project_language()
|
|
101
|
+
language = language or "en"
|
|
102
|
+
catalog = json.loads(files("dixi_spec_kit").joinpath("locales", f"{language}.json").read_text(encoding="utf-8"))
|
|
103
|
+
code = 0
|
|
104
|
+
workflow = None
|
|
105
|
+
upgrade = None
|
|
106
|
+
extra = {}
|
|
107
|
+
try:
|
|
108
|
+
args = parser_for(catalog).parse_args(argv)
|
|
109
|
+
args.lang = args.lang or language
|
|
110
|
+
if args.command == "init":
|
|
111
|
+
messages = initialize(args.directory, args.lang, args.agent, args.profile, args.regulated, args.controls)
|
|
112
|
+
elif args.command == "doctor":
|
|
113
|
+
messages = doctor(Path.cwd(), args.lang)
|
|
114
|
+
elif args.command == "workflow":
|
|
115
|
+
workflow = workflow_result(args, Path.cwd())
|
|
116
|
+
messages = [message("workflow_scope")]
|
|
117
|
+
elif args.command == "upgrade":
|
|
118
|
+
if not args.dry_run:
|
|
119
|
+
raise Issue("upgrade_requires_dry_run", 2)
|
|
120
|
+
upgrade = upgrade_plan(Path.cwd(), args.profile, args.regulated, args.controls)
|
|
121
|
+
messages = [message("upgrade_planned", source=upgrade["from"], target=upgrade["to"]),
|
|
122
|
+
message("upgrade_no_changes")]
|
|
123
|
+
elif args.command == "placeholders":
|
|
124
|
+
counts = placeholders(Path.cwd())
|
|
125
|
+
total = sum(counts.values())
|
|
126
|
+
extra = {"placeholders": counts, "total": total}
|
|
127
|
+
messages = [message("placeholders_found", total=total, files=len(counts))]
|
|
128
|
+
code = 1 if args.strict and total else 0
|
|
129
|
+
elif args.command == "pr-size":
|
|
130
|
+
size = pr_size(Path.cwd(), args.base, args.limit)
|
|
131
|
+
extra = {"pr_size": size}
|
|
132
|
+
messages = [message("pr_size_result", **size)]
|
|
133
|
+
if size["counted"] > size["max"]:
|
|
134
|
+
code = 1
|
|
135
|
+
messages.append(message("pr_size_exceeded", counted=size["counted"], max=size["max"]))
|
|
136
|
+
else:
|
|
137
|
+
code, messages = check_project(Path.cwd())
|
|
138
|
+
except Issue as error:
|
|
139
|
+
code, messages = error.code, [message(error.key, **error.params)]
|
|
140
|
+
except OSError:
|
|
141
|
+
code, messages = 5, [message("io_error")]
|
|
142
|
+
for entry in messages:
|
|
143
|
+
entry["message"] = catalog[entry["key"]].format(**entry["params"])
|
|
144
|
+
result = {"status": "completed" if code == 0 else "failed", "code": code, "messages": messages}
|
|
145
|
+
if workflow is not None:
|
|
146
|
+
result["workflow"] = workflow
|
|
147
|
+
if upgrade is not None:
|
|
148
|
+
result["upgrade"] = upgrade
|
|
149
|
+
result.update(extra)
|
|
150
|
+
if "--json" in argv:
|
|
151
|
+
print(json.dumps(result, ensure_ascii=False))
|
|
152
|
+
else:
|
|
153
|
+
for entry in messages:
|
|
154
|
+
print(entry["message"], file=sys.stderr if code else sys.stdout)
|
|
155
|
+
if workflow is not None:
|
|
156
|
+
print(format_workflow(workflow, catalog))
|
|
157
|
+
if upgrade is not None:
|
|
158
|
+
print(format_upgrade(upgrade, catalog))
|
|
159
|
+
for name, count in extra.get("placeholders", {}).items():
|
|
160
|
+
print(f" {count:4d} {name}")
|
|
161
|
+
return code
|
|
162
|
+
|
|
163
|
+
|
|
164
|
+
def format_upgrade(upgrade, catalog):
|
|
165
|
+
lines = []
|
|
166
|
+
for status in STATUSES:
|
|
167
|
+
names = upgrade["files"][status]
|
|
168
|
+
lines.append(f"\n{catalog['upgrade_heading_' + status]} ({len(names)}):")
|
|
169
|
+
if status != "unchanged":
|
|
170
|
+
lines += [f"- {name}" for name in names]
|
|
171
|
+
return "\n".join(lines)
|
|
172
|
+
|
|
173
|
+
|
|
174
|
+
def format_workflow(workflow, catalog):
|
|
175
|
+
if "operations" in workflow:
|
|
176
|
+
return "\n".join(f"{op['id']} — {op['title']}\n {op['purpose']}" for op in workflow["operations"])
|
|
177
|
+
packet = workflow.get("packet")
|
|
178
|
+
recipe = packet["recipe"] if packet else workflow["recipe"]
|
|
179
|
+
lines = [f"\n{recipe['id']} — {recipe['title']}", recipe["purpose"]]
|
|
180
|
+
if packet:
|
|
181
|
+
lines += [catalog["workflow_prepared"].format(target=packet["target"]["id"], mode=packet["mode"],
|
|
182
|
+
language=packet["project_language"]),
|
|
183
|
+
catalog["workflow_request"] + ": " + json.dumps(packet["request"], ensure_ascii=False)]
|
|
184
|
+
for key in ("target_kinds", "inputs", "steps", "outputs", "gates", "checks", "guards", "next_operations"):
|
|
185
|
+
lines += ["\n" + catalog[f"workflow_heading_{key}"] + ":"]
|
|
186
|
+
lines += [f"- {item}" for item in recipe[key]] or [catalog["workflow_no_next"]]
|
|
187
|
+
if packet:
|
|
188
|
+
lines += ["\n" + catalog["workflow_heading_sources"] + ":"]
|
|
189
|
+
lines += [f"- {s['path']} · SHA-256 {s['sha256']} · {s['bytes']} B" for s in packet["sources"]]
|
|
190
|
+
return "\n".join(lines)
|
dixi_spec_kit/core.py
ADDED
|
@@ -0,0 +1,399 @@
|
|
|
1
|
+
import hashlib
|
|
2
|
+
from importlib.resources import files
|
|
3
|
+
import json
|
|
4
|
+
import os
|
|
5
|
+
from pathlib import Path, PurePosixPath
|
|
6
|
+
import posixpath
|
|
7
|
+
import re
|
|
8
|
+
import subprocess
|
|
9
|
+
import sys
|
|
10
|
+
from urllib.parse import unquote, urlsplit
|
|
11
|
+
|
|
12
|
+
from . import __version__
|
|
13
|
+
from .filesystem import (Issue, decode_json, directory, read_file, read_json,
|
|
14
|
+
root_directory, safe_path, supported, write_file)
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
PARENTS = {"goal": set(), "domain": {"goal"}, "module": {"domain"},
|
|
18
|
+
"feature": {"module"}, "contract": {"feature", "module"},
|
|
19
|
+
"test": {"feature", "contract"}}
|
|
20
|
+
METADATA = ".dixi/project.json"
|
|
21
|
+
AGENTS = ("none", "claude", "codex")
|
|
22
|
+
PROFILES = ("minimal", "site", "app", "platform")
|
|
23
|
+
MAX_MANAGED = 1000
|
|
24
|
+
CODEX_POLICY = b"policy:\n allow_implicit_invocation: false\n"
|
|
25
|
+
CLAUDE_REQUIRED = ("discover", "specify", "clarify", "plan", "tasks", "build", "verify", "review", "analyze", "status")
|
|
26
|
+
CLAUDE_COMMANDS = CLAUDE_REQUIRED + ("domain", "architecture", "contract", "threat-model", "handoff", "change",
|
|
27
|
+
"data", "quality", "ai", "release", "promote", "operate", "finops",
|
|
28
|
+
"compliance", "duediligence", "interview", "risk-review")
|
|
29
|
+
SUBAGENTS = ("architect", "tester", "developer", "reviewer")
|
|
30
|
+
CONTROLS = ("protect_tests", "guard_secrets", "guard_attestation", "mode_gate", "verify_on_stop")
|
|
31
|
+
TEST_PATH = re.compile(r"(^|/)(tests?|__tests__|spec)/|(^|/)test_[^/]*$|_test\.[^/]+$|\.(test|spec)\.[^/]+$|\.feature$")
|
|
32
|
+
EXCLUDED_PATH = re.compile(r"(\.md$|^docs/|(^|/)(package-lock\.json|yarn\.lock|pnpm-lock\.yaml|poetry\.lock|uv\.lock|"
|
|
33
|
+
r"Cargo\.lock|go\.sum|Gemfile\.lock|composer\.lock)$|\.min\.(js|css)$|(^|/)generated/)")
|
|
34
|
+
TRACE = ".dixi/traceability.json"
|
|
35
|
+
INLINE_LINK = re.compile(r"!?\[[^\[\]\n]{0,999}\]\(([^)\n]{1,4096})\)")
|
|
36
|
+
KIT_VERSION = re.compile(r"(0|[1-9][0-9]{0,3})\.(0|[1-9][0-9]{0,3})\.(0|[1-9][0-9]{0,3})(?:\.dev[0-9]{1,4}|rc[0-9]{1,4})?")
|
|
37
|
+
REFERENCE_LINK = re.compile(r"^ {0,3}\[[^\[\]\n]{1,999}\]:[ \t]*(<[^>\n]{1,4096}>|[^\s<>]{1,4096})(?=[ \t]|$)", re.MULTILINE)
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
def templates(language):
|
|
41
|
+
data = files("dixi_spec_kit").joinpath("resources", f"project.{language}.json").read_bytes()
|
|
42
|
+
payload = decode_json(data, "resources")
|
|
43
|
+
if not isinstance(payload, dict) or not 1 <= len(payload) <= 500:
|
|
44
|
+
raise Issue("invalid_resources", 5)
|
|
45
|
+
if any(not safe_path(k) or not isinstance(v, str) for k, v in payload.items()):
|
|
46
|
+
raise Issue("invalid_resources", 5)
|
|
47
|
+
return payload
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
def profile_manifest():
|
|
51
|
+
data = decode_json(files("dixi_spec_kit").joinpath("resources", "profiles.json").read_bytes(), "resources")
|
|
52
|
+
entries = data.get("files") if isinstance(data, dict) else None
|
|
53
|
+
if (not isinstance(entries, dict) or data.get("version") != 1
|
|
54
|
+
or any(not safe_path(k) or not isinstance(v, str) or not re.fullmatch(r"[ynr]{3}", v)
|
|
55
|
+
for k, v in entries.items())):
|
|
56
|
+
raise Issue("invalid_resources", 5)
|
|
57
|
+
return entries
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
def profile_files(language, profile, regulated):
|
|
61
|
+
if profile == "minimal":
|
|
62
|
+
return {}
|
|
63
|
+
column = PROFILES.index(profile) - 1
|
|
64
|
+
folder = files("dixi_spec_kit").joinpath("resources", "templates", language)
|
|
65
|
+
payload = {}
|
|
66
|
+
for name, codes in profile_manifest().items():
|
|
67
|
+
if codes[column] == "y" or (regulated and codes[column] == "r"):
|
|
68
|
+
payload[name] = folder.joinpath(*name.split("/")).read_bytes()
|
|
69
|
+
return payload
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
def check_profile(profile, regulated):
|
|
73
|
+
if profile not in PROFILES or type(regulated) is not bool:
|
|
74
|
+
raise Issue("invalid_arguments", 2)
|
|
75
|
+
if regulated and profile == "minimal":
|
|
76
|
+
raise Issue("regulated_requires_profile", 2)
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
def recorded_profile(metadata):
|
|
80
|
+
return metadata.get("profile", "minimal"), metadata.get("regulated", False)
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
def codex_files(language):
|
|
84
|
+
folder = files("dixi_spec_kit").joinpath("resources", "codex", language)
|
|
85
|
+
payload = {}
|
|
86
|
+
for name in CLAUDE_COMMANDS:
|
|
87
|
+
payload[f".agents/skills/dixi-{name}/SKILL.md"] = folder.joinpath(f"dixi-{name}.md").read_bytes()
|
|
88
|
+
payload[f".agents/skills/dixi-{name}/agents/openai.yaml"] = CODEX_POLICY
|
|
89
|
+
return payload
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
def required_adapter_files(agent):
|
|
93
|
+
if agent == "claude":
|
|
94
|
+
return {"CLAUDE.md"} | {f".claude/commands/dixi.{name}.md" for name in CLAUDE_REQUIRED}
|
|
95
|
+
if agent == "codex":
|
|
96
|
+
return {f".agents/skills/dixi-{name}/{suffix}" for name in CLAUDE_REQUIRED
|
|
97
|
+
for suffix in ("SKILL.md", "agents/openai.yaml")}
|
|
98
|
+
return set()
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
def adapter_files(agent, language):
|
|
102
|
+
if agent == "none":
|
|
103
|
+
return {}
|
|
104
|
+
if agent == "codex":
|
|
105
|
+
return codex_files(language)
|
|
106
|
+
folder = files("dixi_spec_kit").joinpath("resources", "claude", language)
|
|
107
|
+
payload = {"CLAUDE.md": folder.joinpath("CLAUDE.md").read_bytes()}
|
|
108
|
+
for name in CLAUDE_COMMANDS:
|
|
109
|
+
payload[f".claude/commands/dixi.{name}.md"] = folder.joinpath(f"dixi.{name}.md").read_bytes()
|
|
110
|
+
for name in SUBAGENTS:
|
|
111
|
+
payload[f".claude/agents/dixi-{name}.md"] = folder.joinpath("agents", f"dixi-{name}.md").read_bytes()
|
|
112
|
+
try:
|
|
113
|
+
for data in payload.values():
|
|
114
|
+
data.decode("utf-8")
|
|
115
|
+
except UnicodeError:
|
|
116
|
+
raise Issue("invalid_resources", 5) from None
|
|
117
|
+
return payload
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
def hook_command(agent, script):
|
|
121
|
+
if agent == "claude":
|
|
122
|
+
return f'python3 "$CLAUDE_PROJECT_DIR/.dixi/hooks/{script}.py"'
|
|
123
|
+
return f'python3 "$(git rev-parse --show-toplevel 2>/dev/null || pwd)/.dixi/hooks/{script}.py"'
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
def hook_group(agent, scripts, matcher=None, timeout=None):
|
|
127
|
+
handlers = []
|
|
128
|
+
for script in scripts:
|
|
129
|
+
handler = {"type": "command", "command": hook_command(agent, script)}
|
|
130
|
+
if timeout:
|
|
131
|
+
handler["timeout"] = timeout
|
|
132
|
+
handlers.append(handler)
|
|
133
|
+
return ({"matcher": matcher} if matcher else {}) | {"hooks": handlers}
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
def control_files(agent):
|
|
137
|
+
if agent not in ("claude", "codex"):
|
|
138
|
+
return {}
|
|
139
|
+
folder = files("dixi_spec_kit").joinpath("resources", "hooks")
|
|
140
|
+
payload = {f".dixi/hooks/{name}.py": folder.joinpath(f"{name}.py").read_bytes() for name in CONTROLS}
|
|
141
|
+
shell = ("mode_gate", "guard_secrets", "guard_attestation", "protect_tests")
|
|
142
|
+
stop = [hook_group(agent, ["verify_on_stop"], timeout=300)]
|
|
143
|
+
if agent == "claude":
|
|
144
|
+
events = {"PreToolUse": [hook_group(agent, shell, "Bash"), hook_group(agent, ["guard_secrets"], "Read|Grep"),
|
|
145
|
+
hook_group(agent, ["protect_tests"], "Edit|Write|MultiEdit|NotebookEdit")],
|
|
146
|
+
"Stop": stop, "SubagentStop": stop}
|
|
147
|
+
name = ".claude/settings.json"
|
|
148
|
+
else:
|
|
149
|
+
events = {"PreToolUse": [hook_group(agent, shell, "^Bash$"), hook_group(agent, ["protect_tests"], "^apply_patch$")],
|
|
150
|
+
"Stop": stop, "SubagentStop": stop}
|
|
151
|
+
name = ".codex/hooks.json"
|
|
152
|
+
payload[name] = (json.dumps({"hooks": events}, indent=2) + "\n").encode()
|
|
153
|
+
return payload
|
|
154
|
+
|
|
155
|
+
|
|
156
|
+
def message(key, **params):
|
|
157
|
+
return {"key": key, "params": params}
|
|
158
|
+
|
|
159
|
+
|
|
160
|
+
def initialize(destination, language, agent="none", profile="minimal", regulated=False, controls=False):
|
|
161
|
+
check_profile(profile, regulated)
|
|
162
|
+
if controls and agent == "none":
|
|
163
|
+
raise Issue("controls_require_agent", 2)
|
|
164
|
+
text = str(destination)
|
|
165
|
+
path = Path(os.getcwd()) if text and text.rstrip("/") == "." else Path(text)
|
|
166
|
+
if not text or ".." in path.parts or not path.name:
|
|
167
|
+
raise Issue("unsafe_destination", 3)
|
|
168
|
+
payload = {name: text.encode("utf-8") for name, text in templates(language).items()}
|
|
169
|
+
payload.update(profile_files(language, profile, regulated))
|
|
170
|
+
payload.update(adapter_files(agent, language))
|
|
171
|
+
if controls:
|
|
172
|
+
payload.update(control_files(agent))
|
|
173
|
+
metadata = {"schema_version": 1, "kit_version": __version__, "language": language,
|
|
174
|
+
"agent": agent, "policy": "portable", "profile": profile, "regulated": regulated,
|
|
175
|
+
"controls": bool(controls),
|
|
176
|
+
"managed_files": {name: hashlib.sha256(data).hexdigest() for name, data in payload.items()}}
|
|
177
|
+
try:
|
|
178
|
+
with root_directory(path.parent) as parent:
|
|
179
|
+
try:
|
|
180
|
+
os.mkdir(path.name, mode=0o700, dir_fd=parent)
|
|
181
|
+
except FileExistsError:
|
|
182
|
+
pass
|
|
183
|
+
with directory(parent, [path.name]) as root:
|
|
184
|
+
if os.listdir(root):
|
|
185
|
+
raise Issue("destination_conflict", 3)
|
|
186
|
+
write_file(root, ".dixi-init.lock", b"")
|
|
187
|
+
for name, data in payload.items():
|
|
188
|
+
write_file(root, name, data)
|
|
189
|
+
write_file(root, METADATA, (json.dumps(metadata, ensure_ascii=False, indent=2) + "\n").encode())
|
|
190
|
+
os.unlink(".dixi-init.lock", dir_fd=root)
|
|
191
|
+
except Issue as error:
|
|
192
|
+
if error.key == "unsafe_path":
|
|
193
|
+
error.key, error.code = "unsafe_destination", 3
|
|
194
|
+
raise
|
|
195
|
+
except FileExistsError:
|
|
196
|
+
raise Issue("destination_conflict", 3) from None
|
|
197
|
+
return [message("initialized", path=str(path)), message("structure_only")]
|
|
198
|
+
|
|
199
|
+
|
|
200
|
+
def project_metadata(root):
|
|
201
|
+
try:
|
|
202
|
+
data = read_json(root, METADATA)
|
|
203
|
+
except Issue as error:
|
|
204
|
+
if error.key == "missing_file":
|
|
205
|
+
raise Issue("missing_project", 2) from None
|
|
206
|
+
raise
|
|
207
|
+
if not isinstance(data, dict) or type(data.get("schema_version")) is not int:
|
|
208
|
+
raise Issue("invalid_metadata")
|
|
209
|
+
if data["schema_version"] != 1:
|
|
210
|
+
raise Issue("unsupported_schema", 4)
|
|
211
|
+
if (not isinstance(data.get("kit_version"), str) or data.get("language") not in ("es", "en")
|
|
212
|
+
or data.get("agent") not in AGENTS or data.get("policy") != "portable"):
|
|
213
|
+
raise Issue("invalid_metadata")
|
|
214
|
+
version = KIT_VERSION.fullmatch(data["kit_version"])
|
|
215
|
+
if not version:
|
|
216
|
+
raise Issue("invalid_metadata")
|
|
217
|
+
if version.group(1) != __version__.split(".")[0]:
|
|
218
|
+
raise Issue("unsupported_schema", 4)
|
|
219
|
+
inventory = data.get("managed_files")
|
|
220
|
+
if not isinstance(inventory, dict) or not 1 <= len(inventory) <= MAX_MANAGED:
|
|
221
|
+
raise Issue("invalid_metadata")
|
|
222
|
+
for name, digest in inventory.items():
|
|
223
|
+
if not safe_path(name) or not isinstance(digest, str) or not re.fullmatch(r"[0-9a-f]{64}", digest):
|
|
224
|
+
raise Issue("invalid_metadata")
|
|
225
|
+
profile, regulated = recorded_profile(data)
|
|
226
|
+
if profile not in PROFILES or type(regulated) is not bool or (regulated and profile == "minimal"):
|
|
227
|
+
raise Issue("invalid_metadata")
|
|
228
|
+
controls = data.get("controls", False)
|
|
229
|
+
if type(controls) is not bool or (controls and data["agent"] == "none"):
|
|
230
|
+
raise Issue("invalid_metadata")
|
|
231
|
+
required = set(templates(data["language"])) | required_adapter_files(data["agent"])
|
|
232
|
+
if not required <= set(inventory):
|
|
233
|
+
raise Issue("invalid_metadata")
|
|
234
|
+
return data
|
|
235
|
+
|
|
236
|
+
|
|
237
|
+
def traceability(root):
|
|
238
|
+
data = read_json(root, TRACE)
|
|
239
|
+
if (not isinstance(data, dict) or type(data.get("schema_version")) is not int
|
|
240
|
+
or data["schema_version"] != 1 or not isinstance(data.get("items"), list)
|
|
241
|
+
or len(data["items"]) > 500):
|
|
242
|
+
raise Issue("invalid_trace")
|
|
243
|
+
items = data["items"]
|
|
244
|
+
by_id = {}
|
|
245
|
+
for item in items:
|
|
246
|
+
if (not isinstance(item, dict) or not isinstance(item.get("id"), str)
|
|
247
|
+
or not re.fullmatch(r"[A-Za-z][A-Za-z0-9._-]{0,127}", item["id"])
|
|
248
|
+
or not isinstance(item.get("kind"), str) or item["kind"] not in PARENTS
|
|
249
|
+
or not safe_path(item.get("path")) or not isinstance(item.get("parents"), list)
|
|
250
|
+
or len(item["parents"]) > 500 or any(not isinstance(p, str) for p in item["parents"])):
|
|
251
|
+
raise Issue("invalid_trace")
|
|
252
|
+
if item["id"] in by_id or len(item["parents"]) != len(set(item["parents"])):
|
|
253
|
+
raise Issue("invalid_trace")
|
|
254
|
+
by_id[item["id"]] = item
|
|
255
|
+
issues = []
|
|
256
|
+
for item in items:
|
|
257
|
+
allowed = PARENTS[item["kind"]]
|
|
258
|
+
if bool(item["parents"]) != bool(allowed) or any(
|
|
259
|
+
p not in by_id or by_id[p]["kind"] not in allowed for p in item["parents"]):
|
|
260
|
+
issues.append(message("invalid_parent", path=item["id"]))
|
|
261
|
+
return items, issues
|
|
262
|
+
|
|
263
|
+
|
|
264
|
+
def markdown_links(root, name, data, removable=frozenset()):
|
|
265
|
+
try:
|
|
266
|
+
text = data.decode("utf-8")
|
|
267
|
+
except UnicodeError:
|
|
268
|
+
raise Issue("invalid_file", path=name) from None
|
|
269
|
+
issues = []
|
|
270
|
+
targets = INLINE_LINK.findall(text) + REFERENCE_LINK.findall(text)
|
|
271
|
+
if len(targets) > 500:
|
|
272
|
+
raise Issue("invalid_file", path=name)
|
|
273
|
+
for target in targets:
|
|
274
|
+
target = target.strip()
|
|
275
|
+
if not target:
|
|
276
|
+
continue
|
|
277
|
+
target = target[1:target.index(">")] if target.startswith("<") and ">" in target else target.split()[0]
|
|
278
|
+
try:
|
|
279
|
+
link = urlsplit(target)
|
|
280
|
+
if link.scheme in {"http", "https", "mailto"}:
|
|
281
|
+
continue
|
|
282
|
+
if link.scheme or link.netloc or link.path.startswith("/"):
|
|
283
|
+
raise Issue("unsafe_path")
|
|
284
|
+
if not link.path:
|
|
285
|
+
continue
|
|
286
|
+
relative = posixpath.normpath(posixpath.join(str(PurePosixPath(name).parent), unquote(link.path)))
|
|
287
|
+
try:
|
|
288
|
+
read_file(root, relative)
|
|
289
|
+
except Issue as error:
|
|
290
|
+
if error.key != "missing_file" or relative not in removable:
|
|
291
|
+
raise
|
|
292
|
+
except (Issue, ValueError):
|
|
293
|
+
issues.append(message("invalid_link", path=name))
|
|
294
|
+
return issues
|
|
295
|
+
|
|
296
|
+
|
|
297
|
+
def check_project(path):
|
|
298
|
+
issues = []
|
|
299
|
+
with root_directory(path) as root:
|
|
300
|
+
metadata = project_metadata(root)
|
|
301
|
+
names = set(metadata["managed_files"])
|
|
302
|
+
optional = set(profile_manifest()) & names
|
|
303
|
+
try:
|
|
304
|
+
items, graph_issues = traceability(root)
|
|
305
|
+
issues.extend(graph_issues)
|
|
306
|
+
names.update(item["path"] for item in items)
|
|
307
|
+
except Issue as error:
|
|
308
|
+
issues.append(message(error.key, **error.params))
|
|
309
|
+
for name in sorted(names):
|
|
310
|
+
try:
|
|
311
|
+
data = read_file(root, name)
|
|
312
|
+
if name.endswith(".md"):
|
|
313
|
+
issues.extend(markdown_links(root, name, data, optional))
|
|
314
|
+
except Issue as error:
|
|
315
|
+
if error.key == "missing_file" and name in optional:
|
|
316
|
+
continue
|
|
317
|
+
issues.append(message(error.key, **error.params))
|
|
318
|
+
return (1 if issues else 0), issues + [message("structure_only")]
|
|
319
|
+
|
|
320
|
+
|
|
321
|
+
def doctor(path, language):
|
|
322
|
+
if not supported():
|
|
323
|
+
raise Issue("unsupported_platform", 4)
|
|
324
|
+
templates(language)
|
|
325
|
+
results = [message("runtime", version=sys.version.split()[0]), message("resources_ok")]
|
|
326
|
+
with root_directory(path) as root:
|
|
327
|
+
try:
|
|
328
|
+
metadata = project_metadata(root)
|
|
329
|
+
profile, regulated = recorded_profile(metadata)
|
|
330
|
+
results.append(message("profile", profile=profile, regulated=regulated))
|
|
331
|
+
results.append(message("controls", controls=metadata.get("controls", False)))
|
|
332
|
+
if metadata["agent"] == "claude":
|
|
333
|
+
installed = sum(f".claude/commands/dixi.{name}.md" in metadata["managed_files"]
|
|
334
|
+
for name in CLAUDE_COMMANDS)
|
|
335
|
+
results.append(message("agent_claude", language=metadata["language"],
|
|
336
|
+
commands=installed, available=len(CLAUDE_COMMANDS)))
|
|
337
|
+
if installed < len(CLAUDE_COMMANDS):
|
|
338
|
+
results.append(message("upgrade_hint"))
|
|
339
|
+
elif metadata["agent"] == "codex":
|
|
340
|
+
installed = sum(f".agents/skills/dixi-{name}/SKILL.md" in metadata["managed_files"]
|
|
341
|
+
for name in CLAUDE_COMMANDS)
|
|
342
|
+
results.append(message("agent_codex", language=metadata["language"],
|
|
343
|
+
skills=installed, available=len(CLAUDE_COMMANDS)))
|
|
344
|
+
if installed < len(CLAUDE_COMMANDS):
|
|
345
|
+
results.append(message("upgrade_hint"))
|
|
346
|
+
else:
|
|
347
|
+
results.append(message("agent_none", language=metadata["language"]))
|
|
348
|
+
except Issue as error:
|
|
349
|
+
if error.code != 2:
|
|
350
|
+
raise
|
|
351
|
+
results.append(message("no_project_optional"))
|
|
352
|
+
return results
|
|
353
|
+
|
|
354
|
+
|
|
355
|
+
def strip_code(text):
|
|
356
|
+
text = re.sub(r"(?ms)^ {0,3}(```|~~~).*?^ {0,3}\1[^\n]*$", "", text)
|
|
357
|
+
return re.sub(r"`[^`\n]*`", "", text)
|
|
358
|
+
|
|
359
|
+
|
|
360
|
+
def placeholders(path):
|
|
361
|
+
counts = {}
|
|
362
|
+
with root_directory(path) as root:
|
|
363
|
+
metadata = project_metadata(root)
|
|
364
|
+
for name in sorted(metadata["managed_files"]):
|
|
365
|
+
if not name.endswith(".md"):
|
|
366
|
+
continue
|
|
367
|
+
try:
|
|
368
|
+
text = read_file(root, name).decode("utf-8", errors="replace")
|
|
369
|
+
except Issue as error:
|
|
370
|
+
if error.key == "missing_file":
|
|
371
|
+
continue
|
|
372
|
+
raise
|
|
373
|
+
count = len(re.findall(r"\{\{pending:", strip_code(text)))
|
|
374
|
+
if count:
|
|
375
|
+
counts[name] = count
|
|
376
|
+
return counts
|
|
377
|
+
|
|
378
|
+
|
|
379
|
+
def pr_size(path, base, limit):
|
|
380
|
+
def git(*args):
|
|
381
|
+
try:
|
|
382
|
+
result = subprocess.run(["git", *args], cwd=path, capture_output=True, text=True, timeout=60)
|
|
383
|
+
except (OSError, subprocess.SubprocessError):
|
|
384
|
+
raise Issue("pr_size_git", 2, base=base) from None
|
|
385
|
+
if result.returncode != 0:
|
|
386
|
+
raise Issue("pr_size_git", 2, base=base)
|
|
387
|
+
return result.stdout
|
|
388
|
+
|
|
389
|
+
git("rev-parse", "--verify", "--quiet", f"{base}^{{commit}}")
|
|
390
|
+
size = {"base": base, "counted": 0, "tests": 0, "excluded": 0, "max": limit}
|
|
391
|
+
for line in git("diff", "--numstat", "--no-renames", f"{base}...HEAD").splitlines():
|
|
392
|
+
parts = line.split("\t", 2)
|
|
393
|
+
if len(parts) != 3:
|
|
394
|
+
continue
|
|
395
|
+
lines = sum(int(value) for value in parts[:2] if value.isdigit())
|
|
396
|
+
name = parts[2]
|
|
397
|
+
key = "tests" if TEST_PATH.search(name) else "excluded" if EXCLUDED_PATH.search(name) else "counted"
|
|
398
|
+
size[key] += lines
|
|
399
|
+
return size
|