codingbuddy 5.1.3 → 5.2.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 (128) hide show
  1. package/README.md +9 -0
  2. package/dist/src/app.module.js +2 -0
  3. package/dist/src/app.module.js.map +1 -1
  4. package/dist/src/cli/cli.d.ts +3 -3
  5. package/dist/src/cli/cli.js +118 -1
  6. package/dist/src/cli/cli.js.map +1 -1
  7. package/dist/src/cli/cli.types.d.ts +14 -0
  8. package/dist/src/cli/init/init.constants.js +0 -1
  9. package/dist/src/cli/init/init.constants.js.map +1 -1
  10. package/dist/src/cli/plugin/install.command.d.ts +10 -0
  11. package/dist/src/cli/plugin/install.command.js +31 -0
  12. package/dist/src/cli/plugin/install.command.js.map +1 -0
  13. package/dist/src/cli/plugin/plugins.command.d.ts +9 -0
  14. package/dist/src/cli/plugin/plugins.command.js +51 -0
  15. package/dist/src/cli/plugin/plugins.command.js.map +1 -0
  16. package/dist/src/cli/plugin/search.command.d.ts +9 -0
  17. package/dist/src/cli/plugin/search.command.js +53 -0
  18. package/dist/src/cli/plugin/search.command.js.map +1 -0
  19. package/dist/src/cli/plugin/uninstall.command.d.ts +12 -0
  20. package/dist/src/cli/plugin/uninstall.command.js +79 -0
  21. package/dist/src/cli/plugin/uninstall.command.js.map +1 -0
  22. package/dist/src/cli/plugin/update.command.d.ts +11 -0
  23. package/dist/src/cli/plugin/update.command.js +103 -0
  24. package/dist/src/cli/plugin/update.command.js.map +1 -0
  25. package/dist/src/context/briefing-loader.service.d.ts +27 -0
  26. package/dist/src/context/briefing-loader.service.js +124 -0
  27. package/dist/src/context/briefing-loader.service.js.map +1 -0
  28. package/dist/src/context/briefing.service.d.ts +27 -0
  29. package/dist/src/context/briefing.service.js +181 -0
  30. package/dist/src/context/briefing.service.js.map +1 -0
  31. package/dist/src/context/briefing.types.d.ts +13 -0
  32. package/dist/src/context/briefing.types.js +6 -0
  33. package/dist/src/context/briefing.types.js.map +1 -0
  34. package/dist/src/context/context.module.js +16 -2
  35. package/dist/src/context/context.module.js.map +1 -1
  36. package/dist/src/context/index.d.ts +2 -0
  37. package/dist/src/context/index.js +2 -0
  38. package/dist/src/context/index.js.map +1 -1
  39. package/dist/src/main.js +0 -17
  40. package/dist/src/main.js.map +1 -1
  41. package/dist/src/mcp/handlers/briefing.handler.d.ts +12 -0
  42. package/dist/src/mcp/handlers/briefing.handler.js +71 -0
  43. package/dist/src/mcp/handlers/briefing.handler.js.map +1 -0
  44. package/dist/src/mcp/handlers/index.d.ts +4 -0
  45. package/dist/src/mcp/handlers/index.js +9 -1
  46. package/dist/src/mcp/handlers/index.js.map +1 -1
  47. package/dist/src/mcp/handlers/quality-report.handler.d.ts +12 -0
  48. package/dist/src/mcp/handlers/quality-report.handler.js +75 -0
  49. package/dist/src/mcp/handlers/quality-report.handler.js.map +1 -0
  50. package/dist/src/mcp/handlers/resume.handler.d.ts +12 -0
  51. package/dist/src/mcp/handlers/resume.handler.js +63 -0
  52. package/dist/src/mcp/handlers/resume.handler.js.map +1 -0
  53. package/dist/src/mcp/handlers/rule-impact.handler.d.ts +23 -0
  54. package/dist/src/mcp/handlers/rule-impact.handler.js +241 -0
  55. package/dist/src/mcp/handlers/rule-impact.handler.js.map +1 -0
  56. package/dist/src/mcp/handlers/skill.handler.js +2 -2
  57. package/dist/src/mcp/handlers/skill.handler.js.map +1 -1
  58. package/dist/src/mcp/mcp.module.js +6 -0
  59. package/dist/src/mcp/mcp.module.js.map +1 -1
  60. package/dist/src/plugin/plugin-installer.service.d.ts +41 -0
  61. package/dist/src/plugin/plugin-installer.service.js +183 -0
  62. package/dist/src/plugin/plugin-installer.service.js.map +1 -0
  63. package/dist/src/plugin/plugin-manifest.schema.d.ts +21 -0
  64. package/dist/src/plugin/plugin-manifest.schema.js +45 -0
  65. package/dist/src/plugin/plugin-manifest.schema.js.map +1 -0
  66. package/dist/src/plugin/plugin.module.d.ts +2 -0
  67. package/dist/src/plugin/plugin.module.js +17 -0
  68. package/dist/src/plugin/plugin.module.js.map +1 -0
  69. package/dist/src/plugin/plugin.types.d.ts +7 -0
  70. package/dist/src/plugin/plugin.types.js +3 -0
  71. package/dist/src/plugin/plugin.types.js.map +1 -0
  72. package/dist/src/plugin/registry-client.d.ts +24 -0
  73. package/dist/src/plugin/registry-client.js +45 -0
  74. package/dist/src/plugin/registry-client.js.map +1 -0
  75. package/dist/src/rules/rule-event-collector.d.ts +7 -0
  76. package/dist/src/rules/rule-event-collector.js +38 -0
  77. package/dist/src/rules/rule-event-collector.js.map +1 -0
  78. package/dist/src/rules/rule-event.types.d.ts +9 -0
  79. package/dist/src/rules/rule-event.types.js +10 -0
  80. package/dist/src/rules/rule-event.types.js.map +1 -0
  81. package/dist/src/rules/rule-stats-writer.d.ts +23 -0
  82. package/dist/src/rules/rule-stats-writer.js +138 -0
  83. package/dist/src/rules/rule-stats-writer.js.map +1 -0
  84. package/dist/src/rules/rules.module.js +4 -2
  85. package/dist/src/rules/rules.module.js.map +1 -1
  86. package/dist/src/rules/rules.service.d.ts +2 -1
  87. package/dist/src/rules/rules.service.js.map +1 -1
  88. package/dist/src/rules/skill.schema.d.ts +5 -0
  89. package/dist/src/rules/skill.schema.js +6 -0
  90. package/dist/src/rules/skill.schema.js.map +1 -1
  91. package/dist/src/shared/rules-core.d.ts +2 -1
  92. package/dist/src/shared/rules-core.js +1 -0
  93. package/dist/src/shared/rules-core.js.map +1 -1
  94. package/dist/src/shared/version.d.ts +1 -1
  95. package/dist/src/shared/version.js +1 -1
  96. package/dist/src/ship/file-specialist-mapper.d.ts +9 -0
  97. package/dist/src/ship/file-specialist-mapper.js +56 -0
  98. package/dist/src/ship/file-specialist-mapper.js.map +1 -0
  99. package/dist/src/ship/quality-report.service.d.ts +6 -0
  100. package/dist/src/ship/quality-report.service.js +56 -0
  101. package/dist/src/ship/quality-report.service.js.map +1 -0
  102. package/dist/src/ship/quality-report.types.d.ts +20 -0
  103. package/dist/src/ship/quality-report.types.js +3 -0
  104. package/dist/src/ship/quality-report.types.js.map +1 -0
  105. package/dist/src/ship/ship.module.d.ts +2 -0
  106. package/dist/src/ship/ship.module.js +21 -0
  107. package/dist/src/ship/ship.module.js.map +1 -0
  108. package/dist/src/skill/skill-recommendation.service.d.ts +9 -2
  109. package/dist/src/skill/skill-recommendation.service.js +94 -16
  110. package/dist/src/skill/skill-recommendation.service.js.map +1 -1
  111. package/dist/src/skill/skill.module.js +2 -0
  112. package/dist/src/skill/skill.module.js.map +1 -1
  113. package/dist/src/tui/__perf__/memory-stability.spec.js +6 -6
  114. package/dist/src/tui/__perf__/memory-stability.spec.js.map +1 -1
  115. package/dist/src/tui/__perf__/rendering-performance.spec.js +5 -8
  116. package/dist/src/tui/__perf__/rendering-performance.spec.js.map +1 -1
  117. package/dist/src/tui/dashboard-app.spec.js +15 -15
  118. package/dist/src/tui/dashboard-app.spec.js.map +1 -1
  119. package/dist/src/tui/eventbus-ui.integration.spec.js +45 -45
  120. package/dist/src/tui/eventbus-ui.integration.spec.js.map +1 -1
  121. package/dist/src/tui/testing/tui-test-utils.d.ts +2 -0
  122. package/dist/src/tui/testing/tui-test-utils.js +25 -0
  123. package/dist/src/tui/testing/tui-test-utils.js.map +1 -0
  124. package/dist/src/tui/transport-tui.integration.spec.js +8 -8
  125. package/dist/src/tui/transport-tui.integration.spec.js.map +1 -1
  126. package/dist/src/tui-bundle.mjs +197 -36
  127. package/dist/tsconfig.build.tsbuildinfo +1 -1
  128. package/package.json +2 -2
