sdtk-wiki-kit 0.1.1 → 0.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +110 -6
- package/package.json +1 -1
- package/src/commands/help.js +28 -0
- package/src/commands/lint.js +1 -0
- package/src/commands/operations.js +345 -0
- package/src/commands/search.js +1 -0
- package/src/commands/wiki.js +1 -1
- package/src/index.js +32 -1
- package/src/lib/wiki-compile.js +427 -42
- package/src/lib/wiki-extract.js +680 -4
- package/src/lib/wiki-lint.js +223 -2
- package/src/lib/wiki-search.js +1 -1
package/README.md
CHANGED
|
@@ -28,6 +28,7 @@ Implemented in the Foundation/Beta package:
|
|
|
28
28
|
| Capability | Command |
|
|
29
29
|
|---|---|
|
|
30
30
|
| Initialize SDTK-WIKI workspace | `sdtk-wiki init` |
|
|
31
|
+
| Build a personal-brain without timestamp variables | `sdtk-wiki ingest`, `sdtk-wiki compile --mode safe --apply`, `sdtk-wiki query` |
|
|
31
32
|
| Build graph, viewer, generated pages, and provenance | `sdtk-wiki atlas build` |
|
|
32
33
|
| Open local viewer | `sdtk-wiki atlas open` |
|
|
33
34
|
| Watch markdown sources and rebuild | `sdtk-wiki atlas watch` |
|
|
@@ -36,10 +37,13 @@ Implemented in the Foundation/Beta package:
|
|
|
36
37
|
| Run non-destructive wiki lint | `sdtk-wiki lint` |
|
|
37
38
|
| Run stale-page prune dry-run report | `sdtk-wiki wiki prune --dry-run` |
|
|
38
39
|
| Generate local discovery plan from gap evidence | `sdtk-wiki wiki discover --plan` |
|
|
40
|
+
| Generate local discovery plan with beginner facade | `sdtk-wiki discover --plan` |
|
|
41
|
+
| Run report-first maintenance cycle | `sdtk-wiki maintain --mode safe` |
|
|
39
42
|
| Generate semantic extraction dry-run report | `sdtk-wiki wiki extract --dry-run` |
|
|
40
43
|
| Generate compile dry-run preview and JSON sidecar | `sdtk-wiki wiki compile --dry-run` |
|
|
41
44
|
| Apply an approved compile JSON sidecar | `sdtk-wiki wiki compile --apply --yes` |
|
|
42
45
|
| Search generated personal-brain pages locally | `sdtk-wiki search` |
|
|
46
|
+
| Query generated personal-brain pages locally | `sdtk-wiki query` |
|
|
43
47
|
| Ask grounded questions over built graph | `sdtk-wiki ask` with `wiki.ask` entitlement/runtime preconditions |
|
|
44
48
|
| Save one redacted query record after successful Ask | `sdtk-wiki ask --save-query` with `wiki.ask` entitlement/runtime preconditions |
|
|
45
49
|
|
|
@@ -91,6 +95,41 @@ Open the viewer:
|
|
|
91
95
|
sdtk-wiki atlas open --project-path .
|
|
92
96
|
```
|
|
93
97
|
|
|
98
|
+
## Simple Personal-Brain Flow
|
|
99
|
+
|
|
100
|
+
Use this when you want the shortest local second-brain path and do not need to
|
|
101
|
+
inspect timestamped JSON files:
|
|
102
|
+
|
|
103
|
+
```powershell
|
|
104
|
+
sdtk-wiki init --no-open
|
|
105
|
+
sdtk-wiki ingest .\source-md
|
|
106
|
+
sdtk-wiki compile --mode safe --apply
|
|
107
|
+
sdtk-wiki query "multi-agent"
|
|
108
|
+
sdtk-wiki lint
|
|
109
|
+
sdtk-wiki discover --plan
|
|
110
|
+
sdtk-wiki maintain --mode safe
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
Behavior:
|
|
114
|
+
|
|
115
|
+
- `ingest` runs local semantic extraction and writes a report.
|
|
116
|
+
- `compile --mode safe --apply` creates or refreshes the compile preview/JSON
|
|
117
|
+
sidecar internally, then applies the sidecar contract.
|
|
118
|
+
- `query` is deterministic local search over `.sdtk/wiki/personal-brain`; it
|
|
119
|
+
does not use premium Ask, LLM/RAG, web fetch, or query history.
|
|
120
|
+
- `discover` and `maintain` are report-first and do not apply, delete, archive,
|
|
121
|
+
fetch web sources, or mutate `.sdtk/atlas`.
|
|
122
|
+
|
|
123
|
+
Interactive viewer flow:
|
|
124
|
+
|
|
125
|
+
```powershell
|
|
126
|
+
sdtk-wiki init
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
Bare `sdtk-wiki init` may open/start the viewer and keep the terminal session
|
|
130
|
+
active. Use `sdtk-wiki init --no-open` for automation, CI, and local
|
|
131
|
+
non-interactive validation.
|
|
132
|
+
|
|
94
133
|
## Command Reference
|
|
95
134
|
|
|
96
135
|
### Init
|
|
@@ -131,6 +170,27 @@ Safety:
|
|
|
131
170
|
- no generated page updates
|
|
132
171
|
- no graph/viewer rebuild side effects
|
|
133
172
|
|
|
173
|
+
### Beginner Ingest Operation
|
|
174
|
+
|
|
175
|
+
```powershell
|
|
176
|
+
sdtk-wiki ingest <source-root> [--project-path <path>]
|
|
177
|
+
sdtk-wiki ingest --source-root <source-root> [--project-path <path>]
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
Runs semantic extraction over a local Markdown source root plus supported JSON
|
|
181
|
+
source records and writes the latest
|
|
182
|
+
`semantic-extraction-dry-run-*.json` report under `.sdtk/wiki/reports`.
|
|
183
|
+
|
|
184
|
+
This is the beginner-friendly facade for `sdtk-wiki wiki extract --dry-run`.
|
|
185
|
+
It does not mutate source files, personal-brain pages, raw/provenance state,
|
|
186
|
+
graph outputs, web sources, Ask state, or `.sdtk/atlas`.
|
|
187
|
+
|
|
188
|
+
Supported JSON repository records may be an array or an object containing a
|
|
189
|
+
`records`, `repos`, `repositories`, `items`, or `data` array. Each record can
|
|
190
|
+
include `repo_url`, `owner`, `repo_name`, `message_text_snippet`,
|
|
191
|
+
`source_link`, `topics`, and `confidence`. JSON records are local-only evidence:
|
|
192
|
+
SDTK-WIKI does not fetch GitHub, Facebook, or web URLs.
|
|
193
|
+
|
|
134
194
|
### Lint
|
|
135
195
|
|
|
136
196
|
```powershell
|
|
@@ -167,16 +227,25 @@ Safety:
|
|
|
167
227
|
- no compile/apply
|
|
168
228
|
- no prune/delete/archive
|
|
169
229
|
|
|
230
|
+
Beginner facade:
|
|
231
|
+
|
|
232
|
+
```powershell
|
|
233
|
+
sdtk-wiki discover --plan [--project-path <path>]
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
This uses the same local-only discovery plan behavior and report-first safety
|
|
237
|
+
boundary.
|
|
238
|
+
|
|
170
239
|
### Semantic Extraction Dry-Run
|
|
171
240
|
|
|
172
241
|
```powershell
|
|
173
242
|
sdtk-wiki wiki extract --project-path <path> --source-root <path> --dry-run
|
|
174
243
|
```
|
|
175
244
|
|
|
176
|
-
Reads local Markdown sources and
|
|
177
|
-
`.sdtk/wiki/reports`. The report can
|
|
178
|
-
tool candidates, concept candidates,
|
|
179
|
-
source-quality findings.
|
|
245
|
+
Reads local Markdown sources and supported JSON repository records and writes a
|
|
246
|
+
semantic extraction JSON report under `.sdtk/wiki/reports`. The report can
|
|
247
|
+
identify local source records, GitHub tool candidates, concept candidates,
|
|
248
|
+
relations, comparisons, syntheses, and source-quality findings.
|
|
180
249
|
|
|
181
250
|
Safety:
|
|
182
251
|
|
|
@@ -212,6 +281,24 @@ Supported operation types:
|
|
|
212
281
|
Unknown operation types are reported as `unsupported_operation`. Dry-run does
|
|
213
282
|
not modify wiki pages, raw sources, provenance, or `.sdtk/atlas`.
|
|
214
283
|
|
|
284
|
+
### Beginner Compile Operation
|
|
285
|
+
|
|
286
|
+
```powershell
|
|
287
|
+
sdtk-wiki compile --mode safe [--project-path <path>]
|
|
288
|
+
sdtk-wiki compile --mode safe --apply [--project-path <path>]
|
|
289
|
+
```
|
|
290
|
+
|
|
291
|
+
The beginner facade hides timestamped JSON paths:
|
|
292
|
+
|
|
293
|
+
- without `--apply`, it finds the latest semantic extraction report and writes
|
|
294
|
+
the compile preview plus JSON sidecar
|
|
295
|
+
- with `--apply`, it finds the latest sidecar or creates one from the latest
|
|
296
|
+
extraction report, then applies through the same sidecar-only contract
|
|
297
|
+
|
|
298
|
+
`safe` is the only R1 mode. Auto mode, destructive cleanup, web fetch, Ask, raw
|
|
299
|
+
mutation, provenance mutation, source mutation, and `.sdtk/atlas` mutation are
|
|
300
|
+
not performed.
|
|
301
|
+
|
|
215
302
|
### Compile Apply
|
|
216
303
|
|
|
217
304
|
```powershell
|
|
@@ -245,6 +332,15 @@ Search is deterministic, read-only, and non-premium. It does not require
|
|
|
245
332
|
`wiki.ask` entitlement, does not call an LLM/RAG runtime, does not write query
|
|
246
333
|
history, and does not mutate project files.
|
|
247
334
|
|
|
335
|
+
Beginner query facade:
|
|
336
|
+
|
|
337
|
+
```powershell
|
|
338
|
+
sdtk-wiki query --project-path <path> "<query>"
|
|
339
|
+
```
|
|
340
|
+
|
|
341
|
+
`query` is the simple local search command. It is not premium Ask and does not
|
|
342
|
+
require `wiki.ask`.
|
|
343
|
+
|
|
248
344
|
### Ask
|
|
249
345
|
|
|
250
346
|
```powershell
|
|
@@ -290,8 +386,8 @@ Run report-first maintenance checks:
|
|
|
290
386
|
|
|
291
387
|
```powershell
|
|
292
388
|
sdtk-wiki lint --project-path .
|
|
293
|
-
sdtk-wiki
|
|
294
|
-
sdtk-wiki
|
|
389
|
+
sdtk-wiki discover --plan --project-path .
|
|
390
|
+
sdtk-wiki maintain --mode safe --project-path .
|
|
295
391
|
```
|
|
296
392
|
|
|
297
393
|
Preview a compile plan without applying it:
|
|
@@ -302,6 +398,14 @@ sdtk-wiki wiki compile --plan <local-plan.md-or-json> --project-path . --dry-run
|
|
|
302
398
|
|
|
303
399
|
Build a personal-brain from local Markdown sources and search it:
|
|
304
400
|
|
|
401
|
+
```powershell
|
|
402
|
+
sdtk-wiki ingest docs
|
|
403
|
+
sdtk-wiki compile --mode safe --apply
|
|
404
|
+
sdtk-wiki query "multi-agent"
|
|
405
|
+
```
|
|
406
|
+
|
|
407
|
+
Advanced/audit workflow with explicit report files:
|
|
408
|
+
|
|
305
409
|
```powershell
|
|
306
410
|
sdtk-wiki wiki extract --project-path . --source-root docs --dry-run
|
|
307
411
|
sdtk-wiki wiki compile --project-path . --plan .sdtk/wiki/reports/semantic-extraction-dry-run-<stamp>.json --dry-run
|
package/package.json
CHANGED
package/src/commands/help.js
CHANGED
|
@@ -7,6 +7,11 @@ Usage:
|
|
|
7
7
|
sdtk-wiki --help
|
|
8
8
|
sdtk-wiki --version
|
|
9
9
|
sdtk-wiki init --help
|
|
10
|
+
sdtk-wiki ingest --help
|
|
11
|
+
sdtk-wiki compile --help
|
|
12
|
+
sdtk-wiki query --help
|
|
13
|
+
sdtk-wiki discover --help
|
|
14
|
+
sdtk-wiki maintain --help
|
|
10
15
|
sdtk-wiki atlas build --help
|
|
11
16
|
sdtk-wiki atlas open --help
|
|
12
17
|
sdtk-wiki atlas watch --help
|
|
@@ -19,8 +24,22 @@ Usage:
|
|
|
19
24
|
sdtk-wiki search --help
|
|
20
25
|
sdtk-wiki lint --help
|
|
21
26
|
|
|
27
|
+
Simple personal-brain workflow:
|
|
28
|
+
sdtk-wiki init --no-open
|
|
29
|
+
sdtk-wiki ingest <source-root>
|
|
30
|
+
sdtk-wiki compile --mode safe [--apply]
|
|
31
|
+
sdtk-wiki query "<query>"
|
|
32
|
+
sdtk-wiki lint
|
|
33
|
+
sdtk-wiki discover --plan
|
|
34
|
+
sdtk-wiki maintain --mode safe
|
|
35
|
+
|
|
22
36
|
R1 command model:
|
|
23
37
|
init Initialize the SDTK-WIKI workspace.
|
|
38
|
+
ingest Run local semantic extraction without handling timestamped JSON.
|
|
39
|
+
compile Run safe personal-brain compile preview, optionally apply.
|
|
40
|
+
query Search generated personal-brain pages locally without premium Ask.
|
|
41
|
+
discover Write a local-only discovery plan from WIKI gap evidence.
|
|
42
|
+
maintain Run safe lint, discover, and compile-preview maintenance reports.
|
|
24
43
|
atlas build Build graph/viewer plus local wiki pages/provenance.
|
|
25
44
|
atlas open Open or serve the local graph viewer.
|
|
26
45
|
atlas watch Watch markdown sources and rebuild the graph.
|
|
@@ -33,6 +52,12 @@ R1 command model:
|
|
|
33
52
|
search Search generated personal-brain pages locally without premium Ask.
|
|
34
53
|
lint Write a report-first, non-destructive wiki lint report.
|
|
35
54
|
|
|
55
|
+
Advanced/audit workflow:
|
|
56
|
+
sdtk-wiki wiki extract --source-root <source-root> --dry-run
|
|
57
|
+
sdtk-wiki wiki compile --plan <extract-json> --dry-run
|
|
58
|
+
sdtk-wiki wiki compile --plan <apply-json> --apply --yes
|
|
59
|
+
sdtk-wiki search "<query>"
|
|
60
|
+
|
|
36
61
|
Workspace paths:
|
|
37
62
|
.sdtk/wiki New SDTK-WIKI workspace target.
|
|
38
63
|
.sdtk/wiki/graph New SDTK-WIKI graph output target.
|
|
@@ -53,10 +78,13 @@ Premium Ask:
|
|
|
53
78
|
Query history, discover, compile, and cleanup automation are not enabled in R1.
|
|
54
79
|
|
|
55
80
|
Local Search:
|
|
81
|
+
sdtk-wiki query Beginner-friendly local deterministic search over .sdtk/wiki/personal-brain.
|
|
56
82
|
sdtk-wiki search Deterministic, read-only local search over .sdtk/wiki/personal-brain.
|
|
57
83
|
Does not require wiki.ask entitlement and does not perform LLM/RAG behavior.
|
|
58
84
|
|
|
59
85
|
Maintenance:
|
|
86
|
+
sdtk-wiki discover --plan is a top-level alias for local-only discovery planning.
|
|
87
|
+
sdtk-wiki maintain --mode safe runs report-first lint/discover/compile-preview checks without apply.
|
|
60
88
|
sdtk-wiki wiki prune --dry-run is report-only and writes under .sdtk/wiki/reports.
|
|
61
89
|
It never deletes, archives, applies, or mutates .sdtk/atlas.`);
|
|
62
90
|
console.log(`
|
package/src/commands/lint.js
CHANGED
|
@@ -21,6 +21,7 @@ Output:
|
|
|
21
21
|
Behavior:
|
|
22
22
|
Findings are written to the report and do not auto-modify wiki or source files.
|
|
23
23
|
Source-quality checks report mojibake-like text, missing source URLs, weak titles, duplicate repo/source candidates, low-confidence extraction, and raw/graph/provenance coverage mismatch.
|
|
24
|
+
Personal-brain quality metrics report frontmatter coverage, required sections, source refs, internal links, stub ratio, giant pages, density, and source evidence coverage.
|
|
24
25
|
Completed lint runs exit 0 even when findings exist.
|
|
25
26
|
Missing workspace or fatal report-write failures exit non-zero.
|
|
26
27
|
|
|
@@ -0,0 +1,345 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
const fs = require("fs");
|
|
4
|
+
const path = require("path");
|
|
5
|
+
const { parseFlags } = require("../lib/args");
|
|
6
|
+
const { CliError, ValidationError } = require("../lib/errors");
|
|
7
|
+
const { runWikiCompileApply, runWikiCompileDryRun } = require("../lib/wiki-compile");
|
|
8
|
+
const { runWikiDiscoverPlan } = require("../lib/wiki-discover");
|
|
9
|
+
const { runWikiExtractDryRun } = require("../lib/wiki-extract");
|
|
10
|
+
const { runWikiLint } = require("../lib/wiki-lint");
|
|
11
|
+
const { runWikiSearch } = require("../lib/wiki-search");
|
|
12
|
+
const { getWikiReportsPath, resolveProjectPath } = require("../lib/wiki-paths");
|
|
13
|
+
const { printHumanResult } = require("./search");
|
|
14
|
+
|
|
15
|
+
const INGEST_FLAG_DEFS = {
|
|
16
|
+
help: { type: "boolean", alias: "h" },
|
|
17
|
+
"project-path": { type: "string" },
|
|
18
|
+
"source-root": { type: "string" },
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
const COMPILE_FLAG_DEFS = {
|
|
22
|
+
help: { type: "boolean", alias: "h" },
|
|
23
|
+
"project-path": { type: "string" },
|
|
24
|
+
mode: { type: "string" },
|
|
25
|
+
apply: { type: "boolean" },
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
const QUERY_FLAG_DEFS = {
|
|
29
|
+
help: { type: "boolean", alias: "h" },
|
|
30
|
+
"project-path": { type: "string" },
|
|
31
|
+
json: { type: "boolean" },
|
|
32
|
+
limit: { type: "string" },
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
const DISCOVER_FLAG_DEFS = {
|
|
36
|
+
help: { type: "boolean", alias: "h" },
|
|
37
|
+
"project-path": { type: "string" },
|
|
38
|
+
plan: { type: "boolean" },
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
const MAINTAIN_FLAG_DEFS = {
|
|
42
|
+
help: { type: "boolean", alias: "h" },
|
|
43
|
+
"project-path": { type: "string" },
|
|
44
|
+
mode: { type: "string" },
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
function ensureProjectPath(projectPath) {
|
|
48
|
+
const resolved = resolveProjectPath(projectPath || process.cwd());
|
|
49
|
+
if (!fs.existsSync(resolved) || !fs.statSync(resolved).isDirectory()) {
|
|
50
|
+
throw new ValidationError(`--project-path is not a valid directory: ${resolved}`);
|
|
51
|
+
}
|
|
52
|
+
return resolved;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
function ensureSafeMode(mode, commandName) {
|
|
56
|
+
const resolvedMode = mode || "safe";
|
|
57
|
+
if (resolvedMode !== "safe") {
|
|
58
|
+
throw new ValidationError(
|
|
59
|
+
`sdtk-wiki ${commandName} supports only --mode safe in R1. Auto mode is deferred. No project files were changed.`
|
|
60
|
+
);
|
|
61
|
+
}
|
|
62
|
+
return resolvedMode;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
function findLatestReport(projectPath, pattern) {
|
|
66
|
+
const reportsPath = getWikiReportsPath(projectPath);
|
|
67
|
+
if (!fs.existsSync(reportsPath) || !fs.statSync(reportsPath).isDirectory()) {
|
|
68
|
+
return null;
|
|
69
|
+
}
|
|
70
|
+
const matcher = new RegExp(`^${pattern}$`);
|
|
71
|
+
const files = fs.readdirSync(reportsPath)
|
|
72
|
+
.filter((name) => matcher.test(name))
|
|
73
|
+
.map((name) => {
|
|
74
|
+
const filePath = path.join(reportsPath, name);
|
|
75
|
+
return { filePath, mtimeMs: fs.statSync(filePath).mtimeMs };
|
|
76
|
+
})
|
|
77
|
+
.sort((a, b) => {
|
|
78
|
+
if (b.mtimeMs !== a.mtimeMs) return b.mtimeMs - a.mtimeMs;
|
|
79
|
+
return b.filePath.localeCompare(a.filePath);
|
|
80
|
+
});
|
|
81
|
+
return files.length > 0 ? files[0] : null;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
function latestExtraction(projectPath) {
|
|
85
|
+
return findLatestReport(projectPath, "semantic-extraction-dry-run-.*\\.json");
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
function latestApplyPlan(projectPath) {
|
|
89
|
+
return findLatestReport(projectPath, "compile-apply-plan-.*\\.json");
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
function cmdIngestHelp() {
|
|
93
|
+
console.log(`SDTK-WIKI Ingest
|
|
94
|
+
|
|
95
|
+
Usage:
|
|
96
|
+
sdtk-wiki ingest <source-root> [--project-path <path>]
|
|
97
|
+
sdtk-wiki ingest --source-root <path> [--project-path <path>]
|
|
98
|
+
|
|
99
|
+
Purpose:
|
|
100
|
+
Run local semantic extraction over Markdown and supported JSON source records and write a report under .sdtk/wiki/reports.
|
|
101
|
+
|
|
102
|
+
Safety:
|
|
103
|
+
Local sources only.
|
|
104
|
+
No source mutation, personal-brain page writes, graph rebuild, web fetch, Ask, raw/provenance mutation, or .sdtk/atlas mutation.
|
|
105
|
+
|
|
106
|
+
Next:
|
|
107
|
+
sdtk-wiki compile --mode safe`);
|
|
108
|
+
return 0;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
function cmdCompileHelp() {
|
|
112
|
+
console.log(`SDTK-WIKI Compile
|
|
113
|
+
|
|
114
|
+
Usage:
|
|
115
|
+
sdtk-wiki compile --mode safe [--project-path <path>]
|
|
116
|
+
sdtk-wiki compile --mode safe --apply [--project-path <path>]
|
|
117
|
+
|
|
118
|
+
Purpose:
|
|
119
|
+
Use the latest semantic extraction report to write a compile preview and JSON sidecar, then optionally apply the sidecar.
|
|
120
|
+
|
|
121
|
+
Safety:
|
|
122
|
+
Safe mode is the only R1 mode.
|
|
123
|
+
--apply still uses the existing JSON sidecar contract.
|
|
124
|
+
No delete, archive, rewrite, raw/provenance mutation, source mutation, web fetch, Ask, or .sdtk/atlas mutation.`);
|
|
125
|
+
return 0;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
function cmdQueryHelp() {
|
|
129
|
+
console.log(`SDTK-WIKI Query
|
|
130
|
+
|
|
131
|
+
Usage:
|
|
132
|
+
sdtk-wiki query [--project-path <path>] [--json] [--limit <n>] "<query>"
|
|
133
|
+
|
|
134
|
+
Purpose:
|
|
135
|
+
Deterministically search generated personal-brain Markdown pages.
|
|
136
|
+
|
|
137
|
+
Behavior:
|
|
138
|
+
Local search only.
|
|
139
|
+
No wiki.ask entitlement, LLM/RAG runtime, query history, or project mutation.
|
|
140
|
+
Use sdtk-wiki ask for premium grounded Q&A when wiki.ask preconditions are available.`);
|
|
141
|
+
return 0;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
function cmdDiscoverHelp() {
|
|
145
|
+
console.log(`SDTK-WIKI Discover
|
|
146
|
+
|
|
147
|
+
Usage:
|
|
148
|
+
sdtk-wiki discover --plan [--project-path <path>]
|
|
149
|
+
|
|
150
|
+
Purpose:
|
|
151
|
+
Write a local-only discovery plan from existing wiki gap evidence.
|
|
152
|
+
|
|
153
|
+
Safety:
|
|
154
|
+
Plan-only. No web fetch, source ingest, compile, apply, prune, delete, archive, query history, Ask, or .sdtk/atlas mutation.`);
|
|
155
|
+
return 0;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
function cmdMaintainHelp() {
|
|
159
|
+
console.log(`SDTK-WIKI Maintain
|
|
160
|
+
|
|
161
|
+
Usage:
|
|
162
|
+
sdtk-wiki maintain --mode safe [--project-path <path>]
|
|
163
|
+
|
|
164
|
+
Purpose:
|
|
165
|
+
Run a report-first maintenance cycle: lint, discover plan, and compile preview when an extraction report exists.
|
|
166
|
+
|
|
167
|
+
Safety:
|
|
168
|
+
Safe mode only.
|
|
169
|
+
No apply, delete, archive, source mutation, web fetch, Ask, query history, or .sdtk/atlas mutation.`);
|
|
170
|
+
return 0;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
function resolveSourceRoot(flags, positional) {
|
|
174
|
+
if (flags["source-root"]) return flags["source-root"];
|
|
175
|
+
if (positional.length === 1) return positional[0];
|
|
176
|
+
if (positional.length > 1) {
|
|
177
|
+
throw new ValidationError("sdtk-wiki ingest accepts one source root. Quote paths that contain spaces. No project files were changed.");
|
|
178
|
+
}
|
|
179
|
+
throw new ValidationError("sdtk-wiki ingest requires <source-root> or --source-root <path>. No project files were changed.");
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
function cmdIngest(args) {
|
|
183
|
+
const { flags, positional } = parseFlags(args || [], INGEST_FLAG_DEFS);
|
|
184
|
+
if (flags.help) return cmdIngestHelp();
|
|
185
|
+
const projectPath = ensureProjectPath(flags["project-path"]);
|
|
186
|
+
const result = runWikiExtractDryRun({
|
|
187
|
+
projectPath,
|
|
188
|
+
sourceRootArg: resolveSourceRoot(flags, positional),
|
|
189
|
+
});
|
|
190
|
+
const extraction = result.extraction;
|
|
191
|
+
|
|
192
|
+
console.log(`[wiki] Semantic extraction report: ${result.reportPath}`);
|
|
193
|
+
console.log(`[wiki] Sources scanned: ${extraction.source_counts.scanned}`);
|
|
194
|
+
console.log(`[wiki] Sources indexed: ${extraction.source_counts.indexed}`);
|
|
195
|
+
console.log(`[wiki] Tool candidates: ${extraction.tool_entities.length}`);
|
|
196
|
+
console.log(`[wiki] Concept candidates: ${extraction.concepts.length}`);
|
|
197
|
+
console.log(`[wiki] Quality findings: ${extraction.source_quality_findings.length}`);
|
|
198
|
+
console.log("[wiki] No source files, personal-brain pages, raw/provenance state, graph outputs, or atlas compatibility files were modified.");
|
|
199
|
+
console.log("[wiki] Next: sdtk-wiki compile --mode safe");
|
|
200
|
+
return 0;
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
function runCompileDryRunFromLatestExtraction(projectPath) {
|
|
204
|
+
const extraction = latestExtraction(projectPath);
|
|
205
|
+
if (!extraction) {
|
|
206
|
+
throw new ValidationError(
|
|
207
|
+
"No semantic extraction report found. Run \"sdtk-wiki ingest <source-root>\" first. No project files were changed."
|
|
208
|
+
);
|
|
209
|
+
}
|
|
210
|
+
return runWikiCompileDryRun({ projectPath, planArg: extraction.filePath });
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
function ensureApplySidecar(projectPath) {
|
|
214
|
+
const extraction = latestExtraction(projectPath);
|
|
215
|
+
const sidecar = latestApplyPlan(projectPath);
|
|
216
|
+
if (!sidecar && !extraction) {
|
|
217
|
+
throw new ValidationError(
|
|
218
|
+
"No compile apply sidecar or semantic extraction report found. Run \"sdtk-wiki ingest <source-root>\" first. No project files were changed."
|
|
219
|
+
);
|
|
220
|
+
}
|
|
221
|
+
if (!sidecar || (extraction && extraction.mtimeMs > sidecar.mtimeMs)) {
|
|
222
|
+
const dryRun = runCompileDryRunFromLatestExtraction(projectPath);
|
|
223
|
+
return {
|
|
224
|
+
sidecarPath: dryRun.applyPlanPath,
|
|
225
|
+
dryRun,
|
|
226
|
+
createdFreshSidecar: true,
|
|
227
|
+
};
|
|
228
|
+
}
|
|
229
|
+
return {
|
|
230
|
+
sidecarPath: sidecar.filePath,
|
|
231
|
+
dryRun: null,
|
|
232
|
+
createdFreshSidecar: false,
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
function cmdCompile(args) {
|
|
237
|
+
const { flags } = parseFlags(args || [], COMPILE_FLAG_DEFS);
|
|
238
|
+
if (flags.help) return cmdCompileHelp();
|
|
239
|
+
ensureSafeMode(flags.mode, "compile");
|
|
240
|
+
const projectPath = ensureProjectPath(flags["project-path"]);
|
|
241
|
+
|
|
242
|
+
if (!flags.apply) {
|
|
243
|
+
const result = runCompileDryRunFromLatestExtraction(projectPath);
|
|
244
|
+
console.log(`[wiki] Compile dry-run preview: ${result.reportPath}`);
|
|
245
|
+
console.log(`[wiki] Compile apply JSON sidecar: ${result.applyPlanPath}`);
|
|
246
|
+
console.log(`[wiki] Operations: ${result.operations.length}`);
|
|
247
|
+
console.log(`[wiki] Unsupported operations: ${result.unsupportedCount}`);
|
|
248
|
+
console.log("[wiki] No wiki pages, raw sources, provenance, source files, or atlas compatibility files were modified.");
|
|
249
|
+
console.log("[wiki] Next: sdtk-wiki compile --mode safe --apply");
|
|
250
|
+
if (result.unsupportedCount > 0) {
|
|
251
|
+
throw new CliError(
|
|
252
|
+
`unsupported_operation: ${result.unsupportedCount} operation(s) are blocked. Review the compile dry-run preview report.`,
|
|
253
|
+
1
|
|
254
|
+
);
|
|
255
|
+
}
|
|
256
|
+
return 0;
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
const sidecar = ensureApplySidecar(projectPath);
|
|
260
|
+
const result = runWikiCompileApply({ projectPath, planArg: sidecar.sidecarPath });
|
|
261
|
+
console.log(`[wiki] Compile apply plan: ${result.planPath}`);
|
|
262
|
+
if (sidecar.createdFreshSidecar) {
|
|
263
|
+
console.log(`[wiki] Refreshed compile dry-run preview: ${sidecar.dryRun.reportPath}`);
|
|
264
|
+
}
|
|
265
|
+
console.log(`[wiki] Created files: ${result.created.length}`);
|
|
266
|
+
console.log(`[wiki] Unchanged files: ${result.unchanged.length}`);
|
|
267
|
+
console.log(`[wiki] Source-quality warnings: ${result.sourceQualityWarningCount}`);
|
|
268
|
+
console.log("[wiki] No source files, raw sources, provenance descriptors, or atlas compatibility files were modified.");
|
|
269
|
+
console.log("[wiki] Next: sdtk-wiki query \"multi-agent\"");
|
|
270
|
+
return 0;
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
function cmdQuery(args) {
|
|
274
|
+
const { flags, positional } = parseFlags(args || [], QUERY_FLAG_DEFS);
|
|
275
|
+
if (flags.help) return cmdQueryHelp();
|
|
276
|
+
const query = positional.join(" ");
|
|
277
|
+
const result = runWikiSearch({
|
|
278
|
+
projectPath: flags["project-path"],
|
|
279
|
+
query,
|
|
280
|
+
limit: flags.limit,
|
|
281
|
+
});
|
|
282
|
+
if (flags.json) {
|
|
283
|
+
console.log(JSON.stringify(result, null, 2));
|
|
284
|
+
} else {
|
|
285
|
+
console.log("[wiki] Query mode: local deterministic search. Premium Ask is not used.");
|
|
286
|
+
printHumanResult(result);
|
|
287
|
+
}
|
|
288
|
+
return 0;
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
function cmdDiscover(args) {
|
|
292
|
+
const { flags } = parseFlags(args || [], DISCOVER_FLAG_DEFS);
|
|
293
|
+
if (flags.help) return cmdDiscoverHelp();
|
|
294
|
+
if (!flags.plan) {
|
|
295
|
+
throw new ValidationError("sdtk-wiki discover requires --plan. No web/fetch/apply/auto behavior is enabled. No project files were changed.");
|
|
296
|
+
}
|
|
297
|
+
const projectPath = ensureProjectPath(flags["project-path"]);
|
|
298
|
+
const result = runWikiDiscoverPlan({ projectPath });
|
|
299
|
+
|
|
300
|
+
console.log(`[wiki] Discovery plan report: ${result.reportPath}`);
|
|
301
|
+
console.log(`[wiki] Pages scanned: ${result.pageCount}`);
|
|
302
|
+
console.log(`[wiki] Plan items: ${result.items.length}`);
|
|
303
|
+
console.log("[wiki] No sources were fetched, ingested, compiled, applied, pruned, deleted, archived, or persisted.");
|
|
304
|
+
return 0;
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
function cmdMaintain(args) {
|
|
308
|
+
const { flags } = parseFlags(args || [], MAINTAIN_FLAG_DEFS);
|
|
309
|
+
if (flags.help) return cmdMaintainHelp();
|
|
310
|
+
ensureSafeMode(flags.mode, "maintain");
|
|
311
|
+
const projectPath = ensureProjectPath(flags["project-path"]);
|
|
312
|
+
|
|
313
|
+
const lint = runWikiLint({ projectPath });
|
|
314
|
+
const discover = runWikiDiscoverPlan({ projectPath });
|
|
315
|
+
const extraction = latestExtraction(projectPath);
|
|
316
|
+
let compile = null;
|
|
317
|
+
if (extraction) {
|
|
318
|
+
compile = runWikiCompileDryRun({ projectPath, planArg: extraction.filePath });
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
console.log(`[wiki] Maintain mode: safe`);
|
|
322
|
+
console.log(`[wiki] Lint report: ${lint.reportPath}`);
|
|
323
|
+
console.log(`[wiki] Discovery plan report: ${discover.reportPath}`);
|
|
324
|
+
if (compile) {
|
|
325
|
+
console.log(`[wiki] Compile dry-run preview: ${compile.reportPath}`);
|
|
326
|
+
console.log(`[wiki] Compile apply JSON sidecar: ${compile.applyPlanPath}`);
|
|
327
|
+
} else {
|
|
328
|
+
console.log("[wiki] Compile preview skipped: no semantic extraction report found. Run \"sdtk-wiki ingest <source-root>\".");
|
|
329
|
+
}
|
|
330
|
+
console.log("[wiki] No apply, source mutation, web fetch, Ask, query history, delete/archive, or atlas compatibility mutation was performed.");
|
|
331
|
+
return 0;
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
module.exports = {
|
|
335
|
+
cmdCompile,
|
|
336
|
+
cmdCompileHelp,
|
|
337
|
+
cmdDiscover,
|
|
338
|
+
cmdDiscoverHelp,
|
|
339
|
+
cmdIngest,
|
|
340
|
+
cmdIngestHelp,
|
|
341
|
+
cmdMaintain,
|
|
342
|
+
cmdMaintainHelp,
|
|
343
|
+
cmdQuery,
|
|
344
|
+
cmdQueryHelp,
|
|
345
|
+
};
|
package/src/commands/search.js
CHANGED
package/src/commands/wiki.js
CHANGED
|
@@ -44,7 +44,7 @@ Writes:
|
|
|
44
44
|
|
|
45
45
|
Safety:
|
|
46
46
|
Dry-run report only.
|
|
47
|
-
Local Markdown source roots only; remote URLs are rejected.
|
|
47
|
+
Local Markdown and supported JSON source roots only; remote URLs are rejected.
|
|
48
48
|
No personal-brain pages, managed pages, raw sources, provenance state, atlas compatibility files, web fetch, Ask, compile/apply, prune, delete, archive, or source files are modified.`);
|
|
49
49
|
return 0;
|
|
50
50
|
}
|
package/src/index.js
CHANGED
|
@@ -5,6 +5,13 @@ const { cmdAsk } = require("./commands/ask");
|
|
|
5
5
|
const { cmdHelp } = require("./commands/help");
|
|
6
6
|
const { cmdInit } = require("./commands/init");
|
|
7
7
|
const { cmdLint } = require("./commands/lint");
|
|
8
|
+
const {
|
|
9
|
+
cmdCompile,
|
|
10
|
+
cmdDiscover,
|
|
11
|
+
cmdIngest,
|
|
12
|
+
cmdMaintain,
|
|
13
|
+
cmdQuery,
|
|
14
|
+
} = require("./commands/operations");
|
|
8
15
|
const { cmdSearch } = require("./commands/search");
|
|
9
16
|
const { cmdWiki } = require("./commands/wiki");
|
|
10
17
|
const { ValidationError } = require("./lib/errors");
|
|
@@ -30,7 +37,21 @@ function parseCommand(argv) {
|
|
|
30
37
|
return { command: first, args: rest };
|
|
31
38
|
}
|
|
32
39
|
|
|
33
|
-
const COMMANDS = new Set([
|
|
40
|
+
const COMMANDS = new Set([
|
|
41
|
+
"help",
|
|
42
|
+
"version",
|
|
43
|
+
"init",
|
|
44
|
+
"atlas",
|
|
45
|
+
"wiki",
|
|
46
|
+
"ask",
|
|
47
|
+
"lint",
|
|
48
|
+
"search",
|
|
49
|
+
"ingest",
|
|
50
|
+
"compile",
|
|
51
|
+
"query",
|
|
52
|
+
"discover",
|
|
53
|
+
"maintain",
|
|
54
|
+
]);
|
|
34
55
|
|
|
35
56
|
async function run(argv) {
|
|
36
57
|
const { command, args } = parseCommand(argv);
|
|
@@ -59,6 +80,16 @@ async function run(argv) {
|
|
|
59
80
|
return cmdLint(args);
|
|
60
81
|
case "search":
|
|
61
82
|
return cmdSearch(args);
|
|
83
|
+
case "ingest":
|
|
84
|
+
return cmdIngest(args);
|
|
85
|
+
case "compile":
|
|
86
|
+
return cmdCompile(args);
|
|
87
|
+
case "query":
|
|
88
|
+
return cmdQuery(args);
|
|
89
|
+
case "discover":
|
|
90
|
+
return cmdDiscover(args);
|
|
91
|
+
case "maintain":
|
|
92
|
+
return cmdMaintain(args);
|
|
62
93
|
}
|
|
63
94
|
}
|
|
64
95
|
|