specweave 0.1.0
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.
- package/INSTALL.md +848 -0
- package/LICENSE +21 -0
- package/README.md +675 -0
- package/SPECWEAVE.md +665 -0
- package/bin/install-agents.sh +57 -0
- package/bin/install-all.sh +49 -0
- package/bin/install-commands.sh +56 -0
- package/bin/install-skills.sh +57 -0
- package/bin/specweave.js +81 -0
- package/dist/adapters/adapter-base.d.ts +50 -0
- package/dist/adapters/adapter-base.d.ts.map +1 -0
- package/dist/adapters/adapter-base.js +146 -0
- package/dist/adapters/adapter-base.js.map +1 -0
- package/dist/adapters/adapter-interface.d.ts +108 -0
- package/dist/adapters/adapter-interface.d.ts.map +1 -0
- package/dist/adapters/adapter-interface.js +9 -0
- package/dist/adapters/adapter-interface.js.map +1 -0
- package/dist/adapters/claude/adapter.d.ts +54 -0
- package/dist/adapters/claude/adapter.d.ts.map +1 -0
- package/dist/adapters/claude/adapter.js +184 -0
- package/dist/adapters/claude/adapter.js.map +1 -0
- package/dist/adapters/copilot/adapter.d.ts +42 -0
- package/dist/adapters/copilot/adapter.d.ts.map +1 -0
- package/dist/adapters/copilot/adapter.js +239 -0
- package/dist/adapters/copilot/adapter.js.map +1 -0
- package/dist/adapters/cursor/adapter.d.ts +42 -0
- package/dist/adapters/cursor/adapter.d.ts.map +1 -0
- package/dist/adapters/cursor/adapter.js +297 -0
- package/dist/adapters/cursor/adapter.js.map +1 -0
- package/dist/adapters/generic/adapter.d.ts +40 -0
- package/dist/adapters/generic/adapter.d.ts.map +1 -0
- package/dist/adapters/generic/adapter.js +155 -0
- package/dist/adapters/generic/adapter.js.map +1 -0
- package/dist/cli/commands/init.d.ts +6 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +247 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/install.d.ts +7 -0
- package/dist/cli/commands/install.d.ts.map +1 -0
- package/dist/cli/commands/install.js +160 -0
- package/dist/cli/commands/install.js.map +1 -0
- package/dist/cli/commands/list.d.ts +6 -0
- package/dist/cli/commands/list.d.ts.map +1 -0
- package/dist/cli/commands/list.js +154 -0
- package/dist/cli/commands/list.js.map +1 -0
- package/package.json +90 -0
- package/src/adapters/README.md +312 -0
- package/src/adapters/adapter-base.ts +146 -0
- package/src/adapters/adapter-interface.ts +120 -0
- package/src/adapters/claude/README.md +241 -0
- package/src/adapters/claude/adapter.ts +157 -0
- package/src/adapters/copilot/.github/copilot/instructions.md +376 -0
- package/src/adapters/copilot/README.md +200 -0
- package/src/adapters/copilot/adapter.ts +210 -0
- package/src/adapters/cursor/.cursor/context/docs-context.md +62 -0
- package/src/adapters/cursor/.cursor/context/increments-context.md +71 -0
- package/src/adapters/cursor/.cursor/context/strategy-context.md +73 -0
- package/src/adapters/cursor/.cursor/context/tests-context.md +89 -0
- package/src/adapters/cursor/.cursorrules +325 -0
- package/src/adapters/cursor/README.md +243 -0
- package/src/adapters/cursor/adapter.ts +268 -0
- package/src/adapters/generic/README.md +277 -0
- package/src/adapters/generic/SPECWEAVE-MANUAL.md +676 -0
- package/src/adapters/generic/adapter.ts +159 -0
- package/src/adapters/registry.yaml +126 -0
- package/src/agents/architect/AGENT.md +416 -0
- package/src/agents/devops/AGENT.md +1738 -0
- package/src/agents/docs-writer/AGENT.md +239 -0
- package/src/agents/performance/AGENT.md +228 -0
- package/src/agents/pm/AGENT.md +751 -0
- package/src/agents/qa-lead/AGENT.md +150 -0
- package/src/agents/security/AGENT.md +179 -0
- package/src/agents/sre/AGENT.md +582 -0
- package/src/agents/sre/modules/backend-diagnostics.md +481 -0
- package/src/agents/sre/modules/database-diagnostics.md +509 -0
- package/src/agents/sre/modules/infrastructure.md +561 -0
- package/src/agents/sre/modules/monitoring.md +439 -0
- package/src/agents/sre/modules/security-incidents.md +421 -0
- package/src/agents/sre/modules/ui-diagnostics.md +302 -0
- package/src/agents/sre/playbooks/01-high-cpu-usage.md +204 -0
- package/src/agents/sre/playbooks/02-database-deadlock.md +241 -0
- package/src/agents/sre/playbooks/03-memory-leak.md +252 -0
- package/src/agents/sre/playbooks/04-slow-api-response.md +269 -0
- package/src/agents/sre/playbooks/05-ddos-attack.md +293 -0
- package/src/agents/sre/playbooks/06-disk-full.md +314 -0
- package/src/agents/sre/playbooks/07-service-down.md +333 -0
- package/src/agents/sre/playbooks/08-data-corruption.md +337 -0
- package/src/agents/sre/playbooks/09-cascade-failure.md +430 -0
- package/src/agents/sre/playbooks/10-rate-limit-exceeded.md +464 -0
- package/src/agents/sre/scripts/health-check.sh +230 -0
- package/src/agents/sre/scripts/log-analyzer.py +213 -0
- package/src/agents/sre/scripts/metrics-collector.sh +294 -0
- package/src/agents/sre/scripts/trace-analyzer.js +257 -0
- package/src/agents/sre/templates/incident-report.md +249 -0
- package/src/agents/sre/templates/mitigation-plan.md +375 -0
- package/src/agents/sre/templates/post-mortem.md +418 -0
- package/src/agents/sre/templates/runbook-template.md +412 -0
- package/src/agents/tech-lead/AGENT.md +263 -0
- package/src/commands/add-tasks.md +176 -0
- package/src/commands/close-increment.md +347 -0
- package/src/commands/create-increment.md +223 -0
- package/src/commands/create-project.md +528 -0
- package/src/commands/generate-docs.md +623 -0
- package/src/commands/list-increments.md +180 -0
- package/src/commands/review-docs.md +331 -0
- package/src/commands/start-increment.md +139 -0
- package/src/commands/sync-github.md +115 -0
- package/src/commands/validate-increment.md +800 -0
- package/src/hooks/README.md +252 -0
- package/src/hooks/docs-changed.sh +59 -0
- package/src/hooks/human-input-required.sh +55 -0
- package/src/hooks/post-task-completion.sh +57 -0
- package/src/hooks/pre-implementation.sh +47 -0
- package/src/skills/ado-sync/README.md +449 -0
- package/src/skills/ado-sync/SKILL.md +245 -0
- package/src/skills/ado-sync/test-cases/test-1.yaml +9 -0
- package/src/skills/ado-sync/test-cases/test-2.yaml +8 -0
- package/src/skills/ado-sync/test-cases/test-3.yaml +9 -0
- package/src/skills/bmad-method-expert/SKILL.md +628 -0
- package/src/skills/bmad-method-expert/scripts/analyze-project.js +318 -0
- package/src/skills/bmad-method-expert/scripts/check-setup.js +208 -0
- package/src/skills/bmad-method-expert/scripts/generate-template.js +1149 -0
- package/src/skills/bmad-method-expert/scripts/validate-documents.js +340 -0
- package/src/skills/bmad-method-expert/test-cases/test-1-placeholder.yaml +12 -0
- package/src/skills/bmad-method-expert/test-cases/test-2-placeholder.yaml +12 -0
- package/src/skills/bmad-method-expert/test-cases/test-3-placeholder.yaml +12 -0
- package/src/skills/brownfield-analyzer/SKILL.md +523 -0
- package/src/skills/brownfield-analyzer/test-cases/test-1-basic-analysis.yaml +48 -0
- package/src/skills/brownfield-analyzer/test-cases/test-2-placeholder.yaml +12 -0
- package/src/skills/brownfield-analyzer/test-cases/test-3-placeholder.yaml +12 -0
- package/src/skills/brownfield-onboarder/SKILL.md +625 -0
- package/src/skills/brownfield-onboarder/test-cases/test-1-placeholder.yaml +12 -0
- package/src/skills/brownfield-onboarder/test-cases/test-2-placeholder.yaml +12 -0
- package/src/skills/brownfield-onboarder/test-cases/test-3-placeholder.yaml +12 -0
- package/src/skills/calendar-system/test-cases/test-1-placeholder.yaml +12 -0
- package/src/skills/calendar-system/test-cases/test-2-placeholder.yaml +12 -0
- package/src/skills/calendar-system/test-cases/test-3-placeholder.yaml +12 -0
- package/src/skills/context-loader/SKILL.md +734 -0
- package/src/skills/context-loader/test-cases/test-1-basic-loading.yaml +39 -0
- package/src/skills/context-loader/test-cases/test-2-token-budget-exceeded.yaml +44 -0
- package/src/skills/context-loader/test-cases/test-3-section-anchors.yaml +45 -0
- package/src/skills/context-optimizer/SKILL.md +618 -0
- package/src/skills/context-optimizer/test-cases/test-1-bug-fix-narrow.yaml +97 -0
- package/src/skills/context-optimizer/test-cases/test-2-feature-focused.yaml +109 -0
- package/src/skills/context-optimizer/test-cases/test-3-architecture-broad.yaml +98 -0
- package/src/skills/cost-optimizer/SKILL.md +190 -0
- package/src/skills/cost-optimizer/test-cases/test-1-basic-comparison.yaml +75 -0
- package/src/skills/cost-optimizer/test-cases/test-2-budget-constraint.yaml +52 -0
- package/src/skills/cost-optimizer/test-cases/test-3-scale-requirement.yaml +63 -0
- package/src/skills/cost-optimizer/test-results/README.md +46 -0
- package/src/skills/design-system-architect/SKILL.md +107 -0
- package/src/skills/design-system-architect/test-cases/test-1-token-structure.yaml +23 -0
- package/src/skills/design-system-architect/test-cases/test-2-component-hierarchy.yaml +24 -0
- package/src/skills/design-system-architect/test-cases/test-3-accessibility-checklist.yaml +23 -0
- package/src/skills/diagrams-architect/SKILL.md +763 -0
- package/src/skills/diagrams-generator/SKILL.md +25 -0
- package/src/skills/diagrams-generator/test-cases/test-1.yaml +9 -0
- package/src/skills/diagrams-generator/test-cases/test-2.yaml +9 -0
- package/src/skills/diagrams-generator/test-cases/test-3.yaml +8 -0
- package/src/skills/docs-updater/README.md +48 -0
- package/src/skills/docs-updater/test-cases/test-1-placeholder.yaml +12 -0
- package/src/skills/docs-updater/test-cases/test-2-placeholder.yaml +12 -0
- package/src/skills/docs-updater/test-cases/test-3-placeholder.yaml +12 -0
- package/src/skills/dotnet-backend/SKILL.md +250 -0
- package/src/skills/e2e-playwright/README.md +506 -0
- package/src/skills/e2e-playwright/SKILL.md +457 -0
- package/src/skills/e2e-playwright/execute.js +373 -0
- package/src/skills/e2e-playwright/lib/utils.js +514 -0
- package/src/skills/e2e-playwright/package.json +33 -0
- package/src/skills/e2e-playwright/test-cases/TC-001-basic-navigation.yaml +54 -0
- package/src/skills/e2e-playwright/test-cases/TC-002-form-interaction.yaml +64 -0
- package/src/skills/e2e-playwright/test-cases/TC-003-specweave-integration.yaml +74 -0
- package/src/skills/e2e-playwright/test-cases/TC-004-accessibility-check.yaml +98 -0
- package/src/skills/figma-designer/SKILL.md +149 -0
- package/src/skills/figma-implementer/SKILL.md +148 -0
- package/src/skills/figma-mcp-connector/SKILL.md +136 -0
- package/src/skills/figma-mcp-connector/test-cases/test-1-read-file-desktop.yaml +22 -0
- package/src/skills/figma-mcp-connector/test-cases/test-2-read-file-framelink.yaml +21 -0
- package/src/skills/figma-mcp-connector/test-cases/test-3-error-handling.yaml +18 -0
- package/src/skills/figma-to-code/SKILL.md +128 -0
- package/src/skills/figma-to-code/test-cases/test-1-token-generation.yaml +29 -0
- package/src/skills/figma-to-code/test-cases/test-2-component-generation.yaml +27 -0
- package/src/skills/figma-to-code/test-cases/test-3-typescript-generation.yaml +28 -0
- package/src/skills/frontend/SKILL.md +177 -0
- package/src/skills/github-sync/SKILL.md +252 -0
- package/src/skills/github-sync/test-cases/test-1-placeholder.yaml +12 -0
- package/src/skills/github-sync/test-cases/test-2-placeholder.yaml +12 -0
- package/src/skills/github-sync/test-cases/test-3-placeholder.yaml +12 -0
- package/src/skills/hetzner-provisioner/README.md +308 -0
- package/src/skills/hetzner-provisioner/SKILL.md +251 -0
- package/src/skills/hetzner-provisioner/test-cases/test-1-basic-provision.yaml +71 -0
- package/src/skills/hetzner-provisioner/test-cases/test-2-postgres-provision.yaml +85 -0
- package/src/skills/hetzner-provisioner/test-cases/test-3-ssl-config.yaml +126 -0
- package/src/skills/hetzner-provisioner/test-results/README.md +259 -0
- package/src/skills/increment-planner/SKILL.md +889 -0
- package/src/skills/increment-planner/scripts/feature-utils.js +250 -0
- package/src/skills/increment-planner/test-cases/test-1-basic-feature.yaml +27 -0
- package/src/skills/increment-planner/test-cases/test-2-complex-feature.yaml +30 -0
- package/src/skills/increment-planner/test-cases/test-3-auto-numbering.yaml +24 -0
- package/src/skills/increment-quality-judge/SKILL.md +566 -0
- package/src/skills/increment-quality-judge/test-cases/test-1-good-spec.yaml +95 -0
- package/src/skills/increment-quality-judge/test-cases/test-2-poor-spec.yaml +108 -0
- package/src/skills/increment-quality-judge/test-cases/test-3-export-suggestions.yaml +87 -0
- package/src/skills/jira-sync/README.md +328 -0
- package/src/skills/jira-sync/SKILL.md +209 -0
- package/src/skills/jira-sync/test-cases/test-1.yaml +9 -0
- package/src/skills/jira-sync/test-cases/test-2.yaml +9 -0
- package/src/skills/jira-sync/test-cases/test-3.yaml +10 -0
- package/src/skills/nextjs/SKILL.md +176 -0
- package/src/skills/nodejs-backend/SKILL.md +181 -0
- package/src/skills/notification-system/test-cases/test-1-placeholder.yaml +12 -0
- package/src/skills/notification-system/test-cases/test-2-placeholder.yaml +12 -0
- package/src/skills/notification-system/test-cases/test-3-placeholder.yaml +12 -0
- package/src/skills/python-backend/SKILL.md +226 -0
- package/src/skills/role-orchestrator/README.md +197 -0
- package/src/skills/role-orchestrator/SKILL.md +1184 -0
- package/src/skills/role-orchestrator/test-cases/test-1-simple-product.yaml +98 -0
- package/src/skills/role-orchestrator/test-cases/test-2-quality-gate-failure.yaml +73 -0
- package/src/skills/role-orchestrator/test-cases/test-3-security-workflow.yaml +121 -0
- package/src/skills/role-orchestrator/test-cases/test-4-parallel-execution.yaml +145 -0
- package/src/skills/role-orchestrator/test-cases/test-5-feedback-loops.yaml +149 -0
- package/src/skills/skill-creator/LICENSE.txt +202 -0
- package/src/skills/skill-creator/SKILL.md +209 -0
- package/src/skills/skill-creator/scripts/init_skill.py +303 -0
- package/src/skills/skill-creator/scripts/package_skill.py +110 -0
- package/src/skills/skill-creator/scripts/quick_validate.py +65 -0
- package/src/skills/skill-creator/test-cases/test-1-placeholder.yaml +12 -0
- package/src/skills/skill-creator/test-cases/test-2-placeholder.yaml +12 -0
- package/src/skills/skill-creator/test-cases/test-3-placeholder.yaml +12 -0
- package/src/skills/skill-router/SKILL.md +497 -0
- package/src/skills/skill-router/test-cases/test-1-basic-routing.yaml +33 -0
- package/src/skills/skill-router/test-cases/test-2-ambiguous-request.yaml +42 -0
- package/src/skills/skill-router/test-cases/test-3-nested-orchestration.yaml +50 -0
- package/src/skills/spec-driven-brainstorming/README.md +264 -0
- package/src/skills/spec-driven-brainstorming/SKILL.md +439 -0
- package/src/skills/spec-driven-brainstorming/test-cases/TC-001-simple-idea-to-design.yaml +148 -0
- package/src/skills/spec-driven-brainstorming/test-cases/TC-002-complex-ultrathink-design.yaml +190 -0
- package/src/skills/spec-driven-brainstorming/test-cases/TC-003-unclear-requirements-socratic.yaml +233 -0
- package/src/skills/spec-driven-debugging/README.md +479 -0
- package/src/skills/spec-driven-debugging/SKILL.md +652 -0
- package/src/skills/spec-driven-debugging/test-cases/TC-001-simple-auth-bug.yaml +212 -0
- package/src/skills/spec-driven-debugging/test-cases/TC-002-race-condition-ultrathink.yaml +461 -0
- package/src/skills/spec-driven-debugging/test-cases/TC-003-brownfield-missing-spec.yaml +366 -0
- package/src/skills/spec-kit-expert/SKILL.md +1012 -0
- package/src/skills/spec-kit-expert/test-cases/test-1-placeholder.yaml +12 -0
- package/src/skills/spec-kit-expert/test-cases/test-2-placeholder.yaml +12 -0
- package/src/skills/spec-kit-expert/test-cases/test-3-placeholder.yaml +12 -0
- package/src/skills/specweave-ado-mapper/SKILL.md +501 -0
- package/src/skills/specweave-detector/SKILL.md +420 -0
- package/src/skills/specweave-detector/test-cases/test-1-basic-detection.yaml +37 -0
- package/src/skills/specweave-detector/test-cases/test-2-missing-config.yaml +37 -0
- package/src/skills/specweave-detector/test-cases/test-3-non-specweave-project.yaml +34 -0
- package/src/skills/specweave-jira-mapper/SKILL.md +500 -0
- package/src/skills/stripe-integrator/test-cases/test-1-placeholder.yaml +12 -0
- package/src/skills/stripe-integrator/test-cases/test-2-placeholder.yaml +12 -0
- package/src/skills/stripe-integrator/test-cases/test-3-placeholder.yaml +12 -0
- package/src/skills/task-builder/README.md +90 -0
- package/src/skills/task-builder/test-cases/test-1-placeholder.yaml +12 -0
- package/src/skills/task-builder/test-cases/test-2-placeholder.yaml +12 -0
- package/src/skills/task-builder/test-cases/test-3-placeholder.yaml +12 -0
- package/src/templates/.env.example +144 -0
- package/src/templates/.gitignore.template +81 -0
- package/src/templates/CLAUDE.md.template +383 -0
- package/src/templates/README.md.template +240 -0
- package/src/templates/config.yaml +333 -0
- package/src/templates/docs/README.md +124 -0
- package/src/templates/docs/adr-template.md +118 -0
- package/src/templates/docs/hld-template.md +220 -0
- package/src/templates/docs/lld-template.md +580 -0
- package/src/templates/docs/prd-template.md +132 -0
- package/src/templates/docs/rfc-template.md +229 -0
- package/src/templates/docs/runbook-template.md +298 -0
- package/src/templates/environments/minimal/.env.production +16 -0
- package/src/templates/environments/minimal/README.md +54 -0
- package/src/templates/environments/minimal/deploy-production.yml +52 -0
- package/src/templates/environments/progressive/.env.qa +28 -0
- package/src/templates/environments/progressive/README.md +129 -0
- package/src/templates/environments/progressive/deploy-production.yml +93 -0
- package/src/templates/environments/progressive/deploy-qa.yml +62 -0
- package/src/templates/environments/progressive/deploy-staging.yml +67 -0
- package/src/templates/environments/standard/.env.development +20 -0
- package/src/templates/environments/standard/.env.production +30 -0
- package/src/templates/environments/standard/.env.staging +23 -0
- package/src/templates/environments/standard/README.md +97 -0
- package/src/templates/environments/standard/deploy-production.yml +68 -0
- package/src/templates/environments/standard/deploy-staging.yml +61 -0
- package/src/templates/environments/standard/docker-compose.yml +43 -0
- package/src/templates/increment-metadata-template.yaml +138 -0
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: "Hetzner Provisioning with SSL (Let's Encrypt)"
|
|
3
|
+
description: "Provision infrastructure with automatic SSL certificate setup using Let's Encrypt"
|
|
4
|
+
skill: hetzner-provisioner
|
|
5
|
+
priority: P1
|
|
6
|
+
estimated_time: "15-20 minutes"
|
|
7
|
+
|
|
8
|
+
input:
|
|
9
|
+
prompt: "Deploy my NextJS app on Hetzner with Postgres and SSL for my-saas.com"
|
|
10
|
+
requirements:
|
|
11
|
+
app_type: nextjs
|
|
12
|
+
instance_type: cx11
|
|
13
|
+
database: postgres
|
|
14
|
+
ssl: true
|
|
15
|
+
domain: "my-saas.com"
|
|
16
|
+
budget: "$15/month"
|
|
17
|
+
|
|
18
|
+
expected_output:
|
|
19
|
+
terraform_files_generated:
|
|
20
|
+
- main.tf
|
|
21
|
+
- variables.tf
|
|
22
|
+
- outputs.tf
|
|
23
|
+
- cloud-init.yaml
|
|
24
|
+
- database.tf
|
|
25
|
+
|
|
26
|
+
terraform_resources:
|
|
27
|
+
- type: hcloud_server
|
|
28
|
+
name: app
|
|
29
|
+
server_type: cx11
|
|
30
|
+
|
|
31
|
+
- type: hcloud_database
|
|
32
|
+
name: postgres
|
|
33
|
+
|
|
34
|
+
- type: hcloud_firewall
|
|
35
|
+
name: app
|
|
36
|
+
rules:
|
|
37
|
+
- port: 80 # HTTP (redirects to HTTPS)
|
|
38
|
+
- port: 443 # HTTPS
|
|
39
|
+
- port: 22 # SSH
|
|
40
|
+
|
|
41
|
+
nginx_config_generated: true
|
|
42
|
+
nginx_config_path: "nginx/nginx.conf"
|
|
43
|
+
|
|
44
|
+
certbot_setup: true
|
|
45
|
+
certbot_commands:
|
|
46
|
+
- "certbot --nginx -d my-saas.com -d www.my-saas.com"
|
|
47
|
+
- "certbot renew --dry-run" # Auto-renewal test
|
|
48
|
+
|
|
49
|
+
ssl_configuration:
|
|
50
|
+
provider: "Let's Encrypt"
|
|
51
|
+
auto_renewal: true
|
|
52
|
+
renewal_schedule: "Monthly via cron"
|
|
53
|
+
cert_path: "/etc/letsencrypt/live/my-saas.com/fullchain.pem"
|
|
54
|
+
key_path: "/etc/letsencrypt/live/my-saas.com/privkey.pem"
|
|
55
|
+
|
|
56
|
+
cloud_init_yaml:
|
|
57
|
+
packages:
|
|
58
|
+
- nginx
|
|
59
|
+
- certbot
|
|
60
|
+
- python3-certbot-nginx
|
|
61
|
+
runcmd:
|
|
62
|
+
- "systemctl enable nginx"
|
|
63
|
+
- "systemctl start nginx"
|
|
64
|
+
|
|
65
|
+
dns_configuration_guide: true
|
|
66
|
+
dns_records_required:
|
|
67
|
+
- type: A
|
|
68
|
+
name: "@"
|
|
69
|
+
value: "[SERVER_IP]"
|
|
70
|
+
ttl: 3600
|
|
71
|
+
|
|
72
|
+
- type: A
|
|
73
|
+
name: "www"
|
|
74
|
+
value: "[SERVER_IP]"
|
|
75
|
+
ttl: 3600
|
|
76
|
+
|
|
77
|
+
cost_estimate:
|
|
78
|
+
monthly: "$11.33"
|
|
79
|
+
breakdown:
|
|
80
|
+
- "CX11 instance: $5.83/month"
|
|
81
|
+
- "Managed Postgres (2GB): $5.00/month"
|
|
82
|
+
- "Storage (20GB): $0.50/month"
|
|
83
|
+
- "SSL (Let's Encrypt): Free"
|
|
84
|
+
total: "$11.33/month"
|
|
85
|
+
within_budget: true
|
|
86
|
+
|
|
87
|
+
deployment_guide:
|
|
88
|
+
prerequisites:
|
|
89
|
+
- "Domain registered (my-saas.com)"
|
|
90
|
+
- "DNS access to create A records"
|
|
91
|
+
|
|
92
|
+
steps:
|
|
93
|
+
- "1. Run terraform apply to provision infrastructure"
|
|
94
|
+
- "2. Note the server IP from terraform output"
|
|
95
|
+
- "3. Create DNS A records pointing to server IP"
|
|
96
|
+
- "4. Wait for DNS propagation (5-30 minutes)"
|
|
97
|
+
- "5. SSH into server and run certbot command"
|
|
98
|
+
- "6. Verify SSL: https://my-saas.com"
|
|
99
|
+
|
|
100
|
+
post_deployment:
|
|
101
|
+
- "SSL auto-renews via certbot cron job"
|
|
102
|
+
- "Force HTTPS redirect configured"
|
|
103
|
+
- "SSL certificate expires in 90 days, renews automatically"
|
|
104
|
+
|
|
105
|
+
validation:
|
|
106
|
+
- "nginx.conf exists and contains SSL configuration"
|
|
107
|
+
- "certbot setup script exists"
|
|
108
|
+
- "cloud-init includes nginx and certbot packages"
|
|
109
|
+
- "DNS configuration guide provided"
|
|
110
|
+
- "HTTPS redirect configured (port 80 → 443)"
|
|
111
|
+
- "Cost remains under $15/month"
|
|
112
|
+
|
|
113
|
+
expected_errors:
|
|
114
|
+
- possible: "DNS not propagated yet"
|
|
115
|
+
solution: "Wait for DNS propagation (check with dig my-saas.com)"
|
|
116
|
+
|
|
117
|
+
- possible: "Certbot fails - port 80 not accessible"
|
|
118
|
+
solution: "Check firewall rules allow port 80"
|
|
119
|
+
|
|
120
|
+
success_criteria:
|
|
121
|
+
- "SSL certificate obtained successfully"
|
|
122
|
+
- "HTTPS working: https://my-saas.com"
|
|
123
|
+
- "HTTP redirects to HTTPS"
|
|
124
|
+
- "Auto-renewal configured"
|
|
125
|
+
- "All deployment steps documented"
|
|
126
|
+
---
|
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
# Test Results: hetzner-provisioner
|
|
2
|
+
|
|
3
|
+
This directory contains test execution results for the hetzner-provisioner skill.
|
|
4
|
+
|
|
5
|
+
## How to Run Tests
|
|
6
|
+
|
|
7
|
+
### Prerequisites
|
|
8
|
+
1. Hetzner Cloud account (sign up at https://www.hetzner.com/cloud)
|
|
9
|
+
2. Hetzner API token (create in Hetzner Cloud Console)
|
|
10
|
+
3. Terraform installed (`brew install terraform` on macOS)
|
|
11
|
+
4. Optional: Domain name for SSL test
|
|
12
|
+
|
|
13
|
+
### Running Test 1: Basic Provision
|
|
14
|
+
|
|
15
|
+
**Prompt to Claude Code**:
|
|
16
|
+
```
|
|
17
|
+
Deploy my NextJS app on Hetzner as cheaply as possible
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
**Expected Behavior**:
|
|
21
|
+
1. hetzner-provisioner skill activates
|
|
22
|
+
2. Generates Terraform files in `terraform/` directory
|
|
23
|
+
3. Outputs cost estimate: ~$6-7/month
|
|
24
|
+
4. Provides deployment guide
|
|
25
|
+
|
|
26
|
+
**Verification Steps**:
|
|
27
|
+
```bash
|
|
28
|
+
# 1. Check generated files
|
|
29
|
+
ls terraform/
|
|
30
|
+
# Should see: main.tf, variables.tf, outputs.tf
|
|
31
|
+
|
|
32
|
+
# 2. Validate Terraform
|
|
33
|
+
cd terraform
|
|
34
|
+
terraform init
|
|
35
|
+
terraform validate
|
|
36
|
+
# Should output: "Success! The configuration is valid."
|
|
37
|
+
|
|
38
|
+
# 3. Check cost estimate
|
|
39
|
+
terraform plan
|
|
40
|
+
# Should show estimated costs
|
|
41
|
+
|
|
42
|
+
# 4. (Optional) Apply infrastructure
|
|
43
|
+
export TF_VAR_hcloud_token="your-hetzner-api-token"
|
|
44
|
+
terraform apply
|
|
45
|
+
# Review plan, type 'yes' to provision
|
|
46
|
+
|
|
47
|
+
# 5. Verify server is running
|
|
48
|
+
# Check Hetzner Cloud Console for new server
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
**Expected Output**:
|
|
52
|
+
- `terraform validate` succeeds
|
|
53
|
+
- Cost in `terraform plan` is under $10/month
|
|
54
|
+
- Server provisions successfully (if applied)
|
|
55
|
+
|
|
56
|
+
---
|
|
57
|
+
|
|
58
|
+
### Running Test 2: Postgres Provision
|
|
59
|
+
|
|
60
|
+
**Prompt to Claude Code**:
|
|
61
|
+
```
|
|
62
|
+
Deploy my NextJS app on Hetzner with Postgres database
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
**Expected Behavior**:
|
|
66
|
+
1. Generates Terraform with both server + database
|
|
67
|
+
2. Cost estimate: ~$11-12/month
|
|
68
|
+
3. Outputs database connection string
|
|
69
|
+
|
|
70
|
+
**Verification Steps**:
|
|
71
|
+
```bash
|
|
72
|
+
# 1. Validate Terraform
|
|
73
|
+
cd terraform
|
|
74
|
+
terraform init
|
|
75
|
+
terraform validate
|
|
76
|
+
|
|
77
|
+
# 2. Check resources
|
|
78
|
+
terraform plan | grep "hcloud_database"
|
|
79
|
+
# Should see Postgres database resource
|
|
80
|
+
|
|
81
|
+
# 3. Check cost
|
|
82
|
+
terraform plan | grep "cost"
|
|
83
|
+
# Should be under $15/month
|
|
84
|
+
|
|
85
|
+
# 4. (Optional) Apply and test connection
|
|
86
|
+
terraform apply
|
|
87
|
+
# Wait for database to provision (~5-10 minutes)
|
|
88
|
+
|
|
89
|
+
# 5. Test database connection
|
|
90
|
+
psql "$(terraform output -raw database_url)"
|
|
91
|
+
# Should connect successfully
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
**Expected Output**:
|
|
95
|
+
- Database resource in Terraform plan
|
|
96
|
+
- Connection string in `terraform output`
|
|
97
|
+
- Can connect to database via psql
|
|
98
|
+
|
|
99
|
+
---
|
|
100
|
+
|
|
101
|
+
### Running Test 3: SSL Configuration
|
|
102
|
+
|
|
103
|
+
**Prompt to Claude Code**:
|
|
104
|
+
```
|
|
105
|
+
Deploy my NextJS app on Hetzner with Postgres and SSL for my-saas.com
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
**Prerequisites**:
|
|
109
|
+
- Domain name (e.g., my-saas.com)
|
|
110
|
+
- DNS access to create A records
|
|
111
|
+
|
|
112
|
+
**Expected Behavior**:
|
|
113
|
+
1. Generates Terraform with Nginx + Certbot
|
|
114
|
+
2. Provides DNS configuration guide
|
|
115
|
+
3. Outputs SSL setup commands
|
|
116
|
+
|
|
117
|
+
**Verification Steps**:
|
|
118
|
+
```bash
|
|
119
|
+
# 1. Apply infrastructure
|
|
120
|
+
cd terraform
|
|
121
|
+
terraform apply
|
|
122
|
+
|
|
123
|
+
# 2. Get server IP
|
|
124
|
+
SERVER_IP=$(terraform output -raw server_ip)
|
|
125
|
+
echo "Server IP: $SERVER_IP"
|
|
126
|
+
|
|
127
|
+
# 3. Configure DNS (in your DNS provider)
|
|
128
|
+
# Create A record: my-saas.com → $SERVER_IP
|
|
129
|
+
# Create A record: www.my-saas.com → $SERVER_IP
|
|
130
|
+
|
|
131
|
+
# 4. Wait for DNS propagation
|
|
132
|
+
dig my-saas.com +short
|
|
133
|
+
# Should return $SERVER_IP
|
|
134
|
+
|
|
135
|
+
# 5. SSH into server
|
|
136
|
+
ssh root@$SERVER_IP
|
|
137
|
+
|
|
138
|
+
# 6. Run certbot (on server)
|
|
139
|
+
certbot --nginx -d my-saas.com -d www.my-saas.com
|
|
140
|
+
# Follow prompts, enter email
|
|
141
|
+
|
|
142
|
+
# 7. Test HTTPS
|
|
143
|
+
curl -I https://my-saas.com
|
|
144
|
+
# Should return HTTP/2 200 with valid SSL
|
|
145
|
+
|
|
146
|
+
# 8. Test HTTP redirect
|
|
147
|
+
curl -I http://my-saas.com
|
|
148
|
+
# Should return 301 redirect to HTTPS
|
|
149
|
+
|
|
150
|
+
# 9. Check SSL certificate
|
|
151
|
+
echo | openssl s_client -connect my-saas.com:443 | grep "Verify return code"
|
|
152
|
+
# Should output: "Verify return code: 0 (ok)"
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
**Expected Output**:
|
|
156
|
+
- SSL certificate obtained successfully
|
|
157
|
+
- HTTPS works: `https://my-saas.com`
|
|
158
|
+
- HTTP redirects to HTTPS
|
|
159
|
+
- SSL Labs test: A or A+ rating
|
|
160
|
+
|
|
161
|
+
---
|
|
162
|
+
|
|
163
|
+
## Test Execution Log
|
|
164
|
+
|
|
165
|
+
### Test 1: Basic Provision
|
|
166
|
+
**Date**: [When you run this]
|
|
167
|
+
**Status**: ⏳ Pending | ✅ Passed | ❌ Failed
|
|
168
|
+
**Result**:
|
|
169
|
+
```
|
|
170
|
+
[Paste terraform validate output here]
|
|
171
|
+
[Paste cost estimate here]
|
|
172
|
+
[Paste any errors encountered]
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
### Test 2: Postgres Provision
|
|
176
|
+
**Date**: [When you run this]
|
|
177
|
+
**Status**: ⏳ Pending | ✅ Passed | ❌ Failed
|
|
178
|
+
**Result**:
|
|
179
|
+
```
|
|
180
|
+
[Paste terraform plan output showing database]
|
|
181
|
+
[Paste database connection test result]
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
### Test 3: SSL Configuration
|
|
185
|
+
**Date**: [When you run this]
|
|
186
|
+
**Status**: ⏳ Pending | ✅ Passed | ❌ Failed
|
|
187
|
+
**Result**:
|
|
188
|
+
```
|
|
189
|
+
[Paste certbot output]
|
|
190
|
+
[Paste curl -I https://my-saas.com output]
|
|
191
|
+
[Paste SSL test result]
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
---
|
|
195
|
+
|
|
196
|
+
## Screenshots
|
|
197
|
+
|
|
198
|
+
### Successful Deployment
|
|
199
|
+
(Add screenshot of Hetzner Cloud Console showing provisioned resources)
|
|
200
|
+
|
|
201
|
+
### SSL Certificate
|
|
202
|
+
(Add screenshot of browser showing valid HTTPS)
|
|
203
|
+
|
|
204
|
+
### Cost Breakdown
|
|
205
|
+
(Add screenshot of Hetzner billing showing monthly costs)
|
|
206
|
+
|
|
207
|
+
---
|
|
208
|
+
|
|
209
|
+
## Troubleshooting
|
|
210
|
+
|
|
211
|
+
### Issue: "terraform validate" fails
|
|
212
|
+
**Solution**:
|
|
213
|
+
```bash
|
|
214
|
+
# Check Terraform syntax
|
|
215
|
+
terraform fmt
|
|
216
|
+
terraform validate
|
|
217
|
+
# Review error messages and fix syntax
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
### Issue: Database won't connect
|
|
221
|
+
**Solution**:
|
|
222
|
+
```bash
|
|
223
|
+
# Check database is running
|
|
224
|
+
terraform output database_host
|
|
225
|
+
# Verify firewall rules allow connection
|
|
226
|
+
# Check DATABASE_URL format
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
### Issue: Certbot fails
|
|
230
|
+
**Solutions**:
|
|
231
|
+
- DNS not propagated: Wait 30 minutes, try again
|
|
232
|
+
- Port 80 blocked: Check firewall allows port 80
|
|
233
|
+
- Email required: Provide valid email to certbot
|
|
234
|
+
|
|
235
|
+
---
|
|
236
|
+
|
|
237
|
+
## Cleanup
|
|
238
|
+
|
|
239
|
+
To destroy test infrastructure and avoid charges:
|
|
240
|
+
|
|
241
|
+
```bash
|
|
242
|
+
cd terraform
|
|
243
|
+
terraform destroy
|
|
244
|
+
# Type 'yes' to confirm
|
|
245
|
+
|
|
246
|
+
# Verify in Hetzner Cloud Console that resources are deleted
|
|
247
|
+
```
|
|
248
|
+
|
|
249
|
+
**Important**: Hetzner charges by the hour, so destroy resources when done testing.
|
|
250
|
+
|
|
251
|
+
---
|
|
252
|
+
|
|
253
|
+
## Success Criteria Summary
|
|
254
|
+
|
|
255
|
+
✅ Test 1: Terraform validates, cost <$10/month
|
|
256
|
+
✅ Test 2: Database provisions, can connect
|
|
257
|
+
✅ Test 3: SSL works, HTTPS redirects
|
|
258
|
+
|
|
259
|
+
**All tests must pass before skill is considered production-ready.**
|