didev 1.1.3 → 1.2.1

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 (46) hide show
  1. package/dist/agents/base-agent.d.ts.map +1 -1
  2. package/dist/agents/base-agent.js +14 -2
  3. package/dist/agents/base-agent.js.map +1 -1
  4. package/dist/agents/orchestrator.d.ts.map +1 -1
  5. package/dist/agents/orchestrator.js +6 -0
  6. package/dist/agents/orchestrator.js.map +1 -1
  7. package/dist/cli/commands/chat.d.ts.map +1 -1
  8. package/dist/cli/commands/chat.js +73 -6
  9. package/dist/cli/commands/chat.js.map +1 -1
  10. package/dist/cli/commands/context.d.ts.map +1 -1
  11. package/dist/cli/commands/context.js +73 -3
  12. package/dist/cli/commands/context.js.map +1 -1
  13. package/dist/cli/commands/init.d.ts.map +1 -1
  14. package/dist/cli/commands/init.js +47 -1
  15. package/dist/cli/commands/init.js.map +1 -1
  16. package/dist/cli/commands/menu.d.ts +9 -0
  17. package/dist/cli/commands/menu.d.ts.map +1 -0
  18. package/dist/cli/commands/menu.js +342 -0
  19. package/dist/cli/commands/menu.js.map +1 -0
  20. package/dist/core/api.d.ts +4 -0
  21. package/dist/core/api.d.ts.map +1 -1
  22. package/dist/core/api.js +9 -2
  23. package/dist/core/api.js.map +1 -1
  24. package/dist/core/bundled-mcp.d.ts +24 -0
  25. package/dist/core/bundled-mcp.d.ts.map +1 -0
  26. package/dist/core/bundled-mcp.js +112 -0
  27. package/dist/core/bundled-mcp.js.map +1 -0
  28. package/dist/core/mcp.d.ts +10 -0
  29. package/dist/core/mcp.d.ts.map +1 -1
  30. package/dist/core/mcp.js +27 -1
  31. package/dist/core/mcp.js.map +1 -1
  32. package/dist/core/post-apply.d.ts +15 -0
  33. package/dist/core/post-apply.d.ts.map +1 -0
  34. package/dist/core/post-apply.js +256 -0
  35. package/dist/core/post-apply.js.map +1 -0
  36. package/dist/index.js +46 -5
  37. package/dist/index.js.map +1 -1
  38. package/dist/utils/build-runner.d.ts +29 -0
  39. package/dist/utils/build-runner.d.ts.map +1 -0
  40. package/dist/utils/build-runner.js +172 -0
  41. package/dist/utils/build-runner.js.map +1 -0
  42. package/dist/utils/resilience.d.ts +2 -0
  43. package/dist/utils/resilience.d.ts.map +1 -1
  44. package/dist/utils/resilience.js +4 -3
  45. package/dist/utils/resilience.js.map +1 -1
  46. package/package.json +1 -1
