specweave 1.0.447 → 1.0.450

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 (106) hide show
  1. package/bin/specweave.js +18 -0
  2. package/dist/plugins/specweave-ado/lib/ado-client.d.ts +6 -0
  3. package/dist/plugins/specweave-ado/lib/ado-client.d.ts.map +1 -1
  4. package/dist/plugins/specweave-ado/lib/ado-client.js +22 -0
  5. package/dist/plugins/specweave-ado/lib/ado-client.js.map +1 -1
  6. package/dist/src/adapters/adapter-base.d.ts +15 -0
  7. package/dist/src/adapters/adapter-base.d.ts.map +1 -1
  8. package/dist/src/adapters/adapter-base.js +56 -0
  9. package/dist/src/adapters/adapter-base.js.map +1 -1
  10. package/dist/src/adapters/adapter-loader.d.ts.map +1 -1
  11. package/dist/src/adapters/adapter-loader.js +20 -2
  12. package/dist/src/adapters/adapter-loader.js.map +1 -1
  13. package/dist/src/adapters/aider/adapter.d.ts +21 -0
  14. package/dist/src/adapters/aider/adapter.d.ts.map +1 -0
  15. package/dist/src/adapters/aider/adapter.js +57 -0
  16. package/dist/src/adapters/aider/adapter.js.map +1 -0
  17. package/dist/src/adapters/amazonq/adapter.d.ts +21 -0
  18. package/dist/src/adapters/amazonq/adapter.d.ts.map +1 -0
  19. package/dist/src/adapters/amazonq/adapter.js +57 -0
  20. package/dist/src/adapters/amazonq/adapter.js.map +1 -0
  21. package/dist/src/adapters/cline/adapter.d.ts +21 -0
  22. package/dist/src/adapters/cline/adapter.d.ts.map +1 -0
  23. package/dist/src/adapters/cline/adapter.js +57 -0
  24. package/dist/src/adapters/cline/adapter.js.map +1 -0
  25. package/dist/src/adapters/codex/adapter.d.ts +18 -0
  26. package/dist/src/adapters/codex/adapter.d.ts.map +1 -1
  27. package/dist/src/adapters/codex/adapter.js +32 -0
  28. package/dist/src/adapters/codex/adapter.js.map +1 -1
  29. package/dist/src/adapters/continue/adapter.d.ts +63 -0
  30. package/dist/src/adapters/continue/adapter.d.ts.map +1 -0
  31. package/dist/src/adapters/continue/adapter.js +103 -0
  32. package/dist/src/adapters/continue/adapter.js.map +1 -0
  33. package/dist/src/adapters/copilot/adapter.d.ts +65 -0
  34. package/dist/src/adapters/copilot/adapter.d.ts.map +1 -0
  35. package/dist/src/adapters/copilot/adapter.js +106 -0
  36. package/dist/src/adapters/copilot/adapter.js.map +1 -0
  37. package/dist/src/adapters/cursor/adapter.d.ts +4 -20
  38. package/dist/src/adapters/cursor/adapter.d.ts.map +1 -1
  39. package/dist/src/adapters/cursor/adapter.js +12 -129
  40. package/dist/src/adapters/cursor/adapter.js.map +1 -1
  41. package/dist/src/adapters/gemini/adapter.d.ts +18 -0
  42. package/dist/src/adapters/gemini/adapter.d.ts.map +1 -1
  43. package/dist/src/adapters/gemini/adapter.js +32 -0
  44. package/dist/src/adapters/gemini/adapter.js.map +1 -1
  45. package/dist/src/adapters/jetbrains/adapter.d.ts +21 -0
  46. package/dist/src/adapters/jetbrains/adapter.d.ts.map +1 -0
  47. package/dist/src/adapters/jetbrains/adapter.js +57 -0
  48. package/dist/src/adapters/jetbrains/adapter.js.map +1 -0
  49. package/dist/src/adapters/registry.yaml +166 -20
  50. package/dist/src/adapters/tabnine/adapter.d.ts +21 -0
  51. package/dist/src/adapters/tabnine/adapter.d.ts.map +1 -0
  52. package/dist/src/adapters/tabnine/adapter.js +57 -0
  53. package/dist/src/adapters/tabnine/adapter.js.map +1 -0
  54. package/dist/src/adapters/windsurf/adapter.d.ts +64 -0
  55. package/dist/src/adapters/windsurf/adapter.d.ts.map +1 -0
  56. package/dist/src/adapters/windsurf/adapter.js +106 -0
  57. package/dist/src/adapters/windsurf/adapter.js.map +1 -0
  58. package/dist/src/adapters/zed/adapter.d.ts +21 -0
  59. package/dist/src/adapters/zed/adapter.d.ts.map +1 -0
  60. package/dist/src/adapters/zed/adapter.js +57 -0
  61. package/dist/src/adapters/zed/adapter.js.map +1 -0
  62. package/dist/src/cli/commands/get.d.ts +17 -1
  63. package/dist/src/cli/commands/get.d.ts.map +1 -1
  64. package/dist/src/cli/commands/get.js +51 -1
  65. package/dist/src/cli/commands/get.js.map +1 -1
  66. package/dist/src/cli/commands/link-pr.d.ts +17 -0
  67. package/dist/src/cli/commands/link-pr.d.ts.map +1 -0
  68. package/dist/src/cli/commands/link-pr.js +45 -0
  69. package/dist/src/cli/commands/link-pr.js.map +1 -0
  70. package/dist/src/cli/helpers/get/bulk-get.d.ts +41 -0
  71. package/dist/src/cli/helpers/get/bulk-get.d.ts.map +1 -0
  72. package/dist/src/cli/helpers/get/bulk-get.js +88 -0
  73. package/dist/src/cli/helpers/get/bulk-get.js.map +1 -0
  74. package/dist/src/cli/helpers/init/github-repo-cloning.d.ts +50 -0
  75. package/dist/src/cli/helpers/init/github-repo-cloning.d.ts.map +1 -1
  76. package/dist/src/cli/helpers/init/github-repo-cloning.js +1 -1
  77. package/dist/src/cli/helpers/init/github-repo-cloning.js.map +1 -1
  78. package/dist/src/core/skills/skill-judge.d.ts.map +1 -1
  79. package/dist/src/core/skills/skill-judge.js +2 -1
  80. package/dist/src/core/skills/skill-judge.js.map +1 -1
  81. package/dist/src/integrations/jira/jira-client.d.ts +12 -0
  82. package/dist/src/integrations/jira/jira-client.d.ts.map +1 -1
  83. package/dist/src/integrations/jira/jira-client.js +37 -0
  84. package/dist/src/integrations/jira/jira-client.js.map +1 -1
  85. package/dist/src/metrics/dora-calculator.d.ts.map +1 -1
  86. package/dist/src/metrics/dora-calculator.js +3 -2
  87. package/dist/src/metrics/dora-calculator.js.map +1 -1
  88. package/dist/src/sync/format-preservation-sync.d.ts +3 -0
  89. package/dist/src/sync/format-preservation-sync.d.ts.map +1 -1
  90. package/dist/src/sync/format-preservation-sync.js +9 -0
  91. package/dist/src/sync/format-preservation-sync.js.map +1 -1
  92. package/dist/src/sync/integration-health-check.d.ts +45 -0
  93. package/dist/src/sync/integration-health-check.d.ts.map +1 -0
  94. package/dist/src/sync/integration-health-check.js +186 -0
  95. package/dist/src/sync/integration-health-check.js.map +1 -0
  96. package/dist/src/sync/pr-linker.d.ts +38 -0
  97. package/dist/src/sync/pr-linker.d.ts.map +1 -0
  98. package/dist/src/sync/pr-linker.js +157 -0
  99. package/dist/src/sync/pr-linker.js.map +1 -0
  100. package/package.json +1 -1
  101. package/plugins/specweave/commands/sync-setup.md +24 -1
  102. package/plugins/specweave/skills/get/SKILL.md +38 -6
  103. package/plugins/specweave/skills/pr/SKILL.md +39 -2
  104. package/plugins/specweave-ado/lib/ado-client.js +22 -0
  105. package/plugins/specweave-ado/lib/ado-client.ts +25 -0
  106. package/src/templates/AGENTS.md.template +19 -5
