@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,49 @@
|
|
|
1
|
+
"""Application configuration using pydantic-settings."""
|
|
2
|
+
|
|
3
|
+
from functools import lru_cache
|
|
4
|
+
|
|
5
|
+
from pydantic_settings import BaseSettings, SettingsConfigDict
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class Settings(BaseSettings):
|
|
9
|
+
"""Application settings loaded from environment variables."""
|
|
10
|
+
|
|
11
|
+
model_config = SettingsConfigDict(
|
|
12
|
+
env_file=".env",
|
|
13
|
+
env_file_encoding="utf-8",
|
|
14
|
+
case_sensitive=False,
|
|
15
|
+
)
|
|
16
|
+
|
|
17
|
+
# Application
|
|
18
|
+
app_name: str = "fastapi-app"
|
|
19
|
+
app_env: str = "development"
|
|
20
|
+
debug: bool = True
|
|
21
|
+
|
|
22
|
+
# Server
|
|
23
|
+
host: str = "0.0.0.0"
|
|
24
|
+
port: int = 8000
|
|
25
|
+
workers: int = 1
|
|
26
|
+
|
|
27
|
+
# Database
|
|
28
|
+
database_url: str = "postgresql://user:password@localhost:5432/fastapi_app"
|
|
29
|
+
|
|
30
|
+
# Security
|
|
31
|
+
secret_key: str = "change-me-in-production"
|
|
32
|
+
api_key: str = ""
|
|
33
|
+
|
|
34
|
+
# External Services
|
|
35
|
+
redis_url: str = "redis://localhost:6379/0"
|
|
36
|
+
|
|
37
|
+
@property
|
|
38
|
+
def is_production(self) -> bool:
|
|
39
|
+
"""Check if running in production environment."""
|
|
40
|
+
return self.app_env == "production"
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
@lru_cache
|
|
44
|
+
def get_settings() -> Settings:
|
|
45
|
+
"""Get cached settings instance."""
|
|
46
|
+
return Settings()
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
settings = get_settings()
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
"""FastAPI application entry point."""
|
|
2
|
+
|
|
3
|
+
from collections.abc import AsyncIterator
|
|
4
|
+
from contextlib import asynccontextmanager
|
|
5
|
+
|
|
6
|
+
import uvicorn
|
|
7
|
+
from fastapi import FastAPI
|
|
8
|
+
from fastapi.middleware.cors import CORSMiddleware
|
|
9
|
+
|
|
10
|
+
from src.config import settings
|
|
11
|
+
from src.routes import health, items, users
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
@asynccontextmanager
|
|
15
|
+
async def lifespan(_app: FastAPI) -> AsyncIterator[None]:
|
|
16
|
+
"""Application lifespan context manager."""
|
|
17
|
+
# Startup
|
|
18
|
+
print(f"Starting {settings.app_name}...")
|
|
19
|
+
yield
|
|
20
|
+
# Shutdown
|
|
21
|
+
print(f"Shutting down {settings.app_name}...")
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def create_app() -> FastAPI:
|
|
25
|
+
"""Create and configure the FastAPI application."""
|
|
26
|
+
app = FastAPI(
|
|
27
|
+
title=settings.app_name,
|
|
28
|
+
version="0.1.0",
|
|
29
|
+
description="Example FastAPI application",
|
|
30
|
+
lifespan=lifespan,
|
|
31
|
+
)
|
|
32
|
+
|
|
33
|
+
# CORS middleware — wildcard origins here are intentional for this
|
|
34
|
+
# fixture example only; real deployments must set concrete origins
|
|
35
|
+
# from settings (e.g. settings.cors_allowed_origins).
|
|
36
|
+
app.add_middleware(
|
|
37
|
+
CORSMiddleware,
|
|
38
|
+
allow_origins=["*"], # nosemgrep: python.fastapi.security.wildcard-cors.wildcard-cors
|
|
39
|
+
allow_credentials=True,
|
|
40
|
+
allow_methods=["*"],
|
|
41
|
+
allow_headers=["*"],
|
|
42
|
+
)
|
|
43
|
+
|
|
44
|
+
# Include routers
|
|
45
|
+
app.include_router(health.router, tags=["health"])
|
|
46
|
+
app.include_router(users.router, prefix="/api/v1/users", tags=["users"])
|
|
47
|
+
app.include_router(items.router, prefix="/api/v1/items", tags=["items"])
|
|
48
|
+
|
|
49
|
+
return app
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
app = create_app()
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
def run() -> None:
|
|
56
|
+
"""Run the application with uvicorn."""
|
|
57
|
+
uvicorn.run(
|
|
58
|
+
"src.main:app",
|
|
59
|
+
host=settings.host,
|
|
60
|
+
port=settings.port,
|
|
61
|
+
reload=settings.debug,
|
|
62
|
+
)
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
if __name__ == "__main__":
|
|
66
|
+
run()
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"""Pydantic models for request/response schemas."""
|
|
2
|
+
|
|
3
|
+
from src.models.item import Item, ItemCreate, ItemUpdate
|
|
4
|
+
from src.models.user import User, UserCreate, UserUpdate
|
|
5
|
+
|
|
6
|
+
__all__ = [
|
|
7
|
+
"Item",
|
|
8
|
+
"ItemCreate",
|
|
9
|
+
"ItemUpdate",
|
|
10
|
+
"User",
|
|
11
|
+
"UserCreate",
|
|
12
|
+
"UserUpdate",
|
|
13
|
+
]
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"""Item model schemas."""
|
|
2
|
+
|
|
3
|
+
from datetime import datetime
|
|
4
|
+
from decimal import Decimal
|
|
5
|
+
|
|
6
|
+
from pydantic import BaseModel, Field
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class ItemBase(BaseModel):
|
|
10
|
+
"""Base item schema with common fields."""
|
|
11
|
+
|
|
12
|
+
name: str = Field(..., min_length=1, max_length=200)
|
|
13
|
+
description: str | None = None
|
|
14
|
+
price: Decimal = Field(..., ge=0, decimal_places=2)
|
|
15
|
+
quantity: int = Field(default=0, ge=0)
|
|
16
|
+
is_available: bool = True
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class ItemCreate(ItemBase):
|
|
20
|
+
"""Schema for creating a new item."""
|
|
21
|
+
|
|
22
|
+
owner_id: int
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
class ItemUpdate(BaseModel):
|
|
26
|
+
"""Schema for updating an existing item."""
|
|
27
|
+
|
|
28
|
+
name: str | None = Field(None, min_length=1, max_length=200)
|
|
29
|
+
description: str | None = None
|
|
30
|
+
price: Decimal | None = Field(None, ge=0, decimal_places=2)
|
|
31
|
+
quantity: int | None = Field(None, ge=0)
|
|
32
|
+
is_available: bool | None = None
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
class Item(ItemBase):
|
|
36
|
+
"""Item response schema."""
|
|
37
|
+
|
|
38
|
+
id: int
|
|
39
|
+
owner_id: int
|
|
40
|
+
created_at: datetime
|
|
41
|
+
updated_at: datetime | None = None
|
|
42
|
+
|
|
43
|
+
model_config = {"from_attributes": True}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"""User model schemas."""
|
|
2
|
+
|
|
3
|
+
from datetime import datetime
|
|
4
|
+
|
|
5
|
+
from pydantic import BaseModel, EmailStr, Field
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class UserBase(BaseModel):
|
|
9
|
+
"""Base user schema with common fields."""
|
|
10
|
+
|
|
11
|
+
email: EmailStr
|
|
12
|
+
username: str = Field(..., min_length=3, max_length=50)
|
|
13
|
+
full_name: str | None = None
|
|
14
|
+
is_active: bool = True
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class UserCreate(UserBase):
|
|
18
|
+
"""Schema for creating a new user."""
|
|
19
|
+
|
|
20
|
+
password: str = Field(..., min_length=8)
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class UserUpdate(BaseModel):
|
|
24
|
+
"""Schema for updating an existing user."""
|
|
25
|
+
|
|
26
|
+
email: EmailStr | None = None
|
|
27
|
+
username: str | None = Field(None, min_length=3, max_length=50)
|
|
28
|
+
full_name: str | None = None
|
|
29
|
+
is_active: bool | None = None
|
|
30
|
+
password: str | None = Field(None, min_length=8)
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
class User(UserBase):
|
|
34
|
+
"""User response schema."""
|
|
35
|
+
|
|
36
|
+
id: int
|
|
37
|
+
created_at: datetime
|
|
38
|
+
updated_at: datetime | None = None
|
|
39
|
+
|
|
40
|
+
model_config = {"from_attributes": True}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"""Health check endpoints."""
|
|
2
|
+
|
|
3
|
+
from fastapi import APIRouter
|
|
4
|
+
|
|
5
|
+
from src.config import settings
|
|
6
|
+
|
|
7
|
+
router = APIRouter()
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
@router.get("/health")
|
|
11
|
+
async def health_check() -> dict[str, str]:
|
|
12
|
+
"""Basic health check endpoint."""
|
|
13
|
+
return {"status": "healthy", "app": settings.app_name}
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
@router.get("/ready")
|
|
17
|
+
async def readiness_check() -> dict[str, str]:
|
|
18
|
+
"""Readiness check endpoint."""
|
|
19
|
+
# Could add database connectivity check here
|
|
20
|
+
return {"status": "ready"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
"""Item management endpoints."""
|
|
2
|
+
|
|
3
|
+
from fastapi import APIRouter, HTTPException, Query, status
|
|
4
|
+
|
|
5
|
+
from src.models.item import Item, ItemCreate, ItemUpdate
|
|
6
|
+
from src.services.item_service import ItemService
|
|
7
|
+
|
|
8
|
+
router = APIRouter()
|
|
9
|
+
item_service = ItemService()
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
@router.get("/", response_model=list[Item])
|
|
13
|
+
async def list_items(
|
|
14
|
+
skip: int = Query(0, ge=0),
|
|
15
|
+
limit: int = Query(100, ge=1, le=1000),
|
|
16
|
+
search: str | None = None,
|
|
17
|
+
) -> list[Item]:
|
|
18
|
+
"""List all items with pagination and optional search."""
|
|
19
|
+
if search:
|
|
20
|
+
return item_service.search(search, skip=skip, limit=limit)
|
|
21
|
+
return item_service.get_all(skip=skip, limit=limit)
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
@router.get("/{item_id}", response_model=Item)
|
|
25
|
+
async def get_item(item_id: int) -> Item:
|
|
26
|
+
"""Get a specific item by ID."""
|
|
27
|
+
item = item_service.get_by_id(item_id)
|
|
28
|
+
if not item:
|
|
29
|
+
raise HTTPException(
|
|
30
|
+
status_code=status.HTTP_404_NOT_FOUND,
|
|
31
|
+
detail=f"Item with id {item_id} not found",
|
|
32
|
+
)
|
|
33
|
+
return item
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
@router.post("/", response_model=Item, status_code=status.HTTP_201_CREATED)
|
|
37
|
+
async def create_item(item_data: ItemCreate) -> Item:
|
|
38
|
+
"""Create a new item."""
|
|
39
|
+
return item_service.create(item_data)
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
@router.put("/{item_id}", response_model=Item)
|
|
43
|
+
async def update_item(item_id: int, item_data: ItemUpdate) -> Item:
|
|
44
|
+
"""Update an existing item."""
|
|
45
|
+
item = item_service.update(item_id, item_data)
|
|
46
|
+
if not item:
|
|
47
|
+
raise HTTPException(
|
|
48
|
+
status_code=status.HTTP_404_NOT_FOUND,
|
|
49
|
+
detail=f"Item with id {item_id} not found",
|
|
50
|
+
)
|
|
51
|
+
return item
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
@router.delete("/{item_id}", status_code=status.HTTP_204_NO_CONTENT)
|
|
55
|
+
async def delete_item(item_id: int) -> None:
|
|
56
|
+
"""Delete an item."""
|
|
57
|
+
if not item_service.delete(item_id):
|
|
58
|
+
raise HTTPException(
|
|
59
|
+
status_code=status.HTTP_404_NOT_FOUND,
|
|
60
|
+
detail=f"Item with id {item_id} not found",
|
|
61
|
+
)
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
"""User management endpoints."""
|
|
2
|
+
|
|
3
|
+
from fastapi import APIRouter, HTTPException, status
|
|
4
|
+
|
|
5
|
+
from src.models.user import User, UserCreate, UserUpdate
|
|
6
|
+
from src.services.user_service import UserService
|
|
7
|
+
|
|
8
|
+
router = APIRouter()
|
|
9
|
+
user_service = UserService()
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
@router.get("/", response_model=list[User])
|
|
13
|
+
async def list_users(skip: int = 0, limit: int = 100) -> list[User]:
|
|
14
|
+
"""List all users with pagination."""
|
|
15
|
+
return user_service.get_all(skip=skip, limit=limit)
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
@router.get("/{user_id}", response_model=User)
|
|
19
|
+
async def get_user(user_id: int) -> User:
|
|
20
|
+
"""Get a specific user by ID."""
|
|
21
|
+
user = user_service.get_by_id(user_id)
|
|
22
|
+
if not user:
|
|
23
|
+
raise HTTPException(
|
|
24
|
+
status_code=status.HTTP_404_NOT_FOUND,
|
|
25
|
+
detail=f"User with id {user_id} not found",
|
|
26
|
+
)
|
|
27
|
+
return user
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
@router.post("/", response_model=User, status_code=status.HTTP_201_CREATED)
|
|
31
|
+
async def create_user(user_data: UserCreate) -> User:
|
|
32
|
+
"""Create a new user."""
|
|
33
|
+
return user_service.create(user_data)
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
@router.put("/{user_id}", response_model=User)
|
|
37
|
+
async def update_user(user_id: int, user_data: UserUpdate) -> User:
|
|
38
|
+
"""Update an existing user."""
|
|
39
|
+
user = user_service.update(user_id, user_data)
|
|
40
|
+
if not user:
|
|
41
|
+
raise HTTPException(
|
|
42
|
+
status_code=status.HTTP_404_NOT_FOUND,
|
|
43
|
+
detail=f"User with id {user_id} not found",
|
|
44
|
+
)
|
|
45
|
+
return user
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
@router.delete("/{user_id}", status_code=status.HTTP_204_NO_CONTENT)
|
|
49
|
+
async def delete_user(user_id: int) -> None:
|
|
50
|
+
"""Delete a user."""
|
|
51
|
+
if not user_service.delete(user_id):
|
|
52
|
+
raise HTTPException(
|
|
53
|
+
status_code=status.HTTP_404_NOT_FOUND,
|
|
54
|
+
detail=f"User with id {user_id} not found",
|
|
55
|
+
)
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
"""Item service for business logic."""
|
|
2
|
+
|
|
3
|
+
from datetime import UTC, datetime
|
|
4
|
+
|
|
5
|
+
from src.models.item import Item, ItemCreate, ItemUpdate
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class ItemService:
|
|
9
|
+
"""Service class for item operations."""
|
|
10
|
+
|
|
11
|
+
def __init__(self) -> None:
|
|
12
|
+
"""Initialize with in-memory storage for demo."""
|
|
13
|
+
self._items: dict[int, Item] = {}
|
|
14
|
+
self._next_id = 1
|
|
15
|
+
|
|
16
|
+
def get_all(self, skip: int = 0, limit: int = 100) -> list[Item]:
|
|
17
|
+
"""Get all items with pagination."""
|
|
18
|
+
items = list(self._items.values())
|
|
19
|
+
return items[skip : skip + limit]
|
|
20
|
+
|
|
21
|
+
def get_by_id(self, item_id: int) -> Item | None:
|
|
22
|
+
"""Get an item by ID."""
|
|
23
|
+
return self._items.get(item_id)
|
|
24
|
+
|
|
25
|
+
def search(self, query: str, skip: int = 0, limit: int = 100) -> list[Item]:
|
|
26
|
+
"""Search items by name or description."""
|
|
27
|
+
query_lower = query.lower()
|
|
28
|
+
results = [
|
|
29
|
+
item
|
|
30
|
+
for item in self._items.values()
|
|
31
|
+
if query_lower in item.name.lower()
|
|
32
|
+
or (item.description and query_lower in item.description.lower())
|
|
33
|
+
]
|
|
34
|
+
return results[skip : skip + limit]
|
|
35
|
+
|
|
36
|
+
def get_by_owner(self, owner_id: int) -> list[Item]:
|
|
37
|
+
"""Get all items for a specific owner."""
|
|
38
|
+
return [item for item in self._items.values() if item.owner_id == owner_id]
|
|
39
|
+
|
|
40
|
+
def create(self, item_data: ItemCreate) -> Item:
|
|
41
|
+
"""Create a new item."""
|
|
42
|
+
item = Item(
|
|
43
|
+
id=self._next_id,
|
|
44
|
+
name=item_data.name,
|
|
45
|
+
description=item_data.description,
|
|
46
|
+
price=item_data.price,
|
|
47
|
+
quantity=item_data.quantity,
|
|
48
|
+
is_available=item_data.is_available,
|
|
49
|
+
owner_id=item_data.owner_id,
|
|
50
|
+
created_at=datetime.now(UTC),
|
|
51
|
+
)
|
|
52
|
+
self._items[self._next_id] = item
|
|
53
|
+
self._next_id += 1
|
|
54
|
+
return item
|
|
55
|
+
|
|
56
|
+
def update(self, item_id: int, item_data: ItemUpdate) -> Item | None:
|
|
57
|
+
"""Update an existing item."""
|
|
58
|
+
item = self._items.get(item_id)
|
|
59
|
+
if not item:
|
|
60
|
+
return None
|
|
61
|
+
|
|
62
|
+
update_data = item_data.model_dump(exclude_unset=True)
|
|
63
|
+
updated_item = item.model_copy(
|
|
64
|
+
update={
|
|
65
|
+
**update_data,
|
|
66
|
+
"updated_at": datetime.now(UTC),
|
|
67
|
+
}
|
|
68
|
+
)
|
|
69
|
+
self._items[item_id] = updated_item
|
|
70
|
+
return updated_item
|
|
71
|
+
|
|
72
|
+
def delete(self, item_id: int) -> bool:
|
|
73
|
+
"""Delete an item."""
|
|
74
|
+
if item_id not in self._items:
|
|
75
|
+
return False
|
|
76
|
+
del self._items[item_id]
|
|
77
|
+
return True
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
"""User service for business logic."""
|
|
2
|
+
|
|
3
|
+
from datetime import UTC, datetime
|
|
4
|
+
|
|
5
|
+
from src.models.user import User, UserCreate, UserUpdate
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class UserService:
|
|
9
|
+
"""Service class for user operations."""
|
|
10
|
+
|
|
11
|
+
def __init__(self) -> None:
|
|
12
|
+
"""Initialize with in-memory storage for demo."""
|
|
13
|
+
self._users: dict[int, User] = {}
|
|
14
|
+
self._next_id = 1
|
|
15
|
+
|
|
16
|
+
def get_all(self, skip: int = 0, limit: int = 100) -> list[User]:
|
|
17
|
+
"""Get all users with pagination."""
|
|
18
|
+
users = list(self._users.values())
|
|
19
|
+
return users[skip : skip + limit]
|
|
20
|
+
|
|
21
|
+
def get_by_id(self, user_id: int) -> User | None:
|
|
22
|
+
"""Get a user by ID."""
|
|
23
|
+
return self._users.get(user_id)
|
|
24
|
+
|
|
25
|
+
def get_by_email(self, email: str) -> User | None:
|
|
26
|
+
"""Get a user by email."""
|
|
27
|
+
for user in self._users.values():
|
|
28
|
+
if user.email == email:
|
|
29
|
+
return user
|
|
30
|
+
return None
|
|
31
|
+
|
|
32
|
+
def create(self, user_data: UserCreate) -> User:
|
|
33
|
+
"""Create a new user."""
|
|
34
|
+
user = User(
|
|
35
|
+
id=self._next_id,
|
|
36
|
+
email=user_data.email,
|
|
37
|
+
username=user_data.username,
|
|
38
|
+
full_name=user_data.full_name,
|
|
39
|
+
is_active=user_data.is_active,
|
|
40
|
+
created_at=datetime.now(UTC),
|
|
41
|
+
)
|
|
42
|
+
self._users[self._next_id] = user
|
|
43
|
+
self._next_id += 1
|
|
44
|
+
return user
|
|
45
|
+
|
|
46
|
+
def update(self, user_id: int, user_data: UserUpdate) -> User | None:
|
|
47
|
+
"""Update an existing user."""
|
|
48
|
+
user = self._users.get(user_id)
|
|
49
|
+
if not user:
|
|
50
|
+
return None
|
|
51
|
+
|
|
52
|
+
update_data = user_data.model_dump(exclude_unset=True)
|
|
53
|
+
update_data.pop("password", None) # Don't include password in response
|
|
54
|
+
|
|
55
|
+
updated_user = user.model_copy(
|
|
56
|
+
update={
|
|
57
|
+
**update_data,
|
|
58
|
+
"updated_at": datetime.now(UTC),
|
|
59
|
+
}
|
|
60
|
+
)
|
|
61
|
+
self._users[user_id] = updated_user
|
|
62
|
+
return updated_user
|
|
63
|
+
|
|
64
|
+
def delete(self, user_id: int) -> bool:
|
|
65
|
+
"""Delete a user."""
|
|
66
|
+
if user_id not in self._users:
|
|
67
|
+
return False
|
|
68
|
+
del self._users[user_id]
|
|
69
|
+
return True
|
|
@@ -0,0 +1,86 @@
|
|
|
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: go.mod — CI-sourced commands are most reliable
|
|
11
|
+
|
|
12
|
+
<!-- AGENTS-GENERATED:START commands -->
|
|
13
|
+
| Task | Command | ~Time |
|
|
14
|
+
|------|---------|-------|
|
|
15
|
+
| Typecheck | go build -v ./... | ~15s |
|
|
16
|
+
| Format | gofmt -w . | ~5s |
|
|
17
|
+
| Test (single) | go test -v -race | ~2s |
|
|
18
|
+
| Test (all) | go test -v -race -short ./... | ~30s |
|
|
19
|
+
| Build | go build -v ./... | ~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
|
+
admin/ → configuration/data
|
|
33
|
+
cmd/ → CLI entrypoints
|
|
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
|
+
| Entrypoint | `cmd/api/main.go` | standard patterns |
|
|
42
|
+
| Entrypoint | `main.go` | standard patterns |
|
|
43
|
+
<!-- AGENTS-GENERATED:END golden-samples -->
|
|
44
|
+
|
|
45
|
+
## Heuristics (quick decisions)
|
|
46
|
+
<!-- AGENTS-GENERATED:START heuristics -->
|
|
47
|
+
| When | Do |
|
|
48
|
+
|------|-----|
|
|
49
|
+
| Adding package | Internal → `internal/`, Public → `pkg/` |
|
|
50
|
+
| Committing | Use Conventional Commits (feat:, fix:, docs:, etc.) |
|
|
51
|
+
| Merging PRs | Squash and merge |
|
|
52
|
+
| Adding dependency | Ask first - we minimize deps |
|
|
53
|
+
| Unsure about pattern | Check Golden Samples above |
|
|
54
|
+
<!-- AGENTS-GENERATED:END heuristics -->
|
|
55
|
+
|
|
56
|
+
## Repository Settings
|
|
57
|
+
<!-- AGENTS-GENERATED:START repo-settings -->
|
|
58
|
+
- **Default branch:** `main`
|
|
59
|
+
- **Merge strategy:** squash, merge, rebase
|
|
60
|
+
<!-- AGENTS-GENERATED:END repo-settings -->
|
|
61
|
+
|
|
62
|
+
## Boundaries
|
|
63
|
+
|
|
64
|
+
### Always Do
|
|
65
|
+
- Run pre-commit checks before committing
|
|
66
|
+
- Add tests for new code paths
|
|
67
|
+
- Use conventional commit format: `type(scope): subject`
|
|
68
|
+
- Follow Go 1.22 conventions and idioms
|
|
69
|
+
|
|
70
|
+
### Ask First
|
|
71
|
+
- Adding new dependencies
|
|
72
|
+
- Modifying CI/CD configuration
|
|
73
|
+
- Changing public API signatures
|
|
74
|
+
- Running full e2e test suites
|
|
75
|
+
- Repo-wide refactoring or rewrites
|
|
76
|
+
|
|
77
|
+
### Never Do
|
|
78
|
+
- Commit secrets, credentials, or sensitive data
|
|
79
|
+
- Modify vendor/, node_modules/, or generated files
|
|
80
|
+
- Push directly to main/master branch
|
|
81
|
+
- Delete migration files or schema changes
|
|
82
|
+
- Commit go.sum without go.mod changes
|
|
83
|
+
|
|
84
|
+
## When instructions conflict
|
|
85
|
+
The nearest `AGENTS.md` wins. Explicit user prompts override files.
|
|
86
|
+
- For Go-specific patterns, defer to language idioms and standard library conventions
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "admin-dashboard",
|
|
3
|
+
"private": true,
|
|
4
|
+
"scripts": {
|
|
5
|
+
"dev": "vite",
|
|
6
|
+
"build": "vite build",
|
|
7
|
+
"test": "vitest",
|
|
8
|
+
"lint": "eslint src"
|
|
9
|
+
},
|
|
10
|
+
"dependencies": {
|
|
11
|
+
"react": "^18.2.0",
|
|
12
|
+
"react-dom": "^18.2.0"
|
|
13
|
+
},
|
|
14
|
+
"devDependencies": {
|
|
15
|
+
"vite": "^8.0.8",
|
|
16
|
+
"vitest": "^1.0.0",
|
|
17
|
+
"eslint": "^8.56.0",
|
|
18
|
+
"typescript": "^5.3.0"
|
|
19
|
+
}
|
|
20
|
+
}
|