@@ -0,0 +1,112 @@
1
+ import { join } from 'path';
2
+ import { homedir } from 'os';
3
+ import { access } from 'fs/promises';
4
+ const MCP_DIR = join(homedir(), '.didev', 'mcp');
5
+ export const BUNDLED_SERVERS = [
6
+ {
7
+ name: 'java-vuln',
8
+ displayName: 'Java Vuln Remediation',
9
+ description: 'Find vulnerable Java deps via OSV.dev + Maven Central',
10
+ command: 'node',
11
+ args: [join(MCP_DIR, 'java-vuln-remediation', 'dist', 'index.js')],
12
+ requiresAuth: false,
13
+ requiredEnv: [],
14
+ gitRepo: 'https://github.com/Neovaryag/java-vuln-remediation.git',
15
+ defaultEnabled: true,
16
+ },
17
+ {
18
+ name: 'context7',
19
+ displayName: 'Context7',
20
+ description: 'Real-time library documentation from context7.com',
21
+ command: 'npx',
22
+ args: ['-y', '@upstash/context7-mcp'],
23
+ requiresAuth: false,
24
+ requiredEnv: [],
25
+ defaultEnabled: true,
26
+ },
27
+ {
28
+ name: 'pgs-tool',
29
+ displayName: 'PostgreSQL Tool',
30
+ description: 'PostgreSQL MCP tools for database interaction',
31
+ command: 'node',
32
+ args: [join(MCP_DIR, 'mcp-pgs-tool', 'dist', 'index.js')],
33
+ env: { DATABASE_URL: '${DATABASE_URL}' },
34
+ requiresAuth: true,
35
+ requiredEnv: [
36
+ { name: 'DATABASE_URL', hint: 'postgresql://user:pass@host/dbname', sensitive: false },
37
+ ],
38
+ gitRepo: 'https://github.com/Neovaryag/mcp-pgs-tool.git',
39
+ defaultEnabled: false,
40
+ },
41
+ {
42
+ name: 'atlassian',
43
+ displayName: 'Atlassian MCP',
44
+ description: 'Jira & Confluence integration',
45
+ command: 'node',
46
+ args: [join(MCP_DIR, 'atlassian-mcp', 'dist', 'index.js')],
47
+ env: {
48
+ ATLASSIAN_API_TOKEN: '${ATLASSIAN_API_TOKEN}',
49
+ ATLASSIAN_BASE_URL: '${ATLASSIAN_BASE_URL}',
50
+ ATLASSIAN_EMAIL: '${ATLASSIAN_EMAIL}',
51
+ },
52
+ requiresAuth: true,
53
+ requiredEnv: [
54
+ { name: 'ATLASSIAN_EMAIL', hint: 'your@email.com', sensitive: false },
55
+ { name: 'ATLASSIAN_API_TOKEN', hint: 'your Atlassian API token', sensitive: true },
56
+ { name: 'ATLASSIAN_BASE_URL', hint: 'https://yourcompany.atlassian.net', sensitive: false },
57
+ ],
58
+ gitRepo: 'https://github.com/varunkumar/atlassian-mcp.git',
59
+ defaultEnabled: false,
60
+ },
61
+ ];
62
+ // ── Helpers ───────────────────────────────────────────────────────────────────
63
+ export function toBundledMcpConfig(def) {
64
+ return {
65
+ name: def.name,
66
+ command: def.command,
67
+ args: def.args,
68
+ ...(def.env ? { env: def.env } : {}),
69
+ enabled: resolveEnabled(def),
70
+ };
71
+ }
72
+ function resolveEnabled(def) {
73
+ if (!def.defaultEnabled)
74
+ return false;
75
+ // If it requires env vars that aren't set, disable it
76
+ const missing = getMissingRequiredEnv(def);
77
+ if (missing.length > 0)
78
+ return false;
79
+ return true;
80
+ }
81
+ export function getMissingRequiredEnv(def) {
82
+ return def.requiredEnv
83
+ .filter(e => !process.env[e.name])
84
+ .map(e => e.name);
85
+ }
86
+ // Returns true if the server entry point file exists (for node-based cloned servers)
87
+ export async function isBundledServerReady(def) {
88
+ if (def.command === 'npx')
89
+ return true;
90
+ const entryPoint = def.args[0];
91
+ if (!entryPoint)
92
+ return false;
93
+ try {
94
+ await access(entryPoint);
95
+ return true;
96
+ }
97
+ catch {
98
+ return false;
99
+ }
100
+ }
101
+ // Merges bundled servers into an existing list — skips ones already present by name
102
+ export function mergeBundledServers(existing) {
103
+ const names = new Set(existing.map(s => s.name));
104
+ const result = [...existing];
105
+ for (const def of BUNDLED_SERVERS) {
106
+ if (!names.has(def.name)) {
107
+ result.push(toBundledMcpConfig(def));
108
+ }
109
+ }
110
+ return result;
111
+ }
112
+ //# sourceMappingURL=bundled-mcp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bundled-mcp.js","sourceRoot":"","sources":["../../src/core/bundled-mcp.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAsBrC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;AAEjD,MAAM,CAAC,MAAM,eAAe,GAAuB;IACjD;QACE,IAAI,EAAE,WAAW;QACjB,WAAW,EAAE,uBAAuB;QACpC,WAAW,EAAE,uDAAuD;QACpE,OAAO,EAAE,MAAM;QACf,IAAI,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,uBAAuB,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;QAClE,YAAY,EAAE,KAAK;QACnB,WAAW,EAAE,EAAE;QACf,OAAO,EAAE,wDAAwD;QACjE,cAAc,EAAE,IAAI;KACrB;IACD;QACE,IAAI,EAAE,UAAU;QAChB,WAAW,EAAE,UAAU;QACvB,WAAW,EAAE,mDAAmD;QAChE,OAAO,EAAE,KAAK;QACd,IAAI,EAAE,CAAC,IAAI,EAAE,uBAAuB,CAAC;QACrC,YAAY,EAAE,KAAK;QACnB,WAAW,EAAE,EAAE;QACf,cAAc,EAAE,IAAI;KACrB;IACD;QACE,IAAI,EAAE,UAAU;QAChB,WAAW,EAAE,iBAAiB;QAC9B,WAAW,EAAE,+CAA+C;QAC5D,OAAO,EAAE,MAAM;QACf,IAAI,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;QACzD,GAAG,EAAE,EAAE,YAAY,EAAE,iBAAiB,EAAE;QACxC,YAAY,EAAE,IAAI;QAClB,WAAW,EAAE;YACX,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,oCAAoC,EAAE,SAAS,EAAE,KAAK,EAAE;SACvF;QACD,OAAO,EAAE,+CAA+C;QACxD,cAAc,EAAE,KAAK;KACtB;IACD;QACE,IAAI,EAAE,WAAW;QACjB,WAAW,EAAE,eAAe;QAC5B,WAAW,EAAE,+BAA+B;QAC5C,OAAO,EAAE,MAAM;QACf,IAAI,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,eAAe,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;QAC1D,GAAG,EAAE;YACH,mBAAmB,EAAE,wBAAwB;YAC7C,kBAAkB,EAAE,uBAAuB;YAC3C,eAAe,EAAE,oBAAoB;SACtC;QACD,YAAY,EAAE,IAAI;QAClB,WAAW,EAAE;YACX,EAAE,IAAI,EAAE,iBAAiB,EAAM,IAAI,EAAE,gBAAgB,EAAiB,SAAS,EAAE,KAAK,EAAE;YACxF,EAAE,IAAI,EAAE,qBAAqB,EAAE,IAAI,EAAE,0BAA0B,EAAQ,SAAS,EAAE,IAAI,EAAG;YACzF,EAAE,IAAI,EAAE,oBAAoB,EAAG,IAAI,EAAE,mCAAmC,EAAE,SAAS,EAAE,KAAK,EAAE;SAC7F;QACD,OAAO,EAAE,iDAAiD;QAC1D,cAAc,EAAE,KAAK;KACtB;CACF,CAAC;AAEF,iFAAiF;AAEjF,MAAM,UAAU,kBAAkB,CAAC,GAAqB;IACtD,OAAO;QACL,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACpC,OAAO,EAAE,cAAc,CAAC,GAAG,CAAC;KAC7B,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CAAC,GAAqB;IAC3C,IAAI,CAAC,GAAG,CAAC,cAAc;QAAE,OAAO,KAAK,CAAC;IACtC,sDAAsD;IACtD,MAAM,OAAO,GAAG,qBAAqB,CAAC,GAAG,CAAC,CAAC;IAC3C,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC;IACrC,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,GAAqB;IACzD,OAAO,GAAG,CAAC,WAAW;SACnB,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;SACjC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AACtB,CAAC;AAED,qFAAqF;AACrF,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,GAAqB;IAC9D,IAAI,GAAG,CAAC,OAAO,KAAK,KAAK;QAAE,OAAO,IAAI,CAAC;IACvC,MAAM,UAAU,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC/B,IAAI,CAAC,UAAU;QAAE,OAAO,KAAK,CAAC;IAC9B,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,UAAU,CAAC,CAAC;QACzB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,oFAAoF;AACpF,MAAM,UAAU,mBAAmB,CAAC,QAA2B;IAC7D,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IACjD,MAAM,MAAM,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC;IAC7B,KAAK,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;QAClC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YACzB,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAC;QACvC,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -6,6 +6,13 @@ export interface McpServerConfig {
6
6
  env?: Record<string, string>;
