@a-company/paradigm 1.5.0

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 (114) hide show
  1. package/README.md +142 -0
  2. package/dist/accept-orchestration-CWZNCGZX.js +188 -0
  3. package/dist/agents-suggest-35LIQKDH.js +83 -0
  4. package/dist/aggregate-W7Q6VIM2.js +88 -0
  5. package/dist/auto-IU7VN55K.js +470 -0
  6. package/dist/beacon-B47XSTL7.js +251 -0
  7. package/dist/chunk-2M6OSOIG.js +1302 -0
  8. package/dist/chunk-4NCFWYGG.js +110 -0
  9. package/dist/chunk-5C4SGQKH.js +705 -0
  10. package/dist/chunk-5GOA7WYD.js +1095 -0
  11. package/dist/chunk-5JGJACDU.js +37 -0
  12. package/dist/chunk-6QC3YGB6.js +114 -0
  13. package/dist/chunk-753RICFF.js +325 -0
  14. package/dist/chunk-AD2LSCHB.js +1595 -0
  15. package/dist/chunk-CHSHON3O.js +669 -0
  16. package/dist/chunk-ELLR7WP6.js +3175 -0
  17. package/dist/chunk-ILOWBJRC.js +12 -0
  18. package/dist/chunk-IRKUEJVW.js +405 -0
  19. package/dist/chunk-MC7XC7XQ.js +533 -0
  20. package/dist/chunk-MO4EEYFW.js +38 -0
  21. package/dist/chunk-MQWH7PFI.js +13366 -0
  22. package/dist/chunk-N6PJAPDE.js +364 -0
  23. package/dist/chunk-PBHIFAL4.js +259 -0
  24. package/dist/chunk-PMXRGPRQ.js +305 -0
  25. package/dist/chunk-PW2EXJQT.js +689 -0
  26. package/dist/chunk-TAP5N3HH.js +245 -0
  27. package/dist/chunk-THFVK5AE.js +148 -0
  28. package/dist/chunk-UM54F7G5.js +1533 -0
  29. package/dist/chunk-UUZ2DMG5.js +185 -0
  30. package/dist/chunk-WS5KM7OL.js +780 -0
  31. package/dist/chunk-YDNKXH4Z.js +2316 -0
  32. package/dist/chunk-YO6DVTL7.js +99 -0
  33. package/dist/claude-SUYNN72C.js +362 -0
  34. package/dist/claude-cli-OF43XAO3.js +276 -0
  35. package/dist/claude-code-PW6SKD2M.js +126 -0
  36. package/dist/claude-code-teams-JLZ5IXB6.js +199 -0
  37. package/dist/constellation-K3CIQCHI.js +225 -0
  38. package/dist/cost-AEK6R7HK.js +174 -0
  39. package/dist/cost-KYXIQ62X.js +93 -0
  40. package/dist/cursor-cli-IHJMPRCW.js +269 -0
  41. package/dist/cursorrules-KI5QWHIX.js +84 -0
  42. package/dist/diff-AJJ5H6HV.js +125 -0
  43. package/dist/dist-7MPIRMTZ-IOQOREMZ.js +10866 -0
  44. package/dist/dist-NHJQVVUW.js +68 -0
  45. package/dist/dist-ZEMSQV74.js +20 -0
  46. package/dist/doctor-6Y6L6HEB.js +11 -0
  47. package/dist/echo-VYZW3OTT.js +248 -0
  48. package/dist/export-R4FJ5NOH.js +38 -0
  49. package/dist/history-EVO3L6SC.js +277 -0
  50. package/dist/hooks-MBWE4ILT.js +12 -0
  51. package/dist/index.d.ts +2 -0
  52. package/dist/index.js +568 -0
  53. package/dist/lint-HXKTWRNO.js +316 -0
  54. package/dist/manual-Y3QOXWYA.js +204 -0
  55. package/dist/mcp.js +14745 -0
  56. package/dist/orchestrate-4ZH5GUQH.js +323 -0
  57. package/dist/probe-OYCP4JYG.js +151 -0
  58. package/dist/promote-Z52ZJTJU.js +181 -0
  59. package/dist/providers-4PGPZEWP.js +104 -0
  60. package/dist/remember-6VZ74B7E.js +77 -0
  61. package/dist/ripple-SBQOSTZD.js +215 -0
  62. package/dist/sentinel-LCFD56OJ.js +43 -0
  63. package/dist/server-F5ITNK6T.js +9846 -0
  64. package/dist/server-T6WIFYRQ.js +16076 -0
  65. package/dist/setup-DF4F3ICN.js +25 -0
  66. package/dist/setup-JHBPZAG7.js +296 -0
  67. package/dist/shift-HKIAP4ZN.js +226 -0
  68. package/dist/snapshot-GTVPRYZG.js +62 -0
  69. package/dist/spawn-BJRQA2NR.js +196 -0
  70. package/dist/summary-H6J6N6PJ.js +140 -0
  71. package/dist/switch-6EANJ7O6.js +232 -0
  72. package/dist/sync-BEOCW7TZ.js +11 -0
  73. package/dist/team-NWP2KJAB.js +32 -0
  74. package/dist/test-MA5TWJQV.js +934 -0
  75. package/dist/thread-JCJVRUQR.js +258 -0
  76. package/dist/triage-ETVXXFMV.js +1880 -0
  77. package/dist/tutorial-L5Q3ZDHK.js +666 -0
  78. package/dist/university-R2WDQLSI.js +40 -0
  79. package/dist/upgrade-5B3YGGC6.js +550 -0
  80. package/dist/validate-F3YHBCRZ.js +39 -0
  81. package/dist/validate-QEEY6KFS.js +64 -0
  82. package/dist/watch-4LT4O6K7.js +123 -0
  83. package/dist/watch-6IIWPWDN.js +111 -0
  84. package/dist/wisdom-LRM4FFCH.js +319 -0
  85. package/package.json +68 -0
  86. package/templates/paradigm/config.yaml +175 -0
  87. package/templates/paradigm/docs/commands.md +727 -0
  88. package/templates/paradigm/docs/decisions/000-template.md +47 -0
  89. package/templates/paradigm/docs/decisions/README.md +26 -0
  90. package/templates/paradigm/docs/error-patterns.md +215 -0
  91. package/templates/paradigm/docs/patterns.md +358 -0
  92. package/templates/paradigm/docs/queries.md +200 -0
  93. package/templates/paradigm/docs/troubleshooting.md +477 -0
  94. package/templates/paradigm/echoes.yaml +25 -0
  95. package/templates/paradigm/prompts/add-feature.md +152 -0
  96. package/templates/paradigm/prompts/add-gate.md +117 -0
  97. package/templates/paradigm/prompts/debug-auth.md +174 -0
  98. package/templates/paradigm/prompts/implement-ftux.md +722 -0
  99. package/templates/paradigm/prompts/implement-sandbox.md +651 -0
  100. package/templates/paradigm/prompts/read-docs.md +84 -0
  101. package/templates/paradigm/prompts/refactor.md +106 -0
  102. package/templates/paradigm/prompts/run-e2e-tests.md +340 -0
  103. package/templates/paradigm/prompts/trace-flow.md +202 -0
  104. package/templates/paradigm/prompts/validate-portals.md +279 -0
  105. package/templates/paradigm/specs/context-tracking.md +200 -0
  106. package/templates/paradigm/specs/context.md +461 -0
  107. package/templates/paradigm/specs/disciplines.md +413 -0
  108. package/templates/paradigm/specs/history.md +339 -0
  109. package/templates/paradigm/specs/logger.md +303 -0
  110. package/templates/paradigm/specs/navigator.md +236 -0
  111. package/templates/paradigm/specs/purpose.md +265 -0
  112. package/templates/paradigm/specs/scan.md +177 -0
  113. package/templates/paradigm/specs/symbols.md +451 -0
  114. package/templates/paradigm/specs/wisdom.md +294 -0
