atris 2.1.0 → 2.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENT.md +35 -0
- package/AGENTS.md +46 -0
- package/GETTING_STARTED.md +2 -2
- package/PERSONA.md +5 -1
- package/README.md +16 -8
- package/atris/AGENTS.md +25 -0
- package/atris/GEMINI.md +8 -0
- package/atris/GETTING_STARTED.md +2 -2
- package/atris/atris.md +4 -3
- package/atris/features/README.md +41 -15
- package/atris/policies/LESSONS.md +1 -0
- package/atris/skills/README.md +45 -14
- package/atris/skills/atris/SKILL.md +7 -0
- package/atris/skills/autopilot/SKILL.md +9 -4
- package/atris/skills/autopilot/atris-autopilot.md +71 -0
- package/atris/skills/autopilot/hooks/stop-hook.sh +79 -0
- package/atris/skills/backend/SKILL.md +6 -1
- package/atris/skills/calendar/SKILL.md +301 -0
- package/atris/skills/clawhub/atris/SKILL.md +121 -0
- package/atris/skills/copy-editor/SKILL.md +470 -0
- package/atris/skills/design/SKILL.md +5 -1
- package/atris/skills/drive/SKILL.md +333 -0
- package/atris/skills/email-agent/SKILL.md +376 -0
- package/atris/skills/memory/SKILL.md +8 -0
- package/atris/skills/meta/SKILL.md +4 -0
- package/atris/skills/skill-improver/SKILL.md +147 -0
- package/atris/skills/writing/SKILL.md +3 -0
- package/atris/team/brainstormer.md +1 -0
- package/atris/team/executor.md +27 -0
- package/atris/team/launcher.md +1 -0
- package/atris/team/navigator.md +44 -5
- package/atris/team/validator.md +44 -3
- package/atris.md +37 -1
- package/bin/atris.js +58 -5
- package/commands/auth.js +24 -4
- package/commands/init.js +140 -17
- package/commands/integrations.js +330 -0
- package/commands/skill.js +496 -0
- package/commands/status.js +9 -1
- package/commands/sync.js +64 -19
- package/commands/workflow.js +7 -0
- package/package.json +4 -2
- package/utils/auth.js +33 -0
- package/commands/stubs.txt +0 -10
|
@@ -0,0 +1,301 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: calendar
|
|
3
|
+
description: Google Calendar integration via AtrisOS API. View, create, and manage calendar events. Use when user asks about calendar, schedule, meetings, or events.
|
|
4
|
+
version: 1.0.0
|
|
5
|
+
tags:
|
|
6
|
+
- calendar
|
|
7
|
+
- backend
|
|
8
|
+
- google-calendar
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# Calendar Agent
|
|
12
|
+
|
|
13
|
+
> Drop this in `~/.claude/skills/calendar/SKILL.md` and Claude Code becomes your calendar assistant.
|
|
14
|
+
|
|
15
|
+
## Bootstrap (ALWAYS Run First)
|
|
16
|
+
|
|
17
|
+
Before any calendar operation, run this bootstrap to ensure everything is set up:
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
#!/bin/bash
|
|
21
|
+
set -e
|
|
22
|
+
|
|
23
|
+
# 1. Check if atris CLI is installed
|
|
24
|
+
if ! command -v atris &> /dev/null; then
|
|
25
|
+
echo "Installing atris CLI..."
|
|
26
|
+
npm install -g atris
|
|
27
|
+
fi
|
|
28
|
+
|
|
29
|
+
# 2. Check if logged in to AtrisOS
|
|
30
|
+
if [ ! -f ~/.atris/credentials.json ]; then
|
|
31
|
+
echo "Not logged in to AtrisOS."
|
|
32
|
+
echo ""
|
|
33
|
+
echo "Option 1 (interactive): Run 'atris login' and follow prompts"
|
|
34
|
+
echo "Option 2 (non-interactive): Get token from https://atris.ai/auth/cli"
|
|
35
|
+
echo " Then run: atris login --token YOUR_TOKEN"
|
|
36
|
+
echo ""
|
|
37
|
+
exit 1
|
|
38
|
+
fi
|
|
39
|
+
|
|
40
|
+
# 3. Extract token (try node first, then python3, then jq)
|
|
41
|
+
if command -v node &> /dev/null; then
|
|
42
|
+
TOKEN=$(node -e "console.log(require('$HOME/.atris/credentials.json').token)")
|
|
43
|
+
elif command -v python3 &> /dev/null; then
|
|
44
|
+
TOKEN=$(python3 -c "import json,os; print(json.load(open(os.path.expanduser('~/.atris/credentials.json')))['token'])")
|
|
45
|
+
elif command -v jq &> /dev/null; then
|
|
46
|
+
TOKEN=$(jq -r '.token' ~/.atris/credentials.json)
|
|
47
|
+
else
|
|
48
|
+
echo "Error: Need node, python3, or jq to read credentials"
|
|
49
|
+
exit 1
|
|
50
|
+
fi
|
|
51
|
+
|
|
52
|
+
# 4. Check Google Calendar connection status (also validates token)
|
|
53
|
+
STATUS=$(curl -s "https://api.atris.ai/api/integrations/google-calendar/status" \
|
|
54
|
+
-H "Authorization: Bearer $TOKEN")
|
|
55
|
+
|
|
56
|
+
# Check for token expiry
|
|
57
|
+
if echo "$STATUS" | grep -q "Token expired\|Not authenticated"; then
|
|
58
|
+
echo "Token expired. Please re-authenticate:"
|
|
59
|
+
echo " Run: atris login --force"
|
|
60
|
+
exit 1
|
|
61
|
+
fi
|
|
62
|
+
|
|
63
|
+
# Parse connected status
|
|
64
|
+
if command -v node &> /dev/null; then
|
|
65
|
+
CONNECTED=$(node -e "try{console.log(JSON.parse('$STATUS').connected||false)}catch(e){console.log(false)}")
|
|
66
|
+
elif command -v python3 &> /dev/null; then
|
|
67
|
+
CONNECTED=$(echo "$STATUS" | python3 -c "import sys,json; print(json.load(sys.stdin).get('connected', False))")
|
|
68
|
+
else
|
|
69
|
+
CONNECTED=$(echo "$STATUS" | jq -r '.connected // false')
|
|
70
|
+
fi
|
|
71
|
+
|
|
72
|
+
if [ "$CONNECTED" != "true" ] && [ "$CONNECTED" != "True" ]; then
|
|
73
|
+
echo "Google Calendar not connected. Getting authorization URL..."
|
|
74
|
+
AUTH=$(curl -s -X POST "https://api.atris.ai/api/integrations/google-calendar/start" \
|
|
75
|
+
-H "Authorization: Bearer $TOKEN" \
|
|
76
|
+
-H "Content-Type: application/json" \
|
|
77
|
+
-d '{"redirect_uri":"https://api.atris.ai/api/integrations/google-calendar/callback"}')
|
|
78
|
+
|
|
79
|
+
if command -v node &> /dev/null; then
|
|
80
|
+
URL=$(node -e "try{console.log(JSON.parse('$AUTH').auth_url||'')}catch(e){console.log('')}")
|
|
81
|
+
elif command -v python3 &> /dev/null; then
|
|
82
|
+
URL=$(echo "$AUTH" | python3 -c "import sys,json; print(json.load(sys.stdin).get('auth_url', ''))")
|
|
83
|
+
else
|
|
84
|
+
URL=$(echo "$AUTH" | jq -r '.auth_url // empty')
|
|
85
|
+
fi
|
|
86
|
+
|
|
87
|
+
echo ""
|
|
88
|
+
echo "Open this URL to connect your Google Calendar:"
|
|
89
|
+
echo "$URL"
|
|
90
|
+
echo ""
|
|
91
|
+
echo "After authorizing, run your calendar command again."
|
|
92
|
+
exit 0
|
|
93
|
+
fi
|
|
94
|
+
|
|
95
|
+
echo "Ready. Google Calendar is connected."
|
|
96
|
+
export ATRIS_TOKEN="$TOKEN"
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
**Important**: Run this script ONCE before calendar operations. If it exits with instructions, follow them, then run again.
|
|
100
|
+
|
|
101
|
+
---
|
|
102
|
+
|
|
103
|
+
## API Reference
|
|
104
|
+
|
|
105
|
+
Base: `https://api.atris.ai/api/integrations`
|
|
106
|
+
|
|
107
|
+
All requests require: `-H "Authorization: Bearer $TOKEN"`
|
|
108
|
+
|
|
109
|
+
### Get Token (after bootstrap)
|
|
110
|
+
```bash
|
|
111
|
+
TOKEN=$(node -e "console.log(require('$HOME/.atris/credentials.json').token)")
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
### List Events
|
|
115
|
+
```bash
|
|
116
|
+
# Next 7 days (default)
|
|
117
|
+
curl -s "https://api.atris.ai/api/integrations/google-calendar/events" \
|
|
118
|
+
-H "Authorization: Bearer $TOKEN"
|
|
119
|
+
|
|
120
|
+
# Next N days
|
|
121
|
+
curl -s "https://api.atris.ai/api/integrations/google-calendar/events?days=14" \
|
|
122
|
+
-H "Authorization: Bearer $TOKEN"
|
|
123
|
+
|
|
124
|
+
# Custom date range (ISO 8601)
|
|
125
|
+
curl -s "https://api.atris.ai/api/integrations/google-calendar/events?time_min=2026-02-15T00:00:00Z&time_max=2026-02-16T00:00:00Z" \
|
|
126
|
+
-H "Authorization: Bearer $TOKEN"
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
### Get Today's Events
|
|
130
|
+
```bash
|
|
131
|
+
curl -s "https://api.atris.ai/api/integrations/google-calendar/events/today" \
|
|
132
|
+
-H "Authorization: Bearer $TOKEN"
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
### Get Single Event
|
|
136
|
+
```bash
|
|
137
|
+
curl -s "https://api.atris.ai/api/integrations/google-calendar/events/{event_id}" \
|
|
138
|
+
-H "Authorization: Bearer $TOKEN"
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
### Create Event
|
|
142
|
+
```bash
|
|
143
|
+
curl -s -X POST "https://api.atris.ai/api/integrations/google-calendar/events" \
|
|
144
|
+
-H "Authorization: Bearer $TOKEN" \
|
|
145
|
+
-H "Content-Type: application/json" \
|
|
146
|
+
-d '{
|
|
147
|
+
"summary": "Meeting with Sushanth",
|
|
148
|
+
"start": "2026-02-15T14:00:00-08:00",
|
|
149
|
+
"end": "2026-02-15T15:00:00-08:00",
|
|
150
|
+
"description": "Discuss AI transformation roadmap",
|
|
151
|
+
"location": "Zoom",
|
|
152
|
+
"attendees": ["sushanth@pallet.com"],
|
|
153
|
+
"timezone": "America/Los_Angeles"
|
|
154
|
+
}'
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
**IMPORTANT:** Use `POST` to create events. Do NOT use `PUT` — that is for updating existing events.
|
|
158
|
+
|
|
159
|
+
### Update Event
|
|
160
|
+
```bash
|
|
161
|
+
curl -s -X PUT "https://api.atris.ai/api/integrations/google-calendar/events/{event_id}" \
|
|
162
|
+
-H "Authorization: Bearer $TOKEN" \
|
|
163
|
+
-H "Content-Type: application/json" \
|
|
164
|
+
-d '{
|
|
165
|
+
"summary": "Updated meeting title",
|
|
166
|
+
"start": "2026-02-15T15:00:00-08:00",
|
|
167
|
+
"end": "2026-02-15T16:00:00-08:00",
|
|
168
|
+
"timezone": "America/Los_Angeles"
|
|
169
|
+
}'
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
### Delete Event
|
|
173
|
+
```bash
|
|
174
|
+
curl -s -X DELETE "https://api.atris.ai/api/integrations/google-calendar/events/{event_id}" \
|
|
175
|
+
-H "Authorization: Bearer $TOKEN"
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
### Check Connection Status
|
|
179
|
+
```bash
|
|
180
|
+
curl -s "https://api.atris.ai/api/integrations/google-calendar/status" \
|
|
181
|
+
-H "Authorization: Bearer $TOKEN"
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
### Disconnect Google Calendar
|
|
185
|
+
```bash
|
|
186
|
+
curl -s -X DELETE "https://api.atris.ai/api/integrations/google-calendar" \
|
|
187
|
+
-H "Authorization: Bearer $TOKEN"
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
---
|
|
191
|
+
|
|
192
|
+
## Workflows
|
|
193
|
+
|
|
194
|
+
### "What's on my calendar today?"
|
|
195
|
+
1. Run bootstrap
|
|
196
|
+
2. Get events: `GET /google-calendar/events/today`
|
|
197
|
+
3. Display events sorted by start time: time, title, location
|
|
198
|
+
4. If no events: "Your calendar is clear today."
|
|
199
|
+
|
|
200
|
+
### "What's my schedule this week?"
|
|
201
|
+
1. Run bootstrap
|
|
202
|
+
2. Get events: `GET /google-calendar/events?days=7`
|
|
203
|
+
3. Group by day, display each day's events
|
|
204
|
+
|
|
205
|
+
### "Schedule a meeting with X"
|
|
206
|
+
1. Run bootstrap
|
|
207
|
+
2. Create event: `POST /google-calendar/events` with summary, start, end, attendees
|
|
208
|
+
3. Confirm: "Meeting created! [link]"
|
|
209
|
+
|
|
210
|
+
### "Do I have any meetings this afternoon?"
|
|
211
|
+
1. Run bootstrap
|
|
212
|
+
2. Get events: `GET /google-calendar/events/today`
|
|
213
|
+
3. Filter events where start time is after 12:00 PM in user's timezone
|
|
214
|
+
4. Display matching events or "No meetings this afternoon."
|
|
215
|
+
|
|
216
|
+
### "When is my next meeting?"
|
|
217
|
+
1. Run bootstrap
|
|
218
|
+
2. Get events: `GET /google-calendar/events/today`
|
|
219
|
+
3. Find the next event after current time
|
|
220
|
+
4. Display: "Your next meeting is [title] at [time]" or "No more meetings today."
|
|
221
|
+
|
|
222
|
+
### "Cancel my 3pm meeting"
|
|
223
|
+
1. Run bootstrap
|
|
224
|
+
2. List events: `GET /google-calendar/events/today`
|
|
225
|
+
3. Find event at 3pm
|
|
226
|
+
4. **Confirm with user** before deleting
|
|
227
|
+
5. Delete: `DELETE /google-calendar/events/{event_id}`
|
|
228
|
+
|
|
229
|
+
---
|
|
230
|
+
|
|
231
|
+
## Display Format
|
|
232
|
+
|
|
233
|
+
When showing calendar events, use this format:
|
|
234
|
+
|
|
235
|
+
```
|
|
236
|
+
Today's Schedule (Feb 15, 2026)
|
|
237
|
+
|
|
238
|
+
9:00 AM - 9:30 AM Team Standup
|
|
239
|
+
Google Meet
|
|
240
|
+
|
|
241
|
+
10:00 AM - 11:00 AM Product Review
|
|
242
|
+
Conference Room B
|
|
243
|
+
with alice@example.com, bob@example.com
|
|
244
|
+
|
|
245
|
+
1:00 PM - 1:30 PM 1:1 with Manager
|
|
246
|
+
Zoom
|
|
247
|
+
|
|
248
|
+
3 events today
|
|
249
|
+
```
|
|
250
|
+
|
|
251
|
+
**Rules:**
|
|
252
|
+
- Sort by start time
|
|
253
|
+
- Show location if available
|
|
254
|
+
- Show attendees if available (max 3, then "and N more")
|
|
255
|
+
- Use 12-hour format with AM/PM
|
|
256
|
+
- For all-day events, show "All day" instead of times
|
|
257
|
+
|
|
258
|
+
---
|
|
259
|
+
|
|
260
|
+
## Error Handling
|
|
261
|
+
|
|
262
|
+
| Error | Meaning | Solution |
|
|
263
|
+
|-------|---------|----------|
|
|
264
|
+
| `Token expired` | AtrisOS session expired | Run `atris login` |
|
|
265
|
+
| `Calendar not connected` | OAuth not completed | Re-run bootstrap, complete OAuth flow |
|
|
266
|
+
| `401 Unauthorized` | Invalid/expired token | Run `atris login` |
|
|
267
|
+
| `400 Calendar not connected` | No calendar credentials | Complete OAuth via bootstrap |
|
|
268
|
+
| `429 Rate limited` | Too many requests | Wait 60s, retry |
|
|
269
|
+
| `Invalid grant` | Google revoked access | Re-connect calendar via bootstrap |
|
|
270
|
+
|
|
271
|
+
---
|
|
272
|
+
|
|
273
|
+
## Security Model
|
|
274
|
+
|
|
275
|
+
1. **Local token** (`~/.atris/credentials.json`): Your AtrisOS auth token, stored locally with 600 permissions.
|
|
276
|
+
|
|
277
|
+
2. **Calendar credentials**: Your Google Calendar refresh token is stored **server-side** in AtrisOS encrypted vault. Never stored on your local machine.
|
|
278
|
+
|
|
279
|
+
3. **Access control**: AtrisOS API enforces that you can only access your own calendar. No cross-user access possible.
|
|
280
|
+
|
|
281
|
+
4. **OAuth scopes**: Only requests necessary Calendar permissions (read events, manage events).
|
|
282
|
+
|
|
283
|
+
5. **HTTPS only**: All API communication encrypted in transit.
|
|
284
|
+
|
|
285
|
+
---
|
|
286
|
+
|
|
287
|
+
## Quick Reference
|
|
288
|
+
|
|
289
|
+
```bash
|
|
290
|
+
# Setup (one time)
|
|
291
|
+
npm install -g atris && atris login
|
|
292
|
+
|
|
293
|
+
# Get token
|
|
294
|
+
TOKEN=$(node -e "console.log(require('$HOME/.atris/credentials.json').token)")
|
|
295
|
+
|
|
296
|
+
# Check connection
|
|
297
|
+
curl -s "https://api.atris.ai/api/integrations/google-calendar/status" -H "Authorization: Bearer $TOKEN"
|
|
298
|
+
|
|
299
|
+
# Today's events
|
|
300
|
+
curl -s "https://api.atris.ai/api/integrations/google-calendar/events/today" -H "Authorization: Bearer $TOKEN"
|
|
301
|
+
```
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: atris
|
|
3
|
+
description: Codebase intelligence — generates structured navigation maps with file:line references so agents stop re-scanning the same files every session. Use when exploring code, answering "where is X?", or onboarding to a new codebase.
|
|
4
|
+
version: 1.1.0
|
|
5
|
+
requires:
|
|
6
|
+
bins:
|
|
7
|
+
- rg
|
|
8
|
+
tags:
|
|
9
|
+
- developer-tools
|
|
10
|
+
- codebase-navigation
|
|
11
|
+
- token-optimization
|
|
12
|
+
- code-map
|
|
13
|
+
- context-management
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
# Atris — Codebase Intelligence
|
|
17
|
+
|
|
18
|
+
Maintain a structured map of the codebase with exact file:line references. One scan, permanent knowledge. Saves 80-95% of tokens on code exploration.
|
|
19
|
+
|
|
20
|
+
## Scope
|
|
21
|
+
|
|
22
|
+
- Use in any repo where you need to navigate code.
|
|
23
|
+
- Creates `atris/MAP.md` as the single navigation index.
|
|
24
|
+
|
|
25
|
+
## MAP-first rule
|
|
26
|
+
|
|
27
|
+
Before searching for anything in the codebase:
|
|
28
|
+
|
|
29
|
+
1. Read `atris/MAP.md`
|
|
30
|
+
2. Found your keyword → go directly to file:line. Done.
|
|
31
|
+
3. Not found → search once with `rg`, then **add the result to MAP.md**
|
|
32
|
+
|
|
33
|
+
The map gets smarter every time you use it. Never let a discovery go unrecorded.
|
|
34
|
+
|
|
35
|
+
## First time setup
|
|
36
|
+
|
|
37
|
+
If `atris/MAP.md` doesn't exist, generate it:
|
|
38
|
+
|
|
39
|
+
1. Create `atris/` folder in the project root
|
|
40
|
+
2. Scan the codebase (rules below)
|
|
41
|
+
3. Write the result to `atris/MAP.md`
|
|
42
|
+
4. Tell the user: "Built your codebase map at atris/MAP.md."
|
|
43
|
+
|
|
44
|
+
If `atris/MAP.md` already exists, use it. Regenerate only if the user requests it or the map is clearly stale (references missing files, line numbers way off).
|
|
45
|
+
|
|
46
|
+
## How to scan
|
|
47
|
+
|
|
48
|
+
Skip: `node_modules`, `.git`, `dist`, `build`, `vendor`, `__pycache__`, `.venv`, `.env*`, `*.key`, `*.pem`, `credentials*`, `secrets*`
|
|
49
|
+
|
|
50
|
+
Use ripgrep to extract structure:
|
|
51
|
+
|
|
52
|
+
```bash
|
|
53
|
+
# Key definitions
|
|
54
|
+
rg "^(export|function|class|const|def |async def |router\.|app\.|@app\.)" --line-number -g "!node_modules" -g "!.git" -g "!dist" -g "!.env*"
|
|
55
|
+
|
|
56
|
+
# Route definitions
|
|
57
|
+
rg "(get|post|put|delete|patch)\s*\(" --line-number -g "*.ts" -g "*.js" -g "*.py"
|
|
58
|
+
|
|
59
|
+
# Entry points
|
|
60
|
+
rg "listen|createServer|app\.start|if __name__" --line-number
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
## MAP.md structure
|
|
64
|
+
|
|
65
|
+
```markdown
|
|
66
|
+
# MAP.md — [Project Name] Navigation Guide
|
|
67
|
+
|
|
68
|
+
> Generated by Atris | Last updated: YYYY-MM-DD
|
|
69
|
+
|
|
70
|
+
## Quick Reference
|
|
71
|
+
|
|
72
|
+
rg "functionName" path/to/file.ext # Description (line N)
|
|
73
|
+
rg "className" path/to/file.ext # Description (line N)
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
Extract the top 15-25 most important symbols: entry points, exports, route handlers, main classes, config loaders.
|
|
77
|
+
|
|
78
|
+
### By-Feature Map
|
|
79
|
+
|
|
80
|
+
Group code by what it does. Every reference includes exact file path and line numbers.
|
|
81
|
+
|
|
82
|
+
```markdown
|
|
83
|
+
### Feature: User Authentication
|
|
84
|
+
**Purpose:** Login, registration, token management
|
|
85
|
+
- **Entry:** `src/auth/login.ts:45-89` (handleLogin)
|
|
86
|
+
- **Validation:** `src/auth/validate.ts:12-67` (validateToken)
|
|
87
|
+
- **Model:** `src/models/user.ts:8-34` (User schema)
|
|
88
|
+
- **Routes:** `src/routes/auth.ts:5-28` (POST /login, POST /register)
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
### By-Concern Map
|
|
92
|
+
|
|
93
|
+
Group by cross-cutting patterns (error handling, logging, auth middleware, etc).
|
|
94
|
+
|
|
95
|
+
### Critical Files
|
|
96
|
+
|
|
97
|
+
Flag high-impact files with why they matter and key functions with line numbers.
|
|
98
|
+
|
|
99
|
+
### Entry Points
|
|
100
|
+
|
|
101
|
+
How execution flows — dev server startup, request lifecycle, build pipeline.
|
|
102
|
+
|
|
103
|
+
## Keeping it fresh
|
|
104
|
+
|
|
105
|
+
Update MAP.md surgically when the codebase changes:
|
|
106
|
+
|
|
107
|
+
- **New file** → add to relevant section
|
|
108
|
+
- **Moved/renamed** → update all references
|
|
109
|
+
- **New important function** → add to Quick Reference
|
|
110
|
+
- **Deleted file** → remove from map
|
|
111
|
+
- **Major refactor** → regenerate affected sections
|
|
112
|
+
|
|
113
|
+
Small updates, not full regeneration. The map evolves with the code.
|
|
114
|
+
|
|
115
|
+
## Anti-patterns
|
|
116
|
+
|
|
117
|
+
- Searching without checking MAP first
|
|
118
|
+
- Letting discoveries go unrecorded
|
|
119
|
+
- Regenerating the full map when a surgical update would do
|
|
120
|
+
- Including secrets, credentials, or .env files in the map
|
|
121
|
+
- Guessing file locations instead of using the index
|