@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.
- package/dist/cli-generator.cjs +8 -12
- package/dist/generators/hooks/CLAUDE.md +0 -52
- package/dist/generators/hooks/generator.cjs +25 -36
- package/dist/generators/hooks/schema.json +0 -6
- package/dist/generators/init/generator.cjs +27 -44
- package/dist/index.cjs +25 -36
- package/dist/packages/ai-toolkit-nx-claude/src/cli-generator.d.ts +8 -12
- package/dist/packages/ai-toolkit-nx-claude/src/cli-generator.d.ts.map +1 -1
- package/dist/packages/ai-toolkit-nx-claude/src/generators/hooks/generator.d.ts.map +1 -1
- package/dist/packages/ai-toolkit-nx-claude/src/generators/init/generator.d.ts.map +1 -1
- package/package.json +3 -3
- package/dist/content/commands/agnostic/daily-standup.md +0 -185
package/dist/cli-generator.cjs
CHANGED
|
@@ -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
|
-
|
|
412
|
-
|
|
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
|
-
|
|
1123
|
-
|
|
1124
|
-
|
|
1125
|
-
|
|
1126
|
-
|
|
1127
|
-
|
|
1128
|
-
|
|
1129
|
-
|
|
1130
|
-
|
|
1131
|
-
|
|
1132
|
-
|
|
1133
|
-
|
|
1134
|
-
|
|
1135
|
-
|
|
1136
|
-
|
|
1137
|
-
|
|
1138
|
-
|
|
1139
|
-
|
|
1140
|
-
|
|
1141
|
-
|
|
1142
|
-
|
|
1143
|
-
|
|
1144
|
-
|
|
1145
|
-
|
|
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
|
-
|
|
1871
|
-
|
|
1872
|
-
|
|
1873
|
-
|
|
1874
|
-
|
|
1875
|
-
|
|
1876
|
-
|
|
1877
|
-
|
|
1878
|
-
|
|
1879
|
-
|
|
1880
|
-
|
|
1881
|
-
|
|
1882
|
-
|
|
1883
|
-
|
|
1884
|
-
|
|
1885
|
-
|
|
1886
|
-
|
|
1887
|
-
|
|
1888
|
-
|
|
1889
|
-
|
|
1890
|
-
|
|
1891
|
-
|
|
1892
|
-
|
|
1893
|
-
|
|
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
|
|
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
|
-
|
|
1489
|
-
|
|
1490
|
-
|
|
1491
|
-
|
|
1492
|
-
|
|
1493
|
-
|
|
1494
|
-
|
|
1495
|
-
|
|
1496
|
-
|
|
1497
|
-
|
|
1498
|
-
|
|
1499
|
-
|
|
1500
|
-
|
|
1501
|
-
|
|
1502
|
-
|
|
1503
|
-
|
|
1504
|
-
|
|
1505
|
-
|
|
1506
|
-
|
|
1507
|
-
|
|
1508
|
-
|
|
1509
|
-
|
|
1510
|
-
|
|
1511
|
-
|
|
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
|
-
*
|
|
6
|
-
* -
|
|
7
|
-
* -
|
|
8
|
-
* -
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
* -
|
|
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
|
|
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,
|
|
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,
|
|
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.
|
|
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.
|
|
173
|
-
"@ai-toolkit/agents-agnostic": "0.2.10-next.
|
|
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
|