@cliangdev/flux-plugin 0.1.0 → 0.2.0-dev.359209a
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/README.md +55 -22
- package/agents/coder.md +317 -0
- package/agents/critic.md +174 -0
- package/agents/researcher.md +146 -0
- package/agents/verifier.md +149 -0
- package/bin/install.cjs +390 -0
- package/commands/breakdown.md +48 -10
- package/commands/dashboard.md +29 -0
- package/commands/flux.md +218 -94
- package/commands/implement.md +167 -17
- package/commands/linear.md +172 -0
- package/commands/prd.md +997 -82
- package/manifest.json +16 -0
- package/package.json +17 -11
- package/skills/agent-creator/SKILL.md +2 -0
- package/skills/epic-template/SKILL.md +2 -0
- package/skills/flux-orchestrator/SKILL.md +68 -76
- package/skills/prd-writer/SKILL.md +761 -0
- package/skills/ux-ui-design/SKILL.md +346 -0
- package/skills/ux-ui-design/references/design-tokens.md +359 -0
- package/src/__tests__/version.test.ts +37 -0
- package/src/adapters/local/.gitkeep +0 -0
- package/src/dashboard/__tests__/api.test.ts +211 -0
- package/src/dashboard/browser.ts +35 -0
- package/src/dashboard/public/app.js +869 -0
- package/src/dashboard/public/index.html +90 -0
- package/src/dashboard/public/styles.css +807 -0
- package/src/dashboard/public/vendor/highlight.css +10 -0
- package/src/dashboard/public/vendor/highlight.min.js +8422 -0
- package/src/dashboard/public/vendor/marked.min.js +2210 -0
- package/src/dashboard/server.ts +296 -0
- package/src/dashboard/watchers.ts +83 -0
- package/src/server/__tests__/config.test.ts +163 -0
- package/src/server/adapters/__tests__/a-client-linear.test.ts +197 -0
- package/src/server/adapters/__tests__/adapter-factory.test.ts +230 -0
- package/src/server/adapters/__tests__/dependency-ops.test.ts +429 -0
- package/src/server/adapters/__tests__/document-ops.test.ts +306 -0
- package/src/server/adapters/__tests__/linear-adapter.test.ts +91 -0
- package/src/server/adapters/__tests__/linear-config.test.ts +425 -0
- package/src/server/adapters/__tests__/linear-criteria-parser.test.ts +287 -0
- package/src/server/adapters/__tests__/linear-description-test.ts +238 -0
- package/src/server/adapters/__tests__/linear-epic-crud.test.ts +496 -0
- package/src/server/adapters/__tests__/linear-mappers-description.test.ts +276 -0
- package/src/server/adapters/__tests__/linear-mappers-epic.test.ts +294 -0
- package/src/server/adapters/__tests__/linear-mappers-prd.test.ts +300 -0
- package/src/server/adapters/__tests__/linear-mappers-task.test.ts +197 -0
- package/src/server/adapters/__tests__/linear-prd-crud.test.ts +620 -0
- package/src/server/adapters/__tests__/linear-stats.test.ts +450 -0
- package/src/server/adapters/__tests__/linear-task-crud.test.ts +534 -0
- package/src/server/adapters/__tests__/linear-types.test.ts +243 -0
- package/src/server/adapters/__tests__/status-ops.test.ts +441 -0
- package/src/server/adapters/factory.ts +90 -0
- package/src/server/adapters/index.ts +9 -0
- package/src/server/adapters/linear/adapter.ts +1141 -0
- package/src/server/adapters/linear/client.ts +169 -0
- package/src/server/adapters/linear/config.ts +152 -0
- package/src/server/adapters/linear/helpers/criteria-parser.ts +197 -0
- package/src/server/adapters/linear/helpers/index.ts +7 -0
- package/src/server/adapters/linear/index.ts +16 -0
- package/src/server/adapters/linear/mappers/description.ts +136 -0
- package/src/server/adapters/linear/mappers/epic.ts +81 -0
- package/src/server/adapters/linear/mappers/index.ts +27 -0
- package/src/server/adapters/linear/mappers/prd.ts +178 -0
- package/src/server/adapters/linear/mappers/task.ts +82 -0
- package/src/server/adapters/linear/types.ts +264 -0
- package/src/server/adapters/local-adapter.ts +1009 -0
- package/src/server/adapters/types.ts +293 -0
- package/src/server/config.ts +73 -0
- package/src/server/db/__tests__/queries.test.ts +473 -0
- package/src/server/db/ids.ts +17 -0
- package/src/server/db/index.ts +69 -0
- package/src/server/db/queries.ts +142 -0
- package/src/server/db/refs.ts +60 -0
- package/src/server/db/schema.ts +97 -0
- package/src/server/db/sqlite.ts +10 -0
- package/src/server/index.ts +81 -0
- package/src/server/tools/__tests__/crud.test.ts +411 -0
- package/src/server/tools/__tests__/get-version.test.ts +27 -0
- package/src/server/tools/__tests__/mcp-interface.test.ts +479 -0
- package/src/server/tools/__tests__/query.test.ts +405 -0
- package/src/server/tools/__tests__/z-configure-linear.test.ts +511 -0
- package/src/server/tools/__tests__/z-get-linear-url.test.ts +108 -0
- package/src/server/tools/configure-linear.ts +373 -0
- package/src/server/tools/create-epic.ts +44 -0
- package/src/server/tools/create-prd.ts +40 -0
- package/src/server/tools/create-task.ts +47 -0
- package/src/server/tools/criteria.ts +50 -0
- package/src/server/tools/delete-entity.ts +76 -0
- package/src/server/tools/dependencies.ts +55 -0
- package/src/server/tools/get-entity.ts +240 -0
- package/src/server/tools/get-linear-url.ts +28 -0
- package/src/server/tools/get-stats.ts +52 -0
- package/src/server/tools/get-version.ts +20 -0
- package/src/server/tools/index.ts +158 -0
- package/src/server/tools/init-project.ts +108 -0
- package/src/server/tools/query-entities.ts +167 -0
- package/src/server/tools/render-status.ts +219 -0
- package/src/server/tools/update-entity.ts +140 -0
- package/src/server/tools/update-status.ts +166 -0
- package/src/server/utils/__tests__/mcp-response.test.ts +331 -0
- package/src/server/utils/logger.ts +9 -0
- package/src/server/utils/mcp-response.ts +254 -0
- package/src/server/utils/status-transitions.ts +160 -0
- package/src/status-line/__tests__/status-line.test.ts +215 -0
- package/src/status-line/index.ts +147 -0
- package/src/utils/__tests__/chalk-import.test.ts +32 -0
- package/src/utils/__tests__/display.test.ts +97 -0
- package/src/utils/__tests__/status-renderer.test.ts +310 -0
- package/src/utils/display.ts +62 -0
- package/src/utils/status-renderer.ts +214 -0
- package/src/version.ts +5 -0
- package/dist/server/index.js +0 -86929
- package/skills/prd-template/SKILL.md +0 -240
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: flux:linear
|
|
3
|
+
description: Connect Flux project to Linear for issue tracking
|
|
4
|
+
allowed-tools: mcp__plugin_flux_flux__*, AskUserQuestion
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Linear Integration Setup
|
|
8
|
+
|
|
9
|
+
Connect a Flux project to Linear using the interactive configuration flow.
|
|
10
|
+
|
|
11
|
+
## How Interactive Mode Works
|
|
12
|
+
|
|
13
|
+
The `configure_linear` tool supports progressive discovery:
|
|
14
|
+
|
|
15
|
+
| Call | Response |
|
|
16
|
+
|------|----------|
|
|
17
|
+
| `{interactive: true}` | Returns `{step: "select_team", teams: [...], user: {...}}` |
|
|
18
|
+
| `{interactive: true, teamId: "xxx"}` | Returns `{step: "select_project", projects: [...], team: {...}}` |
|
|
19
|
+
| `{teamId: "xxx", projectName: "..."}` | Creates new project and configures |
|
|
20
|
+
| `{teamId: "xxx", existingProjectId: "..."}` | Uses existing project and configures |
|
|
21
|
+
|
|
22
|
+
## Flow
|
|
23
|
+
|
|
24
|
+
### Step 1: Verify Project & Fetch Teams
|
|
25
|
+
|
|
26
|
+
Call `configure_linear` with `{interactive: true}`.
|
|
27
|
+
|
|
28
|
+
- If error with `code: "PROJECT_NOT_INITIALIZED"` → Tell user to run `/flux` first, then exit.
|
|
29
|
+
- If error about Linear API key → Show instructions (see Step 2 error handling).
|
|
30
|
+
- If success with `step: "already_configured"` → Already configured, show info and exit.
|
|
31
|
+
- Otherwise → Continue with team selection (response contains teams list).
|
|
32
|
+
|
|
33
|
+
### Step 2: Fetch Teams
|
|
34
|
+
|
|
35
|
+
**IMPORTANT**: Call `configure_linear` with ONLY `interactive: true`. Do NOT pass teamId, projectName, or any other params.
|
|
36
|
+
|
|
37
|
+
```json
|
|
38
|
+
{"interactive": true}
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
This is the ONLY parameter needed for the first call. The tool will return available teams.
|
|
42
|
+
|
|
43
|
+
**If error** (e.g., "Linear API key not found"):
|
|
44
|
+
```
|
|
45
|
+
Linear API key required.
|
|
46
|
+
|
|
47
|
+
1. Get your key: Linear → Settings → API → Personal API keys
|
|
48
|
+
2. Set it: export LINEAR_API_KEY=lin_api_xxx
|
|
49
|
+
3. Run /flux:linear again
|
|
50
|
+
```
|
|
51
|
+
Then exit.
|
|
52
|
+
|
|
53
|
+
**If success**, response will be:
|
|
54
|
+
```json
|
|
55
|
+
{
|
|
56
|
+
"step": "select_team",
|
|
57
|
+
"user": {"name": "...", "email": "..."},
|
|
58
|
+
"teams": [
|
|
59
|
+
{"id": "team-abc", "name": "Engineering", "key": "ENG"},
|
|
60
|
+
{"id": "team-def", "name": "Product", "key": "PROD"}
|
|
61
|
+
]
|
|
62
|
+
}
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
Display: "Connected as {user.name} ({user.email})"
|
|
66
|
+
|
|
67
|
+
Use AskUserQuestion to let user select a team:
|
|
68
|
+
```json
|
|
69
|
+
{
|
|
70
|
+
"questions": [{
|
|
71
|
+
"question": "Which Linear team should Flux use?",
|
|
72
|
+
"header": "Team",
|
|
73
|
+
"options": [
|
|
74
|
+
{"label": "Engineering (ENG)", "description": "team-abc"},
|
|
75
|
+
{"label": "Product (PROD)", "description": "team-def"}
|
|
76
|
+
],
|
|
77
|
+
"multiSelect": false
|
|
78
|
+
}]
|
|
79
|
+
}
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
Note: Put the team ID in the description field so you can retrieve it from the response.
|
|
83
|
+
|
|
84
|
+
### Step 3: Fetch Projects
|
|
85
|
+
|
|
86
|
+
Call `configure_linear` with:
|
|
87
|
+
```json
|
|
88
|
+
{"interactive": true, "teamId": "<selected_team_id>"}
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
Response will be:
|
|
92
|
+
```json
|
|
93
|
+
{
|
|
94
|
+
"step": "select_project",
|
|
95
|
+
"team": {"id": "...", "name": "...", "key": "..."},
|
|
96
|
+
"projects": [
|
|
97
|
+
{"id": "proj-123", "name": "Q1 Sprint", "state": "started"},
|
|
98
|
+
{"id": "proj-456", "name": "Backlog", "state": "planned"}
|
|
99
|
+
]
|
|
100
|
+
}
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
Use AskUserQuestion:
|
|
104
|
+
```json
|
|
105
|
+
{
|
|
106
|
+
"questions": [{
|
|
107
|
+
"question": "Which project should Flux sync to?",
|
|
108
|
+
"header": "Project",
|
|
109
|
+
"options": [
|
|
110
|
+
{"label": "Create New Project", "description": "new"},
|
|
111
|
+
{"label": "Q1 Sprint", "description": "proj-123"},
|
|
112
|
+
{"label": "Backlog", "description": "proj-456"}
|
|
113
|
+
],
|
|
114
|
+
"multiSelect": false
|
|
115
|
+
}]
|
|
116
|
+
}
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
### Step 4: Configure
|
|
120
|
+
|
|
121
|
+
**If user selected "Create New Project":**
|
|
122
|
+
|
|
123
|
+
Ask for project name, then call:
|
|
124
|
+
```json
|
|
125
|
+
{
|
|
126
|
+
"teamId": "<team_id>",
|
|
127
|
+
"projectName": "<user_provided_name>"
|
|
128
|
+
}
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
**If user selected existing project:**
|
|
132
|
+
|
|
133
|
+
Call:
|
|
134
|
+
```json
|
|
135
|
+
{
|
|
136
|
+
"teamId": "<team_id>",
|
|
137
|
+
"existingProjectId": "<project_id>"
|
|
138
|
+
}
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
### Step 5: Success
|
|
142
|
+
|
|
143
|
+
Response will include:
|
|
144
|
+
```json
|
|
145
|
+
{
|
|
146
|
+
"success": true,
|
|
147
|
+
"team": "Engineering",
|
|
148
|
+
"project": {"id": "...", "name": "..."},
|
|
149
|
+
"labels": {...},
|
|
150
|
+
"view": {"created": "...", "setup_hint": "..."}
|
|
151
|
+
}
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
Display:
|
|
155
|
+
```
|
|
156
|
+
Linear connected!
|
|
157
|
+
|
|
158
|
+
Team: {team}
|
|
159
|
+
Project: {project.name}
|
|
160
|
+
|
|
161
|
+
All PRDs, epics, and tasks will sync to Linear.
|
|
162
|
+
Run /flux:prd to create your first PRD.
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
If `view.setup_hint` exists, show it as a tip.
|
|
166
|
+
|
|
167
|
+
## Key Points
|
|
168
|
+
|
|
169
|
+
- Always use `{"interactive": true}` (boolean) not a string
|
|
170
|
+
- The response `step` field tells you what stage you're at
|
|
171
|
+
- Use AskUserQuestion for team/project selection
|
|
172
|
+
- Store the selected IDs from previous responses to use in next calls
|