|
| 1 | +<!-- dgc-policy-v10 --> |
| 2 | +# Dual-Graph Context Policy |
| 3 | + |
| 4 | +This project uses a local dual-graph MCP server for efficient context retrieval. |
| 5 | + |
| 6 | +## MANDATORY: Always follow this order |
| 7 | + |
| 8 | +1. **Call `graph_continue` first** — before any file exploration, grep, or code reading. |
| 9 | + |
| 10 | +2. **If `graph_continue` returns `needs_project=true`**: call `graph_scan` with the |
| 11 | + current project directory (`pwd`). Do NOT ask the user. |
| 12 | + |
| 13 | +3. **If `graph_continue` returns `skip=true`**: project has fewer than 5 files. |
| 14 | + Do NOT do broad or recursive exploration. Read only specific files if their names |
| 15 | + are mentioned, or ask the user what to work on. |
| 16 | + |
| 17 | +4. **Read `recommended_files`** using `graph_read` — **one call per file**. |
| 18 | + - `graph_read` accepts a single `file` parameter (string). Call it separately for each |
| 19 | + recommended file. Do NOT pass an array or batch multiple files into one call. |
| 20 | + - `recommended_files` may contain `file::symbol` entries (e.g. `src/auth.ts::handleLogin`). |
| 21 | + Pass them verbatim to `graph_read(file: "src/auth.ts::handleLogin")` — it reads only |
| 22 | + that symbol's lines, not the full file. |
| 23 | + - Example: if `recommended_files` is `["src/auth.ts::handleLogin", "src/db.ts"]`, |
| 24 | + call `graph_read(file: "src/auth.ts::handleLogin")` and `graph_read(file: "src/db.ts")` |
| 25 | + as two separate calls (they can be parallel). |
| 26 | + |
| 27 | +5. **Check `confidence` and obey the caps strictly:** |
| 28 | + - `confidence=high` -> Stop. Do NOT grep or explore further. |
| 29 | + - `confidence=medium` -> If recommended files are insufficient, call `fallback_rg` |
| 30 | + at most `max_supplementary_greps` time(s) with specific terms, then `graph_read` |
| 31 | + at most `max_supplementary_files` additional file(s). Then stop. |
| 32 | + - `confidence=low` -> Call `fallback_rg` at most `max_supplementary_greps` time(s), |
| 33 | + then `graph_read` at most `max_supplementary_files` file(s). Then stop. |
| 34 | + |
| 35 | +## Token Usage |
| 36 | + |
| 37 | +A `token-counter` MCP is available for tracking live token usage. |
| 38 | + |
| 39 | +- To check how many tokens a large file or text will cost **before** reading it: |
| 40 | + `count_tokens({text: "<content>"})` |
| 41 | +- To log actual usage after a task completes (if the user asks): |
| 42 | + `log_usage({input_tokens: <est>, output_tokens: <est>, description: "<task>"})` |
| 43 | +- To show the user their running session cost: |
| 44 | + `get_session_stats()` |
| 45 | + |
| 46 | +Live dashboard URL is printed at startup next to "Token usage". |
| 47 | + |
| 48 | +## Rules |
| 49 | + |
| 50 | +- Do NOT use `rg`, `grep`, or bash file exploration before calling `graph_continue`. |
| 51 | +- Do NOT do broad/recursive exploration at any confidence level. |
| 52 | +- `max_supplementary_greps` and `max_supplementary_files` are hard caps - never exceed them. |
| 53 | +- Do NOT dump full chat history. |
| 54 | +- Do NOT call `graph_retrieve` more than once per turn. |
| 55 | +- After edits, call `graph_register_edit` with the changed files. Use `file::symbol` notation (e.g. `src/auth.ts::handleLogin`) when the edit targets a specific function, class, or hook. |
| 56 | + |
| 57 | +## Context Store |
| 58 | + |
| 59 | +Whenever you make a decision, identify a task, note a next step, fact, or blocker during a conversation, append it to `.dual-graph/context-store.json`. |
| 60 | + |
| 61 | +**Entry format:** |
| 62 | +```json |
| 63 | +{"type": "decision|task|next|fact|blocker", "content": "one sentence max 15 words", "tags": ["topic"], "files": ["relevant/file.ts"], "date": "YYYY-MM-DD"} |
| 64 | +``` |
| 65 | + |
| 66 | +**To append:** Read the file → add the new entry to the array → Write it back → call `graph_register_edit` on `.dual-graph/context-store.json`. |
| 67 | + |
| 68 | +**Rules:** |
| 69 | +- Only log things worth remembering across sessions (not every minor detail) |
| 70 | +- `content` must be under 15 words |
| 71 | +- `files` lists the files this decision/task relates to (can be empty) |
| 72 | +- Log immediately when the item arises — not at session end |
| 73 | + |
| 74 | +## Session End |
| 75 | + |
| 76 | +When the user signals they are done (e.g. "bye", "done", "wrap up", "end session"), proactively update `CONTEXT.md` in the project root with: |
| 77 | +- **Current Task**: one sentence on what was being worked on |
| 78 | +- **Key Decisions**: bullet list, max 3 items |
| 79 | +- **Next Steps**: bullet list, max 3 items |
| 80 | + |
| 81 | +Keep `CONTEXT.md` under 20 lines total. Do NOT summarize the full conversation — only what's needed to resume next session. |
| 82 | + |
| 83 | +--- |
| 84 | + |
| 85 | +# Project: Resgrid Unit (React Native / Expo) |
| 86 | + |
| 87 | +## Tech Stack |
| 88 | + |
| 89 | +TypeScript · React Native · Expo (managed, prebuild) · Zustand · React Query · React Hook Form · react-i18next · react-native-mmkv · Axios · @rnmapbox/maps · gluestack-ui · lucide-react-native |
| 90 | + |
| 91 | +## Code Style |
| 92 | + |
| 93 | +- Write concise, type-safe TypeScript. Avoid `any`; use precise types and interfaces for props/state. |
| 94 | +- Use functional components and hooks; never class components. Use `React.FC` for typed components. |
| 95 | +- Enable strict mode in `tsconfig.json`. |
| 96 | +- Organize files by feature, grouping related components, hooks, and styles. |
| 97 | +- All components must be mobile-friendly and responsive, supporting both iOS and Android. |
| 98 | +- This is an Expo managed project using prebuild — **do not make native code changes** outside Expo prebuild capabilities. |
| 99 | + |
| 100 | +## Naming Conventions |
| 101 | + |
| 102 | +- Variables and functions: `camelCase` (e.g., `isFetchingData`, `handleUserInput`) |
| 103 | +- Components: `PascalCase` (e.g., `UserProfile`, `ChatScreen`) |
| 104 | +- Files and directories: `lowercase-hyphenated` (e.g., `user-profile.tsx`, `chat-screen/`) |
| 105 | + |
| 106 | +## Styling |
| 107 | + |
| 108 | +- Use `gluestack-ui` components from `components/ui` when available. |
| 109 | +- For anything without a Gluestack component, use `StyleSheet.create()` or Styled Components. |
| 110 | +- Support both **dark mode and light mode**. |
| 111 | +- Follow WCAG accessibility guidelines for mobile. |
| 112 | + |
| 113 | +## Performance |
| 114 | + |
| 115 | +- Minimize `useEffect`, `useState`, and heavy computation inside render methods. |
| 116 | +- Use `React.memo()` for components with static props. |
| 117 | +- Optimize `FlatList` with `removeClippedSubviews`, `maxToRenderPerBatch`, `windowSize`, and `getItemLayout` when items have a consistent size. |
| 118 | +- Avoid anonymous functions in `renderItem` or event handlers. |
| 119 | + |
| 120 | +## Internationalization |
| 121 | + |
| 122 | +- All user-visible text **must** be wrapped in `t()` from `react-i18next`. |
| 123 | +- Translation dictionary files live in `src/translations/`. |
| 124 | + |
| 125 | +## Libraries — use these, not alternatives |
| 126 | + |
| 127 | +| Purpose | Library | |
| 128 | +|---|---| |
| 129 | +| Package manager | `yarn` | |
| 130 | +| State management | `zustand` | |
| 131 | +| Data fetching | `react-query` | |
| 132 | +| Forms | `react-hook-form` | |
| 133 | +| i18n | `react-i18next` | |
| 134 | +| Local storage | `react-native-mmkv` | |
| 135 | +| Secure storage | Expo SecureStore | |
| 136 | +| HTTP | `axios` | |
| 137 | +| Maps / navigation | `@rnmapbox/maps` | |
| 138 | +| Icons | `lucide-react-native` (use directly in markup, not via gluestack Icon wrapper) | |
| 139 | + |
| 140 | +## Conditional Rendering |
| 141 | + |
| 142 | +Use ternary `? :` for conditional rendering — **never `&&`**. |
| 143 | + |
| 144 | +## Testing |
| 145 | + |
| 146 | +- Use Jest. Generate tests for all new components, services, and logic. |
| 147 | +- Ensure tests run without errors before considering a task done. |
| 148 | + |
| 149 | +## Best Practices |
| 150 | + |
| 151 | +- Follow React Native's threading model for smooth UI performance. |
| 152 | +- Use React Navigation for navigation and deep linking. |
| 153 | +- Handle errors gracefully and provide user feedback. |
| 154 | +- Implement proper offline support. |
| 155 | +- Optimize for low-end devices. |
0 commit comments