@tienne/gestalt 0.86.0 → 0.88.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/CLAUDE.md +6 -2
- package/dist/bin/gestalt-hook.d.ts +5 -0
- package/dist/bin/gestalt-hook.d.ts.map +1 -0
- package/dist/bin/gestalt-hook.js +51 -0
- package/dist/bin/gestalt-hook.js.map +1 -0
- package/dist/package.json +4 -3
- package/dist/plugin/role-agents/_shared/references/ai-tell-quick-rules.md +2 -2
- package/dist/plugin/skills/blast-radius/SKILL.md +11 -1
- package/dist/plugin/skills/diff-radius/SKILL.md +11 -0
- package/dist/plugin/skills/review/SKILL.md +9 -2
- package/dist/schemas/gestalt.schema.json +19 -0
- package/dist/src/cli/commands/harness-refs.d.ts +10 -0
- package/dist/src/cli/commands/harness-refs.d.ts.map +1 -1
- package/dist/src/cli/commands/harness-refs.js +40 -0
- package/dist/src/cli/commands/harness-refs.js.map +1 -1
- package/dist/src/cli/index.d.ts.map +1 -1
- package/dist/src/cli/index.js +10 -1
- package/dist/src/cli/index.js.map +1 -1
- package/dist/src/code-graph/cochange.d.ts +40 -0
- package/dist/src/code-graph/cochange.d.ts.map +1 -1
- package/dist/src/code-graph/cochange.js +88 -3
- package/dist/src/code-graph/cochange.js.map +1 -1
- package/dist/src/code-graph/engine.d.ts +35 -1
- package/dist/src/code-graph/engine.d.ts.map +1 -1
- package/dist/src/code-graph/engine.js +300 -55
- package/dist/src/code-graph/engine.js.map +1 -1
- package/dist/src/code-graph/freshness.d.ts +39 -0
- package/dist/src/code-graph/freshness.d.ts.map +1 -0
- package/dist/src/code-graph/freshness.js +93 -0
- package/dist/src/code-graph/freshness.js.map +1 -0
- package/dist/src/code-graph/hooks/background.d.ts +18 -0
- package/dist/src/code-graph/hooks/background.d.ts.map +1 -0
- package/dist/src/code-graph/hooks/background.js +55 -0
- package/dist/src/code-graph/hooks/background.js.map +1 -0
- package/dist/src/code-graph/hooks/pointers.d.ts +66 -0
- package/dist/src/code-graph/hooks/pointers.d.ts.map +1 -0
- package/dist/src/code-graph/hooks/pointers.js +292 -0
- package/dist/src/code-graph/hooks/pointers.js.map +1 -0
- package/dist/src/code-graph/hooks/rank.d.ts +36 -0
- package/dist/src/code-graph/hooks/rank.d.ts.map +1 -0
- package/dist/src/code-graph/hooks/rank.js +212 -0
- package/dist/src/code-graph/hooks/rank.js.map +1 -0
- package/dist/src/code-graph/hooks/run.d.ts +37 -0
- package/dist/src/code-graph/hooks/run.d.ts.map +1 -0
- package/dist/src/code-graph/hooks/run.js +324 -0
- package/dist/src/code-graph/hooks/run.js.map +1 -0
- package/dist/src/code-graph/hooks/settings.d.ts +11 -0
- package/dist/src/code-graph/hooks/settings.d.ts.map +1 -0
- package/dist/src/code-graph/hooks/settings.js +25 -0
- package/dist/src/code-graph/hooks/settings.js.map +1 -0
- package/dist/src/code-graph/hooks/state.d.ts +20 -0
- package/dist/src/code-graph/hooks/state.d.ts.map +1 -0
- package/dist/src/code-graph/hooks/state.js +73 -0
- package/dist/src/code-graph/hooks/state.js.map +1 -0
- package/dist/src/code-graph/index.d.ts +6 -2
- package/dist/src/code-graph/index.d.ts.map +1 -1
- package/dist/src/code-graph/index.js +3 -1
- package/dist/src/code-graph/index.js.map +1 -1
- package/dist/src/code-graph/ko-text.d.ts +39 -0
- package/dist/src/code-graph/ko-text.d.ts.map +1 -0
- package/dist/src/code-graph/ko-text.js +223 -0
- package/dist/src/code-graph/ko-text.js.map +1 -0
- package/dist/src/code-graph/lock.d.ts +30 -0
- package/dist/src/code-graph/lock.d.ts.map +1 -0
- package/dist/src/code-graph/lock.js +140 -0
- package/dist/src/code-graph/lock.js.map +1 -0
- package/dist/src/code-graph/plugins/typescript-skeleton.d.ts +7 -0
- package/dist/src/code-graph/plugins/typescript-skeleton.d.ts.map +1 -0
- package/dist/src/code-graph/plugins/typescript-skeleton.js +157 -0
- package/dist/src/code-graph/plugins/typescript-skeleton.js.map +1 -0
- package/dist/src/code-graph/plugins/typescript.d.ts.map +1 -1
- package/dist/src/code-graph/plugins/typescript.js +58 -0
- package/dist/src/code-graph/plugins/typescript.js.map +1 -1
- package/dist/src/code-graph/storage.d.ts +85 -0
- package/dist/src/code-graph/storage.d.ts.map +1 -1
- package/dist/src/code-graph/storage.js +318 -3
- package/dist/src/code-graph/storage.js.map +1 -1
- package/dist/src/code-graph/types.d.ts +66 -0
- package/dist/src/code-graph/types.d.ts.map +1 -1
- package/dist/src/core/config.d.ts +33 -0
- package/dist/src/core/config.d.ts.map +1 -1
- package/dist/src/core/config.js +14 -0
- package/dist/src/core/config.js.map +1 -1
- package/dist/src/core/hooks-env.d.ts +9 -0
- package/dist/src/core/hooks-env.d.ts.map +1 -0
- package/dist/src/core/hooks-env.js +16 -0
- package/dist/src/core/hooks-env.js.map +1 -0
- package/dist/src/harness-review/backward-search.d.ts +15 -2
- package/dist/src/harness-review/backward-search.d.ts.map +1 -1
- package/dist/src/harness-review/backward-search.js +101 -43
- package/dist/src/harness-review/backward-search.js.map +1 -1
- package/dist/src/harness-review/collect.d.ts +10 -1
- package/dist/src/harness-review/collect.d.ts.map +1 -1
- package/dist/src/harness-review/collect.js +66 -6
- package/dist/src/harness-review/collect.js.map +1 -1
- package/dist/src/harness-review/github-code-search.d.ts +32 -1
- package/dist/src/harness-review/github-code-search.d.ts.map +1 -1
- package/dist/src/harness-review/github-code-search.js +86 -2
- package/dist/src/harness-review/github-code-search.js.map +1 -1
- package/dist/src/harness-review/hybrid-search.d.ts +35 -0
- package/dist/src/harness-review/hybrid-search.d.ts.map +1 -0
- package/dist/src/harness-review/hybrid-search.js +63 -0
- package/dist/src/harness-review/hybrid-search.js.map +1 -0
- package/dist/src/harness-review/related-clones.d.ts +66 -0
- package/dist/src/harness-review/related-clones.d.ts.map +1 -0
- package/dist/src/harness-review/related-clones.js +309 -0
- package/dist/src/harness-review/related-clones.js.map +1 -0
- package/dist/src/harness-review/search-backend.d.ts +23 -1
- package/dist/src/harness-review/search-backend.d.ts.map +1 -1
- package/dist/src/harness-review/search-backend.js +13 -1
- package/dist/src/harness-review/search-backend.js.map +1 -1
- package/dist/src/humanize/detectors.js +1 -1
- package/dist/src/humanize/detectors.js.map +1 -1
- package/dist/src/mcp/schemas.d.ts +9 -3
- package/dist/src/mcp/schemas.d.ts.map +1 -1
- package/dist/src/mcp/schemas.js +19 -2
- package/dist/src/mcp/schemas.js.map +1 -1
- package/dist/src/mcp/server.d.ts.map +1 -1
- package/dist/src/mcp/server.js +21 -3
- package/dist/src/mcp/server.js.map +1 -1
- package/dist/src/mcp/tools/code-graph-passthrough.d.ts +6 -1
- package/dist/src/mcp/tools/code-graph-passthrough.d.ts.map +1 -1
- package/dist/src/mcp/tools/code-graph-passthrough.js +95 -6
- package/dist/src/mcp/tools/code-graph-passthrough.js.map +1 -1
- package/package.json +4 -3
- package/plugin/.codex-plugin/plugin.json +1 -1
- package/plugin/.mcp.json +1 -1
- package/plugin/mcp.json +1 -1
- package/plugin/role-agents/_shared/references/ai-tell-quick-rules.md +2 -2
- package/plugin/skills/blast-radius/SKILL.md +11 -1
- package/plugin/skills/diff-radius/SKILL.md +11 -0
- package/plugin/skills/review/SKILL.md +9 -2
- package/schemas/gestalt.schema.json +19 -0
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/** 세션마다 기억하는 포인터 수. 넘으면 오래된 것부터 잊는다 */
|
|
2
|
+
export declare const MAX_REMEMBERED = 40;
|
|
3
|
+
export interface SessionState {
|
|
4
|
+
/** UserPromptSubmit에서 넣은 포인터. 키는 `상대경로#심볼이름` */
|
|
5
|
+
pointers: string[];
|
|
6
|
+
/** PostToolUse에서 영향 범위를 넣은 파일 */
|
|
7
|
+
impacts: string[];
|
|
8
|
+
}
|
|
9
|
+
export declare function hooksDir(repoRoot: string): string;
|
|
10
|
+
export declare function readSessionState(repoRoot: string, sessionId: string): SessionState;
|
|
11
|
+
/** 새 키를 뒤에 붙이고 MAX_REMEMBERED만 남긴다 */
|
|
12
|
+
export declare function remember(list: string[], keys: string[]): string[];
|
|
13
|
+
/**
|
|
14
|
+
* 임시 파일에 쓰고 rename한다. 같은 세션의 훅 둘이 겹쳐 돌아도 반쯤 쓴 JSON을
|
|
15
|
+
* 읽지 않게 하려는 것이다. 겹친 쪽 하나의 기록이 사라질 수는 있는데, 그러면 포인터가
|
|
16
|
+
* 한 번 더 들어갈 뿐이라 락까지는 안 잡는다.
|
|
17
|
+
*/
|
|
18
|
+
export declare function writeSessionState(repoRoot: string, sessionId: string, state: SessionState): void;
|
|
19
|
+
export declare function pruneSessionStates(repoRoot: string, now?: number): void;
|
|
20
|
+
//# sourceMappingURL=state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../../../src/code-graph/hooks/state.ts"],"names":[],"mappings":"AAWA,uCAAuC;AACvC,eAAO,MAAM,cAAc,KAAK,CAAC;AAKjC,MAAM,WAAW,YAAY;IAC3B,gDAAgD;IAChD,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,iCAAiC;IACjC,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEjD;AAiBD,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,YAAY,CAWlF;AAED,sCAAsC;AACtC,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAGjE;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,GAAG,IAAI,CAOhG;AAED,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,SAAa,GAAG,IAAI,CAe3E"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { mkdirSync, readFileSync, readdirSync, renameSync, statSync, unlinkSync, writeFileSync, } from 'node:fs';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
/** 세션마다 기억하는 포인터 수. 넘으면 오래된 것부터 잊는다 */
|
|
4
|
+
export const MAX_REMEMBERED = 40;
|
|
5
|
+
/** 이보다 오래 안 쓰인 세션 상태 파일은 SessionStart 때 지운다 */
|
|
6
|
+
const SESSION_STATE_TTL_MS = 7 * 24 * 60 * 60 * 1000;
|
|
7
|
+
export function hooksDir(repoRoot) {
|
|
8
|
+
return join(repoRoot, '.gestalt', 'hooks');
|
|
9
|
+
}
|
|
10
|
+
function sessionsDir(repoRoot) {
|
|
11
|
+
return join(hooksDir(repoRoot), 'sessions');
|
|
12
|
+
}
|
|
13
|
+
/** session_id는 밖에서 들어온 값이라 파일 이름에 쓸 수 있는 글자만 남긴다 */
|
|
14
|
+
function sessionFile(repoRoot, sessionId) {
|
|
15
|
+
const safe = sessionId.replace(/[^A-Za-z0-9_-]/g, '').slice(0, 128);
|
|
16
|
+
if (!safe)
|
|
17
|
+
return null;
|
|
18
|
+
return join(sessionsDir(repoRoot), `${safe}.json`);
|
|
19
|
+
}
|
|
20
|
+
function asStrings(v) {
|
|
21
|
+
return Array.isArray(v) ? v.filter((x) => typeof x === 'string') : [];
|
|
22
|
+
}
|
|
23
|
+
export function readSessionState(repoRoot, sessionId) {
|
|
24
|
+
const file = sessionFile(repoRoot, sessionId);
|
|
25
|
+
if (!file)
|
|
26
|
+
return { pointers: [], impacts: [] };
|
|
27
|
+
try {
|
|
28
|
+
const raw = JSON.parse(readFileSync(file, 'utf-8'));
|
|
29
|
+
return { pointers: asStrings(raw.pointers), impacts: asStrings(raw.impacts) };
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
return { pointers: [], impacts: [] };
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
/** 새 키를 뒤에 붙이고 MAX_REMEMBERED만 남긴다 */
|
|
36
|
+
export function remember(list, keys) {
|
|
37
|
+
const merged = [...list.filter((k) => !keys.includes(k)), ...keys];
|
|
38
|
+
return merged.slice(-MAX_REMEMBERED);
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* 임시 파일에 쓰고 rename한다. 같은 세션의 훅 둘이 겹쳐 돌아도 반쯤 쓴 JSON을
|
|
42
|
+
* 읽지 않게 하려는 것이다. 겹친 쪽 하나의 기록이 사라질 수는 있는데, 그러면 포인터가
|
|
43
|
+
* 한 번 더 들어갈 뿐이라 락까지는 안 잡는다.
|
|
44
|
+
*/
|
|
45
|
+
export function writeSessionState(repoRoot, sessionId, state) {
|
|
46
|
+
const file = sessionFile(repoRoot, sessionId);
|
|
47
|
+
if (!file)
|
|
48
|
+
return;
|
|
49
|
+
mkdirSync(sessionsDir(repoRoot), { recursive: true });
|
|
50
|
+
const tmp = `${file}.${process.pid}.tmp`;
|
|
51
|
+
writeFileSync(tmp, JSON.stringify(state));
|
|
52
|
+
renameSync(tmp, file);
|
|
53
|
+
}
|
|
54
|
+
export function pruneSessionStates(repoRoot, now = Date.now()) {
|
|
55
|
+
let entries;
|
|
56
|
+
try {
|
|
57
|
+
entries = readdirSync(sessionsDir(repoRoot));
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
for (const name of entries) {
|
|
63
|
+
const path = join(sessionsDir(repoRoot), name);
|
|
64
|
+
try {
|
|
65
|
+
if (now - statSync(path).mtimeMs > SESSION_STATE_TTL_MS)
|
|
66
|
+
unlinkSync(path);
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
// 다른 세션이 먼저 지웠다
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.js","sourceRoot":"","sources":["../../../../src/code-graph/hooks/state.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +1,14 @@
|
|
|
1
|
-
export { CodeGraphEngine, codeGraphEngine } from './engine.js';
|
|
1
|
+
export { CodeGraphEngine, codeGraphEngine, MAX_INLINE_PARSE } from './engine.js';
|
|
2
2
|
export { CodeGraphStore, MAX_MATCHED_ROWS } from './storage.js';
|
|
3
3
|
export type { CoChangeScan, CoChangeNeighborRow, CoChangePairRow } from './storage.js';
|
|
4
4
|
export { computeBlastRadius } from './blast-radius.js';
|
|
5
5
|
export { syncCoChange, queryCoChange, buildCoChangeLookup, parseGitLog, countPairs, scoreNeighbor, MAX_FILES_PER_COMMIT, MIN_FILES_PER_COMMIT, MIN_PAIR_COUNT, DEFAULT_MIN_CONFIDENCE, DEFAULT_NEIGHBOR_LIMIT, DEFAULT_PAIR_LIMIT, CONFIDENCE_DECIMALS, LIFT_DECIMALS, } from './cochange.js';
|
|
6
6
|
export type { CoChangeQueryOptions, CoChangeSyncOptions, CommitRecord } from './cochange.js';
|
|
7
7
|
export { getPluginForFile, pluginRegistry } from './plugins/index.js';
|
|
8
|
-
export type { CodeGraphNode, CodeGraphEdge, BlastRadiusResult, BlastRadiusNode, BlastRadiusOptions, BuildOptions, BuildResult, QueryPattern, QueryResult, CodeGraphStats, AnalyzerPlugin, ParseResult, ImpactOrigin, RankedImpactFile, CoChangeNeighbor, CoChangePair, CoChangeResult, CoChangeLookup, CoChangeBuildSummary, CoChangeMeta, CoChangeTuning, } from './types.js';
|
|
8
|
+
export type { CodeGraphNode, CodeGraphEdge, BlastRadiusResult, BlastRadiusNode, BlastRadiusOptions, BuildOptions, BuildResult, QueryPattern, QueryResult, CodeGraphStats, AnalyzerPlugin, ParseResult, ImpactOrigin, RankedImpactFile, CoChangeNeighbor, CoChangePair, CoChangeResult, CoChangeLookup, CoChangeBuildSummary, CoChangeMeta, CoChangeTuning, FreshnessCounts, FreshnessReport, RefreshOptions, SkeletonEntry, SkeletonResult, } from './types.js';
|
|
9
|
+
export { detectDrift, RACY_WINDOW_MS } from './freshness.js';
|
|
10
|
+
export type { DriftReport, FileStamp } from './freshness.js';
|
|
11
|
+
export { acquireLock, tryAcquireLock, LOCK_STALE_MS } from './lock.js';
|
|
12
|
+
export type { LockHandle, LockOptions } from './lock.js';
|
|
9
13
|
export { NodeKind, EdgeKind } from './types.js';
|
|
10
14
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/code-graph/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/code-graph/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACjF,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChE,YAAY,EAAE,YAAY,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AACvF,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EACL,YAAY,EACZ,aAAa,EACb,mBAAmB,EACnB,WAAW,EACX,UAAU,EACV,aAAa,EACb,oBAAoB,EACpB,oBAAoB,EACpB,cAAc,EACd,sBAAsB,EACtB,sBAAsB,EACtB,kBAAkB,EAClB,mBAAmB,EACnB,aAAa,GACd,MAAM,eAAe,CAAC;AACvB,YAAY,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7F,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACtE,YAAY,EACV,aAAa,EACb,aAAa,EACb,iBAAiB,EACjB,eAAe,EACf,kBAAkB,EAClB,YAAY,EACZ,WAAW,EACX,YAAY,EACZ,WAAW,EACX,cAAc,EACd,cAAc,EACd,WAAW,EACX,YAAY,EACZ,gBAAgB,EAChB,gBAAgB,EAChB,YAAY,EACZ,cAAc,EACd,cAAc,EACd,oBAAoB,EACpB,YAAY,EACZ,cAAc,EACd,eAAe,EACf,eAAe,EACf,cAAc,EACd,aAAa,EACb,cAAc,GACf,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAC7D,YAAY,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AACvE,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACzD,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -1,7 +1,9 @@
|
|
|
1
|
-
export { CodeGraphEngine, codeGraphEngine } from './engine.js';
|
|
1
|
+
export { CodeGraphEngine, codeGraphEngine, MAX_INLINE_PARSE } from './engine.js';
|
|
2
2
|
export { CodeGraphStore, MAX_MATCHED_ROWS } from './storage.js';
|
|
3
3
|
export { computeBlastRadius } from './blast-radius.js';
|
|
4
4
|
export { syncCoChange, queryCoChange, buildCoChangeLookup, parseGitLog, countPairs, scoreNeighbor, MAX_FILES_PER_COMMIT, MIN_FILES_PER_COMMIT, MIN_PAIR_COUNT, DEFAULT_MIN_CONFIDENCE, DEFAULT_NEIGHBOR_LIMIT, DEFAULT_PAIR_LIMIT, CONFIDENCE_DECIMALS, LIFT_DECIMALS, } from './cochange.js';
|
|
5
5
|
export { getPluginForFile, pluginRegistry } from './plugins/index.js';
|
|
6
|
+
export { detectDrift, RACY_WINDOW_MS } from './freshness.js';
|
|
7
|
+
export { acquireLock, tryAcquireLock, LOCK_STALE_MS } from './lock.js';
|
|
6
8
|
export { NodeKind, EdgeKind } from './types.js';
|
|
7
9
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/code-graph/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/code-graph/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACjF,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEhE,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EACL,YAAY,EACZ,aAAa,EACb,mBAAmB,EACnB,WAAW,EACX,UAAU,EACV,aAAa,EACb,oBAAoB,EACpB,oBAAoB,EACpB,cAAc,EACd,sBAAsB,EACtB,sBAAsB,EACtB,kBAAkB,EAClB,mBAAmB,EACnB,aAAa,GACd,MAAM,eAAe,CAAC;AAEvB,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AA6BtE,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAE7D,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAEvE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 한국어 텍스트를 색인 단어로 쪼갠다. 사전을 쓰지 않는다.
|
|
3
|
+
*
|
|
4
|
+
* 어절 끝의 흔한 조사와 어미를 짧은 목록으로 떼고 남은 줄기를 음절 bigram으로 쪼갠다.
|
|
5
|
+
* "인터뷰 점수가" → 인터, 터뷰 / 점수. 형태소 분석기가 없어도 같은 낱말은 같은 bigram을
|
|
6
|
+
* 내서 색인 쪽과 프롬프트 쪽이 만난다.
|
|
7
|
+
*
|
|
8
|
+
* 빌드(주석, 커밋 메시지 색인)와 훅(프롬프트)이 이 모듈 하나를 같이 쓴다. 훅의 기동 경로에
|
|
9
|
+
* 들어가므로 의존성을 두지 않는다.
|
|
10
|
+
*/
|
|
11
|
+
/** 주석 하나에서 색인에 넣는 최대 글자 수. 긴 설명 주석 하나가 파일의 단어를 다 차지하지 않게 */
|
|
12
|
+
export declare const MAX_DOC_CHARS = 400;
|
|
13
|
+
export declare function hasHangul(text: string): boolean;
|
|
14
|
+
export declare function stripSuffix(eojeol: string): string;
|
|
15
|
+
/** 줄기를 bigram으로. 1음절이면 그 음절 하나 */
|
|
16
|
+
export declare function bigrams(stem: string): string[];
|
|
17
|
+
export interface KoEojeol {
|
|
18
|
+
/** 조사와 어미를 뗀 줄기 */
|
|
19
|
+
stem: string;
|
|
20
|
+
/**
|
|
21
|
+
* 프롬프트에 적힌 그대로의 어절. 주입 문구에 "어떤 단어로 걸렸는지"를 보여줄 때 쓴다.
|
|
22
|
+
* 사전이 없어서 "해상도"도 조사 "도"로 보고 "해상"까지 자른다. 색인 쪽도 똑같이 잘라서
|
|
23
|
+
* 매칭은 맞지만 줄기를 그대로 보여주면 낯선 말이 된다
|
|
24
|
+
*/
|
|
25
|
+
surface: string;
|
|
26
|
+
terms: string[];
|
|
27
|
+
}
|
|
28
|
+
/** 프롬프트용. 어절마다 줄기와 bigram을 따로 들고 간다. 게이트가 어절 수를 세야 해서다 */
|
|
29
|
+
export declare function koreanEojeols(text: string): KoEojeol[];
|
|
30
|
+
/** 색인용. 텍스트 하나에서 나온 bigram 집합 */
|
|
31
|
+
export declare function koreanTerms(text: string): string[];
|
|
32
|
+
/**
|
|
33
|
+
* `CT-31408`, `BIZRES-12636` 꼴. Jira 프로젝트 키처럼 접두어는 두 글자 이상이어야 한다.
|
|
34
|
+
* 한 글자를 받으면 `I-7`, `C-11` 같은 규칙 번호까지 티켓으로 잡힌다
|
|
35
|
+
*/
|
|
36
|
+
export declare function extractTickets(text: string): string[];
|
|
37
|
+
/** 주석 원문을 색인할 텍스트로 줄인다. 한글이 없으면 undefined */
|
|
38
|
+
export declare function docText(raw: string): string | undefined;
|
|
39
|
+
//# sourceMappingURL=ko-text.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ko-text.d.ts","sourceRoot":"","sources":["../../../src/code-graph/ko-text.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAKH,4DAA4D;AAC5D,eAAO,MAAM,aAAa,MAAM,CAAC;AA4IjC,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAE/C;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAKlD;AAED,kCAAkC;AAClC,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAK9C;AAED,MAAM,WAAW,QAAQ;IACvB,mBAAmB;IACnB,IAAI,EAAE,MAAM,CAAC;IACb;;;;OAIG;IACH,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,0DAA0D;AAC1D,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,EAAE,CAatD;AAED,iCAAiC;AACjC,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAIlD;AAOD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAOrD;AAED,6CAA6C;AAC7C,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAQvD"}
|
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 한국어 텍스트를 색인 단어로 쪼갠다. 사전을 쓰지 않는다.
|
|
3
|
+
*
|
|
4
|
+
* 어절 끝의 흔한 조사와 어미를 짧은 목록으로 떼고 남은 줄기를 음절 bigram으로 쪼갠다.
|
|
5
|
+
* "인터뷰 점수가" → 인터, 터뷰 / 점수. 형태소 분석기가 없어도 같은 낱말은 같은 bigram을
|
|
6
|
+
* 내서 색인 쪽과 프롬프트 쪽이 만난다.
|
|
7
|
+
*
|
|
8
|
+
* 빌드(주석, 커밋 메시지 색인)와 훅(프롬프트)이 이 모듈 하나를 같이 쓴다. 훅의 기동 경로에
|
|
9
|
+
* 들어가므로 의존성을 두지 않는다.
|
|
10
|
+
*/
|
|
11
|
+
const HANGUL_RUN = /[가-힣]+/g;
|
|
12
|
+
const HANGUL = /[가-힣]/;
|
|
13
|
+
/** 주석 하나에서 색인에 넣는 최대 글자 수. 긴 설명 주석 하나가 파일의 단어를 다 차지하지 않게 */
|
|
14
|
+
export const MAX_DOC_CHARS = 400;
|
|
15
|
+
/**
|
|
16
|
+
* 뗄 꼬리. 긴 것부터 맞춰본다 — "에서"를 "서"보다 먼저 봐야 한다.
|
|
17
|
+
* 떼고 남은 줄기가 2음절 미만이면 안 뗀다. "아이"에서 "이"를 떼면 다른 낱말이 된다.
|
|
18
|
+
*/
|
|
19
|
+
const SUFFIXES = [
|
|
20
|
+
'했는데요',
|
|
21
|
+
'했는데',
|
|
22
|
+
'하는데',
|
|
23
|
+
'해주세요',
|
|
24
|
+
'했어요',
|
|
25
|
+
'해줘요',
|
|
26
|
+
'인데요',
|
|
27
|
+
'거든요',
|
|
28
|
+
'에서는',
|
|
29
|
+
'으로는',
|
|
30
|
+
'이라서',
|
|
31
|
+
'라서',
|
|
32
|
+
'해줘',
|
|
33
|
+
'했어',
|
|
34
|
+
'했다',
|
|
35
|
+
'하고',
|
|
36
|
+
'하는',
|
|
37
|
+
'하면',
|
|
38
|
+
'해서',
|
|
39
|
+
'하게',
|
|
40
|
+
'해요',
|
|
41
|
+
'인데',
|
|
42
|
+
'는데',
|
|
43
|
+
'에서',
|
|
44
|
+
'으로',
|
|
45
|
+
'에게',
|
|
46
|
+
'한테',
|
|
47
|
+
'까지',
|
|
48
|
+
'부터',
|
|
49
|
+
'처럼',
|
|
50
|
+
'보다',
|
|
51
|
+
'이랑',
|
|
52
|
+
'이나',
|
|
53
|
+
'이고',
|
|
54
|
+
'이면',
|
|
55
|
+
'이다',
|
|
56
|
+
'입니다',
|
|
57
|
+
'합니다',
|
|
58
|
+
'됩니다',
|
|
59
|
+
'되는',
|
|
60
|
+
'되고',
|
|
61
|
+
'된다',
|
|
62
|
+
'돼요',
|
|
63
|
+
'안돼',
|
|
64
|
+
'은',
|
|
65
|
+
'는',
|
|
66
|
+
'이',
|
|
67
|
+
'가',
|
|
68
|
+
'을',
|
|
69
|
+
'를',
|
|
70
|
+
'에',
|
|
71
|
+
'로',
|
|
72
|
+
'의',
|
|
73
|
+
'도',
|
|
74
|
+
'만',
|
|
75
|
+
'와',
|
|
76
|
+
'과',
|
|
77
|
+
'랑',
|
|
78
|
+
'요',
|
|
79
|
+
].sort((a, b) => b.length - a.length);
|
|
80
|
+
const SUFFIX_SET = new Set(SUFFIXES);
|
|
81
|
+
/**
|
|
82
|
+
* 어디에나 끼는 낱말. 대부분은 IDF가 눌러주지만 프롬프트에 너무 자주 나와서
|
|
83
|
+
* 게이트의 "어절 둘 이상" 조건을 혼자 채워버리는 것만 뺀다.
|
|
84
|
+
*/
|
|
85
|
+
const KO_STOPWORDS = new Set([
|
|
86
|
+
'코드',
|
|
87
|
+
'파일',
|
|
88
|
+
'수정',
|
|
89
|
+
'확인',
|
|
90
|
+
'작업',
|
|
91
|
+
'이거',
|
|
92
|
+
'그거',
|
|
93
|
+
'저거',
|
|
94
|
+
'여기',
|
|
95
|
+
'거기',
|
|
96
|
+
'지금',
|
|
97
|
+
'이번',
|
|
98
|
+
'다시',
|
|
99
|
+
'그냥',
|
|
100
|
+
'혹시',
|
|
101
|
+
'어디',
|
|
102
|
+
'어떻게',
|
|
103
|
+
'부분',
|
|
104
|
+
'내용',
|
|
105
|
+
'관련',
|
|
106
|
+
'사용',
|
|
107
|
+
'추가',
|
|
108
|
+
'처리',
|
|
109
|
+
'문제',
|
|
110
|
+
'기능',
|
|
111
|
+
'정리',
|
|
112
|
+
'진행',
|
|
113
|
+
'같아',
|
|
114
|
+
'같은',
|
|
115
|
+
'있는',
|
|
116
|
+
'없는',
|
|
117
|
+
'있어',
|
|
118
|
+
'없어',
|
|
119
|
+
'그리고',
|
|
120
|
+
'근데',
|
|
121
|
+
'그래서',
|
|
122
|
+
'이제',
|
|
123
|
+
'먼저',
|
|
124
|
+
'해줘',
|
|
125
|
+
'봐줘',
|
|
126
|
+
'알려줘',
|
|
127
|
+
// 1음절 어절은 bigram 없이 그대로 색인되니 기능어가 그대로 맞는다
|
|
128
|
+
'것',
|
|
129
|
+
'거',
|
|
130
|
+
'수',
|
|
131
|
+
'좀',
|
|
132
|
+
'뭐',
|
|
133
|
+
'왜',
|
|
134
|
+
'안',
|
|
135
|
+
'잘',
|
|
136
|
+
'더',
|
|
137
|
+
'다',
|
|
138
|
+
'또',
|
|
139
|
+
'할',
|
|
140
|
+
'한',
|
|
141
|
+
'될',
|
|
142
|
+
'된',
|
|
143
|
+
'해',
|
|
144
|
+
'해야',
|
|
145
|
+
'하기',
|
|
146
|
+
'하면',
|
|
147
|
+
'있다',
|
|
148
|
+
'없다',
|
|
149
|
+
'같다',
|
|
150
|
+
]);
|
|
151
|
+
export function hasHangul(text) {
|
|
152
|
+
return HANGUL.test(text);
|
|
153
|
+
}
|
|
154
|
+
export function stripSuffix(eojeol) {
|
|
155
|
+
for (const s of SUFFIXES) {
|
|
156
|
+
if (eojeol.length - s.length >= 2 && eojeol.endsWith(s))
|
|
157
|
+
return eojeol.slice(0, -s.length);
|
|
158
|
+
}
|
|
159
|
+
return eojeol;
|
|
160
|
+
}
|
|
161
|
+
/** 줄기를 bigram으로. 1음절이면 그 음절 하나 */
|
|
162
|
+
export function bigrams(stem) {
|
|
163
|
+
if (stem.length <= 1)
|
|
164
|
+
return stem ? [stem] : [];
|
|
165
|
+
const out = [];
|
|
166
|
+
for (let i = 0; i < stem.length - 1; i++)
|
|
167
|
+
out.push(stem.slice(i, i + 2));
|
|
168
|
+
return out;
|
|
169
|
+
}
|
|
170
|
+
/** 프롬프트용. 어절마다 줄기와 bigram을 따로 들고 간다. 게이트가 어절 수를 세야 해서다 */
|
|
171
|
+
export function koreanEojeols(text) {
|
|
172
|
+
const out = [];
|
|
173
|
+
const seen = new Set();
|
|
174
|
+
for (const m of text.matchAll(HANGUL_RUN)) {
|
|
175
|
+
// "calculateTotal에서", "rules가"처럼 영문에 바로 붙은 조사는 낱말이 아니다
|
|
176
|
+
const prev = text[m.index - 1];
|
|
177
|
+
if (prev && /[A-Za-z0-9_)\]`'"]/.test(prev) && SUFFIX_SET.has(m[0]))
|
|
178
|
+
continue;
|
|
179
|
+
const stem = stripSuffix(m[0]);
|
|
180
|
+
if (KO_STOPWORDS.has(stem) || KO_STOPWORDS.has(m[0]) || seen.has(stem))
|
|
181
|
+
continue;
|
|
182
|
+
seen.add(stem);
|
|
183
|
+
out.push({ stem, surface: m[0], terms: [...new Set(bigrams(stem))] });
|
|
184
|
+
}
|
|
185
|
+
return out;
|
|
186
|
+
}
|
|
187
|
+
/** 색인용. 텍스트 하나에서 나온 bigram 집합 */
|
|
188
|
+
export function koreanTerms(text) {
|
|
189
|
+
const terms = new Set();
|
|
190
|
+
for (const e of koreanEojeols(text))
|
|
191
|
+
for (const t of e.terms)
|
|
192
|
+
terms.add(t);
|
|
193
|
+
return [...terms];
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* 티켓 키로 보지 않는 접두어. `UTF-8`, `SHA-256`처럼 대문자-숫자 꼴인 표준 이름이다.
|
|
197
|
+
*/
|
|
198
|
+
const NOT_TICKETS = new Set(['UTF', 'SHA', 'ISO', 'ES', 'MD', 'RFC', 'HTTP', 'TLS', 'AES', 'RSA']);
|
|
199
|
+
/**
|
|
200
|
+
* `CT-31408`, `BIZRES-12636` 꼴. Jira 프로젝트 키처럼 접두어는 두 글자 이상이어야 한다.
|
|
201
|
+
* 한 글자를 받으면 `I-7`, `C-11` 같은 규칙 번호까지 티켓으로 잡힌다
|
|
202
|
+
*/
|
|
203
|
+
export function extractTickets(text) {
|
|
204
|
+
const out = new Set();
|
|
205
|
+
for (const m of text.matchAll(/(?<![A-Za-z0-9])([A-Z][A-Z0-9]{1,15})-(\d{1,7})(?![0-9])/g)) {
|
|
206
|
+
if (NOT_TICKETS.has(m[1]))
|
|
207
|
+
continue;
|
|
208
|
+
out.add(`${m[1]}-${m[2]}`);
|
|
209
|
+
}
|
|
210
|
+
return [...out];
|
|
211
|
+
}
|
|
212
|
+
/** 주석 원문을 색인할 텍스트로 줄인다. 한글이 없으면 undefined */
|
|
213
|
+
export function docText(raw) {
|
|
214
|
+
const text = raw
|
|
215
|
+
.replace(/^\s*\/\*\*?|\*\/\s*$/g, '')
|
|
216
|
+
.replace(/^\s*(\*|\/\/+)\s?/gm, '')
|
|
217
|
+
.replace(/\s+/g, ' ')
|
|
218
|
+
.trim();
|
|
219
|
+
if (!hasHangul(text))
|
|
220
|
+
return undefined;
|
|
221
|
+
return text.slice(0, MAX_DOC_CHARS);
|
|
222
|
+
}
|
|
223
|
+
//# sourceMappingURL=ko-text.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ko-text.js","sourceRoot":"","sources":["../../../src/code-graph/ko-text.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 주인이 살아 있어도 이보다 오래 잡힌 락은 버려진 것으로 본다.
|
|
3
|
+
* pid 재사용으로 죽은 주인이 살아 있는 것처럼 보이는 경우를 막는 상한이라
|
|
4
|
+
* 정상 빌드가 절대 안 닿을 만큼 넉넉하게 잡았다.
|
|
5
|
+
*/
|
|
6
|
+
export declare const LOCK_STALE_MS: number;
|
|
7
|
+
export interface LockHandle {
|
|
8
|
+
readonly path: string;
|
|
9
|
+
readonly token: string;
|
|
10
|
+
/** 락 파일이 아직 내 것일 때만 지운다. 지웠으면 true */
|
|
11
|
+
release(): boolean;
|
|
12
|
+
}
|
|
13
|
+
export interface LockOptions {
|
|
14
|
+
staleMs?: number;
|
|
15
|
+
/** 테스트용. 기본은 process.pid */
|
|
16
|
+
pid?: number;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* 락 파일을 배타적으로 만든다. 못 잡으면 null.
|
|
20
|
+
*
|
|
21
|
+
* 버려진 락은 지우고 한 번 더 시도한다. 지우기 직전에 토큰을 다시 읽어
|
|
22
|
+
* 판정 사이에 다른 프로세스가 새로 잡은 락을 지우지 않게 한다.
|
|
23
|
+
*/
|
|
24
|
+
export declare function tryAcquireLock(path: string, opts?: LockOptions): LockHandle | null;
|
|
25
|
+
/** timeoutMs 동안 pollMs 간격으로 다시 시도한다. 끝내 못 잡으면 null */
|
|
26
|
+
export declare function acquireLock(path: string, opts?: LockOptions & {
|
|
27
|
+
timeoutMs?: number;
|
|
28
|
+
pollMs?: number;
|
|
29
|
+
}): Promise<LockHandle | null>;
|
|
30
|
+
//# sourceMappingURL=lock.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lock.d.ts","sourceRoot":"","sources":["../../../src/code-graph/lock.ts"],"names":[],"mappings":"AAKA;;;;GAIG;AACH,eAAO,MAAM,aAAa,QAAiB,CAAC;AAe5C,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,sCAAsC;IACtC,OAAO,IAAI,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,4BAA4B;IAC5B,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAsCD;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,WAAgB,GAAG,UAAU,GAAG,IAAI,CAkCtF;AA4BD,sDAAsD;AACtD,wBAAsB,WAAW,CAC/B,IAAI,EAAE,MAAM,EACZ,IAAI,GAAE,WAAW,GAAG;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAO,GAC/D,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAU5B"}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import { closeSync, openSync, readFileSync, statSync, unlinkSync, writeSync } from 'node:fs';
|
|
2
|
+
import { randomUUID } from 'node:crypto';
|
|
3
|
+
import { setTimeout as sleep } from 'node:timers/promises';
|
|
4
|
+
import { logger } from '../core/logger.js';
|
|
5
|
+
/**
|
|
6
|
+
* 주인이 살아 있어도 이보다 오래 잡힌 락은 버려진 것으로 본다.
|
|
7
|
+
* pid 재사용으로 죽은 주인이 살아 있는 것처럼 보이는 경우를 막는 상한이라
|
|
8
|
+
* 정상 빌드가 절대 안 닿을 만큼 넉넉하게 잡았다.
|
|
9
|
+
*/
|
|
10
|
+
export const LOCK_STALE_MS = 10 * 60 * 1000;
|
|
11
|
+
/**
|
|
12
|
+
* 내용을 못 읽는 락을 버려진 것으로 보기까지 기다리는 시간.
|
|
13
|
+
* `wx`로 만든 직후 내용을 쓰기 전에 다른 프로세스가 읽으면 빈 파일이 보인다.
|
|
14
|
+
* 그걸 바로 버려진 락으로 보면 막 잡힌 남의 락을 지운다.
|
|
15
|
+
*/
|
|
16
|
+
const UNREADABLE_GRACE_MS = 5000;
|
|
17
|
+
function readLock(path) {
|
|
18
|
+
try {
|
|
19
|
+
const parsed = JSON.parse(readFileSync(path, 'utf-8'));
|
|
20
|
+
if (typeof parsed.pid !== 'number' || typeof parsed.token !== 'string')
|
|
21
|
+
return null;
|
|
22
|
+
return {
|
|
23
|
+
pid: parsed.pid,
|
|
24
|
+
token: parsed.token,
|
|
25
|
+
acquiredAt: typeof parsed.acquiredAt === 'number' ? parsed.acquiredAt : 0,
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
function isAlive(pid) {
|
|
33
|
+
try {
|
|
34
|
+
process.kill(pid, 0);
|
|
35
|
+
return true;
|
|
36
|
+
}
|
|
37
|
+
catch (e) {
|
|
38
|
+
// EPERM은 프로세스가 있는데 신호 권한만 없는 경우다
|
|
39
|
+
return e.code === 'EPERM';
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
function isStale(path, content, staleMs) {
|
|
43
|
+
if (!content) {
|
|
44
|
+
try {
|
|
45
|
+
return Date.now() - statSync(path).mtimeMs > UNREADABLE_GRACE_MS;
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
return true;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
if (!isAlive(content.pid))
|
|
52
|
+
return true;
|
|
53
|
+
return Date.now() - content.acquiredAt > staleMs;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* 락 파일을 배타적으로 만든다. 못 잡으면 null.
|
|
57
|
+
*
|
|
58
|
+
* 버려진 락은 지우고 한 번 더 시도한다. 지우기 직전에 토큰을 다시 읽어
|
|
59
|
+
* 판정 사이에 다른 프로세스가 새로 잡은 락을 지우지 않게 한다.
|
|
60
|
+
*/
|
|
61
|
+
export function tryAcquireLock(path, opts = {}) {
|
|
62
|
+
const staleMs = opts.staleMs ?? LOCK_STALE_MS;
|
|
63
|
+
const pid = opts.pid ?? process.pid;
|
|
64
|
+
for (let attempt = 0; attempt < 2; attempt++) {
|
|
65
|
+
const token = randomUUID();
|
|
66
|
+
try {
|
|
67
|
+
const fd = openSync(path, 'wx');
|
|
68
|
+
try {
|
|
69
|
+
writeSync(fd, JSON.stringify({ pid, token, acquiredAt: Date.now() }));
|
|
70
|
+
}
|
|
71
|
+
finally {
|
|
72
|
+
closeSync(fd);
|
|
73
|
+
}
|
|
74
|
+
return makeHandle(path, pid, token);
|
|
75
|
+
}
|
|
76
|
+
catch (e) {
|
|
77
|
+
if (e.code !== 'EEXIST')
|
|
78
|
+
throw e;
|
|
79
|
+
}
|
|
80
|
+
const held = readLock(path);
|
|
81
|
+
if (!isStale(path, held, staleMs))
|
|
82
|
+
return null;
|
|
83
|
+
const recheck = readLock(path);
|
|
84
|
+
if (held && recheck?.token !== held.token)
|
|
85
|
+
return null;
|
|
86
|
+
try {
|
|
87
|
+
unlinkSync(path);
|
|
88
|
+
logger.warn('code_graph.lock_stale_removed', {
|
|
89
|
+
module: 'code-graph/lock',
|
|
90
|
+
path,
|
|
91
|
+
previousPid: held?.pid,
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
catch {
|
|
95
|
+
// 다른 프로세스가 먼저 지웠다. 다시 만들기를 시도한다
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
return null;
|
|
99
|
+
}
|
|
100
|
+
function makeHandle(path, pid, token) {
|
|
101
|
+
return {
|
|
102
|
+
path,
|
|
103
|
+
token,
|
|
104
|
+
release() {
|
|
105
|
+
// 오래 걸려 stale로 판정되면 락이 다른 프로세스로 넘어갔을 수 있다.
|
|
106
|
+
// 그때 지우면 지금 주인의 락을 빼앗는 셈이라 확인 없이 지우지 않는다
|
|
107
|
+
const current = readLock(path);
|
|
108
|
+
if (!current || current.pid !== pid || current.token !== token) {
|
|
109
|
+
logger.warn('code_graph.lock_not_owned_on_release', {
|
|
110
|
+
module: 'code-graph/lock',
|
|
111
|
+
path,
|
|
112
|
+
ownerPid: current?.pid,
|
|
113
|
+
});
|
|
114
|
+
return false;
|
|
115
|
+
}
|
|
116
|
+
try {
|
|
117
|
+
unlinkSync(path);
|
|
118
|
+
return true;
|
|
119
|
+
}
|
|
120
|
+
catch {
|
|
121
|
+
return false;
|
|
122
|
+
}
|
|
123
|
+
},
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
/** timeoutMs 동안 pollMs 간격으로 다시 시도한다. 끝내 못 잡으면 null */
|
|
127
|
+
export async function acquireLock(path, opts = {}) {
|
|
128
|
+
const timeoutMs = opts.timeoutMs ?? 1500;
|
|
129
|
+
const pollMs = opts.pollMs ?? 50;
|
|
130
|
+
const deadline = Date.now() + timeoutMs;
|
|
131
|
+
for (;;) {
|
|
132
|
+
const handle = tryAcquireLock(path, opts);
|
|
133
|
+
if (handle)
|
|
134
|
+
return handle;
|
|
135
|
+
if (Date.now() >= deadline)
|
|
136
|
+
return null;
|
|
137
|
+
await sleep(Math.min(pollMs, Math.max(0, deadline - Date.now())));
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
//# sourceMappingURL=lock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lock.js","sourceRoot":"","sources":["../../../src/code-graph/lock.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { SkeletonEntry } from '../types.js';
|
|
2
|
+
/**
|
|
3
|
+
* TS/JS 파일에서 본문을 뺀 시그니처를 뽑는다.
|
|
4
|
+
* 최상위 선언과 클래스, 인터페이스, enum, namespace 멤버를 담고 import는 뺀다.
|
|
5
|
+
*/
|
|
6
|
+
export declare function extractTypeScriptSkeleton(filePath: string, content: string): SkeletonEntry[];
|
|
7
|
+
//# sourceMappingURL=typescript-skeleton.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"typescript-skeleton.d.ts","sourceRoot":"","sources":["../../../../src/code-graph/plugins/typescript-skeleton.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAcjD;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,aAAa,EAAE,CAgJ5F"}
|