@@ -0,0 +1,103 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.runUpdate = runUpdate;
4
+ const fs_1 = require("fs");
5
+ const path_1 = require("path");
6
+ const registry_client_1 = require("../../plugin/registry-client");
7
+ const plugin_installer_service_1 = require("../../plugin/plugin-installer.service");
8
+ const console_1 = require("../utils/console");
9
+ function compareVersions(a, b) {
10
+ const partsA = a.split('.').map(Number);
11
+ const partsB = b.split('.').map(Number);
12
+ for (let i = 0; i < 3; i++) {
13
+ const diff = (partsA[i] ?? 0) - (partsB[i] ?? 0);
14
+ if (diff !== 0)
15
+ return diff;
16
+ }
17
+ return 0;
18
+ }
19
+ async function runUpdate(options) {
20
+ const console = (0, console_1.createConsoleUtils)();
21
+ const pluginsJsonPath = (0, path_1.join)(options.projectRoot, '.codingbuddy', 'plugins.json');
22
+ if (!(0, fs_1.existsSync)(pluginsJsonPath)) {
23
+ console.log.info('No plugins installed.');
24
+ return { success: true, checked: 0, updated: 0 };
25
+ }
26
+ let registry;
27
+ try {
28
+ const raw = (0, fs_1.readFileSync)(pluginsJsonPath, 'utf-8');
29
+ registry = JSON.parse(raw);
30
+ }
31
+ catch {
32
+ console.log.error('Failed to read plugins.json. File may be corrupted.');
33
+ return { success: false, checked: 0, updated: 0, error: 'Corrupted plugins.json' };
34
+ }
35
+ let pluginsToCheck = registry.plugins;
36
+ if (options.pluginName) {
37
+ const found = registry.plugins.find(p => p.name === options.pluginName);
38
+ if (!found) {
39
+ console.log.error(`Plugin "${options.pluginName}" is not installed.`);
40
+ return { success: false, checked: 0, updated: 0, error: 'Plugin not installed' };
41
+ }
42
+ pluginsToCheck = [found];
43
+ }
44
+ if (pluginsToCheck.length === 0) {
45
+ console.log.info('No plugins installed.');
46
+ return { success: true, checked: 0, updated: 0 };
47
+ }
48
+ const client = new registry_client_1.RegistryClient();
49
+ let registryIndex;
50
+ try {
51
+ registryIndex = await client.fetchIndex();
52
+ }
53
+ catch (err) {
54
+ const message = err instanceof Error ? err.message : String(err);
55
+ console.log.error(`Failed to fetch registry: ${message}`);
56
+ return { success: false, checked: 0, updated: 0, error: message };
57
+ }
58
+ console.log.step('🔍', 'Checking for plugin updates...\n');
59
+ const outdated = [];
60
+ for (const installed of pluginsToCheck) {
61
+ const registryEntry = registryIndex.plugins.find(p => p.name === installed.name);
62
+ if (!registryEntry) {
63
+ console.log.warn(`${installed.name}: not found in registry, skipping.`);
64
+ continue;
65
+ }
66
+ if (compareVersions(registryEntry.version, installed.version) > 0) {
67
+ outdated.push({ installed, latestVersion: registryEntry.version });
68
+ console.log.step('📦', `${installed.name}: ${installed.version} → ${registryEntry.version}`);
69
+ }
70
+ }
71
+ if (outdated.length === 0) {
72
+ console.log.success('All plugins are up-to-date.');
73
+ return { success: true, checked: pluginsToCheck.length, updated: 0 };
74
+ }
75
+ const installer = new plugin_installer_service_1.PluginInstallerService();
76
+ let updatedCount = 0;
77
+ let hasFailure = false;
78
+ for (const { installed, latestVersion } of outdated) {
79
+ console.log.step('⬆️', `Updating ${installed.name} to ${latestVersion}...`);
80
+ const result = await installer.install({
81
+ source: installed.source,
82
+ targetRoot: options.projectRoot,
83
+ force: true,
84
+ });
85
+ if (result.success) {
86
+ console.log.success(`Updated ${installed.name} to ${latestVersion}`);
87
+ updatedCount++;
88
+ }
89
+ else {
90
+ console.log.error(`Failed to update ${installed.name}: ${result.error}`);
91
+ hasFailure = true;
92
+ }
93
+ }
94
+ if (updatedCount > 0) {
95
+ console.log.info(`Updated ${updatedCount} plugin${updatedCount !== 1 ? 's' : ''}.`);
96
+ }
97
+ return {
98
+ success: !hasFailure,
99
+ checked: pluginsToCheck.length,
100
+ updated: updatedCount,
101
+ };
102
+ }
103
+ //# sourceMappingURL=update.command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update.command.js","sourceRoot":"","sources":["../../../../src/cli/plugin/update.command.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import { ConfigService } from '../config/config.service';
2
+ import { ContextDocumentService } from './context-document.service';
3
+ export interface ParsedBriefing {
4
+ title: string;
5
+ mode: string;
6
+ decisions: string[];
7
+ pendingTasks: string[];
8
+ changedFiles: string[];
9
+ resumeCommand: string;
10
+ }
11
+ export interface RestoreResult extends ParsedBriefing {
12
+ contextRestored: boolean;
13
+ briefingPath: string;
14
+ }
15
+ export declare class BriefingLoaderService {
16
+ private readonly configService;
17
+ private readonly contextDocumentService;
18
+ private readonly logger;
19
+ constructor(configService: ConfigService, contextDocumentService: ContextDocumentService);
20
+ findMostRecentBriefing(): string | null;
21
+ parseBriefingMarkdown(content: string): ParsedBriefing;
22
+ loadBriefing(briefingPath?: string): Promise<ParsedBriefing & {
23
+ briefingPath: string;
24
+ }>;
25
+ restoreContext(briefingPath?: string): Promise<RestoreResult>;
26
+ private extractSectionItems;
27
+ }
@@ -0,0 +1,124 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var BriefingLoaderService_1;
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.BriefingLoaderService = void 0;
14
+ const common_1 = require("@nestjs/common");
15
+ const fs = require("fs/promises");
16
+ const fs_1 = require("fs");
17
+ const path = require("path");
18
+ const config_service_1 = require("../config/config.service");
19
+ const context_document_service_1 = require("./context-document.service");
20
+ const briefing_types_1 = require("./briefing.types");
21
+ let BriefingLoaderService = BriefingLoaderService_1 = class BriefingLoaderService {
22
+ constructor(configService, contextDocumentService) {
23
+ this.configService = configService;
24
+ this.contextDocumentService = contextDocumentService;
25
+ this.logger = new common_1.Logger(BriefingLoaderService_1.name);
26
+ }
27
+ findMostRecentBriefing() {
28
+ const projectRoot = this.configService.getProjectRoot();
29
+ const briefingDir = path.join(projectRoot, briefing_types_1.BRIEFING_OUTPUT_DIR);
30
+ if (!(0, fs_1.existsSync)(briefingDir)) {
31
+ this.logger.debug(`Briefings directory does not exist: ${briefingDir}`);
32
+ return null;
33
+ }
34
+ const files = (0, fs_1.readdirSync)(briefingDir)
35
+ .filter(f => f.endsWith('.md'))
36
+ .sort();
37
+ if (files.length === 0) {
38
+ this.logger.debug('No briefing files found');
39
+ return null;
40
+ }
41
+ return path.join(briefingDir, files[files.length - 1]);
42
+ }
43
+ parseBriefingMarkdown(content) {
44
+ const result = {
45
+ title: 'Untitled',
46
+ mode: 'PLAN',
47
+ decisions: [],
48
+ pendingTasks: [],
49
+ changedFiles: [],
50
+ resumeCommand: '',
51
+ };
52
+ if (!content.trim()) {
53
+ return result;
54
+ }
55
+ const titleMatch = content.match(/^# Briefing: (.+)$/m);
56
+ if (titleMatch) {
57
+ result.title = titleMatch[1].trim();
58
+ }
59
+ const modeMatch = content.match(/\*\*Mode\*\*: (\w+)/);
60
+ if (modeMatch) {
61
+ result.mode = modeMatch[1];
62
+ }
63
+ result.decisions = this.extractSectionItems(content, 'Decisions');
64
+ result.changedFiles = this.extractSectionItems(content, 'Changed Files');
65
+ result.pendingTasks = this.extractSectionItems(content, 'Pending Tasks');
66
+ const resumeMatch = content.match(/## Resume Command\s*\n```\n([\s\S]*?)\n```/);
67
+ if (resumeMatch) {
68
+ result.resumeCommand = resumeMatch[1].trim();
69
+ }
70
+ return result;
71
+ }
72
+ async loadBriefing(briefingPath) {
73
+ let resolvedPath;
74
+ if (briefingPath) {
75
+ if (!(0, fs_1.existsSync)(briefingPath)) {
76
+ throw new Error(`Briefing file not found: ${briefingPath}`);
77
+ }
78
+ resolvedPath = briefingPath;
79
+ }
80
+ else {
81
+ const mostRecent = this.findMostRecentBriefing();
82
+ if (!mostRecent) {
83
+ throw new Error('No briefing files found in docs/codingbuddy/briefings/. Create one first with create_briefing.');
84
+ }
85
+ resolvedPath = mostRecent;
86
+ }
87
+ const content = await fs.readFile(resolvedPath, 'utf-8');
88
+ const parsed = this.parseBriefingMarkdown(content);
89
+ this.logger.log(`Loaded briefing: ${resolvedPath}`);
90
+ return { ...parsed, briefingPath: resolvedPath };
91
+ }
92
+ async restoreContext(briefingPath) {
93
+ const briefing = await this.loadBriefing(briefingPath);
94
+ await this.contextDocumentService.resetContext({
95
+ title: briefing.title,
96
+ task: `Resumed from briefing: ${briefing.resumeCommand}`,
97
+ decisions: briefing.decisions,
98
+ notes: briefing.pendingTasks,
99
+ });
100
+ this.logger.log(`Context restored from briefing: ${briefing.briefingPath}`);
101
+ return {
102
+ ...briefing,
103
+ contextRestored: true,
104
+ };
105
+ }
106
+ extractSectionItems(content, sectionName) {
107
+ const sectionRegex = new RegExp(`## ${sectionName}\\s*\\n([\\s\\S]*?)(?=\\n## |$)`);
108
+ const sectionMatch = content.match(sectionRegex);
109
+ if (!sectionMatch) {
110
+ return [];
111
+ }
112
+ return sectionMatch[1]
113
+ .split('\n')
114
+ .filter(line => line.startsWith('- '))
115
+ .map(line => line.slice(2).trim());
116
+ }
117
+ };
118
+ exports.BriefingLoaderService = BriefingLoaderService;
119
+ exports.BriefingLoaderService = BriefingLoaderService = BriefingLoaderService_1 = __decorate([
120
+ (0, common_1.Injectable)(),
121
+ __metadata("design:paramtypes", [config_service_1.ConfigService,
122
+ context_document_service_1.ContextDocumentService])
123
+ ], BriefingLoaderService);
124
+ //# sourceMappingURL=briefing-loader.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"briefing-loader.service.js","sourceRoot":"","sources":["../../../src/context/briefing-loader.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import { ConfigService } from '../config/config.service';
2
+ import { ContextDocumentService } from './context-document.service';
3
+ import type { BriefingInput, BriefingResult } from './briefing.types';
4
+ export declare class BriefingService {
5
+ private readonly configService;
6
+ private readonly contextDocumentService;
7
+ private readonly logger;
8
+ constructor(configService: ConfigService, contextDocumentService: ContextDocumentService);
9
+ createBriefing(input?: BriefingInput): Promise<BriefingResult>;
10
+ parseContext(): Promise<{
11
+ decisions: string[];
12
+ pendingTasks: string[];
13
+ currentMode: string;
14
+ title: string;
15
+ }>;
16
+ getChangedFiles(projectRoot: string): string[];
17
+ generateResumeCommand(currentMode: string, pendingTasks: string[], title: string): string;
18
+ private writeBriefing;
19
+ formatBriefingMarkdown(data: {
20
+ decisions: string[];
21
+ pendingTasks: string[];
22
+ changedFiles: string[];
23
+ resumeCommand: string;
24
+ currentMode: string;
25
+ title: string;
26
+ }): string;
27
+ }
@@ -0,0 +1,181 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var BriefingService_1;
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.BriefingService = void 0;
14
+ const common_1 = require("@nestjs/common");
15
+ const fs = require("fs/promises");
16
+ const fs_1 = require("fs");
17
+ const path = require("path");
18
+ const child_process_1 = require("child_process");
19
+ const config_service_1 = require("../config/config.service");
20
+ const context_document_service_1 = require("./context-document.service");
21
+ const briefing_types_1 = require("./briefing.types");
22
+ let BriefingService = BriefingService_1 = class BriefingService {
23
+ constructor(configService, contextDocumentService) {
24
+ this.configService = configService;
25
+ this.contextDocumentService = contextDocumentService;
26
+ this.logger = new common_1.Logger(BriefingService_1.name);
27
+ }
28
+ async createBriefing(input) {
29
+ const projectRoot = input?.projectRoot ?? this.configService.getProjectRoot();
30
+ const { decisions, pendingTasks, currentMode, title } = await this.parseContext();
31
+ const changedFiles = this.getChangedFiles(projectRoot);
32
+ const resumeCommand = this.generateResumeCommand(currentMode, pendingTasks, title);
33
+ const filePath = await this.writeBriefing(projectRoot, {
34
+ decisions,
35
+ pendingTasks,
36
+ changedFiles,
37
+ resumeCommand,
38
+ currentMode,
39
+ title,
40
+ });
41
+ return {
42
+ filePath,
43
+ decisions,
44
+ pendingTasks,
45
+ changedFiles,
46
+ resumeCommand,
47
+ };
48
+ }
49
+ async parseContext() {
50
+ const readResult = await this.contextDocumentService.readContext();
51
+ if (!readResult.exists || !readResult.document) {
52
+ return {
53
+ decisions: [],
54
+ pendingTasks: [],
55
+ currentMode: 'PLAN',
56
+ title: 'Untitled',
57
+ };
58
+ }
59
+ const doc = readResult.document;
60
+ const decisions = [];
61
+ const pendingTasks = [];
62
+ for (const section of doc.sections) {
63
+ if (section.decisions) {
64
+ decisions.push(...section.decisions);
65
+ }
66
+ if (section.notes) {
67
+ pendingTasks.push(...section.notes);
68
+ }
69
+ if (section.progress) {
70
+ for (const item of section.progress) {
71
+ if (!item.toLowerCase().includes('completed') && !item.toLowerCase().includes('done')) {
72
+ pendingTasks.push(item);
73
+ }
74
+ }
75
+ }
76
+ }
77
+ return {
78
+ decisions,
79
+ pendingTasks,
80
+ currentMode: doc.metadata.currentMode ?? 'PLAN',
81
+ title: doc.metadata.title ?? 'Untitled',
82
+ };
83
+ }
84
+ getChangedFiles(projectRoot) {
85
+ try {
86
+ const output = (0, child_process_1.execSync)('git diff --stat --name-only', {
87
+ cwd: projectRoot,
88
+ timeout: briefing_types_1.GIT_DIFF_TIMEOUT_MS,
89
+ encoding: 'utf-8',
90
+ stdio: ['pipe', 'pipe', 'pipe'],
91
+ });
92
+ return output
93
+ .split('\n')
94
+ .map(line => line.trim())
95
+ .filter(line => line.length > 0);
96
+ }
97
+ catch (error) {
98
+ this.logger.warn(`Failed to get git diff: ${error instanceof Error ? error.message : String(error)}`);
99
+ return [];
100
+ }
101
+ }
102
+ generateResumeCommand(currentMode, pendingTasks, title) {
103
+ if (pendingTasks.length === 0) {
104
+ return `PLAN continue "${title}"`;
105
+ }
106
+ switch (currentMode) {
107
+ case 'PLAN':
108
+ return `ACT execute the plan for "${title}"`;
109
+ case 'ACT':
110
+ return `ACT continue implementation of "${title}"`;
111
+ case 'EVAL':
112
+ return `ACT apply fixes from evaluation of "${title}"`;
113
+ default:
114
+ return `AUTO continue "${title}"`;
115
+ }
116
+ }
117
+ async writeBriefing(projectRoot, data) {
118
+ const briefingDir = path.join(projectRoot, briefing_types_1.BRIEFING_OUTPUT_DIR);
119
+ if (!(0, fs_1.existsSync)(briefingDir)) {
120
+ (0, fs_1.mkdirSync)(briefingDir, { recursive: true });
121
+ }
122
+ const timestamp = new Date().toISOString().replace(/[:.]/g, '-');
123
+ const fileName = `${timestamp}.md`;
124
+ const filePath = path.join(briefingDir, fileName);
125
+ const content = this.formatBriefingMarkdown(data);
126
+ await fs.writeFile(filePath, content, 'utf-8');
127
+ this.logger.log(`Briefing written to ${filePath}`);
128
+ return filePath;
129
+ }
130
+ formatBriefingMarkdown(data) {
131
+ const lines = [];
132
+ lines.push(`# Briefing: ${data.title}`);
133
+ lines.push('');
134
+ lines.push(`**Mode**: ${data.currentMode}`);
135
+ lines.push(`**Created**: ${new Date().toISOString()}`);
136
+ lines.push('');
137
+ lines.push('## Decisions');
138
+ if (data.decisions.length > 0) {
139
+ for (const decision of data.decisions) {
140
+ lines.push(`- ${decision}`);
141
+ }
142
+ }
143
+ else {
144
+ lines.push('_No decisions recorded._');
145
+ }
146
+ lines.push('');
147
+ lines.push('## Changed Files');
148
+ if (data.changedFiles.length > 0) {
149
+ for (const file of data.changedFiles) {
150
+ lines.push(`- ${file}`);
151
+ }
152
+ }
153
+ else {
154
+ lines.push('_No files changed._');
155
+ }
156
+ lines.push('');
157
+ lines.push('## Pending Tasks');
158
+ if (data.pendingTasks.length > 0) {
159
+ for (const task of data.pendingTasks) {
160
+ lines.push(`- ${task}`);
161
+ }
162
+ }
163
+ else {
164
+ lines.push('_No pending tasks._');
165
+ }
166
+ lines.push('');
167
+ lines.push('## Resume Command');
168
+ lines.push('```');
169
+ lines.push(data.resumeCommand);
170
+ lines.push('```');
171
+ lines.push('');
172
+ return lines.join('\n');
173
+ }
174
+ };
175
+ exports.BriefingService = BriefingService;
176
+ exports.BriefingService = BriefingService = BriefingService_1 = __decorate([
177
+ (0, common_1.Injectable)(),
178
+ __metadata("design:paramtypes", [config_service_1.ConfigService,
179
+ context_document_service_1.ContextDocumentService])
180
+ ], BriefingService);
181
+ //# sourceMappingURL=briefing.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"briefing.service.js","sourceRoot":"","sources":["../../../src/context/briefing.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ export interface BriefingInput {
2
+ contextPath?: string;
3
+ projectRoot?: string;
4
+ }
5
+ export interface BriefingResult {
6
+ filePath: string;
7
+ decisions: string[];
8
+ pendingTasks: string[];
9
+ changedFiles: string[];
10
+ resumeCommand: string;
11
+ }
12
+ export declare const BRIEFING_OUTPUT_DIR = "docs/codingbuddy/briefings";
13
+ export declare const GIT_DIFF_TIMEOUT_MS = 10000;
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GIT_DIFF_TIMEOUT_MS = exports.BRIEFING_OUTPUT_DIR = void 0;
4
+ exports.BRIEFING_OUTPUT_DIR = 'docs/codingbuddy/briefings';
5
+ exports.GIT_DIFF_TIMEOUT_MS = 10_000;
6
+ //# sourceMappingURL=briefing.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"briefing.types.js","sourceRoot":"","sources":["../../../src/context/briefing.types.ts"],"names":[],"mappings":";;;AAoCa,QAAA,mBAAmB,GAAG,4BAA4B,CAAC;AAKnD,QAAA,mBAAmB,GAAG,MAAM,CAAC"}
@@ -11,6 +11,8 @@ const common_1 = require("@nestjs/common");
11
11
  const context_service_1 = require("./context.service");
12
12
  const context_document_service_1 = require("./context-document.service");
13
13
  const context_archive_service_1 = require("./context-archive.service");
14
+ const briefing_service_1 = require("./briefing.service");
15
+ const briefing_loader_service_1 = require("./briefing-loader.service");
14
16
  const checklist_module_1 = require("../checklist/checklist.module");
15
17
  const config_module_1 = require("../config/config.module");
16
18
  let ContextModule = class ContextModule {
@@ -19,8 +21,20 @@ exports.ContextModule = ContextModule;
19
21
  exports.ContextModule = ContextModule = __decorate([
20
22
  (0, common_1.Module)({
21
23
  imports: [checklist_module_1.ChecklistModule, config_module_1.CodingBuddyConfigModule],
22
- providers: [context_service_1.ContextService, context_document_service_1.ContextDocumentService, context_archive_service_1.ContextArchiveService],
23
- exports: [context_service_1.ContextService, context_document_service_1.ContextDocumentService, context_archive_service_1.ContextArchiveService],
24
+ providers: [
25
+ context_service_1.ContextService,
26
+ context_document_service_1.ContextDocumentService,
27
+ context_archive_service_1.ContextArchiveService,
28
+ briefing_service_1.BriefingService,
29
+ briefing_loader_service_1.BriefingLoaderService,
30
+ ],
31
+ exports: [
32
+ context_service_1.ContextService,
33
+ context_document_service_1.ContextDocumentService,
34
+ context_archive_service_1.ContextArchiveService,
35
+ briefing_service_1.BriefingService,
36
+ briefing_loader_service_1.BriefingLoaderService,
37
+ ],
24
38
  })
25
39
  ], ContextModule);
26
40
  //# sourceMappingURL=context.module.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"context.module.js","sourceRoot":"","sources":["../../../src/context/context.module.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAAwC;AACxC,uDAAmD;AACnD,yEAAoE;AACpE,uEAAkE;AAClE,oEAAgE;AAChE,2DAAkE;AAO3D,IAAM,aAAa,GAAnB,MAAM,aAAa;CAAG,CAAA;AAAhB,sCAAa;wBAAb,aAAa;IALzB,IAAA,eAAM,EAAC;QACN,OAAO,EAAE,CAAC,kCAAe,EAAE,uCAAuB,CAAC;QACnD,SAAS,EAAE,CAAC,gCAAc,EAAE,iDAAsB,EAAE,+CAAqB,CAAC;QAC1E,OAAO,EAAE,CAAC,gCAAc,EAAE,iDAAsB,EAAE,+CAAqB,CAAC;KACzE,CAAC;GACW,aAAa,CAAG"}
1
+ {"version":3,"file":"context.module.js","sourceRoot":"","sources":["../../../src/context/context.module.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAAwC;AACxC,uDAAmD;AACnD,yEAAoE;AACpE,uEAAkE;AAClE,yDAAqD;AACrD,uEAAkE;AAClE,oEAAgE;AAChE,2DAAkE;AAmB3D,IAAM,aAAa,GAAnB,MAAM,aAAa;CAAG,CAAA;AAAhB,sCAAa;wBAAb,aAAa;IAjBzB,IAAA,eAAM,EAAC;QACN,OAAO,EAAE,CAAC,kCAAe,EAAE,uCAAuB,CAAC;QACnD,SAAS,EAAE;YACT,gCAAc;YACd,iDAAsB;YACtB,+CAAqB;YACrB,kCAAe;YACf,+CAAqB;SACtB;QACD,OAAO,EAAE;YACP,gCAAc;YACd,iDAAsB;YACtB,+CAAqB;YACrB,kCAAe;YACf,+CAAqB;SACtB;KACF,CAAC;GACW,aAAa,CAAG"}
@@ -2,3 +2,5 @@ export * from './context.module';
2
2
  export * from './context.service';
3
3
  export * from './context.types';
4
4
  export * from './context-archive.service';
5
+ export * from './briefing.service';
6
+ export * from './briefing.types';
@@ -18,4 +18,6 @@ __exportStar(require("./context.module"), exports);
18
18
  __exportStar(require("./context.service"), exports);
19
19
  __exportStar(require("./context.types"), exports);
20
20
  __exportStar(require("./context-archive.service"), exports);
21
+ __exportStar(require("./briefing.service"), exports);
22
+ __exportStar(require("./briefing.types"), exports);
21
23
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/context/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,mDAAiC;AACjC,oDAAkC;AAClC,kDAAgC;AAChC,4DAA0C"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/context/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,mDAAiC;AACjC,oDAAkC;AAClC,kDAAgC;AAChC,4DAA0C;AAC1C,qDAAmC;AACnC,mDAAiC"}
package/dist/src/main.js CHANGED
@@ -2,7 +2,6 @@
2
2
  "use strict";
3
3
  Object.defineProperty(exports, "__esModule", { value: true });
4
4
  exports.bootstrap = bootstrap;
5
- const path = require("path");
6
5
  const core_1 = require("@nestjs/core");
7
6
  const app_module_1 = require("./app.module");
8
7
  const mcp_service_1 = require("./mcp/mcp.service");
@@ -60,16 +59,6 @@ async function initTui(app, stdout) {
60
59
  const eventBus = app.get(TuiEventBus);
61
60
  return startTui({ eventBus, ...(stdout ? { stdout } : {}) });
62
61
  }
63
- async function launchAutoTui(ipcServer, tuiEnabled) {
64
- const { TuiAutoLauncher } = await Promise.resolve().then(() => require('./tui/ipc'));
65
- const codingbuddyBin = path.resolve(process.argv[1]);
66
- const launcher = new TuiAutoLauncher({
67
- enabled: tuiEnabled || process.env.CODINGBUDDY_AUTO_TUI === '1',
68
- codingbuddyBin,
69
- });
70
- const result = await launcher.launch(ipcServer);
71
- debugLog(`TUI auto-launch: ${result.reason}${result.pid ? ` (PID: ${result.pid})` : ''}`);
72
- }
73
62
  async function initIpc(app) {
74
63
  const { ensureTuiReady } = await Promise.resolve().then(() => require('./tui/ensure-tui-ready'));
75
64
  await ensureTuiReady(app);
@@ -156,9 +145,6 @@ async function bootstrap() {
156
145
  try {
157
146
  const ipcResult = await initIpc(app);
158
147
  sseShutdownManager.register(ipcResult.cleanup);
159
- launchAutoTui(ipcResult.ipcServer, tuiEnabled).catch(err => {
160
- debugLog(`TUI auto-launch failed (non-blocking): ${err}`);
161
- });
162
148
  }
163
149
  catch (error) {
164
150
  logger.warn(`IPC server failed to start (non-blocking): ${error}`);
@@ -185,9 +171,6 @@ async function bootstrap() {
185
171
  try {
186
172
  const ipcResult = await initIpc(app);
187
173
  shutdownManager.register(ipcResult.cleanup);
188
- launchAutoTui(ipcResult.ipcServer, tuiEnabled).catch(err => {
189
- debugLog(`TUI auto-launch failed (non-blocking): ${err}`);
190
- });
191
174
  }
192
175
  catch (error) {
193
176
  debugLog(`IPC server failed to start (non-blocking): ${error}`);