@synapta/skills 0.1.0 → 0.1.2
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/dist/index.js +11 -4
- package/package.json +3 -4
- package/skills/ATTRIBUTION.md +80 -0
- package/skills/accessibility-audit/SKILL.md +325 -0
- package/skills/accessibility-audit/reference/wcag-checklist.md +103 -0
- package/skills/apns-notifier/SKILL.md +86 -0
- package/skills/approval-policy-enforcer/SKILL.md +66 -0
- package/skills/apps-sdk-builder/LICENSE.txt +201 -0
- package/skills/apps-sdk-builder/SKILL.md +328 -0
- package/skills/apps-sdk-builder/agents/openai.yaml +13 -0
- package/skills/apps-sdk-builder/references/app-archetypes.md +132 -0
- package/skills/apps-sdk-builder/references/apps-sdk-docs-workflow.md +135 -0
- package/skills/apps-sdk-builder/references/interactive-state-sync-patterns.md +113 -0
- package/skills/apps-sdk-builder/references/repo-contract-and-validation.md +93 -0
- package/skills/apps-sdk-builder/references/search-fetch-standard.md +67 -0
- package/skills/apps-sdk-builder/references/upstream-example-workflow.md +79 -0
- package/skills/apps-sdk-builder/references/window-openai-patterns.md +79 -0
- package/skills/apps-sdk-builder/scripts/scaffold_node_ext_apps.mjs +606 -0
- package/skills/architecture-selector/SKILL.md +64 -0
- package/skills/backlog-planner/SKILL.md +68 -0
- package/skills/carplay-entitlement-checker/SKILL.md +82 -0
- package/skills/concept-discovery/SKILL.md +517 -0
- package/skills/concept-discovery/assets/sample-analysis.json +81 -0
- package/skills/concept-discovery/expected_outputs/sample-enum-dictionary.md +25 -0
- package/skills/concept-discovery/expected_outputs/sample-page-user-list.md +83 -0
- package/skills/concept-discovery/expected_outputs/sample-prd-readme.md +43 -0
- package/skills/concept-discovery/references/framework-patterns.md +228 -0
- package/skills/concept-discovery/references/prd-quality-checklist.md +65 -0
- package/skills/concept-discovery/scripts/codebase_analyzer.py +732 -0
- package/skills/concept-discovery/scripts/prd_scaffolder.py +435 -0
- package/skills/dast-zap/SKILL.md +453 -0
- package/skills/dast-zap/assets/.gitkeep +9 -0
- package/skills/dast-zap/assets/github_action.yml +207 -0
- package/skills/dast-zap/assets/gitlab_ci.yml +226 -0
- package/skills/dast-zap/assets/zap_automation.yaml +196 -0
- package/skills/dast-zap/assets/zap_context.xml +192 -0
- package/skills/dast-zap/references/EXAMPLE.md +40 -0
- package/skills/dast-zap/references/api_testing_guide.md +475 -0
- package/skills/dast-zap/references/authentication_guide.md +431 -0
- package/skills/dast-zap/references/false_positive_handling.md +427 -0
- package/skills/dast-zap/references/owasp_mapping.md +255 -0
- package/skills/dep-sbom-scan/SKILL.md +466 -0
- package/skills/deploy-cloudflare/SKILL.md +930 -0
- package/skills/deploy-docker/SKILL.md +55 -0
- package/skills/deploy-fly/SKILL.md +228 -0
- package/skills/deploy-k8s/SKILL.md +108 -0
- package/skills/deploy-k8s/assets/logo.png +0 -0
- package/skills/deploy-k8s/docs/README.md +29 -0
- package/skills/deploy-k8s/docs/SUMMARY.md +56 -0
- package/skills/deploy-k8s/docs/advanced/token-efficiency.md +61 -0
- package/skills/deploy-k8s/docs/architecture/multi-tenancy.md +96 -0
- package/skills/deploy-k8s/docs/architecture/storage-and-state.md +102 -0
- package/skills/deploy-k8s/docs/architecture/workload-patterns.md +87 -0
- package/skills/deploy-k8s/docs/book.json +16 -0
- package/skills/deploy-k8s/docs/community/changelog.md +34 -0
- package/skills/deploy-k8s/docs/community/contributing.md +67 -0
- package/skills/deploy-k8s/docs/core-concepts/failure-modes.md +153 -0
- package/skills/deploy-k8s/docs/core-concepts/philosophy.md +83 -0
- package/skills/deploy-k8s/docs/core-concepts/workflow.md +124 -0
- package/skills/deploy-k8s/docs/examples/bad-patterns.md +47 -0
- package/skills/deploy-k8s/docs/examples/do-dont-checklist.md +37 -0
- package/skills/deploy-k8s/docs/examples/good-patterns.md +49 -0
- package/skills/deploy-k8s/docs/failure-modes/api-drift.md +104 -0
- package/skills/deploy-k8s/docs/failure-modes/fragile-rollouts.md +99 -0
- package/skills/deploy-k8s/docs/failure-modes/insecure-workload-defaults.md +80 -0
- package/skills/deploy-k8s/docs/failure-modes/network-exposure.md +98 -0
- package/skills/deploy-k8s/docs/failure-modes/privilege-sprawl.md +91 -0
- package/skills/deploy-k8s/docs/failure-modes/resource-starvation.md +85 -0
- package/skills/deploy-k8s/docs/getting-started/installation.md +152 -0
- package/skills/deploy-k8s/docs/getting-started/quick-start.md +115 -0
- package/skills/deploy-k8s/docs/guides/helm-patterns.md +71 -0
- package/skills/deploy-k8s/docs/guides/kustomize-patterns.md +65 -0
- package/skills/deploy-k8s/docs/guides/observability.md +67 -0
- package/skills/deploy-k8s/docs/guides/security-hardening.md +59 -0
- package/skills/deploy-k8s/docs/guides/validation-and-policy.md +66 -0
- package/skills/deploy-k8s/docs/integrations/mcp-integration.md +52 -0
- package/skills/deploy-k8s/docs/package-lock.json +2892 -0
- package/skills/deploy-k8s/docs/package.json +13 -0
- package/skills/deploy-k8s/references/api-drift.md +298 -0
- package/skills/deploy-k8s/references/conditional/aks-patterns.md +70 -0
- package/skills/deploy-k8s/references/conditional/eks-patterns.md +79 -0
- package/skills/deploy-k8s/references/conditional/gitops-controllers.md +71 -0
- package/skills/deploy-k8s/references/conditional/gke-patterns.md +74 -0
- package/skills/deploy-k8s/references/conditional/observability-stacks.md +80 -0
- package/skills/deploy-k8s/references/conditional/openshift-patterns.md +67 -0
- package/skills/deploy-k8s/references/daemonset-operator-patterns.md +155 -0
- package/skills/deploy-k8s/references/deployment-patterns.md +146 -0
- package/skills/deploy-k8s/references/do-dont-patterns.md +87 -0
- package/skills/deploy-k8s/references/examples-bad.md +282 -0
- package/skills/deploy-k8s/references/examples-good.md +440 -0
- package/skills/deploy-k8s/references/fragile-rollouts.md +303 -0
- package/skills/deploy-k8s/references/helm-patterns.md +203 -0
- package/skills/deploy-k8s/references/insecure-workload-defaults.md +300 -0
- package/skills/deploy-k8s/references/job-patterns.md +120 -0
- package/skills/deploy-k8s/references/kustomize-patterns.md +239 -0
- package/skills/deploy-k8s/references/multi-tenancy.md +343 -0
- package/skills/deploy-k8s/references/network-exposure.md +481 -0
- package/skills/deploy-k8s/references/observability.md +302 -0
- package/skills/deploy-k8s/references/privilege-sprawl.md +273 -0
- package/skills/deploy-k8s/references/resource-starvation.md +374 -0
- package/skills/deploy-k8s/references/security-hardening.md +209 -0
- package/skills/deploy-k8s/references/stateful-patterns.md +130 -0
- package/skills/deploy-k8s/references/storage-and-state.md +330 -0
- package/skills/deploy-k8s/references/validation-and-policy.md +242 -0
- package/skills/deploy-railway/SKILL.md +235 -0
- package/skills/deploy-railway/references/analyze-db-mongo.md +84 -0
- package/skills/deploy-railway/references/analyze-db-mysql.md +254 -0
- package/skills/deploy-railway/references/analyze-db-postgres.md +479 -0
- package/skills/deploy-railway/references/analyze-db-redis.md +208 -0
- package/skills/deploy-railway/references/analyze-db.md +344 -0
- package/skills/deploy-railway/references/configure.md +309 -0
- package/skills/deploy-railway/references/deploy.md +195 -0
- package/skills/deploy-railway/references/operate.md +214 -0
- package/skills/deploy-railway/references/request.md +248 -0
- package/skills/deploy-railway/references/setup.md +312 -0
- package/skills/deploy-railway/scripts/analyze-mongo.py +1549 -0
- package/skills/deploy-railway/scripts/analyze-mysql.py +1195 -0
- package/skills/deploy-railway/scripts/analyze-postgres.py +3058 -0
- package/skills/deploy-railway/scripts/analyze-redis.py +1090 -0
- package/skills/deploy-railway/scripts/dal.py +671 -0
- package/skills/deploy-railway/scripts/enable-pg-stats.py +170 -0
- package/skills/deploy-railway/scripts/pg-extensions.py +370 -0
- package/skills/deploy-railway/scripts/railway-api.sh +52 -0
- package/skills/deploy-ssh/SKILL.md +91 -0
- package/skills/deploy-vercel/SKILL.md +304 -0
- package/skills/deploy-vercel/resources/deploy-codex.sh +301 -0
- package/skills/deploy-vercel/resources/deploy.sh +301 -0
- package/skills/docs-runbooks/SKILL.md +399 -0
- package/skills/drive-status-renderer/SKILL.md +62 -0
- package/skills/iac-scan/SKILL.md +680 -0
- package/skills/iac-scan/assets/.gitkeep +9 -0
- package/skills/iac-scan/assets/checkov_config.yaml +94 -0
- package/skills/iac-scan/assets/github_actions.yml +199 -0
- package/skills/iac-scan/assets/gitlab_ci.yml +218 -0
- package/skills/iac-scan/assets/pre_commit_config.yaml +92 -0
- package/skills/iac-scan/references/EXAMPLE.md +40 -0
- package/skills/iac-scan/references/compliance_mapping.md +237 -0
- package/skills/iac-scan/references/custom_policies.md +460 -0
- package/skills/iac-scan/references/suppression_guide.md +431 -0
- package/skills/incident-briefing/SKILL.md +66 -0
- package/skills/incident-triage/SKILL.md +481 -0
- package/{LICENSE → skills/mcp-builder/LICENSE.txt} +15 -14
- package/skills/mcp-builder/SKILL.md +244 -0
- package/skills/mcp-builder/reference/evaluation.md +602 -0
- package/skills/mcp-builder/reference/mcp_best_practices.md +249 -0
- package/skills/mcp-builder/reference/node_mcp_server.md +970 -0
- package/skills/mcp-builder/reference/python_mcp_server.md +719 -0
- package/skills/mcp-builder/scripts/connections.py +151 -0
- package/skills/mcp-builder/scripts/evaluation.py +373 -0
- package/skills/mcp-builder/scripts/example_evaluation.xml +22 -0
- package/skills/mcp-builder/scripts/requirements.txt +2 -0
- package/skills/mobile-pairing/SKILL.md +52 -0
- package/skills/ops-sre/SKILL.md +297 -0
- package/skills/playwright-qa/LICENSE.txt +201 -0
- package/skills/playwright-qa/NOTICE.txt +14 -0
- package/skills/playwright-qa/SKILL.md +156 -0
- package/skills/playwright-qa/agents/openai.yaml +6 -0
- package/skills/playwright-qa/assets/playwright-small.svg +3 -0
- package/skills/playwright-qa/assets/playwright.png +0 -0
- package/skills/playwright-qa/references/cli.md +116 -0
- package/skills/playwright-qa/references/workflows.md +95 -0
- package/skills/playwright-qa/scripts/playwright_cli.sh +25 -0
- package/skills/release-publish/SKILL.md +85 -0
- package/skills/repo-bootstrap/SKILL.md +92 -0
- package/skills/repo-bootstrap/assets/example-workflows/validate-agents.yml +89 -0
- package/skills/repo-bootstrap/assets/root-thin.md +141 -0
- package/skills/repo-bootstrap/assets/root-verbose.md +149 -0
- package/skills/repo-bootstrap/assets/scoped/backend-go.md +107 -0
- package/skills/repo-bootstrap/assets/scoped/backend-php.md +94 -0
- package/skills/repo-bootstrap/assets/scoped/backend-python.md +84 -0
- package/skills/repo-bootstrap/assets/scoped/backend-typescript.md +89 -0
- package/skills/repo-bootstrap/assets/scoped/claude-code-skill.md +101 -0
- package/skills/repo-bootstrap/assets/scoped/cli.md +83 -0
- package/skills/repo-bootstrap/assets/scoped/concourse.md +196 -0
- package/skills/repo-bootstrap/assets/scoped/ddev.md +68 -0
- package/skills/repo-bootstrap/assets/scoped/docker.md +160 -0
- package/skills/repo-bootstrap/assets/scoped/documentation.md +98 -0
- package/skills/repo-bootstrap/assets/scoped/examples.md +96 -0
- package/skills/repo-bootstrap/assets/scoped/frontend-typescript.md +88 -0
- package/skills/repo-bootstrap/assets/scoped/github-actions.md +174 -0
- package/skills/repo-bootstrap/assets/scoped/gitlab-ci.md +174 -0
- package/skills/repo-bootstrap/assets/scoped/oro-bundle.md +209 -0
- package/skills/repo-bootstrap/assets/scoped/oro-project.md +170 -0
- package/skills/repo-bootstrap/assets/scoped/python-modern.md +170 -0
- package/skills/repo-bootstrap/assets/scoped/resources.md +96 -0
- package/skills/repo-bootstrap/assets/scoped/skill-repo.md +139 -0
- package/skills/repo-bootstrap/assets/scoped/symfony.md +168 -0
- package/skills/repo-bootstrap/assets/scoped/testing.md +87 -0
- package/skills/repo-bootstrap/assets/scoped/typo3-docs.md +103 -0
- package/skills/repo-bootstrap/assets/scoped/typo3-extension.md +133 -0
- package/skills/repo-bootstrap/assets/scoped/typo3-project.md +137 -0
- package/skills/repo-bootstrap/assets/scoped/typo3-testing.md +80 -0
- package/skills/repo-bootstrap/checkpoints.yaml +279 -0
- package/skills/repo-bootstrap/evals/evals.json +385 -0
- package/skills/repo-bootstrap/references/ai-contribution-guidelines.md +63 -0
- package/skills/repo-bootstrap/references/ai-tool-compatibility.md +223 -0
- package/skills/repo-bootstrap/references/directory-coverage.md +82 -0
- package/skills/repo-bootstrap/references/examples/coding-agent-cli/AGENTS.md +70 -0
- package/skills/repo-bootstrap/references/examples/coding-agent-cli/go.mod +3 -0
- package/skills/repo-bootstrap/references/examples/coding-agent-cli/scripts-AGENTS.md +389 -0
- package/skills/repo-bootstrap/references/examples/express-api-ts/.env.example +13 -0
- package/skills/repo-bootstrap/references/examples/express-api-ts/AGENTS.md +91 -0
- package/skills/repo-bootstrap/references/examples/express-api-ts/package.json +33 -0
- package/skills/repo-bootstrap/references/examples/express-api-ts/pnpm-lock.yaml +3 -0
- package/skills/repo-bootstrap/references/examples/express-api-ts/src/AGENTS.md +91 -0
- package/skills/repo-bootstrap/references/examples/express-api-ts/src/config.ts +28 -0
- package/skills/repo-bootstrap/references/examples/express-api-ts/src/controllers/userController.ts +74 -0
- package/skills/repo-bootstrap/references/examples/express-api-ts/src/index.ts +26 -0
- package/skills/repo-bootstrap/references/examples/express-api-ts/src/middleware/errorHandler.ts +45 -0
- package/skills/repo-bootstrap/references/examples/express-api-ts/src/middleware/requestLogger.ts +18 -0
- package/skills/repo-bootstrap/references/examples/express-api-ts/src/routes/health.ts +18 -0
- package/skills/repo-bootstrap/references/examples/express-api-ts/src/routes/users.ts +13 -0
- package/skills/repo-bootstrap/references/examples/express-api-ts/src/utils/errors.ts +40 -0
- package/skills/repo-bootstrap/references/examples/express-api-ts/src/utils/logger.ts +14 -0
- package/skills/repo-bootstrap/references/examples/express-api-ts/tsconfig.json +24 -0
- package/skills/repo-bootstrap/references/examples/fastapi-app/.env.example +19 -0
- package/skills/repo-bootstrap/references/examples/fastapi-app/AGENTS.md +92 -0
- package/skills/repo-bootstrap/references/examples/fastapi-app/pyproject.toml +88 -0
- package/skills/repo-bootstrap/references/examples/fastapi-app/src/AGENTS.md +85 -0
- package/skills/repo-bootstrap/references/examples/fastapi-app/src/__init__.py +3 -0
- package/skills/repo-bootstrap/references/examples/fastapi-app/src/config.py +49 -0
- package/skills/repo-bootstrap/references/examples/fastapi-app/src/main.py +66 -0
- package/skills/repo-bootstrap/references/examples/fastapi-app/src/models/__init__.py +13 -0
- package/skills/repo-bootstrap/references/examples/fastapi-app/src/models/item.py +43 -0
- package/skills/repo-bootstrap/references/examples/fastapi-app/src/models/user.py +40 -0
- package/skills/repo-bootstrap/references/examples/fastapi-app/src/routes/__init__.py +5 -0
- package/skills/repo-bootstrap/references/examples/fastapi-app/src/routes/health.py +20 -0
- package/skills/repo-bootstrap/references/examples/fastapi-app/src/routes/items.py +61 -0
- package/skills/repo-bootstrap/references/examples/fastapi-app/src/routes/users.py +55 -0
- package/skills/repo-bootstrap/references/examples/fastapi-app/src/services/__init__.py +6 -0
- package/skills/repo-bootstrap/references/examples/fastapi-app/src/services/item_service.py +77 -0
- package/skills/repo-bootstrap/references/examples/fastapi-app/src/services/user_service.py +69 -0
- package/skills/repo-bootstrap/references/examples/fastapi-app/uv.lock +4 -0
- package/skills/repo-bootstrap/references/examples/go-api-with-react-admin/.scopes +3 -0
- package/skills/repo-bootstrap/references/examples/go-api-with-react-admin/AGENTS.md +86 -0
- package/skills/repo-bootstrap/references/examples/go-api-with-react-admin/admin/package.json +20 -0
- package/skills/repo-bootstrap/references/examples/go-api-with-react-admin/admin/src/App.tsx +5 -0
- package/skills/repo-bootstrap/references/examples/go-api-with-react-admin/cmd/api/main.go +7 -0
- package/skills/repo-bootstrap/references/examples/go-api-with-react-admin/go.mod +2 -0
- package/skills/repo-bootstrap/references/examples/go-api-with-react-admin/main.go +7 -0
- package/skills/repo-bootstrap/references/examples/go-with-internal-web-tsx/.scopes +3 -0
- package/skills/repo-bootstrap/references/examples/go-with-internal-web-tsx/AGENTS.md +89 -0
- package/skills/repo-bootstrap/references/examples/go-with-internal-web-tsx/go.mod +2 -0
- package/skills/repo-bootstrap/references/examples/go-with-internal-web-tsx/internal/web/AGENTS.md +90 -0
- package/skills/repo-bootstrap/references/examples/go-with-internal-web-tsx/internal/web/package.json +17 -0
- package/skills/repo-bootstrap/references/examples/go-with-internal-web-tsx/internal/web/src/App.tsx +1 -0
- package/skills/repo-bootstrap/references/examples/go-with-internal-web-tsx/internal/web/src/Button.tsx +1 -0
- package/skills/repo-bootstrap/references/examples/go-with-internal-web-tsx/internal/web/src/Footer.tsx +1 -0
- package/skills/repo-bootstrap/references/examples/go-with-internal-web-tsx/internal/web/src/Header.tsx +1 -0
- package/skills/repo-bootstrap/references/examples/go-with-internal-web-tsx/internal/web/src/Sidebar.tsx +1 -0
- package/skills/repo-bootstrap/references/examples/go-with-internal-web-tsx/main.go +7 -0
- package/skills/repo-bootstrap/references/examples/go-with-internal-web-tsx/package-lock.json +0 -0
- package/skills/repo-bootstrap/references/examples/go-with-internal-web-tsx/package.json +12 -0
- package/skills/repo-bootstrap/references/examples/ldap-selfservice/AGENTS.md +70 -0
- package/skills/repo-bootstrap/references/examples/ldap-selfservice/go.mod +3 -0
- package/skills/repo-bootstrap/references/examples/ldap-selfservice/internal-AGENTS.md +371 -0
- package/skills/repo-bootstrap/references/examples/ldap-selfservice/internal-web-AGENTS.md +448 -0
- package/skills/repo-bootstrap/references/examples/php-with-frontend/.scopes +3 -0
- package/skills/repo-bootstrap/references/examples/php-with-frontend/AGENTS.md +91 -0
- package/skills/repo-bootstrap/references/examples/php-with-frontend/composer.json +8 -0
- package/skills/repo-bootstrap/references/examples/php-with-frontend/package.json +15 -0
- package/skills/repo-bootstrap/references/examples/php-with-frontend/pnpm-lock.yaml +0 -0
- package/skills/repo-bootstrap/references/examples/php-with-frontend/src/Controller.php +3 -0
- package/skills/repo-bootstrap/references/examples/php-with-frontend/web/AGENTS.md +92 -0
- package/skills/repo-bootstrap/references/examples/php-with-frontend/web/package.json +26 -0
- package/skills/repo-bootstrap/references/examples/php-with-frontend/web/src/App.tsx +3 -0
- package/skills/repo-bootstrap/references/examples/php-with-frontend/web/src/Button.tsx +10 -0
- package/skills/repo-bootstrap/references/examples/php-with-frontend/web/src/Footer.tsx +9 -0
- package/skills/repo-bootstrap/references/examples/php-with-frontend/web/src/Header.tsx +9 -0
- package/skills/repo-bootstrap/references/examples/php-with-frontend/web/src/main.tsx +3 -0
- package/skills/repo-bootstrap/references/examples/php-with-frontend/web/tsconfig.json +13 -0
- package/skills/repo-bootstrap/references/examples/pnpm-workspace/AGENTS.md +75 -0
- package/skills/repo-bootstrap/references/examples/pnpm-workspace/package.json +7 -0
- package/skills/repo-bootstrap/references/examples/pnpm-workspace/packages/web/package.json +11 -0
- package/skills/repo-bootstrap/references/examples/pnpm-workspace/packages/web/src/index.ts +11 -0
- package/skills/repo-bootstrap/references/examples/pnpm-workspace/pnpm-lock.yaml +42 -0
- package/skills/repo-bootstrap/references/examples/pnpm-workspace/pnpm-workspace.yaml +2 -0
- package/skills/repo-bootstrap/references/examples/simple-ldap-go/AGENTS.md +70 -0
- package/skills/repo-bootstrap/references/examples/simple-ldap-go/examples-AGENTS.md +45 -0
- package/skills/repo-bootstrap/references/examples/simple-ldap-go/go.mod +3 -0
- package/skills/repo-bootstrap/references/examples/t3x-rte-ckeditor-image/AGENTS.md +70 -0
- package/skills/repo-bootstrap/references/examples/t3x-rte-ckeditor-image/Classes-AGENTS.md +392 -0
- package/skills/repo-bootstrap/references/examples/t3x-rte-ckeditor-image/composer.json +8 -0
- package/skills/repo-bootstrap/references/feedback-memory-schema.md +135 -0
- package/skills/repo-bootstrap/references/git-hooks-setup.md +79 -0
- package/skills/repo-bootstrap/references/output-structure.md +124 -0
- package/skills/repo-bootstrap/references/scripts-guide.md +175 -0
- package/skills/repo-bootstrap/references/verification-guide.md +137 -0
- package/skills/repo-bootstrap/scripts/analyze-git-history.sh +315 -0
- package/skills/repo-bootstrap/scripts/check-freshness.sh +230 -0
- package/skills/repo-bootstrap/scripts/detect-golden-samples.sh +161 -0
- package/skills/repo-bootstrap/scripts/detect-heuristics.sh +93 -0
- package/skills/repo-bootstrap/scripts/detect-project.sh +486 -0
- package/skills/repo-bootstrap/scripts/detect-scopes.sh +330 -0
- package/skills/repo-bootstrap/scripts/detect-utilities.sh +133 -0
- package/skills/repo-bootstrap/scripts/extract-adrs.sh +194 -0
- package/skills/repo-bootstrap/scripts/extract-agent-configs.sh +331 -0
- package/skills/repo-bootstrap/scripts/extract-architecture-rules.sh +522 -0
- package/skills/repo-bootstrap/scripts/extract-ci-commands.sh +385 -0
- package/skills/repo-bootstrap/scripts/extract-ci-rules.sh +384 -0
- package/skills/repo-bootstrap/scripts/extract-commands.sh +358 -0
- package/skills/repo-bootstrap/scripts/extract-documentation.sh +308 -0
- package/skills/repo-bootstrap/scripts/extract-github-rulesets.sh +96 -0
- package/skills/repo-bootstrap/scripts/extract-github-settings.sh +88 -0
- package/skills/repo-bootstrap/scripts/extract-ide-settings.sh +228 -0
- package/skills/repo-bootstrap/scripts/extract-platform-files.sh +290 -0
- package/skills/repo-bootstrap/scripts/extract-quality-configs.sh +442 -0
- package/skills/repo-bootstrap/scripts/generate-agents.sh +2424 -0
- package/skills/repo-bootstrap/scripts/generate-file-map.sh +153 -0
- package/skills/repo-bootstrap/scripts/lib/config-root.sh +211 -0
- package/skills/repo-bootstrap/scripts/lib/summary.sh +244 -0
- package/skills/repo-bootstrap/scripts/lib/template.sh +397 -0
- package/skills/repo-bootstrap/scripts/validate-structure.sh +324 -0
- package/skills/repo-bootstrap/scripts/verify-commands.sh +615 -0
- package/skills/repo-bootstrap/scripts/verify-content.sh +302 -0
- package/skills/schema-api-contracts/SKILL.md +56 -0
- package/skills/secret-hygiene/SKILL.md +511 -0
- package/skills/secret-hygiene/assets/.gitkeep +9 -0
- package/skills/secret-hygiene/assets/config-balanced.toml +81 -0
- package/skills/secret-hygiene/assets/config-custom.toml +178 -0
- package/skills/secret-hygiene/assets/config-strict.toml +48 -0
- package/skills/secret-hygiene/assets/github-action.yml +181 -0
- package/skills/secret-hygiene/assets/gitlab-ci.yml +257 -0
- package/skills/secret-hygiene/assets/precommit-config.yaml +70 -0
- package/skills/secret-hygiene/references/EXAMPLE.md +40 -0
- package/skills/secret-hygiene/references/compliance_mapping.md +538 -0
- package/skills/secret-hygiene/references/detection_rules.md +276 -0
- package/skills/secret-hygiene/references/false_positives.md +598 -0
- package/skills/secret-hygiene/references/remediation_guide.md +530 -0
- package/skills/stack-selector/SKILL.md +56 -0
- package/skills/telegram-control/SKILL.md +110 -0
- package/skills/telegram-control/references/architecture.md +184 -0
- package/skills/telegram-control/references/convex.md +173 -0
- package/skills/telegram-control/references/error_handling.md +212 -0
- package/skills/telegram-control/references/initial_setup.md +165 -0
- package/skills/telegram-control/references/telegram_api.md +156 -0
- package/skills/telegram-control/scripts/cancel_message.ts +53 -0
- package/skills/telegram-control/scripts/list_scheduled.ts +103 -0
- package/skills/telegram-control/scripts/logger.ts +121 -0
- package/skills/telegram-control/scripts/proxy-util.ts +11 -0
- package/skills/telegram-control/scripts/schedule_message.ts +216 -0
- package/skills/telegram-control/scripts/send_message.ts +115 -0
- package/skills/telegram-control/scripts/setup.ts +185 -0
- package/skills/telegram-control/scripts/types.ts +75 -0
- package/skills/telegram-control/scripts/view_history.ts +74 -0
- package/skills/test-strategy/SKILL.md +352 -0
- package/skills/threat-model/SKILL.md +303 -0
- package/skills/threat-model/examples/example-output.md +196 -0
- package/skills/threat-model/template.md +96 -0
- package/skills/ts-lint/SKILL.md +80 -0
- package/skills/ui-flow/SKILL.md +668 -0
- package/skills/voice-command-router/SKILL.md +51 -0
- package/skills/widget-live-activity-sync/SKILL.md +66 -0
|
@@ -0,0 +1,397 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Template rendering helper functions
|
|
3
|
+
|
|
4
|
+
# Remove sections that are entirely empty (only header + whitespace/empty tables)
|
|
5
|
+
# A section is: ## Header followed by content until next ## or EOF
|
|
6
|
+
# Empty means: only whitespace, empty table headers (2 rows only), or empty code blocks
|
|
7
|
+
remove_empty_sections() {
|
|
8
|
+
local content="$1"
|
|
9
|
+
|
|
10
|
+
# Use awk to process sections
|
|
11
|
+
echo "$content" | awk '
|
|
12
|
+
BEGIN {
|
|
13
|
+
section_header = ""
|
|
14
|
+
section_body = ""
|
|
15
|
+
preamble = ""
|
|
16
|
+
in_section = 0
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
# Match section headers (## Something)
|
|
20
|
+
/^## / {
|
|
21
|
+
# Flush previous section if it had real content
|
|
22
|
+
if (in_section) {
|
|
23
|
+
if (has_content(section_body)) {
|
|
24
|
+
print section_header
|
|
25
|
+
printf "%s", section_body
|
|
26
|
+
}
|
|
27
|
+
} else {
|
|
28
|
+
# Print any preamble before first section
|
|
29
|
+
printf "%s", preamble
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
section_header = $0
|
|
33
|
+
section_body = ""
|
|
34
|
+
in_section = 1
|
|
35
|
+
next
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
# Accumulate content
|
|
39
|
+
{
|
|
40
|
+
if (in_section) {
|
|
41
|
+
section_body = section_body $0 "\n"
|
|
42
|
+
} else {
|
|
43
|
+
preamble = preamble $0 "\n"
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
END {
|
|
48
|
+
# Flush last section
|
|
49
|
+
if (in_section && has_content(section_body)) {
|
|
50
|
+
print section_header
|
|
51
|
+
printf "%s", section_body
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
# Check if body has real content (not just empty structural elements)
|
|
56
|
+
function has_content(body, stripped, table_rows, n, i, data_rows) {
|
|
57
|
+
stripped = body
|
|
58
|
+
|
|
59
|
+
# Remove HTML comments
|
|
60
|
+
gsub(/<!--[^>]*-->/, "", stripped)
|
|
61
|
+
|
|
62
|
+
# Count table rows - if exactly 2 (header + divider), table is empty
|
|
63
|
+
# Split by newlines and count lines starting with |
|
|
64
|
+
n = split(stripped, lines, "\n")
|
|
65
|
+
table_rows = 0
|
|
66
|
+
data_rows = 0
|
|
67
|
+
for (i = 1; i <= n; i++) {
|
|
68
|
+
if (lines[i] ~ /^\|/) {
|
|
69
|
+
table_rows++
|
|
70
|
+
# Data row = table row that is NOT a header divider (|---|)
|
|
71
|
+
if (lines[i] !~ /^\|[-:| ]+\|$/) {
|
|
72
|
+
# Also not just the header row if we are still in first 2
|
|
73
|
+
if (table_rows > 2) {
|
|
74
|
+
data_rows++
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
# If we have a table with more than 2 rows, it has data
|
|
81
|
+
if (table_rows > 2) {
|
|
82
|
+
return 1
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
# Remove tables that are just header+divider (2 rows)
|
|
86
|
+
# Pattern: | ... |\n|---...|\n
|
|
87
|
+
gsub(/\|[^|\n]+(\|[^|\n]+)*\|\n\|[-:| ]+\|\n?/, "", stripped)
|
|
88
|
+
|
|
89
|
+
# Remove empty code blocks (``` followed by optional whitespace and ```)
|
|
90
|
+
gsub(/```[^\n]*\n[ \t]*\n?```/, "", stripped)
|
|
91
|
+
# Remove standalone code block markers
|
|
92
|
+
gsub(/```[a-z]*\n?/, "", stripped)
|
|
93
|
+
|
|
94
|
+
# Remove bullet points that are just placeholder markers or empty
|
|
95
|
+
gsub(/^[ \t]*[-*][ \t]*\n/, "", stripped)
|
|
96
|
+
|
|
97
|
+
# Remove lines that say "No scoped AGENTS.md files yet" or similar placeholder text
|
|
98
|
+
gsub(/- \(No scoped [^)]+\)/, "", stripped)
|
|
99
|
+
gsub(/- No known [^\n]+/, "", stripped)
|
|
100
|
+
|
|
101
|
+
# Check if anything substantive remains
|
|
102
|
+
gsub(/[ \t\n]/, "", stripped)
|
|
103
|
+
|
|
104
|
+
return length(stripped) > 0
|
|
105
|
+
}
|
|
106
|
+
'
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
# Render template with placeholder replacement
|
|
110
|
+
# Supports multi-line values using bash string replacement
|
|
111
|
+
render_template() {
|
|
112
|
+
local template_file="$1"
|
|
113
|
+
local output_file="$2"
|
|
114
|
+
local -n template_vars=$3
|
|
115
|
+
|
|
116
|
+
local content
|
|
117
|
+
content=$(cat "$template_file")
|
|
118
|
+
|
|
119
|
+
# Replace all placeholders using bash parameter expansion
|
|
120
|
+
# This handles multi-line values correctly
|
|
121
|
+
for key in "${!template_vars[@]}"; do
|
|
122
|
+
local value="${template_vars[$key]}"
|
|
123
|
+
content="${content//"{{$key}}"/$value}"
|
|
124
|
+
done
|
|
125
|
+
|
|
126
|
+
# Handle remaining unfilled placeholders
|
|
127
|
+
# Delete table rows containing unresolved placeholders
|
|
128
|
+
content=$(echo "$content" | sed '/^|.*{{[A-Z_]*}}.*|$/d')
|
|
129
|
+
|
|
130
|
+
# Delete bullet points with only unresolved placeholders
|
|
131
|
+
content=$(echo "$content" | sed '/^[[:space:]]*[-*][[:space:]]*{{[A-Z_][A-Z0-9_]*}}[[:space:]]*$/d')
|
|
132
|
+
|
|
133
|
+
# Delete lines that are ONLY a placeholder (prevents blank lines in tables)
|
|
134
|
+
content=$(echo "$content" | sed '/^{{[A-Z_][A-Z0-9_]*}}$/d')
|
|
135
|
+
# Also handle placeholders with leading/trailing whitespace
|
|
136
|
+
content=$(echo "$content" | sed '/^[[:space:]]*{{[A-Z_][A-Z0-9_]*}}[[:space:]]*$/d')
|
|
137
|
+
|
|
138
|
+
# Remove any remaining inline placeholders (better than "(not configured)" noise)
|
|
139
|
+
content=$(echo "$content" | sed 's/{{[A-Z_][A-Z0-9_]*}}//g')
|
|
140
|
+
|
|
141
|
+
# Remove empty lines that appear after table rows but before non-table content
|
|
142
|
+
# This fixes broken tables when placeholders were replaced with empty content
|
|
143
|
+
content=$(echo "$content" | awk '
|
|
144
|
+
/^\|.*\|$/ {
|
|
145
|
+
# Print any pending empty lines first if we are continuing a table
|
|
146
|
+
if (prev_was_table && pending_empty) {
|
|
147
|
+
# Skip the pending empty - it was between table rows with no data
|
|
148
|
+
}
|
|
149
|
+
print
|
|
150
|
+
prev_was_table=1
|
|
151
|
+
pending_empty=0
|
|
152
|
+
next
|
|
153
|
+
}
|
|
154
|
+
/^[[:space:]]*$/ {
|
|
155
|
+
if (prev_was_table) {
|
|
156
|
+
pending_empty=1 # Hold empty line, might be inside table
|
|
157
|
+
} else {
|
|
158
|
+
print # Normal empty line outside table
|
|
159
|
+
}
|
|
160
|
+
next
|
|
161
|
+
}
|
|
162
|
+
{
|
|
163
|
+
# Non-table line - do not print pending empty from table section
|
|
164
|
+
pending_empty=0
|
|
165
|
+
prev_was_table=0
|
|
166
|
+
print
|
|
167
|
+
}
|
|
168
|
+
')
|
|
169
|
+
|
|
170
|
+
# Clean up multiple consecutive empty lines
|
|
171
|
+
content=$(echo "$content" | cat -s)
|
|
172
|
+
|
|
173
|
+
# Remove empty sections (only header + whitespace/empty tables)
|
|
174
|
+
content=$(remove_empty_sections "$content")
|
|
175
|
+
|
|
176
|
+
# Final cleanup of multiple consecutive empty lines after section removal
|
|
177
|
+
content=$(echo "$content" | cat -s)
|
|
178
|
+
|
|
179
|
+
# Write output
|
|
180
|
+
printf '%s\n' "$content" > "$output_file"
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
# Validate rendered content has no remaining placeholders
|
|
184
|
+
# Returns 0 if valid, 1 if placeholders found
|
|
185
|
+
validate_no_placeholders() {
|
|
186
|
+
local file="$1"
|
|
187
|
+
local strict="${2:-false}"
|
|
188
|
+
|
|
189
|
+
if grep -qE '\{\{[A-Z][A-Z0-9_]*\}\}' "$file"; then
|
|
190
|
+
local placeholders
|
|
191
|
+
placeholders=$(grep -oE '\{\{[A-Z][A-Z0-9_]*\}\}' "$file" | sort -u | tr '\n' ' ')
|
|
192
|
+
|
|
193
|
+
if [ "$strict" = "true" ]; then
|
|
194
|
+
echo "[ERROR] Unresolved placeholders in $file: $placeholders" >&2
|
|
195
|
+
return 1
|
|
196
|
+
else
|
|
197
|
+
echo "[WARN] Unresolved placeholders in $file: $placeholders" >&2
|
|
198
|
+
return 0
|
|
199
|
+
fi
|
|
200
|
+
fi
|
|
201
|
+
return 0
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
# Generate timestamp
|
|
205
|
+
get_timestamp() {
|
|
206
|
+
date +%Y-%m-%d
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
# Build scope index for root template
|
|
210
|
+
build_scope_index() {
|
|
211
|
+
local scopes_json="$1"
|
|
212
|
+
local index=""
|
|
213
|
+
|
|
214
|
+
local count=$(echo "$scopes_json" | jq '.scopes | length')
|
|
215
|
+
if [ "$count" -eq 0 ]; then
|
|
216
|
+
echo "- (No scoped AGENTS.md files yet)"
|
|
217
|
+
return
|
|
218
|
+
fi
|
|
219
|
+
|
|
220
|
+
while read -r scope; do
|
|
221
|
+
local path=$(echo "$scope" | jq -r '.path')
|
|
222
|
+
local type=$(echo "$scope" | jq -r '.type')
|
|
223
|
+
local description=$(get_scope_description "$type")
|
|
224
|
+
|
|
225
|
+
index="$index- \`./$path/AGENTS.md\` — $description\n"
|
|
226
|
+
done < <(echo "$scopes_json" | jq -c '.scopes[]')
|
|
227
|
+
|
|
228
|
+
echo -e "$index"
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
# Get description for scope type
|
|
232
|
+
get_scope_description() {
|
|
233
|
+
local type="$1"
|
|
234
|
+
|
|
235
|
+
case "$type" in
|
|
236
|
+
"backend-go") echo "Backend services (Go)" ;;
|
|
237
|
+
"backend-php") echo "Backend services (PHP)" ;;
|
|
238
|
+
"backend-typescript") echo "Backend services (TypeScript/Node.js)" ;;
|
|
239
|
+
"backend-python") echo "Backend services (Python)" ;;
|
|
240
|
+
"frontend-typescript") echo "Frontend application (TypeScript/React/Vue)" ;;
|
|
241
|
+
"cli") echo "Command-line interface tools and entry points" ;;
|
|
242
|
+
"testing") echo "Test suites, fixtures, and testing utilities" ;;
|
|
243
|
+
"documentation") echo "Project documentation, guides, and reference materials" ;;
|
|
244
|
+
"examples") echo "Example applications, usage patterns, and sample code" ;;
|
|
245
|
+
"resources") echo "Static resources, assets, templates, and configuration files" ;;
|
|
246
|
+
"docker") echo "Container/Docker configuration for building and deploying images" ;;
|
|
247
|
+
"claude-code-skill") echo "Claude Code skill/plugin providing AI agent capabilities" ;;
|
|
248
|
+
"typo3-extension") echo "TYPO3 extension following TYPO3 CGL and PSR-12" ;;
|
|
249
|
+
"typo3-project") echo "TYPO3 project installation with site configuration" ;;
|
|
250
|
+
"oro-bundle") echo "Oro bundle following Oro Architecture and Symfony best practices" ;;
|
|
251
|
+
"oro-project") echo "Oro application with platform configuration and bundles" ;;
|
|
252
|
+
"symfony") echo "Symfony application following Symfony best practices" ;;
|
|
253
|
+
"github-actions") echo "GitHub Actions workflows and CI/CD automation" ;;
|
|
254
|
+
"gitlab-ci") echo "GitLab CI/CD pipeline configuration" ;;
|
|
255
|
+
"concourse") echo "Concourse CI pipeline and task definitions" ;;
|
|
256
|
+
*) echo "$type" ;;
|
|
257
|
+
esac
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
# Get language-specific conventions text
|
|
261
|
+
get_language_conventions() {
|
|
262
|
+
local language="$1"
|
|
263
|
+
local version="$2"
|
|
264
|
+
|
|
265
|
+
case "$language" in
|
|
266
|
+
"go")
|
|
267
|
+
echo "- Follow Go $version conventions and idioms"
|
|
268
|
+
;;
|
|
269
|
+
"php")
|
|
270
|
+
echo "- Follow PSR-12 coding standards and PHP $version features"
|
|
271
|
+
;;
|
|
272
|
+
"typescript")
|
|
273
|
+
echo "- Use TypeScript strict mode with proper type annotations"
|
|
274
|
+
;;
|
|
275
|
+
"python")
|
|
276
|
+
echo "- Follow PEP 8 style guide and Python $version features"
|
|
277
|
+
;;
|
|
278
|
+
*)
|
|
279
|
+
echo ""
|
|
280
|
+
;;
|
|
281
|
+
esac
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
# Format command with fallback text
|
|
285
|
+
format_command() {
|
|
286
|
+
local cmd="$1"
|
|
287
|
+
local fallback="$2"
|
|
288
|
+
|
|
289
|
+
if [ -n "$cmd" ] && [ "$cmd" != "null" ]; then
|
|
290
|
+
echo "$cmd"
|
|
291
|
+
else
|
|
292
|
+
echo "$fallback"
|
|
293
|
+
fi
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
# Check if file has generated section markers
|
|
297
|
+
has_generated_markers() {
|
|
298
|
+
local file="$1"
|
|
299
|
+
grep -q 'AGENTS-GENERATED:START' "$file" 2>/dev/null
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
# Extract section names from file
|
|
303
|
+
get_section_names() {
|
|
304
|
+
local file="$1"
|
|
305
|
+
grep -oE 'AGENTS-GENERATED:START [a-z0-9-]+' "$file" 2>/dev/null | sed 's/AGENTS-GENERATED:START //' | sort -u
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
# Extract content between markers for a section
|
|
309
|
+
get_section_content() {
|
|
310
|
+
local file="$1"
|
|
311
|
+
local section="$2"
|
|
312
|
+
|
|
313
|
+
sed -n "/AGENTS-GENERATED:START $section/,/AGENTS-GENERATED:END $section/p" "$file" 2>/dev/null | \
|
|
314
|
+
sed '1d;$d' # Remove the marker lines themselves
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
# Update only generated sections in an existing file
|
|
318
|
+
# Preserves all content outside markers
|
|
319
|
+
update_generated_sections() {
|
|
320
|
+
local template_file="$1"
|
|
321
|
+
local existing_file="$2"
|
|
322
|
+
local output_file="$3"
|
|
323
|
+
local -n update_vars=$4
|
|
324
|
+
|
|
325
|
+
# First render the template to get new content
|
|
326
|
+
local temp_rendered
|
|
327
|
+
temp_rendered=$(mktemp)
|
|
328
|
+
render_template "$template_file" "$temp_rendered" update_vars
|
|
329
|
+
|
|
330
|
+
# If existing file doesn't have markers, just overwrite
|
|
331
|
+
if ! has_generated_markers "$existing_file"; then
|
|
332
|
+
mv "$temp_rendered" "$output_file"
|
|
333
|
+
return 0
|
|
334
|
+
fi
|
|
335
|
+
|
|
336
|
+
# Get all section names from the rendered template
|
|
337
|
+
local sections
|
|
338
|
+
sections=$(get_section_names "$temp_rendered")
|
|
339
|
+
|
|
340
|
+
# Start with the existing file content
|
|
341
|
+
local result
|
|
342
|
+
result=$(cat "$existing_file")
|
|
343
|
+
|
|
344
|
+
# Replace each generated section
|
|
345
|
+
for section in $sections; do
|
|
346
|
+
local new_content
|
|
347
|
+
new_content=$(get_section_content "$temp_rendered" "$section")
|
|
348
|
+
|
|
349
|
+
if [ -n "$new_content" ]; then
|
|
350
|
+
# Create a sed-safe version of the new content
|
|
351
|
+
# Use awk for multi-line replacement
|
|
352
|
+
result=$(echo "$result" | awk -v section="$section" -v newcontent="$new_content" '
|
|
353
|
+
BEGIN { in_section = 0 }
|
|
354
|
+
/AGENTS-GENERATED:START / && $0 ~ section {
|
|
355
|
+
print
|
|
356
|
+
in_section = 1
|
|
357
|
+
next
|
|
358
|
+
}
|
|
359
|
+
/AGENTS-GENERATED:END / && $0 ~ section {
|
|
360
|
+
print newcontent
|
|
361
|
+
print
|
|
362
|
+
in_section = 0
|
|
363
|
+
next
|
|
364
|
+
}
|
|
365
|
+
!in_section { print }
|
|
366
|
+
')
|
|
367
|
+
fi
|
|
368
|
+
done
|
|
369
|
+
|
|
370
|
+
# Update timestamp
|
|
371
|
+
local today
|
|
372
|
+
today=$(date +%Y-%m-%d)
|
|
373
|
+
result=$(echo "$result" | sed "s/Last updated: [0-9-]*/Last updated: $today/")
|
|
374
|
+
|
|
375
|
+
# Write result
|
|
376
|
+
echo "$result" > "$output_file"
|
|
377
|
+
|
|
378
|
+
# Clean up
|
|
379
|
+
rm -f "$temp_rendered"
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
# Render template - respects update mode
|
|
383
|
+
# If update_mode=true and file exists with markers, only updates generated sections
|
|
384
|
+
render_template_smart() {
|
|
385
|
+
local template_file="$1"
|
|
386
|
+
local output_file="$2"
|
|
387
|
+
local -n smart_vars=$3
|
|
388
|
+
local update_mode="${4:-false}"
|
|
389
|
+
|
|
390
|
+
if [ "$update_mode" = "true" ] && [ -f "$output_file" ] && has_generated_markers "$output_file"; then
|
|
391
|
+
# Update mode - preserve human edits
|
|
392
|
+
update_generated_sections "$template_file" "$output_file" "$output_file" smart_vars
|
|
393
|
+
else
|
|
394
|
+
# Normal mode - full render
|
|
395
|
+
render_template "$template_file" "$output_file" smart_vars
|
|
396
|
+
fi
|
|
397
|
+
}
|