@cliangdev/flux-plugin 0.2.0-dev.e34d43b → 0.2.0-dev.f718bcf

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.
Files changed (37) hide show
  1. package/agents/coder.md +150 -25
  2. package/commands/breakdown.md +44 -7
  3. package/commands/implement.md +165 -15
  4. package/commands/prd.md +176 -1
  5. package/manifest.json +2 -1
  6. package/package.json +4 -2
  7. package/skills/prd-writer/SKILL.md +184 -0
  8. package/skills/ux-ui-design/SKILL.md +346 -0
  9. package/skills/ux-ui-design/references/design-tokens.md +359 -0
  10. package/src/dashboard/__tests__/api.test.ts +211 -0
  11. package/src/dashboard/browser.ts +35 -0
  12. package/src/dashboard/public/app.js +869 -0
  13. package/src/dashboard/public/index.html +90 -0
  14. package/src/dashboard/public/styles.css +807 -0
  15. package/src/dashboard/public/vendor/highlight.css +10 -0
  16. package/src/dashboard/public/vendor/highlight.min.js +8422 -0
  17. package/src/dashboard/public/vendor/marked.min.js +2210 -0
  18. package/src/dashboard/server.ts +296 -0
  19. package/src/dashboard/watchers.ts +83 -0
  20. package/src/server/adapters/__tests__/dependency-ops.test.ts +52 -18
  21. package/src/server/adapters/linear/adapter.ts +19 -14
  22. package/src/server/adapters/local-adapter.ts +48 -7
  23. package/src/server/db/__tests__/queries.test.ts +2 -1
  24. package/src/server/db/schema.ts +9 -0
  25. package/src/server/tools/__tests__/crud.test.ts +111 -1
  26. package/src/server/tools/__tests__/mcp-interface.test.ts +2 -1
  27. package/src/server/tools/__tests__/query.test.ts +73 -2
  28. package/src/server/tools/__tests__/z-configure-linear.test.ts +1 -1
  29. package/src/server/tools/__tests__/z-get-linear-url.test.ts +1 -1
  30. package/src/server/tools/create-epic.ts +11 -2
  31. package/src/server/tools/create-prd.ts +11 -2
  32. package/src/server/tools/create-task.ts +11 -2
  33. package/src/server/tools/dependencies.ts +2 -2
  34. package/src/server/tools/get-entity.ts +12 -10
  35. package/src/server/tools/render-status.ts +38 -20
  36. package/src/status-line/__tests__/status-line.test.ts +1 -1
  37. package/src/utils/status-renderer.ts +32 -6
@@ -34,12 +34,14 @@ interface Epic {
34
34
  status: string;
35
35
  task_count: number;
36
36
  tasks_completed: number;
37
+ dependencies?: string[];
37
38
  }
38
39
 
39
40
  interface Task {
40
41
  ref: string;
41
42
  title: string;
42
43
  status: string;
44
+ dependencies?: string[];
43
45
  }
44
46
 