7
7
  enabled?: boolean;
8
8
  }
9
+ export type McpConnectionStatus = 'connected' | 'failed' | 'disabled' | 'skipped';
10
+ export interface McpServerStatus {
11
+ name: string;
12
+ status: McpConnectionStatus;
13
+ toolCount: number;
14
+ error?: string;
15
+ }
9
16
  export interface McpTool extends Tool {
10
17
  _mcpServer: string;
11
18
  _mcpOriginalName: string;
@@ -14,9 +21,12 @@ export declare class McpManager {
14
21
  private clients;
15
22
  private toolEntries;
16
23
  private mcpTools;
24
+ private serverStatuses;
17
25
  get tools(): McpTool[];
18
26
  get isConnected(): boolean;
19
27
  connectAll(servers: McpServerConfig[]): Promise<void>;
28
+ getServerStatuses(): McpServerStatus[];
29
+ getServerStatus(name: string): McpServerStatus | undefined;
20
30
  connectOne(config: McpServerConfig): Promise<void>;
21
31
  call(qualifiedName: string, args: Record<string, unknown>): Promise<string>;
22
32
  isMcpTool(name: string): boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../../src/core/mcp.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAIrC,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAGD,MAAM,WAAW,OAAQ,SAAQ,IAAI;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAQD,qBAAa,UAAU;IACrB,OAAO,CAAC,OAAO,CAA6B;IAC5C,OAAO,CAAC,WAAW,CAAgC;IACnD,OAAO,CAAC,QAAQ,CAAiB;IAEjC,IAAI,KAAK,IAAI,OAAO,EAAE,CAErB;IAED,IAAI,WAAW,IAAI,OAAO,CAEzB;IAGK,UAAU,CAAC,OAAO,EAAE,eAAe,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IASrD,UAAU,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAqDlD,IAAI,CAAC,aAAa,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAsBjF,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAKhC,OAAO,IAAI,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IAS/C,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;CAQrC;AAKD,wBAAgB,aAAa,IAAI,UAAU,CAG1C;AAED,wBAAsB,OAAO,CAAC,OAAO,EAAE,eAAe,EAAE,GAAG,OAAO,CAAC,UAAU,CAAC,CAI7E"}
1
+ {"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../../src/core/mcp.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAIrC,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,MAAM,mBAAmB,GAAG,WAAW,GAAG,QAAQ,GAAG,UAAU,GAAG,SAAS,CAAC;AAElF,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,mBAAmB,CAAC;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAGD,MAAM,WAAW,OAAQ,SAAQ,IAAI;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAQD,qBAAa,UAAU;IACrB,OAAO,CAAC,OAAO,CAA6B;IAC5C,OAAO,CAAC,WAAW,CAAgC;IACnD,OAAO,CAAC,QAAQ,CAAiB;IACjC,OAAO,CAAC,cAAc,CAAsC;IAE5D,IAAI,KAAK,IAAI,OAAO,EAAE,CAErB;IAED,IAAI,WAAW,IAAI,OAAO,CAEzB;IAGK,UAAU,CAAC,OAAO,EAAE,eAAe,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAgB3D,iBAAiB,IAAI,eAAe,EAAE;IAItC,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS;IAIpD,UAAU,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAiElD,IAAI,CAAC,aAAa,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAsBjF,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAKhC,OAAO,IAAI,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IAS/C,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;CASrC;AAKD,wBAAgB,aAAa,IAAI,UAAU,CAG1C;AAED,wBAAsB,OAAO,CAAC,OAAO,EAAE,eAAe,EAAE,GAAG,OAAO,CAAC,UAAU,CAAC,CAI7E"}
package/dist/core/mcp.js CHANGED
@@ -6,6 +6,7 @@ export class McpManager {
6
6
  clients = new Map();
7
7
  toolEntries = new Map(); // qualifiedName → entry
8
8
  mcpTools = [];
9
+ serverStatuses = new Map();
9
10
  get tools() {
10
11
  return this.mcpTools;
11
12
  }
@@ -14,11 +15,23 @@ export class McpManager {
14
15
  }
15
16
  // Connect to all enabled servers. Non-fatal: logs warnings on failure.
16
17
  async connectAll(servers) {
18
+ // Track disabled servers immediately
19
+ for (const s of servers) {
20
+ if (s.enabled === false) {
21
+ this.serverStatuses.set(s.name, { name: s.name, status: 'disabled', toolCount: 0 });
22
+ }
23
+ }
17
24
  const enabled = servers.filter(s => s.enabled !== false);
18
25
  if (enabled.length === 0)
19
26
  return;
20
27
  await Promise.allSettled(enabled.map(s => this.connectOne(s)));
21
28
  }
29
+ getServerStatuses() {
30
+ return [...this.serverStatuses.values()];
31
+ }
32
+ getServerStatus(name) {
33
+ return this.serverStatuses.get(name);
34
+ }
22
35
  async connectOne(config) {
23
36
  try {
24
37
  const env = {};
@@ -57,10 +70,22 @@ export class McpManager {
57
70
  _mcpOriginalName: tool.name,
58
71
  });
59
72
  }
73
+ this.serverStatuses.set(config.name, {
74
+ name: config.name,
75
+ status: 'connected',
76
+ toolCount: tools.length,
77
+ });
60
78
  logger.success(`MCP: "${config.name}" connected — ${tools.length} tool(s)`);
61
79
  }
62
80
  catch (e) {
63
- logger.warn(`MCP: "${config.name}" failed — ${e.message}`);
81
+ const errMsg = e.message;
82
+ this.serverStatuses.set(config.name, {
83
+ name: config.name,
84
+ status: 'failed',
85
+ toolCount: 0,
86
+ error: errMsg,
87
+ });
88
+ logger.warn(`MCP: "${config.name}" failed — ${errMsg}`);
64
89
  }
65
90
  }
66
91
  // Call an MCP tool by qualified name (serverName__toolName)
@@ -95,6 +120,7 @@ export class McpManager {
95
120
  this.clients.clear();
96
121
  this.toolEntries.clear();
97
122
  this.mcpTools = [];
123
+ this.serverStatuses.clear();
98
124
  }
99
125
  }
