@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,448 @@
|
|
|
1
|
+
# Frontend - TypeScript & Tailwind CSS
|
|
2
|
+
|
|
3
|
+
<!-- Managed by agent: keep sections & order; edit content, not structure. Last updated: 2025-10-09 -->
|
|
4
|
+
|
|
5
|
+
**Scope**: Frontend assets in `internal/web/` directory - TypeScript, Tailwind CSS, HTML templates
|
|
6
|
+
|
|
7
|
+
**See also**: [../../AGENTS.md](../../AGENTS.md) for global standards, [../AGENTS.md](../AGENTS.md) for Go backend
|
|
8
|
+
|
|
9
|
+
## Overview
|
|
10
|
+
|
|
11
|
+
Frontend implementation for LDAP selfservice password changer with strict accessibility compliance:
|
|
12
|
+
|
|
13
|
+
- **static/**: Client-side TypeScript, compiled CSS, static assets
|
|
14
|
+
- **js/**: TypeScript source files (compiled to ES modules)
|
|
15
|
+
- **styles.css**: Tailwind CSS output
|
|
16
|
+
- Icons, logos, favicons, manifest
|
|
17
|
+
- **templates/**: Go HTML templates (\*.gohtml)
|
|
18
|
+
- **handlers.go**: HTTP route handlers
|
|
19
|
+
- **middleware.go**: Security headers, CORS, etc.
|
|
20
|
+
- **server.go**: Fiber server setup
|
|
21
|
+
|
|
22
|
+
**Key characteristics**:
|
|
23
|
+
|
|
24
|
+
- **WCAG 2.2 AAA**: 7:1 contrast, keyboard navigation, screen reader support, adaptive density
|
|
25
|
+
- **Ultra-strict TypeScript**: All strict flags enabled, no `any` types
|
|
26
|
+
- **Tailwind CSS 4**: Utility-first, dark mode, responsive, accessible patterns
|
|
27
|
+
- **Progressive enhancement**: Works without JavaScript (forms submit via HTTP)
|
|
28
|
+
- **Password manager friendly**: Proper autocomplete attributes
|
|
29
|
+
|
|
30
|
+
## Setup/Environment
|
|
31
|
+
|
|
32
|
+
**Prerequisites**: Node.js 24+, pnpm 10.18+ (from root `package.json`)
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
# From project root
|
|
36
|
+
pnpm install # Install dependencies
|
|
37
|
+
|
|
38
|
+
# Development (watch mode)
|
|
39
|
+
pnpm css:dev # Tailwind CSS watch
|
|
40
|
+
pnpm js:dev # TypeScript watch
|
|
41
|
+
# OR
|
|
42
|
+
pnpm dev # Concurrent: CSS + TS + Go hot-reload
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
**No .env needed for frontend** - all config comes from Go backend
|
|
46
|
+
|
|
47
|
+
**Browser targets**: Modern browsers with ES module support (Chrome 90+, Firefox 88+, Safari 14+, Edge 90+)
|
|
48
|
+
|
|
49
|
+
## Build & Tests
|
|
50
|
+
|
|
51
|
+
```bash
|
|
52
|
+
# Build frontend assets
|
|
53
|
+
pnpm build:assets # TypeScript + CSS (production builds)
|
|
54
|
+
|
|
55
|
+
# TypeScript
|
|
56
|
+
pnpm js:build # Compile TS → ES modules + minify
|
|
57
|
+
pnpm js:dev # Watch mode with preserveWatchOutput
|
|
58
|
+
tsc --noEmit # Type check only (no output)
|
|
59
|
+
|
|
60
|
+
# CSS
|
|
61
|
+
pnpm css:build # Tailwind + PostCSS → styles.css
|
|
62
|
+
pnpm css:dev # Watch mode
|
|
63
|
+
|
|
64
|
+
# Formatting
|
|
65
|
+
pnpm prettier --write internal/web/ # Format TS, CSS, HTML templates
|
|
66
|
+
pnpm prettier --check internal/web/ # Check formatting (CI)
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
**No unit tests yet** - TypeScript strict mode catches most errors, integration via Go tests
|
|
70
|
+
|
|
71
|
+
**CI validation** (from `.github/workflows/check.yml`):
|
|
72
|
+
|
|
73
|
+
```bash
|
|
74
|
+
pnpm install
|
|
75
|
+
pnpm js:build # TypeScript strict compilation
|
|
76
|
+
pnpm prettier --check .
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
**Accessibility testing**:
|
|
80
|
+
|
|
81
|
+
- Keyboard navigation: Tab through all interactive elements
|
|
82
|
+
- Screen reader: Test with VoiceOver (macOS/iOS) or NVDA (Windows)
|
|
83
|
+
- Contrast: Verify 7:1 ratios with browser dev tools
|
|
84
|
+
- See [../../docs/accessibility.md](../../docs/accessibility.md) for comprehensive guide
|
|
85
|
+
|
|
86
|
+
## Code Style
|
|
87
|
+
|
|
88
|
+
**TypeScript Ultra-Strict** (from `tsconfig.json`):
|
|
89
|
+
|
|
90
|
+
```json
|
|
91
|
+
{
|
|
92
|
+
"strict": true,
|
|
93
|
+
"noUncheckedIndexedAccess": true,
|
|
94
|
+
"exactOptionalPropertyTypes": true,
|
|
95
|
+
"noPropertyAccessFromIndexSignature": true,
|
|
96
|
+
"noImplicitReturns": true,
|
|
97
|
+
"noFallthroughCasesInSwitch": true,
|
|
98
|
+
"noUnusedLocals": true,
|
|
99
|
+
"noUnusedParameters": true
|
|
100
|
+
}
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
**No `any` types allowed**:
|
|
104
|
+
|
|
105
|
+
```typescript
|
|
106
|
+
// ✅ Good: explicit types
|
|
107
|
+
function validatePassword(password: string, minLength: number): boolean {
|
|
108
|
+
return password.length >= minLength;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
// ❌ Bad: any type
|
|
112
|
+
function validatePassword(password: any): boolean {
|
|
113
|
+
return password.length >= 8; // ❌ unsafe
|
|
114
|
+
}
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
**Prettier formatting**:
|
|
118
|
+
|
|
119
|
+
- 120 char width
|
|
120
|
+
- 2-space indentation
|
|
121
|
+
- Semicolons required
|
|
122
|
+
- Double quotes (not single)
|
|
123
|
+
- Trailing comma: none
|
|
124
|
+
|
|
125
|
+
**File organization**:
|
|
126
|
+
|
|
127
|
+
- TypeScript source: `static/js/*.ts`
|
|
128
|
+
- Output: `static/js/*.js` (minified ES modules)
|
|
129
|
+
- CSS input: `tailwind.css` (Tailwind directives)
|
|
130
|
+
- CSS output: `static/styles.css` (PostCSS processed)
|
|
131
|
+
|
|
132
|
+
## Accessibility Standards (WCAG 2.2 AAA)
|
|
133
|
+
|
|
134
|
+
**Required compliance** - not optional:
|
|
135
|
+
|
|
136
|
+
### Keyboard Navigation
|
|
137
|
+
|
|
138
|
+
- All interactive elements focusable with Tab
|
|
139
|
+
- Visual focus indicators (4px outline, 7:1 contrast)
|
|
140
|
+
- Logical tab order (top to bottom, left to right)
|
|
141
|
+
- No keyboard traps
|
|
142
|
+
- Skip links where needed
|
|
143
|
+
|
|
144
|
+
### Screen Readers
|
|
145
|
+
|
|
146
|
+
- Semantic HTML: `<button>`, `<input>`, `<label>`, not `<div onclick>`
|
|
147
|
+
- ARIA labels on icon-only buttons: `aria-label="Submit"`
|
|
148
|
+
- Error messages: `aria-describedby` linking to error text
|
|
149
|
+
- Live regions for dynamic content: `aria-live="polite"`
|
|
150
|
+
- Form field associations: `<label for="id">` + `<input id="id">`
|
|
151
|
+
|
|
152
|
+
### Color & Contrast
|
|
153
|
+
|
|
154
|
+
- Text: 7:1 contrast ratio (AAA)
|
|
155
|
+
- Large text (18pt+): 4.5:1 minimum
|
|
156
|
+
- Focus indicators: 3:1 against adjacent colors
|
|
157
|
+
- Dark mode: same contrast requirements
|
|
158
|
+
- Never rely on color alone (use icons, text, patterns)
|
|
159
|
+
|
|
160
|
+
### Responsive & Adaptive
|
|
161
|
+
|
|
162
|
+
- Responsive: layout adapts to viewport size
|
|
163
|
+
- Text zoom: 200% without horizontal scroll
|
|
164
|
+
- Adaptive density: spacing adjusts for user preferences
|
|
165
|
+
- Touch targets: 44×44 CSS pixels minimum (mobile)
|
|
166
|
+
|
|
167
|
+
### Examples
|
|
168
|
+
|
|
169
|
+
**✅ Good: Accessible button**
|
|
170
|
+
|
|
171
|
+
```html
|
|
172
|
+
<button type="submit" class="btn-primary focus:ring-4 focus:ring-blue-300" aria-label="Submit password change">
|
|
173
|
+
<svg aria-hidden="true">...</svg>
|
|
174
|
+
Change Password
|
|
175
|
+
</button>
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
**❌ Bad: Inaccessible div-button**
|
|
179
|
+
|
|
180
|
+
```html
|
|
181
|
+
<div onclick="submit()" class="button">❌ not keyboard accessible Submit</div>
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
**✅ Good: Form with error handling**
|
|
185
|
+
|
|
186
|
+
```html
|
|
187
|
+
<form>
|
|
188
|
+
<label for="password">New Password</label>
|
|
189
|
+
<input
|
|
190
|
+
id="password"
|
|
191
|
+
type="password"
|
|
192
|
+
aria-describedby="password-error"
|
|
193
|
+
aria-invalid="true"
|
|
194
|
+
autocomplete="new-password"
|
|
195
|
+
/>
|
|
196
|
+
<div id="password-error" role="alert">Password must be at least 8 characters</div>
|
|
197
|
+
</form>
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
**❌ Bad: Form without associations**
|
|
201
|
+
|
|
202
|
+
```html
|
|
203
|
+
<form>
|
|
204
|
+
<div>Password</div>
|
|
205
|
+
❌ not a label, no association <input type="password" /> ❌ no autocomplete, no error linkage
|
|
206
|
+
<div style="color: red">Error</div>
|
|
207
|
+
❌ no role="alert", only color
|
|
208
|
+
</form>
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
## Tailwind CSS Patterns
|
|
212
|
+
|
|
213
|
+
**Use utility classes**, not custom CSS:
|
|
214
|
+
|
|
215
|
+
**✅ Good: Utility classes**
|
|
216
|
+
|
|
217
|
+
```html
|
|
218
|
+
<button
|
|
219
|
+
class="rounded-lg bg-blue-600 px-4 py-2 font-semibold text-white hover:bg-blue-700 focus:ring-4 focus:ring-blue-300"
|
|
220
|
+
>
|
|
221
|
+
Submit
|
|
222
|
+
</button>
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
**❌ Bad: Custom CSS**
|
|
226
|
+
|
|
227
|
+
```html
|
|
228
|
+
<button class="custom-button">Submit</button>
|
|
229
|
+
<style>
|
|
230
|
+
.custom-button {
|
|
231
|
+
background: blue;
|
|
232
|
+
} /* ❌ Use Tailwind utilities */
|
|
233
|
+
</style>
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
**Dark mode support**:
|
|
237
|
+
|
|
238
|
+
```html
|
|
239
|
+
<div class="bg-white text-gray-900 dark:bg-gray-900 dark:text-gray-100">Content</div>
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
**Responsive design**:
|
|
243
|
+
|
|
244
|
+
```html
|
|
245
|
+
<div class="grid grid-cols-1 gap-4 md:grid-cols-2 lg:grid-cols-3">
|
|
246
|
+
<!-- Responsive grid: 1 col mobile, 2 tablet, 3 desktop -->
|
|
247
|
+
</div>
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
**Focus states (required)**:
|
|
251
|
+
|
|
252
|
+
```html
|
|
253
|
+
<button class="focus:ring-4 focus:ring-blue-300 focus:outline-none">
|
|
254
|
+
<!-- 4px focus ring, 7:1 contrast -->
|
|
255
|
+
</button>
|
|
256
|
+
```
|
|
257
|
+
|
|
258
|
+
## TypeScript Patterns
|
|
259
|
+
|
|
260
|
+
**Strict null checking**:
|
|
261
|
+
|
|
262
|
+
```typescript
|
|
263
|
+
// ✅ Good: handle nulls explicitly
|
|
264
|
+
function getElement(id: string): HTMLElement | null {
|
|
265
|
+
return document.getElementById(id);
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
const el = getElement("password");
|
|
269
|
+
if (el) {
|
|
270
|
+
// ✅ null check
|
|
271
|
+
el.textContent = "Hello";
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
// ❌ Bad: assume non-null
|
|
275
|
+
const el = getElement("password");
|
|
276
|
+
el.textContent = "Hello"; // ❌ may crash if null
|
|
277
|
+
```
|
|
278
|
+
|
|
279
|
+
**Type guards**:
|
|
280
|
+
|
|
281
|
+
```typescript
|
|
282
|
+
// ✅ Good: type guard for forms
|
|
283
|
+
function isHTMLFormElement(element: Element): element is HTMLFormElement {
|
|
284
|
+
return element instanceof HTMLFormElement;
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
const form = document.querySelector("form");
|
|
288
|
+
if (form && isHTMLFormElement(form)) {
|
|
289
|
+
form.addEventListener("submit", handleSubmit);
|
|
290
|
+
}
|
|
291
|
+
```
|
|
292
|
+
|
|
293
|
+
**No unsafe array access**:
|
|
294
|
+
|
|
295
|
+
```typescript
|
|
296
|
+
// ✅ Good: check array bounds
|
|
297
|
+
const items = ["a", "b", "c"];
|
|
298
|
+
const first = items[0]; // string | undefined (noUncheckedIndexedAccess)
|
|
299
|
+
if (first) {
|
|
300
|
+
console.log(first.toUpperCase());
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
// ❌ Bad: unsafe access
|
|
304
|
+
console.log(items[0].toUpperCase()); // ❌ may crash if empty array
|
|
305
|
+
```
|
|
306
|
+
|
|
307
|
+
## PR/Commit Checklist
|
|
308
|
+
|
|
309
|
+
**Before committing frontend code**:
|
|
310
|
+
|
|
311
|
+
- [ ] Run `pnpm js:build` (TypeScript strict check)
|
|
312
|
+
- [ ] Run `pnpm prettier --write internal/web/`
|
|
313
|
+
- [ ] Verify keyboard navigation works
|
|
314
|
+
- [ ] Test with screen reader (VoiceOver/NVDA)
|
|
315
|
+
- [ ] Check contrast ratios (7:1 for text)
|
|
316
|
+
- [ ] Test dark mode
|
|
317
|
+
- [ ] Verify password manager autofill works
|
|
318
|
+
- [ ] No console errors in browser
|
|
319
|
+
- [ ] Test on mobile viewport (responsive)
|
|
320
|
+
|
|
321
|
+
**Accessibility checklist**:
|
|
322
|
+
|
|
323
|
+
- [ ] All interactive elements keyboard accessible
|
|
324
|
+
- [ ] Focus indicators visible (4px outline, 7:1 contrast)
|
|
325
|
+
- [ ] ARIA labels on icon-only buttons
|
|
326
|
+
- [ ] Form fields properly labeled
|
|
327
|
+
- [ ] Error messages linked with aria-describedby
|
|
328
|
+
- [ ] No color-only information conveyance
|
|
329
|
+
- [ ] Touch targets ≥44×44 CSS pixels (mobile)
|
|
330
|
+
|
|
331
|
+
**Performance checklist**:
|
|
332
|
+
|
|
333
|
+
- [ ] Minified JS (via `pnpm js:minify`)
|
|
334
|
+
- [ ] CSS optimized (cssnano via PostCSS)
|
|
335
|
+
- [ ] No unused Tailwind classes (purged automatically)
|
|
336
|
+
- [ ] No console.log in production code
|
|
337
|
+
|
|
338
|
+
## Good vs Bad Examples
|
|
339
|
+
|
|
340
|
+
**✅ Good: Type-safe DOM access**
|
|
341
|
+
|
|
342
|
+
```typescript
|
|
343
|
+
function setupPasswordToggle(): void {
|
|
344
|
+
const toggle = document.getElementById("toggle-password");
|
|
345
|
+
const input = document.getElementById("password");
|
|
346
|
+
|
|
347
|
+
if (!toggle || !(input instanceof HTMLInputElement)) {
|
|
348
|
+
return; // Guard against missing elements
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
toggle.addEventListener("click", () => {
|
|
352
|
+
input.type = input.type === "password" ? "text" : "password";
|
|
353
|
+
});
|
|
354
|
+
}
|
|
355
|
+
```
|
|
356
|
+
|
|
357
|
+
**❌ Bad: Unsafe DOM access**
|
|
358
|
+
|
|
359
|
+
```typescript
|
|
360
|
+
function setupPasswordToggle() {
|
|
361
|
+
const toggle = document.getElementById("toggle-password")!; // ❌ non-null assertion
|
|
362
|
+
const input = document.getElementById("password") as any; // ❌ any type
|
|
363
|
+
|
|
364
|
+
toggle.addEventListener("click", () => {
|
|
365
|
+
input.type = input.type === "password" ? "text" : "password"; // ❌ may crash
|
|
366
|
+
});
|
|
367
|
+
}
|
|
368
|
+
```
|
|
369
|
+
|
|
370
|
+
**✅ Good: Accessible form validation**
|
|
371
|
+
|
|
372
|
+
```typescript
|
|
373
|
+
function showError(input: HTMLInputElement, message: string): void {
|
|
374
|
+
const errorId = `${input.id}-error`;
|
|
375
|
+
let errorEl = document.getElementById(errorId);
|
|
376
|
+
|
|
377
|
+
if (!errorEl) {
|
|
378
|
+
errorEl = document.createElement("div");
|
|
379
|
+
errorEl.id = errorId;
|
|
380
|
+
errorEl.setAttribute("role", "alert");
|
|
381
|
+
errorEl.className = "text-red-600 dark:text-red-400 text-sm mt-1";
|
|
382
|
+
input.parentElement?.appendChild(errorEl);
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
errorEl.textContent = message;
|
|
386
|
+
input.setAttribute("aria-invalid", "true");
|
|
387
|
+
input.setAttribute("aria-describedby", errorId);
|
|
388
|
+
}
|
|
389
|
+
```
|
|
390
|
+
|
|
391
|
+
**❌ Bad: Inaccessible validation**
|
|
392
|
+
|
|
393
|
+
```typescript
|
|
394
|
+
function showError(input: any, message: string) {
|
|
395
|
+
// ❌ any type
|
|
396
|
+
input.style.borderColor = "red"; // ❌ color only, no text
|
|
397
|
+
alert(message); // ❌ blocks UI, not persistent
|
|
398
|
+
}
|
|
399
|
+
```
|
|
400
|
+
|
|
401
|
+
## When Stuck
|
|
402
|
+
|
|
403
|
+
**TypeScript issues**:
|
|
404
|
+
|
|
405
|
+
1. **Type errors**: Check `tsconfig.json` flags, use proper types (no `any`)
|
|
406
|
+
2. **Null errors**: Add null checks or type guards
|
|
407
|
+
3. **Module errors**: Ensure ES module syntax (`import`/`export`)
|
|
408
|
+
4. **Build errors**: `pnpm install` to refresh dependencies
|
|
409
|
+
|
|
410
|
+
**CSS issues**:
|
|
411
|
+
|
|
412
|
+
1. **Styles not applying**: Check Tailwind purge config, rebuild with `pnpm css:build`
|
|
413
|
+
2. **Dark mode broken**: Use `dark:` prefix on utilities
|
|
414
|
+
3. **Responsive broken**: Use `md:`, `lg:` breakpoint prefixes
|
|
415
|
+
4. **Custom classes**: Don't - use Tailwind utilities instead
|
|
416
|
+
|
|
417
|
+
**Accessibility issues**:
|
|
418
|
+
|
|
419
|
+
1. **Keyboard nav broken**: Check tab order, focus indicators
|
|
420
|
+
2. **Screen reader confusion**: Verify ARIA labels, semantic HTML
|
|
421
|
+
3. **Contrast failure**: Use darker colors, test with dev tools
|
|
422
|
+
4. **See**: [../../docs/accessibility.md](../../docs/accessibility.md)
|
|
423
|
+
|
|
424
|
+
**Browser dev tools**:
|
|
425
|
+
|
|
426
|
+
- Accessibility tab: Check ARIA, contrast, structure
|
|
427
|
+
- Lighthouse: Run accessibility audit (aim for 100 score)
|
|
428
|
+
- Console: No errors in production code
|
|
429
|
+
|
|
430
|
+
## Testing Workflow
|
|
431
|
+
|
|
432
|
+
**Manual testing required** (no automated frontend tests yet):
|
|
433
|
+
|
|
434
|
+
1. **Visual testing**: Check all pages in light/dark mode
|
|
435
|
+
2. **Keyboard testing**: Tab through all interactive elements
|
|
436
|
+
3. **Screen reader testing**: Use VoiceOver (Cmd+F5) or NVDA
|
|
437
|
+
4. **Responsive testing**: Test mobile, tablet, desktop viewports
|
|
438
|
+
5. **Browser testing**: Chrome, Firefox, Safari, Edge
|
|
439
|
+
6. **Password manager**: Test autofill with 1Password, LastPass, etc.
|
|
440
|
+
|
|
441
|
+
**Accessibility testing tools**:
|
|
442
|
+
|
|
443
|
+
- Browser dev tools Lighthouse
|
|
444
|
+
- axe DevTools extension
|
|
445
|
+
- WAVE browser extension
|
|
446
|
+
- Manual keyboard/screen reader testing (required)
|
|
447
|
+
|
|
448
|
+
**Integration testing**: Go backend tests exercise full request/response flow including frontend templates
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
<!-- FOR AI AGENTS - Human readability is a side effect, not a goal -->
|
|
2
|
+
<!-- Managed by agent: keep sections and order; edit content, not structure -->
|
|
3
|
+
<!-- Last updated: 2026-02-05 | Last verified: never -->
|
|
4
|
+
|
|
5
|
+
# AGENTS.md
|
|
6
|
+
|
|
7
|
+
**Precedence:** the **closest `AGENTS.md`** to the files you're changing wins. Root holds global defaults only.
|
|
8
|
+
|
|
9
|
+
## Commands (unverified)
|
|
10
|
+
> Source: composer.json — CI-sourced commands are most reliable
|
|
11
|
+
|
|
12
|
+
<!-- AGENTS-GENERATED:START commands -->
|
|
13
|
+
| Task | Command | ~Time |
|
|
14
|
+
|------|---------|-------|
|
|
15
|
+
| Typecheck | composer run phpstan | ~15s |
|
|
16
|
+
| Lint | vendor/bin/php-cs-fixer fix --dry-run | ~10s |
|
|
17
|
+
| Format | vendor/bin/php-cs-fixer fix | ~5s |
|
|
18
|
+
| Test (single) | vendor/bin/phpunit | ~2s |
|
|
19
|
+
| Test (all) | composer run test | ~30s |
|
|
20
|
+
<!-- AGENTS-GENERATED:END commands -->
|
|
21
|
+
|
|
22
|
+
> If commands fail, verify against Makefile/package.json/composer.json or ask user to update.
|
|
23
|
+
|
|
24
|
+
## Workflow
|
|
25
|
+
1. **Before coding**: Read nearest `AGENTS.md` + check Golden Samples for the area you're touching
|
|
26
|
+
2. **After each change**: Run the smallest relevant check (lint → typecheck → single test)
|
|
27
|
+
3. **Before committing**: Run full test suite if changes affect >2 files or touch shared code
|
|
28
|
+
|
|
29
|
+
## File Map
|
|
30
|
+
<!-- AGENTS-GENERATED:START filemap -->
|
|
31
|
+
```
|
|
32
|
+
web/ → documentation
|
|
33
|
+
src/ → application source code
|
|
34
|
+
```
|
|
35
|
+
<!-- AGENTS-GENERATED:END filemap -->
|
|
36
|
+
|
|
37
|
+
## Golden Samples (follow these patterns)
|
|
38
|
+
<!-- AGENTS-GENERATED:START golden-samples -->
|
|
39
|
+
| For | Reference | Key patterns |
|
|
40
|
+
|-----|-----------|--------------|
|
|
41
|
+
| Controller | `src/Controller.php` | (class) |
|
|
42
|
+
<!-- AGENTS-GENERATED:END golden-samples -->
|
|
43
|
+
|
|
44
|
+
## Heuristics (quick decisions)
|
|
45
|
+
<!-- AGENTS-GENERATED:START heuristics -->
|
|
46
|
+
| When | Do |
|
|
47
|
+
|------|-----|
|
|
48
|
+
| Adding class | Follow PSR-4 in `Classes/` or `src/` |
|
|
49
|
+
| Committing | Use Conventional Commits (feat:, fix:, docs:, etc.) |
|
|
50
|
+
| Merging PRs | Squash and merge |
|
|
51
|
+
| Adding dependency | Ask first - we minimize deps |
|
|
52
|
+
| Unsure about pattern | Check Golden Samples above |
|
|
53
|
+
<!-- AGENTS-GENERATED:END heuristics -->
|
|
54
|
+
|
|
55
|
+
## Repository Settings
|
|
56
|
+
<!-- AGENTS-GENERATED:START repo-settings -->
|
|
57
|
+
- **Default branch:** `main`
|
|
58
|
+
- **Merge strategy:** squash, merge, rebase
|
|
59
|
+
<!-- AGENTS-GENERATED:END repo-settings -->
|
|
60
|
+
|
|
61
|
+
## Boundaries
|
|
62
|
+
|
|
63
|
+
### Always Do
|
|
64
|
+
- Run pre-commit checks before committing
|
|
65
|
+
- Add tests for new code paths
|
|
66
|
+
- Use conventional commit format: `type(scope): subject`
|
|
67
|
+
- Follow PSR-12 coding standards and PHP ^8.2 features
|
|
68
|
+
|
|
69
|
+
### Ask First
|
|
70
|
+
- Adding new dependencies
|
|
71
|
+
- Modifying CI/CD configuration
|
|
72
|
+
- Changing public API signatures
|
|
73
|
+
- Running full e2e test suites
|
|
74
|
+
- Repo-wide refactoring or rewrites
|
|
75
|
+
|
|
76
|
+
### Never Do
|
|
77
|
+
- Commit secrets, credentials, or sensitive data
|
|
78
|
+
- Modify vendor/, node_modules/, or generated files
|
|
79
|
+
- Push directly to main/master branch
|
|
80
|
+
- Delete migration files or schema changes
|
|
81
|
+
- Commit composer.lock without composer.json changes
|
|
82
|
+
- Modify core framework files
|
|
83
|
+
|
|
84
|
+
## Index of scoped AGENTS.md
|
|
85
|
+
<!-- AGENTS-GENERATED:START scope-index -->
|
|
86
|
+
- `./web/AGENTS.md` — Frontend application (TypeScript/React/Vue)
|
|
87
|
+
<!-- AGENTS-GENERATED:END scope-index -->
|
|
88
|
+
|
|
89
|
+
## When instructions conflict
|
|
90
|
+
The nearest `AGENTS.md` wins. Explicit user prompts override files.
|
|
91
|
+
- For PHP-specific patterns, follow PSR standards
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "frontend",
|
|
3
|
+
"scripts": {
|
|
4
|
+
"dev": "vite",
|
|
5
|
+
"build": "vite build",
|
|
6
|
+
"lint": "eslint src",
|
|
7
|
+
"test": "vitest run"
|
|
8
|
+
},
|
|
9
|
+
"devDependencies": {
|
|
10
|
+
"eslint": "^8.56.0",
|
|
11
|
+
"react": "^18.0.0",
|
|
12
|
+
"vite": "^8.0.8",
|
|
13
|
+
"vitest": "^1.0.0"
|
|
14
|
+
}
|
|
15
|
+
}
|
|
File without changes
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
<!-- Managed by agent: keep sections and order; edit content, not structure. Last updated: 2026-02-05 -->
|
|
2
|
+
|
|
3
|
+
# AGENTS.md — web
|
|
4
|
+
|
|
5
|
+
<!-- AGENTS-GENERATED:START overview -->
|
|
6
|
+
## Overview
|
|
7
|
+
Frontend application (TypeScript/React/Vue)
|
|
8
|
+
<!-- AGENTS-GENERATED:END overview -->
|
|
9
|
+
|
|
10
|
+
<!-- AGENTS-GENERATED:START filemap -->
|
|
11
|
+
## Key Files
|
|
12
|
+
| File | Purpose |
|
|
13
|
+
|------|---------|
|
|
14
|
+
| `web/src/App.tsx` | (add description) |
|
|
15
|
+
| `web/src/Button.tsx` | (add description) |
|
|
16
|
+
| `web/src/Header.tsx` | (add description) |
|
|
17
|
+
| `web/src/main.tsx` | (add description) |
|
|
18
|
+
| `web/src/Footer.tsx` | (add description) |
|
|
19
|
+
<!-- AGENTS-GENERATED:END filemap -->
|
|
20
|
+
|
|
21
|
+
<!-- AGENTS-GENERATED:START golden-samples -->
|
|
22
|
+
## Golden Samples (follow these patterns)
|
|
23
|
+
| Pattern | Reference |
|
|
24
|
+
|---------|-----------|
|
|
25
|
+
| Standard implementation | `web/src/Button.tsx` |
|
|
26
|
+
<!-- AGENTS-GENERATED:END golden-samples -->
|
|
27
|
+
|
|
28
|
+
<!-- AGENTS-GENERATED:START setup -->
|
|
29
|
+
## Setup & environment
|
|
30
|
+
- Node version: >=20.0.0
|
|
31
|
+
- Framework: react
|
|
32
|
+
- Package manager: npm
|
|
33
|
+
- Environment variables: See .env.example
|
|
34
|
+
<!-- AGENTS-GENERATED:END setup -->
|
|
35
|
+
|
|
36
|
+
<!-- AGENTS-GENERATED:START commands -->
|
|
37
|
+
## Build & tests
|
|
38
|
+
- Install: `npm install`
|
|
39
|
+
- Typecheck: `npm run typecheck`
|
|
40
|
+
- Lint: `npm run lint`
|
|
41
|
+
- Format: `npx prettier --write .`
|
|
42
|
+
- Test: `npm test`
|
|
43
|
+
- Build: `npm run build`
|
|
44
|
+
- Dev server: `npm run dev`
|
|
45
|
+
<!-- AGENTS-GENERATED:END commands -->
|
|
46
|
+
|
|
47
|
+
<!-- AGENTS-GENERATED:START code-style -->
|
|
48
|
+
## Code style & conventions
|
|
49
|
+
- TypeScript strict mode enabled (verified from tsconfig.json)
|
|
50
|
+
- Use functional components with hooks
|
|
51
|
+
- Naming: `camelCase` for variables/functions, `PascalCase` for components
|
|
52
|
+
- File naming: `ComponentName.tsx`, `utilityName.ts`
|
|
53
|
+
- Imports: group and sort (external, internal, types)
|
|
54
|
+
- CSS: Tailwind CSS
|
|
55
|
+
- Avoid class components
|
|
56
|
+
<!-- AGENTS-GENERATED:END code-style -->
|
|
57
|
+
|
|
58
|
+
<!-- AGENTS-GENERATED:START security -->
|
|
59
|
+
## Security & safety
|
|
60
|
+
- Sanitize user inputs before rendering
|
|
61
|
+
- Raw HTML rendering only with sanitized content (use DOMPurify)
|
|
62
|
+
- Validate environment variables at build time
|
|
63
|
+
- Never expose secrets in client-side code
|
|
64
|
+
- Use HTTPS for all API calls
|
|
65
|
+
- Implement CSP headers
|
|
66
|
+
- WCAG 2.2 AA accessibility compliance
|
|
67
|
+
<!-- AGENTS-GENERATED:END security -->
|
|
68
|
+
|
|
69
|
+
<!-- AGENTS-GENERATED:START checklist -->
|
|
70
|
+
## PR/commit checklist
|
|
71
|
+
- [ ] Tests pass: `npm test`
|
|
72
|
+
- [ ] TypeScript compiles: `npm run typecheck`
|
|
73
|
+
- [ ] Lint clean: `npm run lint`
|
|
74
|
+
- [ ] Formatted: `npx prettier --write .`
|
|
75
|
+
- [ ] Accessibility: keyboard navigation works, ARIA labels present
|
|
76
|
+
- [ ] Responsive: tested on mobile, tablet, desktop
|
|
77
|
+
- [ ] Performance: no unnecessary re-renders
|
|
78
|
+
<!-- AGENTS-GENERATED:END checklist -->
|
|
79
|
+
|
|
80
|
+
<!-- AGENTS-GENERATED:START examples -->
|
|
81
|
+
## Patterns to Follow
|
|
82
|
+
> **Prefer looking at real code in this repo over generic examples.**
|
|
83
|
+
> See **Golden Samples** section above for files that demonstrate correct patterns.
|
|
84
|
+
<!-- AGENTS-GENERATED:END examples -->
|
|
85
|
+
|
|
86
|
+
<!-- AGENTS-GENERATED:START help -->
|
|
87
|
+
## When stuck
|
|
88
|
+
- Check React documentation: https://react.dev
|
|
89
|
+
- Review TypeScript handbook: https://www.typescriptlang.org/docs/
|
|
90
|
+
- Check root AGENTS.md for project-wide conventions
|
|
91
|
+
- Review existing components for patterns
|
|
92
|
+
<!-- AGENTS-GENERATED:END help -->
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "frontend",
|
|
3
|
+
"private": true,
|
|
4
|
+
"engines": {
|
|
5
|
+
"node": ">=20.0.0"
|
|
6
|
+
},
|
|
7
|
+
"scripts": {
|
|
8
|
+
"dev": "vite",
|
|
9
|
+
"build": "vite build",
|
|
10
|
+
"lint": "eslint src --ext .ts,.tsx",
|
|
11
|
+
"test": "vitest run",
|
|
12
|
+
"typecheck": "tsc --noEmit"
|
|
13
|
+
},
|
|
14
|
+
"dependencies": {
|
|
15
|
+
"react": "^18.2.0",
|
|
16
|
+
"react-dom": "^18.2.0"
|
|
17
|
+
},
|
|
18
|
+
"devDependencies": {
|
|
19
|
+
"@types/react": "^18.2.0",
|
|
20
|
+
"eslint": "^8.56.0",
|
|
21
|
+
"tailwindcss": "^3.4.0",
|
|
22
|
+
"typescript": "^5.3.0",
|
|
23
|
+
"vite": "^8.0.8",
|
|
24
|
+
"vitest": "^1.0.0"
|
|
25
|
+
}
|
|
26
|
+
}
|