@knowledgine/ingest 0.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 (70) hide show
  1. package/LICENSE +21 -0
  2. package/dist/cursor-store.d.ts +11 -0
  3. package/dist/cursor-store.d.ts.map +1 -0
  4. package/dist/cursor-store.js +42 -0
  5. package/dist/cursor-store.js.map +1 -0
  6. package/dist/event-writer.d.ts +18 -0
  7. package/dist/event-writer.d.ts.map +1 -0
  8. package/dist/event-writer.js +50 -0
  9. package/dist/event-writer.js.map +1 -0
  10. package/dist/index.d.ts +12 -0
  11. package/dist/index.d.ts.map +1 -0
  12. package/dist/index.js +11 -0
  13. package/dist/index.js.map +1 -0
  14. package/dist/ingest-engine.d.ts +20 -0
  15. package/dist/ingest-engine.d.ts.map +1 -0
  16. package/dist/ingest-engine.js +63 -0
  17. package/dist/ingest-engine.js.map +1 -0
  18. package/dist/normalizer.d.ts +7 -0
  19. package/dist/normalizer.d.ts.map +1 -0
  20. package/dist/normalizer.js +71 -0
  21. package/dist/normalizer.js.map +1 -0
  22. package/dist/plugin-registry.d.ts +14 -0
  23. package/dist/plugin-registry.d.ts.map +1 -0
  24. package/dist/plugin-registry.js +37 -0
  25. package/dist/plugin-registry.js.map +1 -0
  26. package/dist/plugins/claude-sessions/index.d.ts +14 -0
  27. package/dist/plugins/claude-sessions/index.d.ts.map +1 -0
  28. package/dist/plugins/claude-sessions/index.js +123 -0
  29. package/dist/plugins/claude-sessions/index.js.map +1 -0
  30. package/dist/plugins/claude-sessions/session-parser.d.ts +18 -0
  31. package/dist/plugins/claude-sessions/session-parser.d.ts.map +1 -0
  32. package/dist/plugins/claude-sessions/session-parser.js +84 -0
  33. package/dist/plugins/claude-sessions/session-parser.js.map +1 -0
  34. package/dist/plugins/git-history/git-parser.d.ts +27 -0
  35. package/dist/plugins/git-history/git-parser.d.ts.map +1 -0
  36. package/dist/plugins/git-history/git-parser.js +121 -0
  37. package/dist/plugins/git-history/git-parser.js.map +1 -0
  38. package/dist/plugins/git-history/index.d.ts +12 -0
  39. package/dist/plugins/git-history/index.d.ts.map +1 -0
  40. package/dist/plugins/git-history/index.js +82 -0
  41. package/dist/plugins/git-history/index.js.map +1 -0
  42. package/dist/plugins/github/gh-parser.d.ts +51 -0
  43. package/dist/plugins/github/gh-parser.d.ts.map +1 -0
  44. package/dist/plugins/github/gh-parser.js +127 -0
  45. package/dist/plugins/github/gh-parser.js.map +1 -0
  46. package/dist/plugins/github/index.d.ts +13 -0
  47. package/dist/plugins/github/index.d.ts.map +1 -0
  48. package/dist/plugins/github/index.js +127 -0
  49. package/dist/plugins/github/index.js.map +1 -0
  50. package/dist/plugins/markdown/index.d.ts +16 -0
  51. package/dist/plugins/markdown/index.d.ts.map +1 -0
  52. package/dist/plugins/markdown/index.js +97 -0
  53. package/dist/plugins/markdown/index.js.map +1 -0
  54. package/dist/plugins/obsidian/frontmatter-parser.d.ts +8 -0
  55. package/dist/plugins/obsidian/frontmatter-parser.d.ts.map +1 -0
  56. package/dist/plugins/obsidian/frontmatter-parser.js +51 -0
  57. package/dist/plugins/obsidian/frontmatter-parser.js.map +1 -0
  58. package/dist/plugins/obsidian/index.d.ts +15 -0
  59. package/dist/plugins/obsidian/index.d.ts.map +1 -0
  60. package/dist/plugins/obsidian/index.js +161 -0
  61. package/dist/plugins/obsidian/index.js.map +1 -0
  62. package/dist/plugins/obsidian/wikilink-parser.d.ts +10 -0
  63. package/dist/plugins/obsidian/wikilink-parser.d.ts.map +1 -0
  64. package/dist/plugins/obsidian/wikilink-parser.js +55 -0
  65. package/dist/plugins/obsidian/wikilink-parser.js.map +1 -0
  66. package/dist/types.d.ts +81 -0
  67. package/dist/types.d.ts.map +1 -0
  68. package/dist/types.js +2 -0
  69. package/dist/types.js.map +1 -0
  70. package/package.json +35 -0