100
126
  // Singleton per process — shared between chat and agents in the same session
@@ -1 +1 @@
1
- {"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../src/core/mcp.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../src/core/mcp.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { DeepSeekClient } from './api.js';
2
+ import type { ProjectContext } from './context.js';
3
+ export interface PostApplyOptions {
4
+ rootDir: string;
5
+ client: DeepSeekClient;
6
+ model: string;
7
+ projectContext: ProjectContext;
8
+ changedFiles: string[];
9
+ }
10
+ export declare function runPostApplyChecks(options: PostApplyOptions): Promise<void>;
11
+ export declare function runCheckCommand(opts?: {
12
+ scripts?: string[];
13
+ fix?: boolean;
14
+ }): Promise<void>;
15
+ //# sourceMappingURL=post-apply.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"post-apply.d.ts","sourceRoot":"","sources":["../../src/core/post-apply.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC/C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAGnD,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,cAAc,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,EAAE,cAAc,CAAC;IAC/B,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAwEjF;AAkJD,wBAAsB,eAAe,CAAC,IAAI,GAAE;IAAE,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,GAAG,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CA8ErG"}
@@ -0,0 +1,256 @@
1
+ import chalk from 'chalk';
2
+ import boxen from 'boxen';
3
+ import inquirer from 'inquirer';
4
+ import { logger } from '../utils/logger.js';
5
+ import { detectAvailableScripts, runScript, summarizeErrors, } from '../utils/build-runner.js';
6
+ import { readProjectFile, writeProjectFile } from './file-manager.js';
7
+ export async function runPostApplyChecks(options) {
8
+ const { rootDir, client, model, projectContext, changedFiles } = options;
9
+ const scripts = await detectAvailableScripts(rootDir);
10
+ if (scripts.length === 0) {
11
+ logger.dim(' Скрипты сборки не обнаружены (нет package.json или известных скриптов)');
12
+ return;
13
+ }
14
+ logger.newline();
15
+ console.log(boxen(chalk.bold.cyan('🔧 Пост-применение') + '\n' +
16
+ chalk.gray(`Доступно ${scripts.length} проверок: `) +
17
+ scripts.map(s => chalk.white(s.label)).join(chalk.gray(', ')), { padding: { top: 0, bottom: 0, left: 1, right: 1 }, borderColor: 'cyan', borderStyle: 'round' }));
18
+ logger.newline();
19
+ const { selected } = await inquirer.prompt([{
20
+ type: 'checkbox',
21
+ name: 'selected',
22
+ message: 'Что запустить после применения изменений?',
23
+ choices: scripts.map(s => ({
24
+ name: `${s.emoji} ${s.label}`,
25
+ value: s.name,
26
+ checked: s.name === 'build' || s.name === 'typecheck' || s.name === 'tsc',
27
+ })),
28
+ }]);
29
+ if (selected.length === 0) {
30
+ logger.dim(' Ничего не выбрано — пропускаем');
31
+ return;
32
+ }
33
+ const toRun = scripts.filter(s => selected.includes(s.name));
34
+ logger.newline();
35
+ logger.info(`Запускаем ${toRun.length} проверок...`);
36
+ const results = [];
37
+ for (const script of toRun) {
38
+ const result = await runScript(script, rootDir);
39
+ results.push(result);
40
+ }
41
+ const failed = results.filter(r => !r.success);
42
+ logger.newline();
43
+ printResultsTable(results);
44
+ if (failed.length === 0) {
45
+ logger.newline();
46
+ console.log(chalk.green.bold(' ✅ Все проверки прошли успешно!'));
47
+ return;
48
+ }
49
+ logger.newline();
50
+ const { fixErrors } = await inquirer.prompt([{
51
+ type: 'confirm',
52
+ name: 'fixErrors',
53
+ message: chalk.yellow(`Обнаружены ошибки в ${failed.length} проверках. Запустить AI-фикс?`),
54
+ default: true,
55
+ }]);
56
+ if (!fixErrors) {
57
+ logger.info('Фикс отклонён — продолжаем без исправлений');
58
+ return;
59
+ }
60
+ await runAiFix({ client, model, projectContext, rootDir, changedFiles, failed });
61
+ }
62
+ // ── AI fix ────────────────────────────────────────────────────────────────────
63
+ async function runAiFix(opts) {
64
+ const { client, model, projectContext, rootDir, changedFiles, failed } = opts;
65
+ const errorSummary = summarizeErrors(failed);
66
+ // Gather content of changed files
67
+ const fileContents = [];
68
+ for (const f of changedFiles.slice(0, 10)) {
69
+ try {
70
+ const content = await readProjectFile(f, rootDir);
71
+ fileContents.push(`=== ${f} ===\n${content}`);
72
+ }
73
+ catch { /* file may not exist */ }
74
+ }
75
+ const spinner = logger.spinner(`AI анализирует ${failed.length} ошибок...`);
76
+ spinner.start();
77
+ const systemPrompt = `You are an expert ${projectContext.language} developer.
78
+ Fix compilation/lint errors in the provided files.
79
+ Return ONLY the fixed file contents in this exact format for each file that needs changes:
80
+ <file path="RELATIVE/PATH">
81
+ FILE CONTENT HERE
82
+ </file>
83
+ Do not add explanations outside the file blocks.`;
84
+ const userMessage = `The following build errors occurred after applying changes:
85
+
86
+ ${errorSummary}
87
+
88
+ Changed files:
89
+ ${fileContents.join('\n\n')}
90
+
91
+ Fix all errors. Return only the corrected file(s).`;
92
+ try {
93
+ const response = await client.chat([
94
+ { role: 'system', content: systemPrompt },
95
+ { role: 'user', content: userMessage },
96
+ ]);
97
+ spinner.succeed('AI предложил исправления');
98
+ const aiOutput = response.content ?? '';
99
+ const fixedFiles = parseFileBlocks(aiOutput);
100
+ if (fixedFiles.length === 0) {
101
+ logger.warn('AI не предложил конкретных изменений файлов');
102
+ console.log(chalk.gray(aiOutput.slice(0, 1000)));
103
+ return;
104
+ }
105
+ logger.newline();
106
+ console.log(chalk.bold(` Предлагаемые исправления: ${fixedFiles.length} файл(а)`));
107
+ for (const { path } of fixedFiles) {
108
+ console.log(chalk.yellow(` ~ ${path}`));
109
+ }
110
+ logger.newline();
111
+ const { applyFix } = await inquirer.prompt([{
112
+ type: 'confirm',
113
+ name: 'applyFix',
114
+ message: 'Применить исправления?',
115
+ default: true,
116
+ }]);
117
+ if (!applyFix) {
118
+ logger.info('Исправления отклонены');
119
+ return;
120
+ }
121
+ for (const { path, content } of fixedFiles) {
122
+ await writeProjectFile(path, content, rootDir);
123
+ logger.success(`Исправлен: ${path}`);
124
+ }
125
+ // Re-run the failed checks after fix
126
+ const { rerun } = await inquirer.prompt([{
127
+ type: 'confirm',
128
+ name: 'rerun',
129
+ message: 'Перезапустить проверки после исправлений?',
130
+ default: true,
131
+ }]);
132
+ if (rerun) {
133
+ logger.newline();
134
+ logger.info('Перезапускаем упавшие проверки...');
135
+ const reResults = [];
136
+ for (const r of failed) {
137
+ const result = await runScript(r.script, rootDir);
138
+ reResults.push(result);
139
+ }
140
+ logger.newline();
141
+ printResultsTable(reResults);
142
+ const stillFailed = reResults.filter(r => !r.success);
143
+ if (stillFailed.length === 0) {
144
+ logger.success('Все проверки прошли после исправлений!');
145
+ }
146
+ else {
147
+ logger.warn(`Остались ошибки в ${stillFailed.length} проверках. Запустите didev check для повторного анализа.`);
148
+ }
149
+ }
150
+ }
151
+ catch (err) {
152
+ spinner.fail('Ошибка AI-фикса');
153
+ logger.error(err.message);
154
+ }
155
+ }
156
+ // ── helpers ───────────────────────────────────────────────────────────────────
157
+ function parseFileBlocks(text) {
158
+ const result = [];
159
+ const re = /<file\s+path="([^"]+)">([\s\S]*?)<\/file>/g;
160
+ for (const m of text.matchAll(re)) {
161
+ result.push({ path: m[1].trim(), content: m[2].trim() + '\n' });
162
+ }
163
+ return result;
164
+ }
165
+ function printResultsTable(results) {
166
+ const lines = [''];
167
+ for (const r of results) {
168
+ const status = r.success
169
+ ? chalk.green('✓ PASS')
170
+ : chalk.red('✗ FAIL');
171
+ const errCount = r.errors.filter(e => e.severity === 'error').length;
172
+ const warnCount = r.errors.filter(e => e.severity === 'warning').length;
173
+ const counts = r.success ? '' : chalk.gray(` · ${errCount} err${warnCount > 0 ? `, ${warnCount} warn` : ''}`);
174
+ const time = chalk.gray(` ${(r.durationMs / 1000).toFixed(1)}s`);
175
+ lines.push(` ${r.script.emoji} ${chalk.bold(r.script.label.padEnd(16))} ${status}${counts}${time}`);
176
+ }
177
+ lines.push('');
178
+ console.log(lines.join('\n'));
179
+ }
180
+ // ── standalone check command ──────────────────────────────────────────────────
181
+ export async function runCheckCommand(opts = {}) {
182
+ const rootDir = process.cwd();
183
+ const allScripts = await detectAvailableScripts(rootDir);
184
+ if (allScripts.length === 0) {
185
+ logger.warn('Скрипты не обнаружены — нет package.json или известных скриптов build/lint/test');
186
+ return;
187
+ }
188
+ let toRun;
189
+ if (opts.scripts && opts.scripts.length > 0) {
190
+ toRun = allScripts.filter(s => opts.scripts.includes(s.name) || opts.scripts.includes(s.label.toLowerCase()));
191
+ if (toRun.length === 0) {
192
+ logger.warn(`Скрипты не найдены: ${opts.scripts.join(', ')}`);
193
+ logger.info(`Доступные: ${allScripts.map(s => s.name).join(', ')}`);
194
+ return;
195
+ }
196
+ }
197
+ else if (opts.fix !== undefined) {
198
+ // Non-interactive mode — run all
199
+ toRun = allScripts;
200
+ }
201
+ else {
202
+ // Interactive selection
203
+ const { selected } = await inquirer.prompt([{
204
+ type: 'checkbox',
205
+ name: 'selected',
206
+ message: 'Выберите проверки для запуска:',
207
+ choices: allScripts.map(s => ({
208
+ name: `${s.emoji} ${s.label} ${chalk.gray(s.command + ' run ' + s.name)}`,
209
+ value: s.name,
210
+ checked: true,
211
+ })),
212
+ }]);
213
+ toRun = allScripts.filter(s => selected.includes(s.name));
214
+ if (toRun.length === 0) {
215
+ logger.info('Ничего не выбрано');
216
+ return;
217
+ }
218
+ }
219
+ const results = [];
220
+ for (const script of toRun) {
221
+ results.push(await runScript(script, rootDir));
222
+ }
223
+ logger.newline();
224
+ printResultsTable(results);
225
+ const failed = results.filter(r => !r.success);
226
+ if (failed.length === 0) {
227
+ logger.success('Все проверки прошли!');
228
+ return;
229
+ }
230
+ if (opts.fix) {
231
+ logger.warn(`${failed.length} проверок упали, но AI-фикс недоступен без контекста проекта`);
232
+ logger.info('Используйте didev agent для AI-фикса с полным контекстом');
233
+ return;
234
+ }
235
+ const { wantFix } = await inquirer.prompt([{
236
+ type: 'confirm',
237
+ name: 'wantFix',
238
+ message: `${failed.map(r => r.script.label).join(', ')} — запустить didev agent для исправления ошибок?`,
239
+ default: false,
240
+ }]);
241
+ if (wantFix) {
242
+ const { loadConfig, getApiKey } = await import('./config.js');
243
+ const { initClient } = await import('./api.js');
244
+ const { collectProjectContext } = await import('./context.js');
245
+ const config = await loadConfig(rootDir);
246
+ const apiKey = await getApiKey(config);
247
+ if (!apiKey) {
248
+ logger.error('DEEPSEEK_API_KEY не задан');
249
+ return;
250
+ }
251
+ const client = initClient({ apiKey, baseUrl: config.api.baseUrl, model: config.api.model, maxTokens: config.api.maxTokens, temperature: config.api.temperature });
252
+ const projectContext = await collectProjectContext(rootDir);
253
+ await runAiFix({ client, model: config.api.model, projectContext, rootDir, changedFiles: [], failed });
254
+ }
255
+ }
256
+ //# sourceMappingURL=post-apply.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"post-apply.js","sourceRoot":"","sources":["../../src/core/post-apply.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -169,6 +169,27 @@ bmadCmd
169
169
  const { runBmadReview } = await import('./bmad/method.js');
