dev-team-mcp-server 0.1.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.
- package/README.md +168 -0
- package/dist/cli.d.ts +5 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +127 -0
- package/dist/cli.js.map +1 -0
- package/dist/config/permissions.d.ts +26 -0
- package/dist/config/permissions.d.ts.map +1 -0
- package/dist/config/permissions.js +82 -0
- package/dist/config/permissions.js.map +1 -0
- package/dist/config/team-config.d.ts +28 -0
- package/dist/config/team-config.d.ts.map +1 -0
- package/dist/config/team-config.js +101 -0
- package/dist/config/team-config.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +1301 -0
- package/dist/index.js.map +1 -0
- package/dist/tools/add-backlog.d.ts +21 -0
- package/dist/tools/add-backlog.d.ts.map +1 -0
- package/dist/tools/add-backlog.js +96 -0
- package/dist/tools/add-backlog.js.map +1 -0
- package/dist/tools/approve-plan.d.ts +12 -0
- package/dist/tools/approve-plan.d.ts.map +1 -0
- package/dist/tools/approve-plan.js +181 -0
- package/dist/tools/approve-plan.js.map +1 -0
- package/dist/tools/approve-test.d.ts +15 -0
- package/dist/tools/approve-test.d.ts.map +1 -0
- package/dist/tools/approve-test.js +113 -0
- package/dist/tools/approve-test.js.map +1 -0
- package/dist/tools/archive-all-tasks.d.ts +9 -0
- package/dist/tools/archive-all-tasks.d.ts.map +1 -0
- package/dist/tools/archive-all-tasks.js +39 -0
- package/dist/tools/archive-all-tasks.js.map +1 -0
- package/dist/tools/assign-task.d.ts +31 -0
- package/dist/tools/assign-task.d.ts.map +1 -0
- package/dist/tools/assign-task.js +285 -0
- package/dist/tools/assign-task.js.map +1 -0
- package/dist/tools/check-queue.d.ts +18 -0
- package/dist/tools/check-queue.d.ts.map +1 -0
- package/dist/tools/check-queue.js +129 -0
- package/dist/tools/check-queue.js.map +1 -0
- package/dist/tools/clear-agent.d.ts +8 -0
- package/dist/tools/clear-agent.d.ts.map +1 -0
- package/dist/tools/clear-agent.js +52 -0
- package/dist/tools/clear-agent.js.map +1 -0
- package/dist/tools/compact-agent.d.ts +8 -0
- package/dist/tools/compact-agent.d.ts.map +1 -0
- package/dist/tools/compact-agent.js +52 -0
- package/dist/tools/compact-agent.js.map +1 -0
- package/dist/tools/compact-all.d.ts +11 -0
- package/dist/tools/compact-all.d.ts.map +1 -0
- package/dist/tools/compact-all.js +61 -0
- package/dist/tools/compact-all.js.map +1 -0
- package/dist/tools/configure-modes.d.ts +19 -0
- package/dist/tools/configure-modes.d.ts.map +1 -0
- package/dist/tools/configure-modes.js +114 -0
- package/dist/tools/configure-modes.js.map +1 -0
- package/dist/tools/distribute-tasks.d.ts +40 -0
- package/dist/tools/distribute-tasks.d.ts.map +1 -0
- package/dist/tools/distribute-tasks.js +276 -0
- package/dist/tools/distribute-tasks.js.map +1 -0
- package/dist/tools/get-backlog.d.ts +9 -0
- package/dist/tools/get-backlog.d.ts.map +1 -0
- package/dist/tools/get-backlog.js +65 -0
- package/dist/tools/get-backlog.js.map +1 -0
- package/dist/tools/get-dashboard.d.ts +15 -0
- package/dist/tools/get-dashboard.d.ts.map +1 -0
- package/dist/tools/get-dashboard.js +154 -0
- package/dist/tools/get-dashboard.js.map +1 -0
- package/dist/tools/get-project-context.d.ts +11 -0
- package/dist/tools/get-project-context.d.ts.map +1 -0
- package/dist/tools/get-project-context.js +84 -0
- package/dist/tools/get-project-context.js.map +1 -0
- package/dist/tools/health-check.d.ts +21 -0
- package/dist/tools/health-check.d.ts.map +1 -0
- package/dist/tools/health-check.js +86 -0
- package/dist/tools/health-check.js.map +1 -0
- package/dist/tools/kill-member.d.ts +15 -0
- package/dist/tools/kill-member.d.ts.map +1 -0
- package/dist/tools/kill-member.js +89 -0
- package/dist/tools/kill-member.js.map +1 -0
- package/dist/tools/kill-member.test.d.ts +2 -0
- package/dist/tools/kill-member.test.d.ts.map +1 -0
- package/dist/tools/kill-member.test.js +228 -0
- package/dist/tools/kill-member.test.js.map +1 -0
- package/dist/tools/process-approval.d.ts +14 -0
- package/dist/tools/process-approval.d.ts.map +1 -0
- package/dist/tools/process-approval.js +225 -0
- package/dist/tools/process-approval.js.map +1 -0
- package/dist/tools/process-skill-candidate.d.ts +14 -0
- package/dist/tools/process-skill-candidate.d.ts.map +1 -0
- package/dist/tools/process-skill-candidate.js +56 -0
- package/dist/tools/process-skill-candidate.js.map +1 -0
- package/dist/tools/recall-memory.d.ts +9 -0
- package/dist/tools/recall-memory.d.ts.map +1 -0
- package/dist/tools/recall-memory.js +97 -0
- package/dist/tools/recall-memory.js.map +1 -0
- package/dist/tools/reject-plan.d.ts +13 -0
- package/dist/tools/reject-plan.d.ts.map +1 -0
- package/dist/tools/reject-plan.js +154 -0
- package/dist/tools/reject-plan.js.map +1 -0
- package/dist/tools/reject-test.d.ts +13 -0
- package/dist/tools/reject-test.d.ts.map +1 -0
- package/dist/tools/reject-test.js +122 -0
- package/dist/tools/reject-test.js.map +1 -0
- package/dist/tools/report-skill-candidate.d.ts +12 -0
- package/dist/tools/report-skill-candidate.d.ts.map +1 -0
- package/dist/tools/report-skill-candidate.js +51 -0
- package/dist/tools/report-skill-candidate.js.map +1 -0
- package/dist/tools/request-approval.d.ts +13 -0
- package/dist/tools/request-approval.d.ts.map +1 -0
- package/dist/tools/request-approval.js +53 -0
- package/dist/tools/request-approval.js.map +1 -0
- package/dist/tools/request-member-decrease.d.ts +15 -0
- package/dist/tools/request-member-decrease.d.ts.map +1 -0
- package/dist/tools/request-member-decrease.js +100 -0
- package/dist/tools/request-member-decrease.js.map +1 -0
- package/dist/tools/request-member-increase.d.ts +15 -0
- package/dist/tools/request-member-increase.d.ts.map +1 -0
- package/dist/tools/request-member-increase.js +81 -0
- package/dist/tools/request-member-increase.js.map +1 -0
- package/dist/tools/save-memory.d.ts +9 -0
- package/dist/tools/save-memory.d.ts.map +1 -0
- package/dist/tools/save-memory.js +82 -0
- package/dist/tools/save-memory.js.map +1 -0
- package/dist/tools/send-task.d.ts +18 -0
- package/dist/tools/send-task.d.ts.map +1 -0
- package/dist/tools/send-task.js +216 -0
- package/dist/tools/send-task.js.map +1 -0
- package/dist/tools/set-review-mode.d.ts +13 -0
- package/dist/tools/set-review-mode.d.ts.map +1 -0
- package/dist/tools/set-review-mode.js +69 -0
- package/dist/tools/set-review-mode.js.map +1 -0
- package/dist/tools/submit-plan.d.ts +16 -0
- package/dist/tools/submit-plan.d.ts.map +1 -0
- package/dist/tools/submit-plan.js +151 -0
- package/dist/tools/submit-plan.js.map +1 -0
- package/dist/tools/submit-test.d.ts +15 -0
- package/dist/tools/submit-test.d.ts.map +1 -0
- package/dist/tools/submit-test.js +110 -0
- package/dist/tools/submit-test.js.map +1 -0
- package/dist/tools/update-backlog.d.ts +22 -0
- package/dist/tools/update-backlog.d.ts.map +1 -0
- package/dist/tools/update-backlog.js +94 -0
- package/dist/tools/update-backlog.js.map +1 -0
- package/dist/tools/update-project-context.d.ts +9 -0
- package/dist/tools/update-project-context.d.ts.map +1 -0
- package/dist/tools/update-project-context.js +81 -0
- package/dist/tools/update-project-context.js.map +1 -0
- package/dist/tools/update-task-status.d.ts +25 -0
- package/dist/tools/update-task-status.d.ts.map +1 -0
- package/dist/tools/update-task-status.js +160 -0
- package/dist/tools/update-task-status.js.map +1 -0
- package/dist/tools/watch-queue.d.ts +17 -0
- package/dist/tools/watch-queue.d.ts.map +1 -0
- package/dist/tools/watch-queue.js +132 -0
- package/dist/tools/watch-queue.js.map +1 -0
- package/dist/types/memory.d.ts +44 -0
- package/dist/types/memory.d.ts.map +1 -0
- package/dist/types/memory.js +2 -0
- package/dist/types/memory.js.map +1 -0
- package/dist/types/message.d.ts +25 -0
- package/dist/types/message.d.ts.map +1 -0
- package/dist/types/message.js +2 -0
- package/dist/types/message.js.map +1 -0
- package/dist/types/task.d.ts +113 -0
- package/dist/types/task.d.ts.map +1 -0
- package/dist/types/task.js +2 -0
- package/dist/types/task.js.map +1 -0
- package/dist/utils/ansi-table.d.ts +41 -0
- package/dist/utils/ansi-table.d.ts.map +1 -0
- package/dist/utils/ansi-table.js +139 -0
- package/dist/utils/ansi-table.js.map +1 -0
- package/dist/utils/court.d.ts +22 -0
- package/dist/utils/court.d.ts.map +1 -0
- package/dist/utils/court.js +76 -0
- package/dist/utils/court.js.map +1 -0
- package/dist/utils/court.test.d.ts +2 -0
- package/dist/utils/court.test.d.ts.map +1 -0
- package/dist/utils/court.test.js +151 -0
- package/dist/utils/court.test.js.map +1 -0
- package/dist/utils/file-lock.d.ts +4 -0
- package/dist/utils/file-lock.d.ts.map +1 -0
- package/dist/utils/file-lock.js +59 -0
- package/dist/utils/file-lock.js.map +1 -0
- package/dist/utils/format.d.ts +7 -0
- package/dist/utils/format.d.ts.map +1 -0
- package/dist/utils/format.js +33 -0
- package/dist/utils/format.js.map +1 -0
- package/dist/utils/init-project.d.ts +5 -0
- package/dist/utils/init-project.d.ts.map +1 -0
- package/dist/utils/init-project.js +89 -0
- package/dist/utils/init-project.js.map +1 -0
- package/dist/utils/logger.d.ts +16 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +53 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/memory.d.ts +60 -0
- package/dist/utils/memory.d.ts.map +1 -0
- package/dist/utils/memory.js +403 -0
- package/dist/utils/memory.js.map +1 -0
- package/dist/utils/permission.d.ts +34 -0
- package/dist/utils/permission.d.ts.map +1 -0
- package/dist/utils/permission.js +52 -0
- package/dist/utils/permission.js.map +1 -0
- package/dist/utils/permission.test.d.ts +2 -0
- package/dist/utils/permission.test.d.ts.map +1 -0
- package/dist/utils/permission.test.js +26 -0
- package/dist/utils/permission.test.js.map +1 -0
- package/dist/utils/queue.d.ts +55 -0
- package/dist/utils/queue.d.ts.map +1 -0
- package/dist/utils/queue.js +705 -0
- package/dist/utils/queue.js.map +1 -0
- package/dist/utils/status-transition.d.ts +57 -0
- package/dist/utils/status-transition.d.ts.map +1 -0
- package/dist/utils/status-transition.js +94 -0
- package/dist/utils/status-transition.js.map +1 -0
- package/dist/utils/task-archive.d.ts +33 -0
- package/dist/utils/task-archive.d.ts.map +1 -0
- package/dist/utils/task-archive.js +233 -0
- package/dist/utils/task-archive.js.map +1 -0
- package/dist/utils/task-manager.d.ts +67 -0
- package/dist/utils/task-manager.d.ts.map +1 -0
- package/dist/utils/task-manager.js +225 -0
- package/dist/utils/task-manager.js.map +1 -0
- package/dist/utils/team-session.d.ts +99 -0
- package/dist/utils/team-session.d.ts.map +1 -0
- package/dist/utils/team-session.js +585 -0
- package/dist/utils/team-session.js.map +1 -0
- package/dist/utils/validation.d.ts +40 -0
- package/dist/utils/validation.d.ts.map +1 -0
- package/dist/utils/validation.js +57 -0
- package/dist/utils/validation.js.map +1 -0
- package/dist/utils/wezterm.d.ts +23 -0
- package/dist/utils/wezterm.d.ts.map +1 -0
- package/dist/utils/wezterm.js +189 -0
- package/dist/utils/wezterm.js.map +1 -0
- package/package.json +60 -0
- package/templates/skills/report-template.md +58 -0
- package/templates/skills/review-code.md +83 -0
- package/templates/skills/review-plan.md +65 -0
- package/templates/skills/strict-review.md +83 -0
- package/templates/skills/strict-workflow.md +48 -0
- package/templates/skills/tdd.md +50 -0
- package/templates/start-team-skill.md +61 -0
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import * as fs from 'fs/promises';
|
|
2
|
+
import * as path from 'path';
|
|
3
|
+
import { fileURLToPath } from 'url';
|
|
4
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
5
|
+
const __dirname = path.dirname(__filename);
|
|
6
|
+
export async function initProject(projectPath, options = {}) {
|
|
7
|
+
const absoluteProjectPath = path.resolve(projectPath);
|
|
8
|
+
const devTeamDir = path.join(absoluteProjectPath, '.dev-team');
|
|
9
|
+
const claudeSkillsDir = path.join(absoluteProjectPath, '.claude', 'skills', 'start-team');
|
|
10
|
+
// Check if .dev-team already exists
|
|
11
|
+
if (!options.force) {
|
|
12
|
+
try {
|
|
13
|
+
await fs.access(devTeamDir);
|
|
14
|
+
throw new Error(`.dev-team directory already exists. Use --force to overwrite.`);
|
|
15
|
+
}
|
|
16
|
+
catch (err) {
|
|
17
|
+
if (err.code !== 'ENOENT' &&
|
|
18
|
+
!(err instanceof Error && err.message.includes('ENOENT'))) {
|
|
19
|
+
throw err;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
// Get paths to source files
|
|
24
|
+
const mcpServerRoot = path.resolve(__dirname, '..', '..');
|
|
25
|
+
const promptsDir = path.join(mcpServerRoot, 'prompts');
|
|
26
|
+
const templatesDir = path.join(mcpServerRoot, 'templates');
|
|
27
|
+
// Read template and prompt files first to fail early if missing
|
|
28
|
+
const templateContent = await fs.readFile(path.join(templatesDir, 'start-team-skill.md'), 'utf-8');
|
|
29
|
+
const pmPrompt = await fs.readFile(path.join(promptsDir, 'pm.md'), 'utf-8');
|
|
30
|
+
const leaderPrompt = await fs.readFile(path.join(promptsDir, 'leader.md'), 'utf-8');
|
|
31
|
+
const memberPrompt = await fs.readFile(path.join(promptsDir, 'member.md'), 'utf-8');
|
|
32
|
+
// Read skill templates
|
|
33
|
+
const skillsDir = path.join(templatesDir, 'skills');
|
|
34
|
+
const roleSkills = {
|
|
35
|
+
'leader': ['strict-review', 'review-plan', 'review-code'],
|
|
36
|
+
'member-01': ['strict-workflow', 'tdd', 'report-template'],
|
|
37
|
+
'member-02': ['strict-workflow', 'tdd', 'report-template'],
|
|
38
|
+
};
|
|
39
|
+
const allSkillNames = [...new Set(Object.values(roleSkills).flat())];
|
|
40
|
+
const skillContents = {};
|
|
41
|
+
for (const skillName of allSkillNames) {
|
|
42
|
+
skillContents[skillName] = await fs.readFile(path.join(skillsDir, `${skillName}.md`), 'utf-8');
|
|
43
|
+
}
|
|
44
|
+
// Create directory structure
|
|
45
|
+
const workspaceDirs = ['pm', 'leader', 'member-01', 'member-02'];
|
|
46
|
+
// Create .dev-team directories
|
|
47
|
+
await fs.mkdir(devTeamDir, { recursive: true });
|
|
48
|
+
await fs.mkdir(path.join(devTeamDir, 'queue'), { recursive: true });
|
|
49
|
+
// Create workspace directories and skill directories
|
|
50
|
+
for (const dir of workspaceDirs) {
|
|
51
|
+
await fs.mkdir(path.join(devTeamDir, 'workspaces', dir), { recursive: true });
|
|
52
|
+
if (roleSkills[dir]) {
|
|
53
|
+
const workspaceSkillsDir = path.join(devTeamDir, 'workspaces', dir, '.claude', 'skills');
|
|
54
|
+
await fs.mkdir(workspaceSkillsDir, { recursive: true });
|
|
55
|
+
for (const skillName of roleSkills[dir]) {
|
|
56
|
+
await fs.writeFile(path.join(workspaceSkillsDir, `${skillName}.md`), skillContents[skillName]);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
// Create .claude/skills/start-team directory
|
|
61
|
+
await fs.mkdir(claudeSkillsDir, { recursive: true });
|
|
62
|
+
// Copy CLAUDE.md files
|
|
63
|
+
await fs.writeFile(path.join(devTeamDir, 'workspaces', 'pm', 'CLAUDE.md'), pmPrompt);
|
|
64
|
+
await fs.writeFile(path.join(devTeamDir, 'workspaces', 'leader', 'CLAUDE.md'), leaderPrompt);
|
|
65
|
+
await fs.writeFile(path.join(devTeamDir, 'workspaces', 'member-01', 'CLAUDE.md'), memberPrompt);
|
|
66
|
+
await fs.writeFile(path.join(devTeamDir, 'workspaces', 'member-02', 'CLAUDE.md'), memberPrompt);
|
|
67
|
+
// Create SKILL.md with PROJECT_PATH replaced
|
|
68
|
+
const skillContent = templateContent.replace(/\{\{PROJECT_PATH\}\}/g, absoluteProjectPath);
|
|
69
|
+
await fs.writeFile(path.join(claudeSkillsDir, 'SKILL.md'), skillContent);
|
|
70
|
+
// Initialize dashboard.json
|
|
71
|
+
const initialDashboard = {
|
|
72
|
+
projectName: path.basename(absoluteProjectPath),
|
|
73
|
+
lastUpdated: new Date().toISOString(),
|
|
74
|
+
currentPhase: 'planning',
|
|
75
|
+
tasks: {
|
|
76
|
+
pending: 0,
|
|
77
|
+
inProgress: 0,
|
|
78
|
+
completed: 0,
|
|
79
|
+
blocked: 0,
|
|
80
|
+
total: 0,
|
|
81
|
+
},
|
|
82
|
+
recentActivity: [],
|
|
83
|
+
pendingApprovals: [],
|
|
84
|
+
memberStatus: {},
|
|
85
|
+
taskList: [],
|
|
86
|
+
};
|
|
87
|
+
await fs.writeFile(path.join(devTeamDir, 'dashboard.json'), JSON.stringify(initialDashboard, null, 2));
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=init-project.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init-project.js","sourceRoot":"","sources":["../../src/utils/init-project.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { Role } from '../types/task.js';
|
|
2
|
+
export type LogLevel = 'debug' | 'info' | 'warn' | 'error';
|
|
3
|
+
export interface LogEntry {
|
|
4
|
+
timestamp: string;
|
|
5
|
+
level: LogLevel;
|
|
6
|
+
role?: Role;
|
|
7
|
+
message: string;
|
|
8
|
+
data?: unknown;
|
|
9
|
+
}
|
|
10
|
+
export declare function setLogLevel(level: LogLevel): void;
|
|
11
|
+
export declare function log(level: LogLevel, message: string, data?: unknown, role?: Role): void;
|
|
12
|
+
export declare function debug(message: string, data?: unknown, role?: Role): void;
|
|
13
|
+
export declare function info(message: string, data?: unknown, role?: Role): void;
|
|
14
|
+
export declare function warn(message: string, data?: unknown, role?: Role): void;
|
|
15
|
+
export declare function error(message: string, data?: unknown, role?: Role): void;
|
|
16
|
+
//# sourceMappingURL=logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAExC,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAE3D,MAAM,WAAW,QAAQ;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,QAAQ,CAAC;IAChB,IAAI,CAAC,EAAE,IAAI,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;CAClB;AAWD,wBAAgB,WAAW,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI,CAEjD;AAYD,wBAAgB,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,CAuBvF;AAED,wBAAgB,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,CAExE;AAED,wBAAgB,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,CAEvE;AAED,wBAAgB,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,CAEvE;AAED,wBAAgB,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,CAExE"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
const LOG_LEVEL_PRIORITY = {
|
|
2
|
+
debug: 0,
|
|
3
|
+
info: 1,
|
|
4
|
+
warn: 2,
|
|
5
|
+
error: 3,
|
|
6
|
+
};
|
|
7
|
+
let currentLogLevel = 'info';
|
|
8
|
+
export function setLogLevel(level) {
|
|
9
|
+
currentLogLevel = level;
|
|
10
|
+
}
|
|
11
|
+
function shouldLog(level) {
|
|
12
|
+
return LOG_LEVEL_PRIORITY[level] >= LOG_LEVEL_PRIORITY[currentLogLevel];
|
|
13
|
+
}
|
|
14
|
+
function formatLog(entry) {
|
|
15
|
+
const rolePrefix = entry.role ? `[${entry.role}] ` : '';
|
|
16
|
+
const dataStr = entry.data ? ` ${JSON.stringify(entry.data)}` : '';
|
|
17
|
+
return `${entry.timestamp} [${entry.level.toUpperCase()}] ${rolePrefix}${entry.message}${dataStr}`;
|
|
18
|
+
}
|
|
19
|
+
export function log(level, message, data, role) {
|
|
20
|
+
if (!shouldLog(level))
|
|
21
|
+
return;
|
|
22
|
+
const entry = {
|
|
23
|
+
timestamp: new Date().toISOString(),
|
|
24
|
+
level,
|
|
25
|
+
role,
|
|
26
|
+
message,
|
|
27
|
+
data,
|
|
28
|
+
};
|
|
29
|
+
const formatted = formatLog(entry);
|
|
30
|
+
switch (level) {
|
|
31
|
+
case 'error':
|
|
32
|
+
console.error(formatted);
|
|
33
|
+
break;
|
|
34
|
+
case 'warn':
|
|
35
|
+
console.warn(formatted);
|
|
36
|
+
break;
|
|
37
|
+
default:
|
|
38
|
+
console.log(formatted);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
export function debug(message, data, role) {
|
|
42
|
+
log('debug', message, data, role);
|
|
43
|
+
}
|
|
44
|
+
export function info(message, data, role) {
|
|
45
|
+
log('info', message, data, role);
|
|
46
|
+
}
|
|
47
|
+
export function warn(message, data, role) {
|
|
48
|
+
log('warn', message, data, role);
|
|
49
|
+
}
|
|
50
|
+
export function error(message, data, role) {
|
|
51
|
+
log('error', message, data, role);
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAYA,MAAM,kBAAkB,GAA6B;IACjD,KAAK,EAAE,CAAC;IACR,IAAI,EAAE,CAAC;IACP,IAAI,EAAE,CAAC;IACP,KAAK,EAAE,CAAC;CACX,CAAC;AAEF,IAAI,eAAe,GAAa,MAAM,CAAC;AAEvC,MAAM,UAAU,WAAW,CAAC,KAAe;IACvC,eAAe,GAAG,KAAK,CAAC;AAC5B,CAAC;AAED,SAAS,SAAS,CAAC,KAAe;IAC9B,OAAO,kBAAkB,CAAC,KAAK,CAAC,IAAI,kBAAkB,CAAC,eAAe,CAAC,CAAC;AAC5E,CAAC;AAED,SAAS,SAAS,CAAC,KAAe;IAC9B,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;IACxD,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACnE,OAAO,GAAG,KAAK,CAAC,SAAS,KAAK,KAAK,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,UAAU,GAAG,KAAK,CAAC,OAAO,GAAG,OAAO,EAAE,CAAC;AACvG,CAAC;AAED,MAAM,UAAU,GAAG,CAAC,KAAe,EAAE,OAAe,EAAE,IAAc,EAAE,IAAW;IAC7E,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;QAAE,OAAO;IAE9B,MAAM,KAAK,GAAa;QACpB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,KAAK;QACL,IAAI;QACJ,OAAO;QACP,IAAI;KACP,CAAC;IAEF,MAAM,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;IAEnC,QAAQ,KAAK,EAAE,CAAC;QACZ,KAAK,OAAO;YACR,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;YACzB,MAAM;QACV,KAAK,MAAM;YACP,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACxB,MAAM;QACV;YACI,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IAC/B,CAAC;AACL,CAAC;AAED,MAAM,UAAU,KAAK,CAAC,OAAe,EAAE,IAAc,EAAE,IAAW;IAC9D,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AACtC,CAAC;AAED,MAAM,UAAU,IAAI,CAAC,OAAe,EAAE,IAAc,EAAE,IAAW;IAC7D,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,IAAI,CAAC,OAAe,EAAE,IAAc,EAAE,IAAW;IAC7D,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,KAAK,CAAC,OAAe,EAAE,IAAc,EAAE,IAAW;IAC9D,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AACtC,CAAC"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { MemoryEntry, MemoryType, ProjectContext, ProjectContextSection } from '../types/memory.js';
|
|
2
|
+
import { Role } from '../types/task.js';
|
|
3
|
+
export declare function getMemoryDir(): string;
|
|
4
|
+
export declare function getMemoriesPath(): string;
|
|
5
|
+
export declare function getProjectContextPath(): string;
|
|
6
|
+
/**
|
|
7
|
+
* memory ディレクトリと初期ファイルを作成
|
|
8
|
+
*/
|
|
9
|
+
export declare function ensureMemoryStructure(): Promise<void>;
|
|
10
|
+
/**
|
|
11
|
+
* メモリを保存(JSONL形式で追記)
|
|
12
|
+
*/
|
|
13
|
+
export declare function saveMemory(role: Role, type: MemoryType, title: string, content: string, tags?: string[]): Promise<MemoryEntry>;
|
|
14
|
+
/**
|
|
15
|
+
* メモリを検索
|
|
16
|
+
*/
|
|
17
|
+
export declare function recallMemory(query?: string, type?: MemoryType, tags?: string[], limit?: number): Promise<MemoryEntry[]>;
|
|
18
|
+
/**
|
|
19
|
+
* project.md をパースしてProjectContextを取得
|
|
20
|
+
*/
|
|
21
|
+
export declare function getProjectContext(): Promise<ProjectContext>;
|
|
22
|
+
/**
|
|
23
|
+
* プロジェクトコンテキストの特定セクションを更新
|
|
24
|
+
*/
|
|
25
|
+
export declare function updateProjectContext(section: ProjectContextSection, content: string, append?: boolean): Promise<ProjectContext>;
|
|
26
|
+
/**
|
|
27
|
+
* プロジェクトコンテキストの特定セクションのみ取得
|
|
28
|
+
*/
|
|
29
|
+
export declare function getProjectContextSection(context: ProjectContext, section: ProjectContextSection): string;
|
|
30
|
+
/**
|
|
31
|
+
* メンバーのタスク情報
|
|
32
|
+
*/
|
|
33
|
+
export interface MemberTaskInfo {
|
|
34
|
+
taskId: string;
|
|
35
|
+
title: string;
|
|
36
|
+
phase: string;
|
|
37
|
+
startTime: string;
|
|
38
|
+
memo?: string;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* current_stateの内容をパースしてメンバーごとのタスク情報を抽出
|
|
42
|
+
*/
|
|
43
|
+
export declare function parseCurrentStateSections(content: string): Record<string, MemberTaskInfo>;
|
|
44
|
+
/**
|
|
45
|
+
* メンバータスク情報からcurrent_state用のMarkdownを生成
|
|
46
|
+
*/
|
|
47
|
+
export declare function generateCurrentStateMarkdown(sections: Record<string, MemberTaskInfo>, lastUpdated: string): string;
|
|
48
|
+
/**
|
|
49
|
+
* レビューモードを取得
|
|
50
|
+
* preferencesセクションからreviewModeを読み取る
|
|
51
|
+
* デフォルトは'normal'
|
|
52
|
+
*/
|
|
53
|
+
export declare function getReviewMode(): Promise<'normal' | 'strict'>;
|
|
54
|
+
/**
|
|
55
|
+
* タスク分割承認モードを取得
|
|
56
|
+
* preferencesセクションからtaskSplitApprovalを読み取る
|
|
57
|
+
* デフォルトはauto(承認不要)
|
|
58
|
+
*/
|
|
59
|
+
export declare function getTaskSplitApproval(): Promise<'auto' | 'required'>;
|
|
60
|
+
//# sourceMappingURL=memory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../src/utils/memory.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAIpG,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAGxC,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAED,wBAAgB,qBAAqB,IAAI,MAAM,CAE9C;AAsDD;;GAEG;AACH,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC,CAqB3D;AAED;;GAEG;AACH,wBAAsB,UAAU,CAC5B,IAAI,EAAE,IAAI,EACV,IAAI,EAAE,UAAU,EAChB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,IAAI,CAAC,EAAE,MAAM,EAAE,GAChB,OAAO,CAAC,WAAW,CAAC,CAuBtB;AAED;;GAEG;AACH,wBAAsB,YAAY,CAC9B,KAAK,CAAC,EAAE,MAAM,EACd,IAAI,CAAC,EAAE,UAAU,EACjB,IAAI,CAAC,EAAE,MAAM,EAAE,EACf,KAAK,GAAE,MAAW,GACnB,OAAO,CAAC,WAAW,EAAE,CAAC,CAoDxB;AAED;;GAEG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,cAAc,CAAC,CAsBjE;AA+ED;;GAEG;AACH,wBAAsB,oBAAoB,CACtC,OAAO,EAAE,qBAAqB,EAC9B,OAAO,EAAE,MAAM,EACf,MAAM,GAAE,OAAe,GACxB,OAAO,CAAC,cAAc,CAAC,CAqCzB;AAsBD;;GAEG;AACH,wBAAgB,wBAAwB,CACpC,OAAO,EAAE,cAAc,EACvB,OAAO,EAAE,qBAAqB,GAC/B,MAAM,CAGR;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAkCzF;AAED;;GAEG;AACH,wBAAgB,4BAA4B,CACxC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,EACxC,WAAW,EAAE,MAAM,GACpB,MAAM,CAyBR;AAED;;;;GAIG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,QAAQ,GAAG,QAAQ,CAAC,CAOlE;AAED;;;;GAIG;AACH,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,MAAM,GAAG,UAAU,CAAC,CASzE"}
|
|
@@ -0,0 +1,403 @@
|
|
|
1
|
+
import * as fs from 'fs/promises';
|
|
2
|
+
import * as path from 'path';
|
|
3
|
+
import { getDevTeamPath, generateMessageId } from './queue.js';
|
|
4
|
+
import { withFileLock, ensureFileExists } from './file-lock.js';
|
|
5
|
+
import { info, debug } from './logger.js';
|
|
6
|
+
// パス取得関数
|
|
7
|
+
export function getMemoryDir() {
|
|
8
|
+
return path.join(getDevTeamPath(), 'memory');
|
|
9
|
+
}
|
|
10
|
+
export function getMemoriesPath() {
|
|
11
|
+
return path.join(getMemoryDir(), 'memories.jsonl');
|
|
12
|
+
}
|
|
13
|
+
export function getProjectContextPath() {
|
|
14
|
+
return path.join(getMemoryDir(), 'project.md');
|
|
15
|
+
}
|
|
16
|
+
// project.md の初期テンプレート
|
|
17
|
+
const PROJECT_CONTEXT_TEMPLATE = `# Project Context
|
|
18
|
+
|
|
19
|
+
## What
|
|
20
|
+
(未設定)
|
|
21
|
+
|
|
22
|
+
## Why
|
|
23
|
+
(未設定)
|
|
24
|
+
|
|
25
|
+
## Who
|
|
26
|
+
(未設定)
|
|
27
|
+
|
|
28
|
+
## Constraints
|
|
29
|
+
(未設定)
|
|
30
|
+
|
|
31
|
+
## Current State
|
|
32
|
+
(未設定)
|
|
33
|
+
|
|
34
|
+
## Decisions
|
|
35
|
+
(未設定)
|
|
36
|
+
|
|
37
|
+
## Notes
|
|
38
|
+
(未設定)
|
|
39
|
+
|
|
40
|
+
## Preferences
|
|
41
|
+
(未設定)
|
|
42
|
+
`;
|
|
43
|
+
// セクション名のマッピング(snake_case -> Markdown見出し)
|
|
44
|
+
const SECTION_HEADERS = {
|
|
45
|
+
'what': 'What',
|
|
46
|
+
'why': 'Why',
|
|
47
|
+
'who': 'Who',
|
|
48
|
+
'constraints': 'Constraints',
|
|
49
|
+
'current_state': 'Current State',
|
|
50
|
+
'decisions': 'Decisions',
|
|
51
|
+
'notes': 'Notes',
|
|
52
|
+
'preferences': 'Preferences',
|
|
53
|
+
};
|
|
54
|
+
// セクションの順序
|
|
55
|
+
const SECTION_ORDER = [
|
|
56
|
+
'what',
|
|
57
|
+
'why',
|
|
58
|
+
'who',
|
|
59
|
+
'constraints',
|
|
60
|
+
'current_state',
|
|
61
|
+
'decisions',
|
|
62
|
+
'notes',
|
|
63
|
+
'preferences',
|
|
64
|
+
];
|
|
65
|
+
/**
|
|
66
|
+
* memory ディレクトリと初期ファイルを作成
|
|
67
|
+
*/
|
|
68
|
+
export async function ensureMemoryStructure() {
|
|
69
|
+
const memoryDir = getMemoryDir();
|
|
70
|
+
await fs.mkdir(memoryDir, { recursive: true });
|
|
71
|
+
// memories.jsonl の初期化(存在しない場合のみ)
|
|
72
|
+
const memoriesPath = getMemoriesPath();
|
|
73
|
+
try {
|
|
74
|
+
await fs.access(memoriesPath);
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
await fs.writeFile(memoriesPath, '', 'utf-8');
|
|
78
|
+
info('Created memories.jsonl');
|
|
79
|
+
}
|
|
80
|
+
// project.md の初期化(存在しない場合のみ)
|
|
81
|
+
const projectPath = getProjectContextPath();
|
|
82
|
+
try {
|
|
83
|
+
await fs.access(projectPath);
|
|
84
|
+
}
|
|
85
|
+
catch {
|
|
86
|
+
await fs.writeFile(projectPath, PROJECT_CONTEXT_TEMPLATE, 'utf-8');
|
|
87
|
+
info('Created project.md with template');
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* メモリを保存(JSONL形式で追記)
|
|
92
|
+
*/
|
|
93
|
+
export async function saveMemory(role, type, title, content, tags) {
|
|
94
|
+
const memoriesPath = getMemoriesPath();
|
|
95
|
+
await ensureFileExists(memoriesPath);
|
|
96
|
+
const id = generateMessageId();
|
|
97
|
+
const entry = {
|
|
98
|
+
id: `memory-${id}`,
|
|
99
|
+
timestamp: new Date().toISOString(),
|
|
100
|
+
role,
|
|
101
|
+
type,
|
|
102
|
+
title,
|
|
103
|
+
content,
|
|
104
|
+
tags,
|
|
105
|
+
};
|
|
106
|
+
await withFileLock(memoriesPath, async () => {
|
|
107
|
+
// JSONL形式で追記
|
|
108
|
+
const line = JSON.stringify(entry) + '\n';
|
|
109
|
+
await fs.appendFile(memoriesPath, line, 'utf-8');
|
|
110
|
+
});
|
|
111
|
+
info(`Memory saved: ${entry.id}`, { type, title, role });
|
|
112
|
+
return entry;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* メモリを検索
|
|
116
|
+
*/
|
|
117
|
+
export async function recallMemory(query, type, tags, limit = 10) {
|
|
118
|
+
const memoriesPath = getMemoriesPath();
|
|
119
|
+
try {
|
|
120
|
+
await fs.access(memoriesPath);
|
|
121
|
+
}
|
|
122
|
+
catch {
|
|
123
|
+
return [];
|
|
124
|
+
}
|
|
125
|
+
const content = await fs.readFile(memoriesPath, 'utf-8');
|
|
126
|
+
const lines = content.trim().split('\n').filter(line => line.length > 0);
|
|
127
|
+
const entries = [];
|
|
128
|
+
for (const line of lines) {
|
|
129
|
+
try {
|
|
130
|
+
const entry = JSON.parse(line);
|
|
131
|
+
entries.push(entry);
|
|
132
|
+
}
|
|
133
|
+
catch (err) {
|
|
134
|
+
debug(`Failed to parse memory line: ${line}`, err);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
// フィルタリング
|
|
138
|
+
let filtered = entries;
|
|
139
|
+
// type フィルタ
|
|
140
|
+
if (type) {
|
|
141
|
+
filtered = filtered.filter(e => e.type === type);
|
|
142
|
+
}
|
|
143
|
+
// tags フィルタ(OR検索)
|
|
144
|
+
if (tags && tags.length > 0) {
|
|
145
|
+
filtered = filtered.filter(e => {
|
|
146
|
+
if (!e.tags)
|
|
147
|
+
return false;
|
|
148
|
+
return tags.some(tag => e.tags.includes(tag));
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
// query フィルタ(title, content を検索)
|
|
152
|
+
if (query) {
|
|
153
|
+
const lowerQuery = query.toLowerCase();
|
|
154
|
+
filtered = filtered.filter(e => {
|
|
155
|
+
const titleMatch = e.title.toLowerCase().includes(lowerQuery);
|
|
156
|
+
const contentMatch = e.content.toLowerCase().includes(lowerQuery);
|
|
157
|
+
const tagMatch = e.tags?.some(t => t.toLowerCase().includes(lowerQuery)) ?? false;
|
|
158
|
+
return titleMatch || contentMatch || tagMatch;
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
// 新しい順にソートして上限を適用
|
|
162
|
+
filtered.sort((a, b) => new Date(b.timestamp).getTime() - new Date(a.timestamp).getTime());
|
|
163
|
+
return filtered.slice(0, limit);
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* project.md をパースしてProjectContextを取得
|
|
167
|
+
*/
|
|
168
|
+
export async function getProjectContext() {
|
|
169
|
+
const projectPath = getProjectContextPath();
|
|
170
|
+
let content;
|
|
171
|
+
try {
|
|
172
|
+
content = await fs.readFile(projectPath, 'utf-8');
|
|
173
|
+
}
|
|
174
|
+
catch {
|
|
175
|
+
// ファイルが存在しない場合はデフォルト値を返す
|
|
176
|
+
return {
|
|
177
|
+
what: '(未設定)',
|
|
178
|
+
why: '(未設定)',
|
|
179
|
+
who: '(未設定)',
|
|
180
|
+
constraints: '(未設定)',
|
|
181
|
+
currentState: '(未設定)',
|
|
182
|
+
decisions: '(未設定)',
|
|
183
|
+
notes: '(未設定)',
|
|
184
|
+
preferences: '(未設定)',
|
|
185
|
+
lastUpdated: new Date().toISOString(),
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
return parseProjectContext(content);
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Markdown文字列をパースしてProjectContextを生成
|
|
192
|
+
*/
|
|
193
|
+
function parseProjectContext(markdown) {
|
|
194
|
+
const context = {
|
|
195
|
+
what: '',
|
|
196
|
+
why: '',
|
|
197
|
+
who: '',
|
|
198
|
+
constraints: '',
|
|
199
|
+
currentState: '',
|
|
200
|
+
decisions: '',
|
|
201
|
+
notes: '',
|
|
202
|
+
preferences: '',
|
|
203
|
+
lastUpdated: new Date().toISOString(),
|
|
204
|
+
};
|
|
205
|
+
// セクションごとに分割
|
|
206
|
+
const sectionRegex = /^## (.+)$/gm;
|
|
207
|
+
const sections = [];
|
|
208
|
+
let match;
|
|
209
|
+
while ((match = sectionRegex.exec(markdown)) !== null) {
|
|
210
|
+
if (sections.length > 0) {
|
|
211
|
+
sections[sections.length - 1].end = match.index;
|
|
212
|
+
}
|
|
213
|
+
sections.push({
|
|
214
|
+
name: match[1].trim(),
|
|
215
|
+
start: match.index + match[0].length,
|
|
216
|
+
});
|
|
217
|
+
}
|
|
218
|
+
if (sections.length > 0) {
|
|
219
|
+
sections[sections.length - 1].end = markdown.length;
|
|
220
|
+
}
|
|
221
|
+
// 各セクションの内容を抽出
|
|
222
|
+
for (const section of sections) {
|
|
223
|
+
const sectionContent = markdown.substring(section.start, section.end).trim();
|
|
224
|
+
// セクション名をキーにマッピング
|
|
225
|
+
const key = Object.entries(SECTION_HEADERS).find(([_, header]) => header.toLowerCase() === section.name.toLowerCase())?.[0];
|
|
226
|
+
if (key) {
|
|
227
|
+
switch (key) {
|
|
228
|
+
case 'what':
|
|
229
|
+
context.what = sectionContent;
|
|
230
|
+
break;
|
|
231
|
+
case 'why':
|
|
232
|
+
context.why = sectionContent;
|
|
233
|
+
break;
|
|
234
|
+
case 'who':
|
|
235
|
+
context.who = sectionContent;
|
|
236
|
+
break;
|
|
237
|
+
case 'constraints':
|
|
238
|
+
context.constraints = sectionContent;
|
|
239
|
+
break;
|
|
240
|
+
case 'current_state':
|
|
241
|
+
context.currentState = sectionContent;
|
|
242
|
+
break;
|
|
243
|
+
case 'decisions':
|
|
244
|
+
context.decisions = sectionContent;
|
|
245
|
+
break;
|
|
246
|
+
case 'notes':
|
|
247
|
+
context.notes = sectionContent;
|
|
248
|
+
break;
|
|
249
|
+
case 'preferences':
|
|
250
|
+
context.preferences = sectionContent;
|
|
251
|
+
break;
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
return context;
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* プロジェクトコンテキストの特定セクションを更新
|
|
259
|
+
*/
|
|
260
|
+
export async function updateProjectContext(section, content, append = false) {
|
|
261
|
+
const projectPath = getProjectContextPath();
|
|
262
|
+
await ensureFileExists(projectPath);
|
|
263
|
+
// コンテンツ内の ## を ### に変換して、パース時のセクション検出との衝突を回避
|
|
264
|
+
const sanitizedContent = content.replace(/^## /gm, '### ');
|
|
265
|
+
return withFileLock(projectPath, async () => {
|
|
266
|
+
let markdown;
|
|
267
|
+
try {
|
|
268
|
+
markdown = await fs.readFile(projectPath, 'utf-8');
|
|
269
|
+
}
|
|
270
|
+
catch {
|
|
271
|
+
markdown = PROJECT_CONTEXT_TEMPLATE;
|
|
272
|
+
}
|
|
273
|
+
// 現在のコンテキストをパース
|
|
274
|
+
const context = parseProjectContext(markdown);
|
|
275
|
+
// セクションを更新
|
|
276
|
+
const sectionKey = section === 'current_state' ? 'currentState' : section;
|
|
277
|
+
if (append) {
|
|
278
|
+
const currentValue = context[sectionKey];
|
|
279
|
+
const separator = currentValue && currentValue !== '(未設定)' ? '\n\n' : '';
|
|
280
|
+
context[sectionKey] =
|
|
281
|
+
(currentValue === '(未設定)' ? '' : currentValue) + separator + sanitizedContent;
|
|
282
|
+
}
|
|
283
|
+
else {
|
|
284
|
+
context[sectionKey] = sanitizedContent;
|
|
285
|
+
}
|
|
286
|
+
context.lastUpdated = new Date().toISOString();
|
|
287
|
+
// Markdownを再生成
|
|
288
|
+
const newMarkdown = generateProjectContextMarkdown(context);
|
|
289
|
+
await fs.writeFile(projectPath, newMarkdown, 'utf-8');
|
|
290
|
+
info(`Project context updated: ${section}`, { append });
|
|
291
|
+
return context;
|
|
292
|
+
});
|
|
293
|
+
}
|
|
294
|
+
/**
|
|
295
|
+
* ProjectContextからMarkdownを生成
|
|
296
|
+
*/
|
|
297
|
+
function generateProjectContextMarkdown(context) {
|
|
298
|
+
const lines = ['# Project Context', ''];
|
|
299
|
+
for (const section of SECTION_ORDER) {
|
|
300
|
+
const header = SECTION_HEADERS[section];
|
|
301
|
+
lines.push(`## ${header}`);
|
|
302
|
+
// セクションキーを取得
|
|
303
|
+
const key = section === 'current_state' ? 'currentState' : section;
|
|
304
|
+
const content = context[key] || '(未設定)';
|
|
305
|
+
lines.push(content);
|
|
306
|
+
lines.push('');
|
|
307
|
+
}
|
|
308
|
+
return lines.join('\n');
|
|
309
|
+
}
|
|
310
|
+
/**
|
|
311
|
+
* プロジェクトコンテキストの特定セクションのみ取得
|
|
312
|
+
*/
|
|
313
|
+
export function getProjectContextSection(context, section) {
|
|
314
|
+
const key = section === 'current_state' ? 'currentState' : section;
|
|
315
|
+
return context[key] || '(未設定)';
|
|
316
|
+
}
|
|
317
|
+
/**
|
|
318
|
+
* current_stateの内容をパースしてメンバーごとのタスク情報を抽出
|
|
319
|
+
*/
|
|
320
|
+
export function parseCurrentStateSections(content) {
|
|
321
|
+
const sections = {};
|
|
322
|
+
if (!content || content === '(未設定)') {
|
|
323
|
+
return sections;
|
|
324
|
+
}
|
|
325
|
+
// ### member-XX のセクションを検索
|
|
326
|
+
const memberRegex = /### (member-\d+)\n([\s\S]*?)(?=### member-\d+|## |$)/g;
|
|
327
|
+
let match;
|
|
328
|
+
while ((match = memberRegex.exec(content)) !== null) {
|
|
329
|
+
const memberName = match[1];
|
|
330
|
+
const sectionContent = match[2];
|
|
331
|
+
// 各フィールドを抽出
|
|
332
|
+
const taskIdMatch = sectionContent.match(/- タスクID: (T-\d+)/);
|
|
333
|
+
const titleMatch = sectionContent.match(/- タスク名: (.+)/);
|
|
334
|
+
const phaseMatch = sectionContent.match(/- フェーズ: (\w+)/);
|
|
335
|
+
const startMatch = sectionContent.match(/- 開始: (.+)/);
|
|
336
|
+
const memoMatch = sectionContent.match(/- メモ: (.+)/);
|
|
337
|
+
if (taskIdMatch && titleMatch && phaseMatch) {
|
|
338
|
+
sections[memberName] = {
|
|
339
|
+
taskId: taskIdMatch[1],
|
|
340
|
+
title: titleMatch[1].trim(),
|
|
341
|
+
phase: phaseMatch[1],
|
|
342
|
+
startTime: startMatch ? startMatch[1].trim() : new Date().toISOString(),
|
|
343
|
+
memo: memoMatch ? memoMatch[1].trim() : undefined,
|
|
344
|
+
};
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
return sections;
|
|
348
|
+
}
|
|
349
|
+
/**
|
|
350
|
+
* メンバータスク情報からcurrent_state用のMarkdownを生成
|
|
351
|
+
*/
|
|
352
|
+
export function generateCurrentStateMarkdown(sections, lastUpdated) {
|
|
353
|
+
const memberNames = Object.keys(sections).sort();
|
|
354
|
+
if (memberNames.length === 0) {
|
|
355
|
+
return `## 進行中タスク\n\n(なし)\n\n## 最終更新\n${lastUpdated} by system`;
|
|
356
|
+
}
|
|
357
|
+
let markdown = '## 進行中タスク\n\n';
|
|
358
|
+
for (const memberName of memberNames) {
|
|
359
|
+
const task = sections[memberName];
|
|
360
|
+
markdown += `### ${memberName}\n`;
|
|
361
|
+
markdown += `- タスクID: ${task.taskId}\n`;
|
|
362
|
+
markdown += `- タスク名: ${task.title}\n`;
|
|
363
|
+
markdown += `- フェーズ: ${task.phase}\n`;
|
|
364
|
+
markdown += `- 開始: ${task.startTime}\n`;
|
|
365
|
+
if (task.memo) {
|
|
366
|
+
markdown += `- メモ: ${task.memo}\n`;
|
|
367
|
+
}
|
|
368
|
+
markdown += '\n';
|
|
369
|
+
}
|
|
370
|
+
markdown += `## 最終更新\n${lastUpdated} by system`;
|
|
371
|
+
return markdown;
|
|
372
|
+
}
|
|
373
|
+
/**
|
|
374
|
+
* レビューモードを取得
|
|
375
|
+
* preferencesセクションからreviewModeを読み取る
|
|
376
|
+
* デフォルトは'normal'
|
|
377
|
+
*/
|
|
378
|
+
export async function getReviewMode() {
|
|
379
|
+
const context = await getProjectContext();
|
|
380
|
+
if (!context.preferences || context.preferences === '(未設定)') {
|
|
381
|
+
return 'normal';
|
|
382
|
+
}
|
|
383
|
+
const match = context.preferences.match(/reviewMode:\s*(normal|strict)/);
|
|
384
|
+
return match ? match[1] : 'normal';
|
|
385
|
+
}
|
|
386
|
+
/**
|
|
387
|
+
* タスク分割承認モードを取得
|
|
388
|
+
* preferencesセクションからtaskSplitApprovalを読み取る
|
|
389
|
+
* デフォルトはauto(承認不要)
|
|
390
|
+
*/
|
|
391
|
+
export async function getTaskSplitApproval() {
|
|
392
|
+
const context = await getProjectContext();
|
|
393
|
+
if (!context.preferences || context.preferences === '(未設定)') {
|
|
394
|
+
return 'auto';
|
|
395
|
+
}
|
|
396
|
+
const match = context.preferences.match(/taskSplitApproval:\s*(auto|required|true|false)/);
|
|
397
|
+
if (!match)
|
|
398
|
+
return 'auto';
|
|
399
|
+
if (match[1] === 'required' || match[1] === 'true')
|
|
400
|
+
return 'required';
|
|
401
|
+
return 'auto';
|
|
402
|
+
}
|
|
403
|
+
//# sourceMappingURL=memory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory.js","sourceRoot":"","sources":["../../src/utils/memory.ts"],"names":[],"mappings":"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"}
|