45
47
  interface EpicWithTasks {
@@ -47,6 +49,7 @@ interface EpicWithTasks {
47
49
  title: string;
48
50
  status: string;
49
51
  tasks: Task[];
52
+ dependencies?: string[];
50
53
  }
51
54
 
52
55
  interface Prd {
@@ -54,6 +57,7 @@ interface Prd {
54
57
  title: string;
55
58
  status: string;
56
59
  epics: Epic[];
60
+ dependencies?: string[];
57
61
  }
58
62
 
59
63
  interface PrdWithTasks {
@@ -61,6 +65,7 @@ interface PrdWithTasks {
61
65
  title: string;
62
66
  status: string;
63
67
  epics: EpicWithTasks[];
68
+ dependencies?: string[];
64
69
  }
65
70
 
66
71
  const STATUS_ORDER: Record<string, number> = {
@@ -117,13 +122,22 @@ export function renderSummaryView(
117
122
 
118
123
  for (const prd of sortedPrds) {
119
124
  const badge = getStatusBadge(prd.status);
120
- lines.push(`${prd.ref} ${prd.title} ${badge}`);
125
+ const prdBlocked = prd.dependencies && prd.dependencies.length > 0;
126
+ const prdBlockedBy = prdBlocked
127
+ ? ` ⚠️ blocked by: ${prd.dependencies?.join(", ")}`
128
+ : "";
129
+ lines.push(`${prd.ref} ${prd.title} ${badge}${prdBlockedBy}`);
121
130
 
122
131
  for (const epic of prd.epics) {
123
132
  const icon = getStatusIcon(epic.status);
133
+ const epicBlocked = epic.dependencies && epic.dependencies.length > 0;
134
+ const epicBlockedBy = epicBlocked
135
+ ? ` ⚠️ blocked by: ${epic.dependencies?.join(", ")}`
136
+ : "";
137
+
124
138
  if (epic.task_count === 0) {
125
139
  lines.push(
126
- ` ${icon} ${epic.ref} ${epic.title} ·········· (no tasks)`,
140
+ ` ${icon} ${epic.ref} ${epic.title} ·········· (no tasks)${epicBlockedBy}`,
127
141
  );
128
142
  } else {
129
143
  const epicProgress = renderProgressBar(
@@ -131,7 +145,7 @@ export function renderSummaryView(
131
145
  10,
132
146
  );
133
147
  lines.push(
134
- ` ${icon} ${epic.ref} ${epic.title} ${epicProgress} ${epic.tasks_completed}/${epic.task_count}`,
148
+ ` ${icon} ${epic.ref} ${epic.title} ${epicProgress} ${epic.tasks_completed}/${epic.task_count}${epicBlockedBy}`,
135
149
  );
136
150
  }
137
151
  }
@@ -157,23 +171,35 @@ export function renderFullTreeView(prds: PrdWithTasks[]): string {
157
171
 
158
172
  for (const prd of sortedPrds) {
159
173
  const prdBadge = getStatusBadge(prd.status);
174
+ const prdBlocked = prd.dependencies && prd.dependencies.length > 0;
175
+ const prdBlockedBy = prdBlocked
176
+ ? ` ⚠️ blocked by: ${prd.dependencies?.join(", ")}`
177
+ : "";
160
178
  lines.push(`${prd.ref} ${prd.title}`);
161
- lines.push(`${prdBadge}`);
179
+ lines.push(`${prdBadge}${prdBlockedBy}`);
162
180
  lines.push("");
163
181
 
164
182
  for (const epic of prd.epics) {
165
183
  const epicIcon = getStatusIcon(epic.status);
166
- lines.push(` ${epicIcon} ${epic.ref} ${epic.title}`);
184
+ const epicBlocked = epic.dependencies && epic.dependencies.length > 0;
185
+ const epicBlockedBy = epicBlocked
186
+ ? ` ⚠️ blocked by: ${epic.dependencies?.join(", ")}`
187
+ : "";
188
+ lines.push(` ${epicIcon} ${epic.ref} ${epic.title}${epicBlockedBy}`);
167
189
 
168
190
  if (epic.tasks.length > 0) {
169
191
  lines.push(` ┌${"─".repeat(50)}┐`);
170
192
 
171
193
  for (const task of epic.tasks) {
172
194
  const taskIcon = getStatusIcon(task.status);
195
+ const taskBlocked = task.dependencies && task.dependencies.length > 0;
196
+ const taskBlockedBy = taskBlocked
197
+ ? ` ⚠️ blocked by: ${task.dependencies?.join(", ")}`
198
+ : "";
173
199
  const currentMarker =
174
200
  task.status === "IN_PROGRESS" ? " ← CURRENT" : "";
175
201
  lines.push(
176
- ` │ ${taskIcon} ${task.ref} ${task.title}${currentMarker}`,
202
+ ` │ ${taskIcon} ${task.ref} ${task.title}${currentMarker}${taskBlockedBy}`,
177
203
  );
178
204
  }
179
205