From a0a059472bf3e3d062cb603d1aeccf4d02dc8ad9 Mon Sep 17 00:00:00 2001 From: Ryan Kegel Date: Wed, 21 Jan 2026 17:18:58 -0500 Subject: [PATCH] Moved things around --- .github/copilot-instructions.md | 30 ++++++------ .vscode/extensions.json | 9 ++++ .vscode/launch.json | 44 ++++++++++++++++++ .vscode/settings.json | 20 ++++++++ .dockerignore => backend/.dockerignore | 0 .gitignore => backend/.gitignore | 4 ++ Dockerfile => backend/Dockerfile | 0 Jenkinsfile => backend/Jenkinsfile | 0 .../Jenkinsfile-Promoter | 0 {api => backend/api}/auth_api.py | 0 {api => backend/api}/child_api.py | 0 {api => backend/api}/child_rewards.py | 0 {api => backend/api}/child_tasks.py | 0 {api => backend/api}/error_codes.py | 0 {api => backend/api}/image_api.py | 0 {api => backend/api}/pending_reward.py | 0 {api => backend/api}/reward_api.py | 0 {api => backend/api}/reward_status.py | 0 {api => backend/api}/task_api.py | 0 {api => backend/api}/user_api.py | 0 {api => backend/api}/utils.py | 0 {config => backend/config}/paths.py | 0 {config => backend/config}/version.py | 0 {db => backend/db}/db.py | 0 {db => backend/db}/debug.py | 0 {db => backend/db}/default.py | 0 {events => backend/events}/broadcaster.py | 0 {events => backend/events}/sse.py | 0 .../events}/types/child_modified.py | 0 .../events}/types/child_reward_request.py | 0 .../events}/types/child_reward_triggered.py | 0 .../events}/types/child_rewards_set.py | 0 .../events}/types/child_task_triggered.py | 0 .../events}/types/child_tasks_set.py | 0 {events => backend/events}/types/event.py | 0 .../events}/types/event_types.py | 0 {events => backend/events}/types/payload.py | 0 .../events}/types/reward_modified.py | 0 .../events}/types/task_modified.py | 0 main.py => backend/main.py | 0 {models => backend/models}/base.py | 0 {models => backend/models}/child.py | 0 {models => backend/models}/image.py | 0 {models => backend/models}/pending_reward.py | 0 {models => backend/models}/reward.py | 0 {models => backend/models}/task.py | 0 {models => backend/models}/user.py | 0 backend/package-lock.json | 6 +++ requirements.txt => backend/requirements.txt | Bin .../resources}/images/boy01.png | Bin .../resources}/images/boy02.png | Bin .../resources}/images/boy03.png | Bin .../resources}/images/boy04.png | Bin .../resources}/images/broom.png | Bin .../resources}/images/candy.png | Bin .../resources}/images/computer-game.png | Bin .../resources}/images/fighting.png | Bin .../resources}/images/games-with-dad.png | Bin .../resources}/images/girl01.png | Bin .../resources}/images/girl02.png | Bin .../resources}/images/girl03.png | Bin .../resources}/images/girl04.png | Bin .../resources}/images/good.png | Bin .../resources}/images/homework.png | Bin .../resources}/images/ice-cream.png | Bin .../resources}/images/ignore.png | Bin .../resources}/images/lying.png | Bin .../resources}/images/make-the-bed.png | Bin .../resources}/images/meal.png | Bin .../resources}/images/money.png | Bin .../resources}/images/playground.png | Bin .../resources}/images/tablet.png | Bin .../resources}/images/toilet.png | Bin .../resources}/images/trash-can.png | Bin .../resources}/images/tv.png | Bin .../resources}/images/vacuum.png | Bin .../resources}/images/yelling.png | Bin {tests => backend/tests}/conftest.py | 0 {tests => backend/tests}/test_child_api.py | 0 {tests => backend/tests}/test_image_api.py | 0 {tests => backend/tests}/test_reward_api.py | 0 {tests => backend/tests}/test_task_api.py | 0 {web => frontend}/vue-app/.dockerignore | 0 {web => frontend}/vue-app/.editorconfig | 0 {web => frontend}/vue-app/.gitattributes | 0 {web => frontend}/vue-app/.gitignore | 0 {web => frontend}/vue-app/.prettierrc.json | 0 .../vue-app/192.168.1.102+1-key.pem | 0 {web => frontend}/vue-app/192.168.1.102+1.pem | 0 {web => frontend}/vue-app/Dockerfile | 0 {web => frontend}/vue-app/README.md | 0 {web => frontend}/vue-app/env.d.ts | 0 {web => frontend}/vue-app/eslint.config.ts | 0 {web => frontend}/vue-app/index.html | 0 {web => frontend}/vue-app/nginx.conf | 0 {web => frontend}/vue-app/package-lock.json | 4 +- {web => frontend}/vue-app/package.json | 0 {web => frontend}/vue-app/public/favicon.ico | Bin {web => frontend}/vue-app/src/App.vue | 0 .../vue-app/src/__tests__/App.spec.ts | 0 .../vue-app/src/assets/actions-shared.css | 0 .../vue-app/src/assets/button-shared.css | 0 .../vue-app/src/assets/child-list-shared.css | 0 .../vue-app/src/assets/common.css | 0 .../vue-app/src/assets/edit-forms.css | 0 .../vue-app/src/assets/global.css | 0 .../vue-app/src/assets/layout-shared.css | 0 .../vue-app/src/assets/modal.css | 0 .../vue-app/src/assets/scroll.css | 0 .../vue-app/src/assets/view-shared.css | 0 {web => frontend}/vue-app/src/common/api.ts | 0 .../vue-app/src/common/backendEvents.ts | 0 .../vue-app/src/common/errorCodes.ts | 0 .../vue-app/src/common/eventBus.ts | 0 .../vue-app/src/common/imageCache.ts | 0 .../vue-app/src/common/models.ts | 0 .../src/components/BackendEventsListener.vue | 0 .../src/components/auth/AuthLanding.vue | 0 .../src/components/auth/ForgotPassword.vue | 0 .../vue-app/src/components/auth/Login.vue | 0 .../src/components/auth/ResetPassword.vue | 0 .../vue-app/src/components/auth/Signup.vue | 0 .../src/components/auth/VerifySignup.vue | 0 .../src/components/child/ChildDetailCard.vue | 0 .../src/components/child/ChildEditView.vue | 0 .../src/components/child/ChildView.vue | 0 .../src/components/child/ParentView.vue | 0 .../src/components/child/RewardAssignView.vue | 0 .../src/components/child/TaskAssignView.vue | 0 .../notification/NotificationView.vue | 0 .../src/components/profile/UserProfile.vue | 0 .../src/components/reward/ChildRewardList.vue | 0 .../src/components/reward/RewardEditView.vue | 0 .../src/components/reward/RewardView.vue | 0 .../components/shared/ChildrenListView.vue | 0 .../src/components/shared/DeleteModal.vue | 0 .../src/components/shared/ErrorMessage.vue | 0 .../shared/FloatingActionButton.vue | 0 .../src/components/shared/ItemList.vue | 0 .../src/components/shared/LoginButton.vue | 0 .../src/components/shared/MessageBlock.vue | 0 .../src/components/shared/ModalDialog.vue | 0 .../src/components/shared/ScrollingList.vue | 0 .../src/components/shared/SuccessMessage.vue | 0 .../src/components/task/ChildTaskList.vue | 0 .../src/components/task/TaskEditView.vue | 0 .../vue-app/src/components/task/TaskView.vue | 0 .../src/components/utils/ImagePicker.vue | 0 .../vue-app/src/layout/AuthLayout.vue | 0 .../vue-app/src/layout/ChildLayout.vue | 0 .../vue-app/src/layout/ParentLayout.vue | 0 {web => frontend}/vue-app/src/main.ts | 0 {web => frontend}/vue-app/src/router/index.ts | 0 {web => frontend}/vue-app/src/stores/auth.ts | 0 {web => frontend}/vue-app/tsconfig.app.json | 0 {web => frontend}/vue-app/tsconfig.json | 0 {web => frontend}/vue-app/tsconfig.node.json | 0 .../vue-app/tsconfig.vitest.json | 0 {web => frontend}/vue-app/vite.config.ts | 0 {web => frontend}/vue-app/vitest.config.ts | 0 160 files changed, 100 insertions(+), 17 deletions(-) create mode 100644 .vscode/extensions.json create mode 100644 .vscode/launch.json create mode 100644 .vscode/settings.json rename .dockerignore => backend/.dockerignore (100%) rename .gitignore => backend/.gitignore (94%) rename Dockerfile => backend/Dockerfile (100%) rename Jenkinsfile => backend/Jenkinsfile (100%) rename Jenkinsfile-Promoter => backend/Jenkinsfile-Promoter (100%) rename {api => backend/api}/auth_api.py (100%) rename {api => backend/api}/child_api.py (100%) rename {api => backend/api}/child_rewards.py (100%) rename {api => backend/api}/child_tasks.py (100%) rename {api => backend/api}/error_codes.py (100%) rename {api => backend/api}/image_api.py (100%) rename {api => backend/api}/pending_reward.py (100%) rename {api => backend/api}/reward_api.py (100%) rename {api => backend/api}/reward_status.py (100%) rename {api => backend/api}/task_api.py (100%) rename {api => backend/api}/user_api.py (100%) rename {api => backend/api}/utils.py (100%) rename {config => backend/config}/paths.py (100%) rename {config => backend/config}/version.py (100%) rename {db => backend/db}/db.py (100%) rename {db => backend/db}/debug.py (100%) rename {db => backend/db}/default.py (100%) rename {events => backend/events}/broadcaster.py (100%) rename {events => backend/events}/sse.py (100%) rename {events => backend/events}/types/child_modified.py (100%) rename {events => backend/events}/types/child_reward_request.py (100%) rename {events => backend/events}/types/child_reward_triggered.py (100%) rename {events => backend/events}/types/child_rewards_set.py (100%) rename {events => backend/events}/types/child_task_triggered.py (100%) rename {events => backend/events}/types/child_tasks_set.py (100%) rename {events => backend/events}/types/event.py (100%) rename {events => backend/events}/types/event_types.py (100%) rename {events => backend/events}/types/payload.py (100%) rename {events => backend/events}/types/reward_modified.py (100%) rename {events => backend/events}/types/task_modified.py (100%) rename main.py => backend/main.py (100%) rename {models => backend/models}/base.py (100%) rename {models => backend/models}/child.py (100%) rename {models => backend/models}/image.py (100%) rename {models => backend/models}/pending_reward.py (100%) rename {models => backend/models}/reward.py (100%) rename {models => backend/models}/task.py (100%) rename {models => backend/models}/user.py (100%) create mode 100644 backend/package-lock.json rename requirements.txt => backend/requirements.txt (100%) rename {resources => backend/resources}/images/boy01.png (100%) rename {resources => backend/resources}/images/boy02.png (100%) rename {resources => backend/resources}/images/boy03.png (100%) rename {resources => backend/resources}/images/boy04.png (100%) rename {resources => backend/resources}/images/broom.png (100%) rename {resources => backend/resources}/images/candy.png (100%) rename {resources => backend/resources}/images/computer-game.png (100%) rename {resources => backend/resources}/images/fighting.png (100%) rename {resources => backend/resources}/images/games-with-dad.png (100%) rename {resources => backend/resources}/images/girl01.png (100%) rename {resources => backend/resources}/images/girl02.png (100%) rename {resources => backend/resources}/images/girl03.png (100%) rename {resources => backend/resources}/images/girl04.png (100%) rename {resources => backend/resources}/images/good.png (100%) rename {resources => backend/resources}/images/homework.png (100%) rename {resources => backend/resources}/images/ice-cream.png (100%) rename {resources => backend/resources}/images/ignore.png (100%) rename {resources => backend/resources}/images/lying.png (100%) rename {resources => backend/resources}/images/make-the-bed.png (100%) rename {resources => backend/resources}/images/meal.png (100%) rename {resources => backend/resources}/images/money.png (100%) rename {resources => backend/resources}/images/playground.png (100%) rename {resources => backend/resources}/images/tablet.png (100%) rename {resources => backend/resources}/images/toilet.png (100%) rename {resources => backend/resources}/images/trash-can.png (100%) rename {resources => backend/resources}/images/tv.png (100%) rename {resources => backend/resources}/images/vacuum.png (100%) rename {resources => backend/resources}/images/yelling.png (100%) rename {tests => backend/tests}/conftest.py (100%) rename {tests => backend/tests}/test_child_api.py (100%) rename {tests => backend/tests}/test_image_api.py (100%) rename {tests => backend/tests}/test_reward_api.py (100%) rename {tests => backend/tests}/test_task_api.py (100%) rename {web => frontend}/vue-app/.dockerignore (100%) rename {web => frontend}/vue-app/.editorconfig (100%) rename {web => frontend}/vue-app/.gitattributes (100%) rename {web => frontend}/vue-app/.gitignore (100%) rename {web => frontend}/vue-app/.prettierrc.json (100%) rename {web => frontend}/vue-app/192.168.1.102+1-key.pem (100%) rename {web => frontend}/vue-app/192.168.1.102+1.pem (100%) rename {web => frontend}/vue-app/Dockerfile (100%) rename {web => frontend}/vue-app/README.md (100%) rename {web => frontend}/vue-app/env.d.ts (100%) rename {web => frontend}/vue-app/eslint.config.ts (100%) rename {web => frontend}/vue-app/index.html (100%) rename {web => frontend}/vue-app/nginx.conf (100%) rename {web => frontend}/vue-app/package-lock.json (99%) rename {web => frontend}/vue-app/package.json (100%) rename {web => frontend}/vue-app/public/favicon.ico (100%) rename {web => frontend}/vue-app/src/App.vue (100%) rename {web => frontend}/vue-app/src/__tests__/App.spec.ts (100%) rename {web => frontend}/vue-app/src/assets/actions-shared.css (100%) rename {web => frontend}/vue-app/src/assets/button-shared.css (100%) rename {web => frontend}/vue-app/src/assets/child-list-shared.css (100%) rename {web => frontend}/vue-app/src/assets/common.css (100%) rename {web => frontend}/vue-app/src/assets/edit-forms.css (100%) rename {web => frontend}/vue-app/src/assets/global.css (100%) rename {web => frontend}/vue-app/src/assets/layout-shared.css (100%) rename {web => frontend}/vue-app/src/assets/modal.css (100%) rename {web => frontend}/vue-app/src/assets/scroll.css (100%) rename {web => frontend}/vue-app/src/assets/view-shared.css (100%) rename {web => frontend}/vue-app/src/common/api.ts (100%) rename {web => frontend}/vue-app/src/common/backendEvents.ts (100%) rename {web => frontend}/vue-app/src/common/errorCodes.ts (100%) rename {web => frontend}/vue-app/src/common/eventBus.ts (100%) rename {web => frontend}/vue-app/src/common/imageCache.ts (100%) rename {web => frontend}/vue-app/src/common/models.ts (100%) rename {web => frontend}/vue-app/src/components/BackendEventsListener.vue (100%) rename {web => frontend}/vue-app/src/components/auth/AuthLanding.vue (100%) rename {web => frontend}/vue-app/src/components/auth/ForgotPassword.vue (100%) rename {web => frontend}/vue-app/src/components/auth/Login.vue (100%) rename {web => frontend}/vue-app/src/components/auth/ResetPassword.vue (100%) rename {web => frontend}/vue-app/src/components/auth/Signup.vue (100%) rename {web => frontend}/vue-app/src/components/auth/VerifySignup.vue (100%) rename {web => frontend}/vue-app/src/components/child/ChildDetailCard.vue (100%) rename {web => frontend}/vue-app/src/components/child/ChildEditView.vue (100%) rename {web => frontend}/vue-app/src/components/child/ChildView.vue (100%) rename {web => frontend}/vue-app/src/components/child/ParentView.vue (100%) rename {web => frontend}/vue-app/src/components/child/RewardAssignView.vue (100%) rename {web => frontend}/vue-app/src/components/child/TaskAssignView.vue (100%) rename {web => frontend}/vue-app/src/components/notification/NotificationView.vue (100%) rename {web => frontend}/vue-app/src/components/profile/UserProfile.vue (100%) rename {web => frontend}/vue-app/src/components/reward/ChildRewardList.vue (100%) rename {web => frontend}/vue-app/src/components/reward/RewardEditView.vue (100%) rename {web => frontend}/vue-app/src/components/reward/RewardView.vue (100%) rename {web => frontend}/vue-app/src/components/shared/ChildrenListView.vue (100%) rename {web => frontend}/vue-app/src/components/shared/DeleteModal.vue (100%) rename {web => frontend}/vue-app/src/components/shared/ErrorMessage.vue (100%) rename {web => frontend}/vue-app/src/components/shared/FloatingActionButton.vue (100%) rename {web => frontend}/vue-app/src/components/shared/ItemList.vue (100%) rename {web => frontend}/vue-app/src/components/shared/LoginButton.vue (100%) rename {web => frontend}/vue-app/src/components/shared/MessageBlock.vue (100%) rename {web => frontend}/vue-app/src/components/shared/ModalDialog.vue (100%) rename {web => frontend}/vue-app/src/components/shared/ScrollingList.vue (100%) rename {web => frontend}/vue-app/src/components/shared/SuccessMessage.vue (100%) rename {web => frontend}/vue-app/src/components/task/ChildTaskList.vue (100%) rename {web => frontend}/vue-app/src/components/task/TaskEditView.vue (100%) rename {web => frontend}/vue-app/src/components/task/TaskView.vue (100%) rename {web => frontend}/vue-app/src/components/utils/ImagePicker.vue (100%) rename {web => frontend}/vue-app/src/layout/AuthLayout.vue (100%) rename {web => frontend}/vue-app/src/layout/ChildLayout.vue (100%) rename {web => frontend}/vue-app/src/layout/ParentLayout.vue (100%) rename {web => frontend}/vue-app/src/main.ts (100%) rename {web => frontend}/vue-app/src/router/index.ts (100%) rename {web => frontend}/vue-app/src/stores/auth.ts (100%) rename {web => frontend}/vue-app/tsconfig.app.json (100%) rename {web => frontend}/vue-app/tsconfig.json (100%) rename {web => frontend}/vue-app/tsconfig.node.json (100%) rename {web => frontend}/vue-app/tsconfig.vitest.json (100%) rename {web => frontend}/vue-app/vite.config.ts (100%) rename {web => frontend}/vue-app/vitest.config.ts (100%) diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md index 7871a5c..01514f4 100644 --- a/.github/copilot-instructions.md +++ b/.github/copilot-instructions.md @@ -4,9 +4,9 @@ - **Stack**: Flask (Python, backend) + Vue 3 (TypeScript, frontend) + TinyDB (JSON, thread-safe, see `db/`). - **API**: RESTful endpoints in `api/`, grouped by entity (child, reward, task, user, image, etc). Each API file maps to a business domain. -- **Models**: Maintain strict 1:1 mapping between Python `@dataclass`es (`models/`) and TypeScript interfaces (`web/vue-app/src/common/models.ts`). +- **Models**: Maintain strict 1:1 mapping between Python `@dataclass`es (`backend/models/`) and TypeScript interfaces (`frontend/vue-app/src/common/models.ts`). - **Database**: Use TinyDB with `from_dict()`/`to_dict()` for serialization. All logic should operate on model instances, not raw dicts. -- **Events**: Real-time updates via Server-Sent Events (SSE). Every mutation (add/edit/delete/trigger) must call `send_event_for_current_user` (see `events/`). +- **Events**: Real-time updates via Server-Sent Events (SSE). Every mutation (add/edit/delete/trigger) must call `send_event_for_current_user` (see `backend/events/`). - **Changes**: Do not use comments to replace code. All changes must be reflected in both backend and frontend files as needed. ## 🧩 Key Patterns & Conventions @@ -14,13 +14,13 @@ - **Frontend Styling**: Use only `:root` CSS variables from `global.css` for all colors, spacing, and tokens. Example: `--btn-primary`, `--list-item-bg-good`. - **Scoped Styles**: All `.vue` files must use `