solokit 0.1.1__py3-none-any.whl
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.
- solokit/__init__.py +10 -0
- solokit/__version__.py +3 -0
- solokit/cli.py +374 -0
- solokit/core/__init__.py +1 -0
- solokit/core/cache.py +102 -0
- solokit/core/command_runner.py +278 -0
- solokit/core/config.py +453 -0
- solokit/core/config_validator.py +204 -0
- solokit/core/constants.py +291 -0
- solokit/core/error_formatter.py +279 -0
- solokit/core/error_handlers.py +346 -0
- solokit/core/exceptions.py +1567 -0
- solokit/core/file_ops.py +309 -0
- solokit/core/logging_config.py +166 -0
- solokit/core/output.py +99 -0
- solokit/core/performance.py +57 -0
- solokit/core/protocols.py +141 -0
- solokit/core/types.py +312 -0
- solokit/deployment/__init__.py +1 -0
- solokit/deployment/executor.py +411 -0
- solokit/git/__init__.py +1 -0
- solokit/git/integration.py +619 -0
- solokit/init/__init__.py +41 -0
- solokit/init/claude_commands_installer.py +87 -0
- solokit/init/dependency_installer.py +313 -0
- solokit/init/docs_structure.py +90 -0
- solokit/init/env_generator.py +160 -0
- solokit/init/environment_validator.py +334 -0
- solokit/init/git_hooks_installer.py +71 -0
- solokit/init/git_setup.py +188 -0
- solokit/init/gitignore_updater.py +195 -0
- solokit/init/initial_commit.py +145 -0
- solokit/init/initial_scans.py +109 -0
- solokit/init/orchestrator.py +246 -0
- solokit/init/readme_generator.py +207 -0
- solokit/init/session_structure.py +239 -0
- solokit/init/template_installer.py +424 -0
- solokit/learning/__init__.py +1 -0
- solokit/learning/archiver.py +115 -0
- solokit/learning/categorizer.py +126 -0
- solokit/learning/curator.py +428 -0
- solokit/learning/extractor.py +352 -0
- solokit/learning/reporter.py +351 -0
- solokit/learning/repository.py +254 -0
- solokit/learning/similarity.py +342 -0
- solokit/learning/validator.py +144 -0
- solokit/project/__init__.py +1 -0
- solokit/project/init.py +1162 -0
- solokit/project/stack.py +436 -0
- solokit/project/sync_plugin.py +438 -0
- solokit/project/tree.py +375 -0
- solokit/quality/__init__.py +1 -0
- solokit/quality/api_validator.py +424 -0
- solokit/quality/checkers/__init__.py +25 -0
- solokit/quality/checkers/base.py +114 -0
- solokit/quality/checkers/context7.py +221 -0
- solokit/quality/checkers/custom.py +162 -0
- solokit/quality/checkers/deployment.py +323 -0
- solokit/quality/checkers/documentation.py +179 -0
- solokit/quality/checkers/formatting.py +161 -0
- solokit/quality/checkers/integration.py +394 -0
- solokit/quality/checkers/linting.py +159 -0
- solokit/quality/checkers/security.py +261 -0
- solokit/quality/checkers/spec_completeness.py +127 -0
- solokit/quality/checkers/tests.py +184 -0
- solokit/quality/env_validator.py +306 -0
- solokit/quality/gates.py +655 -0
- solokit/quality/reporters/__init__.py +10 -0
- solokit/quality/reporters/base.py +25 -0
- solokit/quality/reporters/console.py +98 -0
- solokit/quality/reporters/json_reporter.py +34 -0
- solokit/quality/results.py +98 -0
- solokit/session/__init__.py +1 -0
- solokit/session/briefing/__init__.py +245 -0
- solokit/session/briefing/documentation_loader.py +53 -0
- solokit/session/briefing/formatter.py +476 -0
- solokit/session/briefing/git_context.py +282 -0
- solokit/session/briefing/learning_loader.py +212 -0
- solokit/session/briefing/milestone_builder.py +78 -0
- solokit/session/briefing/orchestrator.py +137 -0
- solokit/session/briefing/stack_detector.py +51 -0
- solokit/session/briefing/tree_generator.py +52 -0
- solokit/session/briefing/work_item_loader.py +209 -0
- solokit/session/briefing.py +353 -0
- solokit/session/complete.py +1188 -0
- solokit/session/status.py +246 -0
- solokit/session/validate.py +452 -0
- solokit/templates/.claude/commands/end.md +109 -0
- solokit/templates/.claude/commands/init.md +159 -0
- solokit/templates/.claude/commands/learn-curate.md +88 -0
- solokit/templates/.claude/commands/learn-search.md +62 -0
- solokit/templates/.claude/commands/learn-show.md +69 -0
- solokit/templates/.claude/commands/learn.md +136 -0
- solokit/templates/.claude/commands/start.md +114 -0
- solokit/templates/.claude/commands/status.md +22 -0
- solokit/templates/.claude/commands/validate.md +27 -0
- solokit/templates/.claude/commands/work-delete.md +119 -0
- solokit/templates/.claude/commands/work-graph.md +139 -0
- solokit/templates/.claude/commands/work-list.md +26 -0
- solokit/templates/.claude/commands/work-new.md +114 -0
- solokit/templates/.claude/commands/work-next.md +25 -0
- solokit/templates/.claude/commands/work-show.md +24 -0
- solokit/templates/.claude/commands/work-update.md +141 -0
- solokit/templates/CHANGELOG.md +17 -0
- solokit/templates/WORK_ITEM_TYPES.md +141 -0
- solokit/templates/__init__.py +1 -0
- solokit/templates/bug_spec.md +217 -0
- solokit/templates/config.schema.json +150 -0
- solokit/templates/dashboard_refine/base/.gitignore +36 -0
- solokit/templates/dashboard_refine/base/app/(dashboard)/layout.tsx +22 -0
- solokit/templates/dashboard_refine/base/app/(dashboard)/page.tsx +68 -0
- solokit/templates/dashboard_refine/base/app/(dashboard)/users/page.tsx +77 -0
- solokit/templates/dashboard_refine/base/app/globals.css +60 -0
- solokit/templates/dashboard_refine/base/app/layout.tsx +23 -0
- solokit/templates/dashboard_refine/base/app/page.tsx +9 -0
- solokit/templates/dashboard_refine/base/components/client-refine-wrapper.tsx +21 -0
- solokit/templates/dashboard_refine/base/components/layout/header.tsx +44 -0
- solokit/templates/dashboard_refine/base/components/layout/sidebar.tsx +82 -0
- solokit/templates/dashboard_refine/base/components/ui/button.tsx +53 -0
- solokit/templates/dashboard_refine/base/components/ui/card.tsx +78 -0
- solokit/templates/dashboard_refine/base/components/ui/table.tsx +116 -0
- solokit/templates/dashboard_refine/base/components.json +16 -0
- solokit/templates/dashboard_refine/base/lib/refine.tsx +65 -0
- solokit/templates/dashboard_refine/base/lib/utils.ts +13 -0
- solokit/templates/dashboard_refine/base/next.config.ts +10 -0
- solokit/templates/dashboard_refine/base/package.json.template +40 -0
- solokit/templates/dashboard_refine/base/postcss.config.mjs +8 -0
- solokit/templates/dashboard_refine/base/providers/refine-provider.tsx +26 -0
- solokit/templates/dashboard_refine/base/tailwind.config.ts +57 -0
- solokit/templates/dashboard_refine/base/tsconfig.json +27 -0
- solokit/templates/dashboard_refine/docker/Dockerfile +57 -0
- solokit/templates/dashboard_refine/docker/docker-compose.prod.yml +31 -0
- solokit/templates/dashboard_refine/docker/docker-compose.yml +21 -0
- solokit/templates/dashboard_refine/tier-1-essential/.eslintrc.json +7 -0
- solokit/templates/dashboard_refine/tier-1-essential/jest.config.ts +17 -0
- solokit/templates/dashboard_refine/tier-1-essential/jest.setup.ts +1 -0
- solokit/templates/dashboard_refine/tier-1-essential/package.json.tier1.template +57 -0
- solokit/templates/dashboard_refine/tier-1-essential/tests/setup.ts +26 -0
- solokit/templates/dashboard_refine/tier-1-essential/tests/unit/example.test.tsx +73 -0
- solokit/templates/dashboard_refine/tier-2-standard/package.json.tier2.template +62 -0
- solokit/templates/dashboard_refine/tier-3-comprehensive/eslint.config.mjs +22 -0
- solokit/templates/dashboard_refine/tier-3-comprehensive/package.json.tier3.template +79 -0
- solokit/templates/dashboard_refine/tier-3-comprehensive/playwright.config.ts +66 -0
- solokit/templates/dashboard_refine/tier-3-comprehensive/stryker.conf.json +38 -0
- solokit/templates/dashboard_refine/tier-3-comprehensive/tests/e2e/dashboard.spec.ts +88 -0
- solokit/templates/dashboard_refine/tier-3-comprehensive/tests/e2e/user-management.spec.ts +102 -0
- solokit/templates/dashboard_refine/tier-3-comprehensive/tests/integration/dashboard.test.tsx +90 -0
- solokit/templates/dashboard_refine/tier-3-comprehensive/type-coverage.json +16 -0
- solokit/templates/dashboard_refine/tier-4-production/instrumentation.ts +9 -0
- solokit/templates/dashboard_refine/tier-4-production/k6/dashboard-load-test.js +70 -0
- solokit/templates/dashboard_refine/tier-4-production/next.config.ts +46 -0
- solokit/templates/dashboard_refine/tier-4-production/package.json.tier4.template +89 -0
- solokit/templates/dashboard_refine/tier-4-production/sentry.client.config.ts +26 -0
- solokit/templates/dashboard_refine/tier-4-production/sentry.edge.config.ts +11 -0
- solokit/templates/dashboard_refine/tier-4-production/sentry.server.config.ts +11 -0
- solokit/templates/deployment_spec.md +500 -0
- solokit/templates/feature_spec.md +248 -0
- solokit/templates/fullstack_nextjs/base/.gitignore +36 -0
- solokit/templates/fullstack_nextjs/base/app/api/example/route.ts +65 -0
- solokit/templates/fullstack_nextjs/base/app/globals.css +27 -0
- solokit/templates/fullstack_nextjs/base/app/layout.tsx +20 -0
- solokit/templates/fullstack_nextjs/base/app/page.tsx +32 -0
- solokit/templates/fullstack_nextjs/base/components/example-component.tsx +20 -0
- solokit/templates/fullstack_nextjs/base/lib/prisma.ts +17 -0
- solokit/templates/fullstack_nextjs/base/lib/utils.ts +13 -0
- solokit/templates/fullstack_nextjs/base/lib/validations.ts +20 -0
- solokit/templates/fullstack_nextjs/base/next.config.ts +7 -0
- solokit/templates/fullstack_nextjs/base/package.json.template +32 -0
- solokit/templates/fullstack_nextjs/base/postcss.config.mjs +8 -0
- solokit/templates/fullstack_nextjs/base/prisma/schema.prisma +21 -0
- solokit/templates/fullstack_nextjs/base/tailwind.config.ts +19 -0
- solokit/templates/fullstack_nextjs/base/tsconfig.json +27 -0
- solokit/templates/fullstack_nextjs/docker/Dockerfile +60 -0
- solokit/templates/fullstack_nextjs/docker/docker-compose.prod.yml +57 -0
- solokit/templates/fullstack_nextjs/docker/docker-compose.yml +47 -0
- solokit/templates/fullstack_nextjs/tier-1-essential/.eslintrc.json +7 -0
- solokit/templates/fullstack_nextjs/tier-1-essential/jest.config.ts +17 -0
- solokit/templates/fullstack_nextjs/tier-1-essential/jest.setup.ts +1 -0
- solokit/templates/fullstack_nextjs/tier-1-essential/package.json.tier1.template +48 -0
- solokit/templates/fullstack_nextjs/tier-1-essential/tests/api/example.test.ts +88 -0
- solokit/templates/fullstack_nextjs/tier-1-essential/tests/setup.ts +22 -0
- solokit/templates/fullstack_nextjs/tier-1-essential/tests/unit/example.test.tsx +22 -0
- solokit/templates/fullstack_nextjs/tier-2-standard/package.json.tier2.template +52 -0
- solokit/templates/fullstack_nextjs/tier-3-comprehensive/eslint.config.mjs +39 -0
- solokit/templates/fullstack_nextjs/tier-3-comprehensive/package.json.tier3.template +68 -0
- solokit/templates/fullstack_nextjs/tier-3-comprehensive/playwright.config.ts +66 -0
- solokit/templates/fullstack_nextjs/tier-3-comprehensive/stryker.conf.json +33 -0
- solokit/templates/fullstack_nextjs/tier-3-comprehensive/tests/e2e/flow.spec.ts +59 -0
- solokit/templates/fullstack_nextjs/tier-3-comprehensive/tests/integration/api.test.ts +165 -0
- solokit/templates/fullstack_nextjs/tier-3-comprehensive/type-coverage.json +12 -0
- solokit/templates/fullstack_nextjs/tier-4-production/instrumentation.ts +9 -0
- solokit/templates/fullstack_nextjs/tier-4-production/k6/load-test.js +45 -0
- solokit/templates/fullstack_nextjs/tier-4-production/next.config.ts +46 -0
- solokit/templates/fullstack_nextjs/tier-4-production/package.json.tier4.template +77 -0
- solokit/templates/fullstack_nextjs/tier-4-production/sentry.client.config.ts +26 -0
- solokit/templates/fullstack_nextjs/tier-4-production/sentry.edge.config.ts +11 -0
- solokit/templates/fullstack_nextjs/tier-4-production/sentry.server.config.ts +11 -0
- solokit/templates/git-hooks/prepare-commit-msg +24 -0
- solokit/templates/integration_test_spec.md +363 -0
- solokit/templates/learnings.json +15 -0
- solokit/templates/ml_ai_fastapi/base/.gitignore +104 -0
- solokit/templates/ml_ai_fastapi/base/alembic/env.py +96 -0
- solokit/templates/ml_ai_fastapi/base/alembic.ini +114 -0
- solokit/templates/ml_ai_fastapi/base/pyproject.toml.template +91 -0
- solokit/templates/ml_ai_fastapi/base/requirements.txt.template +28 -0
- solokit/templates/ml_ai_fastapi/base/src/__init__.py +5 -0
- solokit/templates/ml_ai_fastapi/base/src/api/__init__.py +3 -0
- solokit/templates/ml_ai_fastapi/base/src/api/dependencies.py +20 -0
- solokit/templates/ml_ai_fastapi/base/src/api/routes/__init__.py +3 -0
- solokit/templates/ml_ai_fastapi/base/src/api/routes/example.py +134 -0
- solokit/templates/ml_ai_fastapi/base/src/api/routes/health.py +66 -0
- solokit/templates/ml_ai_fastapi/base/src/core/__init__.py +3 -0
- solokit/templates/ml_ai_fastapi/base/src/core/config.py +64 -0
- solokit/templates/ml_ai_fastapi/base/src/core/database.py +50 -0
- solokit/templates/ml_ai_fastapi/base/src/main.py +64 -0
- solokit/templates/ml_ai_fastapi/base/src/models/__init__.py +7 -0
- solokit/templates/ml_ai_fastapi/base/src/models/example.py +61 -0
- solokit/templates/ml_ai_fastapi/base/src/services/__init__.py +3 -0
- solokit/templates/ml_ai_fastapi/base/src/services/example.py +115 -0
- solokit/templates/ml_ai_fastapi/docker/Dockerfile +59 -0
- solokit/templates/ml_ai_fastapi/docker/docker-compose.prod.yml +112 -0
- solokit/templates/ml_ai_fastapi/docker/docker-compose.yml +77 -0
- solokit/templates/ml_ai_fastapi/tier-1-essential/pyproject.toml.tier1.template +112 -0
- solokit/templates/ml_ai_fastapi/tier-1-essential/pyrightconfig.json +41 -0
- solokit/templates/ml_ai_fastapi/tier-1-essential/pytest.ini +69 -0
- solokit/templates/ml_ai_fastapi/tier-1-essential/requirements-dev.txt +17 -0
- solokit/templates/ml_ai_fastapi/tier-1-essential/ruff.toml +81 -0
- solokit/templates/ml_ai_fastapi/tier-1-essential/tests/__init__.py +3 -0
- solokit/templates/ml_ai_fastapi/tier-1-essential/tests/conftest.py +72 -0
- solokit/templates/ml_ai_fastapi/tier-1-essential/tests/test_main.py +49 -0
- solokit/templates/ml_ai_fastapi/tier-1-essential/tests/unit/__init__.py +3 -0
- solokit/templates/ml_ai_fastapi/tier-1-essential/tests/unit/test_example.py +113 -0
- solokit/templates/ml_ai_fastapi/tier-2-standard/pyproject.toml.tier2.template +130 -0
- solokit/templates/ml_ai_fastapi/tier-3-comprehensive/locustfile.py +99 -0
- solokit/templates/ml_ai_fastapi/tier-3-comprehensive/mutmut_config.py +53 -0
- solokit/templates/ml_ai_fastapi/tier-3-comprehensive/pyproject.toml.tier3.template +150 -0
- solokit/templates/ml_ai_fastapi/tier-3-comprehensive/tests/integration/__init__.py +3 -0
- solokit/templates/ml_ai_fastapi/tier-3-comprehensive/tests/integration/conftest.py +74 -0
- solokit/templates/ml_ai_fastapi/tier-3-comprehensive/tests/integration/test_api.py +131 -0
- solokit/templates/ml_ai_fastapi/tier-4-production/pyproject.toml.tier4.template +162 -0
- solokit/templates/ml_ai_fastapi/tier-4-production/requirements-prod.txt +25 -0
- solokit/templates/ml_ai_fastapi/tier-4-production/src/api/routes/metrics.py +19 -0
- solokit/templates/ml_ai_fastapi/tier-4-production/src/core/logging.py +74 -0
- solokit/templates/ml_ai_fastapi/tier-4-production/src/core/monitoring.py +68 -0
- solokit/templates/ml_ai_fastapi/tier-4-production/src/core/sentry.py +66 -0
- solokit/templates/ml_ai_fastapi/tier-4-production/src/middleware/__init__.py +3 -0
- solokit/templates/ml_ai_fastapi/tier-4-production/src/middleware/logging.py +79 -0
- solokit/templates/ml_ai_fastapi/tier-4-production/src/middleware/tracing.py +60 -0
- solokit/templates/refactor_spec.md +287 -0
- solokit/templates/saas_t3/base/.gitignore +36 -0
- solokit/templates/saas_t3/base/app/api/trpc/[trpc]/route.ts +33 -0
- solokit/templates/saas_t3/base/app/globals.css +27 -0
- solokit/templates/saas_t3/base/app/layout.tsx +23 -0
- solokit/templates/saas_t3/base/app/page.tsx +31 -0
- solokit/templates/saas_t3/base/lib/api.tsx +77 -0
- solokit/templates/saas_t3/base/lib/utils.ts +13 -0
- solokit/templates/saas_t3/base/next.config.ts +7 -0
- solokit/templates/saas_t3/base/package.json.template +38 -0
- solokit/templates/saas_t3/base/postcss.config.mjs +8 -0
- solokit/templates/saas_t3/base/prisma/schema.prisma +20 -0
- solokit/templates/saas_t3/base/server/api/root.ts +19 -0
- solokit/templates/saas_t3/base/server/api/routers/example.ts +28 -0
- solokit/templates/saas_t3/base/server/api/trpc.ts +52 -0
- solokit/templates/saas_t3/base/server/db.ts +17 -0
- solokit/templates/saas_t3/base/tailwind.config.ts +19 -0
- solokit/templates/saas_t3/base/tsconfig.json +27 -0
- solokit/templates/saas_t3/docker/Dockerfile +60 -0
- solokit/templates/saas_t3/docker/docker-compose.prod.yml +59 -0
- solokit/templates/saas_t3/docker/docker-compose.yml +49 -0
- solokit/templates/saas_t3/tier-1-essential/.eslintrc.json +7 -0
- solokit/templates/saas_t3/tier-1-essential/jest.config.ts +17 -0
- solokit/templates/saas_t3/tier-1-essential/jest.setup.ts +1 -0
- solokit/templates/saas_t3/tier-1-essential/package.json.tier1.template +54 -0
- solokit/templates/saas_t3/tier-1-essential/tests/setup.ts +22 -0
- solokit/templates/saas_t3/tier-1-essential/tests/unit/example.test.tsx +24 -0
- solokit/templates/saas_t3/tier-2-standard/package.json.tier2.template +58 -0
- solokit/templates/saas_t3/tier-3-comprehensive/eslint.config.mjs +39 -0
- solokit/templates/saas_t3/tier-3-comprehensive/package.json.tier3.template +74 -0
- solokit/templates/saas_t3/tier-3-comprehensive/playwright.config.ts +66 -0
- solokit/templates/saas_t3/tier-3-comprehensive/stryker.conf.json +34 -0
- solokit/templates/saas_t3/tier-3-comprehensive/tests/e2e/home.spec.ts +41 -0
- solokit/templates/saas_t3/tier-3-comprehensive/tests/integration/api.test.ts +44 -0
- solokit/templates/saas_t3/tier-3-comprehensive/type-coverage.json +12 -0
- solokit/templates/saas_t3/tier-4-production/instrumentation.ts +9 -0
- solokit/templates/saas_t3/tier-4-production/k6/load-test.js +51 -0
- solokit/templates/saas_t3/tier-4-production/next.config.ts +46 -0
- solokit/templates/saas_t3/tier-4-production/package.json.tier4.template +83 -0
- solokit/templates/saas_t3/tier-4-production/sentry.client.config.ts +26 -0
- solokit/templates/saas_t3/tier-4-production/sentry.edge.config.ts +11 -0
- solokit/templates/saas_t3/tier-4-production/sentry.server.config.ts +11 -0
- solokit/templates/saas_t3/tier-4-production/vercel.json +37 -0
- solokit/templates/security_spec.md +287 -0
- solokit/templates/stack-versions.yaml +617 -0
- solokit/templates/status_update.json +6 -0
- solokit/templates/template-registry.json +257 -0
- solokit/templates/work_items.json +11 -0
- solokit/testing/__init__.py +1 -0
- solokit/testing/integration_runner.py +550 -0
- solokit/testing/performance.py +637 -0
- solokit/visualization/__init__.py +1 -0
- solokit/visualization/dependency_graph.py +788 -0
- solokit/work_items/__init__.py +1 -0
- solokit/work_items/creator.py +217 -0
- solokit/work_items/delete.py +264 -0
- solokit/work_items/get_dependencies.py +185 -0
- solokit/work_items/get_dependents.py +113 -0
- solokit/work_items/get_metadata.py +121 -0
- solokit/work_items/get_next_recommendations.py +133 -0
- solokit/work_items/manager.py +235 -0
- solokit/work_items/milestones.py +137 -0
- solokit/work_items/query.py +376 -0
- solokit/work_items/repository.py +267 -0
- solokit/work_items/scheduler.py +184 -0
- solokit/work_items/spec_parser.py +838 -0
- solokit/work_items/spec_validator.py +493 -0
- solokit/work_items/updater.py +157 -0
- solokit/work_items/validator.py +205 -0
- solokit-0.1.1.dist-info/METADATA +640 -0
- solokit-0.1.1.dist-info/RECORD +323 -0
- solokit-0.1.1.dist-info/WHEEL +5 -0
- solokit-0.1.1.dist-info/entry_points.txt +2 -0
- solokit-0.1.1.dist-info/licenses/LICENSE +21 -0
- solokit-0.1.1.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
# Feature: [Feature Name]
|
|
2
|
+
|
|
3
|
+
<!--
|
|
4
|
+
TEMPLATE INSTRUCTIONS:
|
|
5
|
+
- Replace [Feature Name] with the actual feature name
|
|
6
|
+
- Fill out all sections below with specific details
|
|
7
|
+
- Use concrete examples where possible
|
|
8
|
+
- Check off items in checklists as you complete them
|
|
9
|
+
- Remove these instructions before finalizing the spec
|
|
10
|
+
-->
|
|
11
|
+
|
|
12
|
+
## Overview
|
|
13
|
+
|
|
14
|
+
<!-- Provide a 2-3 sentence description of what this feature does and why it's needed -->
|
|
15
|
+
|
|
16
|
+
Brief description of what this feature does and why it's needed.
|
|
17
|
+
|
|
18
|
+
**Example:**
|
|
19
|
+
> This feature adds real-time notifications to the dashboard, alerting users when important events occur. It uses WebSocket connections to push updates without requiring page refreshes, improving user experience and reducing server load from polling.
|
|
20
|
+
|
|
21
|
+
## User Story
|
|
22
|
+
|
|
23
|
+
<!-- Describe who benefits and what they achieve with this feature -->
|
|
24
|
+
|
|
25
|
+
As a [type of user], I want [goal] so that [benefit].
|
|
26
|
+
|
|
27
|
+
**Example:**
|
|
28
|
+
> As a dashboard user, I want to receive real-time notifications when my tasks are updated so that I can respond quickly without constantly refreshing the page.
|
|
29
|
+
|
|
30
|
+
## Rationale
|
|
31
|
+
|
|
32
|
+
<!-- Explain the business value, problem being solved, or opportunity being addressed -->
|
|
33
|
+
|
|
34
|
+
Why is this feature important? What problem does it solve?
|
|
35
|
+
|
|
36
|
+
**Consider:**
|
|
37
|
+
- What pain point does this address?
|
|
38
|
+
- What business value does it provide?
|
|
39
|
+
- What happens if we don't build this?
|
|
40
|
+
- Are there user requests or metrics supporting this?
|
|
41
|
+
|
|
42
|
+
## Acceptance Criteria
|
|
43
|
+
|
|
44
|
+
<!-- Specific, measurable criteria that must be met for this feature to be considered complete -->
|
|
45
|
+
|
|
46
|
+
- [ ] Users can see notifications in real-time without page refresh
|
|
47
|
+
- [ ] Notifications are displayed in a non-intrusive manner
|
|
48
|
+
- [ ] Users can dismiss individual notifications
|
|
49
|
+
- [ ] Users can view notification history for the past 30 days
|
|
50
|
+
- [ ] System sends notifications for all supported event types
|
|
51
|
+
- [ ] Notifications work across multiple browser tabs
|
|
52
|
+
- [ ] All tests pass including new notification tests
|
|
53
|
+
- [ ] Documentation is updated
|
|
54
|
+
|
|
55
|
+
## Implementation Details
|
|
56
|
+
|
|
57
|
+
### Approach
|
|
58
|
+
|
|
59
|
+
<!-- High-level technical approach and key design decisions -->
|
|
60
|
+
|
|
61
|
+
**Example:**
|
|
62
|
+
> We'll implement WebSocket connections using Socket.IO for bidirectional communication. The server will emit events when tasks are updated, and the client will listen for these events and update the UI. We'll use a notification queue on the backend to handle high-volume scenarios and ensure delivery.
|
|
63
|
+
|
|
64
|
+
### LLM/Processing Configuration
|
|
65
|
+
|
|
66
|
+
<!-- For LLM-based features: Document DSPy signatures, LLM provider, and usage patterns
|
|
67
|
+
For deterministic features: Describe processing type and algorithms
|
|
68
|
+
For external API features: Document API integration details
|
|
69
|
+
If not applicable: State "Not Applicable" -->
|
|
70
|
+
|
|
71
|
+
**For LLM-based features:**
|
|
72
|
+
|
|
73
|
+
```markdown
|
|
74
|
+
**Type:** LLM-based (DSPy)
|
|
75
|
+
|
|
76
|
+
**DSPy Signature:**
|
|
77
|
+
```python
|
|
78
|
+
class ExampleSignature(dspy.Signature):
|
|
79
|
+
"""Description of what this signature does."""
|
|
80
|
+
|
|
81
|
+
input_field = dspy.InputField(desc="Description of input")
|
|
82
|
+
output_field = dspy.OutputField(desc="Description of output")
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
**LLM Provider:** Google AI Studio (Gemini 2.5 Flash)
|
|
86
|
+
|
|
87
|
+
**LLM Usage:**
|
|
88
|
+
- Analyzes input data to extract key information
|
|
89
|
+
- Generates structured output based on learned patterns
|
|
90
|
+
- Fallback to rule-based processing if LLM unavailable
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
**For deterministic/non-LLM features:**
|
|
94
|
+
|
|
95
|
+
```markdown
|
|
96
|
+
**Type:** Deterministic (No LLM)
|
|
97
|
+
|
|
98
|
+
**Processing Type:**
|
|
99
|
+
- Parse input data using regex patterns
|
|
100
|
+
- Transform data through validation pipeline
|
|
101
|
+
- Apply business logic rules to generate output
|
|
102
|
+
- Use algorithm X for data aggregation
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
**For external API integration:**
|
|
106
|
+
|
|
107
|
+
```markdown
|
|
108
|
+
**Type:** External API Integration (No LLM)
|
|
109
|
+
|
|
110
|
+
**API Provider:** [Provider name]
|
|
111
|
+
|
|
112
|
+
**Processing Type:**
|
|
113
|
+
- Make API calls to external service
|
|
114
|
+
- Transform API responses to internal format
|
|
115
|
+
- Handle rate limiting and retries
|
|
116
|
+
- Cache results for performance
|
|
117
|
+
|
|
118
|
+
**Rate Limits:** [Details if applicable]
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
**If not applicable:**
|
|
122
|
+
|
|
123
|
+
```markdown
|
|
124
|
+
Not Applicable - Standard application logic without LLM or special processing requirements.
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
### Components Affected
|
|
128
|
+
|
|
129
|
+
<!-- List all files, modules, or systems that will be modified -->
|
|
130
|
+
|
|
131
|
+
- Frontend: `src/components/NotificationCenter.tsx` (new)
|
|
132
|
+
- Frontend: `src/hooks/useWebSocket.ts` (new)
|
|
133
|
+
- Frontend: `src/services/notificationService.ts` (new)
|
|
134
|
+
- Backend: `src/websocket/notificationHandler.ts` (new)
|
|
135
|
+
- Backend: `src/models/Notification.ts` (new)
|
|
136
|
+
- Database: `notifications` table (new)
|
|
137
|
+
|
|
138
|
+
### API Changes
|
|
139
|
+
|
|
140
|
+
<!-- Document all new or modified API endpoints, parameters, and responses -->
|
|
141
|
+
|
|
142
|
+
**New Endpoints:**
|
|
143
|
+
|
|
144
|
+
```typescript
|
|
145
|
+
// WebSocket connection endpoint
|
|
146
|
+
ws://api.example.com/notifications
|
|
147
|
+
|
|
148
|
+
// Events emitted:
|
|
149
|
+
{
|
|
150
|
+
event: "task.updated",
|
|
151
|
+
data: {
|
|
152
|
+
taskId: string,
|
|
153
|
+
title: string,
|
|
154
|
+
changes: object,
|
|
155
|
+
timestamp: Date
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
// REST endpoint for notification history
|
|
160
|
+
GET /api/notifications?limit=50&offset=0
|
|
161
|
+
Response: {
|
|
162
|
+
notifications: Notification[],
|
|
163
|
+
total: number
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
// Mark notification as read
|
|
167
|
+
PATCH /api/notifications/:id/read
|
|
168
|
+
Response: {
|
|
169
|
+
success: boolean
|
|
170
|
+
}
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
### Database Changes
|
|
174
|
+
|
|
175
|
+
<!-- Document all schema changes, migrations, and data transformations -->
|
|
176
|
+
|
|
177
|
+
**New Table:**
|
|
178
|
+
|
|
179
|
+
```sql
|
|
180
|
+
CREATE TABLE notifications (
|
|
181
|
+
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
182
|
+
user_id UUID NOT NULL REFERENCES users(id),
|
|
183
|
+
type VARCHAR(50) NOT NULL,
|
|
184
|
+
title VARCHAR(255) NOT NULL,
|
|
185
|
+
message TEXT,
|
|
186
|
+
data JSONB,
|
|
187
|
+
read BOOLEAN DEFAULT FALSE,
|
|
188
|
+
created_at TIMESTAMP DEFAULT NOW(),
|
|
189
|
+
INDEX idx_user_created (user_id, created_at DESC)
|
|
190
|
+
);
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
**Migration:**
|
|
194
|
+
- File: `migrations/2025_10_add_notifications_table.sql`
|
|
195
|
+
- Rollback: Drop table and indexes
|
|
196
|
+
|
|
197
|
+
## Testing Strategy
|
|
198
|
+
|
|
199
|
+
<!-- Comprehensive testing approach for this feature -->
|
|
200
|
+
|
|
201
|
+
### Unit Tests
|
|
202
|
+
- NotificationCenter component rendering and interaction
|
|
203
|
+
- WebSocket connection lifecycle management
|
|
204
|
+
- Notification service message handling
|
|
205
|
+
- Database query functions
|
|
206
|
+
|
|
207
|
+
### Integration Tests
|
|
208
|
+
- End-to-end WebSocket communication
|
|
209
|
+
- Notification creation and retrieval flow
|
|
210
|
+
- Multi-tab notification synchronization
|
|
211
|
+
- Notification history pagination
|
|
212
|
+
|
|
213
|
+
### Manual Testing
|
|
214
|
+
- [ ] Test on Chrome, Firefox, Safari
|
|
215
|
+
- [ ] Test with slow network connection
|
|
216
|
+
- [ ] Test with WebSocket connection drops and reconnects
|
|
217
|
+
- [ ] Test notification display with various content lengths
|
|
218
|
+
- [ ] Test concurrent notifications (stress test)
|
|
219
|
+
- [ ] Test notification persistence across page reloads
|
|
220
|
+
|
|
221
|
+
## Documentation Updates
|
|
222
|
+
|
|
223
|
+
- [ ] User documentation: How to manage notifications
|
|
224
|
+
- [ ] API documentation: WebSocket events and REST endpoints
|
|
225
|
+
- [ ] README updates: New WebSocket dependencies
|
|
226
|
+
- [ ] Architecture docs: Notification system design
|
|
227
|
+
- [ ] Deployment notes: WebSocket infrastructure requirements
|
|
228
|
+
|
|
229
|
+
## Dependencies
|
|
230
|
+
|
|
231
|
+
<!-- List any other work items, external libraries, or infrastructure this depends on -->
|
|
232
|
+
|
|
233
|
+
- `feature_user_authentication` (must be completed first)
|
|
234
|
+
- `refactor_websocket_infrastructure` (must be completed first)
|
|
235
|
+
- New dependency: `socket.io-client` ^4.5.0
|
|
236
|
+
- Infrastructure: WebSocket support in production load balancer
|
|
237
|
+
|
|
238
|
+
## Estimated Effort
|
|
239
|
+
|
|
240
|
+
[Number] sessions
|
|
241
|
+
|
|
242
|
+
<!--
|
|
243
|
+
Estimation guidelines:
|
|
244
|
+
- Simple feature (CRUD, UI update): 1-2 sessions
|
|
245
|
+
- Medium feature (new API, moderate complexity): 2-4 sessions
|
|
246
|
+
- Complex feature (multiple systems, data migration): 4-8 sessions
|
|
247
|
+
- Very complex feature (major architecture change): 8+ sessions
|
|
248
|
+
-->
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
|
|
2
|
+
|
|
3
|
+
# dependencies
|
|
4
|
+
/node_modules
|
|
5
|
+
/.pnp
|
|
6
|
+
.pnp.js
|
|
7
|
+
.yarn/install-state.gz
|
|
8
|
+
|
|
9
|
+
# testing
|
|
10
|
+
/coverage
|
|
11
|
+
|
|
12
|
+
# next.js
|
|
13
|
+
/.next/
|
|
14
|
+
/out/
|
|
15
|
+
|
|
16
|
+
# production
|
|
17
|
+
/build
|
|
18
|
+
|
|
19
|
+
# misc
|
|
20
|
+
.DS_Store
|
|
21
|
+
*.pem
|
|
22
|
+
|
|
23
|
+
# debug
|
|
24
|
+
npm-debug.log*
|
|
25
|
+
yarn-debug.log*
|
|
26
|
+
yarn-error.log*
|
|
27
|
+
|
|
28
|
+
# local env files
|
|
29
|
+
.env*.local
|
|
30
|
+
|
|
31
|
+
# vercel
|
|
32
|
+
.vercel
|
|
33
|
+
|
|
34
|
+
# typescript
|
|
35
|
+
*.tsbuildinfo
|
|
36
|
+
next-env.d.ts
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { NextRequest, NextResponse } from "next/server";
|
|
2
|
+
import { prisma } from "@/lib/prisma";
|
|
3
|
+
import { createUserSchema } from "@/lib/validations";
|
|
4
|
+
import { z } from "zod";
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* GET /api/example
|
|
8
|
+
* Returns a simple greeting message
|
|
9
|
+
*/
|
|
10
|
+
export async function GET() {
|
|
11
|
+
try {
|
|
12
|
+
// Example: Fetch users from database
|
|
13
|
+
const users = await prisma.user.findMany({
|
|
14
|
+
take: 10,
|
|
15
|
+
orderBy: { createdAt: "desc" },
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
return NextResponse.json({
|
|
19
|
+
message: "Hello from Next.js API!",
|
|
20
|
+
users,
|
|
21
|
+
});
|
|
22
|
+
} catch (error) {
|
|
23
|
+
console.error("Error fetching users:", error);
|
|
24
|
+
return NextResponse.json(
|
|
25
|
+
{ error: "Failed to fetch users" },
|
|
26
|
+
{ status: 500 }
|
|
27
|
+
);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* POST /api/example
|
|
33
|
+
* Creates a new user
|
|
34
|
+
*/
|
|
35
|
+
export async function POST(request: NextRequest) {
|
|
36
|
+
try {
|
|
37
|
+
const body = await request.json();
|
|
38
|
+
|
|
39
|
+
// Validate request body
|
|
40
|
+
const validatedData = createUserSchema.parse(body);
|
|
41
|
+
|
|
42
|
+
// Create user in database
|
|
43
|
+
const user = await prisma.user.create({
|
|
44
|
+
data: {
|
|
45
|
+
name: validatedData.name,
|
|
46
|
+
email: validatedData.email,
|
|
47
|
+
},
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
return NextResponse.json(user, { status: 201 });
|
|
51
|
+
} catch (error) {
|
|
52
|
+
if (error instanceof z.ZodError) {
|
|
53
|
+
return NextResponse.json(
|
|
54
|
+
{ error: "Validation failed", details: error.issues },
|
|
55
|
+
{ status: 400 }
|
|
56
|
+
);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
console.error("Error creating user:", error);
|
|
60
|
+
return NextResponse.json(
|
|
61
|
+
{ error: "Failed to create user" },
|
|
62
|
+
{ status: 500 }
|
|
63
|
+
);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
@tailwind base;
|
|
2
|
+
@tailwind components;
|
|
3
|
+
@tailwind utilities;
|
|
4
|
+
|
|
5
|
+
:root {
|
|
6
|
+
--background: #ffffff;
|
|
7
|
+
--foreground: #171717;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
@media (prefers-color-scheme: dark) {
|
|
11
|
+
:root {
|
|
12
|
+
--background: #0a0a0a;
|
|
13
|
+
--foreground: #ededed;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
body {
|
|
18
|
+
color: var(--foreground);
|
|
19
|
+
background: var(--background);
|
|
20
|
+
font-family: Arial, Helvetica, sans-serif;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
@layer utilities {
|
|
24
|
+
.text-balance {
|
|
25
|
+
text-wrap: balance;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { Metadata } from "next";
|
|
2
|
+
import "./globals.css";
|
|
3
|
+
|
|
4
|
+
export const metadata: Metadata = {
|
|
5
|
+
title: "Full-Stack Next.js App",
|
|
6
|
+
description: "A simple full-stack Next.js application with Prisma and Zod",
|
|
7
|
+
icons: [{ rel: "icon", url: "/favicon.ico" }],
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
export default function RootLayout({
|
|
11
|
+
children,
|
|
12
|
+
}: Readonly<{
|
|
13
|
+
children: React.ReactNode;
|
|
14
|
+
}>) {
|
|
15
|
+
return (
|
|
16
|
+
<html lang="en">
|
|
17
|
+
<body>{children}</body>
|
|
18
|
+
</html>
|
|
19
|
+
);
|
|
20
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import Link from "next/link";
|
|
2
|
+
import ExampleComponent from "@/components/example-component";
|
|
3
|
+
|
|
4
|
+
export default function Home() {
|
|
5
|
+
return (
|
|
6
|
+
<main className="flex min-h-screen flex-col items-center justify-center bg-gradient-to-b from-[#2e026d] to-[#15162c] text-white">
|
|
7
|
+
<div className="container flex flex-col items-center justify-center gap-12 px-4 py-16">
|
|
8
|
+
<h1 className="text-5xl font-extrabold tracking-tight sm:text-[5rem]">
|
|
9
|
+
Full-Stack <span className="text-[hsl(280,100%,70%)]">Next.js</span>
|
|
10
|
+
</h1>
|
|
11
|
+
<div className="grid grid-cols-1 gap-4 sm:grid-cols-2 md:gap-8">
|
|
12
|
+
<Link
|
|
13
|
+
href="/api/example"
|
|
14
|
+
className="flex max-w-xs flex-col gap-4 rounded-xl bg-white/10 p-4 hover:bg-white/20"
|
|
15
|
+
>
|
|
16
|
+
<h3 className="text-2xl font-bold">API Routes →</h3>
|
|
17
|
+
<div className="text-lg">
|
|
18
|
+
Check out the example API route at /api/example
|
|
19
|
+
</div>
|
|
20
|
+
</Link>
|
|
21
|
+
<div className="flex max-w-xs flex-col gap-4 rounded-xl bg-white/10 p-4">
|
|
22
|
+
<h3 className="text-2xl font-bold">Database →</h3>
|
|
23
|
+
<div className="text-lg">
|
|
24
|
+
Prisma ORM with PostgreSQL for type-safe database queries
|
|
25
|
+
</div>
|
|
26
|
+
</div>
|
|
27
|
+
</div>
|
|
28
|
+
<ExampleComponent />
|
|
29
|
+
</div>
|
|
30
|
+
</main>
|
|
31
|
+
);
|
|
32
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import { useState } from "react";
|
|
4
|
+
|
|
5
|
+
export default function ExampleComponent() {
|
|
6
|
+
const [count, setCount] = useState(0);
|
|
7
|
+
|
|
8
|
+
return (
|
|
9
|
+
<div className="flex flex-col items-center gap-4 rounded-xl bg-white/10 p-6">
|
|
10
|
+
<h3 className="text-2xl font-bold">Client Component Example</h3>
|
|
11
|
+
<p className="text-lg">Count: {count}</p>
|
|
12
|
+
<button
|
|
13
|
+
onClick={() => setCount(count + 1)}
|
|
14
|
+
className="rounded-lg bg-white/20 px-6 py-2 font-semibold transition hover:bg-white/30"
|
|
15
|
+
>
|
|
16
|
+
Increment
|
|
17
|
+
</button>
|
|
18
|
+
</div>
|
|
19
|
+
);
|
|
20
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { PrismaClient } from "@prisma/client";
|
|
2
|
+
|
|
3
|
+
const createPrismaClient = () =>
|
|
4
|
+
new PrismaClient({
|
|
5
|
+
log:
|
|
6
|
+
process.env.NODE_ENV === "development"
|
|
7
|
+
? ["query", "error", "warn"]
|
|
8
|
+
: ["error"],
|
|
9
|
+
});
|
|
10
|
+
|
|
11
|
+
const globalForPrisma = globalThis as unknown as {
|
|
12
|
+
prisma: ReturnType<typeof createPrismaClient> | undefined;
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
export const prisma = globalForPrisma.prisma ?? createPrismaClient();
|
|
16
|
+
|
|
17
|
+
if (process.env.NODE_ENV !== "production") globalForPrisma.prisma = prisma;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { clsx, type ClassValue } from "clsx";
|
|
2
|
+
import { twMerge } from "tailwind-merge";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Utility function to merge Tailwind CSS classes
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* cn("px-2 py-1", "bg-blue-500") // "px-2 py-1 bg-blue-500"
|
|
9
|
+
* cn("px-2", condition && "py-1") // "px-2 py-1" or "px-2"
|
|
10
|
+
*/
|
|
11
|
+
export function cn(...inputs: ClassValue[]) {
|
|
12
|
+
return twMerge(clsx(inputs));
|
|
13
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Validation schema for creating a new user
|
|
5
|
+
*/
|
|
6
|
+
export const createUserSchema = z.object({
|
|
7
|
+
name: z.string().min(1, "Name is required").max(100),
|
|
8
|
+
email: z.string().email("Invalid email address"),
|
|
9
|
+
});
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Validation schema for updating a user
|
|
13
|
+
*/
|
|
14
|
+
export const updateUserSchema = z.object({
|
|
15
|
+
name: z.string().min(1).max(100).optional(),
|
|
16
|
+
email: z.string().email().optional(),
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
export type CreateUserInput = z.infer<typeof createUserSchema>;
|
|
20
|
+
export type UpdateUserInput = z.infer<typeof updateUserSchema>;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "{project_name}",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "{project_description}",
|
|
5
|
+
"private": true,
|
|
6
|
+
"type": "module",
|
|
7
|
+
"scripts": {
|
|
8
|
+
"dev": "next dev",
|
|
9
|
+
"build": "next build",
|
|
10
|
+
"start": "next start",
|
|
11
|
+
"lint": "next lint",
|
|
12
|
+
"type-check": "tsc --noEmit"
|
|
13
|
+
},
|
|
14
|
+
"dependencies": {
|
|
15
|
+
"next": "16.0.1",
|
|
16
|
+
"react": "19.2.0",
|
|
17
|
+
"react-dom": "19.2.0",
|
|
18
|
+
"prisma": "6.19.0",
|
|
19
|
+
"@prisma/client": "6.19.0",
|
|
20
|
+
"zod": "4.1.12",
|
|
21
|
+
"tailwindcss": "4.1.17",
|
|
22
|
+
"@tailwindcss/postcss": "4.1.17",
|
|
23
|
+
"clsx": "2.1.1",
|
|
24
|
+
"tailwind-merge": "3.3.1"
|
|
25
|
+
},
|
|
26
|
+
"devDependencies": {
|
|
27
|
+
"typescript": "5.9.3",
|
|
28
|
+
"@types/node": "20.19.24",
|
|
29
|
+
"@types/react": "19.2.2",
|
|
30
|
+
"@types/react-dom": "19.2.2"
|
|
31
|
+
}
|
|
32
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
// This is your Prisma schema file,
|
|
2
|
+
// learn more about it in the docs: https://pris.ly/d/prisma-schema
|
|
3
|
+
|
|
4
|
+
generator client {
|
|
5
|
+
provider = "prisma-client-js"
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
datasource db {
|
|
9
|
+
provider = "postgresql"
|
|
10
|
+
url = env("DATABASE_URL")
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
model User {
|
|
14
|
+
id Int @id @default(autoincrement())
|
|
15
|
+
name String
|
|
16
|
+
email String @unique
|
|
17
|
+
createdAt DateTime @default(now())
|
|
18
|
+
updatedAt DateTime @updatedAt
|
|
19
|
+
|
|
20
|
+
@@index([email])
|
|
21
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { Config } from "tailwindcss";
|
|
2
|
+
|
|
3
|
+
const config: Config = {
|
|
4
|
+
content: [
|
|
5
|
+
"./app/**/*.{js,ts,jsx,tsx,mdx}",
|
|
6
|
+
"./components/**/*.{js,ts,jsx,tsx,mdx}",
|
|
7
|
+
],
|
|
8
|
+
theme: {
|
|
9
|
+
extend: {
|
|
10
|
+
colors: {
|
|
11
|
+
background: "var(--background)",
|
|
12
|
+
foreground: "var(--foreground)",
|
|
13
|
+
},
|
|
14
|
+
},
|
|
15
|
+
},
|
|
16
|
+
plugins: [],
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
export default config;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"target": "ES2017",
|
|
4
|
+
"lib": ["dom", "dom.iterable", "esnext"],
|
|
5
|
+
"allowJs": true,
|
|
6
|
+
"skipLibCheck": true,
|
|
7
|
+
"strict": true,
|
|
8
|
+
"noEmit": true,
|
|
9
|
+
"esModuleInterop": true,
|
|
10
|
+
"module": "esnext",
|
|
11
|
+
"moduleResolution": "bundler",
|
|
12
|
+
"resolveJsonModule": true,
|
|
13
|
+
"isolatedModules": true,
|
|
14
|
+
"jsx": "preserve",
|
|
15
|
+
"incremental": true,
|
|
16
|
+
"plugins": [
|
|
17
|
+
{
|
|
18
|
+
"name": "next"
|
|
19
|
+
}
|
|
20
|
+
],
|
|
21
|
+
"paths": {
|
|
22
|
+
"@/*": ["./*"]
|
|
23
|
+
}
|
|
24
|
+
},
|
|
25
|
+
"include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],
|
|
26
|
+
"exclude": ["node_modules"]
|
|
27
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
# syntax=docker/dockerfile:1
|
|
2
|
+
|
|
3
|
+
# Base image
|
|
4
|
+
FROM node:20-alpine AS base
|
|
5
|
+
|
|
6
|
+
# Install dependencies only when needed
|
|
7
|
+
FROM base AS deps
|
|
8
|
+
RUN apk add --no-cache libc6-compat
|
|
9
|
+
WORKDIR /app
|
|
10
|
+
|
|
11
|
+
# Install dependencies based on the preferred package manager
|
|
12
|
+
COPY package.json package-lock.json* ./
|
|
13
|
+
RUN npm ci
|
|
14
|
+
|
|
15
|
+
# Rebuild the source code only when needed
|
|
16
|
+
FROM base AS builder
|
|
17
|
+
WORKDIR /app
|
|
18
|
+
COPY --from=deps /app/node_modules ./node_modules
|
|
19
|
+
COPY . .
|
|
20
|
+
|
|
21
|
+
# Generate Prisma Client
|
|
22
|
+
RUN npx prisma generate
|
|
23
|
+
|
|
24
|
+
# Next.js collects completely anonymous telemetry data about general usage.
|
|
25
|
+
# Learn more here: https://nextjs.org/telemetry
|
|
26
|
+
# Uncomment the following line in case you want to disable telemetry during the build.
|
|
27
|
+
# ENV NEXT_TELEMETRY_DISABLED 1
|
|
28
|
+
|
|
29
|
+
RUN npm run build
|
|
30
|
+
|
|
31
|
+
# Production image, copy all the files and run next
|
|
32
|
+
FROM base AS runner
|
|
33
|
+
WORKDIR /app
|
|
34
|
+
|
|
35
|
+
ENV NODE_ENV production
|
|
36
|
+
# Uncomment the following line in case you want to disable telemetry during runtime.
|
|
37
|
+
# ENV NEXT_TELEMETRY_DISABLED 1
|
|
38
|
+
|
|
39
|
+
RUN addgroup --system --gid 1001 nodejs
|
|
40
|
+
RUN adduser --system --uid 1001 nextjs
|
|
41
|
+
|
|
42
|
+
# Copy necessary files
|
|
43
|
+
COPY --from=builder /app/public ./public
|
|
44
|
+
COPY --from=builder /app/package.json ./package.json
|
|
45
|
+
|
|
46
|
+
# Automatically leverage output traces to reduce image size
|
|
47
|
+
# https://nextjs.org/docs/advanced-features/output-file-tracing
|
|
48
|
+
COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./
|
|
49
|
+
COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static
|
|
50
|
+
|
|
51
|
+
USER nextjs
|
|
52
|
+
|
|
53
|
+
EXPOSE 3000
|
|
54
|
+
|
|
55
|
+
ENV PORT 3000
|
|
56
|
+
ENV HOSTNAME "0.0.0.0"
|
|
57
|
+
|
|
58
|
+
# server.js is created by next build from the standalone output
|
|
59
|
+
# https://nextjs.org/docs/pages/api-reference/next-config-js/output
|
|
60
|
+
CMD ["node", "server.js"]
|