@lsctech/polaris 0.2.0 → 0.2.2
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/dist/graph/adapter/c/runtime.js +5 -8
- package/dist/graph/adapter/cpp/runtime.js +8 -11
- package/dist/graph/adapter/csharp/runtime.js +8 -11
- package/dist/graph/adapter/dart/runtime.js +8 -11
- package/dist/graph/adapter/go/runtime.js +5 -8
- package/dist/graph/adapter/kotlin-java/runtime.js +9 -12
- package/dist/graph/adapter/python/runtime.js +8 -11
- package/dist/graph/adapter/rust/runtime.js +8 -11
- package/dist/graph/adapter/swift/runtime.js +8 -11
- package/dist/graph/adapter/typescript-javascript/runtime.js +12 -13
- package/dist/smartdocs-engine/index.js +18 -0
- package/dist/smartdocs-engine/review.js +149 -0
- package/package.json +12 -1
|
@@ -11,7 +11,7 @@ async function loadTreeSitterRuntime() {
|
|
|
11
11
|
return await cachedRuntimePromise;
|
|
12
12
|
}
|
|
13
13
|
cachedRuntimePromise = (async () => {
|
|
14
|
-
const loaded =
|
|
14
|
+
const loaded = loadTreeSitterModules();
|
|
15
15
|
const parser = new loaded.parserConstructor();
|
|
16
16
|
parser.setLanguage(loaded.language);
|
|
17
17
|
const runtime = {
|
|
@@ -25,18 +25,15 @@ async function loadTreeSitterRuntime() {
|
|
|
25
25
|
})();
|
|
26
26
|
return await cachedRuntimePromise;
|
|
27
27
|
}
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
const
|
|
28
|
+
function loadTreeSitterModules() {
|
|
29
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
30
|
+
const nodeRequire = require;
|
|
31
|
+
const [treeSitterModule, cModule] = [nodeRequire("tree-sitter"), nodeRequire("tree-sitter-c")];
|
|
31
32
|
return {
|
|
32
33
|
parserConstructor: resolveParserConstructor(treeSitterModule),
|
|
33
34
|
language: resolveGrammar(cModule, "tree-sitter-c"),
|
|
34
35
|
};
|
|
35
36
|
}
|
|
36
|
-
function createDynamicImporter() {
|
|
37
|
-
const importer = new Function("specifier", "return import(specifier);");
|
|
38
|
-
return (specifier) => importer(specifier);
|
|
39
|
-
}
|
|
40
37
|
function resolveParserConstructor(moduleValue) {
|
|
41
38
|
if (typeof moduleValue === "function") {
|
|
42
39
|
return moduleValue;
|
|
@@ -6,7 +6,7 @@ async function loadTreeSitterRuntime() {
|
|
|
6
6
|
if (cachedRuntime) {
|
|
7
7
|
return cachedRuntime;
|
|
8
8
|
}
|
|
9
|
-
const loaded =
|
|
9
|
+
const loaded = loadTreeSitterModules();
|
|
10
10
|
const parser = new loaded.parserConstructor();
|
|
11
11
|
parser.setLanguage(loaded.language);
|
|
12
12
|
cachedRuntime = {
|
|
@@ -16,21 +16,18 @@ async function loadTreeSitterRuntime() {
|
|
|
16
16
|
};
|
|
17
17
|
return cachedRuntime;
|
|
18
18
|
}
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
const
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
19
|
+
function loadTreeSitterModules() {
|
|
20
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
21
|
+
const nodeRequire = require;
|
|
22
|
+
const [treeSitterModule, cppModule] = [
|
|
23
|
+
nodeRequire("tree-sitter"),
|
|
24
|
+
nodeRequire("tree-sitter-cpp"),
|
|
25
|
+
];
|
|
25
26
|
return {
|
|
26
27
|
parserConstructor: resolveParserConstructor(treeSitterModule),
|
|
27
28
|
language: resolveGrammar(cppModule, "tree-sitter-cpp"),
|
|
28
29
|
};
|
|
29
30
|
}
|
|
30
|
-
function createDynamicImporter() {
|
|
31
|
-
const importer = new Function("specifier", "return import(specifier);");
|
|
32
|
-
return (specifier) => importer(specifier);
|
|
33
|
-
}
|
|
34
31
|
function resolveParserConstructor(moduleValue) {
|
|
35
32
|
if (typeof moduleValue === "function") {
|
|
36
33
|
return moduleValue;
|
|
@@ -6,7 +6,7 @@ async function loadTreeSitterRuntime() {
|
|
|
6
6
|
if (cachedRuntime) {
|
|
7
7
|
return cachedRuntime;
|
|
8
8
|
}
|
|
9
|
-
const loaded =
|
|
9
|
+
const loaded = loadTreeSitterModules();
|
|
10
10
|
const parser = new loaded.parserConstructor();
|
|
11
11
|
parser.setLanguage(loaded.language);
|
|
12
12
|
cachedRuntime = {
|
|
@@ -16,21 +16,18 @@ async function loadTreeSitterRuntime() {
|
|
|
16
16
|
};
|
|
17
17
|
return cachedRuntime;
|
|
18
18
|
}
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
const
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
19
|
+
function loadTreeSitterModules() {
|
|
20
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
21
|
+
const nodeRequire = require;
|
|
22
|
+
const [treeSitterModule, csharpModule] = [
|
|
23
|
+
nodeRequire("tree-sitter"),
|
|
24
|
+
nodeRequire("tree-sitter-c-sharp"),
|
|
25
|
+
];
|
|
25
26
|
return {
|
|
26
27
|
parserConstructor: resolveParserConstructor(treeSitterModule),
|
|
27
28
|
language: resolveGrammar(csharpModule, "tree-sitter-c-sharp"),
|
|
28
29
|
};
|
|
29
30
|
}
|
|
30
|
-
function createDynamicImporter() {
|
|
31
|
-
const importer = new Function("specifier", "return import(specifier);");
|
|
32
|
-
return (specifier) => importer(specifier);
|
|
33
|
-
}
|
|
34
31
|
function resolveParserConstructor(moduleValue) {
|
|
35
32
|
if (typeof moduleValue === "function") {
|
|
36
33
|
return moduleValue;
|
|
@@ -6,7 +6,7 @@ async function loadTreeSitterRuntime() {
|
|
|
6
6
|
if (cachedRuntime) {
|
|
7
7
|
return cachedRuntime;
|
|
8
8
|
}
|
|
9
|
-
const loaded =
|
|
9
|
+
const loaded = loadTreeSitterModules();
|
|
10
10
|
const parser = new loaded.parserConstructor();
|
|
11
11
|
parser.setLanguage(loaded.language);
|
|
12
12
|
cachedRuntime = {
|
|
@@ -16,21 +16,18 @@ async function loadTreeSitterRuntime() {
|
|
|
16
16
|
};
|
|
17
17
|
return cachedRuntime;
|
|
18
18
|
}
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
const
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
19
|
+
function loadTreeSitterModules() {
|
|
20
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
21
|
+
const nodeRequire = require;
|
|
22
|
+
const [treeSitterModule, dartModule] = [
|
|
23
|
+
nodeRequire("tree-sitter"),
|
|
24
|
+
nodeRequire("tree-sitter-dart"),
|
|
25
|
+
];
|
|
25
26
|
return {
|
|
26
27
|
parserConstructor: resolveParserConstructor(treeSitterModule),
|
|
27
28
|
language: resolveGrammar(dartModule, "tree-sitter-dart"),
|
|
28
29
|
};
|
|
29
30
|
}
|
|
30
|
-
function createDynamicImporter() {
|
|
31
|
-
const importer = new Function("specifier", "return import(specifier);");
|
|
32
|
-
return (specifier) => importer(specifier);
|
|
33
|
-
}
|
|
34
31
|
function resolveParserConstructor(moduleValue) {
|
|
35
32
|
if (typeof moduleValue === "function") {
|
|
36
33
|
return moduleValue;
|
|
@@ -6,7 +6,7 @@ async function loadTreeSitterRuntime() {
|
|
|
6
6
|
if (cachedRuntime) {
|
|
7
7
|
return cachedRuntime;
|
|
8
8
|
}
|
|
9
|
-
const loaded =
|
|
9
|
+
const loaded = loadTreeSitterModules();
|
|
10
10
|
const parser = new loaded.parserConstructor();
|
|
11
11
|
parser.setLanguage(loaded.language);
|
|
12
12
|
cachedRuntime = {
|
|
@@ -16,18 +16,15 @@ async function loadTreeSitterRuntime() {
|
|
|
16
16
|
};
|
|
17
17
|
return cachedRuntime;
|
|
18
18
|
}
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
const
|
|
19
|
+
function loadTreeSitterModules() {
|
|
20
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
21
|
+
const nodeRequire = require;
|
|
22
|
+
const [treeSitterModule, goModule] = [nodeRequire("tree-sitter"), nodeRequire("tree-sitter-go")];
|
|
22
23
|
return {
|
|
23
24
|
parserConstructor: resolveParserConstructor(treeSitterModule),
|
|
24
25
|
language: resolveGrammar(goModule, "tree-sitter-go"),
|
|
25
26
|
};
|
|
26
27
|
}
|
|
27
|
-
function createDynamicImporter() {
|
|
28
|
-
const importer = new Function("specifier", "return import(specifier);");
|
|
29
|
-
return (specifier) => importer(specifier);
|
|
30
|
-
}
|
|
31
28
|
function resolveParserConstructor(moduleValue) {
|
|
32
29
|
if (typeof moduleValue === "function") {
|
|
33
30
|
return moduleValue;
|
|
@@ -6,7 +6,7 @@ async function loadTreeSitterRuntime() {
|
|
|
6
6
|
if (cachedRuntime) {
|
|
7
7
|
return cachedRuntime;
|
|
8
8
|
}
|
|
9
|
-
const loaded =
|
|
9
|
+
const loaded = loadTreeSitterModules();
|
|
10
10
|
const parserByLanguage = new Map();
|
|
11
11
|
cachedRuntime = {
|
|
12
12
|
parse(source, language) {
|
|
@@ -26,13 +26,14 @@ function getOrCreateParser(language, loaded, parserByLanguage) {
|
|
|
26
26
|
parserByLanguage.set(language, parser);
|
|
27
27
|
return parser;
|
|
28
28
|
}
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
const
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
29
|
+
function loadTreeSitterModules() {
|
|
30
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
31
|
+
const nodeRequire = require;
|
|
32
|
+
const [treeSitterModule, javaModule, kotlinModule] = [
|
|
33
|
+
nodeRequire("tree-sitter"),
|
|
34
|
+
nodeRequire("tree-sitter-java"),
|
|
35
|
+
nodeRequire("tree-sitter-kotlin"),
|
|
36
|
+
];
|
|
36
37
|
return {
|
|
37
38
|
parserConstructor: resolveParserConstructor(treeSitterModule),
|
|
38
39
|
languages: {
|
|
@@ -41,10 +42,6 @@ async function loadTreeSitterModules() {
|
|
|
41
42
|
},
|
|
42
43
|
};
|
|
43
44
|
}
|
|
44
|
-
function createDynamicImporter() {
|
|
45
|
-
const importer = new Function("specifier", "return import(specifier);");
|
|
46
|
-
return (specifier) => importer(specifier);
|
|
47
|
-
}
|
|
48
45
|
function resolveParserConstructor(moduleValue) {
|
|
49
46
|
if (typeof moduleValue === "function") {
|
|
50
47
|
return moduleValue;
|
|
@@ -11,7 +11,7 @@ async function loadTreeSitterRuntime() {
|
|
|
11
11
|
return await runtimeInitPromise;
|
|
12
12
|
}
|
|
13
13
|
runtimeInitPromise = (async () => {
|
|
14
|
-
const loaded =
|
|
14
|
+
const loaded = loadTreeSitterModules();
|
|
15
15
|
const parser = new loaded.parserConstructor();
|
|
16
16
|
parser.setLanguage(loaded.language);
|
|
17
17
|
const runtime = {
|
|
@@ -25,21 +25,18 @@ async function loadTreeSitterRuntime() {
|
|
|
25
25
|
})();
|
|
26
26
|
return await runtimeInitPromise;
|
|
27
27
|
}
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
const
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
28
|
+
function loadTreeSitterModules() {
|
|
29
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
30
|
+
const nodeRequire = require;
|
|
31
|
+
const [treeSitterModule, pythonModule] = [
|
|
32
|
+
nodeRequire("tree-sitter"),
|
|
33
|
+
nodeRequire("tree-sitter-python"),
|
|
34
|
+
];
|
|
34
35
|
return {
|
|
35
36
|
parserConstructor: resolveParserConstructor(treeSitterModule),
|
|
36
37
|
language: resolveGrammar(pythonModule, "tree-sitter-python"),
|
|
37
38
|
};
|
|
38
39
|
}
|
|
39
|
-
function createDynamicImporter() {
|
|
40
|
-
const importer = new Function("specifier", "return import(specifier);");
|
|
41
|
-
return (specifier) => importer(specifier);
|
|
42
|
-
}
|
|
43
40
|
function resolveParserConstructor(moduleValue) {
|
|
44
41
|
if (typeof moduleValue === "function") {
|
|
45
42
|
return moduleValue;
|
|
@@ -12,7 +12,7 @@ async function loadTreeSitterRuntime() {
|
|
|
12
12
|
}
|
|
13
13
|
cachedRuntimePromise = (async () => {
|
|
14
14
|
try {
|
|
15
|
-
const loaded =
|
|
15
|
+
const loaded = loadTreeSitterModules();
|
|
16
16
|
const parser = new loaded.parserConstructor();
|
|
17
17
|
parser.setLanguage(loaded.language);
|
|
18
18
|
const runtime = {
|
|
@@ -29,21 +29,18 @@ async function loadTreeSitterRuntime() {
|
|
|
29
29
|
})();
|
|
30
30
|
return await cachedRuntimePromise;
|
|
31
31
|
}
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
const
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
32
|
+
function loadTreeSitterModules() {
|
|
33
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
34
|
+
const nodeRequire = require;
|
|
35
|
+
const [treeSitterModule, rustModule] = [
|
|
36
|
+
nodeRequire("tree-sitter"),
|
|
37
|
+
nodeRequire("tree-sitter-rust"),
|
|
38
|
+
];
|
|
38
39
|
return {
|
|
39
40
|
parserConstructor: resolveParserConstructor(treeSitterModule),
|
|
40
41
|
language: resolveGrammar(rustModule, "tree-sitter-rust"),
|
|
41
42
|
};
|
|
42
43
|
}
|
|
43
|
-
function createDynamicImporter() {
|
|
44
|
-
const importer = new Function("specifier", "return import(specifier);");
|
|
45
|
-
return (specifier) => importer(specifier);
|
|
46
|
-
}
|
|
47
44
|
function resolveParserConstructor(moduleValue) {
|
|
48
45
|
if (typeof moduleValue === "function") {
|
|
49
46
|
return moduleValue;
|
|
@@ -11,7 +11,7 @@ async function loadTreeSitterRuntime() {
|
|
|
11
11
|
return await cachedRuntimePromise;
|
|
12
12
|
}
|
|
13
13
|
cachedRuntimePromise = (async () => {
|
|
14
|
-
const loaded =
|
|
14
|
+
const loaded = loadTreeSitterModules();
|
|
15
15
|
const parser = new loaded.parserConstructor();
|
|
16
16
|
parser.setLanguage(loaded.language);
|
|
17
17
|
const runtime = {
|
|
@@ -25,21 +25,18 @@ async function loadTreeSitterRuntime() {
|
|
|
25
25
|
})();
|
|
26
26
|
return await cachedRuntimePromise;
|
|
27
27
|
}
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
const
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
28
|
+
function loadTreeSitterModules() {
|
|
29
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
30
|
+
const nodeRequire = require;
|
|
31
|
+
const [treeSitterModule, swiftModule] = [
|
|
32
|
+
nodeRequire("tree-sitter"),
|
|
33
|
+
nodeRequire("tree-sitter-swift"),
|
|
34
|
+
];
|
|
34
35
|
return {
|
|
35
36
|
parserConstructor: resolveParserConstructor(treeSitterModule),
|
|
36
37
|
language: resolveGrammar(swiftModule, "tree-sitter-swift"),
|
|
37
38
|
};
|
|
38
39
|
}
|
|
39
|
-
function createDynamicImporter() {
|
|
40
|
-
const importer = new Function("specifier", "return import(specifier);");
|
|
41
|
-
return (specifier) => importer(specifier);
|
|
42
|
-
}
|
|
43
40
|
function resolveParserConstructor(moduleValue) {
|
|
44
41
|
if (typeof moduleValue === "function") {
|
|
45
42
|
return moduleValue;
|
|
@@ -6,7 +6,7 @@ async function loadTreeSitterRuntime() {
|
|
|
6
6
|
if (cachedRuntime) {
|
|
7
7
|
return cachedRuntime;
|
|
8
8
|
}
|
|
9
|
-
const loaded =
|
|
9
|
+
const loaded = loadTreeSitterModules();
|
|
10
10
|
const parserByLanguage = new Map();
|
|
11
11
|
cachedRuntime = {
|
|
12
12
|
parse(source, language) {
|
|
@@ -27,13 +27,12 @@ function getOrCreateParser(language, loaded, parserByLanguage) {
|
|
|
27
27
|
parserByLanguage.set(language, parser);
|
|
28
28
|
return parser;
|
|
29
29
|
}
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
const
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
]);
|
|
30
|
+
function loadTreeSitterModules() {
|
|
31
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
32
|
+
const nodeRequire = require;
|
|
33
|
+
const treeSitterModule = nodeRequire("tree-sitter");
|
|
34
|
+
const typeScriptModule = nodeRequire("tree-sitter-typescript");
|
|
35
|
+
const javaScriptModule = nodeRequire("tree-sitter-javascript");
|
|
37
36
|
const parserConstructor = resolveParserConstructor(treeSitterModule);
|
|
38
37
|
const typeScriptGrammar = resolveTypeScriptGrammar(typeScriptModule);
|
|
39
38
|
const javaScriptGrammar = resolveJavaScriptGrammar(javaScriptModule);
|
|
@@ -45,10 +44,6 @@ async function loadTreeSitterModules() {
|
|
|
45
44
|
},
|
|
46
45
|
};
|
|
47
46
|
}
|
|
48
|
-
function createDynamicImporter() {
|
|
49
|
-
const importer = new Function("specifier", "return import(specifier);");
|
|
50
|
-
return (specifier) => importer(specifier);
|
|
51
|
-
}
|
|
52
47
|
function resolveParserConstructor(moduleValue) {
|
|
53
48
|
if (typeof moduleValue === "function") {
|
|
54
49
|
return moduleValue;
|
|
@@ -86,6 +81,10 @@ function resolveJavaScriptGrammar(moduleValue) {
|
|
|
86
81
|
if (direct.javascript) {
|
|
87
82
|
return direct.javascript;
|
|
88
83
|
}
|
|
84
|
+
// tree-sitter-javascript exports { name, language, nodeTypeInfo } — pass the whole module
|
|
85
|
+
if (direct.name) {
|
|
86
|
+
return moduleValue;
|
|
87
|
+
}
|
|
89
88
|
if (direct.default && typeof direct.default === "object" && "javascript" in direct.default) {
|
|
90
89
|
return direct.default.javascript;
|
|
91
90
|
}
|
|
@@ -93,5 +92,5 @@ function resolveJavaScriptGrammar(moduleValue) {
|
|
|
93
92
|
return direct.default;
|
|
94
93
|
}
|
|
95
94
|
}
|
|
96
|
-
throw new Error("Unable to resolve
|
|
95
|
+
throw new Error("Unable to resolve tree-sitter-javascript grammar.");
|
|
97
96
|
}
|
|
@@ -6,6 +6,7 @@ const node_fs_1 = require("node:fs");
|
|
|
6
6
|
const node_path_1 = require("node:path");
|
|
7
7
|
const commander_1 = require("commander");
|
|
8
8
|
const ingest_js_1 = require("./ingest.js");
|
|
9
|
+
const review_js_1 = require("./review.js");
|
|
9
10
|
const migrate_js_1 = require("./migrate.js");
|
|
10
11
|
const seed_instructions_js_1 = require("./seed-instructions.js");
|
|
11
12
|
const validate_instructions_js_1 = require("./validate-instructions.js");
|
|
@@ -133,6 +134,23 @@ function createDocsCommand(options = {}) {
|
|
|
133
134
|
process.exit(1);
|
|
134
135
|
}
|
|
135
136
|
});
|
|
137
|
+
docs
|
|
138
|
+
.command("review")
|
|
139
|
+
.description("Interactively review pending governance decisions in the review queue")
|
|
140
|
+
.option("--queue <path>", "path to _review-queue.json (default: smartdocs/raw/_review-queue.json)")
|
|
141
|
+
.option("-r, --repo-root <path>", "Repository root", defaultRepoRoot)
|
|
142
|
+
.action(async (opts) => {
|
|
143
|
+
try {
|
|
144
|
+
const queueDir = opts.queue
|
|
145
|
+
? (0, node_path_1.resolve)(opts.repoRoot, opts.queue).replace(/_review-queue\.json$/, "").replace(/\/$/, "")
|
|
146
|
+
: (0, node_path_1.resolve)(opts.repoRoot, "smartdocs", "raw");
|
|
147
|
+
await (0, review_js_1.runReviewSession)({ repoRoot: opts.repoRoot, queueDir });
|
|
148
|
+
}
|
|
149
|
+
catch (err) {
|
|
150
|
+
console.error(`polaris docs review: ${err instanceof Error ? err.message : String(err)}`);
|
|
151
|
+
process.exit(1);
|
|
152
|
+
}
|
|
153
|
+
});
|
|
136
154
|
docs
|
|
137
155
|
.command("migrate")
|
|
138
156
|
.description("Find scattered markdown files, move them to smartdocs/raw/, and produce an ingest cluster list")
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.filterUndecided = filterUndecided;
|
|
37
|
+
exports.formatPacketCard = formatPacketCard;
|
|
38
|
+
exports.runReviewSession = runReviewSession;
|
|
39
|
+
const node_child_process_1 = require("node:child_process");
|
|
40
|
+
const readline = __importStar(require("node:readline"));
|
|
41
|
+
const node_path_1 = require("node:path");
|
|
42
|
+
const index_js_1 = require("../governance/index.js");
|
|
43
|
+
const ingest_js_1 = require("./ingest.js");
|
|
44
|
+
function filterUndecided(packets) {
|
|
45
|
+
return packets.filter((p) => p.reviewDecision === undefined || p.reviewDecision === "defer");
|
|
46
|
+
}
|
|
47
|
+
function formatPacketCard(packet, index, total) {
|
|
48
|
+
const divider = "─".repeat(65);
|
|
49
|
+
return [
|
|
50
|
+
divider,
|
|
51
|
+
`[${index}/${total}] ${packet.sourcePath}`,
|
|
52
|
+
` → ${packet.proposedDestination}`,
|
|
53
|
+
` Authority risk: ${packet.authorityRisk.toUpperCase()}`,
|
|
54
|
+
` Recommendation: ${packet.recommendation}`,
|
|
55
|
+
``,
|
|
56
|
+
`[a]pprove [r]eject [d]efer [s]kip [q]uit`,
|
|
57
|
+
divider,
|
|
58
|
+
].join("\n");
|
|
59
|
+
}
|
|
60
|
+
function defaultGetReviewedBy() {
|
|
61
|
+
try {
|
|
62
|
+
return (0, node_child_process_1.execSync)("git config user.name", { encoding: "utf-8" }).trim() || "unknown";
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
return "unknown";
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
function readSingleKey() {
|
|
69
|
+
return new Promise((resolve) => {
|
|
70
|
+
readline.emitKeypressEvents(process.stdin);
|
|
71
|
+
if (process.stdin.isTTY)
|
|
72
|
+
process.stdin.setRawMode(true);
|
|
73
|
+
const handler = (_str, key) => {
|
|
74
|
+
if (process.stdin.isTTY)
|
|
75
|
+
process.stdin.setRawMode(false);
|
|
76
|
+
process.stdin.removeListener("keypress", handler);
|
|
77
|
+
if (key?.ctrl && key.name === "c")
|
|
78
|
+
process.exit(0);
|
|
79
|
+
resolve(key?.name ?? _str ?? "");
|
|
80
|
+
};
|
|
81
|
+
process.stdin.on("keypress", handler);
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
async function runReviewSession(options) {
|
|
85
|
+
const { repoRoot, readKey, getReviewedBy = defaultGetReviewedBy, output = (msg) => process.stdout.write(msg + "\n"), } = options;
|
|
86
|
+
const queueDir = options.queueDir ?? (0, node_path_1.resolve)(repoRoot, "smartdocs", "raw");
|
|
87
|
+
const packets = (0, index_js_1.readReviewQueue)(queueDir);
|
|
88
|
+
if (packets.length === 0) {
|
|
89
|
+
output("No review queue found. Run polaris docs ingest first.");
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
const undecided = filterUndecided(packets);
|
|
93
|
+
if (undecided.length === 0) {
|
|
94
|
+
output("Nothing to review. All decisions are final — run polaris docs ingest to apply.");
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
let decided = 0;
|
|
98
|
+
for (let i = 0; i < undecided.length; i++) {
|
|
99
|
+
const packet = undecided[i];
|
|
100
|
+
output(formatPacketCard(packet, i + 1, undecided.length));
|
|
101
|
+
const key = readKey ? await readKey() : await readSingleKey();
|
|
102
|
+
if (key === "q") {
|
|
103
|
+
const remaining = undecided.length - decided;
|
|
104
|
+
output(`\nSession ended. ${decided} decision(s) saved, ${remaining} packet(s) still pending.`);
|
|
105
|
+
output("Run polaris docs review to continue.");
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
if (key === "s") {
|
|
109
|
+
continue;
|
|
110
|
+
}
|
|
111
|
+
const decision = key === "a" ? "approve" :
|
|
112
|
+
key === "r" ? "reject" :
|
|
113
|
+
key === "d" ? "defer" :
|
|
114
|
+
null;
|
|
115
|
+
if (!decision) {
|
|
116
|
+
output("Unrecognized key. Use [a], [r], [d], [s], or [q].");
|
|
117
|
+
i--;
|
|
118
|
+
continue;
|
|
119
|
+
}
|
|
120
|
+
const idx = packets.findIndex((p) => p.sourcePath === packet.sourcePath);
|
|
121
|
+
if (idx !== -1) {
|
|
122
|
+
packets[idx] = {
|
|
123
|
+
...packets[idx],
|
|
124
|
+
reviewDecision: decision,
|
|
125
|
+
reviewedAt: new Date().toISOString(),
|
|
126
|
+
reviewedBy: getReviewedBy(),
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
(0, index_js_1.writeReviewQueue)(packets, "review-session", queueDir);
|
|
130
|
+
decided++;
|
|
131
|
+
}
|
|
132
|
+
const approved = packets.filter((p) => p.reviewDecision === "approve").length;
|
|
133
|
+
const rejected = packets.filter((p) => p.reviewDecision === "reject").length;
|
|
134
|
+
const deferred = packets.filter((p) => p.reviewDecision === "defer").length;
|
|
135
|
+
output(`\nReview complete: ${approved} approved, ${rejected} rejected, ${deferred} deferred.`);
|
|
136
|
+
const pendingFiles = packets
|
|
137
|
+
.filter((p) => p.reviewDecision === "approve" || p.reviewDecision === "reject")
|
|
138
|
+
.map((p) => p.sourcePath);
|
|
139
|
+
if (pendingFiles.length > 0) {
|
|
140
|
+
output("Running docs ingest to apply decisions...");
|
|
141
|
+
try {
|
|
142
|
+
const results = (0, ingest_js_1.ingestDocs)(pendingFiles, { repoRoot });
|
|
143
|
+
(0, ingest_js_1.printIngestResults)(results);
|
|
144
|
+
}
|
|
145
|
+
catch (err) {
|
|
146
|
+
output(`Ingest error: ${err instanceof Error ? err.message : String(err)}`);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lsctech/polaris",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.2",
|
|
4
4
|
"description": "Polaris — standalone taskchain orchestration framework for governed AI agent workflows",
|
|
5
5
|
"bin": {
|
|
6
6
|
"polaris-cli": "dist/cli/index.js"
|
|
@@ -54,6 +54,17 @@
|
|
|
54
54
|
"@modelcontextprotocol/sdk": "^1.29.0",
|
|
55
55
|
"commander": "^12.0.0",
|
|
56
56
|
"ignore": "^6.0.2",
|
|
57
|
+
"tree-sitter": "^0.22.0",
|
|
58
|
+
"tree-sitter-c": "^0.24.1",
|
|
59
|
+
"tree-sitter-c-sharp": "^0.23.5",
|
|
60
|
+
"tree-sitter-cpp": "^0.23.4",
|
|
61
|
+
"tree-sitter-dart": "^1.0.0",
|
|
62
|
+
"tree-sitter-go": "^0.25.0",
|
|
63
|
+
"tree-sitter-javascript": "^0.23.1",
|
|
64
|
+
"tree-sitter-python": "^0.23.6",
|
|
65
|
+
"tree-sitter-rust": "^0.24.0",
|
|
66
|
+
"tree-sitter-swift": "^0.7.1",
|
|
67
|
+
"tree-sitter-typescript": "^0.23.2",
|
|
57
68
|
"zod": "^3.23.8"
|
|
58
69
|
},
|
|
59
70
|
"devDependencies": {
|