@uniswap/ai-toolkit-nx-claude 0.5.10-next.21 → 0.5.10-next.3

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.
@@ -327,8 +327,8 @@ function isInAiToolkitRepo() {
327
327
  return isInAiToolkit;
328
328
  }
329
329
  var GENERATORS = {
330
- default: "Recommended setup with pre-selected components",
331
- custom: "Choose exactly what to install"
330
+ "default-install": "Recommended setup with pre-selected components",
331
+ "custom-install": "Choose exactly what to install"
332
332
  };
333
333
  var ALL_GENERATORS = isInAiToolkitRepo() ? {
334
334
  ...GENERATORS,
@@ -381,8 +381,8 @@ async function main() {
381
381
  console.log("\nUsage:");
382
382
  console.log(" npx @uniswap/ai-toolkit-nx-claude@latest [generator]");
383
383
  console.log("\nExamples:");
384
- console.log(" npx @uniswap/ai-toolkit-nx-claude@latest default");
385
- console.log(" npx @uniswap/ai-toolkit-nx-claude@latest custom");
384
+ console.log(" npx @uniswap/ai-toolkit-nx-claude@latest default-install");
385
+ console.log(" npx @uniswap/ai-toolkit-nx-claude@latest custom-install");
386
386
  process.exit(0);
387
387
  }
388
388
  if (processedArgs.includes("--help") || processedArgs.includes("-h")) {
@@ -408,12 +408,8 @@ This command runs the nx-claude ${generatorName} generator.`
408
408
  process.exit(0);
409
409
  }
410
410
  if (!generatorName && processedArgs.length === 0) {
411
- if (isInAiToolkitRepo()) {
412
- generatorName = await selectGeneratorInteractively();
413
- console.log("");
414
- } else {
415
- generatorName = "init";
416
- }
411
+ generatorName = await selectGeneratorInteractively();
412
+ console.log("");
417
413
  }
418
414
  if (!generatorName) {
419
415
  console.error("\n\u274C No generator specified.");
@@ -423,12 +419,12 @@ This command runs the nx-claude ${generatorName} generator.`
423
419
  console.error("\nRun with --list to see available generators.");
424
420
  process.exit(1);
425
421
  }
426
- if (generatorName === "default") {
422
+ if (generatorName === "default-install") {
427
423
  await handleNxExecution("init", [
428
424
  ...processedArgs,
429
425
  "--install-mode=default"
430
426
  ]);
431
- } else if (generatorName === "custom") {
427
+ } else if (generatorName === "custom-install") {
432
428
  await handleNxExecution("init", [
433
429
  ...processedArgs,
434
430
  "--install-mode=custom"
@@ -145,38 +145,9 @@ interface HooksGeneratorSchema {
145
145
  'dry-run'?: boolean; // Preview without changes
146
146
  force?: boolean; // Skip dependency checks
147
147
  verbose?: boolean; // Detailed output
148
- installMode?: 'default' | 'custom'; // Installation mode from parent generator (hidden)
149
148
  }
150
149
  ```
151
150
 
152
- ### installMode Parameter
153
-
154
- The `installMode` parameter is a **hidden** parameter designed for programmatic use only. It's passed from parent generators (like `init`) to control the prompting behavior:
155
-
156
- - **`'default'`**: Skips all interactive prompts and uses default values for all options. This provides a streamlined, non-interactive installation experience.
157
- - **`'custom'`**: (or undefined): Enables full interactive prompting, allowing users to configure all options through CLI prompts.
158
-
159
- **Usage Pattern**:
160
-
161
- ```typescript
162
- // Called programmatically from init generator in default mode
163
- await hooksGenerator(tree, {
164
- installMode: 'default', // Skips all prompts
165
- force: false,
166
- dry: false,
167
- backup: true,
168
- verbose: false,
169
- });
170
-
171
- // Called programmatically from init generator in custom mode (or standalone)
172
- await hooksGenerator(tree, {
173
- // installMode omitted or 'custom' - enables prompts
174
- force: false,
175
- });
176
- ```
177
-
178
- **Implementation**: When `installMode === 'default'`, the generator bypasses the entire `promptForMissingOptions()` flow and constructs the normalized options directly using default values.
179
-
180
151
  ### Input Handling
181
152
 
182
153
  The generator pipes input to the install-global.sh script based on options:
@@ -267,29 +238,6 @@ Manual testing checklist:
267
238
 
268
239
  ## Development Notes
269
240
 
270
- ### Programmatic Usage Pattern
271
-
272
- This generator implements the **installMode pattern** for sub-generators:
273
-
274
- **Purpose**: Prevent duplicate prompting when generators are called programmatically from parent generators.
275
-
276
- **Implementation**:
277
-
278
- 1. Add `installMode?: 'default' | 'custom'` to schema with `hidden: true`
279
- 2. Add `installMode?: 'default' | 'custom'` to TypeScript interface
280
- 3. In generator.ts, check `if (options.installMode === 'default')` before prompting
281
- 4. When 'default', construct normalized options with defaults instead of prompting
282
- 5. When undefined or 'custom', proceed with normal prompting flow
283
-
284
- **Why This Works**:
285
-
286
- - Hidden schema properties don't show up in CLI help or prompts
287
- - Parent generators can pass the mode to control child behavior
288
- - Avoids issues with `getExplicitlyProvidedOptions()` reading `process.argv`
289
- - Each generator maintains backward compatibility (works standalone or programmatically)
290
-
291
- **Pattern Applied**: This pattern is used across all sub-generators that are called from the `init` generator (hooks, addons, etc.).
292
-
293
241
  ### Adding New Features
294
242
 
295
243
  To extend the generator:
@@ -1119,43 +1119,32 @@ async function hooksGenerator(tree, options) {
1119
1119
  }
1120
1120
  const schemaPath = path3.join(__dirname, "schema.json");
1121
1121
  let normalizedOptions;
1122
- if (options.installMode === "default") {
1123
- normalizedOptions = {
1124
- backup: options.backup !== false,
1125
- // Default to true unless explicitly false
1126
- dry: options.dry || false,
1127
- force: options.force || false,
1128
- verbose: options.verbose || false,
1129
- installMode: "default"
1130
- };
1131
- } else {
1132
- const explicitlyProvided = getExplicitlyProvidedOptions(options);
1133
- const nxDryRunProvided = isNxDryRunProvided();
1134
- if (nxDryRunProvided) {
1135
- options.dry = true;
1136
- explicitlyProvided.set("dry", true);
1137
- }
1138
- const nxNoInteractiveProvided = isNxNoInteractiveProvided();
1139
- const optionsWithNoInteractive = {
1140
- ...options,
1141
- "no-interactive": nxNoInteractiveProvided
1142
- };
1143
- try {
1144
- normalizedOptions = await promptForMissingOptions(
1145
- optionsWithNoInteractive,
1146
- schemaPath,
1147
- {},
1148
- // context for multi-select (not used here)
1149
- explicitlyProvided
1150
- // pass the explicitly provided options
1151
- );
1152
- } catch (error) {
1153
- if (error.message?.includes("Installation cancelled")) {
1154
- import_devkit4.logger.warn(`\u274C ${error.message}`);
1155
- return;
1156
- }
1157
- throw error;
1122
+ const explicitlyProvided = getExplicitlyProvidedOptions(options);
1123
+ const nxDryRunProvided = isNxDryRunProvided();
1124
+ if (nxDryRunProvided) {
1125
+ options.dry = true;
1126
+ explicitlyProvided.set("dry", true);
1127
+ }
1128
+ const nxNoInteractiveProvided = isNxNoInteractiveProvided();
1129
+ const optionsWithNoInteractive = {
1130
+ ...options,
1131
+ "no-interactive": nxNoInteractiveProvided
1132
+ };
1133
+ try {
1134
+ normalizedOptions = await promptForMissingOptions(
1135
+ optionsWithNoInteractive,
1136
+ schemaPath,
1137
+ {},
1138
+ // context for multi-select (not used here)
1139
+ explicitlyProvided
1140
+ // pass the explicitly provided options
1141
+ );
1142
+ } catch (error) {
1143
+ if (error.message?.includes("Installation cancelled")) {
1144
+ import_devkit4.logger.warn(`\u274C ${error.message}`);
1145
+ return;
1158
1146
  }
1147
+ throw error;
1159
1148
  }
1160
1149
  const isDryRun = normalizedOptions.dry;
1161
1150
  if (isDryRun) {
@@ -32,12 +32,6 @@
32
32
  "type": "boolean",
33
33
  "description": "Skip confirmation prompts and overwrite existing configuration",
34
34
  "default": false
35
- },
36
- "installMode": {
37
- "type": "string",
38
- "description": "Installation mode from parent generator (default or custom). When set to 'default', skips all prompts and uses defaults.",
39
- "enum": ["default", "custom"],
40
- "hidden": true
41
35
  }
42
36
  },
43
37
  "required": []
@@ -1030,10 +1030,6 @@ var commands = {
1030
1030
  description: "Create or update a Graphite PR with auto-generated conventional commit messages and comprehensive descriptions based on code diffs.",
1031
1031
  filePath: "./create-pr.md"
1032
1032
  },
1033
- "daily-standup": {
1034
- description: "This provides a daily standup, checking GitHub and Linear over the past day and providing a summary of what you've been working on and what you will continue to work on.",
1035
- filePath: "./daily-standup.md"
1036
- },
1037
1033
  deploy: {
1038
1034
  description: "Orchestrate deployment pipelines, infrastructure setup, and CI/CD configuration using specialized deployment agents.",
1039
1035
  filePath: "./deploy.md"
@@ -1867,43 +1863,32 @@ async function hooksGenerator(tree, options) {
1867
1863
  }
1868
1864
  const schemaPath = path4.join(__dirname, "schema.json");
1869
1865
  let normalizedOptions;
1870
- if (options.installMode === "default") {
1871
- normalizedOptions = {
1872
- backup: options.backup !== false,
1873
- // Default to true unless explicitly false
1874
- dry: options.dry || false,
1875
- force: options.force || false,
1876
- verbose: options.verbose || false,
1877
- installMode: "default"
1878
- };
1879
- } else {
1880
- const explicitlyProvided = getExplicitlyProvidedOptions(options);
1881
- const nxDryRunProvided = isNxDryRunProvided();
1882
- if (nxDryRunProvided) {
1883
- options.dry = true;
1884
- explicitlyProvided.set("dry", true);
1885
- }
1886
- const nxNoInteractiveProvided = isNxNoInteractiveProvided();
1887
- const optionsWithNoInteractive = {
1888
- ...options,
1889
- "no-interactive": nxNoInteractiveProvided
1890
- };
1891
- try {
1892
- normalizedOptions = await promptForMissingOptions(
1893
- optionsWithNoInteractive,
1894
- schemaPath,
1895
- {},
1896
- // context for multi-select (not used here)
1897
- explicitlyProvided
1898
- // pass the explicitly provided options
1899
- );
1900
- } catch (error) {
1901
- if (error.message?.includes("Installation cancelled")) {
1902
- import_devkit5.logger.warn(`\u274C ${error.message}`);
1903
- return;
1904
- }
1905
- throw error;
1866
+ const explicitlyProvided = getExplicitlyProvidedOptions(options);
1867
+ const nxDryRunProvided = isNxDryRunProvided();
1868
+ if (nxDryRunProvided) {
1869
+ options.dry = true;
1870
+ explicitlyProvided.set("dry", true);
1871
+ }
1872
+ const nxNoInteractiveProvided = isNxNoInteractiveProvided();
1873
+ const optionsWithNoInteractive = {
1874
+ ...options,
1875
+ "no-interactive": nxNoInteractiveProvided
1876
+ };
1877
+ try {
1878
+ normalizedOptions = await promptForMissingOptions(
1879
+ optionsWithNoInteractive,
1880
+ schemaPath,
1881
+ {},
1882
+ // context for multi-select (not used here)
1883
+ explicitlyProvided
1884
+ // pass the explicitly provided options
1885
+ );
1886
+ } catch (error) {
1887
+ if (error.message?.includes("Installation cancelled")) {
1888
+ import_devkit5.logger.warn(`\u274C ${error.message}`);
1889
+ return;
1906
1890
  }
1891
+ throw error;
1907
1892
  }
1908
1893
  const isDryRun = normalizedOptions.dry;
1909
1894
  if (isDryRun) {
@@ -3118,8 +3103,7 @@ async function initGenerator(tree, options) {
3118
3103
  force: normalizedOptions.force || false,
3119
3104
  dry: false,
3120
3105
  backup: true,
3121
- verbose: false,
3122
- installMode: normalizedOptions.installMode
3106
+ verbose: false
3123
3107
  });
3124
3108
  import_devkit7.logger.info("\u2705 Notification hooks installed successfully");
3125
3109
  } catch (error) {
@@ -3161,8 +3145,7 @@ async function initGenerator(tree, options) {
3161
3145
  port: 0
3162
3146
  // Use default port
3163
3147
  } : {
3164
- // Custom mode - let addons generator prompt user for specific addon
3165
- installMode: "specific",
3148
+ // Custom mode - let addons generator prompt user
3166
3149
  force: normalizedOptions.force || false
3167
3150
  }
3168
3151
  );
package/dist/index.cjs CHANGED
@@ -1485,43 +1485,32 @@ async function hooksGenerator(tree, options) {
1485
1485
  }
1486
1486
  const schemaPath = path3.join(__dirname, "schema.json");
1487
1487
  let normalizedOptions;
1488
- if (options.installMode === "default") {
1489
- normalizedOptions = {
1490
- backup: options.backup !== false,
1491
- // Default to true unless explicitly false
1492
- dry: options.dry || false,
1493
- force: options.force || false,
1494
- verbose: options.verbose || false,
1495
- installMode: "default"
1496
- };
1497
- } else {
1498
- const explicitlyProvided = getExplicitlyProvidedOptions(options);
1499
- const nxDryRunProvided = isNxDryRunProvided();
1500
- if (nxDryRunProvided) {
1501
- options.dry = true;
1502
- explicitlyProvided.set("dry", true);
1503
- }
1504
- const nxNoInteractiveProvided = isNxNoInteractiveProvided();
1505
- const optionsWithNoInteractive = {
1506
- ...options,
1507
- "no-interactive": nxNoInteractiveProvided
1508
- };
1509
- try {
1510
- normalizedOptions = await promptForMissingOptions(
1511
- optionsWithNoInteractive,
1512
- schemaPath,
1513
- {},
1514
- // context for multi-select (not used here)
1515
- explicitlyProvided
1516
- // pass the explicitly provided options
1517
- );
1518
- } catch (error) {
1519
- if (error.message?.includes("Installation cancelled")) {
1520
- import_devkit4.logger.warn(`\u274C ${error.message}`);
1521
- return;
1522
- }
1523
- throw error;
1488
+ const explicitlyProvided = getExplicitlyProvidedOptions(options);
1489
+ const nxDryRunProvided = isNxDryRunProvided();
1490
+ if (nxDryRunProvided) {
1491
+ options.dry = true;
1492
+ explicitlyProvided.set("dry", true);
1493
+ }
1494
+ const nxNoInteractiveProvided = isNxNoInteractiveProvided();
1495
+ const optionsWithNoInteractive = {
1496
+ ...options,
1497
+ "no-interactive": nxNoInteractiveProvided
1498
+ };
1499
+ try {
1500
+ normalizedOptions = await promptForMissingOptions(
1501
+ optionsWithNoInteractive,
1502
+ schemaPath,
1503
+ {},
1504
+ // context for multi-select (not used here)
1505
+ explicitlyProvided
1506
+ // pass the explicitly provided options
1507
+ );
1508
+ } catch (error) {
1509
+ if (error.message?.includes("Installation cancelled")) {
1510
+ import_devkit4.logger.warn(`\u274C ${error.message}`);
1511
+ return;
1524
1512
  }
1513
+ throw error;
1525
1514
  }
1526
1515
  const isDryRun = normalizedOptions.dry;
1527
1516
  if (isDryRun) {
@@ -1,19 +1,15 @@
1
1
  #!/usr/bin/env node
2
2
  /**
3
3
  * Unified CLI wrapper for all generators.
4
+ * Determines which generator to run based on the script name.
4
5
  *
5
- * External Usage (npx @uniswap/ai-toolkit-nx-claude@latest):
6
- * - No arguments -> runs init generator (prompts for installMode)
7
- * - default -> runs init with --install-mode=default
8
- * - custom -> runs init with --install-mode=custom
9
- *
10
- * Internal Usage (from within ai-toolkit repo):
11
- * - No arguments -> shows interactive menu of all generators
12
- * - Specific generator name -> runs that generator
13
- *
14
- * This design ensures external users get a streamlined experience (init generator
15
- * with its schema-driven installMode prompt) while developers get access to all
16
- * generators including internal ones (add-command, add-agent).
6
+ * This single file handles all generator invocations:
7
+ * - ai-toolkit-nx-claude -> defaults to init generator
8
+ * - ai-toolkit-nx-claude:init -> init generator
9
+ * - ai-toolkit-nx-claude:hooks -> hooks generator
10
+ * - ai-toolkit-nx-claude:addons -> addons generator
11
+ * - ai-toolkit-nx-claude:add-command -> add-command generator
12
+ * - ai-toolkit-nx-claude:add-agent -> add-agent generator
17
13
  */
18
14
  export {};
19
15
  //# sourceMappingURL=cli-generator.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"cli-generator.d.ts","sourceRoot":"","sources":["../../../../src/cli-generator.ts"],"names":[],"mappings":";AAEA;;;;;;;;;;;;;;;GAeG"}
1
+ {"version":3,"file":"cli-generator.d.ts","sourceRoot":"","sources":["../../../../src/cli-generator.ts"],"names":[],"mappings":";AAEA;;;;;;;;;;;GAWG"}
@@ -1 +1 @@
1
- {"version":3,"file":"generator.d.ts","sourceRoot":"","sources":["../../../../../../src/generators/hooks/generator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAGvC,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAWrD;;;GAGG;AACH,wBAAsB,cAAc,CAClC,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAAC,IAAI,CAAC,CA6Jf;AAED,eAAe,cAAc,CAAC"}
1
+ {"version":3,"file":"generator.d.ts","sourceRoot":"","sources":["../../../../../../src/generators/hooks/generator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAGvC,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAWrD;;;GAGG;AACH,wBAAsB,cAAc,CAClC,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAAC,IAAI,CAAC,CAkJf;AAED,eAAe,cAAc,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"generator.d.ts","sourceRoot":"","sources":["../../../../../../src/generators/init/generator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAOvC,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AA+DpD,wBAAsB,aAAa,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,mBAAmB,iBA6jB3E;AAqJD,eAAe,aAAa,CAAC"}
1
+ {"version":3,"file":"generator.d.ts","sourceRoot":"","sources":["../../../../../../src/generators/init/generator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAOvC,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AA+DpD,wBAAsB,aAAa,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,mBAAmB,iBA2jB3E;AAqJD,eAAe,aAAa,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@uniswap/ai-toolkit-nx-claude",
3
- "version": "0.5.10-next.21",
3
+ "version": "0.5.10-next.3",
4
4
  "private": false,
5
5
  "main": "./dist/index.cjs",
6
6
  "module": "./dist/index.cjs",
@@ -169,7 +169,7 @@
169
169
  "enquirer": "*"
170
170
  },
171
171
  "devDependencies": {
172
- "@ai-toolkit/commands-agnostic": "0.1.14-next.20",
173
- "@ai-toolkit/agents-agnostic": "0.2.10-next.20"
172
+ "@ai-toolkit/commands-agnostic": "0.1.14-next.3",
173
+ "@ai-toolkit/agents-agnostic": "0.2.10-next.3"
174
174
  }
175
175
  }
@@ -1,185 +0,0 @@
1
- ---
2
- name: daily-standup
3
- description: This provides a daily standup, checking GitHub and Linear over the past day and providing a summary of what you've been working on and what you will continue to work on.
4
- model: claude-haiku-4-5
5
- ---
6
-
7
- ## Workflow Process
8
-
9
- This workflow uses the Linear MCP and GitHub MCP to:
10
-
11
- 1. Fetch all issues assigned to a user (defaults to you)
12
- 2. Filter for incomplete/in-progress issues
13
- 3. Organize them by priority and status
14
- 4. Fetch GitHub activity from the last 24 hours across all repositories in the in the Uniswap GitHub organization
15
- 5. Generate a friendly team update message combining Linear issues and GitHub activity
16
-
17
- ## Execution Steps
18
-
19
- 1. **Parse Arguments**: Extract optional parameters
20
-
21
- - Linear user: defaults to "me" (authenticated user)
22
- - GitHub username: must be provided by user (prompt if not specified)
23
- - Parse from `$ARGUMENTS` for `user:` and `github:` parameters
24
-
25
- 2. **Prompt for GitHub Username** (if not provided):
26
-
27
- - Check if `github:` parameter was provided in `$ARGUMENTS`
28
- - If not provided, ask the user: "What is your GitHub username for the Uniswap organization?"
29
- - Store the response for use in GitHub queries
30
-
31
- 3. **Fetch Linear Issues**: Get all issues assigned to the specified user
32
-
33
- - Use `mcp__linear__list_issues` with assignee parameter
34
- - Filter by state (exclude completed/cancelled)
35
-
36
- 4. **Analyze Issues**: Review issue details including:
37
-
38
- - Title and description
39
- - Current status (Backlog, Todo, In Progress, etc.)
40
- - Priority level (Urgent, High, Normal, Low)
41
- - Project/team association
42
- - Recent comments or updates
43
- - Due dates
44
-
45
- 5. **Fetch GitHub Activity** (last 24 hours):
46
-
47
- - Use GitHub MCP search tools to find activity from the specified user
48
- - Filter for Uniswap organization repositories only
49
- - Include:
50
- - Pull requests created, updated, or reviewed
51
- - Commits pushed
52
- - PR comments and reviews
53
- - Issues opened or commented on
54
- - Search queries to use:
55
- - `org:Uniswap author:<username> created:>YYYY-MM-DD` (for PRs/issues)
56
- - `org:Uniswap commenter:<username> updated:>YYYY-MM-DD` (for comments)
57
- - `org:Uniswap reviewed-by:<username> updated:>YYYY-MM-DD` (for reviews)
58
-
59
- 6. **Organize by Status**:
60
-
61
- - **In Progress**: Currently working on
62
- - **Todo**: Up next
63
- - **Backlog**: High priority items on deck
64
-
65
- 7. **Generate Update**: Create a concise message covering:
66
- - What's currently being worked on (Linear issues)
67
- - GitHub activity in the last 24 hours (PRs, commits, reviews)
68
- - What's coming up next (Linear issues)
69
- - Any blockers or help needed
70
- - Format suitable for Slack/team chat
71
-
72
- ## Usage Examples
73
-
74
- **Default** (your own tasks - will prompt for GitHub username):
75
-
76
- ```
77
- /daily-standup
78
- ```
79
-
80
- **With GitHub username specified**:
81
-
82
- ```
83
- /daily-standup github:wkoutre
84
- ```
85
-
86
- **Check another team member's tasks** (specify both Linear user and GitHub username):
87
-
88
- ```
89
- /daily-standup user:john@example.com github:johndoe
90
- /daily-standup user:Jane Doe github:janedoe
91
- /daily-standup user:abc-123-user-id github:jsmith
92
- ```
93
-
94
- **With additional instructions**:
95
-
96
- ```
97
- /daily-standup focus on high priority items
98
- /daily-standup user:john@example.com brief version
99
- /daily-standup include estimates and blockers
100
- ```
101
-
102
- ## Parameter Format
103
-
104
- The `user:` parameter (for Linear) should be provided as:
105
-
106
- - `user:me` - Explicitly specify yourself (default)
107
- - `user:<email>` - e.g., `user:john@company.com`
108
- - `user:<name>` - e.g., `user:John Smith`
109
- - `user:<id>` - e.g., `user:abc-123-def-456`
110
-
111
- The `github:` parameter (for GitHub) should be provided as:
112
-
113
- - `github:<username>` - e.g., `github:wkoutre` or `github:johndoe`
114
- - If omitted, you will be prompted to enter your GitHub username
115
-
116
- Any text after the parameters will be treated as additional instructions for formatting or focus.
117
-
118
- ## Output Format
119
-
120
- The generated update will include:
121
-
122
- **GitHub Activity (Last 24 Hours)**:
123
-
124
- - PRs opened, updated, or merged
125
- - Code reviews completed
126
- - Commits pushed (with repo names)
127
- - Comments on PRs/issues
128
- - Links to relevant PRs and commits
129
-
130
- **Currently Working On** (In Progress):
131
-
132
- - Issue titles with priority indicators
133
- - Links to issues
134
- - Brief context
135
-
136
- **Up Next** (Todo):
137
-
138
- - Prioritized list of upcoming work
139
- - Due dates if relevant
140
-
141
- **On Deck** (Backlog - High Priority):
142
-
143
- - Important items queued up
144
-
145
- **Blockers/Help Needed**:
146
-
147
- - Issues that may need team support
148
- - Questions or dependencies
149
-
150
- **Notes**:
151
-
152
- - Recent activity or comments
153
- - Additional context
154
-
155
- The message will be conversational and ready to paste into Slack or share with your team.
156
-
157
- ## Implementation Details
158
-
159
- The workflow will:
160
-
161
- - Parse `$ARGUMENTS` to extract `user:` and `github:` parameters
162
- - Linear user: default to "me" if not specified
163
- - GitHub username: if not found in arguments, prompt user with: "What is your GitHub username for the Uniswap organization?"
164
- - **IMPORTANT**: Always prompt for GitHub username FIRST before fetching any data if it's not provided in arguments
165
- - Calculate the timestamp for 24 hours ago from current time (format: YYYY-MM-DD)
166
- - **Fetch GitHub Activity**:
167
- - Use the provided or prompted GitHub username
168
- - Use `mcp__github__search_issues` with queries like:
169
- - `org:Uniswap author:<username> created:>YYYY-MM-DD` (PRs/issues created)
170
- - `org:Uniswap involves:<username> updated:>YYYY-MM-DD` (all activity including comments, reviews)
171
- - Get PR details for any PRs found using `mcp__github__get_pull_request`
172
- - Include PR status (open/merged/closed) and review status
173
- - **Fetch Linear Issues**:
174
- - Call Linear MCP with the assignee parameter
175
- - Prioritize urgent/high priority items
176
- - Note any issues with recent activity or comments
177
- - **Combine and Format**:
178
- - Start with GitHub activity section (most recent work)
179
- - Follow with Linear issues organized by status
180
- - Identify potential blockers based on status, priority, and age
181
- - Suggest what help might be needed from the team
182
- - Keep the tone professional but conversational
183
- - Handle cases where no incomplete tasks or GitHub activity exist gracefully
184
-
185
- Arguments: $ARGUMENTS