@@ -0,0 +1,84 @@
1
+ import { createReadStream } from "node:fs";
2
+ import { createInterface } from "node:readline";
3
+ function isValidEntry(parsed) {
4
+ if (typeof parsed !== "object" || parsed === null)
5
+ return false;
6
+ const obj = parsed;
7
+ return typeof obj["type"] === "string" && typeof obj["uuid"] === "string";
8
+ }
9
+ export function isRelevantEntry(entry) {
10
+ return (entry.type === "user" ||
11
+ entry.type === "assistant" ||
12
+ entry.type === "system");
13
+ }
14
+ export function extractTextContent(content) {
15
+ if (typeof content === "string") {
16
+ return content;
17
+ }
18
+ if (!Array.isArray(content)) {
19
+ return "";
20
+ }
21
+ return content
22
+ .filter((block) => block !== null &&
23
+ typeof block === "object" &&
24
+ block.type === "text" &&
25
+ typeof block.text === "string")
26
+ .map((block) => block.text)
27
+ .join("");
28
+ }
29
+ export async function* parseSessionFile(filePath) {
30
+ const rl = createInterface({ input: createReadStream(filePath) });
31
+ try {
32
+ for await (const line of rl) {
33
+ if (!line.trim())
34
+ continue;
35
+ let parsed;
36
+ try {
37
+ parsed = JSON.parse(line);
38
+ }
39
+ catch {
40
+ // 破損行はスキップ
41
+ continue;
42
+ }
43
+ if (!isValidEntry(parsed))
44
+ continue;
45
+ if (!isRelevantEntry(parsed))
46
+ continue;
47
+ const entry = parsed;
48
+ // content フィールド抽出
49
+ const rawContent = entry["message"] != null
50
+ ? entry["message"]["content"]
51
+ : entry["content"];
52
+ const contentInput = rawContent;
53
+ const content = extractTextContent(contentInput ?? "");
54
+ if (!content)
55
+ continue;
56
+ const type = parsed.type;
57
+ const uuid = parsed.uuid;
58
+ // timestamp
59
+ const rawTs = entry["timestamp"] ?? entry["ts"];
60
+ const timestamp = typeof rawTs === "string" || typeof rawTs === "number"
61
+ ? new Date(rawTs)
62
+ : new Date(0);
63
+ // cwd
64
+ const cwd = typeof entry["cwd"] === "string" ? entry["cwd"] : "";
65
+ // gitBranch
66
+ const gitBranch = typeof entry["gitBranch"] === "string" ? entry["gitBranch"] : undefined;
67
+ // sessionId: エントリから取得できる場合、なければ空文字
68
+ const sessionId = typeof entry["sessionId"] === "string" ? entry["sessionId"] : "";
69
+ yield {
70
+ type,
71
+ timestamp,
72
+ sessionId,
73
+ content,
74
+ cwd,
75
+ gitBranch,
76
+ uuid,
77
+ };
78
+ }
79
+ }
80
+ finally {
81
+ rl.close();
82
+ }
83
+ }
84
+ //# sourceMappingURL=session-parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-parser.js","sourceRoot":"","sources":["../../../src/plugins/claude-sessions/session-parser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import type { NormalizedEvent } from "../../types.js";
2
+ export declare function execGit(args: string[], options: {
3
+ cwd: string;
4
+ maxBuffer?: number;
5
+ timeout?: number;
6
+ }): Promise<string>;
7
+ export declare function validateCheckpoint(checkpoint: string): string;
8
+ export interface ParsedCommit {
9
+ hash: string;
10
+ authorDate: string;
11
+ authorName: string;
12
+ authorEmail: string;
13
+ parents: string[];
14
+ subject: string;
15
+ body: string;
16
+ isMerge: boolean;
17
+ }
18
+ export declare function getGitLogFormat(): string;
19
+ export declare function parseGitLog(raw: string): ParsedCommit[];
20
+ export declare function getDiffsParallel(hashes: string[], options: {
21
+ cwd: string;
22
+ concurrency?: number;
23
+ maxDiffSize?: number;
24
+ }): Promise<Map<string, string>>;
25
+ export declare function truncateDiff(diff: string, maxSize?: number): string;
26
+ export declare function commitToNormalizedEvent(commit: ParsedCommit, diff: string, repoPath: string, currentBranch?: string): NormalizedEvent;
27
+ //# sourceMappingURL=git-parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-parser.d.ts","sourceRoot":"","sources":["../../../src/plugins/git-history/git-parser.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAKtD,wBAAsB,OAAO,CAC3B,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GAC7D,OAAO,CAAC,MAAM,CAAC,CAOjB;AAED,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAK7D;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;CAClB;AAKD,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,YAAY,EAAE,CA6CvD;AAED,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,MAAM,EAAE,EAChB,OAAO,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,GACnE,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CA0B9B;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAInE;AAcD,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,YAAY,EACpB,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,aAAa,CAAC,EAAE,MAAM,GACrB,eAAe,CAkBjB"}
@@ -0,0 +1,121 @@
1
+ import { execFile } from "node:child_process";
2
+ import { promisify } from "node:util";
3
+ import { basename } from "node:path";
4
+ const execFileAsync = promisify(execFile);
5
+ const SHA1_REGEX = /^[0-9a-f]{40}$/;
6
+ export async function execGit(args, options) {
7
+ const { stdout } = await execFileAsync("git", args, {
8
+ cwd: options.cwd,
9
+ maxBuffer: options.maxBuffer ?? 10 * 1024 * 1024,
10
+ timeout: options.timeout ?? 30_000,
11
+ });
12
+ return stdout;
13
+ }
14
+ export function validateCheckpoint(checkpoint) {
15
+ if (!SHA1_REGEX.test(checkpoint)) {
16
+ throw new Error(`Invalid checkpoint format: ${checkpoint}`);
17
+ }
18
+ return checkpoint;
19
+ }
20
+ const GIT_LOG_FORMAT = "---REC_SEP---%n%H%n%aI%n%an%n%ae%n%P%n%s%n---BODY_SEP---%n%b%n---REC_END---";
21
+ export function getGitLogFormat() {
22
+ return GIT_LOG_FORMAT;
23
+ }
24
+ export function parseGitLog(raw) {
25
+ const records = raw.split("---REC_END---");
26
+ const commits = [];
27
+ for (const record of records) {
28
+ const trimmed = record.trim();
29
+ if (!trimmed)
30
+ continue;
31
+ const recSepIdx = trimmed.indexOf("---REC_SEP---");
32
+ if (recSepIdx === -1)
33
+ continue;
34
+ const afterRecSep = trimmed.slice(recSepIdx + "---REC_SEP---".length).trimStart();
35
+ const bodySepIdx = afterRecSep.indexOf("---BODY_SEP---");
36
+ if (bodySepIdx === -1)
37
+ continue;
38
+ const headerPart = afterRecSep.slice(0, bodySepIdx).trimEnd();
39
+ const bodyPart = afterRecSep.slice(bodySepIdx + "---BODY_SEP---".length).trimStart().trimEnd();
40
+ const lines = headerPart.split("\n");
41
+ if (lines.length < 6)
42
+ continue;
43
+ const hash = lines[0].trim();
44
+ const authorDate = lines[1].trim();
45
+ const authorName = lines[2].trim();
46
+ const authorEmail = lines[3].trim();
47
+ const parentsRaw = lines[4].trim();
48
+ const subject = lines[5].trim();
49
+ if (!hash || !SHA1_REGEX.test(hash))
50
+ continue;
51
+ const parents = parentsRaw ? parentsRaw.split(" ").filter(Boolean) : [];
52
+ commits.push({
53
+ hash,
54
+ authorDate,
55
+ authorName,
56
+ authorEmail,
57
+ parents,
58
+ subject,
59
+ body: bodyPart,
60
+ isMerge: parents.length > 1,
61
+ });
62
+ }
63
+ return commits;
64
+ }
65
+ export async function getDiffsParallel(hashes, options) {
66
+ if (hashes.length === 0)
67
+ return new Map();
68
+ const concurrency = options.concurrency ?? 5;
69
+ const maxDiffSize = options.maxDiffSize ?? 50 * 1024;
70
+ const result = new Map();
71
+ for (let i = 0; i < hashes.length; i += concurrency) {
72
+ const batch = hashes.slice(i, i + concurrency);
73
+ await Promise.all(batch.map(async (hash) => {
74
+ try {
75
+ const diff = await execGit(["-c", "core.quotepath=false", "show", "--format=", "--diff-filter=ACDMRT", hash], { cwd: options.cwd });
76
+ result.set(hash, truncateDiff(diff, maxDiffSize));
77
+ }
78
+ catch (err) {
79
+ console.error(`Failed to get diff for commit ${hash}:`, err);
80
+ result.set(hash, "");
81
+ }
82
+ }));
83
+ }
84
+ return result;
85
+ }
86
+ export function truncateDiff(diff, maxSize) {
87
+ const limit = maxSize ?? 50 * 1024;
88
+ if (diff.length <= limit)
89
+ return diff;
90
+ return diff.slice(0, limit) + "\n... [truncated]";
91
+ }
92
+ function extractChangedPaths(diff) {
93
+ const paths = [];
94
+ const lines = diff.split("\n");
95
+ for (const line of lines) {
96
+ const match = line.match(/^diff --git a\/.+ b\/(.+)$/);
97
+ if (match && match[1]) {
98
+ paths.push(match[1]);
99
+ }
100
+ }
101
+ return paths;
102
+ }
103
+ export function commitToNormalizedEvent(commit, diff, repoPath, currentBranch) {
104
+ const metadata = {
105
+ sourcePlugin: "git-history",
106
+ sourceId: commit.hash,
107
+ author: `${commit.authorName} <${commit.authorEmail}>`,
108
+ project: basename(repoPath),
109
+ ...(currentBranch !== undefined ? { branch: currentBranch } : {}),
110
+ };
111
+ return {
112
+ sourceUri: `git://${repoPath}#${commit.hash}`,
113
+ eventType: "commit",
114
+ title: commit.subject,
115
+ content: `Author: ${commit.authorName} <${commit.authorEmail}>\nDate: ${commit.authorDate}\n\n${commit.subject}\n\n${commit.body}\n\n---\n${diff}`,
116
+ timestamp: new Date(commit.authorDate),
117
+ metadata,
118
+ relatedPaths: extractChangedPaths(diff),
119
+ };
120
+ }
121
+ //# sourceMappingURL=git-parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-parser.js","sourceRoot":"","sources":["../../../src/plugins/git-history/git-parser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAGrC,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAC1C,MAAM,UAAU,GAAG,gBAAgB,CAAC;AAEpC,MAAM,CAAC,KAAK,UAAU,OAAO,CAC3B,IAAc,EACd,OAA8D;IAE9D,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,aAAa,CAAC,KAAK,EAAE,IAAI,EAAE;QAClD,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,EAAE,GAAG,IAAI,GAAG,IAAI;QAChD,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,MAAM;KACnC,CAAC,CAAC;IACH,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,UAAkB;IACnD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CAAC,8BAA8B,UAAU,EAAE,CAAC,CAAC;IAC9D,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC;AAaD,MAAM,cAAc,GAClB,6EAA6E,CAAC;AAEhF,MAAM,UAAU,eAAe;IAC7B,OAAO,cAAc,CAAC;AACxB,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,GAAW;IACrC,MAAM,OAAO,GAAG,GAAG,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;IAC3C,MAAM,OAAO,GAAmB,EAAE,CAAC;IAEnC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;QAC9B,IAAI,CAAC,OAAO;YAAE,SAAS;QAEvB,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;QACnD,IAAI,SAAS,KAAK,CAAC,CAAC;YAAE,SAAS;QAE/B,MAAM,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC,SAAS,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,CAAC;QAClF,MAAM,UAAU,GAAG,WAAW,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;QACzD,IAAI,UAAU,KAAK,CAAC,CAAC;YAAE,SAAS;QAEhC,MAAM,UAAU,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,OAAO,EAAE,CAAC;QAC9D,MAAM,QAAQ,GAAG,WAAW,CAAC,KAAK,CAAC,UAAU,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,CAAC,OAAO,EAAE,CAAC;QAE/F,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACrC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;YAAE,SAAS;QAE/B,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC7B,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACnC,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACnC,MAAM,WAAW,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACpC,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACnC,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAEhC,IAAI,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,SAAS;QAE9C,MAAM,OAAO,GAAG,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAExE,OAAO,CAAC,IAAI,CAAC;YACX,IAAI;YACJ,UAAU;YACV,UAAU;YACV,WAAW;YACX,OAAO;YACP,OAAO;YACP,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,OAAO,CAAC,MAAM,GAAG,CAAC;SAC5B,CAAC,CAAC;IACL,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,MAAgB,EAChB,OAAoE;IAEpE,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,GAAG,EAAE,CAAC;IAE1C,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,CAAC,CAAC;IAC7C,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,EAAE,GAAG,IAAI,CAAC;IACrD,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;IAEzC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,IAAI,WAAW,EAAE,CAAC;QACpD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,WAAW,CAAC,CAAC;QAC/C,MAAM,OAAO,CAAC,GAAG,CACf,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;YACvB,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,MAAM,OAAO,CACxB,CAAC,IAAI,EAAE,sBAAsB,EAAE,MAAM,EAAE,WAAW,EAAE,sBAAsB,EAAE,IAAI,CAAC,EACjF,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,CACrB,CAAC;gBACF,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,YAAY,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC;YACpD,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,CAAC,KAAK,CAAC,iCAAiC,IAAI,GAAG,EAAE,GAAG,CAAC,CAAC;gBAC7D,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YACvB,CAAC;QACH,CAAC,CAAC,CACH,CAAC;IACJ,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,IAAY,EAAE,OAAgB;IACzD,MAAM,KAAK,GAAG,OAAO,IAAI,EAAE,GAAG,IAAI,CAAC;IACnC,IAAI,IAAI,CAAC,MAAM,IAAI,KAAK;QAAE,OAAO,IAAI,CAAC;IACtC,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,mBAAmB,CAAC;AACpD,CAAC;AAED,SAAS,mBAAmB,CAAC,IAAY;IACvC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC/B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;QACvD,IAAI,KAAK,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;YACtB,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,uBAAuB,CACrC,MAAoB,EACpB,IAAY,EACZ,QAAgB,EAChB,aAAsB;IAEtB,MAAM,QAAQ,GAAgC;QAC5C,YAAY,EAAE,aAAa;QAC3B,QAAQ,EAAE,MAAM,CAAC,IAAI;QACrB,MAAM,EAAE,GAAG,MAAM,CAAC,UAAU,KAAK,MAAM,CAAC,WAAW,GAAG;QACtD,OAAO,EAAE,QAAQ,CAAC,QAAQ,CAAC;QAC3B,GAAG,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAClE,CAAC;IAEF,OAAO;QACL,SAAS,EAAE,SAAS,QAAQ,IAAI,MAAM,CAAC,IAAI,EAAE;QAC7C,SAAS,EAAE,QAAQ;QACnB,KAAK,EAAE,MAAM,CAAC,OAAO;QACrB,OAAO,EAAE,WAAW,MAAM,CAAC,UAAU,KAAK,MAAM,CAAC,WAAW,YAAY,MAAM,CAAC,UAAU,OAAO,MAAM,CAAC,OAAO,OAAO,MAAM,CAAC,IAAI,YAAY,IAAI,EAAE;QAClJ,SAAS,EAAE,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC;QACtC,QAAQ;QACR,YAAY,EAAE,mBAAmB,CAAC,IAAI,CAAC;KACxC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { IngestPlugin, PluginManifest, TriggerConfig, PluginConfig, PluginInitResult, NormalizedEvent, SourceURI } from "../../types.js";
2
+ export declare class GitHistoryPlugin implements IngestPlugin {
3
+ readonly manifest: PluginManifest;
4
+ readonly triggers: TriggerConfig[];
5
+ initialize(_config?: PluginConfig): Promise<PluginInitResult>;
6
+ ingestAll(sourcePath: SourceURI): AsyncGenerator<NormalizedEvent>;
7
+ ingestIncremental(sourcePath: SourceURI, checkpoint: string): AsyncGenerator<NormalizedEvent>;
8
+ getCurrentCheckpoint(sourcePath: SourceURI): Promise<string>;
9
+ dispose(): Promise<void>;
10
+ private getBranch;
11
+ }
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/plugins/git-history/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,YAAY,EACZ,cAAc,EACd,aAAa,EACb,YAAY,EACZ,gBAAgB,EAChB,eAAe,EACf,SAAS,EACV,MAAM,gBAAgB,CAAC;AAUxB,qBAAa,gBAAiB,YAAW,YAAY;IACnD,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAM/B;IAEF,QAAQ,CAAC,QAAQ,EAAE,aAAa,EAAE,CAGhC;IAEI,UAAU,CAAC,OAAO,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAI5D,SAAS,CAAC,UAAU,EAAE,SAAS,GAAG,cAAc,CAAC,eAAe,CAAC;IAuCjE,iBAAiB,CACtB,UAAU,EAAE,SAAS,EACrB,UAAU,EAAE,MAAM,GACjB,cAAc,CAAC,eAAe,CAAC;IAsB5B,oBAAoB,CAAC,UAAU,EAAE,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC;IAK5D,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;YAIhB,SAAS;CAWxB"}
@@ -0,0 +1,82 @@
1
+ import { execGit, parseGitLog, getDiffsParallel, commitToNormalizedEvent, validateCheckpoint, getGitLogFormat, } from "./git-parser.js";
2
+ export class GitHistoryPlugin {
3
+ manifest = {
4
+ id: "git-history",
5
+ name: "Git History",
6
+ version: "0.1.0",
7
+ schemes: ["git://"],
8
+ priority: 1,
9
+ };
10
+ triggers = [
11
+ { type: "git_hook", hook: "post-commit" },
12
+ { type: "git_hook", hook: "post-merge" },
13
+ ];
14
+ async initialize(_config) {
15
+ return { ok: true };
16
+ }
17
+ async *ingestAll(sourcePath) {
18
+ try {
19
+ await execGit(["rev-parse", "--git-dir"], { cwd: sourcePath });
20
+ }
21
+ catch {
22
+ return;
23
+ }
24
+ const currentBranch = await this.getBranch(sourcePath);
25
+ let raw;
26
+ try {
27
+ raw = await execGit(["log", "--reverse", `--format=${getGitLogFormat()}`], { cwd: sourcePath });
28
+ }
29
+ catch (err) {
30
+ // コミットが0件の場合、git logがエラーを返すケースがある(初期ブランチでコミットなし)
31
+ const errObj = err;
32
+ if (typeof errObj.stderr === "string" &&
33
+ errObj.stderr.includes("does not have any commits yet")) {
34
+ return;
35
+ }
36
+ throw err;
37
+ }
38
+ const commits = parseGitLog(raw);
39
+ if (commits.length === 0)
40
+ return;
41
+ const hashes = commits.map((c) => c.hash);
42
+ const diffs = await getDiffsParallel(hashes, { cwd: sourcePath });
43
+ for (const commit of commits) {
44
+ const diff = diffs.get(commit.hash) ?? "";
45
+ yield commitToNormalizedEvent(commit, diff, sourcePath, currentBranch);
46
+ }
47
+ }
48
+ async *ingestIncremental(sourcePath, checkpoint) {
49
+ validateCheckpoint(checkpoint);
50
+ const currentBranch = await this.getBranch(sourcePath);
51
+ const raw = await execGit(["log", "--reverse", `--format=${getGitLogFormat()}`, `${checkpoint}..HEAD`], { cwd: sourcePath });
52
+ const commits = parseGitLog(raw);
53
+ if (commits.length === 0)
54
+ return;
55
+ const hashes = commits.map((c) => c.hash);
56
+ const diffs = await getDiffsParallel(hashes, { cwd: sourcePath });
57
+ for (const commit of commits) {
58
+ const diff = diffs.get(commit.hash) ?? "";
59
+ yield commitToNormalizedEvent(commit, diff, sourcePath, currentBranch);
60
+ }
61
+ }
62
+ async getCurrentCheckpoint(sourcePath) {
63
+ const result = await execGit(["rev-parse", "HEAD"], { cwd: sourcePath });
64
+ return result.trim();
65
+ }
66
+ async dispose() {
67
+ // no-op
68
+ }
69
+ async getBranch(sourcePath) {
70
+ try {
71
+ const branch = await execGit(["rev-parse", "--abbrev-ref", "HEAD"], {
72
+ cwd: sourcePath,
73
+ });
74
+ const trimmed = branch.trim();
75
+ return trimmed === "HEAD" ? undefined : trimmed;
76
+ }
77
+ catch {
78
+ return undefined;
79
+ }
80
+ }
81
+ }
82
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/plugins/git-history/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ import type { NormalizedEvent } from "../../types.js";
2
+ export declare function execGh(args: string[], options?: {
3
+ timeout?: number;
4
+ maxBuffer?: number;
5
+ }): Promise<string>;
6
+ export declare function checkGhAuth(): Promise<boolean>;
7
+ export declare function checkGhVersion(): Promise<{
8
+ ok: boolean;
9
+ version?: string;
10
+ error?: string;
11
+ }>;
12
+ export declare function parseGitHubSourceUri(uri: string): {
13
+ owner: string;
14
+ repo: string;
15
+ };
16
+ export interface ParsedPR {
17
+ number: number;
18
+ title: string;
19
+ body: string;
20
+ author: {
21
+ login: string;
22
+ };
23
+ state: string;
24
+ createdAt: string;
25
+ updatedAt: string;
26
+ url: string;
27
+ labels: Array<{
28
+ name: string;
29
+ }>;
30
+ reviewDecision: string;
31
+ }
32
+ export interface ParsedIssue {
33
+ number: number;
34
+ title: string;
35
+ body: string;
36
+ author: {
37
+ login: string;
38
+ };
39
+ state: string;
40
+ createdAt: string;
41
+ updatedAt: string;
42
+ url: string;
43
+ labels: Array<{
44
+ name: string;
45
+ }>;
46
+ }
47
+ export declare function parsePRList(json: string): ParsedPR[];
48
+ export declare function parseIssueList(json: string): ParsedIssue[];
49
+ export declare function prToNormalizedEvent(pr: ParsedPR, owner: string, repo: string): NormalizedEvent;
50
+ export declare function issueToNormalizedEvent(issue: ParsedIssue, owner: string, repo: string): NormalizedEvent;
51
+ //# sourceMappingURL=gh-parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gh-parser.d.ts","sourceRoot":"","sources":["../../../src/plugins/github/gh-parser.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAKtD,wBAAsB,MAAM,CAC1B,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,CAAC,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GACjD,OAAO,CAAC,MAAM,CAAC,CAMjB;AAED,wBAAsB,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC,CAOpD;AAED,wBAAsB,cAAc,IAAI,OAAO,CAAC;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAgBjG;AAED,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAKjF;AAED,MAAM,WAAW,QAAQ;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAChC,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACjC;AASD,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,EAAE,CAepD;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,EAAE,CAc1D;AAED,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,eAAe,CAoB9F;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,eAAe,CAmBvG"}
@@ -0,0 +1,127 @@
1
+ import { execFile } from "node:child_process";
2
+ import { promisify } from "node:util";
3
+ import { sanitizeContent } from "../../normalizer.js";
4
+ const execFileAsync = promisify(execFile);
5
+ export async function execGh(args, options) {
6
+ const { stdout } = await execFileAsync("gh", args, {
7
+ timeout: options?.timeout ?? 60_000,
8
+ maxBuffer: options?.maxBuffer ?? 10 * 1024 * 1024,
9
+ });
10
+ return stdout;
11
+ }
12
+ export async function checkGhAuth() {
13
+ try {
14
+ await execGh(["auth", "status"]);
15
+ return true;
16
+ }
17
+ catch {
18
+ return false;
19
+ }
20
+ }
21
+ export async function checkGhVersion() {
22
+ try {
23
+ const output = await execGh(["--version"]);
24
+ // "gh version 2.45.0 (2024-...)" のようなフォーマット
25
+ const match = output.match(/version\s+(\d+\.\d+\.\d+)/);
26
+ if (!match)
27
+ return { ok: false, error: "Could not parse gh version" };
28
+ const version = match[1];
29
+ // 最低 2.40.0
30
+ const [major, minor] = version.split(".").map(Number);
31
+ if (major < 2 || (major === 2 && minor < 40)) {
32
+ return { ok: false, version, error: `gh version ${version} is too old. Minimum: 2.40.0` };
33
+ }
34
+ return { ok: true, version };
35
+ }
36
+ catch {
37
+ return { ok: false, error: "gh CLI not found" };
38
+ }
39
+ }
40
+ export function parseGitHubSourceUri(uri) {
41
+ // "github://owner/repo" → { owner, repo }
42
+ const match = uri.match(/^github:\/\/([^/]+)\/([^/]+)/);
43
+ if (!match)
44
+ throw new Error(`Invalid GitHub source URI: ${uri}`);
45
+ return { owner: match[1], repo: match[2] };
46
+ }
47
+ const MAX_CONTENT_SIZE = 100 * 1024; // 100KB
48
+ function truncateContent(content) {
49
+ if (content.length <= MAX_CONTENT_SIZE)
50
+ return content;
51
+ return content.slice(0, MAX_CONTENT_SIZE) + "\n... [truncated]";
52
+ }
53
+ export function parsePRList(json) {
54
+ const data = JSON.parse(json);
55
+ if (!Array.isArray(data))
56
+ return [];
57
+ return data.map((item) => ({
58
+ number: item.number,
59
+ title: item.title ?? "",
60
+ body: item.body ?? "",
61
+ author: item.author ?? { login: "unknown" },
62
+ state: item.state ?? "",
63
+ createdAt: item.createdAt ?? "",
64
+ updatedAt: item.updatedAt ?? "",
65
+ url: item.url ?? "",
66
+ labels: item.labels ?? [],
67
+ reviewDecision: item.reviewDecision ?? "",
68
+ }));
69
+ }
70
+ export function parseIssueList(json) {
71
+ const data = JSON.parse(json);
72
+ if (!Array.isArray(data))
73
+ return [];
74
+ return data.map((item) => ({
75
+ number: item.number,
76
+ title: item.title ?? "",
77
+ body: item.body ?? "",
78
+ author: item.author ?? { login: "unknown" },
79
+ state: item.state ?? "",
80
+ createdAt: item.createdAt ?? "",
81
+ updatedAt: item.updatedAt ?? "",
82
+ url: item.url ?? "",
83
+ labels: item.labels ?? [],
84
+ }));
85
+ }
86
+ export function prToNormalizedEvent(pr, owner, repo) {
87
+ const content = sanitizeContent(truncateContent(pr.body));
88
+ return {
89
+ sourceUri: `github://${owner}/${repo}/pull/${pr.number}`,
90
+ eventType: "discussion",
91
+ title: `PR #${pr.number}: ${pr.title}`,
92
+ content,
93
+ timestamp: new Date(pr.updatedAt || pr.createdAt),
94
+ metadata: {
95
+ sourcePlugin: "github",
96
+ sourceId: `pr-${pr.number}`,
97
+ author: pr.author.login,
98
+ tags: pr.labels.map((l) => l.name),
99
+ extra: {
100
+ state: pr.state,
101
+ reviewDecision: pr.reviewDecision,
102
+ url: pr.url,
103
+ },
104
+ },
105
+ };
106
+ }
107
+ export function issueToNormalizedEvent(issue, owner, repo) {
108
+ const content = sanitizeContent(truncateContent(issue.body));
109
+ return {
110
+ sourceUri: `github://${owner}/${repo}/issues/${issue.number}`,
111
+ eventType: "document",
112
+ title: `Issue #${issue.number}: ${issue.title}`,
113
+ content,
114
+ timestamp: new Date(issue.updatedAt || issue.createdAt),
115
+ metadata: {
116
+ sourcePlugin: "github",
117
+ sourceId: `issue-${issue.number}`,
118
+ author: issue.author.login,
119
+ tags: issue.labels.map((l) => l.name),
120
+ extra: {
121
+ state: issue.state,
122
+ url: issue.url,
123
+ },
124
+ },
125
+ };
126
+ }
127
+ //# sourceMappingURL=gh-parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gh-parser.js","sourceRoot":"","sources":["../../../src/plugins/github/gh-parser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { IngestPlugin, PluginManifest, TriggerConfig, PluginConfig, PluginInitResult, NormalizedEvent, SourceURI } from "../../types.js";
2
+ export declare class GitHubPlugin implements IngestPlugin {
3
+ readonly manifest: PluginManifest;
4
+ readonly triggers: TriggerConfig[];
5
+ initialize(_config?: PluginConfig): Promise<PluginInitResult>;
6
+ ingestAll(sourceUri: SourceURI): AsyncGenerator<NormalizedEvent>;
7
+ ingestIncremental(sourceUri: SourceURI, checkpoint: string): AsyncGenerator<NormalizedEvent>;
8
+ getCurrentCheckpoint(_sourceUri: SourceURI): Promise<string>;
9
+ dispose(): Promise<void>;
10
+ /** Exponential backoff リトライ (3回、1s→2s→4s) */
11
+ private execWithRetry;
12
+ }
13
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/plugins/github/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,YAAY,EACZ,cAAc,EACd,aAAa,EACb,YAAY,EACZ,gBAAgB,EAChB,eAAe,EACf,SAAS,EACV,MAAM,gBAAgB,CAAC;AAYxB,qBAAa,YAAa,YAAW,YAAY;IAC/C,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAM/B;IAEF,QAAQ,CAAC,QAAQ,EAAE,aAAa,EAAE,CAGhC;IAEI,UAAU,CAAC,OAAO,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAY5D,SAAS,CAAC,SAAS,EAAE,SAAS,GAAG,cAAc,CAAC,eAAe,CAAC;IAsChE,iBAAiB,CAAC,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,GAAG,cAAc,CAAC,eAAe,CAAC;IA+C7F,oBAAoB,CAAC,UAAU,EAAE,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC;IAI5D,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAI9B,6CAA6C;YAC/B,aAAa;CAe5B"}