170
170
  await runBmadReview();
171
171
  });
172
+ // ── check ─────────────────────────────────────────────────────────────────────
173
+ program
174
+ .command('check')
175
+ .description('Run build/lint/typecheck/tests and optionally AI-fix errors')
176
+ .option('-s, --scripts <names>', 'Comma-separated script names to run (e.g. build,lint)')
177
+ .option('--fix', 'Auto-suggest AI fix if checks fail (non-interactive)')
178
+ .action(async (opts) => {
179
+ const { runCheckCommand } = await import('./core/post-apply.js');
180
+ await runCheckCommand({
181
+ scripts: opts.scripts ? opts.scripts.split(',').map((s) => s.trim()) : undefined,
182
+ fix: opts.fix,
183
+ });
184
+ });
185
+ // ── menu ──────────────────────────────────────────────────────────────────────
186
+ program
187
+ .command('menu')
188
+ .description('Open interactive menu (agents, MCP, context, model, settings)')
189
+ .action(async () => {
190
+ const { runMenu } = await import('./cli/commands/menu.js');
191
+ await launchMenuResult(await runMenu());
192
+ });
172
193
  // ── mcp ───────────────────────────────────────────────────────────────────────
173
194
  const mcpCmd = program
174
195
  .command('mcp')
@@ -206,6 +227,24 @@ mcpCmd.action(async () => {
206
227
  const { runMcpList } = await import('./cli/commands/mcp.js');
207
228
  await runMcpList();
208
229
  });
