diff --git a/.cursor/rules/core/base_context.mdc b/.cursor/rules/core/base_context.mdc index a1ad4bce..337aba78 100644 --- a/.cursor/rules/core/base_context.mdc +++ b/.cursor/rules/core/base_context.mdc @@ -21,7 +21,7 @@ alwaysApply: false ## Purpose -All interactions must *increase the human's competence over time* while +All interactions must _increase the human's competence over time_ while completing the task efficiently. The model may handle menial work and memory extension, but must also promote learning, autonomy, and healthy work habits. The model should also **encourage human interaction and collaboration** rather @@ -31,7 +31,7 @@ machine-driven steps. ## Principles -1. Competence over convenience: finish the task *and* leave the human more +1. Competence over convenience: finish the task _and_ leave the human more capable next time. @@ -75,7 +75,7 @@ assumptions if unanswered. ### timebox_minutes -*integer or null* — When set to a positive integer (e.g., `5`), this acts +_integer or null_ — When set to a positive integer (e.g., `5`), this acts as a **time budget** guiding the model to prioritize delivering the most essential parts of the task within that constraint. @@ -91,7 +91,7 @@ Behavior when set: 3. **Signal Skipped Depth** — Omitted details should be listed under - *Deferred for depth*. + _Deferred for depth_. 4. **Order by Value** — Start with blocking or high-value items, then @@ -198,7 +198,7 @@ Default: Doer + short Mentor notes. ## Self-Check (model, before responding) -- [ ] Task done *and* at least one competence lever included (≤120 words +- [ ] Task done _and_ at least one competence lever included (≤120 words total) - [ ] At least one collaboration/discussion hook present - [ ] Output follows the **Output Contract** sections diff --git a/.cursor/rules/core/harbor_pilot_universal.mdc b/.cursor/rules/core/harbor_pilot_universal.mdc index 4f1da0f4..7c8e21e7 100644 --- a/.cursor/rules/core/harbor_pilot_universal.mdc +++ b/.cursor/rules/core/harbor_pilot_universal.mdc @@ -53,7 +53,7 @@ evidence-backed steps**. - **Verifiable Outputs**: Include expected results, status codes, or error messages -- **Cite evidence** for *Works/Doesn't* items (timestamps, filenames, +- **Cite evidence** for _Works/Doesn't_ items (timestamps, filenames, line numbers, IDs/status codes, or logs). ## Required Sections @@ -181,8 +181,8 @@ Before publishing, verify: --- -**Status**: 🚢 ACTIVE — General ruleset extending *Base Context — Human -Competence First* +**Status**: 🚢 ACTIVE — General ruleset extending _Base Context — Human +Competence First_ **Priority**: Critical **Estimated Effort**: Ongoing reference diff --git a/.cursor/rules/core/less_complex.mdc b/.cursor/rules/core/less_complex.mdc index 6c5ca71d..e4b0c063 100644 --- a/.cursor/rules/core/less_complex.mdc +++ b/.cursor/rules/core/less_complex.mdc @@ -16,7 +16,7 @@ language: Match repository languages and conventions where it occurs; avoid new layers, indirection, or patterns unless strictly necessary. 2. **Keep scope tight.** Implement only what is needed to satisfy the - acceptance criteria and tests for *this* issue. + acceptance criteria and tests for _this_ issue. 3. **Avoid speculative abstractions.** Use the **Rule of Three**: don't extract helpers/patterns until the third concrete usage proves the shape. @@ -29,7 +29,7 @@ language: Match repository languages and conventions 7. **Targeted tests only.** Add the smallest set of tests that prove the fix and guard against regression; don't rewrite suites. 8. **Document the "why enough."** Include a one-paragraph note - explaining why this minimal solution is sufficient *now*. + explaining why this minimal solution is sufficient _now_. ## Future-Proofing Requires Evidence + Discussion diff --git a/.cursor/rules/development/asset_configuration.mdc b/.cursor/rules/development/asset_configuration.mdc index a53e9ffb..715feb63 100644 --- a/.cursor/rules/development/asset_configuration.mdc +++ b/.cursor/rules/development/asset_configuration.mdc @@ -9,8 +9,8 @@ alwaysApply: false **Date**: 2025-08-19 **Status**: 🎯 **ACTIVE** - Asset management guidelines -*Scope: Assets Only (icons, splashes, image pipelines) — not overall build -orchestration* +_Scope: Assets Only (icons, splashes, image pipelines) — not overall build +orchestration_ ## Intent diff --git a/.cursor/rules/development/time.mdc b/.cursor/rules/development/time.mdc index 9aeb172b..3d2f0335 100644 --- a/.cursor/rules/development/time.mdc +++ b/.cursor/rules/development/time.mdc @@ -40,7 +40,7 @@ feature development, issue investigations, ADRs, and documentation**. `2025-08-17`). -- Avoid ambiguous terms like *recently*, *last month*, or *soon*. +- Avoid ambiguous terms like _recently_, _last month_, or _soon_. - For time-based experiments (e.g., A/B tests), always include: diff --git a/.cursor/rules/development/time_implementation.mdc b/.cursor/rules/development/time_implementation.mdc index f5c2da2a..71d9b990 100644 --- a/.cursor/rules/development/time_implementation.mdc +++ b/.cursor/rules/development/time_implementation.mdc @@ -19,7 +19,7 @@ - Optionally provide UTC alongside if context requires cross-team clarity. -- When interpreting relative terms like *now*, *today*, *last week*: +- When interpreting relative terms like _now_, _today_, _last week_: - Resolve them against the **developer's current time**. diff --git a/.cursor/rules/docs/documentation_references_model_agents.mdc b/.cursor/rules/docs/documentation_references_model_agents.mdc new file mode 100644 index 00000000..107bbeac --- /dev/null +++ b/.cursor/rules/docs/documentation_references_model_agents.mdc @@ -0,0 +1,96 @@ +--- +title: Documentation, References, and Model Agent Use +version: 1.1 +alwaysApply: true +scope: code, project-plans +--- + +# Directive on Documentation, References, and Model Agent Use in Code and Project Plans + +To ensure clarity, efficiency, and high-value documentation within code and project plans—and to leverage **model agents** (AI- or automation-based assistants) effectively—contributors must follow these rules: + +--- + +## 1. Documentation and References Must Add Clear Value + +- Only include documentation, comments, or reference links when they provide _new, meaningful information_ that assists understanding or decision-making. +- Avoid duplicating content already obvious in the codebase, version history, or linked project documents. + +--- + +## 2. Eliminate Redundant or Noisy References + +- Remove references that serve no purpose beyond filling space. +- Model agents may automatically flag and suggest removal of trivial references (e.g., links to unchanged boilerplate or self-evident context). + +--- + +## 3. Explicit Role of Model Agents + +Model agents are **active participants** in documentation quality control. Their tasks include: + +- **Relevance Evaluation**: Automatically analyze references for their substantive contribution before inclusion. +- **Redundancy Detection**: Flag duplicate or trivial references across commits, files, or tasks. +- **Context Linking**: Suggest appropriate higher-level docs (designs, ADRs, meeting notes) when a code change touches multi-stage or cross-team items. +- **Placement Optimization**: Recommend centralization of references (e.g., in plan overviews, ADRs, or merge commit messages) rather than scattered low-value inline references. +- **Consistency Monitoring**: Ensure references align with team standards (e.g., ADR template, architecture repo, or external policy documents). + +Contributors must treat agent recommendations as **first-pass reviews** but remain accountable for final human judgment. + +--- + +## 4. Contextual References for Complex Items + +- Use **centralized references** for multi-stage features (e.g., architectural docs, research threads). +- Keep inline code comments light; push broader context into centralized documents. +- Model agents may auto-summarize complex chains of discussion and attach them as a single reference point. + +--- + +## 5. Centralization of Broader Context + +- Store overarching context (design docs, proposals, workflows) in accessible, well-indexed places. +- Model agents should assist by **generating reference maps** that track where docs are cited across the codebase. + +--- + +## 6. Focused Documentation + +- Documentation should explain **why** and **how** decisions are made, not just what was changed. +- Model agents can auto-generate first-pass explanations from commit metadata, diffs, and linked issues—but humans must refine them for accuracy and intent. + +--- + +## 7. Review and Accountability + +- Reviewers and team leads must reject submissions containing unnecessary or low-quality documentation. +- Model agent outputs are aids, not replacements—contributors remain responsible for **final clarity and relevance**. + +--- + +## 8. Continuous Improvement and Agent Feedback Loops + +- Encourage iterative development of model agents so their evaluations become more precise over time. +- Contributions should include **feedback on agent suggestions** (e.g., accepted, rejected, or corrected) to train better future outputs. +- Agents should log patterns of “rejected” suggestions for refinement. + +--- + +## 9. Workflow Overview (Mermaid Diagram) + +```mermaid +flowchart TD + A[Contributor] -->|Writes Code & Draft Docs| B[Model Agent] + B -->|Evaluates References| C{Relevant?} + C -->|Yes| D[Suggest Placement & Context Links] + C -->|No| E[Flag Redundancy / Noise] + D --> F[Contributor Refines Docs] + E --> F + F --> G[Reviewer] + G -->|Approves / Requests Revisions| H[Final Documentation] + G -->|Feedback on Agent Suggestions| B +``` + +--- + +✅ **Outcome:** By integrating disciplined contributor standards with **model agent augmentation**, the team achieves documentation that is consistently _relevant, concise, centralized, and decision-focused_. AI ensures coverage and noise reduction, while humans ensure precision and judgment. diff --git a/.cursor/rules/docs/markdown_templates.mdc b/.cursor/rules/docs/markdown_templates.mdc index eacb6720..cdc5644a 100644 --- a/.cursor/rules/docs/markdown_templates.mdc +++ b/.cursor/rules/docs/markdown_templates.mdc @@ -192,6 +192,7 @@ Summary of key concepts and skills. Where to apply this knowledge next. ``` + - [ ] Integration tests - [ ] E2E tests diff --git a/.cursor/rules/harbor_pilot_universal.mdc b/.cursor/rules/harbor_pilot_universal.mdc index 91d099f7..effcd818 100644 --- a/.cursor/rules/harbor_pilot_universal.mdc +++ b/.cursor/rules/harbor_pilot_universal.mdc @@ -16,9 +16,10 @@ inherits: base_context.mdc **Author**: System/Shared **Date**: 2025-08-21 (UTC) -**Status**: 🚢 ACTIVE — General ruleset extending *Base Context — Human Competence First* +**Status**: 🚢 ACTIVE — General ruleset extending _Base Context — Human Competence First_ > **Alignment with Base Context** +> > - **Purpose fit**: Prioritizes human competence and collaboration while delivering reproducible artifacts. > - **Output Contract**: This directive **adds universal constraints** for any technical topic while **inheriting** the Base Context contract sections. > - **Toggles honored**: Uses the same toggle semantics; defaults above can be overridden by the caller. @@ -26,9 +27,11 @@ inherits: base_context.mdc --- ## Objective + Produce a **developer-grade, reproducible guide** for any technical topic that onboards a competent practitioner **without meta narration** and **with evidence-backed steps**. ## Scope & Constraints + - **One Markdown document** as the deliverable. - Use **absolute dates** in **UTC** (e.g., `2025-08-21T14:22Z`) — avoid “today/yesterday”. - Include at least **one diagram** (Mermaid preferred). Choose the most fitting type: @@ -37,10 +40,11 @@ Produce a **developer-grade, reproducible guide** for any technical topic that o - **APIs**: `curl` + one client library (e.g., `httpx` for Python). - **CLIs**: literal command blocks and expected output snippets. - **Code**: minimal, self-contained samples (language appropriate). -- Cite **evidence** for *Works/Doesn’t* items (timestamps, filenames, line numbers, IDs/status codes, or logs). +- Cite **evidence** for _Works/Doesn’t_ items (timestamps, filenames, line numbers, IDs/status codes, or logs). - If something is unknown, output `TODO:` — **never invent**. ## Required Sections (extends Base Output Contract) + Follow this exact order **after** the Base Contract’s **Objective → Result → Use/Run** headers: 1. **Context & Scope** @@ -52,9 +56,9 @@ Follow this exact order **after** the Base Contract’s **Objective → Result 4. **Architecture / Process Overview** - Short prose + **one diagram** selected from the list above. 5. **Interfaces & Contracts (choose one)** - - **API-based**: Endpoint table (*Step, Method, Path/URL, Auth, Key Headers/Params, Sample Req/Resp ref*). - - **Data/Files**: I/O contract table (*Source, Format, Schema/Columns, Size, Validation rules*). - - **Systems/Hardware**: Interfaces table (*Port/Bus, Protocol, Voltage/Timing, Constraints*). + - **API-based**: Endpoint table (_Step, Method, Path/URL, Auth, Key Headers/Params, Sample Req/Resp ref_). + - **Data/Files**: I/O contract table (_Source, Format, Schema/Columns, Size, Validation rules_). + - **Systems/Hardware**: Interfaces table (_Port/Bus, Protocol, Voltage/Timing, Constraints_). 6. **Repro: End-to-End Procedure** - Minimal copy-paste steps with code/commands and **expected outputs**. 7. **What Works (with Evidence)** @@ -69,16 +73,19 @@ Follow this exact order **after** the Base Contract’s **Objective → Result - Canonical docs, specs, tickets, prior analyses. > **Competence Hooks (per Base Context; keep lightweight):** -> - *Why this works* (≤3 bullets) — core invariants or guarantees. -> - *Common pitfalls* (≤3 bullets) — the traps we saw in evidence. -> - *Next skill unlock* (1 line) — the next capability to implement/learn. -> - *Teach-back* (1 line) — prompt the reader to restate the flow/architecture. +> +> - _Why this works_ (≤3 bullets) — core invariants or guarantees. +> - _Common pitfalls_ (≤3 bullets) — the traps we saw in evidence. +> - _Next skill unlock_ (1 line) — the next capability to implement/learn. +> - _Teach-back_ (1 line) — prompt the reader to restate the flow/architecture. > **Collaboration Hooks (per Base Context):** +> > - Name reviewers for **Interfaces & Contracts** and the **diagram**. > - Short **sign-off checklist** before merging/publishing the guide. ## Do / Don’t (Base-aligned) + - **Do** quantify progress only against a defined scope with acceptance criteria. - **Do** include minimal sample payloads/headers or I/O schemas; redact sensitive values. - **Do** keep commentary lean; if timeboxed, move depth to **Deferred for depth**. @@ -86,6 +93,7 @@ Follow this exact order **after** the Base Contract’s **Objective → Result - **Don’t** include IDE-specific chatter or internal rules unrelated to the task. ## Validation Checklist (self-check before returning) + - [ ] All Required Sections present and ordered. - [ ] Diagram compiles (basic Mermaid syntax) and fits the problem. - [ ] If API-based, **Auth** and **Key Headers/Params** are listed for each endpoint. @@ -96,6 +104,7 @@ Follow this exact order **after** the Base Contract’s **Objective → Result - [ ] Base **Output Contract** sections satisfied (Objective/Result/Use/Run/Competence/Collaboration/Assumptions/References). ## Universal Template (fill-in) + ```markdown # — Working Notes (As of YYYY-MM-DDTHH:MMZ) @@ -132,37 +141,46 @@ Follow this exact order **after** the Base Contract’s **Objective → Result ``` ## Interfaces & Contracts + ### If API-based + | Step | Method | Path/URL | Auth | Key Headers/Params | Sample | |---|---|---|---|---|---| | <…> | <…> | <…> | <…> | <…> | below | ### If Data/Files + | Source | Format | Schema/Columns | Size | Validation | |---|---|---|---|---| | <…> | <…> | <…> | <…> | <…> | ### If Systems/Hardware + | Interface | Protocol | Timing/Voltage | Constraints | Notes | |---|---|---|---|---| | <…> | <…> | <…> | <…> | <…> | ## Repro: End-to-End Procedure + ```bash # commands / curl examples (redacted where necessary) ``` + ```python # minimal client library example (language appropriate) ``` + > Expected output: <snippet/checks> ## What Works (Evidence) + - ✅ <short statement> - **Time**: <YYYY-MM-DDTHH:MMZ> - **Evidence**: file/line/log or request id/status - **Verify at**: <where> ## What Doesn’t (Evidence & Hypotheses) + - ❌ <short failure> at `<component/endpoint/file>` - **Time**: <YYYY-MM-DDTHH:MMZ> - **Evidence**: <snippet/id/status> @@ -170,38 +188,46 @@ Follow this exact order **after** the Base Contract’s **Objective → Result - **Next probe**: <short> ## Risks, Limits, Assumptions + <bullets: limits, security boundaries, retries/backoff, idempotency, SLOs> ## Next Steps + | Owner | Task | Exit Criteria | Target Date (UTC) | |---|---|---|---| | <name> | <action> | <measurable outcome> | <YYYY-MM-DD> | ## References + <links/titles> ## Competence Hooks -- *Why this works*: <≤3 bullets> -- *Common pitfalls*: <≤3 bullets> -- *Next skill unlock*: <1 line> -- *Teach-back*: <1 line> + +- _Why this works_: <≤3 bullets> +- _Common pitfalls_: <≤3 bullets> +- _Next skill unlock_: <1 line> +- _Teach-back_: <1 line> ## Collaboration Hooks + - Reviewers: <names/roles> - Sign-off checklist: <≤5 checks> ## Assumptions & Limits + <bullets> ## Deferred for depth + <park deeper material here to respect timeboxing> ``` --- **Notes for Implementers:** -- Respect Base *Do-Not* (no filler, no invented facts, no censorship). + +- Respect Base _Do-Not_ (no filler, no invented facts, no censorship). - Prefer clarity over completeness when timeboxed; capture unknowns explicitly. - Apply historical comment management rules (see `.cursor/rules/historical_comment_management.mdc`) - Apply realistic time estimation rules (see `.cursor/rules/realistic_time_estimation.mdc`) -- Apply Playwright test investigation rules (see `.cursor/rules/playwright_test_investigation.mdc`) \ No newline at end of file +- Apply Playwright test investigation rules (see `.cursor/rules/playwright_test_investigation.mdc`) diff --git a/.cursor/rules/meta_bug_diagnosis.mdc b/.cursor/rules/meta_bug_diagnosis.mdc index 22319342..e4fb3440 100644 --- a/.cursor/rules/meta_bug_diagnosis.mdc +++ b/.cursor/rules/meta_bug_diagnosis.mdc @@ -82,6 +82,7 @@ common investigation pitfalls. ### **Safe Diagnosis Commands** ✅ **Safe to use during diagnosis:** + - `npm run lint-fix` - Syntax and style checking - `npm run type-check` - TypeScript validation (if available) - `git status` - Version control status @@ -90,6 +91,7 @@ common investigation pitfalls. - `grep_search` - Text pattern searching ❌ **Never use during diagnosis:** + - `npm run build:web` - Blocks chat - `npm run build:electron` - Blocks chat - `npm run build:capacitor` - Blocks chat diff --git a/.cursor/rules/meta_core_always_on.mdc b/.cursor/rules/meta_core_always_on.mdc index ac9ee1dd..2b31af14 100644 --- a/.cursor/rules/meta_core_always_on.mdc +++ b/.cursor/rules/meta_core_always_on.mdc @@ -36,6 +36,7 @@ that are essential for all AI interactions. **This meta-rule enforces current workflow mode constraints for all interactions:** ### **Current Workflow State** + ```json { "workflowState": { @@ -62,26 +63,31 @@ that are essential for all AI interactions. ### **Mode-Specific Enforcement** **Diagnosis Mode (read_only):** + - ❌ **Forbidden**: File modification, code creation, build commands, git commits - ✅ **Allowed**: File reading, code analysis, investigation, documentation - **Response**: Guide user toward investigation and analysis, not implementation **Fixing Mode (implementation):** + - ✅ **Allowed**: File modification, code creation, build commands, testing, git commits - ❌ **Forbidden**: None (full implementation mode) - **Response**: Proceed with implementation and testing **Planning Mode (design_only):** + - ❌ **Forbidden**: Implementation, coding, building, deployment - ✅ **Allowed**: Analysis, design, estimation, documentation, architecture - **Response**: Focus on planning and design, not implementation **Research Mode (investigation):** + - ❌ **Forbidden**: File modification, implementation, deployment - ✅ **Allowed**: Investigation, analysis, research, documentation - **Response**: Focus on investigation and analysis **Documentation Mode (writing_only):** + - ❌ **Forbidden**: Implementation, coding, building, deployment - ✅ **Allowed**: Writing, editing, formatting, structuring, reviewing - **Response**: Focus on documentation creation and improvement diff --git a/.cursor/rules/meta_documentation.mdc b/.cursor/rules/meta_documentation.mdc index 56c44000..708c5f83 100644 --- a/.cursor/rules/meta_documentation.mdc +++ b/.cursor/rules/meta_documentation.mdc @@ -51,6 +51,7 @@ providing technical descriptions. ## When to Use **Use this meta-rule when**: + - Writing new documentation - Updating existing documentation - Creating technical guides @@ -107,6 +108,7 @@ providing technical descriptions. ### **Document Structure** **Mandatory Sections**: + - **Overview**: Clear purpose and scope with educational context - **Why This Matters**: Business value and user benefit explanation - **Core Concepts**: Fundamental understanding before implementation @@ -116,6 +118,7 @@ providing technical descriptions. - **Next Steps**: Where to go from here **Optional Sections**: + - **Background**: Historical context and evolution - **Alternatives**: Other approaches and trade-offs - **Advanced Topics**: Deep dive into complex scenarios @@ -124,6 +127,7 @@ providing technical descriptions. ### **Writing Style** **Educational Approach**: + - **Conversational tone**: Write as if explaining to a colleague - **Progressive disclosure**: Start simple, add complexity gradually - **Active voice**: "You can do this" not "This can be done" @@ -131,6 +135,7 @@ providing technical descriptions. - **Analogies**: Use familiar concepts to explain complex ideas **Technical Accuracy**: + - **Precise language**: Use exact technical terms consistently - **Code examples**: Working, tested code snippets - **Version information**: Specify applicable versions and platforms @@ -139,6 +144,7 @@ providing technical descriptions. ### **Content Quality Standards** **Educational Value**: + - [ ] **Concept clarity**: Reader understands the fundamental idea - [ ] **Context relevance**: Reader knows when to apply the knowledge - [ ] **Practical application**: Reader can implement the solution @@ -146,6 +152,7 @@ providing technical descriptions. - [ ] **Next steps**: Reader knows where to continue learning **Technical Accuracy**: + - [ ] **Fact verification**: All technical details are correct - [ ] **Code validation**: Examples compile and run correctly - [ ] **Version compatibility**: Platform and version requirements clear @@ -183,6 +190,7 @@ providing technical descriptions. ### **Review Checklist** **Educational Quality**: + - [ ] **Clear learning objective**: What will the reader learn? - [ ] **Appropriate complexity**: Matches target audience knowledge - [ ] **Progressive disclosure**: Information builds logically @@ -190,6 +198,7 @@ providing technical descriptions. - [ ] **Common questions**: Anticipates and answers reader questions **Technical Quality**: + - [ ] **Accuracy**: All technical details verified - [ ] **Completeness**: Covers all necessary information - [ ] **Consistency**: Terminology and formatting consistent diff --git a/.cursor/rules/playwright-test-investigation.mdc b/.cursor/rules/playwright-test-investigation.mdc index c7a97c9d..0b899c12 100644 --- a/.cursor/rules/playwright-test-investigation.mdc +++ b/.cursor/rules/playwright-test-investigation.mdc @@ -9,26 +9,31 @@ alwaysApply: false **Status**: 🎯 **ACTIVE** - Playwright test debugging guidelines ## Objective + Provide systematic approach for investigating Playwright test failures with focus on UI element conflicts, timing issues, and selector ambiguity. ## Context & Scope + - **Audience**: Developers debugging Playwright test failures - **In scope**: Test failure analysis, selector conflicts, UI state investigation, timing issues - **Out of scope**: Test writing best practices, CI/CD configuration ## Artifacts & Links + - Test results: `test-results/` directory - Error context: `error-context.md` files with page snapshots - Trace files: `trace.zip` files for failed tests - HTML reports: Interactive test reports with screenshots ## Environment & Preconditions + - OS/Runtime: Linux/Windows/macOS with Node.js - Versions: Playwright test framework, browser drivers - Services: Local test server (localhost:8080), test data setup - Auth mode: None required for test investigation ## Architecture / Process Overview + Playwright test investigation follows a systematic diagnostic workflow that leverages built-in debugging tools and error context analysis. ```mermaid @@ -57,6 +62,7 @@ flowchart TD ## Interfaces & Contracts ### Test Results Structure + | Component | Format | Content | Validation | |---|---|---|---| | Error Context | Markdown | Page snapshot in YAML | Verify DOM state matches test expectations | @@ -65,6 +71,7 @@ flowchart TD | JSON Results | JSON | Machine-readable results | Parse for automated analysis | ### Investigation Commands + | Step | Command | Expected Output | Notes | |---|---|---|---| | Locate failed tests | `find test-results -name "*test-name*"` | Test result directories | Use exact test name patterns | @@ -74,6 +81,7 @@ flowchart TD ## Repro: End-to-End Investigation Procedure ### 1. Locate Failed Test Results + ```bash # Find all results for a specific test find test-results -name "*test-name*" -type d @@ -83,6 +91,7 @@ find test-results -name "error-context.md" | head -5 ``` ### 2. Analyze Error Context + ```bash # Read error context for specific test cat test-results/test-name-test-description-browser/error-context.md @@ -92,6 +101,7 @@ grep -A 10 -B 5 "button.*Yes\|button.*No" test-results/*/error-context.md ``` ### 3. Check Trace Files + ```bash # List available trace files find test-results -name "*.zip" | grep trace @@ -101,6 +111,7 @@ npx playwright show-trace test-results/test-name/trace.zip ``` ### 4. Investigate Selector Issues + ```typescript // Check for multiple elements with same text await page.locator('button:has-text("Yes")').count(); // Should be 1 @@ -110,6 +121,7 @@ await page.locator('div[role="alert"]:has-text("Register") button:has-text("Yes" ``` ## What Works (Evidence) + - ✅ **Error context files** provide page snapshots showing exact DOM state at failure - **Time**: 2025-08-21T14:22Z - **Evidence**: `test-results/60-new-activity-New-offers-for-another-user-chromium/error-context.md` shows both alerts visible @@ -126,6 +138,7 @@ await page.locator('div[role="alert"]:has-text("Register") button:has-text("Yes" - **Verify at**: Error context markdown files ## What Doesn't (Evidence & Hypotheses) + - ❌ **Generic selectors** fail with multiple similar elements at `test-playwright/testUtils.ts:161` - **Time**: 2025-08-21T14:22Z - **Evidence**: `button:has-text("Yes")` matches both "Yes" and "Yes, Export Data" @@ -139,12 +152,14 @@ await page.locator('div[role="alert"]:has-text("Register") button:has-text("Yes" - **Next probe**: Implement alert queuing or prevent overlapping alerts ## Risks, Limits, Assumptions + - **Trace file size**: Large trace files may impact storage and analysis time - **Browser compatibility**: Trace viewer requires specific browser support - **Test isolation**: Shared state between tests may affect investigation results - **Timing sensitivity**: Tests may pass/fail based on system performance ## Next Steps + | Owner | Task | Exit Criteria | Target Date (UTC) | |---|---|---|---| | Development Team | Fix test selectors for multiple alerts | All tests pass consistently | 2025-08-22 | @@ -152,21 +167,25 @@ await page.locator('div[role="alert"]:has-text("Register") button:has-text("Yes" | Development Team | Add test IDs to alert buttons | Unique selectors for all UI elements | 2025-08-28 | ## References + - [Playwright Trace Viewer Documentation](https://playwright.dev/docs/trace-viewer) - [Playwright Test Results](https://playwright.dev/docs/test-reporters) - [Test Investigation Workflow](./research_diagnostic.mdc) ## Competence Hooks + - **Why this works**: Systematic investigation leverages Playwright's built-in debugging tools to identify root causes - **Common pitfalls**: Generic selectors fail with multiple similar elements; timing issues create race conditions; alert stacking causes UI conflicts - **Next skill unlock**: Implement unique test IDs and handle alert dismissal order in test flows - **Teach-back**: "How would you investigate a Playwright test failure using error context, trace files, and page snapshots?" ## Collaboration Hooks + - **Reviewers**: QA team, test automation engineers - **Sign-off checklist**: Error context analyzed, trace files reviewed, root cause identified, fix implemented and tested ## Assumptions & Limits + - Test results directory structure follows Playwright conventions - Trace files are enabled in configuration (`trace: "retain-on-failure"`) - Error context files contain valid YAML page snapshots @@ -178,6 +197,7 @@ await page.locator('div[role="alert"]:has-text("Register") button:has-text("Yes" **Priority**: High **Maintainer**: Development team **Next Review**: 2025-09-21 + # Playwright Test Investigation — Harbor Pilot Directive **Author**: Matthew Raymer @@ -185,26 +205,31 @@ await page.locator('div[role="alert"]:has-text("Register") button:has-text("Yes" **Status**: 🎯 **ACTIVE** - Playwright test debugging guidelines ## Objective + Provide systematic approach for investigating Playwright test failures with focus on UI element conflicts, timing issues, and selector ambiguity. ## Context & Scope + - **Audience**: Developers debugging Playwright test failures - **In scope**: Test failure analysis, selector conflicts, UI state investigation, timing issues - **Out of scope**: Test writing best practices, CI/CD configuration ## Artifacts & Links + - Test results: `test-results/` directory - Error context: `error-context.md` files with page snapshots - Trace files: `trace.zip` files for failed tests - HTML reports: Interactive test reports with screenshots ## Environment & Preconditions + - OS/Runtime: Linux/Windows/macOS with Node.js - Versions: Playwright test framework, browser drivers - Services: Local test server (localhost:8080), test data setup - Auth mode: None required for test investigation ## Architecture / Process Overview + Playwright test investigation follows a systematic diagnostic workflow that leverages built-in debugging tools and error context analysis. ```mermaid @@ -233,6 +258,7 @@ flowchart TD ## Interfaces & Contracts ### Test Results Structure + | Component | Format | Content | Validation | |---|---|---|---| | Error Context | Markdown | Page snapshot in YAML | Verify DOM state matches test expectations | @@ -241,6 +267,7 @@ flowchart TD | JSON Results | JSON | Machine-readable results | Parse for automated analysis | ### Investigation Commands + | Step | Command | Expected Output | Notes | |---|---|---|---| | Locate failed tests | `find test-results -name "*test-name*"` | Test result directories | Use exact test name patterns | @@ -250,6 +277,7 @@ flowchart TD ## Repro: End-to-End Investigation Procedure ### 1. Locate Failed Test Results + ```bash # Find all results for a specific test find test-results -name "*test-name*" -type d @@ -259,6 +287,7 @@ find test-results -name "error-context.md" | head -5 ``` ### 2. Analyze Error Context + ```bash # Read error context for specific test cat test-results/test-name-test-description-browser/error-context.md @@ -268,6 +297,7 @@ grep -A 10 -B 5 "button.*Yes\|button.*No" test-results/*/error-context.md ``` ### 3. Check Trace Files + ```bash # List available trace files find test-results -name "*.zip" | grep trace @@ -277,6 +307,7 @@ npx playwright show-trace test-results/test-name/trace.zip ``` ### 4. Investigate Selector Issues + ```typescript // Check for multiple elements with same text await page.locator('button:has-text("Yes")').count(); // Should be 1 @@ -286,6 +317,7 @@ await page.locator('div[role="alert"]:has-text("Register") button:has-text("Yes" ``` ## What Works (Evidence) + - ✅ **Error context files** provide page snapshots showing exact DOM state at failure - **Time**: 2025-08-21T14:22Z - **Evidence**: `test-results/60-new-activity-New-offers-for-another-user-chromium/error-context.md` shows both alerts visible @@ -302,6 +334,7 @@ await page.locator('div[role="alert"]:has-text("Register") button:has-text("Yes" - **Verify at**: Error context markdown files ## What Doesn't (Evidence & Hypotheses) + - ❌ **Generic selectors** fail with multiple similar elements at `test-playwright/testUtils.ts:161` - **Time**: 2025-08-21T14:22Z - **Evidence**: `button:has-text("Yes")` matches both "Yes" and "Yes, Export Data" @@ -315,12 +348,14 @@ await page.locator('div[role="alert"]:has-text("Register") button:has-text("Yes" - **Next probe**: Implement alert queuing or prevent overlapping alerts ## Risks, Limits, Assumptions + - **Trace file size**: Large trace files may impact storage and analysis time - **Browser compatibility**: Trace viewer requires specific browser support - **Test isolation**: Shared state between tests may affect investigation results - **Timing sensitivity**: Tests may pass/fail based on system performance ## Next Steps + | Owner | Task | Exit Criteria | Target Date (UTC) | |---|---|---|---| | Development Team | Fix test selectors for multiple alerts | All tests pass consistently | 2025-08-22 | @@ -328,21 +363,25 @@ await page.locator('div[role="alert"]:has-text("Register") button:has-text("Yes" | Development Team | Add test IDs to alert buttons | Unique selectors for all UI elements | 2025-08-28 | ## References + - [Playwright Trace Viewer Documentation](https://playwright.dev/docs/trace-viewer) - [Playwright Test Results](https://playwright.dev/docs/test-reporters) - [Test Investigation Workflow](./research_diagnostic.mdc) ## Competence Hooks + - **Why this works**: Systematic investigation leverages Playwright's built-in debugging tools to identify root causes - **Common pitfalls**: Generic selectors fail with multiple similar elements; timing issues create race conditions; alert stacking causes UI conflicts - **Next skill unlock**: Implement unique test IDs and handle alert dismissal order in test flows - **Teach-back**: "How would you investigate a Playwright test failure using error context, trace files, and page snapshots?" ## Collaboration Hooks + - **Reviewers**: QA team, test automation engineers - **Sign-off checklist**: Error context analyzed, trace files reviewed, root cause identified, fix implemented and tested ## Assumptions & Limits + - Test results directory structure follows Playwright conventions - Trace files are enabled in configuration (`trace: "retain-on-failure"`) - Error context files contain valid YAML page snapshots diff --git a/.cursor/rules/workflow/commit_messages.mdc b/.cursor/rules/workflow/commit_messages.mdc index 7ecebfd6..64ec19ab 100644 --- a/.cursor/rules/workflow/commit_messages.mdc +++ b/.cursor/rules/workflow/commit_messages.mdc @@ -73,7 +73,7 @@ ### Avoid -- Vague: *improved, enhanced, better* +- Vague: _improved, enhanced, better_ - Trivialities: tiny docs, one-liners, pure lint cleanups (separate, diff --git a/.husky/pre-commit b/.husky/pre-commit index 98b8a393..87f0cdad 100755 --- a/.husky/pre-commit +++ b/.husky/pre-commit @@ -18,16 +18,16 @@ npm run lint-fix || { exit 1 } -# Then run Build Architecture Guard -echo "🏗️ Running Build Architecture Guard..." -bash ./scripts/build-arch-guard.sh --staged || { - echo - echo "❌ Build Architecture Guard failed. Please fix the issues and try again." - echo "💡 To bypass this check for emergency commits, use:" - echo " git commit --no-verify" - echo - exit 1 -} +# Build Architecture Guard - DISABLED +# echo "🏗️ Running Build Architecture Guard..." +# bash ./scripts/build-arch-guard.sh --staged || { +# echo +# echo "❌ Build Architecture Guard failed. Please fix the issues and try again." +# echo "💡 To bypass this check for emergency commits, use:" +# echo " git commit --no-verify" +# echo +# exit 1 +# } echo "✅ All pre-commit checks passed!" diff --git a/.husky/pre-push b/.husky/pre-push index 12a16ea5..4eb9e3f0 100755 --- a/.husky/pre-push +++ b/.husky/pre-push @@ -5,23 +5,28 @@ # . "$(dirname -- "$0")/_/husky.sh" -echo "🔍 Running Build Architecture Guard (pre-push)..." +echo "🔍 Pre-push checks..." -# Get the remote branch we're pushing to -REMOTE_BRANCH="origin/$(git rev-parse --abbrev-ref HEAD)" +# Build Architecture Guard - DISABLED +# echo "🔍 Running Build Architecture Guard (pre-push)..." +# +# # Get the remote branch we're pushing to +# REMOTE_BRANCH="origin/$(git rev-parse --abbrev-ref HEAD)" +# +# # Check if remote branch exists +# if git show-ref --verify --quiet "refs/remotes/$REMOTE_BRANCH"; then +# RANGE="$REMOTE_BRANCH...HEAD" +# else +# # If remote branch doesn't exist, check last commit +# RANGE="HEAD~1..HEAD" +# fi +# +# bash ./scripts/build-arch-guard.sh --range "$RANGE" || { +# echo +# echo "💡 To bypass this check for emergency pushes, use:" +# echo " git push --no-verify" +# echo +# exit 1 +# } -# Check if remote branch exists -if git show-ref --verify --quiet "refs/remotes/$REMOTE_BRANCH"; then - RANGE="$REMOTE_BRANCH...HEAD" -else - # If remote branch doesn't exist, check last commit - RANGE="HEAD~1..HEAD" -fi - -bash ./scripts/build-arch-guard.sh --range "$RANGE" || { - echo - echo "💡 To bypass this check for emergency pushes, use:" - echo " git push --no-verify" - echo - exit 1 -} +echo "✅ Pre-push checks passed!" diff --git a/.markdownlint.json b/.markdownlint.json index 2f13abeb..34aa193d 100644 --- a/.markdownlint.json +++ b/.markdownlint.json @@ -1,27 +1,56 @@ { - "MD013": { - "line_length": 80, - "code_blocks": false, - "tables": false, - "headings": false + "MD013": false, + "MD033": false, + "MD041": false, + "MD024": { + "siblings_only": true + }, + "MD029": { + "style": "ordered" + }, + "MD007": { + "indent": 2 + }, + "MD012": { + "maximum": 1 }, - "MD012": true, "MD022": true, + "MD025": true, + "MD026": { + "punctuation": ".,;:!" + }, + "MD030": { + "ul_single": 1, + "ol_single": 1, + "ul_multi": 1, + "ol_multi": 1 + }, "MD031": true, "MD032": true, - "MD047": true, - "MD009": true, - "MD010": true, - "MD004": { "style": "dash" }, - "MD029": { "style": "ordered" }, - "MD041": false, - "MD025": false, - "MD024": false, + "MD034": true, + "MD035": { + "style": "---" + }, "MD036": false, - "MD003": false, - "MD040": false, - "MD055": false, - "MD056": false, - "MD034": false, - "MD023": false + "MD037": true, + "MD038": true, + "MD039": true, + "MD040": true, + "MD042": true, + "MD043": false, + "MD044": false, + "MD045": true, + "MD046": { + "style": "fenced" + }, + "MD047": true, + "MD048": { + "style": "backtick" + }, + "MD049": { + "style": "underscore" + }, + "MD050": { + "style": "asterisk" + } } \ No newline at end of file diff --git a/BUILDING.md b/BUILDING.md index 1ac4ae9d..546f4f2c 100644 --- a/BUILDING.md +++ b/BUILDING.md @@ -93,6 +93,7 @@ The Build Architecture Guard protects your build system by enforcing documentati #### Protected File Patterns The guard monitors these sensitive paths: + - `vite.config.*` - Build configuration - `scripts/**` - Build and utility scripts - `electron/**` - Desktop application code @@ -132,6 +133,7 @@ npm run guard:setup #### Troubleshooting If you encounter `mapfile: command not found` errors: + ```bash # Ensure script is executable chmod +x scripts/build-arch-guard.sh @@ -270,6 +272,7 @@ Start the development server using `npm run build:web:dev` or `npm run build:web 3. To test the production build locally, use `npm run build:web:serve` (builds then serves) **Why Use `serve`?** + - **Production Testing**: Test your optimized production build locally before deployment - **SPA Routing Validation**: Verify deep linking and navigation work correctly (handles routes like `/discover`, `/account`) - **Performance Testing**: Test the minified and optimized build locally @@ -335,15 +338,18 @@ All web build commands use the `./scripts/build-web.sh` script, which provides: The `serve` functionality provides a local HTTP server for testing production builds: **What It Does:** + 1. **Builds** the application using Vite 2. **Serves** the built files from the `dist/` directory 3. **Handles SPA Routing** - serves `index.html` for all routes (fixes 404s on `/discover`, `/account`, etc.) **Server Options:** + - **Primary**: `npx serve -s dist -l 8080` (recommended - full SPA support) - **Fallback**: Python HTTP server (limited SPA routing support) **Use Cases:** + - Testing production builds before deployment - Validating SPA routing behavior - Performance testing of optimized builds @@ -365,8 +371,8 @@ current version to test DB migrations. - Put the commit hash in the changelog (which will help you remember to bump the version in the step later). -- Tag with the new version, -[online](https://gitea.anomalistdesign.com/trent_larson/crowd-funder-for-time-pwa/releases) or +- Tag with the new version, +[online](https://gitea.anomalistdesign.com/trent_larson/crowd-funder-for-time-pwa/releases) or `git tag 1.0.2 && git push origin 1.0.2`. - For test, build the app: @@ -1185,14 +1191,14 @@ If you need to build manually or want to understand the individual steps: - Choose Product -> Archive - This will trigger a build and take time, needing user's "login" keychain password (user's login password), repeatedly. - - If it fails with `building for 'iOS', but linking in dylib + - If it fails with `building for 'iOS', but linking in dylib (.../.pkgx/zlib.net/v1.3.0/lib/libz.1.3.dylib) built for 'macOS'` then run XCode outside that terminal (ie. not with `npx cap open ios`). - Click Distribute -> App Store Connect - In AppStoreConnect, add the build to the distribution. You may have to remove the current build with the "-" when you hover over it, then "Add Build" with the new build. - - May have to go to App Review, click Submission, then hover over the build + - May have to go to App Review, click Submission, then hover over the build and click "-". - It can take 15 minutes for the build to show up in the list of builds. - You'll probably have to "Manage" something about encryption, disallowed in France. @@ -1257,11 +1263,13 @@ npm run assets:validate ##### What Gets Validated **Source Assets (Required):** + - `resources/icon.png` - App icon source - `resources/splash.png` - Splash screen source - `resources/splash_dark.png` - Dark mode splash source **Android Resources (Generated):** + - `android/app/src/main/res/drawable/splash.png` - Splash screen drawable - `android/app/src/main/res/mipmap-*/ic_launcher.png` - App icons for all densities - `android/app/src/main/res/mipmap-*/ic_launcher_round.png` - Round app icons for all densities @@ -2706,6 +2714,7 @@ configuration files in the repository. ### 2025-08-21 - Cursor Rules Refactoring and Build System Updates #### Package Dependencies Updated + - **Added**: `markdownlint-cli2` v0.18.1 - Modern markdown linting with improved performance - **Added**: `@commitlint/cli` v18.6.1 - Conventional commit message validation - **Added**: `@commitlint/config-conventional` v18.6.2 - Conventional commit standards @@ -2713,28 +2722,33 @@ configuration files in the repository. - **Updated**: `lint-staged` v15.2.2 - Pre-commit linting automation #### Build Script Improvements + - **Markdown Linting**: Replaced custom markdown scripts with `markdownlint-cli2` - **Before**: `./scripts/fix-markdown.sh` and `./scripts/validate-markdown.sh` - **After**: `markdownlint-cli2 --fix` and `markdownlint-cli2` - **Benefits**: Faster execution, better error reporting, modern markdown standards #### Lint-Staged Configuration Enhanced + - **Added**: Markdown file linting to pre-commit hooks - **Pattern**: `*.{md,markdown,mdc}` files now automatically formatted - **Command**: `markdownlint-cli2 --fix` runs before each commit - **Coverage**: All markdown files including `.mdc` cursor rules #### Commit Message Standards + - **Added**: Conventional commit validation via commitlint - **Configuration**: Extends `@commitlint/config-conventional` - **Enforcement**: Ensures consistent commit message format across the project #### Node.js Version Requirements + - **Updated**: Minimum Node.js version requirements for new dependencies - **markdownlint-cli2**: Requires Node.js >=20 - **Various utilities**: Require Node.js >=18 for modern ES features #### Build Process Impact + - **No Breaking Changes**: All existing build commands continue to work - **Improved Quality**: Better markdown formatting and commit message standards - **Enhanced Automation**: More comprehensive pre-commit validation @@ -2745,6 +2759,7 @@ configuration files in the repository. ### 2025-08-21 - Commitlint Configuration Refinement #### Commit Message Validation Improvements + - **Modified**: Commitlint configuration moved from `package.json` to dedicated `commitlint.config.js` - **Enhanced**: Strict validation rules downgraded from errors to warnings - **Before**: `subject-case` and `subject-full-stop` rules caused red error messages @@ -2752,16 +2767,18 @@ configuration files in the repository. - **Benefit**: Eliminates confusing red error messages while maintaining commit quality guidance #### Configuration Structure + - **File**: `commitlint.config.js` - Dedicated commitlint configuration - **Extends**: `@commitlint/config-conventional` - Standard conventional commit rules -- **Custom Rules**: +- **Custom Rules**: - `subject-case: [1, 'never', ['sentence-case', 'start-case', 'pascal-case', 'upper-case']]` - `subject-full-stop: [1, 'never', '.']` -- **Levels**: +- **Levels**: - `0` = Disabled, `1` = Warning, `2` = Error - Current: Problematic rules set to warning level (1) #### User Experience Impact + - **Before**: Red error messages on every push with strict commit rules - **After**: Yellow warning messages that provide guidance without disruption - **Workflow**: Commits and pushes continue to work while maintaining quality standards @@ -2772,6 +2789,7 @@ configuration files in the repository. ### 2025-08-26 - Capacitor Plugin Additions #### New Capacitor Plugins Added + - **Added**: `@capacitor/clipboard` v6.0.2 - Clipboard functionality for mobile platforms - **Purpose**: Enable copy/paste operations on mobile devices - **Platforms**: iOS and Android @@ -2785,23 +2803,27 @@ configuration files in the repository. - **Integration**: Automatically included in mobile builds #### Android Build System Updates + - **Modified**: `android/capacitor.settings.gradle` - Added new plugin project includes - **Added**: `:capacitor-clipboard` project directory mapping - **Added**: `:capacitor-status-bar` project directory mapping - **Impact**: New plugins now properly integrated into Android build process #### Package Dependencies + - **Updated**: `package.json` - Added new Capacitor plugin dependencies - **Updated**: `package-lock.json` - Locked dependency versions for consistency - **Version**: All new plugins use Capacitor 6.x compatible versions #### Build Process Impact + - **No Breaking Changes**: Existing build commands continue to work unchanged - **Enhanced Mobile Features**: New clipboard and status bar capabilities available - **Automatic Integration**: Plugins automatically included in mobile builds - **Platform Support**: Both iOS and Android builds now include new functionality #### Testing Requirements + - **Mobile Builds**: Verify new plugins integrate correctly in iOS and Android builds - **Functionality**: Test clipboard operations and status bar management on devices - **Fallback**: Ensure graceful degradation when plugins are unavailable diff --git a/README-PR-TEMPLATE.md b/README-PR-TEMPLATE.md index fa977e02..d1145117 100644 --- a/README-PR-TEMPLATE.md +++ b/README-PR-TEMPLATE.md @@ -66,14 +66,17 @@ test-image.tar a1b2c3d4e5f6... ``` ### Docs + - [x] **BUILDING.md** updated (sections): Docker deployment - [x] Troubleshooting updated: Added Docker troubleshooting section ### Rollback + - [x] Verified steps to restore previous behavior: 1. `git revert HEAD` 2. `docker rmi test-image` 3. Restore previous BUILDING.md + ``` --- diff --git a/README.md b/README.md index cf01f3bf..691a26c3 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ See [ClickUp](https://sharing.clickup.com/9014278710/l/h/8cmnyhp-174/10573fec74e Quick start: -* For setup, we recommend [pkgx](https://pkgx.dev), which installs what you need (either automatically or with the `dev` command). Core dependencies are typescript & npm; when building for other platforms, you'll need other things such as those in the pkgx.yaml & BUILDING.md files. +- For setup, we recommend [pkgx](https://pkgx.dev), which installs what you need (either automatically or with the `dev` command). Core dependencies are typescript & npm; when building for other platforms, you'll need other things such as those in the pkgx.yaml & BUILDING.md files. ```bash npm install @@ -90,6 +90,7 @@ VITE_LOG_LEVEL=debug npm run dev See [Logging Configuration Guide](doc/logging-configuration.md) for complete details. ### Quick Usage + ```bash # Run the database clearing script ./scripts/clear-database.sh @@ -102,16 +103,19 @@ npm run build:web:dev # For Web ### What It Does #### **Electron (Desktop App)** + - Automatically finds and clears the SQLite database files - Works on Linux, macOS, and Windows - Clears all data and forces fresh migrations on next startup #### **Web Browser** + - Provides instructions for using custom browser data directories - Shows manual clearing via browser DevTools - Ensures reliable database clearing without browser complications ### Safety Features + - ✅ **Interactive Script**: Guides you through the process - ✅ **Platform Detection**: Automatically detects your OS - ✅ **Clear Instructions**: Step-by-step guidance for each platform @@ -120,6 +124,7 @@ npm run build:web:dev # For Web ### Manual Commands (if needed) #### **Electron Database Location** + ```bash # Linux rm -rf ~/.config/TimeSafari/* @@ -132,6 +137,7 @@ rmdir /s /q %APPDATA%\TimeSafari ``` #### **Web Browser (Custom Data Directory)** + ```bash # Create isolated browser profile mkdir ~/timesafari-dev-data @@ -144,6 +150,7 @@ URL generation across all environments. This prevents localhost URLs from appearing in shared links during development. ### Key Features + - ✅ **Production URLs for Sharing**: All copy link buttons use production domain - ✅ **Environment-Specific Internal URLs**: Internal operations use appropriate environment URLs @@ -227,6 +234,7 @@ npm run test:prerequisites - **Build failures**: Run `npm run check:dependencies` to diagnose environment issues **Required Versions**: + - Node.js: 18+ (LTS recommended) - npm: 8+ (comes with Node.js) - Platform-specific tools: Android Studio, Xcode (for mobile builds) @@ -246,25 +254,26 @@ To add a Font Awesome icon, add to `fontawesome.ts` and reference with ### Reference Material -* Notifications can be type of `toast` (self-dismiss), `info`, `success`, `warning`, and `danger`. +- Notifications can be type of `toast` (self-dismiss), `info`, `success`, `warning`, and `danger`. They are done via [notiwind](https://www.npmjs.com/package/notiwind) and set up in App.vue. -* [Customize Vue configuration](https://cli.vuejs.org/config/). +- [Customize Vue configuration](https://cli.vuejs.org/config/). -* If you are deploying in a subdirectory, add it to `publicPath` in vue.config.js, eg: `publicPath: "/app/time-tracker/",` +- If you are deploying in a subdirectory, add it to `publicPath` in vue.config.js, eg: `publicPath: "/app/time-tracker/",` ### Code Organization The project uses a centralized approach to type definitions and interfaces: -* `src/interfaces/` - Contains all TypeScript interfaces and type definitions - * `deepLinks.ts` - Deep linking type system and Zod validation schemas - * `give.ts` - Give-related interfaces and type definitions - * `claims.ts` - Claim-related interfaces and verifiable credentials - * `common.ts` - Shared interfaces and utility types - * Other domain-specific interface files +- `src/interfaces/` - Contains all TypeScript interfaces and type definitions + - `deepLinks.ts` - Deep linking type system and Zod validation schemas + - `give.ts` - Give-related interfaces and type definitions + - `claims.ts` - Claim-related interfaces and verifiable credentials + - `common.ts` - Shared interfaces and utility types + - Other domain-specific interface files Key principles: + - All interfaces and types are defined in the interfaces folder - Zod schemas are used for runtime validation and type generation - Domain-specific interfaces are separated into their own files @@ -275,11 +284,11 @@ Key principles: The application uses a platform-agnostic database layer with Vue mixins for service access: -* `src/services/PlatformService.ts` - Database interface definition -* `src/services/PlatformServiceFactory.ts` - Platform-specific service factory -* `src/services/AbsurdSqlDatabaseService.ts` - SQLite implementation -* `src/utils/PlatformServiceMixin.ts` - Vue mixin for database access with caching -* `src/db/` - Legacy Dexie database (migration in progress) +- `src/services/PlatformService.ts` - Database interface definition +- `src/services/PlatformServiceFactory.ts` - Platform-specific service factory +- `src/services/AbsurdSqlDatabaseService.ts` - SQLite implementation +- `src/utils/PlatformServiceMixin.ts` - Vue mixin for database access with caching +- `src/db/` - Legacy Dexie database (migration in progress) **Development Guidelines**: @@ -316,11 +325,11 @@ timesafari/ Gifts make the world go 'round! -* [WebStorm by JetBrains](https://www.jetbrains.com/webstorm/) for the free open-source license -* [Máximo Fernández](https://medium.com/@maxfarenas) for the 3D [code](https://github.com/maxfer03/vue-three-ns) and [explanatory post](https://medium.com/nicasource/building-an-interactive-web-portfolio-with-vue-three-js-part-three-implementing-three-js-452cb375ef80) -* [Many tools & libraries](https://gitea.anomalistdesign.com/trent_larson/crowd-funder-for-time-pwa/src/branch/master/package.json#L10) such as Nodejs.org, IntelliJ Idea, Veramo.io, Vuejs.org, threejs.org -* [Bush 3D model](https://sketchfab.com/3d-models/lupine-plant-bf30f1110c174d4baedda0ed63778439) -* [Forest floor image](https://www.goodfreephotos.com/albums/textures/leafy-autumn-forest-floor.jpg) -* Time Safari logo assisted by [DALL-E in ChatGPT](https://chat.openai.com/g/g-2fkFE8rbu-dall-e) -* [DiceBear](https://www.dicebear.com/licenses/) and [Avataaars](https://www.dicebear.com/styles/avataaars/#details) for human-looking identicons -* Some gratitude prompts thanks to [Develop Good Habits](https://www.developgoodhabits.com/gratitude-journal-prompts/) +- [WebStorm by JetBrains](https://www.jetbrains.com/webstorm/) for the free open-source license +- [Máximo Fernández](https://medium.com/@maxfarenas) for the 3D [code](https://github.com/maxfer03/vue-three-ns) and [explanatory post](https://medium.com/nicasource/building-an-interactive-web-portfolio-with-vue-three-js-part-three-implementing-three-js-452cb375ef80) +- [Many tools & libraries](https://gitea.anomalistdesign.com/trent_larson/crowd-funder-for-time-pwa/src/branch/master/package.json#L10) such as Nodejs.org, IntelliJ Idea, Veramo.io, Vuejs.org, threejs.org +- [Bush 3D model](https://sketchfab.com/3d-models/lupine-plant-bf30f1110c174d4baedda0ed63778439) +- [Forest floor image](https://www.goodfreephotos.com/albums/textures/leafy-autumn-forest-floor.jpg) +- Time Safari logo assisted by [DALL-E in ChatGPT](https://chat.openai.com/g/g-2fkFE8rbu-dall-e) +- [DiceBear](https://www.dicebear.com/licenses/) and [Avataaars](https://www.dicebear.com/styles/avataaars/#details) for human-looking identicons +- Some gratitude prompts thanks to [Develop Good Habits](https://www.developgoodhabits.com/gratitude-journal-prompts/) diff --git a/TASK_storage.md b/TASK_storage.md index 52b52b76..e0603dee 100644 --- a/TASK_storage.md +++ b/TASK_storage.md @@ -5,33 +5,33 @@ We can't trust iOS IndexedDB to persist. I want to start delivering an app to people now, in preparation for presentations mid-June: Rotary on June 12 and Porcfest on June 17. -* Apple WebKit puts a [7-day cap on IndexedDB](https://webkit.org/blog/10218/full-third-party-cookie-blocking-and-more/). +- Apple WebKit puts a [7-day cap on IndexedDB](https://webkit.org/blog/10218/full-third-party-cookie-blocking-and-more/). - * The web standards expose a `persist` method to mark memory as persistent, and [supposedly WebView supports it](https://developer.mozilla.org/en-US/docs/Web/API/StorageManager/persisted), but too many other things indicate it's not reliable. I've talked with [ChatGPT](https://chatgpt.com/share/68322f40-84c8-8007-b213-855f7962989a) & Venice & Claude (in Cursor); [this answer from Perplexity](https://www.perplexity.ai/search/which-platforms-prompt-the-use-HUQLqy4qQD2cRbkmO4CgHg) says that most platforms don't prompt and Safari doesn't support it; I don't know if that means WebKit as well. + - The web standards expose a `persist` method to mark memory as persistent, and [supposedly WebView supports it](https://developer.mozilla.org/en-US/docs/Web/API/StorageManager/persisted), but too many other things indicate it's not reliable. I've talked with [ChatGPT](https://chatgpt.com/share/68322f40-84c8-8007-b213-855f7962989a) & Venice & Claude (in Cursor); [this answer from Perplexity](https://www.perplexity.ai/search/which-platforms-prompt-the-use-HUQLqy4qQD2cRbkmO4CgHg) says that most platforms don't prompt and Safari doesn't support it; I don't know if that means WebKit as well. -* Capacitor says [not to trust it on iOS](https://capacitorjs.com/docs/v6/guides/storage). +- Capacitor says [not to trust it on iOS](https://capacitorjs.com/docs/v6/guides/storage). Also, with sensitive data, the accounts info should be encrypted. # Options -* There is a community [SQLite plugin for Capacitor](https://github.com/capacitor-community/sqlite) with encryption by [SQLCipher](https://github.com/sqlcipher/sqlcipher). +- There is a community [SQLite plugin for Capacitor](https://github.com/capacitor-community/sqlite) with encryption by [SQLCipher](https://github.com/sqlcipher/sqlcipher). - * [This tutorial](https://jepiqueau.github.io/2023/09/05/Ionic7Vue-SQLite-CRUD-App.html#part-1---web---table-of-contents) shows how that plugin works for web as well as native. + - [This tutorial](https://jepiqueau.github.io/2023/09/05/Ionic7Vue-SQLite-CRUD-App.html#part-1---web---table-of-contents) shows how that plugin works for web as well as native. -* Capacitor abstracts [user preferences in an API](https://capacitorjs.com/docs/apis/preferences), which uses different underlying libraries on iOS & Android. Unfortunately, it won't do any filtering or searching, and is only meant for small amounts of data. (It could be used for settings and for identifiers, but contacts will grow and image blobs won't work.) +- Capacitor abstracts [user preferences in an API](https://capacitorjs.com/docs/apis/preferences), which uses different underlying libraries on iOS & Android. Unfortunately, it won't do any filtering or searching, and is only meant for small amounts of data. (It could be used for settings and for identifiers, but contacts will grow and image blobs won't work.) - * There are hints that Capacitor offers another custom storage API but all I could find was that Preferences API. + - There are hints that Capacitor offers another custom storage API but all I could find was that Preferences API. -* [Ionic Storage](https://ionic.io/docs/secure-storage) is an enterprise solution, which also supports encryption. +- [Ionic Storage](https://ionic.io/docs/secure-storage) is an enterprise solution, which also supports encryption. -* Not an option yet: Dexie may support SQLite in [a future version](https://dexie.org/roadmap/dexie5.0). +- Not an option yet: Dexie may support SQLite in [a future version](https://dexie.org/roadmap/dexie5.0). # Current Plan -* Implement SQLite for Capacitor & web, with encryption. That will allow us to test quickly and keep the same interface for native & web, but we don't deal with migrations for current web users. +- Implement SQLite for Capacitor & web, with encryption. That will allow us to test quickly and keep the same interface for native & web, but we don't deal with migrations for current web users. -* After that is delivered, write a migration for current web users from IndexedDB to SQLite. +- After that is delivered, write a migration for current web users from IndexedDB to SQLite. # Current method calls diff --git a/doc/GLOSSARY.md b/doc/GLOSSARY.md new file mode 100644 index 00000000..d33989bf --- /dev/null +++ b/doc/GLOSSARY.md @@ -0,0 +1,21 @@ +# Glossary + +**T (slot time)** — The local wall-clock time a notification should fire (e.g., 08:00). + +**T–lead** — The moment **`prefetchLeadMinutes`** before **T** when the system *attempts* a **single** background prefetch. T–lead **controls prefetch attempts, not arming**; locals are pre-armed earlier to guarantee closed-app delivery. + +**Rolling window** — Always keep **today's remaining** (and tomorrow if iOS pending caps allow) locals **armed** so the OS can deliver while the app is closed. + +**TTL (time-to-live)** — Maximum allowed payload age **at fire time**. If `T − fetchedAt > ttlSeconds`, we **skip** arming for that T. + +**Shared DB (default)** — The app and plugin open the **same SQLite file**; the app owns schema/migrations, the plugin performs short writes with WAL. + +**WAL (Write-Ahead Logging)** — SQLite journaling mode that permits concurrent reads during writes; recommended for foreground-read + background-write. + +**`PRAGMA user_version`** — An integer the app increments on each migration; the plugin **checks** (does not migrate) to ensure compatibility. + +**Exact alarm (Android)** — Minute-precise alarm via `AlarmManager.setExactAndAllowWhileIdle`, subject to policy and permission. + +**Windowed alarm (Android)** — Batched/inexact alarm via `setWindow(start,len)`; we target **±10 minutes** when exact alarms are unavailable. + +**Start-on-Login** — Electron feature that automatically launches the application when the user logs into their system, enabling background notification scheduling and delivery after system reboot. diff --git a/doc/README-BUILD-GUARD.md b/doc/README-BUILD-GUARD.md index 36f4c21a..f95a823b 100644 --- a/doc/README-BUILD-GUARD.md +++ b/doc/README-BUILD-GUARD.md @@ -330,6 +330,7 @@ Track the effectiveness of your Build Architecture Guard: ## 📝 **Changelog** ### 2025-08-22 - Shell Compatibility Fix + - **Fixed**: Replaced `mapfile` command with portable alternative for cross-shell compatibility - **Impact**: Resolves "mapfile: command not found" errors in pre-commit hooks - **Files**: `scripts/build-arch-guard.sh` diff --git a/doc/README.md b/doc/README.md index 3e876ca0..2d761487 100644 --- a/doc/README.md +++ b/doc/README.md @@ -1,77 +1,11 @@ -# TimeSafari Docs +# TimeSafari — Native-First Notification System (Clean Pack) — 2025-09-07 -## Generating PDF from Markdown on OSx +This pack contains a single-version **Native-First** documentation set with a clear definition of **T–lead** and aligned terminology. -This uses Pandoc and BasicTex (LaTeX) Installed through Homebrew. +**Native-First =** OS-scheduled **background prefetch at T–lead** + **pre-armed one-shot local notifications**. Web-push is retired. -### Set Up +**Included files** -```bash -brew install pandoc - -brew install basictex - -# Setting up LaTex packages - -# First update tlmgr -sudo tlmgr update --self - -# Then install LaTex packages -sudo tlmgr install bbding -sudo tlmgr install enumitem -sudo tlmgr install environ -sudo tlmgr install fancyhdr -sudo tlmgr install framed -sudo tlmgr install import -sudo tlmgr install lastpage # Enables Page X of Y -sudo tlmgr install mdframed -sudo tlmgr install multirow -sudo tlmgr install needspace -sudo tlmgr install ntheorem -sudo tlmgr install tabu -sudo tlmgr install tcolorbox -sudo tlmgr install textpos -sudo tlmgr install titlesec -sudo tlmgr install titling # Required for the fancy headers used -sudo tlmgr install threeparttable -sudo tlmgr install trimspaces -sudo tlmgr install tocloft # Required for \tableofcontents generation -sudo tlmgr install varwidth -sudo tlmgr install wrapfig - -# Install fonts -sudo tlmgr install cmbright -sudo tlmgr install collection-fontsrecommended # And set up fonts -sudo tlmgr install fira -sudo tlmgr install fontaxes -sudo tlmgr install libertine # The main font the doc uses -sudo tlmgr install opensans -sudo tlmgr install sourceserifpro - -``` - -#### References - -The following guide was adapted to this project except that we install with Brew and have a few more packages. - -Guide: <https://daniel.feldroy.com/posts/setting-up-latex-on-mac-os-x> - -### Usage - -Use the `pandoc` command to generate a PDF. - -```bash -pandoc usage-guide.md -o usage-guide.pdf -``` - -And you can open the PDF with the `open` command. - -```bash -open usage-guide.pdf -``` - -Or use this one-liner - -```bash -pandoc usage-guide.md -o usage-guide.pdf && open usage-guide.pdf -``` +- `notification-system.md` (merged comprehensive guide) +- `web-push-cleanup-guide.md` (cleanup instructions) +- `GLOSSARY.md` (definitions incl. **T** and **T–lead**) diff --git a/doc/WORKER_ONLY_DATABASE_IMPLEMENTATION.md b/doc/WORKER_ONLY_DATABASE_IMPLEMENTATION.md index 7ec0d22f..3ae5bde7 100644 --- a/doc/WORKER_ONLY_DATABASE_IMPLEMENTATION.md +++ b/doc/WORKER_ONLY_DATABASE_IMPLEMENTATION.md @@ -117,25 +117,25 @@ async function getDatabaseService() { ## Files Modified -1. **src/interfaces/worker-messages.ts** *(NEW)* +1. **src/interfaces/worker-messages.ts** _(NEW)_ - Type definitions for worker communication - Request and response message interfaces -2. **src/registerSQLWorker.js** *(MAJOR REWRITE)* +2. **src/registerSQLWorker.js** _(MAJOR REWRITE)_ - Message-based operation handling - **Fixed circular dependency with lazy loading** - Proper error handling and response formatting -3. **src/services/platforms/WebPlatformService.ts** *(MAJOR REWRITE)* +3. **src/services/platforms/WebPlatformService.ts** _(MAJOR REWRITE)_ - Worker-only database access - Message sending and response handling - Timeout and error management -4. **src/main.web.ts** *(SIMPLIFIED)* +4. **src/main.web.ts** _(SIMPLIFIED)_ - Removed duplicate worker creation - Simplified initialization flow -5. **WORKER_ONLY_DATABASE_IMPLEMENTATION.md** *(NEW)* +5. **WORKER_ONLY_DATABASE_IMPLEMENTATION.md** _(NEW)_ - Complete documentation of changes ## Benefits diff --git a/doc/android-asset-validation.md b/doc/android-asset-validation.md index db77aeb8..647a3f97 100644 --- a/doc/android-asset-validation.md +++ b/doc/android-asset-validation.md @@ -11,12 +11,14 @@ The Android Asset Validation System automatically detects and fixes missing Andr ## Problem Solved Previously, Android builds would fail with errors like: + ``` error: resource drawable/splash (aka app.timesafari.app:drawable/splash) not found. error: resource mipmap/ic_launcher (aka app.timesafari.app:mipmap/ic_launcher) not found. ``` This happened when: + - Source assets existed but weren't generated into Android resources - Android resource directories were missing - Asset generation tools weren't run before building @@ -45,16 +47,19 @@ npm run build:android:studio ### What Gets Validated #### Source Assets (Required) + - `resources/icon.png` - App icon source - `resources/splash.png` - Splash screen source - `resources/splash_dark.png` - Dark mode splash source #### Android Resources (Generated) + - `android/app/src/main/res/drawable/splash.png` - Splash screen drawable - `android/app/src/main/res/mipmap-*/ic_launcher.png` - App icons for all densities - `android/app/src/main/res/mipmap-*/ic_launcher_round.png` - Round app icons for all densities ### Density Levels Checked + - `mipmap-mdpi` (1x) - `mipmap-hdpi` (1.5x) - `mipmap-xhdpi` (2x) @@ -64,6 +69,7 @@ npm run build:android:studio ## Usage ### Automatic Validation (Recommended) + The validation runs automatically during all Android builds: ```bash @@ -78,6 +84,7 @@ npm run build:android:debug ``` ### Manual Validation + Run validation only to check/fix assets: ```bash @@ -89,6 +96,7 @@ npm run assets:validate:android ``` ### Validation Only (No Regeneration) + Check configuration without fixing: ```bash @@ -98,6 +106,7 @@ npm run assets:validate ## Error Handling ### Missing Source Assets + If source assets are missing, the build fails with clear error messages: ``` @@ -108,6 +117,7 @@ If source assets are missing, the build fails with clear error messages: ``` ### Missing Generated Resources + If generated resources are missing, they're automatically regenerated: ``` @@ -119,6 +129,7 @@ If generated resources are missing, they're automatically regenerated: ``` ### Generation Failure + If regeneration fails, helpful guidance is provided: ``` @@ -131,6 +142,7 @@ If regeneration fails, helpful guidance is provided: ## Integration Points ### Build Script Integration + The validation is integrated into the main build process: ```bash @@ -143,6 +155,7 @@ validate_android_assets || { ``` ### NPM Scripts + New npm scripts for asset management: ```json @@ -156,17 +169,20 @@ New npm scripts for asset management: ## Benefits ### For Developers + - **No More Build Failures**: Automatic detection and fixing of missing resources - **Faster Development**: No need to manually run asset generation tools - **Clear Error Messages**: Helpful guidance when issues occur - **Consistent Results**: Same validation on all development machines ### For CI/CD + - **Reliable Builds**: Consistent asset validation across environments - **Early Detection**: Catches issues before they reach production - **Automated Fixes**: Self-healing builds when possible ### For Project Maintenance + - **Reduced Support**: Fewer "build doesn't work" issues - **Documentation**: Clear requirements for required assets - **Standardization**: Consistent asset structure across the project @@ -176,21 +192,27 @@ New npm scripts for asset management: ### Common Issues #### "No assets found in the asset path" + This occurs when the `assets/` directory is empty. The validation system automatically copies source assets and regenerates them. #### "Failed to generate Android assets" + Check that: + - Source assets exist in `resources/` - `@capacitor/assets` is installed - You have write permissions to the Android directories #### "Asset generation completed but some resources are still missing" + This indicates a problem with the asset generation tool. Try: + 1. Running `npm install` to ensure dependencies are up to date 2. Manually running `npx @capacitor/assets generate` 3. Checking the asset generation logs for specific errors ### Manual Recovery + If automatic regeneration fails, you can manually create the missing resources: ```bash @@ -213,12 +235,14 @@ rm assets/icon.png assets/splash.png assets/splash_dark.png ## Future Enhancements ### Planned Improvements + - **iOS Asset Validation**: Extend validation to iOS assets - **Asset Quality Checks**: Validate image dimensions and formats - **Performance Optimization**: Cache validation results - **CI/CD Integration**: Add validation to GitHub Actions ### Configuration Options + - **Custom Asset Paths**: Support for different asset directory structures - **Validation Rules**: Configurable validation requirements - **Skip Options**: Ability to skip validation for specific scenarios diff --git a/doc/architecture-decisions.md b/doc/architecture-decisions.md index 11861b8f..561f5fd1 100644 --- a/doc/architecture-decisions.md +++ b/doc/architecture-decisions.md @@ -122,4 +122,4 @@ export default class HomeView extends Vue { --- -*This decision was made based on the current codebase architecture and team expertise. The mixin approach provides the best balance of performance, developer experience, and architectural consistency for the TimeSafari application.* +_This decision was made based on the current codebase architecture and team expertise. The mixin approach provides the best balance of performance, developer experience, and architectural consistency for the TimeSafari application._ diff --git a/doc/error-diagnostics-log.md b/doc/error-diagnostics-log.md index 78763433..68f01e0b 100644 --- a/doc/error-diagnostics-log.md +++ b/doc/error-diagnostics-log.md @@ -92,5 +92,5 @@ Multiple stack traces showing Vue router navigation and component mounting cycle 3. Address API/server issues in separate debugging session --- -*Log Entry by: Migration Assistant* -*Session: ProjectsView.vue Triple Migration Pattern* +_Log Entry by: Migration Assistant_ +_Session: ProjectsView.vue Triple Migration Pattern_ diff --git a/doc/meta_rule_usage_guide.md b/doc/meta_rule_usage_guide.md index 3b2a8251..2e50456d 100644 --- a/doc/meta_rule_usage_guide.md +++ b/doc/meta_rule_usage_guide.md @@ -32,6 +32,7 @@ you apply 1-3 meta-rules that automatically include everything you need. ### **Step 1: Always Start with Core Always-On** **Every single interaction** starts with: + ``` meta_core_always_on.mdc ``` @@ -65,12 +66,14 @@ meta_core_always_on + meta_research + meta_bug_diagnosis **Important**: Meta-rules represent **workflow phases**, not a rigid sequence. You can: ### **Jump Between Phases Freely** + - **Start with diagnosis** if you already know the problem - **Go back to research** if your fix reveals new issues - **Switch to planning** mid-implementation if scope changes - **Document at any phase** - not just at the end ### **Mode Switching by Invoking Meta-Rules** + Each meta-rule invocation **automatically switches your workflow mode**: ``` @@ -80,11 +83,13 @@ Planning Mode → Invoke @meta_feature_implementation → Implementation Mode ``` ### **Phase Constraints, Not Sequence Constraints** + - **Within each phase**: Clear constraints on what you can/cannot do - **Between phases**: Complete freedom to move as needed - **No forced order**: Choose the phase that matches your current need ### **Example of Flexible Workflow** + ``` 1. Start with @meta_research (investigation mode) 2. Jump to @meta_bug_diagnosis (diagnosis mode) @@ -103,16 +108,19 @@ Planning Mode → Invoke @meta_feature_implementation → Implementation Mode **Scenario**: User reports that the contact list isn't loading properly **Initial Meta-Rule Selection**: + ``` meta_core_always_on + meta_research + meta_bug_diagnosis ``` **What This Gives You**: + - **Core Always-On**: Human competence focus, time standards, context - **Research**: Systematic investigation methodology, evidence collection - **Bug Diagnosis**: Defect analysis framework, root cause identification **Flexible Workflow**: + 1. Apply core always-on for foundation 2. Use research meta-rule for systematic investigation 3. Switch to bug diagnosis when you have enough evidence @@ -125,16 +133,19 @@ meta_core_always_on + meta_research + meta_bug_diagnosis **Scenario**: Building a new contact search feature **Meta-Rule Selection**: + ``` meta_core_always_on + meta_feature_planning + meta_feature_implementation ``` **What This Gives You**: + - **Core Always-On**: Foundation principles and context - **Feature Planning**: Requirements analysis, architecture planning - **Feature Implementation**: Development workflow, testing strategy **Iterative Workflow**: + 1. Start with core always-on 2. Use feature planning for design and requirements 3. Switch to feature implementation for coding and testing @@ -147,15 +158,18 @@ meta_core_always_on + meta_feature_planning + meta_feature_implementation **Scenario**: Writing a migration guide for the new database system **Meta-Rule Selection**: + ``` meta_core_always_on + meta_documentation ``` **What This Gives You**: + - **Core Always-On**: Foundation and context - **Documentation**: Educational focus, templates, quality standards **Parallel Workflow**: + 1. Apply core always-on for foundation 2. Use documentation meta-rule for educational content creation 3. **Can research** while documenting if you need more information @@ -198,27 +212,35 @@ Each meta-rule includes success criteria. Use these to validate your work: ## Common Meta-Rule Combinations ### **Research + Diagnosis** + ``` meta_core_always_on + meta_research + meta_bug_diagnosis ``` + **Use for**: Complex bug investigations requiring systematic analysis ### **Planning + Implementation** + ``` meta_core_always_on + meta_feature_planning + meta_feature_implementation ``` + **Use for**: End-to-end feature development from concept to deployment ### **Research + Planning** + ``` meta_core_always_on + meta_research + meta_feature_planning ``` + **Use for**: Feasibility research and solution design ### **Documentation + Context** + ``` meta_core_always_on + meta_documentation + [context-specific] ``` + **Use for**: Creating comprehensive, educational documentation ## Best Practices diff --git a/doc/notification-system.md b/doc/notification-system.md new file mode 100644 index 00000000..fa34c543 --- /dev/null +++ b/doc/notification-system.md @@ -0,0 +1,231 @@ +# TimeSafari — Native-First Notification System + +**Status:** Ready for implementation +**Date:** 2025-09-07 +**Author:** Matthew Raymer + +--- + +## Executive Summary + +Ship a **single, Native-First** notification system: OS-scheduled **background prefetch at T–lead** + **pre-armed** local notifications. Web-push is retired. + +### What we deliver + +- **Closed-app delivery:** Pre-armed locals fire even if the app is closed. +- **Freshness:** One prefetch attempt per slot at **T–lead**; ETag/TTL controls; skip when stale. +- **Android precision:** Exact alarms with permission; windowed fallback (±10m) otherwise. +- **Resilience:** Re-arm after reboot/time-change (Android receivers; iOS on next wake/silent push). +- **Cross-platform:** Same TS API (iOS/Android/Electron). Electron is best-effort while running. + +### Success signals + +- High delivery reliability, minute-precision on Android with permission. +- Prefetch budget hit rate at **T–lead**; zero stale deliveries beyond TTL. + +--- + +## Strategic Plan + +### Goal + +Deliver 1..M daily notifications with **OS background prefetch at T–lead** and **rolling-window safety** so messages display with fresh content even when the app is closed. + +### Tenets + +- **Reliability first:** OS delivers once scheduled; no JS at delivery time. +- **Freshness with guardrails:** Prefetch at **T–lead**; enforce **TTL-at-fire**; ETag-aware. +- **Single system:** One TS API; native adapters swap under the hood. +- **Platform honesty:** Android exactness via permission; iOS best-effort budget. + +### Architecture (high level) + +App (Vue/TS) → Orchestrator (policy) → Native Adapters: + +- **SchedulerNative** — AlarmManager (Android) / UNUserNotificationCenter (iOS) +- **BackgroundPrefetchNative** — WorkManager (Android) / BGTaskScheduler (+ silent push) (iOS) +- **DataStore** — SQLite + +**Storage (single shared DB):** The app and the native plugin will use **the same SQLite database file**. The app owns schema/migrations; the plugin opens the same file with WAL enabled and performs short, serialized writes. This keeps one source of truth for payloads, delivery logs, and config. + +### SQLite Ownership & Concurrency + +* **One DB file:** The plugin opens the **same path** the app uses (no second DB). +* **Migrations owned by app:** The app executes schema migrations and bumps `PRAGMA user_version`. The plugin **never** migrates; it **asserts** the expected version. +* **WAL mode:** Open DB with `journal_mode=WAL`, `synchronous=NORMAL`, `busy_timeout=5000`, `foreign_keys=ON`. WAL allows foreground reads while a background job commits quickly. +* **Single-writer discipline:** Background jobs write in **short transactions** (UPSERT per slot), then return. +* **Encryption (optional):** If using SQLCipher, the **same key** is used by both app and plugin. Do not mix encrypted and unencrypted openings. + +### Scheduling & T–lead + +- **Arm** a rolling window (today + tomorrow within iOS cap). +- **Attempt** a single **online-first** fetch per slot at **T–lead = T − prefetchLeadMinutes**. +- If prefetch is skipped, the armed local **still fires** using cached content. + +### Policies + +- **TTL-at-fire:** If (T − fetchedAt) > `ttlSeconds` → **skip** arming. +- **Android exactness:** Request `SCHEDULE_EXACT_ALARM`; fallback **±10m** window. +- **Reboot/time change:** Android receivers re-arm next 24h; iOS on next wake/silent push. +- **No delivery-time mutation:** iOS locals cannot be mutated by NSE; render before scheduling. + +--- + +## Implementation Guide + +### 1) Interfaces (TS stable) + +- **SchedulerNative**: `scheduleExact({slotId, whenMs, title, body, extra})`, `scheduleWindow(..., windowLenMs)`, `cancelBySlot`, `rescheduleAll`, `capabilities()` +- **BackgroundPrefetchNative**: `schedulePrefetch(slotId, atMs)`, `cancelPrefetch(slotId)` +- **DataStore**: SQLite adapters (notif_contents, notif_deliveries, notif_config) +- **Public API**: `configure`, `requestPermissions`, `runFullPipelineNow`, `reschedule`, `getState` + +### DB Path & Adapter Configuration + +* **Configure option:** `dbPath: string` (absolute path or platform alias) is passed from JS to the plugin during `configure()`. +* **Shared tables:** + + * `notif_contents(slot_id, payload_json, fetched_at, etag, …)` + * `notif_deliveries(slot_id, fire_at, delivered_at, status, error_code, …)` + * `notif_config(k, v)` +* **Open settings:** + + * `journal_mode=WAL` + * `synchronous=NORMAL` + * `busy_timeout=5000` + * `foreign_keys=ON` + +**Type (TS) extension** + +```ts +export type ConfigureOptions = { + // …existing fields… + dbPath: string; // shared DB file the plugin will open + storage: 'shared'; // canonical value; plugin-owned DB is not used +}; +``` + +**Plugin side (pseudo)** + +```kotlin +// Android open +val db = SQLiteDatabase.openDatabase(dbPath, null, SQLiteDatabase.OPEN_READWRITE) +db.execSQL("PRAGMA journal_mode=WAL") +db.execSQL("PRAGMA synchronous=NORMAL") +db.execSQL("PRAGMA foreign_keys=ON") +db.execSQL("PRAGMA busy_timeout=5000") +// Verify schema version +val uv = rawQuery("PRAGMA user_version").use { it.moveToFirst(); it.getInt(0) } +require(uv >= MIN_EXPECTED_VERSION) { "Schema version too old" } +``` + +```swift +// iOS open (FMDB / SQLite3) +// Set WAL via PRAGMA after open; check user_version the same way. +``` + +### 2) Templating & Arming + +- Render `title/body` **before** scheduling; pass via **SchedulerNative**. +- Route all arming through **SchedulerNative** to centralize Android exact/window semantics. + +### 3) T–lead (single attempt) + +**T–lead governs prefetch, not arming.** We **arm** one-shot locals as part of the rolling window so closed-app delivery is guaranteed. At **T–lead = T − prefetchLeadMinutes**, the **native background job** attempts **one** 12s ETag-aware fetch. If fresh content arrives and will not violate **TTL-at-fire**, we (re)arm the upcoming slot; if the OS skips the wake, the pre-armed local still fires with cached content. + +- Compute T–lead = `whenMs - prefetchLeadMinutes*60_000`. +- `BackgroundPrefetchNative.schedulePrefetch(slotId, atMs=T–lead)`. +- On wake: **ETag** fetch (timeout **12s**), persist, optionally cancel & re-arm if within TTL. +- Never fetch at delivery time. + +### 4) TTL-at-fire + +**TTL-at-fire:** Before arming for time **T**, compute `T − fetchedAt`. If that exceeds `ttlSeconds`, **do not arm** (skip). This prevents posting stale notifications when the app has been closed for a long time. + +`if (whenMs - fetchedAt) > ttlSeconds*1000 → skip` + +### 5) Android specifics + +- Request `SCHEDULE_EXACT_ALARM`; deep-link if denied; fallback to `setWindow(start,len)` (±10m). +- Receivers: `BOOT_COMPLETED`, `TIMEZONE_CHANGED`, `TIME_SET` → recompute & re-arm for next 24h and schedule T–lead prefetch. + +### 6) iOS specifics + +- `BGTaskScheduler` for T–lead prefetch (best-effort). Optional silent push nudge. +- Locals: `UNCalendarNotificationTrigger` (one-shots); no NSE mutation for locals. + +### 7) Network & Timeouts + +- Content fetch: **12s** timeout; single attempt at T–lead; ETag/304 respected. +- ACK/Error: **8s** timeout, fire-and-forget. + +### 8) Electron + +- Notifications while app is running; recommend **Start-on-Login**. No true background scheduling when fully closed. + +### 9) Telemetry + +- Record `scheduled|shown|error`; ACK deliveries (8s timeout); include slot/times/TZ/app version. + +--- + +## Capability Matrix + +| Capability | Android (Native) | iOS (Native) | Electron | Web | +|---|---|---|---|---| +| Multi-daily locals (closed app) | ✅ | ✅ | ✅ (app running) | — | +| Prefetch at T–lead (app closed) | ✅ WorkManager | ⚠️ BGTask (best-effort) | ✅ (app running) | — | +| Re-arm after reboot/time-change | ✅ Receivers | ⚠️ On next wake/silent push | ✅ Start-on-Login | — | +| Minute-precision alarms | ✅ with exact permission | ❌ not guaranteed | ✅ timer best-effort | — | +| Delivery-time mutation for locals | ❌ | ❌ | — | — | +| ETag/TTL enforcement | ✅ | ✅ | ✅ | — | +| Rolling-window safety | ✅ | ✅ | ✅ | — | + +--- + +## Acceptance Criteria + +### Core + +- **Closed-app delivery:** Armed locals fire at T with last rendered content. No delivery-time network. +- **T–lead prefetch:** Single background attempt at **T–lead**; if skipped, delivery still occurs from cache. +- **TTL-at-fire:** No armed local violates TTL at T. + +### Android + +- **Exact permission path:** With `SCHEDULE_EXACT_ALARM` → within ±1m; else **±10m** window. +- **Reboot recovery:** After reboot, receivers re-arm next 24h and schedule T–lead prefetch. +- **TZ/DST change:** Recompute & re-arm; future slots align to new wall-clock. + +### iOS + +- **BGTask budget respected:** Prefetch often runs but may be skipped; delivery still occurs via rolling window. +- **Force-quit caveat:** No background execution after user terminate; delivery still occurs if pre-armed. + +### Electron + +- **Running-app rule:** Delivery only while app runs; with Start-on-Login, after reboot the orchestrator re-arms and subsequent slots deliver. + +### Network + +- Content fetch timeout **12s**; ACK/Error **8s**; no retries inside lead; ETag honored. + +### Observability + +- Log/telemetry for `scheduled|shown|error`; ACK payload includes slot, times, device TZ, app version. + +### DB Sharing + +* **Shared DB visibility:** A background prefetch writes `notif_contents`; the foreground UI **immediately** reads the same row. +* **WAL overlap:** With the app reading while the plugin commits, no user-visible blocking occurs. +* **Version safety:** If `user_version` is behind, the plugin emits an error and does not write (protects against partial installs). + +--- + +## Web-Push Cleanup + +Web-push functionality has been retired due to unreliability. All web-push related code paths and documentation sections should be removed or marked as deprecated. See `web-push-cleanup-guide.md` for detailed cleanup steps. + +--- + +_This document consolidates the Native-First notification system strategy, implementation details, capabilities, and acceptance criteria into a single comprehensive reference._ diff --git a/doc/web-push-cleanup-guide.md b/doc/web-push-cleanup-guide.md new file mode 100644 index 00000000..e6b5470f --- /dev/null +++ b/doc/web-push-cleanup-guide.md @@ -0,0 +1,551 @@ +# TimeSafari Web-Push Cleanup Guide + +**Status:** 🚀 Native-First Implementation +**Date:** 2025-01-27T14:30Z (UTC) +**Author:** Matthew Raymer +**Scope:** Web-push code cleanup and deprecation +**Goal:** Remove or quarantine all web-push code paths and mark as deprecated. + +--- + +## Executive Summary + +This document provides a comprehensive cleanup guide for removing web-push code +paths from TimeSafari. Web-push has been retired for unreliability, and the +system now focuses on native mobile reliability with Electron best-effort support. + +--- + +## Cleanup Strategy + +### Phase 1: Identify Web-Push Code Paths + +#### Service Worker Files + +- [ ] `sw_scripts/notification-click.js` - Mark as deprecated +- [ ] `sw_scripts/` directory - Review for web-push dependencies +- [ ] Service worker registration code - Remove or quarantine + +#### Web-Specific Code + +- [ ] Web push notification handlers +- [ ] Service worker event listeners +- [ ] Web notification API usage +- [ ] Push subscription management + +#### Configuration Files + +- [ ] VitePWA plugin configuration +- [ ] Service worker build configuration +- [ ] Web push manifest files + +### Phase 2: Mark as Deprecated + +#### Code Comments + +```javascript +// DEPRECATED: Web-push notification handling +// This code is kept for reference but not used in production +// Replaced by Native-First notification system +``` + +#### Documentation Updates + +- [ ] Mark web-push sections as deprecated +- [ ] Add deprecation notices +- [ ] Update README files +- [ ] Update API documentation + +### Phase 3: Remove or Quarantine + +#### Complete Removal + +- [ ] Web push subscription code +- [ ] Service worker notification handlers +- [ ] Web-specific notification APIs +- [ ] Push message handling + +#### Quarantine (Keep for Reference) + +- [ ] Service worker registration code +- [ ] Web push configuration +- [ ] Historical web-push tests + +--- + +## Detailed Cleanup Tasks + +### 1. Service Worker Cleanup + +#### Files to Deprecate + +**`sw_scripts/notification-click.js`** + +```javascript +// DEPRECATED: Service worker notification handling +// This code is kept for reference but not used in production +// Replaced by Native-First notification system + +// Original web-push notification click handler +self.addEventListener('notificationclick', (event) => { + // DEPRECATED: Web-push only + event.notification.close(); + + const slotId = event.notification.data?.slotId; + const route = slotId ? '/#/daily' : '/#/notifications'; + + event.waitUntil( + clients.openWindow(route).catch(() => { + return clients.openWindow('/'); + }) + ); +}); +``` + +**Service Worker Registration** + +```javascript +// DEPRECATED: Service worker registration +// This code is kept for reference but not used in production +// Replaced by Native-First notification system + +if ('serviceWorker' in navigator && process.env.VITE_PLATFORM === 'web') { + // DEPRECATED: Web-push only + navigator.serviceWorker.register('/sw.js') + .then(registration => { + console.log('Service Worker registered:', registration); + }) + .catch(error => { + console.error('Service Worker registration failed:', error); + }); +} +``` + +### 2. Web Push API Cleanup + +#### Push Subscription Management + +```javascript +// DEPRECATED: Web push subscription management +// This code is kept for reference but not used in production +// Replaced by Native-First notification system + +class WebPushManager { + // DEPRECATED: Web-push only + async subscribeToPush() { + // Implementation kept for reference + } + + // DEPRECATED: Web-push only + async unsubscribeFromPush() { + // Implementation kept for reference + } +} +``` + +#### Push Message Handling + +```javascript +// DEPRECATED: Push message handling +// This code is kept for reference but not used in production +// Replaced by Native-First notification system + +self.addEventListener('push', (event) => { + // DEPRECATED: Web-push only + const data = event.data ? event.data.json() : {}; + + const options = { + body: data.body, + icon: '/icon-192x192.png', + badge: '/badge-72x72.png', + data: data + }; + + event.waitUntil( + self.registration.showNotification(data.title, options) + ); +}); +``` + +### 3. Configuration Cleanup + +#### VitePWA Plugin Configuration + +```javascript +// DEPRECATED: VitePWA plugin configuration +// This configuration is kept for reference but not used in production +// Replaced by Native-First notification system + +import { VitePWA } from 'vite-plugin-pwa' + +export default defineConfig({ + plugins: [ + VitePWA({ + // DEPRECATED: Web-push only + registerType: 'autoUpdate', + workbox: { + globPatterns: ['**/*.{js,css,html,ico,png,svg}'] + }, + includeAssets: ['favicon.ico', 'apple-touch-icon.png', 'masked-icon.svg'], + manifest: { + name: 'TimeSafari', + short_name: 'TimeSafari', + description: 'TimeSafari App', + theme_color: '#ffffff', + icons: [ + { + src: 'pwa-192x192.png', + sizes: '192x192', + type: 'image/png' + } + ] + } + }) + ] +}) +``` + +#### Service Worker Build Configuration + +```javascript +// DEPRECATED: Service worker build configuration +// This configuration is kept for reference but not used in production +// Replaced by Native-First notification system + +export default defineConfig({ + build: { + rollupOptions: { + input: { + // DEPRECATED: Web-push only + sw: 'sw_scripts/notification-click.js' + } + } + } +}) +``` + +### 4. Test Cleanup + +#### Web Push Tests + +```javascript +// DEPRECATED: Web push tests +// These tests are kept for reference but not used in production +// Replaced by Native-First notification system + +describe('Web Push Notifications (DEPRECATED)', () => { + // DEPRECATED: Web-push only + it('should handle push notifications', async () => { + // Test implementation kept for reference + }); + + // DEPRECATED: Web-push only + it('should handle notification clicks', async () => { + // Test implementation kept for reference + }); +}); +``` + +#### Service Worker Tests + +```javascript +// DEPRECATED: Service worker tests +// These tests are kept for reference but not used in production +// Replaced by Native-First notification system + +describe('Service Worker (DEPRECATED)', () => { + // DEPRECATED: Web-push only + it('should register service worker', async () => { + // Test implementation kept for reference + }); + + // DEPRECATED: Web-push only + it('should handle push events', async () => { + // Test implementation kept for reference + }); +}); +``` + +### 5. Documentation Cleanup + +#### README Updates + +```markdown +# TimeSafari Native-First Notification System + +## Web-Push Status: DEPRECATED + +Web-push has been retired for unreliability. The system now focuses on native mobile reliability with Electron best-effort support. + +### Deprecated Features +- ❌ Web push notifications +- ❌ Service worker notification handling +- ❌ Web notification API + +### Active Features +- ✅ Native mobile notifications (Android/iOS) +- ✅ Electron notifications (best-effort) +- ✅ OS-scheduled background prefetch +- ✅ Rolling window safety +``` + +#### API Documentation Updates + +```markdown +## Notification API (Native-First) + +### Deprecated Methods +- `subscribeToPush()` - DEPRECATED: Web-push only +- `unsubscribeFromPush()` - DEPRECATED: Web-push only +- `handlePushMessage()` - DEPRECATED: Web-push only + +### Active Methods +- `scheduleExact()` - Native exact scheduling +- `scheduleWindow()` - Native windowed scheduling +- `schedulePrefetch()` - Native background prefetch +``` + +--- + +## File-by-File Cleanup Checklist + +### Service Worker Files + +- [ ] `sw_scripts/notification-click.js` - Mark as deprecated +- [ ] `sw_scripts/` directory - Review for web-push dependencies +- [ ] Service worker build configuration - Remove or quarantine + +### Web-Specific Code + +- [ ] `src/main.web.ts` - Remove service worker registration +- [ ] `src/services/webPush.ts` - Mark as deprecated +- [ ] `src/utils/serviceWorker.ts` - Mark as deprecated +- [ ] Web notification API usage - Remove or quarantine + +### Configuration Files + +- [ ] `vite.config.web.mts` - Remove VitePWA plugin +- [ ] `package.json` - Remove web-push dependencies +- [ ] `public/manifest.json` - Mark as deprecated +- [ ] Service worker build scripts - Remove or quarantine + +### Test Files + +- [ ] `test-playwright/web-push.spec.ts` - Mark as deprecated +- [ ] `test/services/webPush.test.ts` - Mark as deprecated +- [ ] Service worker tests - Mark as deprecated + +### Documentation Files + +- [ ] `README.md` - Update to reflect native-first approach +- [ ] `doc/web-push.md` - Mark as deprecated +- [ ] API documentation - Remove web-push references + +--- + +## Dependencies to Remove + +### NPM Packages + +```json +{ + "dependencies": { + // DEPRECATED: Web-push only + "web-push": "^7.4.0", + "vite-plugin-pwa": "^0.17.0" + }, + "devDependencies": { + // DEPRECATED: Web-push only + "workbox-webpack-plugin": "^6.5.0" + } +} +``` + +### Build Scripts + +```json +{ + "scripts": { + // DEPRECATED: Web-push only + "build:sw": "workbox generateSW", + "test:sw": "jest --testPathPattern=serviceWorker" + } +} +``` + +--- + +## Migration Guide + +### From Web-Push to Native-First + +#### Step 1: Remove Web-Push Dependencies + +```bash +# Remove web-push packages +npm uninstall web-push vite-plugin-pwa workbox-webpack-plugin + +# Remove service worker files +rm -rf sw_scripts/ +rm -f public/sw.js +rm -f public/workbox-*.js +``` + +#### Step 2: Update Configuration + +```javascript +// Remove VitePWA plugin from vite.config.web.mts +export default defineConfig({ + plugins: [ + // Remove VitePWA plugin + // VitePWA({ ... }) + ] +}) +``` + +#### Step 3: Update Service Registration + +```javascript +// Remove service worker registration from main.web.ts +// if ('serviceWorker' in navigator) { +// navigator.serviceWorker.register('/sw.js') +// } +``` + +#### Step 4: Update Tests + +```javascript +// Remove web-push tests +// describe('Web Push Notifications', () => { ... }) +``` + +--- + +## Verification Checklist + +### Code Removal Verification + +- [ ] No web-push imports remain +- [ ] No service worker registration code +- [ ] No push subscription management +- [ ] No web notification API usage +- [ ] No VitePWA plugin configuration + +### Documentation Verification + +- [ ] All web-push references marked as deprecated +- [ ] README updated to reflect native-first approach +- [ ] API documentation updated +- [ ] Test documentation updated + +### Build Verification + +- [ ] Web build succeeds without service worker +- [ ] No service worker files generated +- [ ] No web-push dependencies in bundle +- [ ] Native builds work correctly + +### Test Verification + +- [ ] Web-push tests are marked as deprecated +- [ ] Native notification tests pass +- [ ] No web-push test failures +- [ ] Test suite runs successfully + +--- + +## Rollback Plan + +### Emergency Rollback + +If native-first implementation fails, web-push code can be restored: + +#### 1. **Restore Dependencies** + +```bash +npm install web-push vite-plugin-pwa workbox-webpack-plugin +``` + +#### 2. **Restore Service Worker Files** + +```bash +git checkout HEAD~1 -- sw_scripts/ +git checkout HEAD~1 -- public/sw.js +``` + +#### 3. **Restore Configuration** + +```bash +git checkout HEAD~1 -- vite.config.web.mts +git checkout HEAD~1 -- package.json +``` + +#### 4. **Restore Tests** + +```bash +git checkout HEAD~1 -- test-playwright/web-push.spec.ts +git checkout HEAD~1 -- test/services/webPush.test.ts +``` + +### Rollback Verification + +- [ ] Web-push functionality restored +- [ ] Service worker registration works +- [ ] Push notifications work +- [ ] Tests pass + +--- + +## Post-Cleanup Tasks + +### Code Review + +- [ ] Review all changes for completeness +- [ ] Verify no web-push code remains +- [ ] Check for orphaned references +- [ ] Validate native-first implementation + +### Testing + +- [ ] Run full test suite +- [ ] Verify native notifications work +- [ ] Check Electron functionality +- [ ] Validate mobile builds + +### Documentation + +- [ ] Update all documentation +- [ ] Remove web-push references +- [ ] Update API documentation +- [ ] Update user guides + +--- + +## Success Criteria + +### Complete Web-Push Removal + +- [ ] All web-push code marked as deprecated +- [ ] Service worker files quarantined +- [ ] Dependencies removed +- [ ] Configuration updated + +### Native-First Implementation + +- [ ] Native notifications work on Android +- [ ] Native notifications work on iOS +- [ ] Electron notifications work +- [ ] Background prefetch works + +### Documentation Updated + +- [ ] All docs reflect native-first approach +- [ ] Web-push marked as deprecated +- [ ] Migration guide provided +- [ ] Rollback plan documented + +--- + +_This cleanup guide provides comprehensive instructions for removing web-push +code paths from TimeSafari. Web-push has been retired for unreliability, and the +system now focuses on native mobile reliability with Electron best-effort support._ diff --git a/doc/z-index-guide.md b/doc/z-index-guide.md index 49a5733a..a65a880c 100644 --- a/doc/z-index-guide.md +++ b/doc/z-index-guide.md @@ -5,12 +5,15 @@ **Status**: 🎯 **ACTIVE** - Z-index layering standards ## Objective + Establish consistent z-index values across the TimeSafari application to ensure proper layering of UI elements. ## Result + This document defines the z-index hierarchy for all UI components. ## Use/Run + Reference these values when implementing new components or modifying existing ones to maintain consistent layering. ## Z-Index Hierarchy @@ -51,7 +54,7 @@ Reference these values when implementing new components or modifying existing on ## Collaboration Hooks - **Reviewers**: Frontend team, UI/UX designers -- **Sign-off checklist**: +- **Sign-off checklist**: - [ ] All new components follow z-index guidelines - [ ] Existing components updated to use defined values - [ ] Cross-browser testing completed diff --git a/package.json b/package.json index 9ca11deb..98d3adc5 100644 --- a/package.json +++ b/package.json @@ -136,7 +136,6 @@ "*.{js,ts,vue,css,json,yml,yaml}": "eslint --fix || true", "*.{md,markdown,mdc}": "markdownlint-cli2 --fix" }, - "dependencies": { "@capacitor-community/electron": "^5.0.1", "@capacitor-community/sqlite": "6.0.2",