From 8a7afc8a00680a4d5f0b6779137164c629e5a438 Mon Sep 17 00:00:00 2001 From: Your Name Date: Tue, 30 Sep 2025 16:39:51 +0800 Subject: [PATCH] chore: initial commit with CI pipeline, review and tasks docs --- .gemini/commands/analyze.toml | 105 +++ .gemini/commands/clarify.toml | 162 ++++ .gemini/commands/constitution.toml | 77 ++ .gemini/commands/implement.toml | 60 ++ .gemini/commands/plan.toml | 47 ++ .gemini/commands/specify.toml | 25 + .gemini/commands/tasks.toml | 66 ++ .specify/memory/constitution.md | 30 + .specify/scripts/bash/check-prerequisites.sh | 166 ++++ .specify/scripts/bash/common.sh | 113 +++ .specify/scripts/bash/create-new-feature.sh | 97 +++ .specify/scripts/bash/setup-plan.sh | 60 ++ .specify/scripts/bash/update-agent-context.sh | 719 ++++++++++++++++++ .specify/templates/agent-file-template.md | 23 + .specify/templates/plan-template.md | 219 ++++++ .specify/templates/spec-template.md | 116 +++ .specify/templates/tasks-template.md | 127 ++++ docs/PRD.md | 132 ++++ docs/api.md | 99 +++ docs/architecture.md | 64 ++ docs/data-model.md | 93 +++ docs/tech-choices.md | 35 + docs/test-plan.md | 37 + pom.xml | 113 +++ specs/001-activity-management/plan.md | 86 +++ specs/001-activity-management/spec.md | 33 + specs/001-activity-management/tasks.md | 38 + specs/002-data-analytics/plan.md | 52 ++ specs/002-data-analytics/spec.md | 28 + specs/002-data-analytics/tasks.md | 34 + specs/003-user-experience/plan.md | 54 ++ specs/003-user-experience/spec.md | 29 + specs/003-user-experience/tasks.md | 35 + specs/004-system-integration/plan.md | 51 ++ specs/004-system-integration/spec.md | 32 + specs/004-system-integration/tasks.md | 32 + .../mosquito/project/MosquitoApplication.java | 18 + .../controller/ActivityController.java | 59 ++ .../project/controller/ApiKeyController.java | 37 + .../com/mosquito/project/domain/Activity.java | 81 ++ .../com/mosquito/project/domain/ApiKey.java | 50 ++ .../project/domain/DailyActivityStats.java | 70 ++ .../project/domain/LeaderboardEntry.java | 40 + .../project/domain/MultiLevelRewardRule.java | 22 + .../com/mosquito/project/domain/Reward.java | 45 ++ .../mosquito/project/domain/RewardMode.java | 7 + .../mosquito/project/domain/RewardTier.java | 20 + .../mosquito/project/domain/RewardType.java | 6 + .../com/mosquito/project/domain/User.java | 27 + .../project/dto/ActivityGraphResponse.java | 82 ++ .../project/dto/ActivityStatsResponse.java | 76 ++ .../project/dto/CreateActivityRequest.java | 44 ++ .../project/dto/CreateApiKeyRequest.java | 30 + .../project/dto/CreateApiKeyResponse.java | 15 + .../project/dto/UpdateActivityRequest.java | 44 ++ .../exception/ActivityNotFoundException.java | 11 + .../exception/ApiKeyNotFoundException.java | 11 + .../exception/FileUploadException.java | 7 + .../InvalidActivityDataException.java | 7 + ...UserNotAuthorizedForActivityException.java | 7 + .../project/job/StatisticsAggregationJob.java | 57 ++ .../project/service/ActivityService.java | 259 +++++++ src/main/resources/application.properties | 2 + .../migration/V1__Create_activities_table.sql | 12 + .../V2__Create_activity_rewards_table.sql | 12 + ..._Create_multi_level_reward_rules_table.sql | 8 + .../migration/V4__Create_api_keys_table.sql | 11 + .../V5__Create_daily_activity_stats_table.sql | 11 + .../project/SchemaVerificationTest.java | 63 ++ .../config/EmbeddedRedisConfiguration.java | 35 + .../controller/ActivityControllerTest.java | 141 ++++ .../controller/ApiKeyControllerTest.java | 83 ++ .../job/StatisticsAggregationJobTest.java | 51 ++ .../service/ActivityServiceCacheTest.java | 52 ++ .../project/service/ActivityServiceTest.java | 178 +++++ src/test/resources/application.properties | 11 + 76 files changed, 5091 insertions(+) create mode 100644 .gemini/commands/analyze.toml create mode 100644 .gemini/commands/clarify.toml create mode 100644 .gemini/commands/constitution.toml create mode 100644 .gemini/commands/implement.toml create mode 100644 .gemini/commands/plan.toml create mode 100644 .gemini/commands/specify.toml create mode 100644 .gemini/commands/tasks.toml create mode 100644 .specify/memory/constitution.md create mode 100755 .specify/scripts/bash/check-prerequisites.sh create mode 100755 .specify/scripts/bash/common.sh create mode 100755 .specify/scripts/bash/create-new-feature.sh create mode 100755 .specify/scripts/bash/setup-plan.sh create mode 100755 .specify/scripts/bash/update-agent-context.sh create mode 100644 .specify/templates/agent-file-template.md create mode 100644 .specify/templates/plan-template.md create mode 100644 .specify/templates/spec-template.md create mode 100644 .specify/templates/tasks-template.md create mode 100644 docs/PRD.md create mode 100644 docs/api.md create mode 100644 docs/architecture.md create mode 100644 docs/data-model.md create mode 100644 docs/tech-choices.md create mode 100644 docs/test-plan.md create mode 100644 pom.xml create mode 100644 specs/001-activity-management/plan.md create mode 100644 specs/001-activity-management/spec.md create mode 100644 specs/001-activity-management/tasks.md create mode 100644 specs/002-data-analytics/plan.md create mode 100644 specs/002-data-analytics/spec.md create mode 100644 specs/002-data-analytics/tasks.md create mode 100644 specs/003-user-experience/plan.md create mode 100644 specs/003-user-experience/spec.md create mode 100644 specs/003-user-experience/tasks.md create mode 100644 specs/004-system-integration/plan.md create mode 100644 specs/004-system-integration/spec.md create mode 100644 specs/004-system-integration/tasks.md create mode 100644 src/main/java/com/mosquito/project/MosquitoApplication.java create mode 100644 src/main/java/com/mosquito/project/controller/ActivityController.java create mode 100644 src/main/java/com/mosquito/project/controller/ApiKeyController.java create mode 100644 src/main/java/com/mosquito/project/domain/Activity.java create mode 100644 src/main/java/com/mosquito/project/domain/ApiKey.java create mode 100644 src/main/java/com/mosquito/project/domain/DailyActivityStats.java create mode 100644 src/main/java/com/mosquito/project/domain/LeaderboardEntry.java create mode 100644 src/main/java/com/mosquito/project/domain/MultiLevelRewardRule.java create mode 100644 src/main/java/com/mosquito/project/domain/Reward.java create mode 100644 src/main/java/com/mosquito/project/domain/RewardMode.java create mode 100644 src/main/java/com/mosquito/project/domain/RewardTier.java create mode 100644 src/main/java/com/mosquito/project/domain/RewardType.java create mode 100644 src/main/java/com/mosquito/project/domain/User.java create mode 100644 src/main/java/com/mosquito/project/dto/ActivityGraphResponse.java create mode 100644 src/main/java/com/mosquito/project/dto/ActivityStatsResponse.java create mode 100644 src/main/java/com/mosquito/project/dto/CreateActivityRequest.java create mode 100644 src/main/java/com/mosquito/project/dto/CreateApiKeyRequest.java create mode 100644 src/main/java/com/mosquito/project/dto/CreateApiKeyResponse.java create mode 100644 src/main/java/com/mosquito/project/dto/UpdateActivityRequest.java create mode 100644 src/main/java/com/mosquito/project/exception/ActivityNotFoundException.java create mode 100644 src/main/java/com/mosquito/project/exception/ApiKeyNotFoundException.java create mode 100644 src/main/java/com/mosquito/project/exception/FileUploadException.java create mode 100644 src/main/java/com/mosquito/project/exception/InvalidActivityDataException.java create mode 100644 src/main/java/com/mosquito/project/exception/UserNotAuthorizedForActivityException.java create mode 100644 src/main/java/com/mosquito/project/job/StatisticsAggregationJob.java create mode 100644 src/main/java/com/mosquito/project/service/ActivityService.java create mode 100644 src/main/resources/application.properties create mode 100644 src/main/resources/db/migration/V1__Create_activities_table.sql create mode 100644 src/main/resources/db/migration/V2__Create_activity_rewards_table.sql create mode 100644 src/main/resources/db/migration/V3__Create_multi_level_reward_rules_table.sql create mode 100644 src/main/resources/db/migration/V4__Create_api_keys_table.sql create mode 100644 src/main/resources/db/migration/V5__Create_daily_activity_stats_table.sql create mode 100644 src/test/java/com/mosquito/project/SchemaVerificationTest.java create mode 100644 src/test/java/com/mosquito/project/config/EmbeddedRedisConfiguration.java create mode 100644 src/test/java/com/mosquito/project/controller/ActivityControllerTest.java create mode 100644 src/test/java/com/mosquito/project/controller/ApiKeyControllerTest.java create mode 100644 src/test/java/com/mosquito/project/job/StatisticsAggregationJobTest.java create mode 100644 src/test/java/com/mosquito/project/service/ActivityServiceCacheTest.java create mode 100644 src/test/java/com/mosquito/project/service/ActivityServiceTest.java create mode 100644 src/test/resources/application.properties diff --git a/.gemini/commands/analyze.toml b/.gemini/commands/analyze.toml new file mode 100644 index 0000000..8ab2837 --- /dev/null +++ b/.gemini/commands/analyze.toml @@ -0,0 +1,105 @@ +description = "Perform a non-destructive cross-artifact consistency and quality analysis across spec.md, plan.md, and tasks.md after task generation." + +prompt = """ +--- +description: Perform a non-destructive cross-artifact consistency and quality analysis across spec.md, plan.md, and tasks.md after task generation. +--- + +The user input to you can be provided directly by the agent or as a command argument - you **MUST** consider it before proceeding with the prompt (if not empty). + +User input: + +$ARGUMENTS + +Goal: Identify inconsistencies, duplications, ambiguities, and underspecified items across the three core artifacts (`spec.md`, `plan.md`, `tasks.md`) before implementation. This command MUST run only after `/tasks` has successfully produced a complete `tasks.md`. + +STRICTLY READ-ONLY: Do **not** modify any files. Output a structured analysis report. Offer an optional remediation plan (user must explicitly approve before any follow-up editing commands would be invoked manually). + +Constitution Authority: The project constitution (`.specify/memory/constitution.md`) is **non-negotiable** within this analysis scope. Constitution conflicts are automatically CRITICAL and require adjustment of the spec, plan, or tasks—not dilution, reinterpretation, or silent ignoring of the principle. If a principle itself needs to change, that must occur in a separate, explicit constitution update outside `/analyze`. + +Execution steps: + +1. Run `.specify/scripts/bash/check-prerequisites.sh --json --require-tasks --include-tasks` once from repo root and parse JSON for FEATURE_DIR and AVAILABLE_DOCS. Derive absolute paths: + - SPEC = FEATURE_DIR/spec.md + - PLAN = FEATURE_DIR/plan.md + - TASKS = FEATURE_DIR/tasks.md + Abort with an error message if any required file is missing (instruct the user to run missing prerequisite command). + +2. Load artifacts: + - Parse spec.md sections: Overview/Context, Functional Requirements, Non-Functional Requirements, User Stories, Edge Cases (if present). + - Parse plan.md: Architecture/stack choices, Data Model references, Phases, Technical constraints. + - Parse tasks.md: Task IDs, descriptions, phase grouping, parallel markers [P], referenced file paths. + - Load constitution `.specify/memory/constitution.md` for principle validation. + +3. Build internal semantic models: + - Requirements inventory: Each functional + non-functional requirement with a stable key (derive slug based on imperative phrase; e.g., "User can upload file" -> `user-can-upload-file`). + - User story/action inventory. + - Task coverage mapping: Map each task to one or more requirements or stories (inference by keyword / explicit reference patterns like IDs or key phrases). + - Constitution rule set: Extract principle names and any MUST/SHOULD normative statements. + +4. Detection passes: + A. Duplication detection: + - Identify near-duplicate requirements. Mark lower-quality phrasing for consolidation. + B. Ambiguity detection: + - Flag vague adjectives (fast, scalable, secure, intuitive, robust) lacking measurable criteria. + - Flag unresolved placeholders (TODO, TKTK, ???, , etc.). + C. Underspecification: + - Requirements with verbs but missing object or measurable outcome. + - User stories missing acceptance criteria alignment. + - Tasks referencing files or components not defined in spec/plan. + D. Constitution alignment: + - Any requirement or plan element conflicting with a MUST principle. + - Missing mandated sections or quality gates from constitution. + E. Coverage gaps: + - Requirements with zero associated tasks. + - Tasks with no mapped requirement/story. + - Non-functional requirements not reflected in tasks (e.g., performance, security). + F. Inconsistency: + - Terminology drift (same concept named differently across files). + - Data entities referenced in plan but absent in spec (or vice versa). + - Task ordering contradictions (e.g., integration tasks before foundational setup tasks without dependency note). + - Conflicting requirements (e.g., one requires to use Next.js while other says to use Vue as the framework). + +5. Severity assignment heuristic: + - CRITICAL: Violates constitution MUST, missing core spec artifact, or requirement with zero coverage that blocks baseline functionality. + - HIGH: Duplicate or conflicting requirement, ambiguous security/performance attribute, untestable acceptance criterion. + - MEDIUM: Terminology drift, missing non-functional task coverage, underspecified edge case. + - LOW: Style/wording improvements, minor redundancy not affecting execution order. + +6. Produce a Markdown report (no file writes) with sections: + + ### Specification Analysis Report + | ID | Category | Severity | Location(s) | Summary | Recommendation | + |----|----------|----------|-------------|---------|----------------| + | A1 | Duplication | HIGH | spec.md:L120-134 | Two similar requirements ... | Merge phrasing; keep clearer version | + (Add one row per finding; generate stable IDs prefixed by category initial.) + + Additional subsections: + - Coverage Summary Table: + | Requirement Key | Has Task? | Task IDs | Notes | + - Constitution Alignment Issues (if any) + - Unmapped Tasks (if any) + - Metrics: + * Total Requirements + * Total Tasks + * Coverage % (requirements with >=1 task) + * Ambiguity Count + * Duplication Count + * Critical Issues Count + +7. At end of report, output a concise Next Actions block: + - If CRITICAL issues exist: Recommend resolving before `/implement`. + - If only LOW/MEDIUM: User may proceed, but provide improvement suggestions. + - Provide explicit command suggestions: e.g., "Run /specify with refinement", "Run /plan to adjust architecture", "Manually edit tasks.md to add coverage for 'performance-metrics'". + +8. Ask the user: "Would you like me to suggest concrete remediation edits for the top N issues?" (Do NOT apply them automatically.) + +Behavior rules: +- NEVER modify files. +- NEVER hallucinate missing sections—if absent, report them. +- KEEP findings deterministic: if rerun without changes, produce consistent IDs and counts. +- LIMIT total findings in the main table to 50; aggregate remainder in a summarized overflow note. +- If zero issues found, emit a success report with coverage statistics and proceed recommendation. + +Context: {{args}} +""" diff --git a/.gemini/commands/clarify.toml b/.gemini/commands/clarify.toml new file mode 100644 index 0000000..3fd7790 --- /dev/null +++ b/.gemini/commands/clarify.toml @@ -0,0 +1,162 @@ +description = "Identify underspecified areas in the current feature spec by asking up to 5 highly targeted clarification questions and encoding answers back into the spec." + +prompt = """ +--- +description: Identify underspecified areas in the current feature spec by asking up to 5 highly targeted clarification questions and encoding answers back into the spec. +--- + +The user input to you can be provided directly by the agent or as a command argument - you **MUST** consider it before proceeding with the prompt (if not empty). + +User input: + +$ARGUMENTS + +Goal: Detect and reduce ambiguity or missing decision points in the active feature specification and record the clarifications directly in the spec file. + +Note: This clarification workflow is expected to run (and be completed) BEFORE invoking `/plan`. If the user explicitly states they are skipping clarification (e.g., exploratory spike), you may proceed, but must warn that downstream rework risk increases. + +Execution steps: + +1. Run `.specify/scripts/bash/check-prerequisites.sh --json --paths-only` from repo root **once** (combined `--json --paths-only` mode / `-Json -PathsOnly`). Parse minimal JSON payload fields: + - `FEATURE_DIR` + - `FEATURE_SPEC` + - (Optionally capture `IMPL_PLAN`, `TASKS` for future chained flows.) + - If JSON parsing fails, abort and instruct user to re-run `/specify` or verify feature branch environment. + +2. Load the current spec file. Perform a structured ambiguity & coverage scan using this taxonomy. For each category, mark status: Clear / Partial / Missing. Produce an internal coverage map used for prioritization (do not output raw map unless no questions will be asked). + + Functional Scope & Behavior: + - Core user goals & success criteria + - Explicit out-of-scope declarations + - User roles / personas differentiation + + Domain & Data Model: + - Entities, attributes, relationships + - Identity & uniqueness rules + - Lifecycle/state transitions + - Data volume / scale assumptions + + Interaction & UX Flow: + - Critical user journeys / sequences + - Error/empty/loading states + - Accessibility or localization notes + + Non-Functional Quality Attributes: + - Performance (latency, throughput targets) + - Scalability (horizontal/vertical, limits) + - Reliability & availability (uptime, recovery expectations) + - Observability (logging, metrics, tracing signals) + - Security & privacy (authN/Z, data protection, threat assumptions) + - Compliance / regulatory constraints (if any) + + Integration & External Dependencies: + - External services/APIs and failure modes + - Data import/export formats + - Protocol/versioning assumptions + + Edge Cases & Failure Handling: + - Negative scenarios + - Rate limiting / throttling + - Conflict resolution (e.g., concurrent edits) + + Constraints & Tradeoffs: + - Technical constraints (language, storage, hosting) + - Explicit tradeoffs or rejected alternatives + + Terminology & Consistency: + - Canonical glossary terms + - Avoided synonyms / deprecated terms + + Completion Signals: + - Acceptance criteria testability + - Measurable Definition of Done style indicators + + Misc / Placeholders: + - TODO markers / unresolved decisions + - Ambiguous adjectives ("robust", "intuitive") lacking quantification + + For each category with Partial or Missing status, add a candidate question opportunity unless: + - Clarification would not materially change implementation or validation strategy + - Information is better deferred to planning phase (note internally) + +3. Generate (internally) a prioritized queue of candidate clarification questions (maximum 5). Do NOT output them all at once. Apply these constraints: + - Maximum of 5 total questions across the whole session. + - Each question must be answerable with EITHER: + * A short multiple‑choice selection (2–5 distinct, mutually exclusive options), OR + * A one-word / short‑phrase answer (explicitly constrain: "Answer in <=5 words"). + - Only include questions whose answers materially impact architecture, data modeling, task decomposition, test design, UX behavior, operational readiness, or compliance validation. + - Ensure category coverage balance: attempt to cover the highest impact unresolved categories first; avoid asking two low-impact questions when a single high-impact area (e.g., security posture) is unresolved. + - Exclude questions already answered, trivial stylistic preferences, or plan-level execution details (unless blocking correctness). + - Favor clarifications that reduce downstream rework risk or prevent misaligned acceptance tests. + - If more than 5 categories remain unresolved, select the top 5 by (Impact * Uncertainty) heuristic. + +4. Sequential questioning loop (interactive): + - Present EXACTLY ONE question at a time. + - For multiple‑choice questions render options as a Markdown table: + + | Option | Description | + |--------|-------------| + | A |