@@ -0,0 +1,106 @@
1
+ /**
2
+ * Windsurf Adapter
3
+ *
4
+ * Semi-automation adapter for Windsurf (by Codeium).
5
+ * Uses rule files in .windsurf/rules/ for context-specific instructions.
6
+ */
7
+ import * as path from 'path';
8
+ import * as fs from '../../utils/fs-native.js';
9
+ import { AdapterBase } from '../adapter-base.js';
10
+ export class WindsurfAdapter extends AdapterBase {
11
+ constructor() {
12
+ super(...arguments);
13
+ this.name = 'windsurf';
14
+ this.description = 'Windsurf adapter - Semi-automation with rules in .windsurf/rules/';
15
+ this.automationLevel = 'semi';
16
+ }
17
+ /**
18
+ * Detect if Windsurf is available
19
+ *
20
+ * Checks for:
21
+ * - windsurf command in PATH
22
+ * - .windsurf/ directory exists
23
+ */
24
+ async detect() {
25
+ const hasCLI = await this.commandExists('windsurf');
26
+ const hasDir = await this.fileExists('.windsurf');
27
+ return hasCLI || hasDir;
28
+ }
29
+ /**
30
+ * Get files to install for Windsurf adapter
31
+ */
32
+ getFiles() {
33
+ return [];
34
+ }
35
+ /**
36
+ * Install Windsurf adapter
37
+ */
38
+ async install(options) {
39
+ console.log('\n📦 Installing Windsurf Adapter\n');
40
+ const rulesDir = path.join(options.projectPath, '.windsurf', 'rules');
41
+ await fs.ensureDir(rulesDir);
42
+ console.log('\n✨ Windsurf adapter installed!');
43
+ console.log(' Run `specweave refresh-plugins` to install skills.');
44
+ }
45
+ /**
46
+ * Check if Windsurf adapter supports plugins
47
+ */
48
+ supportsPlugins() {
49
+ return true;
50
+ }
51
+ /**
52
+ * Compile and install a plugin for Windsurf
53
+ *
54
+ * Writes skill SKILL.md files as <plugin>-<skill>.md
55
+ * into .windsurf/rules/ for auto-loading by Windsurf.
56
+ *
57
+ * @param plugin Plugin to install
58
+ */
59
+ async compilePlugin(plugin) {
60
+ const rulesDir = '.windsurf/rules';
61
+ console.log(`\n📦 Installing plugin skills for Windsurf: ${plugin.manifest.name}`);
62
+ await this.writeSkillFiles(plugin, rulesDir, '.md');
63
+ console.log(` ✓ ${plugin.skills.length} skill(s) written to ${rulesDir}/`);
64
+ console.log(`\n✅ Plugin ${plugin.manifest.name} installed for Windsurf!`);
65
+ }
66
+ /**
67
+ * Unload a plugin from Windsurf
68
+ *
69
+ * Removes <pluginName>-*.md files from .windsurf/rules/
70
+ *
71
+ * @param pluginName Name of plugin to unload
72
+ */
73
+ async unloadPlugin(pluginName) {
74
+ console.log(`\n🗑️ Unloading plugin from Windsurf: ${pluginName}`);
75
+ await this.removeSkillFiles(pluginName, '.windsurf/rules', '.md');
76
+ console.log(` ✓ Removed from .windsurf/rules/`);
77
+ console.log(`\n✅ Plugin ${pluginName} unloaded!`);
78
+ }
79
+ /**
80
+ * Get list of installed plugins for Windsurf
81
+ */
82
+ async getInstalledPlugins() {
83
+ return await this.listInstalledPluginsInDir('.windsurf/rules');
84
+ }
85
+ /**
86
+ * Post-installation instructions
87
+ */
88
+ async postInstall(options) {
89
+ console.log(this.getInstructions());
90
+ }
91
+ /**
92
+ * Get usage instructions for Windsurf adapter
93
+ */
94
+ getInstructions() {
95
+ return `
96
+ Windsurf Adapter
97
+
98
+ Skills are installed in .windsurf/rules/ — Windsurf loads *.md rule files automatically.
99
+
100
+ Quick Start:
101
+ Run: specweave refresh-plugins
102
+ Then use Windsurf normally — skills are auto-loaded.
103
+ `;
104
+ }
105
+ }
106
+ //# sourceMappingURL=adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../../../src/adapters/windsurf/adapter.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,MAAM,0BAA0B,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAIjD,MAAM,OAAO,eAAgB,SAAQ,WAAW;IAAhD;;QACE,SAAI,GAAG,UAAU,CAAC;QAClB,gBAAW,GAAG,mEAAmE,CAAC;QAClF,oBAAe,GAAG,MAAe,CAAC;IAkGpC,CAAC;IAhGC;;;;;;OAMG;IACH,KAAK,CAAC,MAAM;QACV,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;QACpD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;QAClD,OAAO,MAAM,IAAI,MAAM,CAAC;IAC1B,CAAC;IAED;;OAEG;IACH,QAAQ;QACN,OAAO,EAAE,CAAC;IACZ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,OAAO,CAAC,OAAuB;QACnC,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;QAClD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;QACtE,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QAC7B,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;QAC/C,OAAO,CAAC,GAAG,CAAC,uDAAuD,CAAC,CAAC;IACvE,CAAC;IAED;;OAEG;IACH,eAAe;QACb,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;;;;OAOG;IACH,KAAK,CAAC,aAAa,CAAC,MAAc;QAChC,MAAM,QAAQ,GAAG,iBAAiB,CAAC;QACnC,OAAO,CAAC,GAAG,CAAC,+CAA+C,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;QACnF,MAAM,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;QACpD,OAAO,CAAC,GAAG,CAAC,QAAQ,MAAM,CAAC,MAAM,CAAC,MAAM,wBAAwB,QAAQ,GAAG,CAAC,CAAC;QAC7E,OAAO,CAAC,GAAG,CAAC,cAAc,MAAM,CAAC,QAAQ,CAAC,IAAI,0BAA0B,CAAC,CAAC;IAC5E,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,YAAY,CAAC,UAAkB;QACnC,OAAO,CAAC,GAAG,CAAC,0CAA0C,UAAU,EAAE,CAAC,CAAC;QACpE,MAAM,IAAI,CAAC,gBAAgB,CAAC,UAAU,EAAE,iBAAiB,EAAE,KAAK,CAAC,CAAC;QAClE,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;QAClD,OAAO,CAAC,GAAG,CAAC,cAAc,UAAU,YAAY,CAAC,CAAC;IACpD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,mBAAmB;QACvB,OAAO,MAAM,IAAI,CAAC,yBAAyB,CAAC,iBAAiB,CAAC,CAAC;IACjE,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,WAAW,CAAC,OAAuB;QACvC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC,CAAC;IACtC,CAAC;IAED;;OAEG;IACH,eAAe;QACb,OAAO;;;;;;;;KAQN,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Zed Adapter
3
+ */
4
+ import { AdapterBase } from '../adapter-base.js';
5
+ import { AdapterOptions, AdapterFile } from '../adapter-interface.js';
6
+ import type { Plugin } from '../../core/types/plugin.js';
7
+ export declare class ZedAdapter extends AdapterBase {
8
+ name: string;
9
+ description: string;
10
+ automationLevel: "semi";
11
+ detect(): Promise<boolean>;
12
+ getFiles(): AdapterFile[];
13
+ install(options: AdapterOptions): Promise<void>;
14
+ supportsPlugins(): boolean;
15
+ compilePlugin(plugin: Plugin): Promise<void>;
16
+ unloadPlugin(pluginName: string): Promise<void>;
17
+ getInstalledPlugins(): Promise<string[]>;
18
+ postInstall(options: AdapterOptions): Promise<void>;
19
+ getInstructions(): string;
20
+ }
21
+ //# sourceMappingURL=adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../../../src/adapters/zed/adapter.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAC;AAEzD,qBAAa,UAAW,SAAQ,WAAW;IACzC,IAAI,SAAS;IACb,WAAW,SAA+C;IAC1D,eAAe,EAAG,MAAM,CAAU;IAE5B,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC;IAIhC,QAAQ,IAAI,WAAW,EAAE;IAInB,OAAO,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAOrD,eAAe,IAAI,OAAO;IAIpB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ5C,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAO/C,mBAAmB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAIxC,WAAW,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAIzD,eAAe,IAAI,MAAM;CAQ1B"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Zed Adapter
3
+ */
4
+ import * as path from 'path';
5
+ import * as fs from '../../utils/fs-native.js';
6
+ import { AdapterBase } from '../adapter-base.js';
7
+ export class ZedAdapter extends AdapterBase {
8
+ constructor() {
9
+ super(...arguments);
10
+ this.name = 'zed';
11
+ this.description = 'Zed adapter — skills installed in .rules/';
12
+ this.automationLevel = 'semi';
13
+ }
14
+ async detect() {
15
+ return await this.commandExists('zed') || await this.fileExists('.zed');
16
+ }
17
+ getFiles() {
18
+ return [];
19
+ }
20
+ async install(options) {
21
+ console.log('\n📦 Installing Zed Adapter\n');
22
+ await fs.ensureDir(path.join(options.projectPath, '.rules'));
23
+ console.log('\n✨ Zed adapter installed!');
24
+ console.log(' Run `specweave refresh-plugins` to install skills.');
25
+ }
26
+ supportsPlugins() {
27
+ return true;
28
+ }
29
+ async compilePlugin(plugin) {
30
+ const rulesDir = '.rules';
31
+ console.log(`\n📦 Installing plugin skills for Zed: ${plugin.manifest.name}`);
32
+ await this.writeSkillFiles(plugin, rulesDir);
33
+ console.log(` ✓ ${plugin.skills.length} skill(s) written to ${rulesDir}/`);
34
+ console.log(`\n✅ Plugin ${plugin.manifest.name} installed for Zed!`);
35
+ }
36
+ async unloadPlugin(pluginName) {
37
+ console.log(`\n🗑️ Unloading plugin from Zed: ${pluginName}`);
38
+ await this.removeSkillFiles(pluginName, '.rules');
39
+ console.log(` ✓ Removed from .rules/`);
40
+ console.log(`\n✅ Plugin ${pluginName} unloaded!`);
41
+ }
42
+ async getInstalledPlugins() {
43
+ return await this.listInstalledPluginsInDir('.rules');
44
+ }
45
+ async postInstall(options) {
46
+ console.log(this.getInstructions());
47
+ }
48
+ getInstructions() {
49
+ return `
50
+ Zed Adapter
51
+
52
+ Skills installed in .rules/.
53
+ Run: specweave refresh-plugins
54
+ `;
55
+ }
56
+ }
57
+ //# sourceMappingURL=adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../../../src/adapters/zed/adapter.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,MAAM,0BAA0B,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAIjD,MAAM,OAAO,UAAW,SAAQ,WAAW;IAA3C;;QACE,SAAI,GAAG,KAAK,CAAC;QACb,gBAAW,GAAG,2CAA2C,CAAC;QAC1D,oBAAe,GAAG,MAAe,CAAC;IAoDpC,CAAC;IAlDC,KAAK,CAAC,MAAM;QACV,OAAO,MAAM,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;IAC1E,CAAC;IAED,QAAQ;QACN,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,OAAuB;QACnC,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;QAC7C,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC,CAAC;QAC7D,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;QAC1C,OAAO,CAAC,GAAG,CAAC,uDAAuD,CAAC,CAAC;IACvE,CAAC;IAED,eAAe;QACb,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,MAAc;QAChC,MAAM,QAAQ,GAAG,QAAQ,CAAC;QAC1B,OAAO,CAAC,GAAG,CAAC,0CAA0C,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;QAC9E,MAAM,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAC7C,OAAO,CAAC,GAAG,CAAC,QAAQ,MAAM,CAAC,MAAM,CAAC,MAAM,wBAAwB,QAAQ,GAAG,CAAC,CAAC;QAC7E,OAAO,CAAC,GAAG,CAAC,cAAc,MAAM,CAAC,QAAQ,CAAC,IAAI,qBAAqB,CAAC,CAAC;IACvE,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,UAAkB;QACnC,OAAO,CAAC,GAAG,CAAC,qCAAqC,UAAU,EAAE,CAAC,CAAC;QAC/D,MAAM,IAAI,CAAC,gBAAgB,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;QAClD,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;QACzC,OAAO,CAAC,GAAG,CAAC,cAAc,UAAU,YAAY,CAAC,CAAC;IACpD,CAAC;IAED,KAAK,CAAC,mBAAmB;QACvB,OAAO,MAAM,IAAI,CAAC,yBAAyB,CAAC,QAAQ,CAAC,CAAC;IACxD,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,OAAuB;QACvC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC,CAAC;IACtC,CAAC;IAED,eAAe;QACb,OAAO;;;;;KAKN,CAAC;IACJ,CAAC;CACF"}
@@ -3,11 +3,17 @@
3
3
  *