@@ -0,0 +1,245 @@
1
+ #!/usr/bin/env node
2
+
3
+ // src/core/provider-registry.ts
4
+ import * as fs from "fs";
5
+ import * as path from "path";
6
+ import * as yaml from "js-yaml";
7
+ var providers = /* @__PURE__ */ new Map();
8
+ var defaultProviderName = null;
9
+ var initialized = false;
10
+ var PROVIDER_PRIORITY = ["claude", "claude-code-teams", "claude-code", "cursor-cli", "claude-cli", "manual"];
11
+ var VALID_PROVIDERS = ["auto", ...PROVIDER_PRIORITY];
12
+ var configuredProvider = null;
13
+ function registerProvider(provider) {
14
+ providers.set(provider.name, provider);
15
+ }
16
+ function getProvider(name) {
17
+ if (name && providers.has(name)) {
18
+ return providers.get(name) || null;
19
+ }
20
+ if (defaultProviderName && providers.has(defaultProviderName)) {
21
+ return providers.get(defaultProviderName) || null;
22
+ }
23
+ return null;
24
+ }
25
+ function getConfiguredProvider(rootDir) {
26
+ const envProvider = process.env.PARADIGM_AGENT_PROVIDER;
27
+ if (envProvider && VALID_PROVIDERS.includes(envProvider)) {
28
+ return envProvider;
29
+ }
30
+ if (configuredProvider !== null) {
31
+ return configuredProvider;
32
+ }
33
+ const dir = rootDir || process.cwd();
34
+ const configPath = path.join(dir, ".paradigm", "config.yaml");
35
+ if (fs.existsSync(configPath)) {
36
+ try {
37
+ const content = fs.readFileSync(configPath, "utf-8");
38
+ const config = yaml.load(content);
39
+ const provider = config["agent-provider"];
40
+ if (provider && VALID_PROVIDERS.includes(provider)) {
41
+ configuredProvider = provider;
42
+ return provider;
43
+ }
44
+ } catch {
45
+ }
46
+ }
47
+ return "auto";
48
+ }
49
+ async function setConfiguredProvider(provider, rootDir) {
50
+ if (!VALID_PROVIDERS.includes(provider)) {
51
+ throw new Error(`Invalid provider: ${provider}. Valid options: ${VALID_PROVIDERS.join(", ")}`);
52
+ }
53
+ const dir = rootDir || process.cwd();
54
+ const configPath = path.join(dir, ".paradigm", "config.yaml");
55
+ let config = {};
56
+ if (fs.existsSync(configPath)) {
57
+ try {
58
+ const content = fs.readFileSync(configPath, "utf-8");
59
+ config = yaml.load(content);
60
+ } catch {
61
+ }
62
+ }
63
+ config["agent-provider"] = provider;
64
+ configuredProvider = provider;
65
+ const paradigmDir = path.dirname(configPath);
66
+ if (!fs.existsSync(paradigmDir)) {
67
+ fs.mkdirSync(paradigmDir, { recursive: true });
68
+ }
69
+ fs.writeFileSync(configPath, yaml.dump(config));
70
+ }
71
+ async function getBestProvider(rootDir, explicitProvider) {
72
+ await initializeProviders(rootDir);
73
+ const configured = explicitProvider || getConfiguredProvider(rootDir);
74
+ const isExplicit = configured !== "auto";
75
+ if (isExplicit) {
76
+ const provider = providers.get(configured);
77
+ if (provider) {
78
+ try {
79
+ const available = await provider.isAvailable();
80
+ if (available) {
81
+ return {
82
+ provider,
83
+ name: configured,
84
+ reason: `Configured: ${getProviderReason(configured)}`,
85
+ configured: true
86
+ };
87
+ }
88
+ } catch {
89
+ }
90
+ console.warn(`Configured provider '${configured}' not available, falling back...`);
91
+ }
92
+ }
93
+ for (const name of PROVIDER_PRIORITY) {
94
+ const provider = providers.get(name);
95
+ if (!provider) continue;
96
+ try {
97
+ const available = await provider.isAvailable();
98
+ if (available) {
99
+ return {
100
+ provider,
101
+ name,
102
+ reason: isExplicit ? `Fallback: ${getProviderReason(name)} (configured '${configured}' unavailable)` : getProviderReason(name),
103
+ configured: false
104
+ };
105
+ }
106
+ } catch {
107
+ }
108
+ }
109
+ throw new Error("No providers available");
110
+ }
111
+ async function getAvailableProviders(rootDir) {
112
+ await initializeProviders(rootDir);
113
+ const results = [];
114
+ for (const name of PROVIDER_PRIORITY) {
115
+ const provider = providers.get(name);
116
+ if (!provider) continue;
117
+ let available = false;
118
+ try {
119
+ available = await provider.isAvailable();
120
+ } catch {
121
+ }
122
+ results.push({
123
+ name,
124
+ available,
125
+ reason: available ? getProviderReason(name) : getProviderUnavailableReason(name),
126
+ features: {
127
+ parallel: provider.supportsParallel(),
128
+ mcp: provider.supportsMcp(),
129
+ billing: getProviderBilling(name)
130
+ }
131
+ });
132
+ }
133
+ return results;
134
+ }
135
+ async function initializeProviders(rootDir) {
136
+ if (initialized) return;
137
+ const dir = rootDir || process.cwd();
138
+ try {
139
+ const { ClaudeAgentProvider } = await import("./claude-SUYNN72C.js");
140
+ registerProvider(new ClaudeAgentProvider());
141
+ } catch {
142
+ }
143
+ try {
144
+ const { ClaudeCodeTeamsProvider } = await import("./claude-code-teams-JLZ5IXB6.js");
145
+ registerProvider(new ClaudeCodeTeamsProvider(dir));
146
+ } catch {
147
+ }
148
+ try {
149
+ const { ClaudeCodeTaskProvider } = await import("./claude-code-PW6SKD2M.js");
150
+ registerProvider(new ClaudeCodeTaskProvider(dir));
151
+ } catch {
152
+ }
153
+ try {
154
+ const { CursorCliProvider } = await import("./cursor-cli-IHJMPRCW.js");
155
+ registerProvider(new CursorCliProvider());
156
+ } catch {
157
+ }
158
+ try {
159
+ const { ClaudeCliProvider } = await import("./claude-cli-OF43XAO3.js");
160
+ registerProvider(new ClaudeCliProvider());
161
+ } catch {
162
+ }
163
+ try {
164
+ const { ManualProvider } = await import("./manual-Y3QOXWYA.js");
165
+ registerProvider(new ManualProvider(dir));
166
+ } catch {
167
+ }
168
+ for (const name of PROVIDER_PRIORITY) {
169
+ const provider = providers.get(name);
170
+ if (provider) {
171
+ try {
172
+ const available = await provider.isAvailable();
173
+ if (available) {
174
+ defaultProviderName = name;
175
+ break;
176
+ }
177
+ } catch {
178
+ }
179
+ }
180
+ }
181
+ if (!defaultProviderName && providers.has("manual")) {
182
+ defaultProviderName = "manual";
183
+ }
184
+ initialized = true;
185
+ }
186
+ function getProviderReason(name) {
187
+ switch (name) {
188
+ case "claude":
189
+ return "Using Anthropic API (ANTHROPIC_API_KEY found)";
190
+ case "claude-code-teams":
191
+ return "Using Claude Code Agent Teams (experimental, parallel teammates)";
192
+ case "claude-code":
193
+ return "Using Claude Code Task tool (running in Claude Code)";
194
+ case "cursor-cli":
195
+ return "Using Cursor agent CLI (running in Cursor)";
196
+ case "claude-cli":
197
+ return "Using Claude CLI (claude command found)";
198
+ case "manual":
199
+ return "Using manual handoff (no automation available)";
200
+ default:
201
+ return "Unknown provider";
202
+ }
203
+ }
204
+ function getProviderUnavailableReason(name) {
205
+ switch (name) {
206
+ case "claude":
207
+ return "ANTHROPIC_API_KEY not set";
208
+ case "claude-code-teams":
209
+ return "CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS not set or not in Claude Code";
210
+ case "claude-code":
211
+ return "Not running inside Claude Code";
212
+ case "cursor-cli":
213
+ return "Not running in Cursor or agent CLI not found";
214
+ case "claude-cli":
215
+ return "claude CLI not found in PATH";
216
+ case "manual":
217
+ return "Should always be available";
218
+ default:
219
+ return "Unknown";
220
+ }
221
+ }
222
+ function getProviderBilling(name) {
223
+ switch (name) {
224
+ case "claude":
225
+ return "api";
226
+ case "claude-code-teams":
227
+ case "claude-code":
228
+ case "cursor-cli":
229
+ case "claude-cli":
230
+ return "subscription";
231
+ case "manual":
232
+ return "none";
233
+ default:
234
+ return "none";
235
+ }
236
+ }
237
+
238
+ export {
239
+ getProvider,
240
+ getConfiguredProvider,
241
+ setConfiguredProvider,
242
+ getBestProvider,
243
+ getAvailableProviders,
244
+ initializeProviders
245
+ };
@@ -0,0 +1,148 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ detectIDE,
4
+ getAdapter,
5
+ getAdapterNames,
6
+ loadParadigmFiles,
7
+ syncToAllIDEs,
8
+ syncToIDE,
9
+ writeMcpConfig,
10
+ writeNestedContexts
11
+ } from "./chunk-YDNKXH4Z.js";
12
+ import {
13
+ log
14
+ } from "./chunk-4NCFWYGG.js";
15
+
16
+ // src/commands/sync.ts
17
+ import * as path from "path";
18
+ import chalk from "chalk";
19
+ import ora from "ora";
20
+ async function syncCommand(ide, options) {
21
+ const rootDir = process.cwd();
22
+ const spinner = ora();
23
+ const targetIde = options.target || ide;
24
+ const quiet = options.quiet;
25
+ if (!quiet) {
26
+ console.log(chalk.blue("\n\u{1F504} Paradigm Sync\n"));
27
+ }
28
+ if (!quiet) spinner.start("Loading .paradigm/ configuration...");
29
+ const files = loadParadigmFiles(rootDir);
30
+ if (!files) {
31
+ if (!quiet) {
32
+ spinner.fail("No .paradigm/ directory found");
33
+ console.log(chalk.gray("\nRun `paradigm init` to initialize Paradigm in this project.\n"));
34
+ }
35
+ log.command("sync").error("Missing .paradigm/ directory");
36
+ if (!quiet) process.exit(1);
37
+ throw new Error("No .paradigm/ directory found");
38
+ }
39
+ if (!quiet) spinner.succeed(`Loaded configuration for ${chalk.cyan(files.projectName)}`);
40
+ log.command("sync").debug("Configuration loaded", { projectName: files.projectName });
41
+ if (options.all) {
42
+ console.log(chalk.gray("\nSyncing to all IDEs...\n"));
43
+ const tracker2 = log.operation("sync-all").start("Syncing to all IDEs");
44
+ const results = syncToAllIDEs(rootDir, files, options.force);
45
+ for (const result2 of results) {
46
+ if (result2.success) {
47
+ console.log(chalk.green(` \u2713 ${result2.ide}`), chalk.gray(`\u2192 ${result2.outputPath}`));
48
+ log.operation(`sync-${result2.ide}`).success("IDE files generated", { path: result2.outputPath });
49
+ } else {
50
+ console.log(chalk.red(` \u2717 ${result2.ide}`), chalk.gray(`\u2192 ${result2.message}`));
51
+ log.operation(`sync-${result2.ide}`).error("Sync failed", { message: result2.message });
52
+ }
53
+ }
54
+ const successCount = results.filter((r) => r.success).length;
55
+ console.log(chalk.gray(`
56
+ ${successCount}/${results.length} IDE files generated.`));
57
+ if (successCount === results.length) {
58
+ tracker2.success("All IDE files generated", { count: results.length });
59
+ } else {
60
+ tracker2.error("Some IDE syncs failed", { success: successCount, total: results.length });
61
+ }
62
+ if (options.mcp !== false) {
63
+ console.log("");
64
+ const ideNames = getAdapterNames();
65
+ for (const name of ideNames) {
66
+ const adapter2 = getAdapter(name);
67
+ if (adapter2?.generateMcpConfig) {
68
+ const mcpResult = writeMcpConfig(rootDir, name);
69
+ if (mcpResult.success) {
70
+ console.log(chalk.green(` \u2713 MCP config for ${name}`), chalk.gray(`\u2192 ${path.relative(rootDir, mcpResult.path)}`));
71
+ log.component("mcp-config").success("MCP config generated", { ide: name, path: mcpResult.path });
72
+ }
73
+ }
74
+ }
75
+ }
76
+ console.log("");
77
+ return;
78
+ }
79
+ let finalTargetIde = targetIde;
80
+ if (!finalTargetIde) {
81
+ if (!quiet) spinner.start("Auto-detecting IDE...");
82
+ const detection = detectIDE(rootDir);
83
+ if (detection.detected) {
84
+ finalTargetIde = detection.detected;
85
+ if (!quiet) spinner.succeed(`Detected ${chalk.cyan(finalTargetIde)} (${detection.reason})`);
86
+ } else {
87
+ if (!quiet) spinner.warn("Could not auto-detect IDE, defaulting to Cursor");
88
+ finalTargetIde = "cursor";
89
+ }
90
+ }
91
+ const adapter = getAdapter(finalTargetIde);
92
+ if (!adapter) {
93
+ if (!quiet) {
94
+ console.log(chalk.red(`
95
+ \u274C Unknown IDE: ${finalTargetIde}`));
96
+ console.log(chalk.gray(`
97
+ Available IDEs: ${getAdapterNames().join(", ")}
98
+ `));
99
+ }
100
+ log.command("sync").error("Unknown IDE", { ide: finalTargetIde, available: getAdapterNames() });
101
+ if (!quiet) process.exit(1);
102
+ throw new Error(`Unknown IDE: ${finalTargetIde}`);
103
+ }
104
+ const isMultiFile = adapter.multiFile;
105
+ if (!quiet) spinner.start(`Generating ${isMultiFile ? adapter.outputPath + "/" : adapter.outputPath}...`);
106
+ const tracker = log.operation(`sync-${finalTargetIde}`).start("Syncing IDE files", { ide: finalTargetIde });
107
+ const result = syncToIDE(rootDir, finalTargetIde, files, options.force);
108
+ if (result.success) {
109
+ if (!quiet) {
110
+ spinner.succeed(chalk.green(result.message));
111
+ console.log(chalk.gray(`
112
+ Path: ${result.outputPath}`));
113
+ if (isMultiFile && adapter.generateFiles) {
114
+ const generatedFiles = adapter.generateFiles(files);
115
+ for (const file of generatedFiles) {
116
+ console.log(chalk.gray(` \u2514\u2500 ${file.path}`));
117
+ }
118
+ }
119
+ }
120
+ tracker.success("IDE files generated", { ide: finalTargetIde, path: result.outputPath });
121
+ if (options.mcp !== false && adapter.generateMcpConfig) {
122
+ const mcpResult = writeMcpConfig(rootDir, finalTargetIde);
123
+ if (mcpResult.success) {
124
+ if (!quiet) console.log(chalk.green(`
125
+ \u2713 ${mcpResult.message}`));
126
+ log.component("mcp-config").success("MCP config generated", { ide: finalTargetIde, path: mcpResult.path });
127
+ }
128
+ }
129
+ if (options.nested && adapter.generateNestedContexts) {
130
+ const nestedResult = writeNestedContexts(rootDir, finalTargetIde, files);
131
+ if (nestedResult.success && nestedResult.count > 0) {
132
+ if (!quiet) console.log(chalk.green(`
133
+ \u2713 ${nestedResult.message}`));
134
+ log.component("nested-contexts").success("Nested contexts generated", { ide: finalTargetIde, count: nestedResult.count });
135
+ }
136
+ }
137
+ if (!quiet) console.log("");
138
+ } else {
139
+ if (!quiet) spinner.fail(chalk.red(result.message));
140
+ tracker.error("Sync failed", { ide: finalTargetIde, message: result.message });
141
+ if (!quiet) process.exit(1);
142
+ throw new Error(result.message || "Sync failed");
143
+ }
144
+ }
145
+
146
+ export {
147
+ syncCommand
148
+ };