From 4bad021be5269cfaeb2931d544f8090a61cf589b Mon Sep 17 00:00:00 2001 From: hanqin Date: Wed, 15 Apr 2026 13:35:13 +0800 Subject: [PATCH 1/5] =?UTF-8?q?feat:=20=E4=BB=BB=E5=8A=A1=E7=B3=BB?= =?UTF-8?q?=E7=BB=9F=E6=94=B9=E7=89=88=20-=20=E6=94=B6=E9=9B=86=E4=B8=8E?= =?UTF-8?q?=E7=8B=A9=E7=8C=8E=E4=BB=BB=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 后端:MissionType 改为 Collection/Hunting,DailyMissionDto 添加任务类型、难度、进度字段 - 后端:添加任务进度更新 API (POST /mission/progress/update) - 后端:MissionProgressService 添加自动匹配目标类型更新进度逻辑 - 前端:DailyMissionView 改为卡片布局展示 - 前端:收集任务绿色边框,狩猎任务红色系边框(按难度区分) - 前端:炼狱难度使用 ElectricBorder 特殊效果 --- .claude/skills/gitnexus/gitnexus-cli/SKILL.md | 82 +++ .../gitnexus/gitnexus-debugging/SKILL.md | 89 +++ .../gitnexus/gitnexus-exploring/SKILL.md | 78 +++ .../skills/gitnexus/gitnexus-guide/SKILL.md | 64 +++ .../gitnexus-impact-analysis/SKILL.md | 97 ++++ .../gitnexus/gitnexus-refactoring/SKILL.md | 121 ++++ .gitignore | 1 + AGENTS.md | 102 ++++ .../Frontend/.env.development | 2 +- .../Controllers/MissionController.cs | 31 +- Build_God_Api/Build_God_Api/DB/Mission.cs | 10 +- .../Build_God_Api/Dto/MissionDtos.cs | 14 + .../Services/DailyMissionService.cs | 39 +- .../Services/MissionProgressService.cs | 83 +++ Build_God_Game/.env.development | 2 +- Build_God_Game/src/api/dailyMission.ts | 38 ++ Build_God_Game/src/views/DailyMissionView.vue | 536 +++++++++--------- CLAUDE.md | 101 ++++ .../2026-04-15-mission-system-redesign.md | 134 +++++ 19 files changed, 1352 insertions(+), 272 deletions(-) create mode 100644 .claude/skills/gitnexus/gitnexus-cli/SKILL.md create mode 100644 .claude/skills/gitnexus/gitnexus-debugging/SKILL.md create mode 100644 .claude/skills/gitnexus/gitnexus-exploring/SKILL.md create mode 100644 .claude/skills/gitnexus/gitnexus-guide/SKILL.md create mode 100644 .claude/skills/gitnexus/gitnexus-impact-analysis/SKILL.md create mode 100644 .claude/skills/gitnexus/gitnexus-refactoring/SKILL.md create mode 100644 .gitignore create mode 100644 CLAUDE.md create mode 100644 docs/superpowers/specs/2026-04-15-mission-system-redesign.md diff --git a/.claude/skills/gitnexus/gitnexus-cli/SKILL.md b/.claude/skills/gitnexus/gitnexus-cli/SKILL.md new file mode 100644 index 0000000..c9e0af3 --- /dev/null +++ b/.claude/skills/gitnexus/gitnexus-cli/SKILL.md @@ -0,0 +1,82 @@ +--- +name: gitnexus-cli +description: "Use when the user needs to run GitNexus CLI commands like analyze/index a repo, check status, clean the index, generate a wiki, or list indexed repos. Examples: \"Index this repo\", \"Reanalyze the codebase\", \"Generate a wiki\"" +--- + +# GitNexus CLI Commands + +All commands work via `npx` — no global install required. + +## Commands + +### analyze — Build or refresh the index + +```bash +npx gitnexus analyze +``` + +Run from the project root. This parses all source files, builds the knowledge graph, writes it to `.gitnexus/`, and generates CLAUDE.md / AGENTS.md context files. + +| Flag | Effect | +| -------------- | ---------------------------------------------------------------- | +| `--force` | Force full re-index even if up to date | +| `--embeddings` | Enable embedding generation for semantic search (off by default) | + +**When to run:** First time in a project, after major code changes, or when `gitnexus://repo/{name}/context` reports the index is stale. In Claude Code, a PostToolUse hook runs `analyze` automatically after `git commit` and `git merge`, preserving embeddings if previously generated. + +### status — Check index freshness + +```bash +npx gitnexus status +``` + +Shows whether the current repo has a GitNexus index, when it was last updated, and symbol/relationship counts. Use this to check if re-indexing is needed. + +### clean — Delete the index + +```bash +npx gitnexus clean +``` + +Deletes the `.gitnexus/` directory and unregisters the repo from the global registry. Use before re-indexing if the index is corrupt or after removing GitNexus from a project. + +| Flag | Effect | +| --------- | ------------------------------------------------- | +| `--force` | Skip confirmation prompt | +| `--all` | Clean all indexed repos, not just the current one | + +### wiki — Generate documentation from the graph + +```bash +npx gitnexus wiki +``` + +Generates repository documentation from the knowledge graph using an LLM. Requires an API key (saved to `~/.gitnexus/config.json` on first use). + +| Flag | Effect | +| ------------------- | ----------------------------------------- | +| `--force` | Force full regeneration | +| `--model ` | LLM model (default: minimax/minimax-m2.5) | +| `--base-url ` | LLM API base URL | +| `--api-key ` | LLM API key | +| `--concurrency ` | Parallel LLM calls (default: 3) | +| `--gist` | Publish wiki as a public GitHub Gist | + +### list — Show all indexed repos + +```bash +npx gitnexus list +``` + +Lists all repositories registered in `~/.gitnexus/registry.json`. The MCP `list_repos` tool provides the same information. + +## After Indexing + +1. **Read `gitnexus://repo/{name}/context`** to verify the index loaded +2. Use the other GitNexus skills (`exploring`, `debugging`, `impact-analysis`, `refactoring`) for your task + +## Troubleshooting + +- **"Not inside a git repository"**: Run from a directory inside a git repo +- **Index is stale after re-analyzing**: Restart Claude Code to reload the MCP server +- **Embeddings slow**: Omit `--embeddings` (it's off by default) or set `OPENAI_API_KEY` for faster API-based embedding diff --git a/.claude/skills/gitnexus/gitnexus-debugging/SKILL.md b/.claude/skills/gitnexus/gitnexus-debugging/SKILL.md new file mode 100644 index 0000000..9510b97 --- /dev/null +++ b/.claude/skills/gitnexus/gitnexus-debugging/SKILL.md @@ -0,0 +1,89 @@ +--- +name: gitnexus-debugging +description: "Use when the user is debugging a bug, tracing an error, or asking why something fails. Examples: \"Why is X failing?\", \"Where does this error come from?\", \"Trace this bug\"" +--- + +# Debugging with GitNexus + +## When to Use + +- "Why is this function failing?" +- "Trace where this error comes from" +- "Who calls this method?" +- "This endpoint returns 500" +- Investigating bugs, errors, or unexpected behavior + +## Workflow + +``` +1. gitnexus_query({query: ""}) → Find related execution flows +2. gitnexus_context({name: ""}) → See callers/callees/processes +3. READ gitnexus://repo/{name}/process/{name} → Trace execution flow +4. gitnexus_cypher({query: "MATCH path..."}) → Custom traces if needed +``` + +> If "Index is stale" → run `npx gitnexus analyze` in terminal. + +## Checklist + +``` +- [ ] Understand the symptom (error message, unexpected behavior) +- [ ] gitnexus_query for error text or related code +- [ ] Identify the suspect function from returned processes +- [ ] gitnexus_context to see callers and callees +- [ ] Trace execution flow via process resource if applicable +- [ ] gitnexus_cypher for custom call chain traces if needed +- [ ] Read source files to confirm root cause +``` + +## Debugging Patterns + +| Symptom | GitNexus Approach | +| -------------------- | ---------------------------------------------------------- | +| Error message | `gitnexus_query` for error text → `context` on throw sites | +| Wrong return value | `context` on the function → trace callees for data flow | +| Intermittent failure | `context` → look for external calls, async deps | +| Performance issue | `context` → find symbols with many callers (hot paths) | +| Recent regression | `detect_changes` to see what your changes affect | + +## Tools + +**gitnexus_query** — find code related to error: + +``` +gitnexus_query({query: "payment validation error"}) +→ Processes: CheckoutFlow, ErrorHandling +→ Symbols: validatePayment, handlePaymentError, PaymentException +``` + +**gitnexus_context** — full context for a suspect: + +``` +gitnexus_context({name: "validatePayment"}) +→ Incoming calls: processCheckout, webhookHandler +→ Outgoing calls: verifyCard, fetchRates (external API!) +→ Processes: CheckoutFlow (step 3/7) +``` + +**gitnexus_cypher** — custom call chain traces: + +```cypher +MATCH path = (a)-[:CodeRelation {type: 'CALLS'}*1..2]->(b:Function {name: "validatePayment"}) +RETURN [n IN nodes(path) | n.name] AS chain +``` + +## Example: "Payment endpoint returns 500 intermittently" + +``` +1. gitnexus_query({query: "payment error handling"}) + → Processes: CheckoutFlow, ErrorHandling + → Symbols: validatePayment, handlePaymentError + +2. gitnexus_context({name: "validatePayment"}) + → Outgoing calls: verifyCard, fetchRates (external API!) + +3. READ gitnexus://repo/my-app/process/CheckoutFlow + → Step 3: validatePayment → calls fetchRates (external) + +4. Root cause: fetchRates calls external API without proper timeout +``` diff --git a/.claude/skills/gitnexus/gitnexus-exploring/SKILL.md b/.claude/skills/gitnexus/gitnexus-exploring/SKILL.md new file mode 100644 index 0000000..927a4e4 --- /dev/null +++ b/.claude/skills/gitnexus/gitnexus-exploring/SKILL.md @@ -0,0 +1,78 @@ +--- +name: gitnexus-exploring +description: "Use when the user asks how code works, wants to understand architecture, trace execution flows, or explore unfamiliar parts of the codebase. Examples: \"How does X work?\", \"What calls this function?\", \"Show me the auth flow\"" +--- + +# Exploring Codebases with GitNexus + +## When to Use + +- "How does authentication work?" +- "What's the project structure?" +- "Show me the main components" +- "Where is the database logic?" +- Understanding code you haven't seen before + +## Workflow + +``` +1. READ gitnexus://repos → Discover indexed repos +2. READ gitnexus://repo/{name}/context → Codebase overview, check staleness +3. gitnexus_query({query: ""}) → Find related execution flows +4. gitnexus_context({name: ""}) → Deep dive on specific symbol +5. READ gitnexus://repo/{name}/process/{name} → Trace full execution flow +``` + +> If step 2 says "Index is stale" → run `npx gitnexus analyze` in terminal. + +## Checklist + +``` +- [ ] READ gitnexus://repo/{name}/context +- [ ] gitnexus_query for the concept you want to understand +- [ ] Review returned processes (execution flows) +- [ ] gitnexus_context on key symbols for callers/callees +- [ ] READ process resource for full execution traces +- [ ] Read source files for implementation details +``` + +## Resources + +| Resource | What you get | +| --------------------------------------- | ------------------------------------------------------- | +| `gitnexus://repo/{name}/context` | Stats, staleness warning (~150 tokens) | +| `gitnexus://repo/{name}/clusters` | All functional areas with cohesion scores (~300 tokens) | +| `gitnexus://repo/{name}/cluster/{name}` | Area members with file paths (~500 tokens) | +| `gitnexus://repo/{name}/process/{name}` | Step-by-step execution trace (~200 tokens) | + +## Tools + +**gitnexus_query** — find execution flows related to a concept: + +``` +gitnexus_query({query: "payment processing"}) +→ Processes: CheckoutFlow, RefundFlow, WebhookHandler +→ Symbols grouped by flow with file locations +``` + +**gitnexus_context** — 360-degree view of a symbol: + +``` +gitnexus_context({name: "validateUser"}) +→ Incoming calls: loginHandler, apiMiddleware +→ Outgoing calls: checkToken, getUserById +→ Processes: LoginFlow (step 2/5), TokenRefresh (step 1/3) +``` + +## Example: "How does payment processing work?" + +``` +1. READ gitnexus://repo/my-app/context → 918 symbols, 45 processes +2. gitnexus_query({query: "payment processing"}) + → CheckoutFlow: processPayment → validateCard → chargeStripe + → RefundFlow: initiateRefund → calculateRefund → processRefund +3. gitnexus_context({name: "processPayment"}) + → Incoming: checkoutHandler, webhookHandler + → Outgoing: validateCard, chargeStripe, saveTransaction +4. Read src/payments/processor.ts for implementation details +``` diff --git a/.claude/skills/gitnexus/gitnexus-guide/SKILL.md b/.claude/skills/gitnexus/gitnexus-guide/SKILL.md new file mode 100644 index 0000000..937ac73 --- /dev/null +++ b/.claude/skills/gitnexus/gitnexus-guide/SKILL.md @@ -0,0 +1,64 @@ +--- +name: gitnexus-guide +description: "Use when the user asks about GitNexus itself — available tools, how to query the knowledge graph, MCP resources, graph schema, or workflow reference. Examples: \"What GitNexus tools are available?\", \"How do I use GitNexus?\"" +--- + +# GitNexus Guide + +Quick reference for all GitNexus MCP tools, resources, and the knowledge graph schema. + +## Always Start Here + +For any task involving code understanding, debugging, impact analysis, or refactoring: + +1. **Read `gitnexus://repo/{name}/context`** — codebase overview + check index freshness +2. **Match your task to a skill below** and **read that skill file** +3. **Follow the skill's workflow and checklist** + +> If step 1 warns the index is stale, run `npx gitnexus analyze` in the terminal first. + +## Skills + +| Task | Skill to read | +| -------------------------------------------- | ------------------- | +| Understand architecture / "How does X work?" | `gitnexus-exploring` | +| Blast radius / "What breaks if I change X?" | `gitnexus-impact-analysis` | +| Trace bugs / "Why is X failing?" | `gitnexus-debugging` | +| Rename / extract / split / refactor | `gitnexus-refactoring` | +| Tools, resources, schema reference | `gitnexus-guide` (this file) | +| Index, status, clean, wiki CLI commands | `gitnexus-cli` | + +## Tools Reference + +| Tool | What it gives you | +| ---------------- | ------------------------------------------------------------------------ | +| `query` | Process-grouped code intelligence — execution flows related to a concept | +| `context` | 360-degree symbol view — categorized refs, processes it participates in | +| `impact` | Symbol blast radius — what breaks at depth 1/2/3 with confidence | +| `detect_changes` | Git-diff impact — what do your current changes affect | +| `rename` | Multi-file coordinated rename with confidence-tagged edits | +| `cypher` | Raw graph queries (read `gitnexus://repo/{name}/schema` first) | +| `list_repos` | Discover indexed repos | + +## Resources Reference + +Lightweight reads (~100-500 tokens) for navigation: + +| Resource | Content | +| ---------------------------------------------- | ----------------------------------------- | +| `gitnexus://repo/{name}/context` | Stats, staleness check | +| `gitnexus://repo/{name}/clusters` | All functional areas with cohesion scores | +| `gitnexus://repo/{name}/cluster/{clusterName}` | Area members | +| `gitnexus://repo/{name}/processes` | All execution flows | +| `gitnexus://repo/{name}/process/{processName}` | Step-by-step trace | +| `gitnexus://repo/{name}/schema` | Graph schema for Cypher | + +## Graph Schema + +**Nodes:** File, Function, Class, Interface, Method, Community, Process +**Edges (via CodeRelation.type):** CALLS, IMPORTS, EXTENDS, IMPLEMENTS, DEFINES, MEMBER_OF, STEP_IN_PROCESS + +```cypher +MATCH (caller)-[:CodeRelation {type: 'CALLS'}]->(f:Function {name: "myFunc"}) +RETURN caller.name, caller.filePath +``` diff --git a/.claude/skills/gitnexus/gitnexus-impact-analysis/SKILL.md b/.claude/skills/gitnexus/gitnexus-impact-analysis/SKILL.md new file mode 100644 index 0000000..e19af28 --- /dev/null +++ b/.claude/skills/gitnexus/gitnexus-impact-analysis/SKILL.md @@ -0,0 +1,97 @@ +--- +name: gitnexus-impact-analysis +description: "Use when the user wants to know what will break if they change something, or needs safety analysis before editing code. Examples: \"Is it safe to change X?\", \"What depends on this?\", \"What will break?\"" +--- + +# Impact Analysis with GitNexus + +## When to Use + +- "Is it safe to change this function?" +- "What will break if I modify X?" +- "Show me the blast radius" +- "Who uses this code?" +- Before making non-trivial code changes +- Before committing — to understand what your changes affect + +## Workflow + +``` +1. gitnexus_impact({target: "X", direction: "upstream"}) → What depends on this +2. READ gitnexus://repo/{name}/processes → Check affected execution flows +3. gitnexus_detect_changes() → Map current git changes to affected flows +4. Assess risk and report to user +``` + +> If "Index is stale" → run `npx gitnexus analyze` in terminal. + +## Checklist + +``` +- [ ] gitnexus_impact({target, direction: "upstream"}) to find dependents +- [ ] Review d=1 items first (these WILL BREAK) +- [ ] Check high-confidence (>0.8) dependencies +- [ ] READ processes to check affected execution flows +- [ ] gitnexus_detect_changes() for pre-commit check +- [ ] Assess risk level and report to user +``` + +## Understanding Output + +| Depth | Risk Level | Meaning | +| ----- | ---------------- | ------------------------ | +| d=1 | **WILL BREAK** | Direct callers/importers | +| d=2 | LIKELY AFFECTED | Indirect dependencies | +| d=3 | MAY NEED TESTING | Transitive effects | + +## Risk Assessment + +| Affected | Risk | +| ------------------------------ | -------- | +| <5 symbols, few processes | LOW | +| 5-15 symbols, 2-5 processes | MEDIUM | +| >15 symbols or many processes | HIGH | +| Critical path (auth, payments) | CRITICAL | + +## Tools + +**gitnexus_impact** — the primary tool for symbol blast radius: + +``` +gitnexus_impact({ + target: "validateUser", + direction: "upstream", + minConfidence: 0.8, + maxDepth: 3 +}) + +→ d=1 (WILL BREAK): + - loginHandler (src/auth/login.ts:42) [CALLS, 100%] + - apiMiddleware (src/api/middleware.ts:15) [CALLS, 100%] + +→ d=2 (LIKELY AFFECTED): + - authRouter (src/routes/auth.ts:22) [CALLS, 95%] +``` + +**gitnexus_detect_changes** — git-diff based impact analysis: + +``` +gitnexus_detect_changes({scope: "staged"}) + +→ Changed: 5 symbols in 3 files +→ Affected: LoginFlow, TokenRefresh, APIMiddlewarePipeline +→ Risk: MEDIUM +``` + +## Example: "What breaks if I change validateUser?" + +``` +1. gitnexus_impact({target: "validateUser", direction: "upstream"}) + → d=1: loginHandler, apiMiddleware (WILL BREAK) + → d=2: authRouter, sessionManager (LIKELY AFFECTED) + +2. READ gitnexus://repo/my-app/processes + → LoginFlow and TokenRefresh touch validateUser + +3. Risk: 2 direct callers, 2 processes = MEDIUM +``` diff --git a/.claude/skills/gitnexus/gitnexus-refactoring/SKILL.md b/.claude/skills/gitnexus/gitnexus-refactoring/SKILL.md new file mode 100644 index 0000000..f48cc01 --- /dev/null +++ b/.claude/skills/gitnexus/gitnexus-refactoring/SKILL.md @@ -0,0 +1,121 @@ +--- +name: gitnexus-refactoring +description: "Use when the user wants to rename, extract, split, move, or restructure code safely. Examples: \"Rename this function\", \"Extract this into a module\", \"Refactor this class\", \"Move this to a separate file\"" +--- + +# Refactoring with GitNexus + +## When to Use + +- "Rename this function safely" +- "Extract this into a module" +- "Split this service" +- "Move this to a new file" +- Any task involving renaming, extracting, splitting, or restructuring code + +## Workflow + +``` +1. gitnexus_impact({target: "X", direction: "upstream"}) → Map all dependents +2. gitnexus_query({query: "X"}) → Find execution flows involving X +3. gitnexus_context({name: "X"}) → See all incoming/outgoing refs +4. Plan update order: interfaces → implementations → callers → tests +``` + +> If "Index is stale" → run `npx gitnexus analyze` in terminal. + +## Checklists + +### Rename Symbol + +``` +- [ ] gitnexus_rename({symbol_name: "oldName", new_name: "newName", dry_run: true}) — preview all edits +- [ ] Review graph edits (high confidence) and ast_search edits (review carefully) +- [ ] If satisfied: gitnexus_rename({..., dry_run: false}) — apply edits +- [ ] gitnexus_detect_changes() — verify only expected files changed +- [ ] Run tests for affected processes +``` + +### Extract Module + +``` +- [ ] gitnexus_context({name: target}) — see all incoming/outgoing refs +- [ ] gitnexus_impact({target, direction: "upstream"}) — find all external callers +- [ ] Define new module interface +- [ ] Extract code, update imports +- [ ] gitnexus_detect_changes() — verify affected scope +- [ ] Run tests for affected processes +``` + +### Split Function/Service + +``` +- [ ] gitnexus_context({name: target}) — understand all callees +- [ ] Group callees by responsibility +- [ ] gitnexus_impact({target, direction: "upstream"}) — map callers to update +- [ ] Create new functions/services +- [ ] Update callers +- [ ] gitnexus_detect_changes() — verify affected scope +- [ ] Run tests for affected processes +``` + +## Tools + +**gitnexus_rename** — automated multi-file rename: + +``` +gitnexus_rename({symbol_name: "validateUser", new_name: "authenticateUser", dry_run: true}) +→ 12 edits across 8 files +→ 10 graph edits (high confidence), 2 ast_search edits (review) +→ Changes: [{file_path, edits: [{line, old_text, new_text, confidence}]}] +``` + +**gitnexus_impact** — map all dependents first: + +``` +gitnexus_impact({target: "validateUser", direction: "upstream"}) +→ d=1: loginHandler, apiMiddleware, testUtils +→ Affected Processes: LoginFlow, TokenRefresh +``` + +**gitnexus_detect_changes** — verify your changes after refactoring: + +``` +gitnexus_detect_changes({scope: "all"}) +→ Changed: 8 files, 12 symbols +→ Affected processes: LoginFlow, TokenRefresh +→ Risk: MEDIUM +``` + +**gitnexus_cypher** — custom reference queries: + +```cypher +MATCH (caller)-[:CodeRelation {type: 'CALLS'}]->(f:Function {name: "validateUser"}) +RETURN caller.name, caller.filePath ORDER BY caller.filePath +``` + +## Risk Rules + +| Risk Factor | Mitigation | +| ------------------- | ----------------------------------------- | +| Many callers (>5) | Use gitnexus_rename for automated updates | +| Cross-area refs | Use detect_changes after to verify scope | +| String/dynamic refs | gitnexus_query to find them | +| External/public API | Version and deprecate properly | + +## Example: Rename `validateUser` to `authenticateUser` + +``` +1. gitnexus_rename({symbol_name: "validateUser", new_name: "authenticateUser", dry_run: true}) + → 12 edits: 10 graph (safe), 2 ast_search (review) + → Files: validator.ts, login.ts, middleware.ts, config.json... + +2. Review ast_search edits (config.json: dynamic reference!) + +3. gitnexus_rename({symbol_name: "validateUser", new_name: "authenticateUser", dry_run: false}) + → Applied 12 edits across 8 files + +4. gitnexus_detect_changes({scope: "all"}) + → Affected: LoginFlow, TokenRefresh + → Risk: MEDIUM — run tests for these flows +``` diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0447634 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.gitnexus diff --git a/AGENTS.md b/AGENTS.md index 9e11af1..db41a01 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -191,3 +191,105 @@ export const useAuthStore = defineStore('auth', () => { - **Test account**: `Tom` / `123456` (email: 976802198@qq.com) - Backend: ports 59447 (HTTPS), 59448 (HTTP) - Always use `await` with async operations + + +# GitNexus — Code Intelligence + +This project is indexed by GitNexus as **Build_God** (660 symbols, 954 relationships, 0 execution flows). Use the GitNexus MCP tools to understand code, assess impact, and navigate safely. + +> If any GitNexus tool warns the index is stale, run `npx gitnexus analyze` in terminal first. + +## Always Do + +- **MUST run impact analysis before editing any symbol.** Before modifying a function, class, or method, run `gitnexus_impact({target: "symbolName", direction: "upstream"})` and report the blast radius (direct callers, affected processes, risk level) to the user. +- **MUST run `gitnexus_detect_changes()` before committing** to verify your changes only affect expected symbols and execution flows. +- **MUST warn the user** if impact analysis returns HIGH or CRITICAL risk before proceeding with edits. +- When exploring unfamiliar code, use `gitnexus_query({query: "concept"})` to find execution flows instead of grepping. It returns process-grouped results ranked by relevance. +- When you need full context on a specific symbol — callers, callees, which execution flows it participates in — use `gitnexus_context({name: "symbolName"})`. + +## When Debugging + +1. `gitnexus_query({query: ""})` — find execution flows related to the issue +2. `gitnexus_context({name: ""})` — see all callers, callees, and process participation +3. `READ gitnexus://repo/Build_God/process/{processName}` — trace the full execution flow step by step +4. For regressions: `gitnexus_detect_changes({scope: "compare", base_ref: "main"})` — see what your branch changed + +## When Refactoring + +- **Renaming**: MUST use `gitnexus_rename({symbol_name: "old", new_name: "new", dry_run: true})` first. Review the preview — graph edits are safe, text_search edits need manual review. Then run with `dry_run: false`. +- **Extracting/Splitting**: MUST run `gitnexus_context({name: "target"})` to see all incoming/outgoing refs, then `gitnexus_impact({target: "target", direction: "upstream"})` to find all external callers before moving code. +- After any refactor: run `gitnexus_detect_changes({scope: "all"})` to verify only expected files changed. + +## Never Do + +- NEVER edit a function, class, or method without first running `gitnexus_impact` on it. +- NEVER ignore HIGH or CRITICAL risk warnings from impact analysis. +- NEVER rename symbols with find-and-replace — use `gitnexus_rename` which understands the call graph. +- NEVER commit changes without running `gitnexus_detect_changes()` to check affected scope. + +## Tools Quick Reference + +| Tool | When to use | Command | +|------|-------------|---------| +| `query` | Find code by concept | `gitnexus_query({query: "auth validation"})` | +| `context` | 360-degree view of one symbol | `gitnexus_context({name: "validateUser"})` | +| `impact` | Blast radius before editing | `gitnexus_impact({target: "X", direction: "upstream"})` | +| `detect_changes` | Pre-commit scope check | `gitnexus_detect_changes({scope: "staged"})` | +| `rename` | Safe multi-file rename | `gitnexus_rename({symbol_name: "old", new_name: "new", dry_run: true})` | +| `cypher` | Custom graph queries | `gitnexus_cypher({query: "MATCH ..."})` | + +## Impact Risk Levels + +| Depth | Meaning | Action | +|-------|---------|--------| +| d=1 | WILL BREAK — direct callers/importers | MUST update these | +| d=2 | LIKELY AFFECTED — indirect deps | Should test | +| d=3 | MAY NEED TESTING — transitive | Test if critical path | + +## Resources + +| Resource | Use for | +|----------|---------| +| `gitnexus://repo/Build_God/context` | Codebase overview, check index freshness | +| `gitnexus://repo/Build_God/clusters` | All functional areas | +| `gitnexus://repo/Build_God/processes` | All execution flows | +| `gitnexus://repo/Build_God/process/{name}` | Step-by-step execution trace | + +## Self-Check Before Finishing + +Before completing any code modification task, verify: +1. `gitnexus_impact` was run for all modified symbols +2. No HIGH/CRITICAL risk warnings were ignored +3. `gitnexus_detect_changes()` confirms changes match expected scope +4. All d=1 (WILL BREAK) dependents were updated + +## Keeping the Index Fresh + +After committing code changes, the GitNexus index becomes stale. Re-run analyze to update it: + +```bash +npx gitnexus analyze +``` + +If the index previously included embeddings, preserve them by adding `--embeddings`: + +```bash +npx gitnexus analyze --embeddings +``` + +To check whether embeddings exist, inspect `.gitnexus/meta.json` — the `stats.embeddings` field shows the count (0 means no embeddings). **Running analyze without `--embeddings` will delete any previously generated embeddings.** + +> Claude Code users: A PostToolUse hook handles this automatically after `git commit` and `git merge`. + +## CLI + +| Task | Read this skill file | +|------|---------------------| +| Understand architecture / "How does X work?" | `.claude/skills/gitnexus/gitnexus-exploring/SKILL.md` | +| Blast radius / "What breaks if I change X?" | `.claude/skills/gitnexus/gitnexus-impact-analysis/SKILL.md` | +| Trace bugs / "Why is X failing?" | `.claude/skills/gitnexus/gitnexus-debugging/SKILL.md` | +| Rename / extract / split / refactor | `.claude/skills/gitnexus/gitnexus-refactoring/SKILL.md` | +| Tools, resources, schema reference | `.claude/skills/gitnexus/gitnexus-guide/SKILL.md` | +| Index, status, clean, wiki CLI commands | `.claude/skills/gitnexus/gitnexus-cli/SKILL.md` | + + diff --git a/Build_God_Admin_Frontend/Frontend/.env.development b/Build_God_Admin_Frontend/Frontend/.env.development index b580ebe..40bd306 100644 --- a/Build_God_Admin_Frontend/Frontend/.env.development +++ b/Build_God_Admin_Frontend/Frontend/.env.development @@ -1,2 +1,2 @@ # 开发环境配置 -VITE_API_URL=https://localhost:59447/api/god/ +VITE_API_URL=http://localhost:5091/api/god/ diff --git a/Build_God_Api/Build_God_Api/Controllers/MissionController.cs b/Build_God_Api/Build_God_Api/Controllers/MissionController.cs index f471fa9..1133ac1 100644 --- a/Build_God_Api/Build_God_Api/Controllers/MissionController.cs +++ b/Build_God_Api/Build_God_Api/Controllers/MissionController.cs @@ -11,11 +11,15 @@ namespace Build_God_Api.Controllers [Route("api/god/[controller]")] public class MissionController( IMissionService service, - IMissionProgressService progressService + IMissionProgressService progressService, + ICharacterService characterService, + ICurrentUserService currentUserService ) : ControllerBase { private readonly IMissionService service = service; private readonly IMissionProgressService progressService = progressService; + private readonly ICharacterService characterService = characterService; + private readonly ICurrentUserService currentUserService = currentUserService; // ============ Mission ============ @@ -93,6 +97,31 @@ namespace Build_God_Api.Controllers return await progressService.Delete(id); } + [HttpPost("progress/update")] + [Authorize] + public async Task> UpdateProgress([FromBody] UpdateProgressCmd cmd) + { + try + { + var character = await characterService.GetCharacterByAccountId(currentUserService.UserId); + if (character == null) + return BadRequest("角色不存在"); + + var (success, missionCompleted) = await progressService.UpdateProgressByTargetType( + character.Id, cmd.ProgressType, cmd.ItemId, cmd.ItemName, cmd.Count); + + return Ok(new UpdateProgressResultDto + { + Success = success, + MissionCompleted = missionCompleted + }); + } + catch (Exception ex) + { + return BadRequest(ex.Message); + } + } + // ============ Enums ============ [HttpGet("types")] diff --git a/Build_God_Api/Build_God_Api/DB/Mission.cs b/Build_God_Api/Build_God_Api/DB/Mission.cs index d1abfa2..cd9e491 100644 --- a/Build_God_Api/Build_God_Api/DB/Mission.cs +++ b/Build_God_Api/Build_God_Api/DB/Mission.cs @@ -20,7 +20,7 @@ namespace Build_God_Api.DB /// 任务类型 /// [SugarColumn(IsNullable = false)] - public MissionType Type { get; set; } = MissionType.MainStory; + public MissionType Type { get; set; } = MissionType.Collection; /// /// 任务标题(展示用,与Name不同) @@ -91,11 +91,11 @@ namespace Build_God_Api.DB /// public enum MissionType { - [Description("悬赏任务")] - MainStory = 1, + [Description("收集任务")] + Collection = 1, - [Description("日常任务")] - DailyTask = 2 + [Description("狩猎任务")] + Hunting = 2 } /// diff --git a/Build_God_Api/Build_God_Api/Dto/MissionDtos.cs b/Build_God_Api/Build_God_Api/Dto/MissionDtos.cs index b0d7a6a..71fa447 100644 --- a/Build_God_Api/Build_God_Api/Dto/MissionDtos.cs +++ b/Build_God_Api/Build_God_Api/Dto/MissionDtos.cs @@ -8,4 +8,18 @@ namespace Build_God_Api.Dto public int PageSize { get; set; } = 0; public int? MissionType { get; set; } } + + public class UpdateProgressCmd + { + public ProgressTargetType ProgressType { get; set; } + public int? ItemId { get; set; } + public string? ItemName { get; set; } + public int Count { get; set; } = 1; + } + + public class UpdateProgressResultDto + { + public bool Success { get; set; } + public bool MissionCompleted { get; set; } + } } diff --git a/Build_God_Api/Build_God_Api/Services/DailyMissionService.cs b/Build_God_Api/Build_God_Api/Services/DailyMissionService.cs index c2a3785..8cd0775 100644 --- a/Build_God_Api/Build_God_Api/Services/DailyMissionService.cs +++ b/Build_God_Api/Build_God_Api/Services/DailyMissionService.cs @@ -50,6 +50,9 @@ namespace Build_God_Api.Services public int TodayClaimedCount { get; set; } public int TodayTotalCount { get; set; } public List Rewards { get; set; } = new(); + public MissionType MissionType { get; set; } + public MissionDifficulty Difficulty { get; set; } + public List Progresses { get; set; } = new(); } public class MissionRewardDto @@ -61,6 +64,16 @@ namespace Build_God_Api.Services public int Count { get; set; } } + public class MissionProgressDto + { + public int MissionProgressId { get; set; } + public ProgressTargetType TargetType { get; set; } + public int? TargetItemId { get; set; } + public string? TargetItemName { get; set; } + public int TargetCount { get; set; } + public int CurrentCount { get; set; } + } + public class DailyMissionService( ISqlSugarClient db, IBagService bagService, @@ -125,6 +138,7 @@ namespace Build_God_Api.Services { var mission = await _db.Queryable() .Includes(x => x.Rewards) + .Includes(x => x.Progresses) .FirstAsync(x => x.Id == dm.MissionId); if (mission == null) continue; @@ -145,7 +159,9 @@ namespace Build_God_Api.Services AssignedDate = dm.AssignedDate, ExpReward = CalculateExpReward(mission.Difficulty, character.LevelId), TodayClaimedCount = todayClaimedCount, - TodayTotalCount = todayTotalCount + TodayTotalCount = todayTotalCount, + MissionType = mission.Type, + Difficulty = mission.Difficulty }; if (mission.Rewards != null) @@ -163,6 +179,25 @@ namespace Build_God_Api.Services } } + if (mission.Progresses != null) + { + foreach (var progress in mission.Progresses) + { + var characterProgress = await _db.Queryable() + .FirstAsync(x => x.CharacterId == characterId && x.MissionId == dm.MissionId && x.MissionProgressId == progress.Id); + + dto.Progresses.Add(new MissionProgressDto + { + MissionProgressId = progress.Id, + TargetType = progress.TargetType, + TargetItemId = progress.TargetItemId, + TargetItemName = progress.TargetItemName, + TargetCount = progress.TargetCount, + CurrentCount = characterProgress?.CurrentCount ?? 0 + }); + } + } + result.Add(dto); } @@ -312,7 +347,7 @@ namespace Build_God_Api.Services } var availableMissions = await _db.Queryable() - .Where(x => x.Type == MissionType.DailyTask) + .Where(x => x.Type == MissionType.Collection || x.Type == MissionType.Hunting) .Where(x => x.IsAvailable == true) .Where(x => x.RequiredLevelId <= character.LevelId) .ToListAsync(); diff --git a/Build_God_Api/Build_God_Api/Services/MissionProgressService.cs b/Build_God_Api/Build_God_Api/Services/MissionProgressService.cs index 469f001..c53d1ce 100644 --- a/Build_God_Api/Build_God_Api/Services/MissionProgressService.cs +++ b/Build_God_Api/Build_God_Api/Services/MissionProgressService.cs @@ -1,4 +1,5 @@ using Build_God_Api.DB; +using Build_God_Api.Dto; using SqlSugar; namespace Build_God_Api.Services @@ -16,6 +17,9 @@ namespace Build_God_Api.Services Task> GetCharacterProgress(int characterId, int missionId); Task UpdateCharacterProgress(int characterId, int missionProgressId, int count); Task InitCharacterProgress(int characterId, int missionId); + + // 更新角色任务进度(根据目标类型自动匹配) + Task<(bool success, bool missionCompleted)> UpdateProgressByTargetType(int characterId, ProgressTargetType targetType, int? itemId, string? itemName, int count); } public class MissionProgressService(ISqlSugarClient db) : IMissionProgressService @@ -125,5 +129,84 @@ namespace Build_God_Api.Services return true; } + + public async Task<(bool success, bool missionCompleted)> UpdateProgressByTargetType(int characterId, ProgressTargetType targetType, int? itemId, string? itemName, int count) + { + // 查找该角色所有进行中的每日任务 + var dailyMissions = await db.Queryable() + .Where(x => x.CharacterId == characterId && x.Status == DailyMissionStatus.InProgress) + .ToListAsync(); + + if (!dailyMissions.Any()) + return (false, false); + + bool anyCompleted = false; + + foreach (var dailyMission in dailyMissions) + { + // 获取任务配置 + var mission = await db.Queryable() + .Includes(x => x.Progresses) + .FirstAsync(x => x.Id == dailyMission.MissionId); + + if (mission?.Progresses == null || !mission.Progresses.Any()) + continue; + + // 查找匹配的目标进度 + var matchingProgress = mission.Progresses.FirstOrDefault(p => + p.TargetType == targetType && + (targetType != ProgressTargetType.CollectItem || p.TargetItemId == itemId)); + + if (matchingProgress == null) + continue; + + // 获取角色进度 + var characterProgress = await db.Queryable() + .FirstAsync(x => + x.CharacterId == characterId && + x.MissionId == dailyMission.MissionId && + x.MissionProgressId == matchingProgress.Id); + + if (characterProgress == null) + { + characterProgress = new CharacterMissionProgress + { + CharacterId = characterId, + MissionId = dailyMission.MissionId, + MissionProgressId = matchingProgress.Id, + CurrentCount = 0, + IsCompleted = false, + UpdatedOn = DateTime.UtcNow + }; + await db.Insertable(characterProgress).ExecuteCommandAsync(); + } + + if (characterProgress.IsCompleted) + continue; + + // 更新进度 + characterProgress.CurrentCount = Math.Min(characterProgress.CurrentCount + count, matchingProgress.TargetCount); + characterProgress.IsCompleted = characterProgress.CurrentCount >= matchingProgress.TargetCount; + characterProgress.UpdatedOn = DateTime.UtcNow; + + await db.Updateable(characterProgress).ExecuteCommandAsync(); + + // 检查任务是否全部完成 + var allProgresses = await db.Queryable() + .Where(x => x.CharacterId == characterId && x.MissionId == dailyMission.MissionId) + .ToListAsync(); + + bool allCompleted = allProgresses.All(p => p.IsCompleted); + + if (allCompleted) + { + dailyMission.Status = DailyMissionStatus.Completed; + await db.Updateable(dailyMission).ExecuteCommandAsync(); + anyCompleted = true; + } + } + + return (true, anyCompleted); + } } } diff --git a/Build_God_Game/.env.development b/Build_God_Game/.env.development index b580ebe..40bd306 100644 --- a/Build_God_Game/.env.development +++ b/Build_God_Game/.env.development @@ -1,2 +1,2 @@ # 开发环境配置 -VITE_API_URL=https://localhost:59447/api/god/ +VITE_API_URL=http://localhost:5091/api/god/ diff --git a/Build_God_Game/src/api/dailyMission.ts b/Build_God_Game/src/api/dailyMission.ts index f148739..1eca7a1 100644 --- a/Build_God_Game/src/api/dailyMission.ts +++ b/Build_God_Game/src/api/dailyMission.ts @@ -12,6 +12,25 @@ export const RewardType = { Money: 3 } as const export type RewardType = typeof RewardType[keyof typeof RewardType] +export const MissionType = { + Collection: 1, + Hunting: 2 +} as const +export type MissionType = typeof MissionType[keyof typeof MissionType] +export const MissionDifficulty = { + Normal: 1, + Hard: 2, + Purgatory: 3 +} as const +export type MissionDifficulty = typeof MissionDifficulty[keyof typeof MissionDifficulty] +export const ProgressTargetType = { + CollectItem: 1, + Fish: 2, + KillMonster: 3, + ConsumeItem: 4, + Custom: 5 +} as const +export type ProgressTargetType = typeof ProgressTargetType[keyof typeof ProgressTargetType] export interface MissionReward { rewardType: RewardType rewardTypeName: string @@ -19,6 +38,14 @@ export interface MissionReward { itemName: string count: number } +export interface MissionProgressDto { + missionProgressId: number + targetType: ProgressTargetType + targetItemId: number | null + targetItemName: string | null + targetCount: number + currentCount: number +} export interface DailyMission { id: number characterId: number @@ -36,6 +63,9 @@ export interface DailyMission { todayClaimedCount: number todayTotalCount: number rewards: MissionReward[] + missionType: MissionType + difficulty: MissionDifficulty + progresses: MissionProgressDto[] } export const dailyMissionApi = { getList: (): Promise => { @@ -46,5 +76,13 @@ export const dailyMissionApi = { }, claim: (dailyMissionId: number): Promise => { return http.post(`/dailyMission/${dailyMissionId}/claim`) + }, + updateProgress: (progressType: ProgressTargetType, itemId: number | null, itemName: string | null, count: number): Promise<{ success: boolean; missionCompleted: boolean }> => { + return http.post('/mission/progress/update', { + progressType, + itemId, + itemName, + count + }) } } \ No newline at end of file diff --git a/Build_God_Game/src/views/DailyMissionView.vue b/Build_God_Game/src/views/DailyMissionView.vue index a4617b4..86bdad1 100644 --- a/Build_God_Game/src/views/DailyMissionView.vue +++ b/Build_God_Game/src/views/DailyMissionView.vue @@ -1,30 +1,12 @@