@mfittko/repo-wiki 0.2.1
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/.llmwiki/schema.md +107 -0
- package/AGENTS.md +42 -0
- package/CHANGELOG.md +91 -0
- package/LICENSE +21 -0
- package/README.md +254 -0
- package/dist/bin/repo-wiki.d.ts +2 -0
- package/dist/bin/repo-wiki.js +7 -0
- package/dist/bin/repo-wiki.js.map +1 -0
- package/dist/src/cli.d.ts +1 -0
- package/dist/src/cli.js +404 -0
- package/dist/src/cli.js.map +1 -0
- package/dist/src/compiler.d.ts +55 -0
- package/dist/src/compiler.js +2046 -0
- package/dist/src/compiler.js.map +1 -0
- package/dist/src/config.d.ts +63 -0
- package/dist/src/config.js +86 -0
- package/dist/src/config.js.map +1 -0
- package/dist/src/context-assembler.d.ts +68 -0
- package/dist/src/context-assembler.js +378 -0
- package/dist/src/context-assembler.js.map +1 -0
- package/dist/src/data-model-signals.d.ts +1 -0
- package/dist/src/data-model-signals.js +13 -0
- package/dist/src/data-model-signals.js.map +1 -0
- package/dist/src/docs-ingestor.d.ts +138 -0
- package/dist/src/docs-ingestor.js +844 -0
- package/dist/src/docs-ingestor.js.map +1 -0
- package/dist/src/docs-linter.d.ts +14 -0
- package/dist/src/docs-linter.js +164 -0
- package/dist/src/docs-linter.js.map +1 -0
- package/dist/src/docs-validation.d.ts +36 -0
- package/dist/src/docs-validation.js +297 -0
- package/dist/src/docs-validation.js.map +1 -0
- package/dist/src/extractors.d.ts +50 -0
- package/dist/src/extractors.js +2275 -0
- package/dist/src/extractors.js.map +1 -0
- package/dist/src/frontmatter.d.ts +46 -0
- package/dist/src/frontmatter.js +377 -0
- package/dist/src/frontmatter.js.map +1 -0
- package/dist/src/index.d.ts +26 -0
- package/dist/src/index.js +18 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/init.d.ts +12 -0
- package/dist/src/init.js +121 -0
- package/dist/src/init.js.map +1 -0
- package/dist/src/language.d.ts +2 -0
- package/dist/src/language.js +62 -0
- package/dist/src/language.js.map +1 -0
- package/dist/src/linter.d.ts +33 -0
- package/dist/src/linter.js +398 -0
- package/dist/src/linter.js.map +1 -0
- package/dist/src/llm-provider.d.ts +267 -0
- package/dist/src/llm-provider.js +474 -0
- package/dist/src/llm-provider.js.map +1 -0
- package/dist/src/page-ownership.d.ts +38 -0
- package/dist/src/page-ownership.js +96 -0
- package/dist/src/page-ownership.js.map +1 -0
- package/dist/src/planner.d.ts +55 -0
- package/dist/src/planner.js +422 -0
- package/dist/src/planner.js.map +1 -0
- package/dist/src/prompts.d.ts +103 -0
- package/dist/src/prompts.js +344 -0
- package/dist/src/prompts.js.map +1 -0
- package/dist/src/publisher.d.ts +68 -0
- package/dist/src/publisher.js +662 -0
- package/dist/src/publisher.js.map +1 -0
- package/dist/src/repository-analysis.d.ts +88 -0
- package/dist/src/repository-analysis.js +485 -0
- package/dist/src/repository-analysis.js.map +1 -0
- package/dist/src/scanner.d.ts +122 -0
- package/dist/src/scanner.js +309 -0
- package/dist/src/scanner.js.map +1 -0
- package/dist/src/search.d.ts +71 -0
- package/dist/src/search.js +410 -0
- package/dist/src/search.js.map +1 -0
- package/dist/src/secret-patterns.d.ts +3 -0
- package/dist/src/secret-patterns.js +14 -0
- package/dist/src/secret-patterns.js.map +1 -0
- package/dist/src/utils/args.d.ts +2 -0
- package/dist/src/utils/args.js +19 -0
- package/dist/src/utils/args.js.map +1 -0
- package/dist/src/utils/dotenv.d.ts +7 -0
- package/dist/src/utils/dotenv.js +73 -0
- package/dist/src/utils/dotenv.js.map +1 -0
- package/dist/src/utils/fs.d.ts +22 -0
- package/dist/src/utils/fs.js +83 -0
- package/dist/src/utils/fs.js.map +1 -0
- package/dist/src/utils/git.d.ts +13 -0
- package/dist/src/utils/git.js +39 -0
- package/dist/src/utils/git.js.map +1 -0
- package/dist/src/wiki-graph.d.ts +74 -0
- package/dist/src/wiki-graph.js +335 -0
- package/dist/src/wiki-graph.js.map +1 -0
- package/dist/src/wiki-patch.d.ts +152 -0
- package/dist/src/wiki-patch.js +489 -0
- package/dist/src/wiki-patch.js.map +1 -0
- package/dist/src/wiki-query.d.ts +63 -0
- package/dist/src/wiki-query.js +255 -0
- package/dist/src/wiki-query.js.map +1 -0
- package/dist/test/cli.test.d.ts +1 -0
- package/dist/test/cli.test.js +514 -0
- package/dist/test/cli.test.js.map +1 -0
- package/dist/test/compiler-eval.test.d.ts +1 -0
- package/dist/test/compiler-eval.test.js +234 -0
- package/dist/test/compiler-eval.test.js.map +1 -0
- package/dist/test/compiler.test.d.ts +1 -0
- package/dist/test/compiler.test.js +2537 -0
- package/dist/test/compiler.test.js.map +1 -0
- package/dist/test/context-assembler.test.d.ts +1 -0
- package/dist/test/context-assembler.test.js +379 -0
- package/dist/test/context-assembler.test.js.map +1 -0
- package/dist/test/docs-linter.test.d.ts +1 -0
- package/dist/test/docs-linter.test.js +900 -0
- package/dist/test/docs-linter.test.js.map +1 -0
- package/dist/test/dotenv.test.d.ts +1 -0
- package/dist/test/dotenv.test.js +77 -0
- package/dist/test/dotenv.test.js.map +1 -0
- package/dist/test/extractors-go.test.d.ts +1 -0
- package/dist/test/extractors-go.test.js +393 -0
- package/dist/test/extractors-go.test.js.map +1 -0
- package/dist/test/extractors-rust.test.d.ts +1 -0
- package/dist/test/extractors-rust.test.js +219 -0
- package/dist/test/extractors-rust.test.js.map +1 -0
- package/dist/test/extractors-utils.test.d.ts +1 -0
- package/dist/test/extractors-utils.test.js +786 -0
- package/dist/test/extractors-utils.test.js.map +1 -0
- package/dist/test/fixtures/compiler-e2e/basic-node-service/repo/infra/deploy.d.ts +1 -0
- package/dist/test/fixtures/compiler-e2e/basic-node-service/repo/infra/deploy.js +4 -0
- package/dist/test/fixtures/compiler-e2e/basic-node-service/repo/infra/deploy.js.map +1 -0
- package/dist/test/frontmatter.test.d.ts +1 -0
- package/dist/test/frontmatter.test.js +287 -0
- package/dist/test/frontmatter.test.js.map +1 -0
- package/dist/test/init-planner.test.d.ts +1 -0
- package/dist/test/init-planner.test.js +688 -0
- package/dist/test/init-planner.test.js.map +1 -0
- package/dist/test/linter.test.d.ts +1 -0
- package/dist/test/linter.test.js +426 -0
- package/dist/test/linter.test.js.map +1 -0
- package/dist/test/llm-provider.test.d.ts +1 -0
- package/dist/test/llm-provider.test.js +783 -0
- package/dist/test/llm-provider.test.js.map +1 -0
- package/dist/test/page-ownership.test.d.ts +1 -0
- package/dist/test/page-ownership.test.js +247 -0
- package/dist/test/page-ownership.test.js.map +1 -0
- package/dist/test/publisher.test.d.ts +1 -0
- package/dist/test/publisher.test.js +1297 -0
- package/dist/test/publisher.test.js.map +1 -0
- package/dist/test/repository-analysis.test.d.ts +1 -0
- package/dist/test/repository-analysis.test.js +182 -0
- package/dist/test/repository-analysis.test.js.map +1 -0
- package/dist/test/run-compiled-tests.d.ts +1 -0
- package/dist/test/run-compiled-tests.js +48 -0
- package/dist/test/run-compiled-tests.js.map +1 -0
- package/dist/test/scanner.test.d.ts +1 -0
- package/dist/test/scanner.test.js +551 -0
- package/dist/test/scanner.test.js.map +1 -0
- package/dist/test/search.test.d.ts +1 -0
- package/dist/test/search.test.js +92 -0
- package/dist/test/search.test.js.map +1 -0
- package/dist/test/update-changelog.test.d.ts +1 -0
- package/dist/test/update-changelog.test.js +125 -0
- package/dist/test/update-changelog.test.js.map +1 -0
- package/dist/test/wiki-graph.test.d.ts +1 -0
- package/dist/test/wiki-graph.test.js +164 -0
- package/dist/test/wiki-graph.test.js.map +1 -0
- package/dist/test/wiki-patch.test.d.ts +1 -0
- package/dist/test/wiki-patch.test.js +610 -0
- package/dist/test/wiki-patch.test.js.map +1 -0
- package/dist/test/wiki-query.test.d.ts +1 -0
- package/dist/test/wiki-query.test.js +163 -0
- package/dist/test/wiki-query.test.js.map +1 -0
- package/docs/PLAN.md +993 -0
- package/docs/WHY.md +61 -0
- package/docs/plans/agent-integration.md +85 -0
- package/docs/plans/ci-publishing.md +111 -0
- package/docs/plans/doc-validation.md +92 -0
- package/docs/plans/github-action.md +113 -0
- package/docs/plans/incremental-mode.md +98 -0
- package/docs/plans/karpathy-llm-wiki-alignment.md +84 -0
- package/docs/plans/llm-compiler.md +160 -0
- package/docs/plans/production-scanner.md +104 -0
- package/docs/plans/query-and-file-back.md +103 -0
- package/docs/plans/search-index.md +118 -0
- package/docs/plans/trust-hardening.md +74 -0
- package/docs/plans/wiki-graph.md +183 -0
- package/docs/plans/wiki-health.md +76 -0
- package/package.json +83 -0
- package/prompts/compiler.md +16 -0
- package/prompts/lint.md +18 -0
- package/prompts/page-templates.md +25 -0
- package/skills/repo-wiki-cli/SKILL.md +139 -0
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
export declare function createBootstrapPlan({ scanDir, outFile }: {
|
|
2
|
+
scanDir: any;
|
|
3
|
+
outFile: any;
|
|
4
|
+
}): Promise<{
|
|
5
|
+
plan: {
|
|
6
|
+
incremental_selection?: {
|
|
7
|
+
graph_path: string;
|
|
8
|
+
changed_paths: string[];
|
|
9
|
+
always_affected_pages: string[];
|
|
10
|
+
selected_pages: {
|
|
11
|
+
page: string;
|
|
12
|
+
reasons: string[];
|
|
13
|
+
changed_paths: string[];
|
|
14
|
+
}[];
|
|
15
|
+
summary: {
|
|
16
|
+
selected_pages: number;
|
|
17
|
+
graph_available: boolean;
|
|
18
|
+
graph_used: boolean;
|
|
19
|
+
changed_paths_available: boolean;
|
|
20
|
+
fallback_reason: string;
|
|
21
|
+
};
|
|
22
|
+
};
|
|
23
|
+
schema_version: number;
|
|
24
|
+
mode: any;
|
|
25
|
+
repo_path: any;
|
|
26
|
+
remote: any;
|
|
27
|
+
commit: any;
|
|
28
|
+
generated_at: string;
|
|
29
|
+
phases: {
|
|
30
|
+
name: string;
|
|
31
|
+
purpose: string;
|
|
32
|
+
pages: any[];
|
|
33
|
+
}[];
|
|
34
|
+
modules: any[];
|
|
35
|
+
pages: any[];
|
|
36
|
+
affected_page_graph: {
|
|
37
|
+
source_to_pages: {
|
|
38
|
+
source: string;
|
|
39
|
+
pages: {
|
|
40
|
+
page: string;
|
|
41
|
+
reasons: string[];
|
|
42
|
+
}[];
|
|
43
|
+
}[];
|
|
44
|
+
summary: {
|
|
45
|
+
mapped_sources: number;
|
|
46
|
+
total_page_references: number;
|
|
47
|
+
};
|
|
48
|
+
};
|
|
49
|
+
};
|
|
50
|
+
summary: {
|
|
51
|
+
pages: number;
|
|
52
|
+
modules: number;
|
|
53
|
+
outFile: any;
|
|
54
|
+
};
|
|
55
|
+
}>;
|
|
@@ -0,0 +1,422 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import { hasDataModelSignals } from './data-model-signals.js';
|
|
3
|
+
import { readJson, writeJson } from './utils/fs.js';
|
|
4
|
+
import { loadWikiGraph, selectAffectedPagePaths } from './wiki-graph.js';
|
|
5
|
+
const ALWAYS_AFFECTED_INCREMENTAL_PAGES = ['Agent-Context-Pack.md', 'Index.md', 'Log.md', '_Sidebar.md'];
|
|
6
|
+
export async function createBootstrapPlan({ scanDir, outFile }) {
|
|
7
|
+
const manifest = await readJson(path.join(scanDir, 'manifest.json'));
|
|
8
|
+
const modules = groupIntoModules(manifest.files);
|
|
9
|
+
const pages = createPagePlan(manifest, modules);
|
|
10
|
+
const affectedPageGraph = buildAffectedPageGraph(manifest, modules, pages);
|
|
11
|
+
const incrementalSelection = await buildIncrementalSelection(manifest, pages, scanDir);
|
|
12
|
+
const plan = {
|
|
13
|
+
schema_version: 1,
|
|
14
|
+
mode: manifest.mode || 'bootstrap',
|
|
15
|
+
repo_path: manifest.repo_path,
|
|
16
|
+
remote: manifest.remote,
|
|
17
|
+
commit: manifest.commit,
|
|
18
|
+
generated_at: new Date().toISOString(),
|
|
19
|
+
phases: [
|
|
20
|
+
{
|
|
21
|
+
name: 'foundation',
|
|
22
|
+
purpose: 'Create core navigation and agent entry points.',
|
|
23
|
+
pages: pages.filter((page) => page.phase === 'foundation').map((page) => page.path)
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
name: 'modules',
|
|
27
|
+
purpose: 'Create module/service/package pages from top-level source groupings.',
|
|
28
|
+
pages: pages.filter((page) => page.phase === 'modules').map((page) => page.path)
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
name: 'cross-cutting',
|
|
32
|
+
purpose: 'Create API, data, infrastructure, testing, and security pages.',
|
|
33
|
+
pages: pages.filter((page) => page.phase === 'cross-cutting').map((page) => page.path)
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
name: 'link-and-lint',
|
|
37
|
+
purpose: 'Update navigation pages, verify links, flag gaps, and prepare publication.',
|
|
38
|
+
pages: ['Index.md', '_Sidebar.md', 'Open-Questions.md', 'Documentation-Debt-Report.md', 'Log.md']
|
|
39
|
+
}
|
|
40
|
+
],
|
|
41
|
+
modules,
|
|
42
|
+
pages,
|
|
43
|
+
affected_page_graph: affectedPageGraph,
|
|
44
|
+
...(incrementalSelection ? { incremental_selection: incrementalSelection } : {})
|
|
45
|
+
};
|
|
46
|
+
await writeJson(outFile, plan);
|
|
47
|
+
return {
|
|
48
|
+
plan,
|
|
49
|
+
summary: {
|
|
50
|
+
pages: pages.length,
|
|
51
|
+
modules: modules.length,
|
|
52
|
+
outFile
|
|
53
|
+
}
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
async function buildIncrementalSelection(manifest, pages, scanDir) {
|
|
57
|
+
if (manifest.mode !== 'incremental') {
|
|
58
|
+
return null;
|
|
59
|
+
}
|
|
60
|
+
const plannedPages = new Set((pages || []).map((page) => String(page?.path || '')).filter(Boolean));
|
|
61
|
+
const changedPathAttribution = extractChangedPaths(manifest);
|
|
62
|
+
const changedPaths = changedPathAttribution.paths;
|
|
63
|
+
const graphMatchedChangedPaths = new Set();
|
|
64
|
+
const selected = new Map();
|
|
65
|
+
function markSelected(pagePath, reason, changedPath) {
|
|
66
|
+
if (!plannedPages.has(pagePath)) {
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
let entry = selected.get(pagePath);
|
|
70
|
+
if (!entry) {
|
|
71
|
+
entry = { reasons: new Set(), changedPaths: new Set() };
|
|
72
|
+
selected.set(pagePath, entry);
|
|
73
|
+
}
|
|
74
|
+
entry.reasons.add(reason);
|
|
75
|
+
if (changedPath) {
|
|
76
|
+
entry.changedPaths.add(changedPath);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
let graphAvailable = false;
|
|
80
|
+
let graphUsed = false;
|
|
81
|
+
let fallbackReason = null;
|
|
82
|
+
const graphPath = path.join(path.dirname(scanDir), 'graph.json');
|
|
83
|
+
try {
|
|
84
|
+
const graph = await loadWikiGraph(graphPath);
|
|
85
|
+
graphAvailable = true;
|
|
86
|
+
if (changedPathAttribution.available) {
|
|
87
|
+
const affectedPages = selectAffectedPagePaths(graph, changedPaths);
|
|
88
|
+
for (const affectedPage of affectedPages) {
|
|
89
|
+
const isAlwaysAffected = ALWAYS_AFFECTED_INCREMENTAL_PAGES.includes(affectedPage.pagePath);
|
|
90
|
+
if (isAlwaysAffected || affectedPage.changedPaths.length > 0) {
|
|
91
|
+
for (const changedPath of affectedPage.changedPaths) {
|
|
92
|
+
markSelected(affectedPage.pagePath, 'graph_affects', changedPath);
|
|
93
|
+
graphMatchedChangedPaths.add(changedPath);
|
|
94
|
+
graphUsed = true;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
catch (error) {
|
|
101
|
+
if (!isNodeError(error) || error.code !== 'ENOENT') {
|
|
102
|
+
throw error;
|
|
103
|
+
}
|
|
104
|
+
fallbackReason = 'fallback_missing_graph';
|
|
105
|
+
}
|
|
106
|
+
if (graphAvailable && !changedPathAttribution.available) {
|
|
107
|
+
fallbackReason = 'fallback_missing_changed_paths';
|
|
108
|
+
}
|
|
109
|
+
if (graphAvailable && changedPathAttribution.available && changedPaths.some((changedPath) => !graphMatchedChangedPaths.has(changedPath))) {
|
|
110
|
+
fallbackReason = 'fallback_unmatched_changed_paths';
|
|
111
|
+
}
|
|
112
|
+
if (fallbackReason) {
|
|
113
|
+
for (const pagePath of [...plannedPages].sort()) {
|
|
114
|
+
markSelected(pagePath, fallbackReason);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
for (const pagePath of ALWAYS_AFFECTED_INCREMENTAL_PAGES) {
|
|
118
|
+
markSelected(pagePath, 'always_affected_global');
|
|
119
|
+
}
|
|
120
|
+
const selectedPages = [...selected.entries()]
|
|
121
|
+
.map(([page, detail]) => ({
|
|
122
|
+
page,
|
|
123
|
+
reasons: [...detail.reasons].sort(),
|
|
124
|
+
changed_paths: [...detail.changedPaths].sort()
|
|
125
|
+
}))
|
|
126
|
+
.sort((a, b) => a.page.localeCompare(b.page));
|
|
127
|
+
return {
|
|
128
|
+
graph_path: graphPath,
|
|
129
|
+
changed_paths: changedPaths,
|
|
130
|
+
always_affected_pages: [...ALWAYS_AFFECTED_INCREMENTAL_PAGES],
|
|
131
|
+
selected_pages: selectedPages,
|
|
132
|
+
summary: {
|
|
133
|
+
selected_pages: selectedPages.length,
|
|
134
|
+
graph_available: graphAvailable,
|
|
135
|
+
graph_used: graphUsed,
|
|
136
|
+
changed_paths_available: changedPathAttribution.available,
|
|
137
|
+
fallback_reason: fallbackReason
|
|
138
|
+
}
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
function extractChangedPaths(manifest) {
|
|
142
|
+
const raw = [
|
|
143
|
+
manifest?.changed_paths,
|
|
144
|
+
manifest?.changedPaths,
|
|
145
|
+
manifest?.analysis?.changed_paths,
|
|
146
|
+
manifest?.analysis?.changedPaths,
|
|
147
|
+
manifest?.incremental?.changed_paths,
|
|
148
|
+
manifest?.incremental?.changedPaths
|
|
149
|
+
];
|
|
150
|
+
let available = false;
|
|
151
|
+
const changed = new Set();
|
|
152
|
+
for (const candidate of raw) {
|
|
153
|
+
if (!Array.isArray(candidate)) {
|
|
154
|
+
continue;
|
|
155
|
+
}
|
|
156
|
+
available = true;
|
|
157
|
+
for (const item of candidate) {
|
|
158
|
+
const value = typeof item === 'string'
|
|
159
|
+
? item
|
|
160
|
+
: (item && typeof item.path === 'string' ? item.path : '');
|
|
161
|
+
const normalized = normalizeRelativePath(value);
|
|
162
|
+
if (normalized) {
|
|
163
|
+
changed.add(normalized);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
return {
|
|
168
|
+
available,
|
|
169
|
+
paths: [...changed].sort()
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
function normalizeRelativePath(value) {
|
|
173
|
+
return String(value || '')
|
|
174
|
+
.replace(/\\/g, '/')
|
|
175
|
+
.replace(/^\.\//, '')
|
|
176
|
+
.trim();
|
|
177
|
+
}
|
|
178
|
+
function isNodeError(error) {
|
|
179
|
+
return error instanceof Error && 'code' in error;
|
|
180
|
+
}
|
|
181
|
+
function groupIntoModules(files) {
|
|
182
|
+
const groups = new Map();
|
|
183
|
+
for (const file of files) {
|
|
184
|
+
if (file.skipped_content && file.bytes > 1_000_000) {
|
|
185
|
+
continue;
|
|
186
|
+
}
|
|
187
|
+
const groupName = inferGroupName(file.path);
|
|
188
|
+
const existing = groups.get(groupName) || {
|
|
189
|
+
name: groupName,
|
|
190
|
+
slug: slugify(groupName),
|
|
191
|
+
files: [],
|
|
192
|
+
categories: {},
|
|
193
|
+
languages: {},
|
|
194
|
+
runtime_hints: {},
|
|
195
|
+
important_reasons: new Set()
|
|
196
|
+
};
|
|
197
|
+
existing.files.push(file.path);
|
|
198
|
+
existing.categories[file.category] = (existing.categories[file.category] || 0) + 1;
|
|
199
|
+
existing.languages[file.language] = (existing.languages[file.language] || 0) + 1;
|
|
200
|
+
for (const hint of file.runtime_hints || []) {
|
|
201
|
+
existing.runtime_hints[hint] = (existing.runtime_hints[hint] || 0) + 1;
|
|
202
|
+
}
|
|
203
|
+
for (const reason of file.reasons || []) {
|
|
204
|
+
existing.important_reasons.add(reason);
|
|
205
|
+
}
|
|
206
|
+
groups.set(groupName, existing);
|
|
207
|
+
}
|
|
208
|
+
return [...groups.values()]
|
|
209
|
+
.map((group) => ({
|
|
210
|
+
...group,
|
|
211
|
+
important_reasons: [...group.important_reasons].sort(),
|
|
212
|
+
files: group.files.sort()
|
|
213
|
+
}))
|
|
214
|
+
.sort((a, b) => b.files.length - a.files.length || a.name.localeCompare(b.name));
|
|
215
|
+
}
|
|
216
|
+
function inferGroupName(filePath) {
|
|
217
|
+
const parts = filePath.split('/');
|
|
218
|
+
if (parts[0] === 'apps' && parts[1])
|
|
219
|
+
return `Service ${parts[1]}`;
|
|
220
|
+
if (parts[0] === 'services' && parts[1])
|
|
221
|
+
return `Service ${parts[1]}`;
|
|
222
|
+
if (parts[0] === 'packages' && parts[1])
|
|
223
|
+
return `Package ${parts[1]}`;
|
|
224
|
+
if (parts[0] === 'src' && parts[1])
|
|
225
|
+
return `Module ${parts[1]}`;
|
|
226
|
+
if (parts[0] === 'lib' && parts[1])
|
|
227
|
+
return `Module ${parts[1]}`;
|
|
228
|
+
if (parts[0] === 'infra')
|
|
229
|
+
return 'Infrastructure';
|
|
230
|
+
if (parts[0] === 'docs')
|
|
231
|
+
return 'Documentation';
|
|
232
|
+
if (parts[0] === '.github')
|
|
233
|
+
return 'CI and Automation';
|
|
234
|
+
return 'Repository Root';
|
|
235
|
+
}
|
|
236
|
+
function createPagePlan(manifest, modules) {
|
|
237
|
+
const foundation = [
|
|
238
|
+
page('Home.md', 'foundation', 'Human and agent entry point.'),
|
|
239
|
+
page('_Sidebar.md', 'foundation', 'GitHub Wiki navigation sidebar.'),
|
|
240
|
+
page('Index.md', 'foundation', 'Full page index and routing map.'),
|
|
241
|
+
page('Log.md', 'foundation', 'Chronological compilation log.'),
|
|
242
|
+
page('Agent-Context-Pack.md', 'foundation', 'Small, high-signal entry page for coding agents.'),
|
|
243
|
+
page('Repository-Overview.md', 'foundation', 'Repository purpose, languages, and structure.'),
|
|
244
|
+
page('Architecture.md', 'foundation', 'Architecture summary inferred from source layout.'),
|
|
245
|
+
page('Build-Test-and-Run.md', 'foundation', 'Detected build, test, and run commands.'),
|
|
246
|
+
page('Open-Questions.md', 'foundation', 'Known gaps and uncertain inferences.'),
|
|
247
|
+
page('Documentation-Debt-Report.md', 'foundation', 'Markdown documentation validation, staleness, and claim-confidence report.')
|
|
248
|
+
];
|
|
249
|
+
const modulePages = modules
|
|
250
|
+
.filter((module) => module.files.length >= 1)
|
|
251
|
+
.slice(0, 50)
|
|
252
|
+
.map((module) => page(`${module.slug}.md`, 'modules', `Compiled page for ${module.name}.`, module.name));
|
|
253
|
+
const crossCutting = [
|
|
254
|
+
page('Dependency-Map.md', 'cross-cutting', 'Internal and external dependency overview.'),
|
|
255
|
+
page('Testing-Strategy.md', 'cross-cutting', 'Detected tests and verification strategy.'),
|
|
256
|
+
page('Configuration-and-Environment.md', 'cross-cutting', 'Environment variables and configuration surfaces.'),
|
|
257
|
+
page('Security-and-Secrets.md', 'cross-cutting', 'Security-sensitive areas and secret-handling policy.'),
|
|
258
|
+
page('Operational-Runbook.md', 'cross-cutting', 'Operational commands, deployment, and troubleshooting notes.')
|
|
259
|
+
];
|
|
260
|
+
if (manifest.totals.runtime_hints?.['http-route']) {
|
|
261
|
+
crossCutting.push(page('API-HTTP-Routes.md', 'cross-cutting', 'Detected HTTP routing surfaces.'));
|
|
262
|
+
}
|
|
263
|
+
if (hasDataModelSignals(manifest)) {
|
|
264
|
+
crossCutting.push(page('Data-Model-and-Migrations.md', 'cross-cutting', 'Data models, migrations, and schema-related files.'));
|
|
265
|
+
}
|
|
266
|
+
return [...foundation, ...modulePages, ...crossCutting];
|
|
267
|
+
}
|
|
268
|
+
function page(path, phase, purpose, moduleName = null) {
|
|
269
|
+
return { path, phase, purpose, moduleName };
|
|
270
|
+
}
|
|
271
|
+
function slugify(value) {
|
|
272
|
+
return value
|
|
273
|
+
.replace(/[^A-Za-z0-9]+/g, '-')
|
|
274
|
+
.replace(/^-+|-+$/g, '') || 'Page';
|
|
275
|
+
}
|
|
276
|
+
function buildAffectedPageGraph(manifest, modules, pages) {
|
|
277
|
+
// Index: source file path → module wiki page filename
|
|
278
|
+
const fileToModuleSlug = new Map();
|
|
279
|
+
for (const module of modules) {
|
|
280
|
+
const slugPage = `${module.slug}.md`;
|
|
281
|
+
for (const file of module.files) {
|
|
282
|
+
fileToModuleSlug.set(file, slugPage);
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
// Reverse import graph: imported file → Set of importer file paths
|
|
286
|
+
const reverseImports = new Map();
|
|
287
|
+
for (const edge of manifest.analysis?.dependency_graph?.edges || []) {
|
|
288
|
+
if (typeof edge.to === 'string' && !edge.to.startsWith('package:')) {
|
|
289
|
+
if (!reverseImports.has(edge.to)) {
|
|
290
|
+
reverseImports.set(edge.to, new Set());
|
|
291
|
+
}
|
|
292
|
+
reverseImports.get(edge.to).add(edge.from);
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
// Index: test file path → Set of covered source file paths
|
|
296
|
+
const testToCoveredSources = new Map();
|
|
297
|
+
for (const mapping of manifest.analysis?.test_to_source?.mappings || []) {
|
|
298
|
+
if (mapping.test && Array.isArray(mapping.sources)) {
|
|
299
|
+
testToCoveredSources.set(mapping.test, new Set(mapping.sources));
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
// Set of wiki pages that are actually planned
|
|
303
|
+
const plannedPages = new Set(pages.map((p) => p.path));
|
|
304
|
+
// Internal structure: source → page → Set<reason>
|
|
305
|
+
const entries = new Map();
|
|
306
|
+
function addPage(source, wikiPage, reason) {
|
|
307
|
+
if (!plannedPages.has(wikiPage)) {
|
|
308
|
+
return;
|
|
309
|
+
}
|
|
310
|
+
let pageMap = entries.get(source);
|
|
311
|
+
if (!pageMap) {
|
|
312
|
+
pageMap = new Map();
|
|
313
|
+
entries.set(source, pageMap);
|
|
314
|
+
}
|
|
315
|
+
let reasons = pageMap.get(wikiPage);
|
|
316
|
+
if (!reasons) {
|
|
317
|
+
reasons = new Set();
|
|
318
|
+
pageMap.set(wikiPage, reasons);
|
|
319
|
+
}
|
|
320
|
+
reasons.add(reason);
|
|
321
|
+
}
|
|
322
|
+
for (const card of manifest.files || []) {
|
|
323
|
+
const source = card.path;
|
|
324
|
+
// Direct module page
|
|
325
|
+
const directSlug = fileToModuleSlug.get(source);
|
|
326
|
+
if (directSlug) {
|
|
327
|
+
addPage(source, directSlug, 'direct_module');
|
|
328
|
+
}
|
|
329
|
+
// Transitive module pages: pages of modules that import this file
|
|
330
|
+
for (const importer of reverseImports.get(source) || []) {
|
|
331
|
+
const importerSlug = fileToModuleSlug.get(importer);
|
|
332
|
+
if (importerSlug && importerSlug !== directSlug) {
|
|
333
|
+
addPage(source, importerSlug, 'import_transitive');
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
// Test files → Testing-Strategy.md and covered source module pages
|
|
337
|
+
if (card.category === 'test') {
|
|
338
|
+
addPage(source, 'Testing-Strategy.md', 'test_coverage');
|
|
339
|
+
for (const coveredSource of testToCoveredSources.get(source) ?? new Set()) {
|
|
340
|
+
const coveredSlug = fileToModuleSlug.get(coveredSource);
|
|
341
|
+
if (coveredSlug) {
|
|
342
|
+
addPage(source, coveredSlug, 'test_covered_module');
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
// Files participating in the dependency graph → Dependency-Map.md
|
|
347
|
+
if ((card.imports?.length ?? 0) > 0 || reverseImports.has(source)) {
|
|
348
|
+
addPage(source, 'Dependency-Map.md', 'dependency_change');
|
|
349
|
+
}
|
|
350
|
+
// Route surfaces → API-HTTP-Routes.md
|
|
351
|
+
if ((card.route_surfaces?.length ?? 0) > 0) {
|
|
352
|
+
addPage(source, 'API-HTTP-Routes.md', 'cross_cutting_routes');
|
|
353
|
+
}
|
|
354
|
+
// Migration or ORM model surfaces → Data-Model-and-Migrations.md
|
|
355
|
+
if ((card.migration_surfaces?.length ?? 0) > 0 || (card.model_surfaces?.length ?? 0) > 0) {
|
|
356
|
+
addPage(source, 'Data-Model-and-Migrations.md', 'cross_cutting_data_model');
|
|
357
|
+
}
|
|
358
|
+
// Environment variables → Configuration-and-Environment.md
|
|
359
|
+
if ((card.environment_variables?.length ?? 0) > 0) {
|
|
360
|
+
addPage(source, 'Configuration-and-Environment.md', 'cross_cutting_config');
|
|
361
|
+
}
|
|
362
|
+
// Auth or billing signals → Security-and-Secrets.md
|
|
363
|
+
if (card.reasons?.some((r) => ['auth', 'billing-or-payment'].includes(r))) {
|
|
364
|
+
addPage(source, 'Security-and-Secrets.md', 'cross_cutting_security');
|
|
365
|
+
}
|
|
366
|
+
// Architecture-relevant signals → Architecture.md
|
|
367
|
+
// Module membership: file belongs to a tracked module (affects module list / structural map)
|
|
368
|
+
if (directSlug) {
|
|
369
|
+
addPage(source, 'Architecture.md', 'module_membership');
|
|
370
|
+
}
|
|
371
|
+
// Cross-module dependency: this file is imported by a file in a different module
|
|
372
|
+
for (const importer of reverseImports.get(source) || []) {
|
|
373
|
+
const importerSlug = fileToModuleSlug.get(importer);
|
|
374
|
+
if (importerSlug && importerSlug !== directSlug) {
|
|
375
|
+
addPage(source, 'Architecture.md', 'cross_module_dependency');
|
|
376
|
+
break; // One cross-module importer is sufficient to mark Architecture.md affected
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
// Route surfaces affect architecture-level API claims
|
|
380
|
+
if ((card.route_surfaces?.length ?? 0) > 0) {
|
|
381
|
+
addPage(source, 'Architecture.md', 'cross_cutting_routes');
|
|
382
|
+
}
|
|
383
|
+
// Data model / migration surfaces affect architecture-level data claims
|
|
384
|
+
if ((card.migration_surfaces?.length ?? 0) > 0 || (card.model_surfaces?.length ?? 0) > 0) {
|
|
385
|
+
addPage(source, 'Architecture.md', 'cross_cutting_data_model');
|
|
386
|
+
}
|
|
387
|
+
// Environment variables / config surfaces affect architecture-level config claims
|
|
388
|
+
if ((card.environment_variables?.length ?? 0) > 0) {
|
|
389
|
+
addPage(source, 'Architecture.md', 'cross_cutting_config');
|
|
390
|
+
}
|
|
391
|
+
// Auth / billing signals affect architecture-level security claims
|
|
392
|
+
if (card.reasons?.some((r) => ['auth', 'billing-or-payment'].includes(r))) {
|
|
393
|
+
addPage(source, 'Architecture.md', 'cross_cutting_security');
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
// Documentation cards → Documentation-Debt-Report.md (plus their direct module page if any)
|
|
397
|
+
for (const docCard of manifest.documentation?.files || []) {
|
|
398
|
+
const source = docCard.path;
|
|
399
|
+
addPage(source, 'Documentation-Debt-Report.md', 'docs_debt');
|
|
400
|
+
const directSlug = fileToModuleSlug.get(source);
|
|
401
|
+
if (directSlug) {
|
|
402
|
+
addPage(source, directSlug, 'direct_module');
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
const sourceToPagesArray = [...entries.entries()]
|
|
406
|
+
.filter(([, pageMap]) => pageMap.size > 0)
|
|
407
|
+
.map(([source, pageMap]) => ({
|
|
408
|
+
source,
|
|
409
|
+
pages: [...pageMap.entries()]
|
|
410
|
+
.map(([page, reasons]) => ({ page, reasons: [...reasons].sort() }))
|
|
411
|
+
.sort((a, b) => a.page.localeCompare(b.page))
|
|
412
|
+
}))
|
|
413
|
+
.sort((a, b) => a.source.localeCompare(b.source));
|
|
414
|
+
return {
|
|
415
|
+
source_to_pages: sourceToPagesArray,
|
|
416
|
+
summary: {
|
|
417
|
+
mapped_sources: sourceToPagesArray.length,
|
|
418
|
+
total_page_references: sourceToPagesArray.reduce((sum, entry) => sum + entry.pages.length, 0)
|
|
419
|
+
}
|
|
420
|
+
};
|
|
421
|
+
}
|
|
422
|
+
//# sourceMappingURL=planner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"planner.js","sourceRoot":"","sources":["../../src/planner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Prompt template structure for LLM-backed wiki synthesis.
|
|
3
|
+
*
|
|
4
|
+
* Four page archetypes map to distinct templates:
|
|
5
|
+
* - foundation : repo-wide pages (Home, Build-Test-and-Run, Agent-Context-Pack, …)
|
|
6
|
+
* - architecture : dedicated repository architecture synthesis for Architecture.md
|
|
7
|
+
* - module : per-module pages derived from grouped source cards
|
|
8
|
+
* - cross-cutting: shared-concern pages (Dependency-Map, Testing-Strategy, …)
|
|
9
|
+
*/
|
|
10
|
+
export type PageArchetype = 'foundation' | 'module' | 'cross-cutting' | 'architecture';
|
|
11
|
+
export type RouteContext = {
|
|
12
|
+
kind?: string | null;
|
|
13
|
+
framework?: string | null;
|
|
14
|
+
methods?: string[];
|
|
15
|
+
path?: string | null;
|
|
16
|
+
handler?: string | null;
|
|
17
|
+
};
|
|
18
|
+
export type MigrationContext = {
|
|
19
|
+
kind?: string | null;
|
|
20
|
+
id?: string | null;
|
|
21
|
+
name?: string | null;
|
|
22
|
+
};
|
|
23
|
+
export type ModelContext = {
|
|
24
|
+
name?: string | null;
|
|
25
|
+
kind?: string | null;
|
|
26
|
+
framework?: string | null;
|
|
27
|
+
};
|
|
28
|
+
export interface SourceCardContext {
|
|
29
|
+
path: string;
|
|
30
|
+
category: string;
|
|
31
|
+
language: string;
|
|
32
|
+
symbols?: string[];
|
|
33
|
+
imports?: string[];
|
|
34
|
+
reasons?: string[];
|
|
35
|
+
runtime_hints?: string[];
|
|
36
|
+
environment_variables?: string[];
|
|
37
|
+
routes?: RouteContext[];
|
|
38
|
+
migrations?: MigrationContext[];
|
|
39
|
+
models?: ModelContext[];
|
|
40
|
+
excerpt?: string;
|
|
41
|
+
}
|
|
42
|
+
export interface DocCardContext {
|
|
43
|
+
path: string;
|
|
44
|
+
status: string;
|
|
45
|
+
claims?: string[];
|
|
46
|
+
excerpt?: string;
|
|
47
|
+
}
|
|
48
|
+
export interface ModuleInfo {
|
|
49
|
+
name: string;
|
|
50
|
+
slug: string;
|
|
51
|
+
files: string[];
|
|
52
|
+
categories: Record<string, number>;
|
|
53
|
+
languages: Record<string, number>;
|
|
54
|
+
important_reasons?: string[];
|
|
55
|
+
}
|
|
56
|
+
export interface PromptContext {
|
|
57
|
+
/** Wiki page slug/filename without .md extension (e.g. "Module-Auth"). */
|
|
58
|
+
pageName: string;
|
|
59
|
+
/** Human-readable page title (e.g. "Auth"). */
|
|
60
|
+
pageTitle: string;
|
|
61
|
+
repoRemote?: string;
|
|
62
|
+
repoCommit?: string;
|
|
63
|
+
sourceCards: SourceCardContext[];
|
|
64
|
+
docCards?: DocCardContext[];
|
|
65
|
+
/** True when a module's evidence paths are all markdown/documentation files. */
|
|
66
|
+
docsOnlyModule?: boolean;
|
|
67
|
+
/** Current wiki page text, if one already exists. */
|
|
68
|
+
existingContent?: string;
|
|
69
|
+
/** Only set for module archetype. */
|
|
70
|
+
moduleInfo?: ModuleInfo;
|
|
71
|
+
}
|
|
72
|
+
export interface BuiltPrompt {
|
|
73
|
+
system: string;
|
|
74
|
+
user: string;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Architecture page: dedicated archetype for `Architecture.md`.
|
|
78
|
+
* Uses a richer system prompt and an outline with Mermaid diagram guidance.
|
|
79
|
+
*/
|
|
80
|
+
export declare function buildArchitecturePrompt(context: PromptContext): BuiltPrompt;
|
|
81
|
+
/**
|
|
82
|
+
* Foundation pages: Home, Build-Test-and-Run, Agent-Context-Pack, etc.
|
|
83
|
+
* These are repo-wide summary pages derived from the full source inventory.
|
|
84
|
+
*/
|
|
85
|
+
export declare function buildFoundationPrompt(context: PromptContext): BuiltPrompt;
|
|
86
|
+
/**
|
|
87
|
+
* Module pages: one page per logical code grouping.
|
|
88
|
+
* Grounded in the source cards for the module's files.
|
|
89
|
+
*/
|
|
90
|
+
export declare function buildModulePrompt(context: PromptContext): BuiltPrompt;
|
|
91
|
+
/**
|
|
92
|
+
* Cross-cutting pages: Dependency-Map, Testing-Strategy, Security-and-Secrets, etc.
|
|
93
|
+
* These aggregate information from multiple modules.
|
|
94
|
+
*/
|
|
95
|
+
export declare function buildCrossCuttingPrompt(context: PromptContext): BuiltPrompt;
|
|
96
|
+
/**
|
|
97
|
+
* Build a prompt for the given page archetype and context.
|
|
98
|
+
*
|
|
99
|
+
* @param archetype - Page archetype ('foundation' | 'architecture' | 'module' | 'cross-cutting')
|
|
100
|
+
* @param context - Assembled context for this page
|
|
101
|
+
* @returns { system, user } prompt pair ready for an LLM provider
|
|
102
|
+
*/
|
|
103
|
+
export declare function buildPrompt(archetype: PageArchetype, context: PromptContext): BuiltPrompt;
|