@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,269 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ MODEL_PRICING
4
+ } from "./chunk-5JGJACDU.js";
5
+ import "./chunk-MO4EEYFW.js";
6
+
7
+ // src/core/providers/cursor-cli.ts
8
+ import * as fs from "fs";
9
+ import * as path from "path";
10
+ import { spawn, execSync } from "child_process";
11
+ import { EventEmitter } from "events";
12
+ var CursorCliProvider = class {
13
+ name = "cursor-cli";
14
+ agentPath = null;
15
+ constructor() {
16
+ }
17
+ listModels() {
18
+ return ["opus", "sonnet", "haiku"];
19
+ }
20
+ supportsParallel() {
21
+ return true;
22
+ }
23
+ supportsMcp() {
24
+ return true;
25
+ }
26
+ getTokenCost(model) {
27
+ return MODEL_PRICING[model];
28
+ }
29
+ /**
30
+ * Check if Cursor CLI is available
31
+ */
32
+ async isAvailable() {
33
+ if (!this.isCursorEnvironment()) {
34
+ return false;
35
+ }
36
+ try {
37
+ const result = execSync("which agent", { encoding: "utf-8" }).trim();
38
+ if (result) {
39
+ this.agentPath = result;
40
+ return true;
41
+ }
42
+ } catch {
43
+ const paths = [
44
+ "/usr/local/bin/agent",
45
+ path.join(process.env.HOME || "", ".local/bin/agent"),
46
+ path.join(process.env.HOME || "", ".cursor/bin/agent"),
47
+ // macOS application paths
48
+ "/Applications/Cursor.app/Contents/Resources/app/bin/agent"
49
+ ];
50
+ for (const p of paths) {
51
+ if (fs.existsSync(p)) {
52
+ this.agentPath = p;
53
+ return true;
54
+ }
55
+ }
56
+ }
57
+ return false;
58
+ }
59
+ /**
60
+ * Detect if running in Cursor environment
61
+ */
62
+ isCursorEnvironment() {
63
+ return process.env.TERM_PROGRAM === "cursor" || !!process.env.CURSOR_SESSION || !!process.env.CURSOR_TRACE_ID || (process.env.VSCODE_CWD?.toLowerCase().includes("cursor") ?? false) || (process.env.VSCODE_NLS_CONFIG?.toLowerCase().includes("cursor") ?? false) || process.env.TERM_PROGRAM === "vscode" && (process.env.VSCODE_GIT_ASKPASS_NODE?.toLowerCase().includes("cursor") ?? false);
64
+ }
65
+ /**
66
+ * Spawn an agent by invoking Cursor CLI
67
+ */
68
+ async *spawn(agent, options) {
69
+ if (!this.agentPath) {
70
+ yield {
71
+ type: "error",
72
+ content: "Cursor agent CLI not found",
73
+ timestamp: (/* @__PURE__ */ new Date()).toISOString()
74
+ };
75
+ return;
76
+ }
77
+ const prompt = this.buildPrompt(agent, options);
78
+ yield {
79
+ type: "text",
80
+ content: `Starting ${agent.name} agent via Cursor CLI...
81
+ `,
82
+ timestamp: (/* @__PURE__ */ new Date()).toISOString()
83
+ };
84
+ const args = [
85
+ "-p",
86
+ prompt.slice(0, 8e3)
87
+ // Non-interactive mode with prompt
88
+ ];
89
+ if (options.model) {
90
+ const cursorModel = this.mapToCursorModel(options.model);
91
+ if (cursorModel) {
92
+ args.push("--model", cursorModel);
93
+ }
94
+ }
95
+ const messageEmitter = new EventEmitter();
96
+ let outputBuffer = "";
97
+ let totalUsage = { input: 0, output: 0, total: 0 };
98
+ let lastError = null;
99
+ let completed = false;
100
+ const proc = spawn(this.agentPath, args, {
101
+ cwd: options.workingDirectory || process.cwd(),
102
+ env: { ...process.env },
103
+ stdio: ["pipe", "pipe", "pipe"]
104
+ });
105
+ proc.stdout?.on("data", (data) => {
106
+ const text = data.toString();
107
+ outputBuffer += text;
108
+ messageEmitter.emit("text", text);
109
+ });
110
+ proc.stderr?.on("data", (data) => {
111
+ const text = data.toString();
112
+ if (text.toLowerCase().includes("error")) {
113
+ lastError = text;
114
+ messageEmitter.emit("error", new Error(text));
115
+ } else {
116
+ messageEmitter.emit("progress", text);
117
+ }
118
+ });
119
+ proc.on("close", (code) => {
120
+ completed = true;
121
+ const outputTokens = Math.ceil(outputBuffer.length / 4);
122
+ const inputTokens = Math.ceil(prompt.length / 4);
123
+ totalUsage = {
124
+ input: inputTokens,
125
+ output: outputTokens,
126
+ total: inputTokens + outputTokens
127
+ };
128
+ messageEmitter.emit("done", code);
129
+ });
130
+ proc.on("error", (err) => {
131
+ lastError = err.message;
132
+ messageEmitter.emit("error", err);
133
+ });
134
+ const timeoutMs = options.timeout || 5 * 60 * 1e3;
135
+ const timeoutHandle = setTimeout(() => {
136
+ proc.kill();
137
+ lastError = `Cursor agent timed out after ${timeoutMs / 1e3}s`;
138
+ messageEmitter.emit("timeout");
139
+ }, timeoutMs);
140
+ const messageQueue = [];
141
+ let resolveNext = null;
142
+ const pushMessage = (msg) => {
143
+ if (resolveNext) {
144
+ resolveNext(msg);
145
+ resolveNext = null;
146
+ } else {
147
+ messageQueue.push(msg);
148
+ }
149
+ };
150
+ messageEmitter.on("text", (text) => {
151
+ pushMessage({
152
+ type: "text",
153
+ content: text,
154
+ timestamp: (/* @__PURE__ */ new Date()).toISOString()
155
+ });
156
+ });
157
+ messageEmitter.on("progress", (_text) => {
158
+ pushMessage({
159
+ type: "text",
160
+ content: ".",
161
+ timestamp: (/* @__PURE__ */ new Date()).toISOString()
162
+ });
163
+ });
164
+ messageEmitter.on("done", () => {
165
+ clearTimeout(timeoutHandle);
166
+ pushMessage({
167
+ type: "done",
168
+ content: "Agent completed",
169
+ usage: totalUsage,
170
+ timestamp: (/* @__PURE__ */ new Date()).toISOString()
171
+ });
172
+ });
173
+ messageEmitter.on("timeout", () => {
174
+ pushMessage({
175
+ type: "error",
176
+ content: lastError || "Timeout",
177
+ timestamp: (/* @__PURE__ */ new Date()).toISOString()
178
+ });
179
+ });
180
+ messageEmitter.on("error", (err) => {
181
+ clearTimeout(timeoutHandle);
182
+ pushMessage({
183
+ type: "error",
184
+ content: err.message,
185
+ timestamp: (/* @__PURE__ */ new Date()).toISOString()
186
+ });
187
+ });
188
+ while (!completed || messageQueue.length > 0) {
189
+ if (messageQueue.length > 0) {
190
+ const msg = messageQueue.shift();
191
+ yield msg;
192
+ if (msg.type === "done" || msg.type === "error") {
193
+ break;
194
+ }
195
+ } else {
196
+ const msg = await new Promise((resolve) => {
197
+ resolveNext = resolve;
198
+ setTimeout(() => resolve(null), 100);
199
+ });
200
+ if (msg) {
201
+ yield msg;
202
+ if (msg.type === "done" || msg.type === "error") {
203
+ break;
204
+ }
205
+ }
206
+ }
207
+ }
208
+ if (lastError && !completed) {
209
+ yield {
210
+ type: "error",
211
+ content: lastError,
212
+ timestamp: (/* @__PURE__ */ new Date()).toISOString()
213
+ };
214
+ }
215
+ }
216
+ // ==========================================================================
217
+ // Private Methods
218
+ // ==========================================================================
219
+ /**
220
+ * Build prompt for the agent
221
+ */
222
+ buildPrompt(agent, options) {
223
+ const parts = [];
224
+ parts.push(`# ${agent.name.toUpperCase()} Agent`);
225
+ parts.push("");
226
+ parts.push("## Role");
227
+ parts.push(agent.role);
228
+ parts.push("");
229
+ parts.push("## Task");
230
+ parts.push(options.task);
231
+ parts.push("");
232
+ if (options.context.systemPrompt) {
233
+ parts.push("## Context");
234
+ parts.push(options.context.systemPrompt.slice(0, 3e3));
235
+ parts.push("");
236
+ }
237
+ if (options.context.symbols.length > 0) {
238
+ parts.push("## Symbols");
239
+ parts.push(options.context.symbols.join(", "));
240
+ parts.push("");
241
+ }
242
+ if (options.context.handoffContext) {
243
+ parts.push("## From Previous Agent");
244
+ parts.push(options.context.handoffContext);
245
+ parts.push("");
246
+ }
247
+ parts.push("## Instructions");
248
+ parts.push("Complete the task above. Be concise and focused. Keep response under 500 words.");
249
+ return parts.join("\n");
250
+ }
251
+ /**
252
+ * Map Paradigm model tiers to Cursor model names
253
+ */
254
+ mapToCursorModel(model) {
255
+ switch (model) {
256
+ case "opus":
257
+ return "claude-opus-4-6";
258
+ case "sonnet":
259
+ return "claude-sonnet-4-5-20250929";
260
+ case "haiku":
261
+ return "claude-haiku-4-5-20251001";
262
+ default:
263
+ return null;
264
+ }
265
+ }
266
+ };
267
+ export {
268
+ CursorCliProvider
269
+ };
@@ -0,0 +1,84 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ cursorrrulesExists,
4
+ generateCursorrules,
5
+ paradigmConfigExists,
6
+ writeCursorrules
7
+ } from "./chunk-UUZ2DMG5.js";
8
+ import "./chunk-N6PJAPDE.js";
9
+ import {
10
+ getDefaultParadigmConfig,
11
+ parseParadigmConfig,
12
+ serializeParadigmConfig
13
+ } from "./chunk-YO6DVTL7.js";
14
+ import "./chunk-MO4EEYFW.js";
15
+
16
+ // src/commands/cursorrules.ts
17
+ import * as fs from "fs";
18
+ import * as path from "path";
19
+ import chalk from "chalk";
20
+ import ora from "ora";
21
+ async function cursorrrulesCommand(targetPath, options) {
22
+ const rootDir = targetPath ? path.resolve(targetPath) : process.cwd();
23
+ const projectName = path.basename(rootDir);
24
+ const configPath = path.join(rootDir, ".paradigm");
25
+ const spinner = ora();
26
+ if (!paradigmConfigExists(rootDir)) {
27
+ if (options.init) {
28
+ spinner.start("Creating .paradigm config...");
29
+ const defaultConfig = getDefaultParadigmConfig(projectName);
30
+ fs.writeFileSync(configPath, serializeParadigmConfig(defaultConfig), "utf8");
31
+ spinner.succeed(chalk.green(".paradigm config created"));
32
+ } else {
33
+ console.log(chalk.red("\n\u274C No .paradigm file found."));
34
+ console.log(chalk.gray("\nRun with --init to create a default .paradigm config:"));
35
+ console.log(chalk.cyan(" paradigm cursorrules --init\n"));
36
+ process.exit(1);
37
+ }
38
+ }
39
+ let config;
40
+ try {
41
+ const content = fs.readFileSync(configPath, "utf8");
42
+ config = parseParadigmConfig(content);
43
+ } catch (err) {
44
+ const error = err;
45
+ console.log(chalk.red(`
46
+ \u274C Failed to parse .paradigm: ${error.message}
47
+ `));
48
+ process.exit(1);
49
+ }
50
+ const scanIndexExists = fs.existsSync(path.join(rootDir, ".paradigm", "scan-index.json")) || fs.existsSync(path.join(rootDir, ".paradigm-scan-index.json"));
51
+ const includeScan = options.withScan || scanIndexExists;
52
+ if (options.preview) {
53
+ const content = generateCursorrules(config, projectName, { withScan: includeScan });
54
+ console.log(chalk.blue("\n--- Preview of .cursorrules content ---\n"));
55
+ console.log(content);
56
+ console.log(chalk.blue("\n--- End preview ---\n"));
57
+ return;
58
+ }
59
+ let mode = "create";
60
+ if (options.append) {
61
+ mode = "append";
62
+ } else if (!options.force && cursorrrulesExists(rootDir)) {
63
+ console.log(chalk.yellow("\n\u26A0\uFE0F .cursorrules already exists."));
64
+ console.log(chalk.gray("Use --force to overwrite, or --append to add Paradigm section.\n"));
65
+ process.exit(1);
66
+ }
67
+ spinner.start("Generating .cursorrules...");
68
+ const result = writeCursorrules(rootDir, config, mode, projectName, { withScan: includeScan });
69
+ if (result.success) {
70
+ spinner.succeed(chalk.green(result.message));
71
+ console.log(chalk.gray(`
72
+ Path: ${result.path}`));
73
+ if (includeScan) {
74
+ console.log(chalk.gray(" Includes: Scan protocol"));
75
+ }
76
+ console.log();
77
+ } else {
78
+ spinner.fail(chalk.red("Failed to generate .cursorrules"));
79
+ process.exit(1);
80
+ }
81
+ }
82
+ export {
83
+ cursorrrulesCommand
84
+ };
@@ -0,0 +1,125 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ BackgroundOrchestrator
4
+ } from "./chunk-AD2LSCHB.js";
5
+ import "./chunk-6QC3YGB6.js";
6
+ import "./chunk-WS5KM7OL.js";
7
+ import "./chunk-PBHIFAL4.js";
8
+ import "./chunk-TAP5N3HH.js";
9
+ import "./chunk-PMXRGPRQ.js";
10
+ import "./chunk-5C4SGQKH.js";
11
+ import "./chunk-PW2EXJQT.js";
12
+ import "./chunk-IRKUEJVW.js";
13
+ import "./chunk-5JGJACDU.js";
14
+ import "./chunk-MO4EEYFW.js";
15
+
16
+ // src/commands/team/diff.ts
17
+ import * as fs from "fs";
18
+ import * as path from "path";
19
+ import chalk from "chalk";
20
+ async function teamDiffCommand(orchestrationId, targetPath, options) {
21
+ const rootDir = targetPath ? path.resolve(targetPath) : process.cwd();
22
+ if (!orchestrationId) {
23
+ if (options.json) {
24
+ console.log(JSON.stringify({ error: "Orchestration ID required" }));
25
+ } else {
26
+ console.log(chalk.red("\nOrchestration ID required."));
27
+ console.log(chalk.gray("Usage: paradigm team diff <orchestration-id>\n"));
28
+ }
29
+ return;
30
+ }
31
+ const bgOrchestrator = new BackgroundOrchestrator(rootDir);
32
+ const orch = bgOrchestrator.getOrchestration(orchestrationId);
33
+ if (!orch) {
34
+ if (options.json) {
35
+ console.log(JSON.stringify({ error: "Orchestration not found", id: orchestrationId }));
36
+ } else {
37
+ console.log(chalk.red(`
38
+ Orchestration not found: ${orchestrationId}
39
+ `));
40
+ }
41
+ return;
42
+ }
43
+ if (options.json) {
44
+ console.log(JSON.stringify({
45
+ id: orch.id,
46
+ task: orch.task,
47
+ status: orch.status,
48
+ artifacts: orch.artifacts
49
+ }, null, 2));
50
+ return;
51
+ }
52
+ console.log();
53
+ console.log(chalk.blue("\u2501".repeat(60)));
54
+ console.log(chalk.blue(` Diff: ${orch.id}`));
55
+ console.log(chalk.blue("\u2501".repeat(60)));
56
+ console.log();
57
+ console.log(chalk.gray(` Task: ${orch.task.slice(0, 50)}${orch.task.length > 50 ? "..." : ""}`));
58
+ console.log(chalk.gray(` Status: ${orch.status}`));
59
+ console.log();
60
+ if (orch.artifacts.length === 0) {
61
+ console.log(chalk.gray(" No file changes in this orchestration."));
62
+ console.log();
63
+ return;
64
+ }
65
+ console.log(chalk.cyan(" Files Changed:"));
66
+ console.log();
67
+ const created = [];
68
+ const modified = [];
69
+ const deleted = [];
70
+ for (const artifact of orch.artifacts) {
71
+ if (artifact.action === "created") {
72
+ created.push(artifact.path);
73
+ } else if (artifact.action === "modified") {
74
+ modified.push(artifact.path);
75
+ } else if (artifact.action === "deleted") {
76
+ deleted.push(artifact.path);
77
+ }
78
+ }
79
+ if (created.length > 0) {
80
+ console.log(chalk.green(" Created:"));
81
+ for (const filePath of created) {
82
+ console.log(chalk.green(` + ${filePath}`));
83
+ if (options.full) {
84
+ const fullPath = path.join(rootDir, filePath);
85
+ if (fs.existsSync(fullPath)) {
86
+ const content = fs.readFileSync(fullPath, "utf-8");
87
+ const lines = content.split("\n").slice(0, 20);
88
+ for (const line of lines) {
89
+ console.log(chalk.gray(` \u2502 ${line}`));
90
+ }
91
+ if (content.split("\n").length > 20) {
92
+ console.log(chalk.gray(` \u2502 ... (${content.split("\n").length - 20} more lines)`));
93
+ }
94
+ }
95
+ }
96
+ }
97
+ console.log();
98
+ }
99
+ if (modified.length > 0) {
100
+ console.log(chalk.yellow(" Modified:"));
101
+ for (const filePath of modified) {
102
+ console.log(chalk.yellow(` ~ ${filePath}`));
103
+ }
104
+ console.log();
105
+ }
106
+ if (deleted.length > 0) {
107
+ console.log(chalk.red(" Deleted:"));
108
+ for (const filePath of deleted) {
109
+ console.log(chalk.red(` - ${filePath}`));
110
+ }
111
+ console.log();
112
+ }
113
+ console.log(chalk.gray("\u2500".repeat(60)));
114
+ console.log(chalk.gray(` Summary: ${created.length} created, ${modified.length} modified, ${deleted.length} deleted`));
115
+ console.log();
116
+ if (orch.status === "completed") {
117
+ console.log(chalk.cyan(" Actions:"));
118
+ console.log(chalk.gray(` paradigm team accept ${orch.id} # Accept these changes`));
119
+ console.log(chalk.gray(` paradigm team reject ${orch.id} # Reject and cleanup`));
120
+ console.log();
121
+ }
122
+ }
123
+ export {
124
+ teamDiffCommand
125
+ };