intent-log 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 +64 -0
- package/dist/adapter/__tests__/claude-code-log-reader.test.d.ts +1 -0
- package/dist/adapter/__tests__/claude-code-log-reader.test.js +197 -0
- package/dist/adapter/__tests__/claude-code-log-reader.test.js.map +1 -0
- package/dist/adapter/__tests__/filesystem-repository.test.d.ts +1 -0
- package/dist/adapter/__tests__/filesystem-repository.test.js +152 -0
- package/dist/adapter/__tests__/filesystem-repository.test.js.map +1 -0
- package/dist/adapter/__tests__/privacy-filter.test.d.ts +1 -0
- package/dist/adapter/__tests__/privacy-filter.test.js +61 -0
- package/dist/adapter/__tests__/privacy-filter.test.js.map +1 -0
- package/dist/adapter/claude-code-log-reader.d.ts +11 -0
- package/dist/adapter/claude-code-log-reader.js +133 -0
- package/dist/adapter/claude-code-log-reader.js.map +1 -0
- package/dist/adapter/claude-code-summarizer.d.ts +6 -0
- package/dist/adapter/claude-code-summarizer.js +93 -0
- package/dist/adapter/claude-code-summarizer.js.map +1 -0
- package/dist/adapter/filesystem-repository.d.ts +39 -0
- package/dist/adapter/filesystem-repository.js +98 -0
- package/dist/adapter/filesystem-repository.js.map +1 -0
- package/dist/adapter/privacy-filter.d.ts +8 -0
- package/dist/adapter/privacy-filter.js +58 -0
- package/dist/adapter/privacy-filter.js.map +1 -0
- package/dist/cli/collect.d.ts +1 -0
- package/dist/cli/collect.js +19 -0
- package/dist/cli/collect.js.map +1 -0
- package/dist/cli/init.d.ts +1 -0
- package/dist/cli/init.js +39 -0
- package/dist/cli/init.js.map +1 -0
- package/dist/cli/log.d.ts +1 -0
- package/dist/cli/log.js +15 -0
- package/dist/cli/log.js.map +1 -0
- package/dist/cli/reset.d.ts +1 -0
- package/dist/cli/reset.js +7 -0
- package/dist/cli/reset.js.map +1 -0
- package/dist/cli/rm.d.ts +1 -0
- package/dist/cli/rm.js +7 -0
- package/dist/cli/rm.js.map +1 -0
- package/dist/cli/show.d.ts +1 -0
- package/dist/cli/show.js +21 -0
- package/dist/cli/show.js.map +1 -0
- package/dist/domain/__tests__/session.test.d.ts +1 -0
- package/dist/domain/__tests__/session.test.js +80 -0
- package/dist/domain/__tests__/session.test.js.map +1 -0
- package/dist/domain/__tests__/step.test.d.ts +1 -0
- package/dist/domain/__tests__/step.test.js +65 -0
- package/dist/domain/__tests__/step.test.js.map +1 -0
- package/dist/domain/session.d.ts +51 -0
- package/dist/domain/session.js +49 -0
- package/dist/domain/session.js.map +1 -0
- package/dist/domain/step.d.ts +13 -0
- package/dist/domain/step.js +98 -0
- package/dist/domain/step.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +106 -0
- package/dist/index.js.map +1 -0
- package/dist/port/agent-log-reader.d.ts +6 -0
- package/dist/port/agent-log-reader.js +2 -0
- package/dist/port/agent-log-reader.js.map +1 -0
- package/dist/port/step-repository.d.ts +7 -0
- package/dist/port/step-repository.js +2 -0
- package/dist/port/step-repository.js.map +1 -0
- package/dist/port/summarizer.d.ts +13 -0
- package/dist/port/summarizer.js +2 -0
- package/dist/port/summarizer.js.map +1 -0
- package/dist/usecase/__tests__/collect.test.d.ts +1 -0
- package/dist/usecase/__tests__/collect.test.js +135 -0
- package/dist/usecase/__tests__/collect.test.js.map +1 -0
- package/dist/usecase/collect.d.ts +16 -0
- package/dist/usecase/collect.js +190 -0
- package/dist/usecase/collect.js.map +1 -0
- package/package.json +41 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-code-log-reader.js","sourceRoot":"","sources":["../../src/adapter/claude-code-log-reader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { type ConversationTurn } from "../domain/session.js";
|
|
2
|
+
import type { Step } from "../domain/step.js";
|
|
3
|
+
import type { StepDraft, Summarizer } from "../port/summarizer.js";
|
|
4
|
+
export declare class ClaudeCodeSummarizer implements Summarizer {
|
|
5
|
+
summarize(turns: ConversationTurn[], previousSteps: Step[]): Promise<StepDraft | null>;
|
|
6
|
+
}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import { summaryContext } from "../domain/session.js";
|
|
3
|
+
const SUMMARIZE_PROMPT = `以下のAIとの会話ターンを分析して、JSON形式で要約してください。
|
|
4
|
+
|
|
5
|
+
重要な判定基準:
|
|
6
|
+
- 会話ターンの中に「人間が明示的に要求した意図」が読み取れるものだけを対象にしてください
|
|
7
|
+
- 機械的なやりとり(ツール呼び出しの羅列等)だけの場合は skip: true を返してください
|
|
8
|
+
|
|
9
|
+
要件:
|
|
10
|
+
- title: 何をしたかの短いタイトル(30文字以内)
|
|
11
|
+
- prompt: ユーザーが何を指示したかの要約
|
|
12
|
+
- reasoning: なぜこの実装になったかの説明(前のステップからの文脈の変化があれば含める)
|
|
13
|
+
- outcome: 何ができるようになったかの説明
|
|
14
|
+
- tags: 内容を分類する短いタグの配列(1〜4個)。例: ["bugfix"], ["feature","ux"], ["testing","ci"], ["refactor","security"]
|
|
15
|
+
|
|
16
|
+
必ず以下のJSON形式のみを出力してください(他のテキストは不要):
|
|
17
|
+
{"title":"...","prompt":"...","reasoning":"...","outcome":"...","tags":["..."]}
|
|
18
|
+
|
|
19
|
+
スキップする場合:
|
|
20
|
+
{"skip":true}
|
|
21
|
+
`;
|
|
22
|
+
export class ClaudeCodeSummarizer {
|
|
23
|
+
async summarize(turns, previousSteps) {
|
|
24
|
+
if (turns.length === 0) {
|
|
25
|
+
throw new Error("会話ターンが空です");
|
|
26
|
+
}
|
|
27
|
+
let prompt = "";
|
|
28
|
+
if (previousSteps.length > 0) {
|
|
29
|
+
const recent = previousSteps.slice(-5);
|
|
30
|
+
const history = recent
|
|
31
|
+
.map((s) => `- ステップ${String(s.number).padStart(3, "0")}: ${s.title}(${s.prompt})`)
|
|
32
|
+
.join("\n");
|
|
33
|
+
prompt += `これまでの意図の流れ:\n${history}\n\n上記を踏まえて、以下の新しいセッションを要約してください。前のステップとの関連性や意図の変化があれば reasoning に含めてください。\n\n`;
|
|
34
|
+
}
|
|
35
|
+
prompt += SUMMARIZE_PROMPT;
|
|
36
|
+
const context = turns
|
|
37
|
+
.map((t, i) => `--- ターン ${i + 1} ---\n${summaryContext(t)}`)
|
|
38
|
+
.join("\n\n");
|
|
39
|
+
prompt += `会話ターン:\n${context}`;
|
|
40
|
+
// claude -p でサブプロセス呼び出し(stdin経由でプロンプトを渡す)
|
|
41
|
+
const env = { ...process.env };
|
|
42
|
+
delete env.CLAUDE_CODE;
|
|
43
|
+
delete env.CLAUDECODE;
|
|
44
|
+
const { stdout, stderr } = await runClaude(prompt, env);
|
|
45
|
+
const response = stdout.trim();
|
|
46
|
+
const jsonStr = extractJson(response);
|
|
47
|
+
if (!jsonStr) {
|
|
48
|
+
throw new Error(`claudeの応答からJSONを抽出できませんでした: ${response}`);
|
|
49
|
+
}
|
|
50
|
+
const draft = JSON.parse(jsonStr);
|
|
51
|
+
if (draft.skip) {
|
|
52
|
+
return null;
|
|
53
|
+
}
|
|
54
|
+
return draft;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
function runClaude(prompt, env) {
|
|
58
|
+
return new Promise((resolve, reject) => {
|
|
59
|
+
const child = spawn("claude", ["-p", "--no-session-persistence"], {
|
|
60
|
+
env,
|
|
61
|
+
stdio: ["pipe", "pipe", "pipe"],
|
|
62
|
+
});
|
|
63
|
+
let stdout = "";
|
|
64
|
+
let stderr = "";
|
|
65
|
+
child.stdout.on("data", (data) => {
|
|
66
|
+
stdout += data.toString();
|
|
67
|
+
});
|
|
68
|
+
child.stderr.on("data", (data) => {
|
|
69
|
+
stderr += data.toString();
|
|
70
|
+
});
|
|
71
|
+
child.on("error", (err) => {
|
|
72
|
+
reject(new Error(`claude コマンドの実行に失敗。claude CLIがインストールされているか確認してください: ${err.message}`));
|
|
73
|
+
});
|
|
74
|
+
child.on("close", (code) => {
|
|
75
|
+
if (code !== 0 && !stdout) {
|
|
76
|
+
reject(new Error(`claude コマンドがエラーを返しました (code ${code}): ${stderr}`));
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
resolve({ stdout, stderr });
|
|
80
|
+
}
|
|
81
|
+
});
|
|
82
|
+
child.stdin.write(prompt);
|
|
83
|
+
child.stdin.end();
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
function extractJson(text) {
|
|
87
|
+
const start = text.indexOf("{");
|
|
88
|
+
const end = text.lastIndexOf("}");
|
|
89
|
+
if (start === -1 || end === -1)
|
|
90
|
+
return null;
|
|
91
|
+
return text.slice(start, end + 1);
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=claude-code-summarizer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-code-summarizer.js","sourceRoot":"","sources":["../../src/adapter/claude-code-summarizer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAyB,MAAM,sBAAsB,CAAC;AAI7E,MAAM,gBAAgB,GAAG;;;;;;;;;;;;;;;;;;CAkBxB,CAAC;AAEF,MAAM,OAAO,oBAAoB;IAC/B,KAAK,CAAC,SAAS,CACb,KAAyB,EACzB,aAAqB;QAErB,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,MAAM,IAAI,KAAK,CAAC,WAAW,CAAC,CAAC;QAC/B,CAAC;QAED,IAAI,MAAM,GAAG,EAAE,CAAC;QAEhB,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7B,MAAM,MAAM,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YACvC,MAAM,OAAO,GAAG,MAAM;iBACnB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC;iBACjF,IAAI,CAAC,IAAI,CAAC,CAAC;YACd,MAAM,IAAI,gBAAgB,OAAO,gFAAgF,CAAC;QACpH,CAAC;QAED,MAAM,IAAI,gBAAgB,CAAC;QAE3B,MAAM,OAAO,GAAG,KAAK;aAClB,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC;aAC3D,IAAI,CAAC,MAAM,CAAC,CAAC;QAEhB,MAAM,IAAI,WAAW,OAAO,EAAE,CAAC;QAE/B,0CAA0C;QAC1C,MAAM,GAAG,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;QAC/B,OAAO,GAAG,CAAC,WAAW,CAAC;QACvB,OAAO,GAAG,CAAC,UAAU,CAAC;QAEtB,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,SAAS,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAExD,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;QAC/B,MAAM,OAAO,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;QACtC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CACb,+BAA+B,QAAQ,EAAE,CAC1C,CAAC;QACJ,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAc,CAAC;QAE/C,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;YACf,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;CACF;AAED,SAAS,SAAS,CAChB,MAAc,EACd,GAAsB;IAEtB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,0BAA0B,CAAC,EAAE;YAChE,GAAG;YACH,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;SAChC,CAAC,CAAC;QAEH,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,MAAM,GAAG,EAAE,CAAC;QAEhB,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE;YACvC,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC5B,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE;YACvC,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC5B,CAAC,CAAC,CAAC;QAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YACxB,MAAM,CACJ,IAAI,KAAK,CACP,sDAAsD,GAAG,CAAC,OAAO,EAAE,CACpE,CACF,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;YACzB,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;gBAC1B,MAAM,CAAC,IAAI,KAAK,CAAC,+BAA+B,IAAI,MAAM,MAAM,EAAE,CAAC,CAAC,CAAC;YACvE,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;YAC9B,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC1B,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;IACpB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,WAAW,CAAC,IAAY;IAC/B,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAChC,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IAClC,IAAI,KAAK,KAAK,CAAC,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IAC5C,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC;AACpC,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { type Step } from "../domain/step.js";
|
|
2
|
+
import type { StepRepository } from "../port/step-repository.js";
|
|
3
|
+
interface IntentToml {
|
|
4
|
+
project: {
|
|
5
|
+
name: string;
|
|
6
|
+
description: string;
|
|
7
|
+
origin: string;
|
|
8
|
+
author: string;
|
|
9
|
+
forked_from: string;
|
|
10
|
+
forked_at_step: number;
|
|
11
|
+
};
|
|
12
|
+
source: {
|
|
13
|
+
tool: string;
|
|
14
|
+
version: string;
|
|
15
|
+
model: string;
|
|
16
|
+
};
|
|
17
|
+
collect: {
|
|
18
|
+
sessions: string[];
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
export declare class FileSystemRepository implements StepRepository {
|
|
22
|
+
private intentDir;
|
|
23
|
+
private constructor();
|
|
24
|
+
static create(): FileSystemRepository;
|
|
25
|
+
private stepsDir;
|
|
26
|
+
private stepPath;
|
|
27
|
+
private intentTomlPath;
|
|
28
|
+
readIntentToml(): Promise<IntentToml>;
|
|
29
|
+
writeIntentToml(data: IntentToml): Promise<void>;
|
|
30
|
+
isSessionCollected(sessionId: string): Promise<boolean>;
|
|
31
|
+
recordSession(sessionId: string): Promise<void>;
|
|
32
|
+
listSteps(): Promise<Step[]>;
|
|
33
|
+
getStep(number: number): Promise<Step>;
|
|
34
|
+
saveStep(step: Step): Promise<void>;
|
|
35
|
+
nextStepNumber(): Promise<number>;
|
|
36
|
+
removeStep(number: number): Promise<void>;
|
|
37
|
+
reset(): Promise<void>;
|
|
38
|
+
}
|
|
39
|
+
export {};
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { readdir, readFile, writeFile, unlink } from "node:fs/promises";
|
|
2
|
+
import { existsSync } from "node:fs";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import TOML from "@iarna/toml";
|
|
5
|
+
import { fromMarkdown, toMarkdown } from "../domain/step.js";
|
|
6
|
+
export class FileSystemRepository {
|
|
7
|
+
intentDir;
|
|
8
|
+
constructor(intentDir) {
|
|
9
|
+
this.intentDir = intentDir;
|
|
10
|
+
}
|
|
11
|
+
static create() {
|
|
12
|
+
const intentDir = ".intent";
|
|
13
|
+
if (!existsSync(intentDir)) {
|
|
14
|
+
throw new Error(".intent/ が見つかりません。`intent init` で初期化してください");
|
|
15
|
+
}
|
|
16
|
+
return new FileSystemRepository(intentDir);
|
|
17
|
+
}
|
|
18
|
+
stepsDir() {
|
|
19
|
+
return join(this.intentDir, "steps");
|
|
20
|
+
}
|
|
21
|
+
stepPath(number) {
|
|
22
|
+
return join(this.stepsDir(), `${String(number).padStart(3, "0")}.md`);
|
|
23
|
+
}
|
|
24
|
+
intentTomlPath() {
|
|
25
|
+
return join(this.intentDir, "intent.toml");
|
|
26
|
+
}
|
|
27
|
+
async readIntentToml() {
|
|
28
|
+
const content = await readFile(this.intentTomlPath(), "utf-8");
|
|
29
|
+
return TOML.parse(content);
|
|
30
|
+
}
|
|
31
|
+
async writeIntentToml(data) {
|
|
32
|
+
const content = TOML.stringify(data);
|
|
33
|
+
await writeFile(this.intentTomlPath(), content);
|
|
34
|
+
}
|
|
35
|
+
async isSessionCollected(sessionId) {
|
|
36
|
+
const toml = await this.readIntentToml();
|
|
37
|
+
return toml.collect.sessions.includes(sessionId);
|
|
38
|
+
}
|
|
39
|
+
async recordSession(sessionId) {
|
|
40
|
+
const toml = await this.readIntentToml();
|
|
41
|
+
if (!toml.collect.sessions.includes(sessionId)) {
|
|
42
|
+
toml.collect.sessions.push(sessionId);
|
|
43
|
+
await this.writeIntentToml(toml);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
async listSteps() {
|
|
47
|
+
const dir = this.stepsDir();
|
|
48
|
+
if (!existsSync(dir))
|
|
49
|
+
return [];
|
|
50
|
+
const entries = await readdir(dir);
|
|
51
|
+
const mdFiles = entries.filter((e) => e.endsWith(".md")).sort();
|
|
52
|
+
const steps = [];
|
|
53
|
+
for (const file of mdFiles) {
|
|
54
|
+
const content = await readFile(join(dir, file), "utf-8");
|
|
55
|
+
steps.push(fromMarkdown(content));
|
|
56
|
+
}
|
|
57
|
+
return steps;
|
|
58
|
+
}
|
|
59
|
+
async getStep(number) {
|
|
60
|
+
const path = this.stepPath(number);
|
|
61
|
+
if (!existsSync(path)) {
|
|
62
|
+
throw new Error(`ステップ ${String(number).padStart(3, "0")} が見つかりません`);
|
|
63
|
+
}
|
|
64
|
+
const content = await readFile(path, "utf-8");
|
|
65
|
+
return fromMarkdown(content);
|
|
66
|
+
}
|
|
67
|
+
async saveStep(step) {
|
|
68
|
+
const path = this.stepPath(step.number);
|
|
69
|
+
await writeFile(path, toMarkdown(step));
|
|
70
|
+
}
|
|
71
|
+
async nextStepNumber() {
|
|
72
|
+
const steps = await this.listSteps();
|
|
73
|
+
if (steps.length === 0)
|
|
74
|
+
return 1;
|
|
75
|
+
return steps[steps.length - 1].number + 1;
|
|
76
|
+
}
|
|
77
|
+
async removeStep(number) {
|
|
78
|
+
const path = this.stepPath(number);
|
|
79
|
+
if (!existsSync(path)) {
|
|
80
|
+
throw new Error(`ステップ ${String(number).padStart(3, "0")} が見つかりません`);
|
|
81
|
+
}
|
|
82
|
+
await unlink(path);
|
|
83
|
+
}
|
|
84
|
+
async reset() {
|
|
85
|
+
const dir = this.stepsDir();
|
|
86
|
+
if (existsSync(dir)) {
|
|
87
|
+
const entries = await readdir(dir);
|
|
88
|
+
const mdFiles = entries.filter((e) => e.endsWith(".md"));
|
|
89
|
+
for (const file of mdFiles) {
|
|
90
|
+
await unlink(join(dir, file));
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
const toml = await this.readIntentToml();
|
|
94
|
+
toml.collect.sessions = [];
|
|
95
|
+
await this.writeIntentToml(toml);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=filesystem-repository.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filesystem-repository.js","sourceRoot":"","sources":["../../src/adapter/filesystem-repository.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AACxE,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,IAAI,MAAM,aAAa,CAAC;AAC/B,OAAO,EAAa,YAAY,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAsBxE,MAAM,OAAO,oBAAoB;IACvB,SAAS,CAAS;IAE1B,YAAoB,SAAiB;QACnC,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;IAED,MAAM,CAAC,MAAM;QACX,MAAM,SAAS,GAAG,SAAS,CAAC;QAC5B,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CACb,4CAA4C,CAC7C,CAAC;QACJ,CAAC;QACD,OAAO,IAAI,oBAAoB,CAAC,SAAS,CAAC,CAAC;IAC7C,CAAC;IAEO,QAAQ;QACd,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IACvC,CAAC;IAEO,QAAQ,CAAC,MAAc;QAC7B,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC;IACxE,CAAC;IAEO,cAAc;QACpB,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;IAC7C,CAAC;IAED,KAAK,CAAC,cAAc;QAClB,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,OAAO,CAAC,CAAC;QAC/D,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAA0B,CAAC;IACtD,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,IAAgB;QACpC,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,IAA+B,CAAC,CAAC;QAChE,MAAM,SAAS,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,OAAO,CAAC,CAAC;IAClD,CAAC;IAED,KAAK,CAAC,kBAAkB,CAAC,SAAiB;QACxC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;QACzC,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;IACnD,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,SAAiB;QACnC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;QACzC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;YAC/C,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACtC,MAAM,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QACnC,CAAC;IACH,CAAC;IAED,KAAK,CAAC,SAAS;QACb,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC5B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,OAAO,EAAE,CAAC;QAEhC,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC;QACnC,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAEhE,MAAM,KAAK,GAAW,EAAE,CAAC;QACzB,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;YAC3B,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;YACzD,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC;QACpC,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,MAAc;QAC1B,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QACnC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CACb,QAAQ,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,WAAW,CACnD,CAAC;QACJ,CAAC;QACD,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC9C,OAAO,YAAY,CAAC,OAAO,CAAC,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,IAAU;QACvB,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACxC,MAAM,SAAS,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;IAC1C,CAAC;IAED,KAAK,CAAC,cAAc;QAClB,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;QACrC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,CAAC,CAAC;QACjC,OAAO,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;IAC5C,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,MAAc;QAC7B,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QACnC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CACb,QAAQ,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,WAAW,CACnD,CAAC;QACJ,CAAC;QACD,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;IACrB,CAAC;IAED,KAAK,CAAC,KAAK;QACT,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC5B,IAAI,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACpB,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC;YACnC,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;YACzD,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;gBAC3B,MAAM,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC;YAChC,CAAC;QACH,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;QACzC,IAAI,CAAC,OAAO,CAAC,QAAQ,GAAG,EAAE,CAAC;QAC3B,MAAM,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;IACnC,CAAC;CACF"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { ConversationTurn } from "../domain/session.js";
|
|
2
|
+
export declare class PrivacyFilter {
|
|
3
|
+
private excludePatterns;
|
|
4
|
+
private minPromptLength;
|
|
5
|
+
private constructor();
|
|
6
|
+
static fromConfig(): Promise<PrivacyFilter>;
|
|
7
|
+
filterTurns(turns: ConversationTurn[]): ConversationTurn[];
|
|
8
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { readFile } from "node:fs/promises";
|
|
2
|
+
import { existsSync } from "node:fs";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import TOML from "@iarna/toml";
|
|
5
|
+
// Stage 1: エージェント指示文パターン(ルールベース高速除外)
|
|
6
|
+
const AGENT_INSTRUCTION_PATTERNS = [
|
|
7
|
+
/^You are a /,
|
|
8
|
+
/^You have access to/,
|
|
9
|
+
/^IMPORTANT:/,
|
|
10
|
+
/^Use this tool/,
|
|
11
|
+
];
|
|
12
|
+
export class PrivacyFilter {
|
|
13
|
+
excludePatterns;
|
|
14
|
+
minPromptLength;
|
|
15
|
+
constructor(excludePatterns, minPromptLength) {
|
|
16
|
+
this.excludePatterns = excludePatterns;
|
|
17
|
+
this.minPromptLength = minPromptLength;
|
|
18
|
+
}
|
|
19
|
+
static async fromConfig() {
|
|
20
|
+
const configPath = join(".intent", "config.toml");
|
|
21
|
+
if (!existsSync(configPath)) {
|
|
22
|
+
return new PrivacyFilter([], 20);
|
|
23
|
+
}
|
|
24
|
+
const content = await readFile(configPath, "utf-8");
|
|
25
|
+
const config = TOML.parse(content);
|
|
26
|
+
const patterns = config.filter.exclude_patterns.map((p) => {
|
|
27
|
+
// (?i) → RegExp "i" flag
|
|
28
|
+
if (p.startsWith("(?i)")) {
|
|
29
|
+
return new RegExp(p.slice(4), "i");
|
|
30
|
+
}
|
|
31
|
+
return new RegExp(p);
|
|
32
|
+
});
|
|
33
|
+
return new PrivacyFilter(patterns, config.filter.min_prompt_length);
|
|
34
|
+
}
|
|
35
|
+
filterTurns(turns) {
|
|
36
|
+
return turns.filter((turn) => {
|
|
37
|
+
const prompt = turn.userPrompt;
|
|
38
|
+
// 短すぎるプロンプトを除外
|
|
39
|
+
if (prompt.length < this.minPromptLength) {
|
|
40
|
+
return false;
|
|
41
|
+
}
|
|
42
|
+
// ユーザー設定のパターンマッチで除外
|
|
43
|
+
for (const pattern of this.excludePatterns) {
|
|
44
|
+
if (pattern.test(prompt)) {
|
|
45
|
+
return false;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
// エージェント指示文パターンで除外
|
|
49
|
+
for (const pattern of AGENT_INSTRUCTION_PATTERNS) {
|
|
50
|
+
if (pattern.test(prompt)) {
|
|
51
|
+
return false;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return true;
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=privacy-filter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"privacy-filter.js","sourceRoot":"","sources":["../../src/adapter/privacy-filter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,IAAI,MAAM,aAAa,CAAC;AAS/B,qCAAqC;AACrC,MAAM,0BAA0B,GAAG;IACjC,aAAa;IACb,qBAAqB;IACrB,aAAa;IACb,gBAAgB;CACjB,CAAC;AAEF,MAAM,OAAO,aAAa;IAChB,eAAe,CAAW;IAC1B,eAAe,CAAS;IAEhC,YAAoB,eAAyB,EAAE,eAAuB;QACpE,IAAI,CAAC,eAAe,GAAG,eAAe,CAAC;QACvC,IAAI,CAAC,eAAe,GAAG,eAAe,CAAC;IACzC,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,UAAU;QACrB,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;QAElD,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC5B,OAAO,IAAI,aAAa,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QACnC,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QACpD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAwC,CAAC;QAE1E,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YACxD,yBAAyB;YACzB,IAAI,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;gBACzB,OAAO,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;YACrC,CAAC;YACD,OAAO,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC;QACvB,CAAC,CAAC,CAAC;QAEH,OAAO,IAAI,aAAa,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC;IACtE,CAAC;IAED,WAAW,CAAC,KAAyB;QACnC,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE;YAC3B,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC;YAE/B,eAAe;YACf,IAAI,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;gBACzC,OAAO,KAAK,CAAC;YACf,CAAC;YAED,oBAAoB;YACpB,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;gBAC3C,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;oBACzB,OAAO,KAAK,CAAC;gBACf,CAAC;YACH,CAAC;YAED,mBAAmB;YACnB,KAAK,MAAM,OAAO,IAAI,0BAA0B,EAAE,CAAC;gBACjD,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;oBACzB,OAAO,KAAK,CAAC;gBACf,CAAC;YACH,CAAC;YAED,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;IACL,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function collectCommand(session?: string): Promise<void>;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { ClaudeCodeLogReader } from "../adapter/claude-code-log-reader.js";
|
|
2
|
+
import { ClaudeCodeSummarizer } from "../adapter/claude-code-summarizer.js";
|
|
3
|
+
import { FileSystemRepository } from "../adapter/filesystem-repository.js";
|
|
4
|
+
import { PrivacyFilter } from "../adapter/privacy-filter.js";
|
|
5
|
+
import { CollectUseCase } from "../usecase/collect.js";
|
|
6
|
+
export async function collectCommand(session) {
|
|
7
|
+
const reader = ClaudeCodeLogReader.create();
|
|
8
|
+
const summarizer = new ClaudeCodeSummarizer();
|
|
9
|
+
const filter = await PrivacyFilter.fromConfig();
|
|
10
|
+
const repository = FileSystemRepository.create();
|
|
11
|
+
const usecase = new CollectUseCase(reader, summarizer, filter, repository);
|
|
12
|
+
if (session) {
|
|
13
|
+
await usecase.collectSession(session);
|
|
14
|
+
}
|
|
15
|
+
else {
|
|
16
|
+
await usecase.collectAll();
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=collect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"collect.js","sourceRoot":"","sources":["../../src/cli/collect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,sCAAsC,CAAC;AAC3E,OAAO,EAAE,oBAAoB,EAAE,MAAM,sCAAsC,CAAC;AAC5E,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAC3E,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEvD,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,OAAgB;IACnD,MAAM,MAAM,GAAG,mBAAmB,CAAC,MAAM,EAAE,CAAC;IAC5C,MAAM,UAAU,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC9C,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,UAAU,EAAE,CAAC;IAChD,MAAM,UAAU,GAAG,oBAAoB,CAAC,MAAM,EAAE,CAAC;IAEjD,MAAM,OAAO,GAAG,IAAI,cAAc,CAAC,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;IAE3E,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,OAAO,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;IACxC,CAAC;SAAM,CAAC;QACN,MAAM,OAAO,CAAC,UAAU,EAAE,CAAC;IAC7B,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function initCommand(): Promise<void>;
|
package/dist/cli/init.js
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { mkdir, writeFile } from "node:fs/promises";
|
|
2
|
+
import { existsSync } from "node:fs";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
const DEFAULT_INTENT_TOML = `[project]
|
|
5
|
+
name = ""
|
|
6
|
+
description = ""
|
|
7
|
+
origin = ""
|
|
8
|
+
author = ""
|
|
9
|
+
forked_from = ""
|
|
10
|
+
forked_at_step = 0
|
|
11
|
+
|
|
12
|
+
[source]
|
|
13
|
+
tool = "claude-code"
|
|
14
|
+
version = ""
|
|
15
|
+
model = ""
|
|
16
|
+
|
|
17
|
+
[collect]
|
|
18
|
+
sessions = []
|
|
19
|
+
`;
|
|
20
|
+
const DEFAULT_CONFIG_TOML = `[filter]
|
|
21
|
+
exclude_patterns = [
|
|
22
|
+
"(?i)(api.?key|token|secret|password)",
|
|
23
|
+
"^(はい|ok|yes|y|n|no)$",
|
|
24
|
+
"戻して|取り消し|やっぱ",
|
|
25
|
+
]
|
|
26
|
+
exclude_tool_results = true
|
|
27
|
+
min_prompt_length = 20
|
|
28
|
+
`;
|
|
29
|
+
export async function initCommand() {
|
|
30
|
+
const intentDir = ".intent";
|
|
31
|
+
if (existsSync(intentDir)) {
|
|
32
|
+
throw new Error(".intent/ は既に存在します");
|
|
33
|
+
}
|
|
34
|
+
await mkdir(join(intentDir, "steps"), { recursive: true });
|
|
35
|
+
await writeFile(join(intentDir, "intent.toml"), DEFAULT_INTENT_TOML);
|
|
36
|
+
await writeFile(join(intentDir, "config.toml"), DEFAULT_CONFIG_TOML);
|
|
37
|
+
console.log(".intent/ を初期化しました");
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/cli/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,MAAM,mBAAmB,GAAG;;;;;;;;;;;;;;;CAe3B,CAAC;AAEF,MAAM,mBAAmB,GAAG;;;;;;;;CAQ3B,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,MAAM,SAAS,GAAG,SAAS,CAAC;IAE5B,IAAI,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;IACvC,CAAC;IAED,MAAM,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3D,MAAM,SAAS,CAAC,IAAI,CAAC,SAAS,EAAE,aAAa,CAAC,EAAE,mBAAmB,CAAC,CAAC;IACrE,MAAM,SAAS,CAAC,IAAI,CAAC,SAAS,EAAE,aAAa,CAAC,EAAE,mBAAmB,CAAC,CAAC;IAErE,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;AACnC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function logCommand(): Promise<void>;
|
package/dist/cli/log.js
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { FileSystemRepository } from "../adapter/filesystem-repository.js";
|
|
2
|
+
export async function logCommand() {
|
|
3
|
+
const repo = FileSystemRepository.create();
|
|
4
|
+
const steps = await repo.listSteps();
|
|
5
|
+
if (steps.length === 0) {
|
|
6
|
+
console.log("ステップがありません。`intent collect` で収集してください。");
|
|
7
|
+
return;
|
|
8
|
+
}
|
|
9
|
+
for (const step of steps) {
|
|
10
|
+
const date = step.timestamp.toISOString().slice(0, 10);
|
|
11
|
+
const num = String(step.number).padStart(3, "0");
|
|
12
|
+
console.log(` ${num} ${date} ${step.title}`);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=log.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"log.js","sourceRoot":"","sources":["../../src/cli/log.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAE3E,MAAM,CAAC,KAAK,UAAU,UAAU;IAC9B,MAAM,IAAI,GAAG,oBAAoB,CAAC,MAAM,EAAE,CAAC;IAC3C,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;IAErC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,CAAC,GAAG,CACT,wCAAwC,CACzC,CAAC;QACF,OAAO;IACT,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACvD,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QACjD,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,KAAK,IAAI,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;IAClD,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function resetCommand(): Promise<void>;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { FileSystemRepository } from "../adapter/filesystem-repository.js";
|
|
2
|
+
export async function resetCommand() {
|
|
3
|
+
const repo = FileSystemRepository.create();
|
|
4
|
+
await repo.reset();
|
|
5
|
+
console.log("すべてのステップとセッション履歴をリセットしました。");
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=reset.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reset.js","sourceRoot":"","sources":["../../src/cli/reset.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAE3E,MAAM,CAAC,KAAK,UAAU,YAAY;IAChC,MAAM,IAAI,GAAG,oBAAoB,CAAC,MAAM,EAAE,CAAC;IAC3C,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;IACnB,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;AAC5C,CAAC"}
|
package/dist/cli/rm.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function rmCommand(stepNumber: number): Promise<void>;
|
package/dist/cli/rm.js
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { FileSystemRepository } from "../adapter/filesystem-repository.js";
|
|
2
|
+
export async function rmCommand(stepNumber) {
|
|
3
|
+
const repo = FileSystemRepository.create();
|
|
4
|
+
await repo.removeStep(stepNumber);
|
|
5
|
+
console.log(`ステップ ${String(stepNumber).padStart(3, "0")} を削除しました。`);
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=rm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rm.js","sourceRoot":"","sources":["../../src/cli/rm.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAE3E,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,UAAkB;IAChD,MAAM,IAAI,GAAG,oBAAoB,CAAC,MAAM,EAAE,CAAC;IAC3C,MAAM,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;IAClC,OAAO,CAAC,GAAG,CACT,QAAQ,MAAM,CAAC,UAAU,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,WAAW,CACvD,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function showCommand(stepNumber: number): Promise<void>;
|
package/dist/cli/show.js
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { FileSystemRepository } from "../adapter/filesystem-repository.js";
|
|
2
|
+
export async function showCommand(stepNumber) {
|
|
3
|
+
const repo = FileSystemRepository.create();
|
|
4
|
+
const step = await repo.getStep(stepNumber);
|
|
5
|
+
const num = String(step.number).padStart(3, "0");
|
|
6
|
+
const ts = step.timestamp.toISOString().replace(/\.\d{3}Z$/, "Z");
|
|
7
|
+
console.log(`# Step ${num}: ${step.title}`);
|
|
8
|
+
console.log(`session: ${step.session}`);
|
|
9
|
+
console.log(`timestamp: ${ts}`);
|
|
10
|
+
if (step.tags.length > 0) {
|
|
11
|
+
console.log(`tags: ${step.tags.join(", ")}`);
|
|
12
|
+
}
|
|
13
|
+
console.log();
|
|
14
|
+
console.log(`## prompt\n\n${step.prompt}`);
|
|
15
|
+
console.log(`\n## reasoning\n\n${step.reasoning}`);
|
|
16
|
+
console.log(`\n## outcome\n\n${step.outcome}`);
|
|
17
|
+
if (step.friction) {
|
|
18
|
+
console.log(`\n## friction\n\n${step.friction}`);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=show.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"show.js","sourceRoot":"","sources":["../../src/cli/show.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAE3E,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,UAAkB;IAClD,MAAM,IAAI,GAAG,oBAAoB,CAAC,MAAM,EAAE,CAAC;IAC3C,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAE5C,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACjD,MAAM,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;IAElE,OAAO,CAAC,GAAG,CAAC,UAAU,GAAG,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;IAC5C,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;IACxC,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;IAChC,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzB,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC/C,CAAC;IACD,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IAC3C,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;IACnD,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;IAC/C,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QAClB,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;IACnD,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
import { SessionEntry, summaryContext } from "../session.js";
|
|
3
|
+
describe("SessionEntry.parse", () => {
|
|
4
|
+
it("userエントリ(文字列content)をパースできる", () => {
|
|
5
|
+
const entry = SessionEntry.parse({
|
|
6
|
+
type: "user",
|
|
7
|
+
message: { role: "user", content: "こんにちは" },
|
|
8
|
+
});
|
|
9
|
+
expect(entry.type).toBe("user");
|
|
10
|
+
expect(entry.message?.role).toBe("user");
|
|
11
|
+
expect(entry.message?.content).toBe("こんにちは");
|
|
12
|
+
});
|
|
13
|
+
it("assistantエントリ(配列content)をパースできる", () => {
|
|
14
|
+
const entry = SessionEntry.parse({
|
|
15
|
+
type: "assistant",
|
|
16
|
+
message: {
|
|
17
|
+
role: "assistant",
|
|
18
|
+
content: [
|
|
19
|
+
{ type: "text", text: "応答テキスト" },
|
|
20
|
+
{ type: "thinking", thinking: "思考中..." },
|
|
21
|
+
],
|
|
22
|
+
},
|
|
23
|
+
});
|
|
24
|
+
expect(entry.type).toBe("assistant");
|
|
25
|
+
expect(Array.isArray(entry.message?.content)).toBe(true);
|
|
26
|
+
});
|
|
27
|
+
it("isSidechainフィールドをパースできる", () => {
|
|
28
|
+
const entry = SessionEntry.parse({
|
|
29
|
+
type: "user",
|
|
30
|
+
isSidechain: true,
|
|
31
|
+
message: { role: "user", content: "サイドチェーン" },
|
|
32
|
+
});
|
|
33
|
+
expect(entry.isSidechain).toBe(true);
|
|
34
|
+
});
|
|
35
|
+
it("isSidechainが省略されている場合はundefined", () => {
|
|
36
|
+
const entry = SessionEntry.parse({
|
|
37
|
+
type: "user",
|
|
38
|
+
message: { role: "user", content: "通常" },
|
|
39
|
+
});
|
|
40
|
+
expect(entry.isSidechain).toBeUndefined();
|
|
41
|
+
});
|
|
42
|
+
it("messageなしのエントリもパースできる", () => {
|
|
43
|
+
const entry = SessionEntry.parse({
|
|
44
|
+
type: "progress",
|
|
45
|
+
});
|
|
46
|
+
expect(entry.type).toBe("progress");
|
|
47
|
+
expect(entry.message).toBeUndefined();
|
|
48
|
+
});
|
|
49
|
+
});
|
|
50
|
+
describe("summaryContext", () => {
|
|
51
|
+
it("全フィールドを含むコンテキストを生成する", () => {
|
|
52
|
+
const turn = {
|
|
53
|
+
userPrompt: "機能を追加して",
|
|
54
|
+
assistantThinking: ["考え中..."],
|
|
55
|
+
assistantText: ["了解しました"],
|
|
56
|
+
toolUses: ["Read", "Edit"],
|
|
57
|
+
skills: [],
|
|
58
|
+
};
|
|
59
|
+
const ctx = summaryContext(turn);
|
|
60
|
+
expect(ctx).toContain("## ユーザーの指示\n機能を追加して");
|
|
61
|
+
expect(ctx).toContain("## AIの思考\n考え中...");
|
|
62
|
+
expect(ctx).toContain("## AIの応答\n了解しました");
|
|
63
|
+
expect(ctx).toContain("## 使用ツール\nRead, Edit");
|
|
64
|
+
});
|
|
65
|
+
it("空の配列フィールドは省略される", () => {
|
|
66
|
+
const turn = {
|
|
67
|
+
userPrompt: "質問",
|
|
68
|
+
assistantThinking: [],
|
|
69
|
+
assistantText: [],
|
|
70
|
+
toolUses: [],
|
|
71
|
+
skills: [],
|
|
72
|
+
};
|
|
73
|
+
const ctx = summaryContext(turn);
|
|
74
|
+
expect(ctx).toContain("## ユーザーの指示");
|
|
75
|
+
expect(ctx).not.toContain("## AIの思考");
|
|
76
|
+
expect(ctx).not.toContain("## AIの応答");
|
|
77
|
+
expect(ctx).not.toContain("## 使用ツール");
|
|
78
|
+
});
|
|
79
|
+
});
|
|
80
|
+
//# sourceMappingURL=session.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.test.js","sourceRoot":"","sources":["../../../src/domain/__tests__/session.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,cAAc,EAAyB,MAAM,eAAe,CAAC;AAEpF,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACrC,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,CAAC;YAC/B,IAAI,EAAE,MAAM;YACZ,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE;SAC5C,CAAC,CAAC;QACH,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAChC,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACzC,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QACzC,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,CAAC;YAC/B,IAAI,EAAE,WAAW;YACjB,OAAO,EAAE;gBACP,IAAI,EAAE,WAAW;gBACjB,OAAO,EAAE;oBACP,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE;oBAChC,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE;iBACzC;aACF;SACF,CAAC,CAAC;QACH,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACrC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yBAAyB,EAAE,GAAG,EAAE;QACjC,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,CAAC;YAC/B,IAAI,EAAE,MAAM;YACZ,WAAW,EAAE,IAAI;YACjB,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE;SAC9C,CAAC,CAAC;QACH,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QACzC,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,CAAC;YAC/B,IAAI,EAAE,MAAM;YACZ,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE;SACzC,CAAC,CAAC;QACH,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,aAAa,EAAE,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uBAAuB,EAAE,GAAG,EAAE;QAC/B,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,CAAC;YAC/B,IAAI,EAAE,UAAU;SACjB,CAAC,CAAC;QACH,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACpC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,aAAa,EAAE,CAAC;IACxC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,EAAE,CAAC,sBAAsB,EAAE,GAAG,EAAE;QAC9B,MAAM,IAAI,GAAqB;YAC7B,UAAU,EAAE,SAAS;YACrB,iBAAiB,EAAE,CAAC,QAAQ,CAAC;YAC7B,aAAa,EAAE,CAAC,QAAQ,CAAC;YACzB,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC;YAC1B,MAAM,EAAE,EAAE;SACX,CAAC;QACF,MAAM,GAAG,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;QAEjC,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAC;QAC7C,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;QAC1C,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;QAC1C,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iBAAiB,EAAE,GAAG,EAAE;QACzB,MAAM,IAAI,GAAqB;YAC7B,UAAU,EAAE,IAAI;YAChB,iBAAiB,EAAE,EAAE;YACrB,aAAa,EAAE,EAAE;YACjB,QAAQ,EAAE,EAAE;YACZ,MAAM,EAAE,EAAE;SACX,CAAC;QACF,MAAM,GAAG,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;QAEjC,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;QACpC,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QACtC,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QACtC,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|