axel-setup 0.2.0
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/CHANGELOG.md +218 -0
- package/CONTRIBUTING.md +58 -0
- package/LICENSE +21 -0
- package/README.md +518 -0
- package/agents/api-design.md +51 -0
- package/agents/bughunter.md +136 -0
- package/agents/changelog.md +89 -0
- package/agents/cleanup.md +126 -0
- package/agents/compare-branch.md +35 -0
- package/agents/cross-repo.md +97 -0
- package/agents/db-check.md +14 -0
- package/agents/debug.md +47 -0
- package/agents/deploy-check.md +100 -0
- package/agents/draft-message.md +19 -0
- package/agents/excelsior-coordinator.md +75 -0
- package/agents/excelsior-verifier.md +94 -0
- package/agents/feature.md +48 -0
- package/agents/harness-optimizer.md +40 -0
- package/agents/incident.md +48 -0
- package/agents/linear-task.md +18 -0
- package/agents/onboard.md +24 -0
- package/agents/perf.md +44 -0
- package/agents/production-validator.md +96 -0
- package/agents/review.md +113 -0
- package/agents/security-check.md +29 -0
- package/agents/sprint-summary.md +15 -0
- package/agents/tdd-mainder.md +178 -0
- package/agents/test-gen.md +39 -0
- package/axel-manifest.json +129 -0
- package/bin/axel-setup.js +597 -0
- package/bootstrap.sh +1087 -0
- package/commands/create-pr.md +13 -0
- package/commands/daily.md +182 -0
- package/commands/deslop.md +13 -0
- package/commands/draft-message.md +23 -0
- package/commands/eod-review.md +154 -0
- package/commands/execute-prp.md +37 -0
- package/commands/generate-prp.md +75 -0
- package/commands/multi-repo-feature.md +60 -0
- package/commands/roadmap.md +31 -0
- package/commands/sprint-status.md +486 -0
- package/commands/style.md +68 -0
- package/commands/visualize.md +17 -0
- package/docs/roadmap/multi-runtime.md +73 -0
- package/docs/superpowers/plans/2026-06-12-setup-hardening-roadmap.md +61 -0
- package/hooks/desktop-notify.sh +26 -0
- package/hooks/enforce-agent-model.jq +14 -0
- package/hooks/gsd-context-monitor.js +156 -0
- package/hooks/linear-lifecycle-sync.sh +112 -0
- package/hooks/memory-dedup.sh +122 -0
- package/hooks/memory-extractor.sh +218 -0
- package/hooks/post-commit-memory-trigger.sh +16 -0
- package/hooks/post-commit-verify.sh +41 -0
- package/hooks/post-edit-lint.sh +43 -0
- package/hooks/precompact-save-context.sh +124 -0
- package/hooks/priority-map-staleness.sh +29 -0
- package/hooks/proactive-resolver.sh +104 -0
- package/hooks/session-auto-title.sh +165 -0
- package/hooks/session-checkpoint.sh +97 -0
- package/hooks/session-cost-log.sh +77 -0
- package/hooks/session-log-action.sh +36 -0
- package/hooks/session-log-prompt.sh +25 -0
- package/hooks/session-restore.sh +45 -0
- package/hooks/session-save.sh +81 -0
- package/hooks/session-summarize.sh +154 -0
- package/hooks/validate-commit-format.sh +38 -0
- package/hooks/weekly-priority-map-review.sh +143 -0
- package/install.sh +46 -0
- package/package.json +67 -0
- package/scripts/ci/bootstrap-dry-run.sh +40 -0
- package/scripts/ci/check.sh +65 -0
- package/scripts/posthog-snapshot-loader.sh +112 -0
- package/skills/context-budget/SKILL.md +86 -0
- package/skills/memory-review/SKILL.md +100 -0
- package/skills/model-routing/SKILL.md +70 -0
- package/skills/posthog-weekly/SKILL.md +271 -0
- package/skills/ui-ux-pro-max/SKILL.md +377 -0
- package/skills/ui-ux-pro-max/data/charts.csv +26 -0
- package/skills/ui-ux-pro-max/data/colors.csv +97 -0
- package/skills/ui-ux-pro-max/data/icons.csv +101 -0
- package/skills/ui-ux-pro-max/data/landing.csv +31 -0
- package/skills/ui-ux-pro-max/data/products.csv +97 -0
- package/skills/ui-ux-pro-max/data/react-performance.csv +45 -0
- package/skills/ui-ux-pro-max/data/stacks/astro.csv +54 -0
- package/skills/ui-ux-pro-max/data/stacks/flutter.csv +53 -0
- package/skills/ui-ux-pro-max/data/stacks/html-tailwind.csv +56 -0
- package/skills/ui-ux-pro-max/data/stacks/jetpack-compose.csv +53 -0
- package/skills/ui-ux-pro-max/data/stacks/nextjs.csv +53 -0
- package/skills/ui-ux-pro-max/data/stacks/nuxt-ui.csv +51 -0
- package/skills/ui-ux-pro-max/data/stacks/nuxtjs.csv +59 -0
- package/skills/ui-ux-pro-max/data/stacks/react-native.csv +52 -0
- package/skills/ui-ux-pro-max/data/stacks/react.csv +54 -0
- package/skills/ui-ux-pro-max/data/stacks/shadcn.csv +61 -0
- package/skills/ui-ux-pro-max/data/stacks/svelte.csv +54 -0
- package/skills/ui-ux-pro-max/data/stacks/swiftui.csv +51 -0
- package/skills/ui-ux-pro-max/data/stacks/vue.csv +50 -0
- package/skills/ui-ux-pro-max/data/styles.csv +68 -0
- package/skills/ui-ux-pro-max/data/typography.csv +58 -0
- package/skills/ui-ux-pro-max/data/ui-reasoning.csv +101 -0
- package/skills/ui-ux-pro-max/data/ux-guidelines.csv +100 -0
- package/skills/ui-ux-pro-max/data/web-interface.csv +31 -0
- package/skills/ui-ux-pro-max/scripts/core.py +253 -0
- package/skills/ui-ux-pro-max/scripts/design_system.py +1067 -0
- package/skills/ui-ux-pro-max/scripts/search.py +114 -0
- package/templates/AGENTS.runtime.md +17 -0
- package/templates/CLAUDE.md +252 -0
- package/templates/claude-monitor.plist +35 -0
- package/templates/keybindings.json +13 -0
- package/templates/merge-settings.jq +53 -0
- package/templates/review-upgrades.md +44 -0
- package/templates/settings.json +255 -0
- package/templates/statusline-command.sh +182 -0
- package/tests/fixtures/hooks/events.json +32 -0
- package/tools/session-costs-view.sh +128 -0
- package/tools/session-dashboard-gen.sh +369 -0
- package/tools/session-live.sh +173 -0
- package/tools/session-server.js +441 -0
|
@@ -0,0 +1,486 @@
|
|
|
1
|
+
# Sprint Status — Consolidate everything into Linear + generate review outputs
|
|
2
|
+
|
|
3
|
+
The heaviest command. Ingests **Linear + Git across all configured repos + Slack (channels + DMs)** — plus optional Notion and Intercom if your team uses them — deduplicates, and **writes the consolidated state back into Linear** (creating missing issues, updating statuses, reassigning based on git authorship). Then produces three separate outputs.
|
|
4
|
+
|
|
5
|
+
**Linear is the single source of truth.** Git, Slack, Notion, and Intercom are inputs that feed Linear. When Notion is configured, it is a historical view only — this command NEVER creates cards in Notion, only reads from it and (optionally) updates state of existing cards that are desynced.
|
|
6
|
+
|
|
7
|
+
## Configuration (edit this section for your team)
|
|
8
|
+
|
|
9
|
+
Before using this skill, edit the YAML block below with your team's repos, channels, Linear setup, and integrations. Sections marked `[OPTIONAL]` can be deleted if your team does not use that system. Replace every `Cxxxxxxx` / `Uxxxxxxx` / `xxxxx-xxxx` placeholder with real IDs from your workspace.
|
|
10
|
+
|
|
11
|
+
```yaml
|
|
12
|
+
# --- Linear workspace ---
|
|
13
|
+
linear:
|
|
14
|
+
team_name: "YourTeam"
|
|
15
|
+
team_id: "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
|
|
16
|
+
team_key: "TEAM" # Used as issue prefix (e.g. TEAM-123)
|
|
17
|
+
primary_user_id: "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
|
|
18
|
+
primary_user_email: "you@company.com"
|
|
19
|
+
|
|
20
|
+
# --- Team member mapping (git email ≠ Linear email is common) ---
|
|
21
|
+
team_members:
|
|
22
|
+
- git_email: "you@company.com"
|
|
23
|
+
name: "You"
|
|
24
|
+
linear_id: "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
|
|
25
|
+
- git_email: "teammate@company.com"
|
|
26
|
+
name: "Teammate"
|
|
27
|
+
linear_id: "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
|
|
28
|
+
- git_email: "nondev@company.com"
|
|
29
|
+
name: "PM"
|
|
30
|
+
linear_id: null # Never in Linear — never assign
|
|
31
|
+
|
|
32
|
+
# --- Git repos to scan ---
|
|
33
|
+
git_repos:
|
|
34
|
+
- ~/your-org/api-repo
|
|
35
|
+
- ~/your-org/frontend-repo
|
|
36
|
+
|
|
37
|
+
# --- Slack channels ---
|
|
38
|
+
slack_channels:
|
|
39
|
+
- { name: "#clients", id: "Cxxxxxxx" }
|
|
40
|
+
- { name: "#tech-guild", id: "Cxxxxxxx" }
|
|
41
|
+
- { name: "#incidents", id: "Cxxxxxxx" }
|
|
42
|
+
|
|
43
|
+
# --- Slack DMs (privacy gate applies) ---
|
|
44
|
+
slack_dms:
|
|
45
|
+
- { name: "PM/CEO", id: "Uxxxxxxx" }
|
|
46
|
+
- { name: "CS Lead", id: "Uxxxxxxx" }
|
|
47
|
+
|
|
48
|
+
# --- Optional integrations ---
|
|
49
|
+
integrations:
|
|
50
|
+
notion: false # [OPTIONAL] Sprints/Backlog DBs
|
|
51
|
+
intercom: false # [OPTIONAL] Client conversations
|
|
52
|
+
|
|
53
|
+
notion: # Only read if integrations.notion = true
|
|
54
|
+
sprints_db_id: "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
|
|
55
|
+
backlog_db_id: "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
## When to use
|
|
59
|
+
|
|
60
|
+
- Weekly sprint review where you need one reconciled view across all channels
|
|
61
|
+
- When Linear, git, and team conversations have drifted and you want one consolidated state
|
|
62
|
+
- Before talking to your PM/CEO/CS team about delivery status
|
|
63
|
+
- After a messy sprint to clean up the tracking state
|
|
64
|
+
|
|
65
|
+
## Core design principles
|
|
66
|
+
|
|
67
|
+
- **Linear = single source of truth.** Everything else is an input.
|
|
68
|
+
- **Early-stage disorder is expected.** The job of this command is to resolve it, not to complain about it.
|
|
69
|
+
- **1 PR → 1 or more cards. Every PR must be covered by at least one card.** The default is 1-to-1, but a single PR that actually contains several distinct features/fixes SHOULD produce multiple cards — one per logical unit of work. Sometimes even a single large commit inside a PR warrants its own card. The rule is about fidelity to the real work done, not about matching PR count. A week with 40 merged PRs typically produces **40 or more** cards, never fewer. The ratio `cards / PRs` must be `>= 1.0` as a floor (below 1 = you're hiding work by bundling). There is no upper bound.
|
|
70
|
+
- **Dedup conservatively.** A false negative (two Linear issues for one thing) is easy to merge later. A false positive loses information. When in doubt, keep separate and flag for human review.
|
|
71
|
+
- **Privacy gate on DMs.** Messages from configured `slack_dms` pass through a work-vs-personal classifier. Personal content is dropped entirely — never logged, never quoted, never added to Linear, never mentioned in outputs.
|
|
72
|
+
- **Shared-system writes are gated.** Creating/updating Linear issues affects the team. First run defaults to `--dry-run`: print the proposed diff and wait for explicit confirmation.
|
|
73
|
+
- **NEVER post directly to ANY Slack channel or DM.** Every message — `#clients`, `#incidents`, `#tech-guild`, any DM, any audience — goes via `slack_send_message_draft`. The user reviews in Slack and sends manually. Zero exceptions.
|
|
74
|
+
- **Intercom writes (notes, replies) are also gated** when the integration is enabled. They are proposed in the Phase 5 diff and wait for explicit confirmation, same as Linear writes. Never auto-reply to customers.
|
|
75
|
+
|
|
76
|
+
## Inputs / flags
|
|
77
|
+
|
|
78
|
+
- `--dry-run` — ingest, dedup, reconcile, print the proposed Linear diff. **Do NOT write to Linear.** Use for first pass or whenever unsure.
|
|
79
|
+
- `--yes` — skip the confirmation gate and execute writes immediately. Only after several successful dry-runs.
|
|
80
|
+
- `--sprint N[,M]` — target specific sprint numbers. Default: active sprints.
|
|
81
|
+
- `--window DAYS` — commit/Slack lookback window. Default: `14`.
|
|
82
|
+
- `--since ISO` — alternative to `--window`, explicit start date.
|
|
83
|
+
- `--backfill` — include the retroactive backfill phase (Phase 3b below). Off by default; on for first-ever runs or when the user explicitly asks for "catch up Linear with everything I've done".
|
|
84
|
+
|
|
85
|
+
**Default behavior (no flags):** ingest → dedup → reconcile → print Linear diff → wait for confirmation → execute writes → emit three outputs.
|
|
86
|
+
|
|
87
|
+
## Data sources
|
|
88
|
+
|
|
89
|
+
### Linear
|
|
90
|
+
- Active cycle for the team
|
|
91
|
+
- ALL issues touched in the window, not just ones assigned to the user
|
|
92
|
+
- Linear = destination of writes, not just source to read
|
|
93
|
+
- Use `linear.team_id` / `linear.team_key` from configuration above
|
|
94
|
+
|
|
95
|
+
**Team member mapping** (critical — git email ≠ Linear email is common): use the `team_members` block from configuration. Cache the map across runs. Refresh only if `list_users` returns new members.
|
|
96
|
+
|
|
97
|
+
**Linear label constraints** (learned the hard way):
|
|
98
|
+
- Labels live in **groups** (e.g. "Repo", "Type", "Area"). Within a group, **only ONE label per issue is allowed**. Trying to set two labels from the same group fails with `LabelIds not exclusive child labels`.
|
|
99
|
+
- When a feature touches multiple repos: pick the **most representative** repo label (usually where the primary logic lives) and mention the others in the description.
|
|
100
|
+
- Type-group conflicts are common (`task` + `maintenance`, `task` + `Improvement`). Pick one.
|
|
101
|
+
- Before creating issues in bulk, fetch `list_issue_labels` once and cache the label → group mapping to avoid failed requests.
|
|
102
|
+
|
|
103
|
+
### Git (local repos)
|
|
104
|
+
For each path in `git_repos`:
|
|
105
|
+
- `git fetch origin --prune`
|
|
106
|
+
- Capture main, staging, and feature branches
|
|
107
|
+
- Critically: capture author email for each commit (for the team member mapping above)
|
|
108
|
+
|
|
109
|
+
### Slack
|
|
110
|
+
For each channel in `slack_channels`:
|
|
111
|
+
- Read messages in the window
|
|
112
|
+
|
|
113
|
+
For each DM in `slack_dms`:
|
|
114
|
+
- Read messages in the window with the privacy gate applied
|
|
115
|
+
|
|
116
|
+
### Notion `[OPTIONAL]` (if `integrations.notion`)
|
|
117
|
+
- Sprints DB + Backlog DB from `notion.sprints_db_id` / `notion.backlog_db_id`
|
|
118
|
+
- **Read-only.** Always `notion-fetch` the DB first to discover property names. Do NOT hardcode property keys.
|
|
119
|
+
- **Warning:** querying a full Sprints DB view may return 250KB+ and blow the context. If that happens, skip Notion as primary source and rely on Linear (which already has the sprint info in issue descriptions). Fetch individual Notion pages by ID only when cross-referencing a specific card.
|
|
120
|
+
- **Notion write policy:** **NO creating new cards in Notion from this command.** The only allowed Notion writes are `update_properties` on existing pages whose status in Notion is clearly stale compared to the reconciled state. Even those updates are proposed in the diff and wait for confirmation.
|
|
121
|
+
|
|
122
|
+
### Intercom `[OPTIONAL]` (if `integrations.intercom`)
|
|
123
|
+
- When a team uses Intercom, it's typically the canonical source for client conversations; Slack client channels are usually a mirror.
|
|
124
|
+
- `mcp__intercom__search_conversations` filtered by the configured window (default 14 days)
|
|
125
|
+
- `mcp__intercom__get_conversation` to fetch the full transcript of any conversation referenced from a Slack channel, a PR, or a Linear issue
|
|
126
|
+
- `mcp__intercom__get_contact` + `mcp__intercom__get_company` to enrich with customer name and company when the Slack forward only has an email
|
|
127
|
+
- **Read + write**: the MCP supports notes/replies. Writes are proposed in the Phase 5 diff and wait for explicit confirmation alongside Linear writes. **Never auto-reply to a customer.** Only internal notes for the CS lead.
|
|
128
|
+
|
|
129
|
+
## Phases
|
|
130
|
+
|
|
131
|
+
### Phase 1 — Ingest (parallel, read-only)
|
|
132
|
+
|
|
133
|
+
Launch concurrently (fully independent):
|
|
134
|
+
|
|
135
|
+
1. **Linear** — `list_cycles` current + `list_issues` updated in window + `list_users` for mapping + `list_issue_labels` for constraint map.
|
|
136
|
+
2. **Git across all repos** — fetch + main/staging/branches + `gh pr list --author "@me" --state merged --search "merged:>=DATE"` for the full merge log in the window.
|
|
137
|
+
3. **Slack** — read each channel + each DM with the privacy gate applied.
|
|
138
|
+
4. **Notion** `[OPTIONAL]` — fetch schemas, query backlog top 50, skip sprints DB query if it blows context.
|
|
139
|
+
5. **Intercom** `[OPTIONAL]` — `search_conversations` in the full window. Cache conversation IDs for cross-ref in Phase 1.5.
|
|
140
|
+
|
|
141
|
+
### Phase 1.5 — Intercom cross-ref `[OPTIONAL]` (only if `integrations.intercom`)
|
|
142
|
+
|
|
143
|
+
For each thread in Slack client channels that is Intercom-forwarded (identifiable by an Intercom bot author or pattern like "New conversation from [client]"), fetch the full conversation from Intercom with `mcp__intercom__get_conversation` and enrich the canonical item with:
|
|
144
|
+
|
|
145
|
+
- Contact name, company, email (`get_contact` + `get_company` if needed)
|
|
146
|
+
- Full transcript summary (not just the snippet of the forward)
|
|
147
|
+
- Current Intercom state (open / snoozed / closed)
|
|
148
|
+
- Direct URL to the conversation in Intercom
|
|
149
|
+
|
|
150
|
+
**Why:** drafts posted to client channels later (Phase 8) need to reflect the real customer context, not just the first line of the forward. It also allows detecting mismatches: forward exists in Slack but conversation is closed in Intercom → flag.
|
|
151
|
+
|
|
152
|
+
**Calibration:** if the client channel has N Intercom-forwarded threads in the window and `search_conversations` returns fewer matchable conversations, flag "possible Slack↔Intercom mismatch" in the output.
|
|
153
|
+
|
|
154
|
+
### Phase 2 — Privacy gate (DMs only)
|
|
155
|
+
|
|
156
|
+
For every message from configured DMs, classify as `work` or `personal`.
|
|
157
|
+
|
|
158
|
+
**Signals FOR work:** client names, product features, ticket IDs, PR URLs, repo names, technical terms, explicit asks with business context, deliverables, meetings, roadmap, deadlines.
|
|
159
|
+
|
|
160
|
+
**Signals AGAINST work:** family, relationships, health, personal finance, weekend plans, hobbies, memes, casual banter, venting unrelated to work items, politics, social-only content.
|
|
161
|
+
|
|
162
|
+
**Ambiguous → DROP.** Treat as personal.
|
|
163
|
+
|
|
164
|
+
**Hard rules:**
|
|
165
|
+
- Personal content NEVER appears in any output, ever.
|
|
166
|
+
- No counts, no dates of filtered messages. No metadata that could reverse-engineer dropped content.
|
|
167
|
+
- Only one generic line allowed in Output 3: "Personal chats with configured DMs: processed through privacy filter; work-only content included below."
|
|
168
|
+
|
|
169
|
+
### Phase 3 — Deduplicate and build canonical items
|
|
170
|
+
|
|
171
|
+
Build canonical work items. Matching signals in order of confidence:
|
|
172
|
+
|
|
173
|
+
1. **Explicit ticket ID** in any source → that's the canonical ID.
|
|
174
|
+
2. **Shared PR URL or branch name** → same item.
|
|
175
|
+
3. **Same Notion page ID** → collapse Notion duplicates.
|
|
176
|
+
4. **Title similarity >80%** + same client/feature anchor → merge.
|
|
177
|
+
5. **Client-specific anchor** (same client name + same incident type within 48h) → consider merging.
|
|
178
|
+
|
|
179
|
+
**Never merge when:**
|
|
180
|
+
- Two items have different explicit ticket IDs.
|
|
181
|
+
- Two items have the same title but different clients.
|
|
182
|
+
- Two items touch different repos AND have no shared reference.
|
|
183
|
+
|
|
184
|
+
**1 PR → 1 or more cards. Every PR must be covered by at least one card.** The default is 1-to-1, but PRs that contain multiple distinct features/fixes should be split into multiple cards, one per logical unit. Even individual commits inside a fat PR can warrant their own card when they represent independent work. A bug fix + a feature in the same PR are ALWAYS separate cards. The rule: **every piece of logical work becomes visible as a card**. Never hide work by bundling heroically under a single umbrella card.
|
|
185
|
+
|
|
186
|
+
The only cross-PR bundling allowed is when 2-4 PRs form literally ONE logical feature across repos (e.g. API endpoint + frontend page + propagation-service = 1 card like "Multi-tenant iframe filter"). This is the rare exception, not the default.
|
|
187
|
+
|
|
188
|
+
### Phase 3b — Backfill retroactive (only if `--backfill` flag)
|
|
189
|
+
|
|
190
|
+
For every merged PR in the window that has NO Linear issue linked and is NOT covered by any canonical item from Phase 3:
|
|
191
|
+
|
|
192
|
+
- Create one `bf-NN` canonical item per PR.
|
|
193
|
+
- Group ONLY when a cross-repo set of PRs was clearly one feature (same branch name pattern, same day, same subject stem).
|
|
194
|
+
- State: `Done` (merged to main) or `In Review` (merged to staging only).
|
|
195
|
+
- Assignee: the git author mapped via the team member mapping.
|
|
196
|
+
- Cycle: current cycle if merge date ≥ cycle start, else no cycle.
|
|
197
|
+
- Description should include: PR number(s), merge date, branch name, one-paragraph summary of what the PR did, related tickets if any, cluster this fix belongs to.
|
|
198
|
+
- **Calibration check:** if the user has N merged PRs in the window and the backfill produces < N × 0.7 cards, something is wrong — you're over-bundling. Expand.
|
|
199
|
+
|
|
200
|
+
### Phase 4 — Reconcile state and authorship
|
|
201
|
+
|
|
202
|
+
**State resolution** (priority: git > Linear > Notion > Slack):
|
|
203
|
+
|
|
204
|
+
1. PR merged to `main` → `Done`
|
|
205
|
+
2. PR merged to `staging` → `In Review` + label `pending-prod`
|
|
206
|
+
3. PR open → `In Review`
|
|
207
|
+
4. Branch has commits in window → `In Progress`
|
|
208
|
+
5. Linear says `In Progress` / `In Review` → keep
|
|
209
|
+
6. Notion says `Done` but no git evidence → flag `Desalineado`, keep latest of {Linear, Notion}
|
|
210
|
+
7. Else → `Todo`
|
|
211
|
+
|
|
212
|
+
**Blockers:**
|
|
213
|
+
- Explicit "blocked" / "blocker" / "stuck" / "waiting" in Notion, Linear comments, Slack
|
|
214
|
+
- Implicit: no commits in 7+ days on a branch marked In Progress + PR with CI failing
|
|
215
|
+
- Stale PRs (>7 days without update), merge conflicts
|
|
216
|
+
|
|
217
|
+
**Assignee resolution:**
|
|
218
|
+
- Git author of the most recent commit on the item's branch
|
|
219
|
+
- Map via `team_members` (git email → Linear user)
|
|
220
|
+
- If author not in Linear → unassigned + mention in description
|
|
221
|
+
- Multiple authors → primary = most recent commit, others as collaborators in description
|
|
222
|
+
|
|
223
|
+
### Phase 5 — Compute Linear diff
|
|
224
|
+
|
|
225
|
+
Per canonical item, compute the operation:
|
|
226
|
+
|
|
227
|
+
- **CREATE** — no ticket ID. Build draft:
|
|
228
|
+
- `title`: best from sources
|
|
229
|
+
- `description`: markdown with what, sources (Notion link, PR URL, Slack permalinks), client name, rationale for inferred state
|
|
230
|
+
- `state`: inferred state
|
|
231
|
+
- `assignee`: inferred assignee (mapped via team map)
|
|
232
|
+
- `labels`: **one per group max**, derived from repo/type/area. Mention cross-repo context in description.
|
|
233
|
+
- `cycle`: current if within cycle dates
|
|
234
|
+
- `priority`: inherit from Notion/Linear if set
|
|
235
|
+
|
|
236
|
+
- **UPDATE_STATE** — existing Linear issue with different reconciled state
|
|
237
|
+
- **UPDATE_ASSIGNEE** — different reconciled assignee
|
|
238
|
+
- **ADD_COMMENT** — new Slack/git context not captured yet
|
|
239
|
+
- **ADD_LABEL** — missing labels (respecting group constraint)
|
|
240
|
+
- **NOTION_UPDATE** `[OPTIONAL]` — existing Notion card with stale status vs reconciled (rare, use sparingly)
|
|
241
|
+
- **NO_CHANGE** — everything aligned
|
|
242
|
+
|
|
243
|
+
Each operation records a one-line `reason` for the confirmation step.
|
|
244
|
+
|
|
245
|
+
### Phase 6 — Confirmation gate
|
|
246
|
+
|
|
247
|
+
Print the diff as a human-readable plan, then:
|
|
248
|
+
- `--dry-run` → STOP, emit outputs without writing.
|
|
249
|
+
- `--yes` → proceed without asking.
|
|
250
|
+
- Default → wait for user:
|
|
251
|
+
- `apply all`
|
|
252
|
+
- `apply 1,3,5-8`
|
|
253
|
+
- `apply core` — preset of high-leverage ops (user decides scope per run)
|
|
254
|
+
- `cancel`
|
|
255
|
+
- `show N` — expand operation N before deciding
|
|
256
|
+
|
|
257
|
+
### Phase 7 — Execute Linear writes
|
|
258
|
+
|
|
259
|
+
Execute sequentially (MCP rate limits). Continue on individual failures, report all at the end.
|
|
260
|
+
|
|
261
|
+
**Label failure retry:** if an operation fails with `LabelIds not exclusive child labels`, auto-drop the lower-priority label from the conflicting group and retry once. Log both labels in the description.
|
|
262
|
+
|
|
263
|
+
Summary format:
|
|
264
|
+
```
|
|
265
|
+
## Linear — changes applied
|
|
266
|
+
✓ Created: N (with URLs and IDs)
|
|
267
|
+
✓ Updated: N
|
|
268
|
+
✓ Commented: N
|
|
269
|
+
✗ Failed: N (with reason for each)
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
Rollback hint: list created IDs so they can be deleted manually if needed.
|
|
273
|
+
|
|
274
|
+
### Phase 8 — Slack message drafts + Intercom notes (ALL drafts, zero direct sends)
|
|
275
|
+
|
|
276
|
+
**Zero direct sends rule:** every message produced by this phase — regardless of channel or audience — is created via `slack_send_message_draft`. No exception for internal channels, no exception for teammate DMs. The user is the only sender.
|
|
277
|
+
|
|
278
|
+
For each Slack thread or DM that needs a response based on the reconciled state, produce a **draft** via `slack_send_message_draft` (NOT a direct post). The user reviews in Slack and sends.
|
|
279
|
+
|
|
280
|
+
**Tone rules for draft content:**
|
|
281
|
+
- **When the audience is non-technical** (recruiters, CS, business): write in simple, warm, direct language. **NEVER mention PR numbers, ticket IDs, class names, controller names, branch names, or technical jargon.** Instead: "fixed", "already in production", "the problem was X".
|
|
282
|
+
- **If something doesn't exist in the product, the answer is "we don't have it". Period.** NEVER offer to develop it. Do not say "we could plan it", "if you want we'll build it", "we'll propose it as an improvement". That creates false expectations and inflates scope.
|
|
283
|
+
- **Offering solutions requires pre-approval** from the user, EXCEPT when it's a quick-win: small change, doesn't break anything, reversible, clear. Quick-wins can be offered as "quick fix". Everything else: draft a response that just acknowledges and states the current state.
|
|
284
|
+
- **For status updates on fixed bugs:** confirm the fix in plain language. Do not cite PR or tech details. "Fixed, already in production. Let me know if it happens again."
|
|
285
|
+
- **For "can we add X?" questions:** if X exists → say so. If X doesn't exist → "we currently don't have this". Do NOT add "but it could be developed".
|
|
286
|
+
- **When the audience is technical** (dev-only channels): jargon, PR numbers, ticket IDs, branch names are all fine.
|
|
287
|
+
|
|
288
|
+
**Draft targets (when relevant):**
|
|
289
|
+
- Threads in incident channels that need status confirmation → draft as reply in the incident thread (`thread_ts` = parent message). Audience: your CS/PM leads plus the rest of the team reading the channel. Tone: internal, concise.
|
|
290
|
+
- Threads in client channels where a conversation was forwarded from Intercom (or any external source) → **draft as reply in that thread tagging the CS lead** so they get notified. **Critical understanding:** internal client channels are NOT visible to customers — they are a notification mirror. The CS lead is the one who reads them and responds to the customer directly from the original tool (Intercom, Zendesk, etc.). So the draft is NOT a customer-facing message — it's an internal note with the technical context + optionally a suggested customer-facing phrasing that CS can copy-edit. Always tag the CS lead.
|
|
291
|
+
- DM the PM/CEO → internal coordination asks that are NOT about a specific customer. **Also draft.**
|
|
292
|
+
- Dev channels (tech-guild, status updates) → **also draft**, never direct send.
|
|
293
|
+
|
|
294
|
+
**Never draft on behalf of the user:**
|
|
295
|
+
- Anything to a customer directly (Intercom/Zendesk conversations) — propose as **internal note for CS**, not as reply
|
|
296
|
+
- Financial/legal/compliance decisions
|
|
297
|
+
- Anything requiring the user's explicit judgment call
|
|
298
|
+
|
|
299
|
+
**Intercom drafts** `[OPTIONAL]`:
|
|
300
|
+
- When a canonical item resolves a client issue tracked in Intercom, propose an internal `note` in the conversation so CS can see it and, if appropriate, use it as base for the customer reply. **Never a direct reply to the customer.**
|
|
301
|
+
- Writes to Intercom (`create note`, `update conversation`) execute only after explicit confirmation from the user, same as Linear writes.
|
|
302
|
+
- If the Intercom conversation is already `closed` and the fix is newer, propose `reopen` + note. Wait for confirmation.
|
|
303
|
+
|
|
304
|
+
**There are NO internal channels exempt from the draft rule.** Every Slack message — tech-guild, DM to a teammate, anything — goes via `slack_send_message_draft`. The user reviews and sends from Slack.
|
|
305
|
+
|
|
306
|
+
### Phase 9 — Three outputs
|
|
307
|
+
|
|
308
|
+
---
|
|
309
|
+
|
|
310
|
+
## OUTPUT 1 — Linear consolidated (summary)
|
|
311
|
+
|
|
312
|
+
```
|
|
313
|
+
# Linear — Sprint [N+M] consolidated — [date]
|
|
314
|
+
|
|
315
|
+
## By state (post-apply)
|
|
316
|
+
- Done (in prod): N
|
|
317
|
+
- In Review (staging pending prod): N
|
|
318
|
+
- In Review (PR open): N
|
|
319
|
+
- In Progress: N
|
|
320
|
+
- Todo: N
|
|
321
|
+
- Blocked: N
|
|
322
|
+
|
|
323
|
+
## By assignee
|
|
324
|
+
- @user1: N
|
|
325
|
+
- @user2: N
|
|
326
|
+
- unassigned: N (details)
|
|
327
|
+
|
|
328
|
+
## By repo
|
|
329
|
+
- repo-1: N | repo-2: N | repo-3: N | ...
|
|
330
|
+
|
|
331
|
+
## Active stoppers (detail in Output 3)
|
|
332
|
+
- TICKET-ID — short reason
|
|
333
|
+
|
|
334
|
+
## Issues created in this run
|
|
335
|
+
- TICKET-ID Title — source (Slack / backfill / Notion / new)
|
|
336
|
+
```
|
|
337
|
+
|
|
338
|
+
---
|
|
339
|
+
|
|
340
|
+
## OUTPUT 2 — Review for PM + CS (copy-paste ready, work-only)
|
|
341
|
+
|
|
342
|
+
Warm, professional language. 250-450 words. Zero jargon. Zero PR#. Zero ticket IDs. Zero personal content.
|
|
343
|
+
|
|
344
|
+
**Dual-audience note:** when the target channel is mixed (devs + non-devs), the report must be accessible to non-technical readers but with enough technical signal for devs. **By default**, apply a "topic-level translation" rule: each technical section leads with a 1-2 line plain-language sentence ("what this means for the customer") followed by the technical detail. If the channel is purely non-technical, omit the technical detail entirely. If the channel is purely technical, the opposite. Safe default: dual layer per section.
|
|
345
|
+
|
|
346
|
+
```
|
|
347
|
+
# Sprint [N+M] — review [week DD/MM to DD/MM]
|
|
348
|
+
|
|
349
|
+
Hi 👋 Consolidated status update.
|
|
350
|
+
|
|
351
|
+
## 🟢 Delivered to customers (in production)
|
|
352
|
+
3-7 bullets per feature or client, connecting to business value.
|
|
353
|
+
|
|
354
|
+
## 🚢 Ready, waiting for prod deploy
|
|
355
|
+
What is already in pre-prod (staging). Include ETA if known.
|
|
356
|
+
|
|
357
|
+
## 🔄 In progress (focus of the week)
|
|
358
|
+
Top 5 in flight, who leads, % estimate if applicable.
|
|
359
|
+
|
|
360
|
+
## 🔴 Stoppers and risks
|
|
361
|
+
Only what impacts delivery: reason, owner, help needed.
|
|
362
|
+
|
|
363
|
+
## 📬 Pending from CS / customers not yet queued
|
|
364
|
+
Detected requests not yet in the queue, with suggested priority.
|
|
365
|
+
|
|
366
|
+
## 📊 Numbers
|
|
367
|
+
- Delivered: N | In staging: N | In progress: N | Stoppers: N
|
|
368
|
+
|
|
369
|
+
## 🎯 Focus next week
|
|
370
|
+
2-3 sentences prioritizing what's next and why.
|
|
371
|
+
|
|
372
|
+
Comments, priority adjustments? 🙏
|
|
373
|
+
```
|
|
374
|
+
|
|
375
|
+
**Format rules for Output 2:**
|
|
376
|
+
- Warm but professional.
|
|
377
|
+
- No unnecessary technical language. "PR merged" NO; "delivered" YES.
|
|
378
|
+
- Zero internal jargon. "merged to main" NO; "in production" YES.
|
|
379
|
+
- Don't mention IDs unless CS already uses them.
|
|
380
|
+
- 250-450 words. Scrollable.
|
|
381
|
+
- Always close with an open question inviting a reply.
|
|
382
|
+
|
|
383
|
+
---
|
|
384
|
+
|
|
385
|
+
## OUTPUT 3 — Personal list for the user (brutal and direct)
|
|
386
|
+
|
|
387
|
+
```
|
|
388
|
+
# Your personal focus — [date]
|
|
389
|
+
|
|
390
|
+
## ✅ Closed since the last run
|
|
391
|
+
Short list of what was unblocked.
|
|
392
|
+
|
|
393
|
+
## 🛑 Stoppers (what's blocking you TODAY)
|
|
394
|
+
- **[TICKET-ID] Title** — blocked for N days. Reason: X. Unblock: 1 concrete action.
|
|
395
|
+
|
|
396
|
+
## ⏳ Your specific pending items
|
|
397
|
+
Things assigned to you with detected friction.
|
|
398
|
+
|
|
399
|
+
## 🔔 Need your response (Slack work-only)
|
|
400
|
+
- #channel [date] — [work-only summary] — suggestion: [action]
|
|
401
|
+
- DM [person] [date] — [work-only ask] — suggestion: [action]
|
|
402
|
+
|
|
403
|
+
Personal chats with configured DMs: processed through privacy filter; work-only content included above.
|
|
404
|
+
|
|
405
|
+
## 🎯 Top 3 highest-leverage actions
|
|
406
|
+
1. [action, 1 line]
|
|
407
|
+
2. [action, 1 line]
|
|
408
|
+
3. [action, 1 line]
|
|
409
|
+
|
|
410
|
+
## 📝 Useful detected context
|
|
411
|
+
PRs from others waiting for your review, tech-guild decisions affecting you, unowned incidents, etc.
|
|
412
|
+
```
|
|
413
|
+
|
|
414
|
+
**Format rules for Output 3:**
|
|
415
|
+
- Direct, no filler.
|
|
416
|
+
- Specific actions with concrete verbs ("merge PR #123", not "handle PRs").
|
|
417
|
+
- If no stoppers → "No active stoppers. Clean focus 🟢".
|
|
418
|
+
- Zero personal content. Privacy gate applies.
|
|
419
|
+
- **This output CAN use PR# and ticket IDs** — it's only for the user.
|
|
420
|
+
|
|
421
|
+
---
|
|
422
|
+
|
|
423
|
+
## Notes — critical rules (consolidated)
|
|
424
|
+
|
|
425
|
+
### DM privacy (Javi + Samu style configured DMs)
|
|
426
|
+
- Conservative filter: doubt → personal → discarded.
|
|
427
|
+
- Personal content NEVER appears, not even as a count or metadata.
|
|
428
|
+
- One generic line allowed in Output 3; nothing else.
|
|
429
|
+
|
|
430
|
+
### Dedup
|
|
431
|
+
- Prefer false negatives (2 issues for the same thing) over false positives.
|
|
432
|
+
- Conservative match by client + feature anchor.
|
|
433
|
+
- Doubt → keep separate and flag.
|
|
434
|
+
|
|
435
|
+
### Backfill granularity
|
|
436
|
+
- **1 PR → 1 or more cards.** Every PR must be covered by at least 1 card.
|
|
437
|
+
- Default 1-to-1, but if a PR contains several distinct features/fixes, split into multiple cards (even 1 per commit if applicable).
|
|
438
|
+
- Cross-PR bundling (2-4 PRs in 1 card) is the **rare exception**, only when they literally form one cross-repo feature.
|
|
439
|
+
- **Floor:** `cards / PRs >= 1.0`. Below = over-bundling, expand.
|
|
440
|
+
- **No upper bound:** 40 PRs can absolutely produce 55 cards if several PRs contain multiple fixes.
|
|
441
|
+
|
|
442
|
+
### Linear writes
|
|
443
|
+
- Default dry-run. Explicit confirmation by index allowed.
|
|
444
|
+
- `--yes` only after several OK runs.
|
|
445
|
+
- Label group constraint: 1 per group. Fetch labels first.
|
|
446
|
+
- If CREATE fails mid-stream, continue and report at the end.
|
|
447
|
+
- Rollback hint with created IDs.
|
|
448
|
+
|
|
449
|
+
### Notion `[OPTIONAL]`
|
|
450
|
+
- **Read-only + state updates on existing cards when they are desynced.**
|
|
451
|
+
- NO creating new cards from this command.
|
|
452
|
+
- Linear is the only source of truth.
|
|
453
|
+
|
|
454
|
+
### Slack messaging (CRITICAL)
|
|
455
|
+
- **ALL channels and DMs: ALWAYS draft, never direct send.** Zero exceptions. The user is the only sender.
|
|
456
|
+
- **Non-technical tone for CS/external audiences:** zero PR#, zero ticket IDs, zero class/controller names, zero jargon.
|
|
457
|
+
- **Don't offer development:** if something doesn't exist → "we don't have it", period. NO "we could develop it".
|
|
458
|
+
- **Quick wins** can be offered if they're small, reversible, don't break anything.
|
|
459
|
+
- **Internal dev channels and teammate DMs:** also draft. The difference with CS is just the tone (jargon OK for devs), not the send mechanism.
|
|
460
|
+
- **Intercom** `[OPTIONAL]`: never direct reply to customer. Only internal notes as drafts for CS.
|
|
461
|
+
- **Thread targeting (IMPORTANT):** drafts go as replies IN THE THREAD where the question/notification originally appeared, NOT as a separate DM. If a client forward landed in #clients, the draft goes in that thread (`thread_ts` = parent). If it was an incident in #incidents, the draft goes in the incident thread. Only use the CS DM for internal coordination that is NOT about a specific customer. This avoids scattering conversations and keeps context visible to the team.
|
|
462
|
+
- **Client channels are INTERNAL; customers do not read them.** They are a mirror where forwarded customer conversations appear as notifications. CS reads them and replies to the customer from the original tool. So when drafting a reply in a client channel: (1) it is NOT a customer-facing message, it's an internal note for CS; (2) **always tag the CS lead** so they get notified; (3) content: internal technical context + optionally a suggested customer-facing phrasing in italics that CS can copy-edit. Never write as if the customer would read it directly.
|
|
463
|
+
|
|
464
|
+
### Parallelization
|
|
465
|
+
- Phase 1 embarrassingly parallel.
|
|
466
|
+
- If > 40 canonical items → parallelize Phase 4/5 with subagents (1 per bucket).
|
|
467
|
+
|
|
468
|
+
### Offline sources
|
|
469
|
+
- Don't abort: degrade and report in `⚠ Sources unavailable` at the top of each output.
|
|
470
|
+
- Never fabricate data.
|
|
471
|
+
|
|
472
|
+
### Language
|
|
473
|
+
- Output language matches the user's `settings.json` language (default Spanish).
|
|
474
|
+
- Outputs 2 and 3 more conversational. Output 1 more structured.
|
|
475
|
+
|
|
476
|
+
### Safety
|
|
477
|
+
- This command does NOT touch git, does NOT make commits, does NOT push.
|
|
478
|
+
- Only writes to Linear (via MCP) and generates Slack drafts (+ optional Intercom notes).
|
|
479
|
+
- If there's doubt about anything destructive → STOP and ask.
|
|
480
|
+
|
|
481
|
+
### Sprint disorder
|
|
482
|
+
- Without arguments, pull active sprints (may be more than one).
|
|
483
|
+
- Do not attempt to "fix" Notion disorder by merging sprints; only consolidate in Linear.
|
|
484
|
+
|
|
485
|
+
### Retro calibration
|
|
486
|
+
- At the end of each run, report: "Processed X PRs, created Y cards, updated Z, Notion touched W". If Y/X < 0.7 and it's not a backfill run, warn about over-grouping.
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
---
|
|
2
|
+
allowed-tools: ""
|
|
3
|
+
description: Switch AXEL's response style for the current session
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
Switch response style based on the argument provided. Apply the selected style for the remainder of this session until the user switches again.
|
|
7
|
+
|
|
8
|
+
## Available styles
|
|
9
|
+
|
|
10
|
+
### `concise` (default)
|
|
11
|
+
- Short, direct answers. No preamble, no trailing summaries.
|
|
12
|
+
- Lead with the action or answer, not the reasoning.
|
|
13
|
+
- Code-heavy, explanation-light.
|
|
14
|
+
- This is the baseline defined in CLAUDE.md.
|
|
15
|
+
|
|
16
|
+
### `debug`
|
|
17
|
+
- Verbose, investigative mode. Think out loud.
|
|
18
|
+
- Show your reasoning chain: what you checked, what you ruled out, why.
|
|
19
|
+
- Include line numbers, stack traces, and intermediate findings.
|
|
20
|
+
- Explain cause-and-effect clearly.
|
|
21
|
+
- Useful for: debugging sessions, incident investigation, root cause analysis.
|
|
22
|
+
|
|
23
|
+
### `teach`
|
|
24
|
+
- Explain like a senior engineer mentoring a mid-level.
|
|
25
|
+
- Connect new concepts to things the user already knows (Ruby/Rails, Python, TS).
|
|
26
|
+
- Use analogies and concrete examples.
|
|
27
|
+
- After explaining, give the practical "how to apply this" takeaway.
|
|
28
|
+
- Useful for: learning new libraries, understanding unfamiliar codebases, architecture discussions.
|
|
29
|
+
|
|
30
|
+
### `architect`
|
|
31
|
+
- Think in systems, not files. Start with the big picture.
|
|
32
|
+
- Evaluate trade-offs explicitly: performance vs maintainability, speed vs correctness.
|
|
33
|
+
- Reference industry patterns (CQRS, event sourcing, hexagonal, etc.) when relevant.
|
|
34
|
+
- Produce structured decision records: Context → Options → Decision → Consequences.
|
|
35
|
+
- Useful for: design discussions, API design, refactoring strategy, database schema decisions.
|
|
36
|
+
|
|
37
|
+
### `review`
|
|
38
|
+
- Act as a critical code reviewer.
|
|
39
|
+
- Flag: bugs, security issues, edge cases, missing tests, CLAUDE.md violations.
|
|
40
|
+
- Score confidence (0-100) for each finding, only report 70+.
|
|
41
|
+
- Be brief per finding but thorough in coverage.
|
|
42
|
+
- Useful for: pre-commit review, PR review, pre-deploy checks.
|
|
43
|
+
|
|
44
|
+
### `ship`
|
|
45
|
+
- Maximum speed, minimum ceremony.
|
|
46
|
+
- Don't explain decisions — just make them.
|
|
47
|
+
- Don't ask questions — use best judgment.
|
|
48
|
+
- Don't suggest alternatives — pick one and go.
|
|
49
|
+
- Only output code and the minimal context needed to understand it.
|
|
50
|
+
- Useful for: rapid prototyping, batch implementation, known patterns.
|
|
51
|
+
|
|
52
|
+
## How to apply
|
|
53
|
+
|
|
54
|
+
Read the argument provided by the user. If it matches one of the styles above, acknowledge the switch in one short line and adopt that style immediately. If the argument is `reset`, return to `concise`.
|
|
55
|
+
|
|
56
|
+
**If no argument is given**, use the `AskUserQuestion` tool to present the styles as selectable options (header: "Style", question: "¿Qué estilo quieres usar?"). Use these 4 options:
|
|
57
|
+
1. **debug** — "Verbose, investigativo. Muestra cadena de razonamiento."
|
|
58
|
+
2. **teach** — "Mentor mode. Analogías, ejemplos, takeaways prácticos."
|
|
59
|
+
3. **architect** — "Pensamiento sistémico, trade-offs, decision records."
|
|
60
|
+
4. **ship** — "Velocidad máxima, cero ceremonia. Solo código."
|
|
61
|
+
|
|
62
|
+
If the user picks "Other", ask them to clarify — they might want `architect` or `review` which couldn't fit in the 4-option limit. Apply the selected style immediately after selection.
|
|
63
|
+
|
|
64
|
+
Examples:
|
|
65
|
+
- `/style debug` → "Debug mode on." Then adopt verbose investigative style.
|
|
66
|
+
- `/style ship` → "Ship mode. Let's go." Then adopt maximum speed style.
|
|
67
|
+
- `/style` → Show interactive picker via AskUserQuestion.
|
|
68
|
+
- `/style reset` → "Back to concise." Then return to default.
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# Visualize Code Architecture
|
|
2
|
+
|
|
3
|
+
Use Mermaid diagrams to visualize the data lineage, architecture, or flow of the referenced code or project.
|
|
4
|
+
|
|
5
|
+
## What to generate
|
|
6
|
+
|
|
7
|
+
Based on context, create the most relevant diagram:
|
|
8
|
+
- **Flowchart** — for request/data flows
|
|
9
|
+
- **Class diagram** — for model relationships
|
|
10
|
+
- **Sequence diagram** — for multi-service interactions
|
|
11
|
+
- **ER diagram** — for database relationships
|
|
12
|
+
|
|
13
|
+
## Rules
|
|
14
|
+
- Use clear, descriptive labels
|
|
15
|
+
- Group related components in subgraphs
|
|
16
|
+
- Highlight external services vs internal components
|
|
17
|
+
- Keep it readable — max ~20 nodes per diagram, split into multiple if needed
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
# AXEL Multi-Runtime Roadmap
|
|
2
|
+
|
|
3
|
+
## Intent
|
|
4
|
+
|
|
5
|
+
AXEL should remain Claude Code-first because the current package is built around Claude Code hooks, slash commands, agents, skills, plugins, and `~/.claude` conventions. The next architecture step is to make those workflows portable to Codex and other agent runtimes through explicit adapters instead of diluting the Claude Code install path.
|
|
6
|
+
|
|
7
|
+
Default install target:
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
npx axel-setup
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
Equivalent explicit target:
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
npx axel-setup --target claude
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
Experimental non-default targets:
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
npx axel-setup --target codex
|
|
23
|
+
npx axel-setup --target generic --output ./axel-runtime
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## Target Model
|
|
27
|
+
|
|
28
|
+
AXEL should separate reusable workflow intent from runtime-specific wiring.
|
|
29
|
+
|
|
30
|
+
| Layer | Purpose | Claude Code default | Codex target | Generic target |
|
|
31
|
+
| --- | --- | --- | --- | --- |
|
|
32
|
+
| Workflow content | prompts, review checklists, agent roles, model-routing policy | installed as commands, agents, and skills | installed as Codex instructions/skills where supported | exported as markdown/tooling bundles |
|
|
33
|
+
| Lifecycle automation | hooks, session summaries, memory extraction, cost logs | Claude Code hooks in `~/.claude/settings.json` | Codex-compatible scripts and AGENTS.md guidance | manual or wrapper-driven scripts |
|
|
34
|
+
| Runtime manifest | what was installed, profile, skipped components, target | `~/.claude/axel-manifest.json` | `$CODEX_HOME` or repo-local manifest | caller-provided manifest path |
|
|
35
|
+
| Safety defaults | conservative permissions and no destructive overwrite | current additive installer behavior | additive repo/workspace behavior | additive export-only behavior |
|
|
36
|
+
|
|
37
|
+
## Implementation Plan
|
|
38
|
+
|
|
39
|
+
### Implemented First Slice
|
|
40
|
+
|
|
41
|
+
1. `--target claude|codex|generic` is supported by the CLI and bootstrap, defaulting to `claude`.
|
|
42
|
+
2. `axel-manifest.json` declares `targets`, `defaultTarget`, and target-scoped required paths.
|
|
43
|
+
3. `axel-setup doctor --target <target>` validates the selected runtime root.
|
|
44
|
+
4. `codex` installs portable AXEL instructions, skills, agents, commands, scripts, and a manifest into `$CODEX_HOME` or `~/.codex`.
|
|
45
|
+
5. `generic` exports the same portable bundle into `--output <dir>` without touching home-directory agent config.
|
|
46
|
+
6. CI smoke tests cover dry-run behavior, Codex temp installs, generic output installs, target-aware doctor checks, and Claude backward compatibility.
|
|
47
|
+
7. `axel-setup diff`, `review-upgrades`, and `uninstall` audit, review, and remove exact package matches per target while keeping modified and merge-managed files.
|
|
48
|
+
|
|
49
|
+
### Remaining Native Adapter Work
|
|
50
|
+
|
|
51
|
+
1. Move more runtime-specific file placement behind dedicated adapter modules when the shell script grows beyond the current small target split:
|
|
52
|
+
- `claude`: current behavior, preserved as default.
|
|
53
|
+
- `codex`: add native Codex command, skill, and instruction wiring as the runtime surface stabilizes.
|
|
54
|
+
- `generic`: add optional archive generation and machine-readable component metadata.
|
|
55
|
+
2. Keep GSD and third-party ecosystems external: detect and integrate when present, never vendor a frozen copy.
|
|
56
|
+
3. Add per-install checksums to the manifest so future uninstall and upgrade flows can distinguish templated AXEL files from user edits with stronger evidence.
|
|
57
|
+
|
|
58
|
+
## Compatibility Rules
|
|
59
|
+
|
|
60
|
+
- `claude` remains the only fully supported target. Codex and generic are experimental portable-asset targets.
|
|
61
|
+
- `--target claude` must remain backward-compatible with existing installs.
|
|
62
|
+
- Runtime adapters must not share hidden side effects. If a component cannot be mapped cleanly to a target, mark it unsupported in the manifest and print a skip reason.
|
|
63
|
+
- Model routing must remain explicit: target adapters can translate policy wording, but must not silently inherit the most expensive session model.
|
|
64
|
+
- Personal defaults stay behind explicit profiles; core, team-safe, and minimal targets must be suitable for public OSS users.
|
|
65
|
+
|
|
66
|
+
## Acceptance Criteria
|
|
67
|
+
|
|
68
|
+
- `npx axel-setup --target claude --dry-run` produces the same class of output as today's default install.
|
|
69
|
+
- `npx axel-setup --target codex --dry-run` prints all planned Codex writes without creating files.
|
|
70
|
+
- `npx axel-setup --target generic --output <dir>` exports a reviewable bundle and does not touch home-directory agent config.
|
|
71
|
+
- `npx axel-setup diff --target <target>` audits installed package files, `review-upgrades` prints generated upgrade proposals, and `uninstall --apply` removes only exact package matches.
|
|
72
|
+
- `npm run check` covers target parsing, manifest validation, doctor behavior, and temp-home smoke installs for every supported target.
|
|
73
|
+
- README documents Claude Code as the default and links each non-default target as experimental until native runtime wiring is complete.
|