230
+ async function launchMenuResult(result) {
231
+ if (result.action === 'chat') {
232
+ const { runChat } = await import('./cli/commands/chat.js');
233
+ await runChat({ model: result.model });
234
+ }
235
+ else if (result.action === 'agent' && result.agentTask) {
236
+ const { loadConfig: lc } = await import('./core/config.js');
237
+ const cfg = await lc();
238
+ const { runOrchestration } = await import('./agents/orchestrator.js');
239
+ await runOrchestration({
240
+ task: result.agentTask,
241
+ rootDir: process.cwd(),
242
+ model: result.model ?? cfg.api.model,
243
+ mode: result.agentMode,
244
+ skipAgents: result.agentSkip,
245
+ });
246
+ }
247
+ }
209
248
  // ── error handling ────────────────────────────────────────────────────────────
210
249
  program.on('command:*', (operands) => {
211
250
  console.error(chalk.red(`Unknown command: ${operands[0]}`));
@@ -249,16 +288,18 @@ async function gracefulShutdown(signal) {
249
288
  process.on('SIGTERM', () => { void gracefulShutdown('SIGTERM'); });
250
289
  process.on('SIGINT', () => { void gracefulShutdown('SIGINT'); });
251
290
  const _rawArgs = process.argv.slice(2);
252
- // Show banner only for subcommands (not for bare invocation or --version)
291
+ // Show banner for subcommands only (bare invocation and --version skip it)
253
292
  const _isVersionFlag = _rawArgs.includes('--version') || _rawArgs.includes('-V');
254
293
  const _isBareInvocation = _rawArgs.length === 0;
255
- if (!_isVersionFlag && !_isBareInvocation) {
294
+ const _isMenuCommand = _rawArgs[0] === 'menu';
295
+ if (!_isVersionFlag && !_isBareInvocation && !_isMenuCommand) {
256
296
  printBanner(PKG_VERSION);
257
297
  }
258
- // Bare `didev` (no args) → open interactive shell immediately
298
+ // Bare `didev` (no args) → open interactive menu
259
299
  if (_isBareInvocation) {
260
- const { runChat } = await import('./cli/commands/chat.js');
261
- await runChat();
300
+ const { runMenu } = await import('./cli/commands/menu.js');
301
+ const result = await runMenu();
302
+ await launchMenuResult(result);
262
303
  process.exit(0);
263
304
  }
264
305
  program.parse();