@zaip-ai/cli 1.3.8 → 1.4.1
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/README.md +58 -3
- package/dist/commands/init.d.ts +1 -0
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +17 -6
- package/dist/commands/init.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/services/adapters.js +4 -4
- package/dist/services/adapters.js.map +1 -1
- package/dist/services/codex-config-template.d.ts +2 -2
- package/dist/services/codex-config-template.d.ts.map +1 -1
- package/dist/services/codex-config-template.js +3 -3
- package/dist/services/codex-config-template.js.map +1 -1
- package/dist/services/codex-rules.d.ts +1 -1
- package/dist/services/codex-rules.d.ts.map +1 -1
- package/dist/services/codex-rules.js +9 -24
- package/dist/services/codex-rules.js.map +1 -1
- package/dist/services/delivery-git-preflight.d.ts +23 -0
- package/dist/services/delivery-git-preflight.d.ts.map +1 -0
- package/dist/services/delivery-git-preflight.js +69 -0
- package/dist/services/delivery-git-preflight.js.map +1 -0
- package/dist/services/doctor.d.ts.map +1 -1
- package/dist/services/doctor.js +13 -1
- package/dist/services/doctor.js.map +1 -1
- package/dist/services/install-agents-template.d.ts.map +1 -1
- package/dist/services/install-agents-template.js +22 -28
- package/dist/services/install-agents-template.js.map +1 -1
- package/dist/services/install-profile.d.ts +8 -0
- package/dist/services/install-profile.d.ts.map +1 -0
- package/dist/services/install-profile.js +56 -0
- package/dist/services/install-profile.js.map +1 -0
- package/dist/services/logger.d.ts.map +1 -1
- package/dist/services/logger.js +6 -5
- package/dist/services/logger.js.map +1 -1
- package/dist/services/stack-git.d.ts +9 -0
- package/dist/services/stack-git.d.ts.map +1 -0
- package/dist/services/stack-git.js +188 -0
- package/dist/services/stack-git.js.map +1 -0
- package/dist/services/stack-plan.d.ts +3 -1
- package/dist/services/stack-plan.d.ts.map +1 -1
- package/dist/services/stack-plan.js +15 -1
- package/dist/services/stack-plan.js.map +1 -1
- package/dist/services/stack-terraform.d.ts +13 -0
- package/dist/services/stack-terraform.d.ts.map +1 -0
- package/dist/services/stack-terraform.js +274 -0
- package/dist/services/stack-terraform.js.map +1 -0
- package/dist/services/template-manifest.d.ts.map +1 -1
- package/dist/services/template-manifest.js +14 -1
- package/dist/services/template-manifest.js.map +1 -1
- package/dist/types.d.ts +1 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/templates/.agents/.env.example +34 -0
- package/templates/{README.md → .agents/README.md} +124 -60
- package/templates/.agents/config/agents/catalog.yaml +23 -23
- package/templates/.agents/config/clients/codex/agents/zaip-agent-analyst.toml +1 -0
- package/templates/.agents/config/clients/codex/agents/zaip-agent-auditor.toml +1 -0
- package/templates/.agents/config/clients/codex/agents/zaip-agent-backend.toml +5 -4
- package/templates/.agents/config/clients/codex/agents/zaip-agent-brand-strategist.toml +1 -0
- package/templates/.agents/config/clients/codex/agents/zaip-agent-builder.toml +1 -0
- package/templates/.agents/config/clients/codex/agents/zaip-agent-cloud-engineer.toml +10 -7
- package/templates/.agents/config/clients/codex/agents/zaip-agent-data-analyst.toml +1 -0
- package/templates/.agents/config/clients/codex/agents/zaip-agent-designer.toml +1 -0
- package/templates/.agents/config/clients/codex/agents/zaip-agent-finalizer.toml +1 -0
- package/templates/.agents/config/clients/codex/agents/zaip-agent-frontend.toml +5 -4
- package/templates/.agents/config/clients/codex/agents/zaip-agent-general-operations.toml +1 -0
- package/templates/.agents/config/clients/codex/agents/zaip-agent-governance-compliance.toml +1 -0
- package/templates/.agents/config/clients/codex/agents/zaip-agent-growth-strategist.toml +1 -0
- package/templates/.agents/config/clients/codex/agents/zaip-agent-integrator.toml +1 -0
- package/templates/.agents/config/clients/codex/agents/zaip-agent-marketing-analyst.toml +5 -4
- package/templates/.agents/config/clients/codex/agents/zaip-agent-orchestrator.toml +1 -0
- package/templates/.agents/config/clients/codex/agents/zaip-agent-refactoring-specialist.toml +1 -0
- package/templates/.agents/config/clients/codex/agents/zaip-agent-reviewer.toml +1 -0
- package/templates/.agents/config/clients/codex/agents/zaip-agent-sales-specialist.toml +1 -0
- package/templates/.agents/config/clients/codex/agents/zaip-agent-security-auditor.toml +1 -0
- package/templates/.agents/config/clients/codex/agents/zaip-agent-task-executor.toml +1 -0
- package/templates/.agents/config/clients/codex/agents/zaip-agent-website-developer.toml +5 -4
- package/templates/.agents/config/clients/codex/agents/zaip-agent-writer.toml +1 -0
- package/templates/.agents/config/pricing/models.json +25 -1
- package/templates/.agents/config/project.yaml +2 -0
- package/templates/.agents/dashboard/.zaip-managed.json +200 -88
- package/templates/.agents/dashboard/DATA-DICTIONARY.md +1 -1
- package/templates/.agents/dashboard/README.md +58 -19
- package/templates/.agents/dashboard/apps/frontend/dist/assets/{CostCalculationGuidePage-DwVZOmMV.js → CostCalculationGuidePage-snUCQYTC.js} +1 -1
- package/templates/.agents/dashboard/apps/frontend/dist/assets/{DashboardHelpDialog-VcLx9iOO.js → DashboardHelpDialog-oZVlf-l5.js} +72 -8
- package/templates/.agents/dashboard/apps/frontend/dist/assets/{PricingSettingsDialog-CyjMXkm8.js → PricingSettingsDialog-BPtVUGgs.js} +1 -1
- package/templates/.agents/dashboard/apps/frontend/dist/assets/ProjectSettingsPage-3Awyaovx.js +3 -0
- package/templates/.agents/dashboard/apps/frontend/dist/assets/{TraceabilityWorkspace-DFZwIXSC.js → TraceabilityWorkspace-BYjVOHI_.js} +1 -1
- package/templates/.agents/dashboard/apps/frontend/dist/assets/cost-monitor-DbaLbU2q.js +68 -0
- package/templates/.agents/dashboard/apps/frontend/dist/assets/{icons-vendor-DXBOtWNI.js → icons-vendor-TPUT2IUt.js} +1 -1
- package/templates/.agents/dashboard/apps/frontend/dist/assets/index-Cmlx8OYH.css +1 -0
- package/templates/.agents/dashboard/apps/frontend/dist/assets/index-ZJFXmK7m.js +2 -0
- package/templates/.agents/dashboard/apps/frontend/dist/assets/{react-vendor-DaNXQPyk.js → react-vendor-Ct48XHGL.js} +1 -1
- package/templates/.agents/dashboard/apps/frontend/dist/assets/{traceability-I4AKqVDX.js → traceability-BDe4_Ubl.js} +1 -1
- package/templates/.agents/dashboard/apps/frontend/dist/index.html +6 -6
- package/templates/.agents/dashboard/apps/frontend/src/App.tsx +73 -67
- package/templates/.agents/dashboard/apps/frontend/src/AppLoadingBoundary.tsx +35 -7
- package/templates/.agents/dashboard/apps/frontend/src/AppWorkBoard.ts +55 -0
- package/templates/.agents/dashboard/apps/frontend/src/ProjectStackEditor.tsx +11 -0
- package/templates/.agents/dashboard/apps/frontend/src/app-loading-boundary.css +98 -0
- package/templates/.agents/dashboard/apps/frontend/src/cost-period-refresh.test.ts +5 -5
- package/templates/.agents/dashboard/apps/frontend/src/dashboard-api-reconciliation.ts +33 -0
- package/templates/.agents/dashboard/apps/frontend/src/dashboard-api.test.ts +75 -0
- package/templates/.agents/dashboard/apps/frontend/src/dashboard-api.ts +7 -8
- package/templates/.agents/dashboard/apps/frontend/src/project-settings-model.ts +14 -2
- package/templates/.agents/dashboard/apps/frontend/src/project-settings.test.ts +35 -0
- package/templates/.agents/dashboard/apps/frontend/src/snapshot-coherence.test.ts +78 -2
- package/templates/.agents/dashboard/apps/frontend/src/use-app-cost-loaders.test.ts +28 -0
- package/templates/.agents/dashboard/apps/frontend/src/use-app-cost-loaders.ts +8 -5
- package/templates/.agents/dashboard/apps/frontend/src/use-app-effects.ts +180 -1
- package/templates/.agents/dashboard/modules/cost-monitor/src/contracts.ts +7 -4
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostMonitorContent.tsx +13 -7
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostMonitorPage.tsx +14 -0
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostTableDisplay.ts +211 -0
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostTables.test.ts +152 -157
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostTables.tsx +155 -142
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/InvocationManifestQuery.test.ts +145 -0
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/period-cost-groups.ts +7 -5
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/use-compact-cost-page.ts +4 -1
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/use-cost-group-page.ts +4 -1
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/use-cost-run-page.ts +4 -1
- package/templates/.agents/dashboard/modules/cost-monitor/src/server/build-cost-summary-projection.ts +4 -4
- package/templates/.agents/dashboard/modules/operations/src/react/export/ExcelExportAction.test.ts +79 -1
- package/templates/.agents/dashboard/modules/operations/src/react/export/ExcelExportAction.tsx +105 -11
- package/templates/.agents/dashboard/packages/local-runtime/dist/server.cjs +482 -332
- package/templates/.agents/dashboard/packages/local-runtime/dist/sqlite-read-model.cjs +430 -285
- package/templates/.agents/dashboard/packages/local-runtime/scripts/build-sqlite-runtime.mjs +14 -2
- package/templates/.agents/dashboard/packages/local-runtime/scripts/rebuild-sqlite-read-model.mjs +6 -26
- package/templates/.agents/dashboard/packages/local-runtime/scripts/validate-sqlite-read-model.mjs +1 -1
- package/templates/.agents/dashboard/packages/local-runtime/scripts/verify-persistent-launch.mjs +268 -0
- package/templates/.agents/dashboard/packages/local-runtime/server.mjs +482 -332
- package/templates/.agents/dashboard/packages/local-runtime/src/project-settings.test.ts +90 -1
- package/templates/.agents/dashboard/packages/local-runtime/src/project-settings.ts +112 -22
- package/templates/.agents/dashboard/packages/local-runtime/src/server-agent-assets.ts +39 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/server-browser-lease.ts +33 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/server-reconciliation-refresh.test.ts +148 -11
- package/templates/.agents/dashboard/packages/local-runtime/src/server-reconciliation-result.test.ts +68 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/server-snapshot-refresh.test.ts +19 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/server-snapshot-refresh.ts +39 -43
- package/templates/.agents/dashboard/packages/local-runtime/src/server-snapshot-revision.test.ts +42 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/server-snapshot-revision.ts +26 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/server-snapshot-synchronization.ts +34 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/server-startup.ts +30 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/server-work-reconciliation.test.ts +89 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/server-work-reconciliation.ts +88 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/server-workspace.ts +68 -7
- package/templates/.agents/dashboard/packages/local-runtime/src/server.test.ts +11 -5
- package/templates/.agents/dashboard/packages/local-runtime/src/server.ts +129 -99
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-agent-productivity.test.ts +111 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-agent-productivity.ts +140 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-cost-agent-page.test.ts +127 -4
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-cost-agent-page.ts +145 -5
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-cost-aggregates.ts +156 -23
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-cost-group-projection.ts +18 -9
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-cost-invocation-projection.ts +52 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-first-fold-persistence.ts +35 -13
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-force-canonical.test.ts +56 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-incremental-cache.test.ts +29 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-incremental-cache.ts +136 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-incremental-refresh.test.ts +251 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-operations-projection.ts +22 -7
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-cache.test-support.ts +1 -1
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-canonical-parsing.ts +42 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-canonical.ts +793 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-multi-provider-duration.test.ts +270 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-multi-provider-fixture.ts +3 -2
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-multi-provider.test.ts +18 -4
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-source-fingerprint.test.ts +87 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-source-fingerprint.ts +105 -16
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model.test.ts +131 -59
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model.ts +1000 -1115
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-snapshot-cache.ts +13 -92
- package/templates/.agents/dashboard/packages/local-runtime/start-dashboard-launch-claims.test.mjs +79 -0
- package/templates/.agents/dashboard/packages/local-runtime/start-dashboard-launch-page.mjs +27 -0
- package/templates/.agents/dashboard/packages/local-runtime/start-dashboard-lifecycle.mjs +6 -6
- package/templates/.agents/dashboard/packages/local-runtime/start-dashboard-prerequisites.mjs +1 -1
- package/templates/.agents/dashboard/packages/local-runtime/start-dashboard-refresh.mjs +2 -10
- package/templates/.agents/dashboard/packages/local-runtime/start-dashboard-server.mjs +142 -0
- package/templates/.agents/dashboard/packages/local-runtime/start-dashboard.mjs +231 -239
- package/templates/.agents/dashboard/packages/local-runtime/start-dashboard.test.mjs +18 -29
- package/templates/.agents/dashboard/packages/windows-launcher/Program.cs +6 -0
- package/templates/.agents/dashboard/zaip-dashboard-windows.exe +0 -0
- package/templates/.agents/requirements/autonomous-assurance.md +1 -1
- package/templates/.agents/requirements/cloud-hostinger-autonomy.md +47 -0
- package/templates/.agents/requirements/comparative-audit.md +1 -1
- package/templates/.agents/requirements/context-engine.md +1 -1
- package/templates/.agents/requirements/cost-observability.md +1 -1
- package/templates/.agents/requirements/dashboard-launch.md +2 -2
- package/templates/.agents/requirements/data-export.md +1 -1
- package/templates/.agents/requirements/design-system.md +1 -1
- package/templates/.agents/requirements/execution-engine.md +1 -1
- package/templates/.agents/requirements/kanban-dashboard.md +1 -1
- package/templates/.agents/requirements/model-orchestration.md +1 -1
- package/templates/.agents/requirements/public-distribution.md +1 -1
- package/templates/.agents/requirements/software-architecture.md +1 -1
- package/templates/.agents/requirements/strategic-improvements.md +1 -1
- package/templates/.agents/requirements/work-lifecycle.md +1 -1
- package/templates/.agents/requirements/zaip-strategic-95.md +1 -1
- package/templates/.agents/rules/autonomy-decision.md +1 -1
- package/templates/.agents/rules/cloud-hostinger-autonomy.md +21 -0
- package/templates/.agents/rules/core.md +5 -4
- package/templates/.agents/rules/local-sqlite-storage.md +18 -0
- package/templates/.agents/rules/meta-mcp.md +21 -0
- package/templates/.agents/rules/workflow.md +1 -0
- package/templates/.agents/runtime/bin/zaip.mjs +305 -137
- package/templates/.agents/runtime/checksums.sha256 +2 -2
- package/templates/.agents/runtime/provenance.json +2 -2
- package/templates/.agents/skills/zaip-skill-api-to-mcp/SKILL.md +4 -0
- package/templates/.agents/skills/zaip-skill-brand-governance/SKILL.md +25 -9
- package/templates/.agents/skills/zaip-skill-brand-governance/references/brandbook-framework.md +2 -2
- package/templates/.agents/skills/zaip-skill-brand-governance/references/brandbook-standards.md +2 -2
- package/templates/.agents/skills/zaip-skill-change/references/observable-evidence.md +15 -0
- package/templates/.agents/skills/zaip-skill-dashboard-sqlite/SKILL.md +13 -5
- package/templates/.agents/skills/zaip-skill-data-analyst/SKILL.md +10 -5
- package/templates/.agents/skills/zaip-skill-execution/SKILL.md +5 -4
- package/templates/.agents/skills/zaip-skill-frontend-launcher/SKILL.md +4 -3
- package/templates/.agents/skills/zaip-skill-frontend-launcher/references/launcher-contract.md +5 -3
- package/templates/.agents/skills/zaip-skill-github-deploy/SKILL.md +5 -5
- package/templates/.agents/skills/zaip-skill-github-deploy/scripts/preflight.mjs +78 -13
- package/templates/.agents/skills/zaip-skill-github-deploy/scripts/preflight.test.mjs +59 -0
- package/templates/.agents/skills/zaip-skill-github-deploy/scripts/yaml-parser.mjs +157 -0
- package/templates/.agents/skills/zaip-skill-growth-strategy-revops/SKILL.md +11 -6
- package/templates/.agents/skills/zaip-skill-hostinger-cloudflare-terraform/SKILL.md +17 -0
- package/templates/.agents/skills/zaip-skill-hostinger-cloudflare-terraform/agents/openai.yaml +7 -0
- package/templates/.agents/skills/zaip-skill-hostinger-cloudflare-terraform/references/autonomous-cloud-inputs.example.json +41 -0
- package/templates/.agents/skills/zaip-skill-hostinger-cloudflare-terraform/references/autonomous-runner.md +84 -0
- package/templates/.agents/skills/zaip-skill-hostinger-cloudflare-terraform/references/operational-contract.md +19 -0
- package/templates/.agents/skills/zaip-skill-local-credentials/SKILL.md +43 -0
- package/templates/.agents/skills/zaip-skill-local-credentials/agents/openai.yaml +6 -0
- package/templates/.agents/skills/zaip-skill-local-credentials/references/dotenv-resolution.md +47 -0
- package/templates/.agents/skills/zaip-skill-marketing/SKILL.md +8 -3
- package/templates/.agents/skills/zaip-skill-meta-ads/SKILL.md +16 -0
- package/templates/.agents/skills/zaip-skill-meta-ads/agents/openai.yaml +4 -0
- package/templates/.agents/skills/zaip-skill-meta-ads/references/setup.md +3 -0
- package/templates/.agents/skills/zaip-skill-meta-ads-setup/SKILL.md +24 -0
- package/templates/.agents/skills/zaip-skill-meta-ads-setup/agents/openai.yaml +4 -0
- package/templates/.agents/skills/zaip-skill-meta-ads-setup/references/diagnostics.md +13 -0
- package/templates/.agents/skills/zaip-skill-meta-ads-setup/references/official-sources.md +10 -0
- package/templates/.agents/skills/zaip-skill-meta-devtools-api-health/SKILL.md +12 -0
- package/templates/.agents/skills/zaip-skill-meta-devtools-api-health/agents/openai.yaml +4 -0
- package/templates/.agents/skills/zaip-skill-meta-devtools-api-health/references/LICENSE +21 -0
- package/templates/.agents/skills/zaip-skill-meta-devtools-api-health/references/upstream.md +77 -0
- package/templates/.agents/skills/zaip-skill-meta-devtools-api-integration/SKILL.md +12 -0
- package/templates/.agents/skills/zaip-skill-meta-devtools-api-integration/agents/openai.yaml +4 -0
- package/templates/.agents/skills/zaip-skill-meta-devtools-api-integration/references/LICENSE +21 -0
- package/templates/.agents/skills/zaip-skill-meta-devtools-api-integration/references/upstream.md +126 -0
- package/templates/.agents/skills/zaip-skill-meta-devtools-app-health-check/SKILL.md +12 -0
- package/templates/.agents/skills/zaip-skill-meta-devtools-app-health-check/agents/openai.yaml +4 -0
- package/templates/.agents/skills/zaip-skill-meta-devtools-app-health-check/references/LICENSE +21 -0
- package/templates/.agents/skills/zaip-skill-meta-devtools-app-health-check/references/upstream.md +67 -0
- package/templates/.agents/skills/zaip-skill-meta-devtools-app-review-prep/SKILL.md +12 -0
- package/templates/.agents/skills/zaip-skill-meta-devtools-app-review-prep/agents/openai.yaml +4 -0
- package/templates/.agents/skills/zaip-skill-meta-devtools-app-review-prep/references/LICENSE +21 -0
- package/templates/.agents/skills/zaip-skill-meta-devtools-app-review-prep/references/upstream.md +69 -0
- package/templates/.agents/skills/zaip-skill-meta-devtools-compliance-check/SKILL.md +12 -0
- package/templates/.agents/skills/zaip-skill-meta-devtools-compliance-check/agents/openai.yaml +4 -0
- package/templates/.agents/skills/zaip-skill-meta-devtools-compliance-check/references/LICENSE +21 -0
- package/templates/.agents/skills/zaip-skill-meta-devtools-compliance-check/references/upstream.md +79 -0
- package/templates/.agents/skills/zaip-skill-meta-devtools-debug-access-token/SKILL.md +14 -0
- package/templates/.agents/skills/zaip-skill-meta-devtools-debug-access-token/agents/openai.yaml +4 -0
- package/templates/.agents/skills/zaip-skill-meta-devtools-debug-access-token/references/LICENSE +21 -0
- package/templates/.agents/skills/zaip-skill-meta-devtools-debug-access-token/references/upstream.md +144 -0
- package/templates/.agents/skills/zaip-skill-meta-devtools-debug-webhooks/SKILL.md +12 -0
- package/templates/.agents/skills/zaip-skill-meta-devtools-debug-webhooks/agents/openai.yaml +4 -0
- package/templates/.agents/skills/zaip-skill-meta-devtools-debug-webhooks/references/LICENSE +21 -0
- package/templates/.agents/skills/zaip-skill-meta-devtools-debug-webhooks/references/upstream.md +83 -0
- package/templates/.agents/skills/zaip-skill-meta-devtools-search-docs/SKILL.md +10 -0
- package/templates/.agents/skills/zaip-skill-meta-devtools-search-docs/agents/openai.yaml +4 -0
- package/templates/.agents/skills/zaip-skill-meta-devtools-search-docs/references/LICENSE +21 -0
- package/templates/.agents/skills/zaip-skill-meta-devtools-search-docs/references/setup.md +11 -0
- package/templates/.agents/skills/zaip-skill-meta-devtools-search-docs/references/upstream.md +55 -0
- package/templates/.agents/skills/zaip-skill-meta-devtools-webhook-setup/SKILL.md +12 -0
- package/templates/.agents/skills/zaip-skill-meta-devtools-webhook-setup/agents/openai.yaml +4 -0
- package/templates/.agents/skills/zaip-skill-meta-devtools-webhook-setup/references/LICENSE +21 -0
- package/templates/.agents/skills/zaip-skill-meta-devtools-webhook-setup/references/upstream.md +56 -0
- package/templates/.agents/skills/zaip-skill-sales-methodology/SKILL.md +12 -7
- package/templates/.agents/skills/zaip-skill-sqlite-read-model/SKILL.md +11 -4
- package/templates/.agents/skills/zaip-skill-tool-setup/SKILL.md +6 -4
- package/templates/.agents/skills/zaip-skill-tool-setup/references/codex-config.md +4 -2
- package/templates/.agents/skills/zaip-skill-tool-setup/references/secrets.md +1 -0
- package/templates/.agents/tools/catalog.yaml +6 -0
- package/templates/.agents/tools/cloud-runner-dns.mjs +28 -0
- package/templates/.agents/tools/cloud-runner-terraform.mjs +212 -0
- package/templates/.agents/tools/cloud-runner.integration.test.mjs +239 -0
- package/templates/.agents/tools/cloud-runner.mjs +786 -0
- package/templates/.agents/tools/cloud-runner.test.mjs +534 -0
- package/templates/.agents/tools/cloud-terraform-plan-policy.mjs +262 -0
- package/templates/.agents/tools/mcp/development/meta-devtools/README.md +14 -0
- package/templates/.agents/tools/mcp/development/meta-devtools/manifest.yaml +28 -0
- package/templates/.agents/tools/mcp/infra/cloudflare/manifest.yaml +2 -3
- package/templates/.agents/tools/mcp/infra/hostinger/manifest.yaml +1 -3
- package/templates/.agents/tools/mcp/marketing/meta-ads/README.md +15 -13
- package/templates/.agents/tools/mcp/marketing/meta-ads/manifest.yaml +15 -10
- package/templates/.agents/tools/profiles/development.yaml +3 -0
- package/templates/infra/terraform/.terraform.lock.hcl +42 -0
- package/templates/infra/terraform/README.md +31 -0
- package/templates/infra/terraform/backend.tf.json +13 -0
- package/templates/infra/terraform/deployment-inputs.example.yaml +22 -0
- package/templates/infra/terraform/fixtures/approved-targets.json +32 -0
- package/templates/infra/terraform/fixtures/plan-approved.json +67 -0
- package/templates/infra/terraform/main.tf +77 -0
- package/templates/infra/terraform/outputs.tf +20 -0
- package/templates/infra/terraform/terraform.tfvars.example +26 -0
- package/templates/infra/terraform/variables.tf +91 -0
- package/templates/infra/terraform/versions.tf +18 -0
- package/templates/scripts/validate-cloud-hostinger-contract.mjs +89 -0
- package/templates/scripts/validate-cloud-terraform-plan.mjs +1 -0
- package/templates/template-manifest.json +599 -167
- package/templates/.agents/dashboard/apps/frontend/dist/assets/ProjectSettingsPage-BwnJpl02.js +0 -3
- package/templates/.agents/dashboard/apps/frontend/dist/assets/cost-monitor-C09KmlSw.js +0 -68
- package/templates/.agents/dashboard/apps/frontend/dist/assets/index-Dyo_wpL4.js +0 -2
- package/templates/.agents/dashboard/apps/frontend/dist/assets/index-hPPfVGQv.css +0 -1
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-stale-seed.ts +0 -50
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
import { readFile } from "node:fs/promises";
|
|
2
|
+
|
|
3
|
+
const args = parseArgs(process.argv.slice(2));
|
|
4
|
+
const usage =
|
|
5
|
+
"Usage: node scripts/validate-cloud-terraform-plan.mjs --plan <terraform-show.json> --contract <approved-targets.json>";
|
|
6
|
+
if (![args.plan, args.contract].every(Boolean)) {
|
|
7
|
+
throw new Error(usage);
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
const plan = JSON.parse(await readFile(args.plan, "utf8"));
|
|
11
|
+
const contract = JSON.parse(await readFile(args.contract, "utf8"));
|
|
12
|
+
const cloudflare = contract.cloudflare ?? {};
|
|
13
|
+
const hostinger = contract.hostinger ?? {};
|
|
14
|
+
const phase = contract.phase ?? "combined";
|
|
15
|
+
const changes = plan.resource_changes ?? [];
|
|
16
|
+
const errors = [];
|
|
17
|
+
const approvedVps = {
|
|
18
|
+
"hostinger_vps.edge[0]": hostinger.edge,
|
|
19
|
+
"hostinger_vps.application[0]": hostinger.application,
|
|
20
|
+
};
|
|
21
|
+
const allowedAddresses = new Set(Object.keys(approvedVps));
|
|
22
|
+
const vps = new Map();
|
|
23
|
+
const dnsNames = new Set();
|
|
24
|
+
|
|
25
|
+
for (const change of changes) {
|
|
26
|
+
const actions = change.change?.actions ?? [];
|
|
27
|
+
if (
|
|
28
|
+
!Array.isArray(actions) ||
|
|
29
|
+
actions.length !== 1 ||
|
|
30
|
+
!["create", "update", "no-op", "read"].includes(actions[0])
|
|
31
|
+
) {
|
|
32
|
+
errors.push(`${change.address}: deletion, replacement, or unknown action is forbidden`);
|
|
33
|
+
continue;
|
|
34
|
+
}
|
|
35
|
+
if (change.type === "hostinger_vps") {
|
|
36
|
+
if (!allowedAddresses.has(change.address)) {
|
|
37
|
+
errors.push(`${change.address}: only edge[0] and application[0] Hostinger VPS are allowed`);
|
|
38
|
+
continue;
|
|
39
|
+
}
|
|
40
|
+
validateVps(change, approvedVps[change.address], errors);
|
|
41
|
+
vps.set(change.address, change.change.after);
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
44
|
+
if (change.type === "cloudflare_dns_record") {
|
|
45
|
+
const after = change.change.after ?? {};
|
|
46
|
+
const destination = String(after.comment ?? "").match(/destination=(edge|pages|explicit)/)?.[1];
|
|
47
|
+
const expected = cloudflare.dns_records?.[after.name];
|
|
48
|
+
if (after.zone_id !== cloudflare.zone_id)
|
|
49
|
+
errors.push(`${change.address}: DNS zone differs from approved zone`);
|
|
50
|
+
if (!inZone(after.name, cloudflare.zone_name))
|
|
51
|
+
errors.push(`${change.address}: DNS name is outside approved zone`);
|
|
52
|
+
if (!expected) errors.push(`${change.address}: DNS record is not in the approved inventory`);
|
|
53
|
+
else {
|
|
54
|
+
if (dnsNames.has(after.name)) errors.push(`${change.address}: duplicate DNS inventory name`);
|
|
55
|
+
dnsNames.add(after.name);
|
|
56
|
+
for (const field of ["type", "content", "proxied"]) {
|
|
57
|
+
if (after[field] !== expected[field])
|
|
58
|
+
errors.push(`${change.address}: ${field} differs from approved DNS inventory`);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
rejectUnknownAfter(
|
|
62
|
+
change.address,
|
|
63
|
+
after,
|
|
64
|
+
new Set([
|
|
65
|
+
"zone_id",
|
|
66
|
+
"name",
|
|
67
|
+
"type",
|
|
68
|
+
"content",
|
|
69
|
+
"proxied",
|
|
70
|
+
"ttl",
|
|
71
|
+
"comment",
|
|
72
|
+
"id",
|
|
73
|
+
"created_on",
|
|
74
|
+
"modified_on",
|
|
75
|
+
"comment_modified_on",
|
|
76
|
+
"tags_modified_on",
|
|
77
|
+
"proxiable",
|
|
78
|
+
"meta",
|
|
79
|
+
"settings",
|
|
80
|
+
"tags",
|
|
81
|
+
"data",
|
|
82
|
+
"priority",
|
|
83
|
+
"private_routing",
|
|
84
|
+
]),
|
|
85
|
+
errors,
|
|
86
|
+
);
|
|
87
|
+
if (!destination) errors.push(`${change.address}: missing approved destination marker`);
|
|
88
|
+
if (destination === "edge" && after.content !== cloudflare.edge_ipv4)
|
|
89
|
+
errors.push(`${change.address}: edge record must target VPS 1 IP`);
|
|
90
|
+
if (after.content === hostinger.application?.ipv4)
|
|
91
|
+
errors.push(`${change.address}: no public DNS record may target VPS 2 IP`);
|
|
92
|
+
if (destination === "pages" && after.type !== "CNAME")
|
|
93
|
+
errors.push(`${change.address}: Pages record must be CNAME`);
|
|
94
|
+
continue;
|
|
95
|
+
}
|
|
96
|
+
errors.push(`${change.address}: resource ${change.type} is not approved by this root`);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
if (phase === "compute") {
|
|
100
|
+
if (Object.keys(cloudflare.dns_records ?? {}).length !== 0 || dnsNames.size !== 0)
|
|
101
|
+
errors.push("compute phase must have empty Cloudflare DNS inventories");
|
|
102
|
+
validateComputeCreation(changes, hostinger, approvedVps, contract.authorization, errors);
|
|
103
|
+
} else
|
|
104
|
+
for (const name of Object.keys(cloudflare.dns_records ?? {}))
|
|
105
|
+
if (!dnsNames.has(name)) errors.push(`plan omits required Cloudflare DNS record ${name}`);
|
|
106
|
+
for (const address of allowedAddresses) {
|
|
107
|
+
if (changes.some((change) => change.type === "hostinger_vps") && !vps.has(address)) {
|
|
108
|
+
errors.push(`plan manages VPS but omits required ${address}`);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
if (errors.length > 0) throw new Error(`Terraform plan policy rejected:\n${errors.join("\n")}`);
|
|
112
|
+
process.stdout.write(
|
|
113
|
+
`Validated Terraform plan policy: ${changes.length} resource changes, ${dnsNames.size} DNS records.\n`,
|
|
114
|
+
);
|
|
115
|
+
|
|
116
|
+
function inZone(name, zone) {
|
|
117
|
+
return name === "@" || name === zone || /^[a-z0-9-]+$/.test(name) || name.endsWith(`.${zone}`);
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
function validateVps(change, expected, findings) {
|
|
121
|
+
if (!expected) {
|
|
122
|
+
findings.push(`${change.address}: VPS role is not approved`);
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
const before = change.change.before ?? {};
|
|
126
|
+
const after = change.change.after ?? {};
|
|
127
|
+
const creating = change.change.actions?.[0] === "create";
|
|
128
|
+
if (expected.id && !creating && before.id !== expected.id)
|
|
129
|
+
findings.push(`${change.address}: before.id differs from approved VPS ID`);
|
|
130
|
+
if (expected.id && after.id && after.id !== expected.id)
|
|
131
|
+
findings.push(`${change.address}: after.id differs from approved VPS ID`);
|
|
132
|
+
rejectUnknownAfter(
|
|
133
|
+
change.address,
|
|
134
|
+
after,
|
|
135
|
+
new Set([
|
|
136
|
+
"id",
|
|
137
|
+
"vps_id",
|
|
138
|
+
"plan",
|
|
139
|
+
"data_center_id",
|
|
140
|
+
"template_id",
|
|
141
|
+
"hostname",
|
|
142
|
+
"ssh_key_ids",
|
|
143
|
+
"ipv4_address",
|
|
144
|
+
"ipv6_address",
|
|
145
|
+
"status",
|
|
146
|
+
"password",
|
|
147
|
+
"payment_method_id",
|
|
148
|
+
"post_install_script_id",
|
|
149
|
+
]),
|
|
150
|
+
findings,
|
|
151
|
+
);
|
|
152
|
+
for (const field of ["password", "payment_method_id", "post_install_script_id"])
|
|
153
|
+
if (after[field] !== undefined && after[field] !== null)
|
|
154
|
+
findings.push(`${change.address}: ${field} must remain unset in the approved VPS plan`);
|
|
155
|
+
for (const field of ["plan", "data_center_id", "template_id", "hostname", "ssh_key_ids"]) {
|
|
156
|
+
if (JSON.stringify(after[field]) !== JSON.stringify(expected[field]))
|
|
157
|
+
findings.push(`${change.address}: ${field} differs from approved VPS specification`);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
function validateComputeCreation(changes, hostinger, approved, authorization, findings) {
|
|
162
|
+
const vpsChanges = changes.filter((change) => change.type === "hostinger_vps");
|
|
163
|
+
if (changes.length !== 2 || vpsChanges.length !== 2) {
|
|
164
|
+
findings.push(
|
|
165
|
+
"compute phase requires exactly two Hostinger VPS creates and no other resource changes",
|
|
166
|
+
);
|
|
167
|
+
}
|
|
168
|
+
const roles = hostinger.roles;
|
|
169
|
+
if (!Array.isArray(roles) || roles.length !== 2) {
|
|
170
|
+
findings.push("compute phase requires exactly two approved Hostinger role quotes");
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
for (const [address, target] of Object.entries(approved)) {
|
|
174
|
+
const role = address.includes("edge") ? "edge" : "application";
|
|
175
|
+
const matching = vpsChanges.filter((change) => change.address === address);
|
|
176
|
+
if (
|
|
177
|
+
matching.length !== 1 ||
|
|
178
|
+
matching[0].change?.actions?.length !== 1 ||
|
|
179
|
+
matching[0].change.actions[0] !== "create"
|
|
180
|
+
) {
|
|
181
|
+
findings.push(`${address}: compute phase requires exactly one create action`);
|
|
182
|
+
continue;
|
|
183
|
+
}
|
|
184
|
+
const roleQuote = roles.find((entry) => entry?.role === role)?.quote;
|
|
185
|
+
validateCreationQuote(
|
|
186
|
+
address,
|
|
187
|
+
matching[0].change.after ?? {},
|
|
188
|
+
target,
|
|
189
|
+
roleQuote,
|
|
190
|
+
authorization,
|
|
191
|
+
findings,
|
|
192
|
+
);
|
|
193
|
+
}
|
|
194
|
+
const quoteRoles = roles.map((entry) => entry?.role);
|
|
195
|
+
if (
|
|
196
|
+
new Set(quoteRoles).size !== 2 ||
|
|
197
|
+
quoteRoles.some((role) => !["edge", "application"].includes(role))
|
|
198
|
+
)
|
|
199
|
+
findings.push("compute phase quote has an unapproved or duplicate VPS role");
|
|
200
|
+
if (!authorization)
|
|
201
|
+
findings.push("compute phase requires authorization.max_cost and authorization.currency");
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
function validateCreationQuote(address, after, target, quote, authorization, findings) {
|
|
205
|
+
authorization ??= {};
|
|
206
|
+
const required = [
|
|
207
|
+
"catalog_item_id",
|
|
208
|
+
"price_id",
|
|
209
|
+
"currency",
|
|
210
|
+
"price_cents",
|
|
211
|
+
"first_period_price_cents",
|
|
212
|
+
"period",
|
|
213
|
+
"period_unit",
|
|
214
|
+
];
|
|
215
|
+
if (
|
|
216
|
+
!quote ||
|
|
217
|
+
required.some(
|
|
218
|
+
(field) => quote[field] === undefined || quote[field] === null || quote[field] === "",
|
|
219
|
+
)
|
|
220
|
+
) {
|
|
221
|
+
findings.push(`${address}: missing provider quote bound to the approved role`);
|
|
222
|
+
return;
|
|
223
|
+
}
|
|
224
|
+
if (quote.price_id !== after.plan || quote.price_id !== target?.plan)
|
|
225
|
+
findings.push(`${address}: provider quote price_id differs from the planned VPS SKU`);
|
|
226
|
+
if (quote.currency !== authorization.currency || !/^[A-Z]{3}$/.test(String(quote.currency)))
|
|
227
|
+
findings.push(`${address}: provider quote currency differs from authorization`);
|
|
228
|
+
if (
|
|
229
|
+
!Number.isSafeInteger(quote.price_cents) ||
|
|
230
|
+
!Number.isSafeInteger(quote.first_period_price_cents) ||
|
|
231
|
+
quote.price_cents < 0 ||
|
|
232
|
+
quote.first_period_price_cents < 0
|
|
233
|
+
)
|
|
234
|
+
findings.push(`${address}: provider quote prices must be non-negative integer cents`);
|
|
235
|
+
if (
|
|
236
|
+
!String(quote.catalog_item_id).trim() ||
|
|
237
|
+
!String(quote.period).trim() ||
|
|
238
|
+
!String(quote.period_unit).trim()
|
|
239
|
+
)
|
|
240
|
+
findings.push(`${address}: provider quote must bind catalog item and billing period`);
|
|
241
|
+
const ceiling = Number(authorization.max_cost) * 100;
|
|
242
|
+
if (!Number.isFinite(ceiling) || ceiling <= 0)
|
|
243
|
+
findings.push(`${address}: authorization.max_cost must be a positive amount`);
|
|
244
|
+
else if (Math.max(quote.price_cents, quote.first_period_price_cents) > ceiling)
|
|
245
|
+
findings.push(`${address}: provider quote exceeds authorization.max_cost`);
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
function rejectUnknownAfter(address, after, allowed, findings) {
|
|
249
|
+
for (const field of Object.keys(after))
|
|
250
|
+
if (!allowed.has(field)) findings.push(`${address}: unknown managed after field ${field}`);
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
function parseArgs(values) {
|
|
254
|
+
const parsed = {};
|
|
255
|
+
for (let index = 0; index < values.length; index += 2) {
|
|
256
|
+
const key = values[index];
|
|
257
|
+
const value = values[index + 1];
|
|
258
|
+
if (!key?.startsWith("--") || value === undefined) throw new Error(usage);
|
|
259
|
+
parsed[key.slice(2).replace(/-([a-z])/g, (_, letter) => letter.toUpperCase())] = value;
|
|
260
|
+
}
|
|
261
|
+
return parsed;
|
|
262
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# Meta Social Technologies Dev Tools
|
|
2
|
+
|
|
3
|
+
MCP remoto oficial Meta, desabilitado por padrão. Endpoint: `https://mcp.facebook.com/devtools`; streamable HTTP com OAuth. Configuração/OAuth não prova acesso real.
|
|
4
|
+
|
|
5
|
+
## Uso seguro
|
|
6
|
+
|
|
7
|
+
Use skills `$zaip-skill-meta-devtools-*`. Diagnóstico começa em leitura; subscribe, update_fields e test_send exigem aprovação.
|
|
8
|
+
|
|
9
|
+
## Capacidades
|
|
10
|
+
|
|
11
|
+
- `apps.read`
|
|
12
|
+
- `api_usage.read`
|
|
13
|
+
- `webhooks.read`
|
|
14
|
+
- `documentation.read`
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
schema_version: 1
|
|
2
|
+
id: meta-devtools
|
|
3
|
+
name: "Meta Social Technologies Dev Tools"
|
|
4
|
+
type: mcp
|
|
5
|
+
category: development
|
|
6
|
+
status: example
|
|
7
|
+
enabled: false
|
|
8
|
+
transport: streamable-http
|
|
9
|
+
url: https://mcp.facebook.com/devtools
|
|
10
|
+
authentication:
|
|
11
|
+
source: oauth
|
|
12
|
+
metadata_url: https://mcp.facebook.com/.well-known/oauth-protected-resource/devtools
|
|
13
|
+
metadata_checked_at: "2026-09-05"
|
|
14
|
+
supported_scopes:
|
|
15
|
+
- developer_tools_mcp_app_read
|
|
16
|
+
- developer_tools_mcp_app_management
|
|
17
|
+
policy:
|
|
18
|
+
preferred_access: read-only
|
|
19
|
+
capabilities:
|
|
20
|
+
- apps.read
|
|
21
|
+
- api_usage.read
|
|
22
|
+
- webhooks.read
|
|
23
|
+
- documentation.read
|
|
24
|
+
security:
|
|
25
|
+
default_access: read-only
|
|
26
|
+
write_requires_approval: true
|
|
27
|
+
redact_secrets: true
|
|
28
|
+
destructive_operations: blocked
|
|
@@ -1,21 +1,23 @@
|
|
|
1
1
|
# Meta Ads
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
MCP remoto oficial Meta, desabilitado por padrão. Endpoint: `https://mcp.facebook.com/ads`; streamable HTTP com OAuth nativo do Codex. Use `$zaip-skill-meta-ads-setup` para inserir o pequeno bloco project-scoped de forma idempotente; `codex mcp add` é global e não é usado. Configuração ou OAuth não prova acesso real.
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
Em um pedido explícito para configurar/conectar, o executor grava a configuração local habilitada e inicia `codex mcp login meta-ads` no projeto; o usuário conclui somente login e consentimento no navegador. Para este servidor, o cliente negocia DCR/PKCE: não exige Meta App, App ID, client secret ou access token manual.
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
- `insights.read`
|
|
9
|
-
- `campaigns.write`
|
|
7
|
+
## Uso seguro
|
|
10
8
|
|
|
11
|
-
|
|
9
|
+
Use `$zaip-skill-meta-ads`: leitura com escopo Read, paginação, timezone, moeda e atribuição declarados. Escrita, ads_management e ativação exigem aprovação.
|
|
12
10
|
|
|
13
|
-
|
|
14
|
-
2. Configure as variáveis fora do Git:
|
|
11
|
+
## Estados verificáveis
|
|
15
12
|
|
|
16
|
-
- `
|
|
17
|
-
- `
|
|
13
|
+
- `configured`: bloco TOML presente.
|
|
14
|
+
- `tools-listed`: a sessão exibiu tools e schemas em `/mcp`.
|
|
15
|
+
- `auth-pending` ou `auth-error`: o OAuth ainda não terminou ou falhou.
|
|
16
|
+
- `startup-or-reload-error`, `transport-error`, `policy-blocked` e `scope-insufficient`: causas distintas a diagnosticar.
|
|
17
|
+
- `rollout-unavailable`: somente uma resposta explícita do provider confirmou que a tool não foi entregue.
|
|
18
|
+
- `real-read`: consulta explicitamente read-only retornou dados ou vazio.
|
|
18
19
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
20
|
+
## Capacidades
|
|
21
|
+
|
|
22
|
+
- `campaigns.read`
|
|
23
|
+
- `insights.read`
|
|
@@ -5,20 +5,25 @@ type: mcp
|
|
|
5
5
|
category: marketing
|
|
6
6
|
status: example
|
|
7
7
|
enabled: false
|
|
8
|
-
transport:
|
|
9
|
-
|
|
10
|
-
implementation: required
|
|
11
|
-
command: null
|
|
12
|
-
args: []
|
|
8
|
+
transport: streamable-http
|
|
9
|
+
url: https://mcp.facebook.com/ads
|
|
13
10
|
authentication:
|
|
14
|
-
source:
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
11
|
+
source: oauth
|
|
12
|
+
metadata_url: https://mcp.facebook.com/.well-known/oauth-protected-resource/ads
|
|
13
|
+
metadata_checked_at: "2026-09-05"
|
|
14
|
+
supported_scopes:
|
|
15
|
+
- ads_management
|
|
16
|
+
- ads_read
|
|
17
|
+
- catalog_management
|
|
18
|
+
- business_management
|
|
19
|
+
- pages_show_list
|
|
20
|
+
- instagram_basic
|
|
21
|
+
- ads_mcp_management
|
|
22
|
+
policy:
|
|
23
|
+
preferred_access: read-only
|
|
18
24
|
capabilities:
|
|
19
25
|
- campaigns.read
|
|
20
26
|
- insights.read
|
|
21
|
-
- campaigns.write
|
|
22
27
|
security:
|
|
23
28
|
default_access: read-only
|
|
24
29
|
write_requires_approval: true
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# This file is maintained automatically by "terraform init".
|
|
2
|
+
# Manual edits may be lost in future updates.
|
|
3
|
+
|
|
4
|
+
provider "registry.terraform.io/cloudflare/cloudflare" {
|
|
5
|
+
version = "5.24.0"
|
|
6
|
+
constraints = "~> 5.23"
|
|
7
|
+
hashes = [
|
|
8
|
+
"h1:PIAng5QYiHeydJm1S6sG6d1YYIjaFuIwnifvq/qEV1Q=",
|
|
9
|
+
"zh:2390fc5df95addfd47d3f638964a1f9f6192a8c84ad3b1eab554ef88e0ac4091",
|
|
10
|
+
"zh:2b09c0afbebeb3139a3094e3debda1ba5ff3d73b6eca536549bdc903284b6798",
|
|
11
|
+
"zh:3241ce471f20745b1dc93baea73a716e1db4637ff41acc134114b7a8c9684714",
|
|
12
|
+
"zh:3513243e5582836054076a21abeadd8142a8421df6ec1ead53d96dc37a9e6326",
|
|
13
|
+
"zh:99b33ccb8a1c10a08e8903a2848eb2664c889dc79801a1e61e0373dd41c6c0f9",
|
|
14
|
+
"zh:99c7b510b100a605b0c80e0c3665d99c2381b0834f52ad6ca767e161c2ffa416",
|
|
15
|
+
"zh:c523d747a2d8457bc2d2cc00967c419ef38a5ebebd12d5091cf18322b7201f04",
|
|
16
|
+
"zh:f520e37f4d875b6fee95cffb74cf5fe9efc3cd54fe6bb4b815da5cee87e517e8",
|
|
17
|
+
"zh:f809ab383cca0a5f83072981c64208cbd7fa67e986a86ee02dd2c82333221e32",
|
|
18
|
+
]
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
provider "registry.terraform.io/hostinger/hostinger" {
|
|
22
|
+
version = "0.1.22"
|
|
23
|
+
constraints = "~> 0.1.22"
|
|
24
|
+
hashes = [
|
|
25
|
+
"h1:HY2h9loTO/4fH54LkPPu9poETBQSQXCLp50OJnG91O0=",
|
|
26
|
+
"zh:129908e811883fac30f6e257564e88915451d4c2dbbea5c9dc0bbb0f86175278",
|
|
27
|
+
"zh:295920de29330b74f1483efcced42773320e7bbf6c7d557141b0e70fe3e14f3a",
|
|
28
|
+
"zh:944fabea08baa19a8ec240f25712cdc4a4b8347c87d3ed0b95fc1a23a1a16fb0",
|
|
29
|
+
"zh:9f6352eb3e59da178ba368feee9cbc200c3d6ed27ab4cefa224b15fdac75bbae",
|
|
30
|
+
"zh:a26f33c6a146efb56b9b5b69fc70faad78a61143f953c39555dc83a010f75978",
|
|
31
|
+
"zh:a3c2182926674f129ff31943fc146cca56f37ba2253d7622f8fe7b6ef86713f5",
|
|
32
|
+
"zh:a5a13179449801dd9545ba0b3277fa82ace02dfa61cb855b9ac6939c94e61630",
|
|
33
|
+
"zh:ae39f199da15974dff66f5d3aedb44b4f248c1e78e7580bd95fa7505640cf420",
|
|
34
|
+
"zh:cb8631d91c3e1796ebd6884d201d688c53498d62fa0fd5e82fecfee7b971b8fc",
|
|
35
|
+
"zh:cc6aa110902b8c4a9fe9c2ed3b9a757a987df49019b49f39ea35c66ae3dab204",
|
|
36
|
+
"zh:d9583a4727901f94995fa59f9b7f65a6c3a4eb5b38ba19a788c2d3dd1500e9d1",
|
|
37
|
+
"zh:df70733ad3abd633c7a7f46a6e50e01c896d8d6cf486585979e2dfa05ecb0c60",
|
|
38
|
+
"zh:e536dc4cad0af548759e1da1f8bc7763792153b44da501171ff954d6db9dac7b",
|
|
39
|
+
"zh:ee55224e9911f1286a12f7553ac26a3061f902cdc5996f00c3b1a23954d87f46",
|
|
40
|
+
"zh:fdbb821a45c29cbd9531373b1c34550d5a4e6471fea45b530b4e80428474a9cb",
|
|
41
|
+
]
|
|
42
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# Terraform: Cloudflare DNS and Hostinger VPS
|
|
2
|
+
|
|
3
|
+
This root implements the resource boundary in `.agents/architecture/hostinger-cloudflare-terraform.md`: Cloudflare owns DNS and edge; Hostinger owns only VPS. It deliberately contains no Hostinger DNS resource, no SSH provisioner, no firewall resource with unverified provider support, and no container deployment. Those host-level controls require the declared configuration executor and observed validation.
|
|
4
|
+
|
|
5
|
+
## Local inputs
|
|
6
|
+
|
|
7
|
+
Merge only the relevant names from `.agents/.env.example` into the ignored root `.env`; do not overwrite unrelated existing credentials. `.agents/.env` is an optional alternate location when selected by the execution. Fill values outside chat. The environment file carries credentials and target identifiers but never grants target authority. Before a remote command, compare its Cloudflare account/zone, Hostinger account/VPS IDs and SSH host-key fingerprints to the active `autonomous-cloud` scope.
|
|
8
|
+
|
|
9
|
+
Use the provider-supported `CLOUDFLARE_API_TOKEN` and `HOSTINGER_API_TOKEN` environment variables for tokens. Use a local ignored `terraform.tfvars` for non-secret input. Do not place a private SSH key in any environment file: `ZAIP_CLOUD_SSH_PRIVATE_KEY_PATH` is a local reference only.
|
|
10
|
+
|
|
11
|
+
## Modes
|
|
12
|
+
|
|
13
|
+
`manage_vps = false` consumes explicitly approved but unmanaged external IP inputs and manages only approved Cloudflare records. It is not adoption and does not import a VPS into Terraform state. `manage_vps = true` creates the two declared Hostinger VPS resources. Existing VPS instances must be imported only after their IDs are in scope and their observed configuration has been reviewed.
|
|
14
|
+
|
|
15
|
+
Provider tokens are supplied only through `CLOUDFLARE_API_TOKEN` and `HOSTINGER_API_TOKEN`; they are never `TF_VAR_*` values. The non-secret `TF_VAR_cloudflare_*`, `TF_VAR_edge_vps_*` and `TF_VAR_application_vps_*` inputs in `.env` are the single source for a generated ignored `terraform.tfvars` or contract input. The generator may copy only these declared non-secret values after validating profile and targets; it must never copy credentials, private-key references, saved plans, state, or arbitrary environment variables.
|
|
16
|
+
|
|
17
|
+
Use [`.agents/config/autonomous-cloud-inputs.json`](../../.agents/config/autonomous-cloud-inputs.json) as the neutral contract schema and `backend.tf.json` as the exact backend source checked by the runner. The Terraform executable is declared by `terraform.binary_path` and verified with `terraform.binary_sha256`; the runner does not resolve Terraform from `PATH` or an environment variable. The backend uses the encrypted S3 protocol with `use_lockfile`: provide either AWS S3 credentials or a scoped Cloudflare R2 S3-compatible credential and exact endpoint configuration. Locking and restore remain live validation gates. `ZAIP_HOSTINGER_ACCOUNT_ID` is a declared scope label, while every VPS ID must be observed through the Hostinger VPS API before it becomes a usable target.
|
|
18
|
+
|
|
19
|
+
Terraform source alone does not create private transport or host firewall controls. Declare the configuration executor, WireGuard or equivalent transport, port policy, Docker images and backup/restore plan before applying infrastructure. WAF, TLS edge settings, Cloudflare Pages routing, host configuration, containers, and observability are extension paths: each needs an approved resource specification and observed validation before it is added to this foundation.
|
|
20
|
+
|
|
21
|
+
`deployment-inputs.example.yaml` is deliberately incomplete. It lists the host IDs, image digests, network/firewall controls and restore evidence that must be declared for readiness. Its `deployment_readiness: failed` status is expected until those concrete inputs exist; no template supplies defaults.
|
|
22
|
+
|
|
23
|
+
## Safe cycle
|
|
24
|
+
|
|
25
|
+
1. Resolve the minimum credential set for the selected operation with `$zaip-skill-local-credentials`: Cloudflare for DNS, Hostinger for VPS, the private-key reference and fingerprint for SSH, and AWS S3 or scoped R2 S3-compatible credentials only when Terraform remote state needs them. Run the preflight defined by `$zaip-skill-hostinger-cloudflare-terraform`.
|
|
26
|
+
2. Configure encrypted, versioned remote state with locking. Saved plans and state are protected operational artifacts, never Git or log content; do not treat their protection as permission to publish or expose them.
|
|
27
|
+
3. Run `terraform init`, `terraform fmt -check -recursive`, `terraform validate`, then a saved, reviewed plan.
|
|
28
|
+
4. Apply the exact reviewed plan. Immediately perform refresh/read-after-write and record non-secret IDs and plan hash.
|
|
29
|
+
5. Prove DNS resolution, TLS, health endpoints, blocked private ports, production/beta isolation, backup restore and rollback readiness.
|
|
30
|
+
|
|
31
|
+
Without step 5 performed against the delimited live targets, report only local/static validation; fixture and mock checks never establish live readiness. Terraform `sensitive` only masks normal CLI rendering; provider/resource values can still be present in saved plans or state. These artifacts persist, so keep them encrypted and access-controlled, define retention and cleanup, and keep them out of Git and logs. Hostinger's catalog prices are pre-tax quoted values, not a claim of the total amount charged.
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# This is an intentionally incomplete readiness inventory, not a deployment manifest.
|
|
2
|
+
# All values remain local project inputs. A missing input means deployment-readiness: failed.
|
|
3
|
+
deployment_readiness: failed
|
|
4
|
+
reason: "Host IDs, image digests, private-network executor, firewall policy, and restore proof are not yet declared."
|
|
5
|
+
profiles:
|
|
6
|
+
edge:
|
|
7
|
+
vps_id: null
|
|
8
|
+
image_digests: {}
|
|
9
|
+
firewall_policy: null
|
|
10
|
+
production:
|
|
11
|
+
vps_id: null
|
|
12
|
+
image_digests: {}
|
|
13
|
+
backup_restore_plan: null
|
|
14
|
+
beta_on_demand:
|
|
15
|
+
image_digests: {}
|
|
16
|
+
activation_policy: null
|
|
17
|
+
observability:
|
|
18
|
+
image_digests: {}
|
|
19
|
+
retention_policy: null
|
|
20
|
+
load_tools:
|
|
21
|
+
image_digests: {}
|
|
22
|
+
execution_budget: null
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
{
|
|
2
|
+
"phase": "combined",
|
|
3
|
+
"cloudflare": {
|
|
4
|
+
"account_id": "account-approved",
|
|
5
|
+
"zone_id": "zone-approved",
|
|
6
|
+
"zone_name": "example.com",
|
|
7
|
+
"edge_ipv4": "203.0.113.10",
|
|
8
|
+
"dns_records": {
|
|
9
|
+
"api": { "type": "A", "content": "203.0.113.10", "proxied": true },
|
|
10
|
+
"app": { "type": "CNAME", "content": "pages.example.invalid", "proxied": true }
|
|
11
|
+
}
|
|
12
|
+
},
|
|
13
|
+
"hostinger": {
|
|
14
|
+
"edge": {
|
|
15
|
+
"id": "100001",
|
|
16
|
+
"plan": "hostingercom-vps-kvm2-usd-1m",
|
|
17
|
+
"data_center_id": 13,
|
|
18
|
+
"template_id": 1002,
|
|
19
|
+
"hostname": "edge.example.com",
|
|
20
|
+
"ssh_key_ids": ["key-edge"]
|
|
21
|
+
},
|
|
22
|
+
"application": {
|
|
23
|
+
"id": "100002",
|
|
24
|
+
"ipv4": "203.0.113.20",
|
|
25
|
+
"plan": "hostingercom-vps-kvm2-usd-1m",
|
|
26
|
+
"data_center_id": 13,
|
|
27
|
+
"template_id": 1002,
|
|
28
|
+
"hostname": "application.example.internal",
|
|
29
|
+
"ssh_key_ids": ["key-application"]
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
{
|
|
2
|
+
"planned_values": {},
|
|
3
|
+
"resource_changes": [
|
|
4
|
+
{
|
|
5
|
+
"address": "hostinger_vps.edge[0]",
|
|
6
|
+
"type": "hostinger_vps",
|
|
7
|
+
"change": {
|
|
8
|
+
"actions": ["update"],
|
|
9
|
+
"before": { "id": "100001" },
|
|
10
|
+
"after": {
|
|
11
|
+
"id": "100001",
|
|
12
|
+
"plan": "hostingercom-vps-kvm2-usd-1m",
|
|
13
|
+
"data_center_id": 13,
|
|
14
|
+
"template_id": 1002,
|
|
15
|
+
"hostname": "edge.example.com",
|
|
16
|
+
"ssh_key_ids": ["key-edge"]
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
"address": "hostinger_vps.application[0]",
|
|
22
|
+
"type": "hostinger_vps",
|
|
23
|
+
"change": {
|
|
24
|
+
"actions": ["update"],
|
|
25
|
+
"before": { "id": "100002" },
|
|
26
|
+
"after": {
|
|
27
|
+
"id": "100002",
|
|
28
|
+
"plan": "hostingercom-vps-kvm2-usd-1m",
|
|
29
|
+
"data_center_id": 13,
|
|
30
|
+
"template_id": 1002,
|
|
31
|
+
"hostname": "application.example.internal",
|
|
32
|
+
"ssh_key_ids": ["key-application"]
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
"address": "cloudflare_dns_record.approved[\"api\"]",
|
|
38
|
+
"type": "cloudflare_dns_record",
|
|
39
|
+
"change": {
|
|
40
|
+
"actions": ["create"],
|
|
41
|
+
"after": {
|
|
42
|
+
"zone_id": "zone-approved",
|
|
43
|
+
"name": "api",
|
|
44
|
+
"type": "A",
|
|
45
|
+
"content": "203.0.113.10",
|
|
46
|
+
"proxied": true,
|
|
47
|
+
"comment": "Managed by Zaip Terraform; destination=edge"
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
"address": "cloudflare_dns_record.approved[\"app\"]",
|
|
53
|
+
"type": "cloudflare_dns_record",
|
|
54
|
+
"change": {
|
|
55
|
+
"actions": ["create"],
|
|
56
|
+
"after": {
|
|
57
|
+
"zone_id": "zone-approved",
|
|
58
|
+
"name": "app",
|
|
59
|
+
"type": "CNAME",
|
|
60
|
+
"content": "pages.example.invalid",
|
|
61
|
+
"proxied": true,
|
|
62
|
+
"comment": "Managed by Zaip Terraform; destination=pages"
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
]
|
|
67
|
+
}
|