4
4
  * Clone an existing repository into the workspace and register it.
5
5
  *
6
- * Usage:
6
+ * Usage (single repo):
7
7
  * specweave get owner/repo
8
8
  * specweave get https://github.com/org/repo
9
9
  * specweave get git@github.com:org/repo
10
10
  * specweave get ./path/to/local-repo
11
+ *
12
+ * Usage (bulk):
13
+ * specweave get "org/service-*" # glob
14
+ * specweave get "org/*" # all repos in org
15
+ * specweave get --all org # all repos in org (flag form)
16
+ * specweave get --all org --pattern "svc-*"
11
17
  */
12
18
  export interface GetOptions {
13
19
  branch?: string;
@@ -16,6 +22,16 @@ export interface GetOptions {
16
22
  /** true by default, false when --no-init is passed */
17
23
  init?: boolean;
18
24
  yes?: boolean;
25
+ /** Bulk: clone all repos in org */
26
+ all?: boolean;
27
+ /** Bulk: glob pattern filter (used with --all) */
28
+ pattern?: string;
29
+ /** Bulk: max repos to fetch (default 1000) */
30
+ limit?: number;
31
+ /** Bulk: skip archived repos */
32
+ noArchived?: boolean;
33
+ /** Bulk: skip forked repos */
34
+ noForks?: boolean;
19
35
  }
20
36
  export declare function getCommand(source: string, options?: GetOptions): Promise<void>;
21
37
  //# sourceMappingURL=get.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"get.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/get.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAWH,MAAM,WAAW,UAAU;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,sDAAsD;IACtD,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAED,wBAAsB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,UAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CA2GxF"}
1
+ {"version":3,"file":"get.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/get.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAaH,MAAM,WAAW,UAAU;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,sDAAsD;IACtD,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,mCAAmC;IACnC,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,kDAAkD;IAClD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,8CAA8C;IAC9C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gCAAgC;IAChC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,8BAA8B;IAC9B,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,wBAAsB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,UAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAkHxF"}
@@ -3,11 +3,17 @@
3
3
  *
4
4
  * Clone an existing repository into the workspace and register it.
5
5
  *
6
- * Usage:
6
+ * Usage (single repo):
7
7
  * specweave get owner/repo
8
8
  * specweave get https://github.com/org/repo
9
9
  * specweave get git@github.com:org/repo
10
10
  * specweave get ./path/to/local-repo
11
+ *
12
+ * Usage (bulk):
13
+ * specweave get "org/service-*" # glob
14
+ * specweave get "org/*" # all repos in org
15
+ * specweave get --all org # all repos in org (flag form)
16
+ * specweave get --all org --pattern "svc-*"
11
17
  */
12
18
  import chalk from 'chalk';
13
19
  import * as fs from 'fs';
@@ -15,6 +21,8 @@ import * as path from 'path';
15
21
  import { parseSource } from '../helpers/get/source-parser.js';
16
22
  import { cloneRepo } from '../helpers/get/clone-repo.js';
17
23
  import { registerRepo } from '../helpers/get/register-repo.js';
24
+ import { parseBulkSource, getAuthToken, buildBulkRepoList } from '../helpers/get/bulk-get.js';
25
+ import { launchCloneJob } from '../../core/background/job-launcher.js';
18
26
  import { execFileNoThrow } from '../../utils/execFileNoThrow.js';
19
27
  import { detectRepository } from '../../utils/git-utils.js';
20
28
  export async function getCommand(source, options = {}) {
@@ -35,6 +43,12 @@ export async function getCommand(source, options = {}) {
35
43
  process.exit(1);
36
44
  return;
37
45
  }
46
+ // Bulk mode: detect glob/--all before single-repo path
47
+ const bulkSource = parseBulkSource(source, { all: options.all, pattern: options.pattern });
48
+ if (bulkSource) {
49
+ await _handleBulkGet(projectRoot, bulkSource, options);
50
+ return;
51
+ }
38
52
  const isUmbrella = config.umbrella?.enabled === true;
39
53
  // Parse source
40
54
  let parsed;
@@ -118,6 +132,42 @@ export async function getCommand(source, options = {}) {
118
132
  console.log(chalk.green(`\n Done! Repository available at ./${repo}/\n`));
119
133
  }
120
134
  }
135
+ async function _handleBulkGet(projectRoot, bulkSource, options) {
136
+ const { org, pattern } = bulkSource;
137
+ const patternDisplay = pattern ?? '*';
138
+ console.log(chalk.blue(`\n Fetching repos from ${org} (pattern: ${patternDisplay})...\n`));
139
+ let token;
140
+ try {
141
+ token = await getAuthToken();
142
+ }
143
+ catch (err) {
144
+ console.log(chalk.red(`\n ${err instanceof Error ? err.message : String(err)}\n`));
145
+ process.exit(1);
146
+ return;
147
+ }
148
+ let repositories;
149
+ try {
150
+ repositories = await buildBulkRepoList(org, token, pattern, {
151
+ noArchived: options.noArchived,
152
+ noForks: options.noForks,
153
+ limit: options.limit,
154
+ });
155
+ }
156
+ catch (err) {
157
+ console.log(chalk.red(`\n Failed to fetch repos: ${err instanceof Error ? err.message : String(err)}\n`));
158
+ process.exit(1);
159
+ return;
160
+ }
161
+ if (repositories.length === 0) {
162
+ console.log(chalk.yellow(` No repos found matching "${patternDisplay}" in ${org}.\n`));
163
+ return;
164
+ }
165
+ console.log(chalk.green(` Found ${repositories.length} repo(s) matching "${patternDisplay}". Launching background clone job...\n`));
166
+ const result = await launchCloneJob({ projectPath: projectRoot, repositories });
167
+ const jobId = result.job?.id ?? 'unknown';
168
+ console.log(chalk.green(` Job ${jobId} started.`));
169
+ console.log(chalk.dim(` Monitor: specweave jobs\n`));
170
+ }
121
171
  async function _registerAndInit(projectRoot, owner, repo, relPath, absPath, options, showPath, githubUrl) {
122
172
  const regResult = await registerRepo(projectRoot, owner, repo, relPath, {
123
173
  prefix: options.prefix,
@@ -1 +1 @@
1
- {"version":3,"file":"get.js","sourceRoot":"","sources":["../../../../src/cli/commands/get.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"get.js","sourceRoot":"","sources":["../../../../src/cli/commands/get.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * CLI Command: link-pr
3
+ *
4
+ * Links a pull request to external tickets (JIRA remote links, ADO hyperlinks)
5
+ *
6
+ * Usage:
7
+ * specweave link-pr --increment <id> --pr-url <url> --pr-number <num> [--branch <name>]
8
+ *
9
+ * @module cli/commands/link-pr
10
+ */
11
+ export declare function runLinkPr(options: {
12
+ increment: string;
13
+ prUrl: string;
14
+ prNumber: string;
15
+ branch?: string;
16
+ }): Promise<void>;
17
+ //# sourceMappingURL=link-pr.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"link-pr.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/link-pr.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAKH,wBAAsB,SAAS,CAAC,OAAO,EAAE;IACvC,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GAAG,OAAO,CAAC,IAAI,CAAC,CAsChB"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * CLI Command: link-pr
3
+ *
4
+ * Links a pull request to external tickets (JIRA remote links, ADO hyperlinks)
5
+ *
6
+ * Usage:
7
+ * specweave link-pr --increment <id> --pr-url <url> --pr-number <num> [--branch <name>]
8
+ *
9
+ * @module cli/commands/link-pr
10
+ */
11
+ import chalk from 'chalk';
12
+ import { linkPrToExternalTickets } from '../../sync/pr-linker.js';
13
+ export async function runLinkPr(options) {
14
+ const projectRoot = process.cwd();
15
+ if (!options.increment || !options.prUrl || !options.prNumber) {
16
+ console.error(chalk.red('Missing required options: --increment, --pr-url, --pr-number'));
17
+ process.exit(1);
18
+ }
19
+ console.log(chalk.cyan(`\n🔗 Linking PR #${options.prNumber} to external tickets...`));
20
+ const result = await linkPrToExternalTickets({
21
+ projectRoot,
22
+ incrementId: options.increment,
23
+ prUrl: options.prUrl,
24
+ prNumber: parseInt(options.prNumber, 10),
25
+ branch: options.branch || '',
26
+ });
27
+ // Report results
28
+ if (result.linked.length > 0) {
29
+ console.log(chalk.green(`\n✅ Linked to ${result.linked.length} ticket(s):`));
30
+ for (const link of result.linked) {
31
+ console.log(chalk.green(` • ${link.provider.toUpperCase()}: ${link.key}`));
32
+ }
33
+ }
34
+ if (result.errors.length > 0) {
35
+ console.log(chalk.yellow(`\n⚠️ ${result.errors.length} linking error(s):`));
36
+ for (const err of result.errors) {
37
+ console.log(chalk.yellow(` • ${err.provider.toUpperCase()} ${err.key}: ${err.error}`));
38
+ }
39
+ }
40
+ if (result.linked.length === 0 && result.errors.length === 0) {
41
+ console.log(chalk.gray('\n No external tickets found in metadata — nothing to link'));
42
+ }
43
+ console.log('');
44
+ }
45
+ //# sourceMappingURL=link-pr.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"link-pr.js","sourceRoot":"","sources":["../../../../src/cli/commands/link-pr.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAElE,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,OAK/B;IACC,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAElC,IAAI,CAAC,OAAO,CAAC,SAAS,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;QAC9D,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,8DAA8D,CAAC,CAAC,CAAC;QACzF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,oBAAoB,OAAO,CAAC,QAAQ,yBAAyB,CAAC,CAAC,CAAC;IAEvF,MAAM,MAAM,GAAG,MAAM,uBAAuB,CAAC;QAC3C,WAAW;QACX,WAAW,EAAE,OAAO,CAAC,SAAS;QAC9B,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,QAAQ,EAAE,QAAQ,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC;QACxC,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,EAAE;KAC7B,CAAC,CAAC;IAEH,iBAAiB;IACjB,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,iBAAiB,MAAM,CAAC,MAAM,CAAC,MAAM,aAAa,CAAC,CAAC,CAAC;QAC7E,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YACjC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,KAAK,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QAC/E,CAAC;IACH,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,MAAM,CAAC,MAAM,CAAC,MAAM,oBAAoB,CAAC,CAAC,CAAC;QAC7E,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAChC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,GAAG,CAAC,QAAQ,CAAC,WAAW,EAAE,IAAI,GAAG,CAAC,GAAG,KAAK,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QAC3F,CAAC;IACH,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,8DAA8D,CAAC,CAAC,CAAC;IAC1F,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Bulk Get Helpers for `specweave get`
3
+ *
4
+ * Wires fetchGitHubRepos + matchByGlob + launchCloneJob into a bulk clone path.
5
+ */
6
+ export interface BulkSource {
7
+ org: string;
8
+ /** null = all repos in org, string = glob pattern to filter by */
9
+ pattern: string | null;
10
+ }
11
+ export interface BulkRepoEntry {
12
+ owner: string;
13
+ name: string;
14
+ /** Relative path within umbrella: repositories/{owner}/{name} */
15
+ path: string;
16
+ cloneUrl: string;
17
+ }
18
+ export interface BuildBulkOptions {
19
+ noArchived?: boolean;
20
+ noForks?: boolean;
21
+ limit?: number;
22
+ }
23
+ /**
24
+ * Parse source into org + optional glob pattern.
25
+ * Returns null if source should be handled by the single-repo path.
26
+ */
27
+ export declare function parseBulkSource(source: string, options: {
28
+ all?: boolean;
29
+ pattern?: string;
30
+ }): BulkSource | null;
31
+ /**
32
+ * Resolve GitHub auth token.
33
+ * Priority: GH_TOKEN env → `gh auth token` CLI → throw helpful error.
34
+ */
35
+ export declare function getAuthToken(): Promise<string>;
36
+ /**
37
+ * Fetch repos from a GitHub org, apply pattern + filters, and return
38
+ * the CloneLaunchOptions.repositories array ready for launchCloneJob().
39
+ */
40
+ export declare function buildBulkRepoList(org: string, token: string, pattern: string | null, options: BuildBulkOptions): Promise<BulkRepoEntry[]>;
41
+ //# sourceMappingURL=bulk-get.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bulk-get.d.ts","sourceRoot":"","sources":["../../../../../src/cli/helpers/get/bulk-get.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAOH,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,kEAAkE;IAClE,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,iEAAiE;IACjE,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,gBAAgB;IAC/B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,MAAM,EAAE,MAAM,EACd,OAAO,EAAE;IAAE,GAAG,CAAC,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GAC3C,UAAU,GAAG,IAAI,CAsCnB;AAED;;;GAGG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC,CAYpD;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CACrC,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,GAAG,IAAI,EACtB,OAAO,EAAE,gBAAgB,GACxB,OAAO,CAAC,aAAa,EAAE,CAAC,CA+B1B"}
@@ -0,0 +1,88 @@
1
+ /**
2
+ * Bulk Get Helpers for `specweave get`
3
+ *
4
+ * Wires fetchGitHubRepos + matchByGlob + launchCloneJob into a bulk clone path.
5
+ */
6
+ import { execFileNoThrow } from '../../../utils/execFileNoThrow.js';
7
+ import { fetchGitHubRepos } from '../init/github-repo-cloning.js';
8
+ import { matchByGlob } from '../selection-strategy.js';
9
+ import { REPO_FETCH_LIMITS } from '../init/types.js';
10
+ /**
11
+ * Parse source into org + optional glob pattern.
12
+ * Returns null if source should be handled by the single-repo path.
13
+ */
14
+ export function parseBulkSource(source, options) {
15
+ const trimmed = source.trim();
16
+ // Skip local paths and full URLs — not bulk targets
17
+ if (trimmed.startsWith('./') ||
18
+ trimmed.startsWith('../') ||
19
+ trimmed.startsWith('/') ||
20
+ trimmed.startsWith('~') ||
21
+ trimmed.startsWith('http') ||
22
+ trimmed.startsWith('git@')) {
23
+ return null;
24
+ }
25
+ const slashIdx = trimmed.indexOf('/');
26
+ if (slashIdx === -1) {
27
+ // Bare org name — only bulk if --all is set
28
+ if (!options.all)
29
+ return null;
30
+ return { org: trimmed, pattern: options.pattern ?? null };
31
+ }
32
+ const org = trimmed.slice(0, slashIdx);
33
+ const repoOrPattern = trimmed.slice(slashIdx + 1);
34
+ // Contains glob chars → bulk mode
35
+ if (repoOrPattern.includes('*') || repoOrPattern.includes('?')) {
36
+ const pattern = repoOrPattern === '*' ? null : repoOrPattern;
37
+ return { org, pattern };
38
+ }
39
+ // --all flag with org/something form — treat something as pattern override
40
+ if (options.all) {
41
+ return { org, pattern: options.pattern ?? repoOrPattern };
42
+ }
43
+ return null;
44
+ }
45
+ /**
46
+ * Resolve GitHub auth token.
47
+ * Priority: GH_TOKEN env → `gh auth token` CLI → throw helpful error.
48
+ */
49
+ export async function getAuthToken() {
50
+ if (process.env.GH_TOKEN?.trim())
51
+ return process.env.GH_TOKEN.trim();
52
+ const result = await execFileNoThrow('gh', ['auth', 'token'], {});
53
+ if (result.exitCode === 0 && result.stdout.trim()) {
54
+ return result.stdout.trim();
55
+ }
56
+ throw new Error('GitHub auth required for bulk clone.\n' +
57
+ 'Fix: run `gh auth login` or set the GH_TOKEN environment variable.');
58
+ }
59
+ /**
60
+ * Fetch repos from a GitHub org, apply pattern + filters, and return
61
+ * the CloneLaunchOptions.repositories array ready for launchCloneJob().
62
+ */
63
+ export async function buildBulkRepoList(org, token, pattern, options) {
64
+ const limit = options.limit ?? REPO_FETCH_LIMITS.DEFAULT_MAX_REPOS;
65
+ const fetchResult = await fetchGitHubRepos(org, token, limit);
66
+ if (fetchResult.error) {
67
+ throw new Error(fetchResult.error);
68
+ }
69
+ let repos = fetchResult.repos;
70
+ // Apply pre-filter on archived/forks before pattern matching
71
+ if (options.noArchived)
72
+ repos = repos.filter(r => !r.archived);
73
+ if (options.noForks)
74
+ repos = repos.filter(r => !r.fork);
75
+ // Apply glob pattern
76
+ if (pattern !== null) {
77
+ const matched = matchByGlob(repos.map(r => ({ name: r.name, value: r.name })), pattern, 'name');
78
+ const matchedNames = new Set(matched.map(m => m.name));
79
+ repos = repos.filter(r => matchedNames.has(r.name));
80
+ }
81
+ return repos.map(r => ({
82
+ owner: r.owner.login,
83
+ name: r.name,
84
+ path: `repositories/${r.owner.login}/${r.name}`,
85
+ cloneUrl: r.clone_url,
86
+ }));
87
+ }
88
+ //# sourceMappingURL=bulk-get.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bulk-get.js","sourceRoot":"","sources":["../../../../../src/cli/helpers/get/bulk-get.ts"],"names":[],"mappings":"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"}
@@ -22,6 +22,55 @@ export interface GitHubRepoSelection {
22
22
  /** Personal Access Token */
23
23
  pat: string;
24
24
  }
25
+ /**
26
+ * Repository info from GitHub API
27
+ *
28
+ * @see https://docs.github.com/en/rest/repos/repos#list-repositories-for-the-authenticated-user
29
+ */
30
+ interface GitHubRepository {
31
+ id: number;
32
+ name: string;
33
+ full_name: string;
34
+ clone_url: string;
35
+ html_url: string;
36
+ owner: {
37
+ login: string;
38
+ };
39
+ /** Whether the repository is archived (read-only, may be stale) */
40
+ archived: boolean;
41
+ /** Whether the repository is a fork of another repo */
42
+ fork: boolean;
43
+ /** Whether the repository is private */
44
+ private: boolean;
45
+ /** Visibility: public, private, or internal (GitHub Enterprise) */
46
+ visibility?: string;
47
+ }
48
+ /**
49
+ * Rate limit info from GitHub API headers
50
+ */
51
+ interface RateLimitInfo {
52
+ remaining: number;
53
+ limit: number;
54
+ reset: Date;
55
+ }
56
+ /**
57
+ * Fetch result with repos and rate limit info
58
+ */
59
+ interface FetchResult {
60
+ repos: GitHubRepository[];
61
+ rateLimit?: RateLimitInfo;
62
+ partial: boolean;
63
+ error?: string;
64
+ }
65
+ /**
66
+ * Fetch repositories from GitHub organization with pagination and rate limit handling
67
+ *
68
+ * @param org - GitHub organization or owner
69
+ * @param pat - Personal Access Token
70
+ * @param maxRepos - Maximum repos to fetch (default 1000, configurable via REPO_FETCH_LIMITS)
71
+ * @returns Fetch result with repos and metadata
72
+ */
73
+ export declare function fetchGitHubRepos(org: string, pat: string, maxRepos?: number): Promise<FetchResult>;
25
74
  /**
26
75
  * Result of GitHub repo cloning trigger
27
76
  */
@@ -98,4 +147,5 @@ export interface SingleRepoCloneResult {
98
147
  * @returns Result with clone status, job ID, or error
99
148
  */
100
149
  export declare function cloneSingleGitHubRepo(options: SingleRepoCloneOptions): Promise<SingleRepoCloneResult>;
150
+ export {};
101
151
  //# sourceMappingURL=github-repo-cloning.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"github-repo-cloning.d.ts","sourceRoot":"","sources":["../../../../../src/cli/helpers/init/github-repo-cloning.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAKH,OAAO,EAA+B,KAAK,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAKhG;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,mCAAmC;IACnC,GAAG,EAAE,MAAM,CAAC;IACZ,4BAA4B;IAC5B,GAAG,EAAE,MAAM,CAAC;CACb;AAuQD;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,2CAA2C;IAC3C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gEAAgE;IAChE,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AA8BD;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,MAAM,EACX,YAAY,GAAE,KAAK,GAAG,OAAiB,GACtC,MAAM,CAKR;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,wBAAwB,CAC5C,WAAW,EAAE,MAAM,EACnB,mBAAmB,EAAE,mBAAmB,EACxC,YAAY,EAAE,kBAAkB,EAChC,YAAY,GAAE,KAAK,GAAG,OAAiB,EACvC,YAAY,GAAE,MAAM,EAAO,GAC1B,OAAO,CAAC,mBAAmB,CAAC,CAsH9B;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,6DAA6D;IAC7D,cAAc,EAAE,MAAM,CAAC;IACvB,wBAAwB;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,oCAAoC;IACpC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,gDAAgD;IAChD,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,yCAAyC;IACzC,MAAM,EAAE,OAAO,CAAC;IAChB,mCAAmC;IACnC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,8CAA8C;IAC9C,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,mBAAmB;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,uBAAuB;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,8BAA8B;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;;GAQG;AACH,wBAAsB,qBAAqB,CACzC,OAAO,EAAE,sBAAsB,GAC9B,OAAO,CAAC,qBAAqB,CAAC,CAyFhC"}
1
+ {"version":3,"file":"github-repo-cloning.d.ts","sourceRoot":"","sources":["../../../../../src/cli/helpers/init/github-repo-cloning.ts"],"names":[],"mappings":"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"}