@danielblomma/cortex-mcp 2.0.16 → 2.0.19
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 +6 -4
- package/bin/cortex.mjs +75 -10
- package/package.json +2 -1
- package/scaffold/.context/config.yaml +2 -3
- package/scaffold/.githooks/_cortex-update-runner.sh +2 -2
- package/scaffold/mcp/package-lock.json +59 -60
- package/scaffold/mcp/package.json +2 -2
- package/scaffold/mcp/src/cli/stage.ts +15 -18
- package/scaffold/mcp/src/core/validators/builtins.ts +24 -4
- package/scaffold/mcp/src/core/workflow/index.ts +1 -0
- package/scaffold/mcp/src/core/workflow/mcp-tools.ts +15 -25
- package/scaffold/mcp/src/core/workflow/resolution.ts +113 -0
- package/scaffold/mcp/src/embeddings.ts +1 -1
- package/scaffold/mcp/src/enterprise/index.ts +16 -1
- package/scaffold/mcp/src/enterprise/reviews/policy-selection.ts +65 -0
- package/scaffold/mcp/src/enterprise/reviews/push.ts +55 -4
- package/scaffold/mcp/src/enterprise/reviews/trust-state.ts +305 -0
- package/scaffold/mcp/src/enterprise/tools/enterprise.ts +40 -47
- package/scaffold/mcp/src/enterprise/tools/harness.ts +2 -0
- package/scaffold/mcp/src/enterprise/workflow/state.ts +21 -0
- package/scaffold/mcp/src/graph.ts +3 -3
- package/scaffold/mcp/tests/enterprise-review-trust.test.mjs +318 -0
- package/scaffold/mcp/tests/fixtures/org-skillz-contract.json +59 -0
- package/scaffold/mcp/tests/fixtures/review-trust-contract.json +111 -0
- package/scaffold/mcp/tests/review-policy-selection.test.mjs +85 -0
- package/scaffold/mcp/tests/review-trust-contract.test.mjs +167 -0
- package/scaffold/mcp/tests/review-validator-source.test.mjs +52 -0
- package/scaffold/mcp/tests/skill-sync-checker.test.mjs +277 -0
- package/scaffold/mcp/tests/workflow-cli.test.mjs +102 -1
- package/scaffold/mcp/tests/workflow-mcp-tools.test.mjs +22 -0
- package/scaffold/mcp/tests/workflow-synced-registry.test.mjs +56 -0
- package/scaffold/scripts/bootstrap.sh +9 -8
- package/scaffold/scripts/context.sh +1 -1
- package/scaffold/scripts/dashboard.mjs +3 -1
- package/scaffold/scripts/dashboard.sh +1 -1
- package/scaffold/scripts/doctor.sh +2 -1
- package/scaffold/scripts/embed.sh +2 -1
- package/scaffold/scripts/ingest.mjs +3 -1
- package/scaffold/scripts/ingest.sh +3 -2
- package/scaffold/scripts/install-git-hooks.sh +2 -1
- package/scaffold/scripts/load-kuzu.sh +2 -2
- package/scaffold/scripts/load-ryu.sh +2 -1
- package/scaffold/scripts/memory-compile.mjs +2 -2
- package/scaffold/scripts/memory-compile.sh +3 -2
- package/scaffold/scripts/memory-lint.mjs +2 -2
- package/scaffold/scripts/memory-lint.sh +3 -2
- package/scaffold/scripts/parsers/node_modules/.package-lock.json +0 -1
- package/scaffold/scripts/parsers/package-lock.json +0 -1
- package/scaffold/scripts/refresh.sh +2 -2
- package/scaffold/scripts/status.sh +6 -5
- package/scaffold/scripts/update-context.sh +5 -5
- package/scaffold/scripts/watch.sh +7 -8
|
@@ -8,6 +8,7 @@ import {
|
|
|
8
8
|
loadSyncedWorkflows,
|
|
9
9
|
syncedWorkflowsCachePath,
|
|
10
10
|
} from "../dist/core/workflow/synced-registry.js";
|
|
11
|
+
import { resolveWorkflowDefinition } from "../dist/core/workflow/resolution.js";
|
|
11
12
|
import { runWorkflowStart } from "../dist/core/workflow/mcp-tools.js";
|
|
12
13
|
import { SECURE_BUILD_WORKFLOW } from "../dist/core/workflow/default-workflows.js";
|
|
13
14
|
|
|
@@ -173,6 +174,61 @@ test("resolveWorkflow integration: synced cache adds new workflow_ids beyond def
|
|
|
173
174
|
);
|
|
174
175
|
assert.equal(result.state.workflow_id, "tiny");
|
|
175
176
|
assert.equal(result.state.current_stage, "plan");
|
|
177
|
+
assert.equal(result.workflow_source, "synced");
|
|
178
|
+
} finally {
|
|
179
|
+
delete process.env.HOME;
|
|
180
|
+
}
|
|
181
|
+
});
|
|
182
|
+
|
|
183
|
+
test("resolveWorkflowDefinition: includes bundled fallback warning when synced cache lacks the requested id", () => {
|
|
184
|
+
const fakeHome = makeWorkspace();
|
|
185
|
+
process.env.HOME = fakeHome;
|
|
186
|
+
try {
|
|
187
|
+
const resolved = resolveWorkflowDefinition("secure-build", {
|
|
188
|
+
emitBundledFallbackWarning: true,
|
|
189
|
+
});
|
|
190
|
+
assert.equal(resolved.source, "bundled");
|
|
191
|
+
assert.equal(resolved.warnings.length, 1);
|
|
192
|
+
assert.match(resolved.warnings[0].message, /bundled registry/);
|
|
193
|
+
} finally {
|
|
194
|
+
delete process.env.HOME;
|
|
195
|
+
}
|
|
196
|
+
});
|
|
197
|
+
|
|
198
|
+
test("resolveWorkflowDefinition: can block bundled fallback when synced workflows are required", () => {
|
|
199
|
+
const fakeHome = makeWorkspace();
|
|
200
|
+
process.env.HOME = fakeHome;
|
|
201
|
+
try {
|
|
202
|
+
assert.throws(
|
|
203
|
+
() =>
|
|
204
|
+
resolveWorkflowDefinition("secure-build", {
|
|
205
|
+
bundledFallbackPolicy: "block",
|
|
206
|
+
}),
|
|
207
|
+
/requires a synced org workflow/,
|
|
208
|
+
);
|
|
209
|
+
} finally {
|
|
210
|
+
delete process.env.HOME;
|
|
211
|
+
}
|
|
212
|
+
});
|
|
213
|
+
|
|
214
|
+
test("resolveWorkflowDefinition: unknown workflow errors list bundled and synced ids", () => {
|
|
215
|
+
const fakeHome = makeWorkspace();
|
|
216
|
+
process.env.HOME = fakeHome;
|
|
217
|
+
try {
|
|
218
|
+
writeCache(path.join(fakeHome, ".cortex"), {
|
|
219
|
+
workflows: {
|
|
220
|
+
tiny: {
|
|
221
|
+
workflow_id: "tiny",
|
|
222
|
+
version: 1,
|
|
223
|
+
updated_at: "2026-05-06T12:00:00.000Z",
|
|
224
|
+
definition: TINY_WORKFLOW,
|
|
225
|
+
},
|
|
226
|
+
},
|
|
227
|
+
});
|
|
228
|
+
assert.throws(
|
|
229
|
+
() => resolveWorkflowDefinition("missing-workflow"),
|
|
230
|
+
/Available bundled: secure-build\. Available synced: tiny\./,
|
|
231
|
+
);
|
|
176
232
|
} finally {
|
|
177
233
|
delete process.env.HOME;
|
|
178
234
|
}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
#!/usr/bin/env bash
|
|
2
2
|
set -euo pipefail
|
|
3
3
|
|
|
4
|
-
|
|
4
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
5
|
+
REPO_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
|
|
5
6
|
MCP_DIR="$REPO_ROOT/.context/mcp"
|
|
6
7
|
TOTAL_STEPS=6
|
|
7
8
|
STEP_INDEX=0
|
|
@@ -25,24 +26,24 @@ mkdir -p "$MCP_DIR/.npm-cache"
|
|
|
25
26
|
step "Installing MCP dependencies"
|
|
26
27
|
info "note: upstream RyuGraph dependencies may print deprecation warnings during install"
|
|
27
28
|
NPM_CONFIG_CACHE="$MCP_DIR/.npm-cache" npm --prefix "$MCP_DIR" install --no-fund --no-update-notifier --loglevel=warn
|
|
28
|
-
NPM_CONFIG_CACHE="$REPO_ROOT/scripts/parsers/.npm-cache" npm --prefix "$REPO_ROOT/scripts/parsers" install --no-fund --no-update-notifier --loglevel=warn
|
|
29
|
+
NPM_CONFIG_CACHE="$REPO_ROOT/.context/scripts/parsers/.npm-cache" npm --prefix "$REPO_ROOT/.context/scripts/parsers" install --no-fund --no-update-notifier --loglevel=warn
|
|
29
30
|
|
|
30
|
-
source "$
|
|
31
|
+
source "$SCRIPT_DIR/lib/enterprise-check.sh"
|
|
31
32
|
|
|
32
33
|
step "Indexing repository context"
|
|
33
|
-
"$
|
|
34
|
+
"$SCRIPT_DIR/ingest.sh"
|
|
34
35
|
|
|
35
36
|
step "Generating semantic embeddings"
|
|
36
|
-
if ! "$
|
|
37
|
+
if ! "$SCRIPT_DIR/embed.sh"; then
|
|
37
38
|
info "warning: embedding generation failed; continuing with lexical search fallback"
|
|
38
39
|
fi
|
|
39
40
|
|
|
40
41
|
step "Loading RyuGraph"
|
|
41
|
-
"$
|
|
42
|
+
"$SCRIPT_DIR/load-ryu.sh"
|
|
42
43
|
|
|
43
44
|
step "Reading context status"
|
|
44
|
-
"$
|
|
45
|
+
"$SCRIPT_DIR/status.sh"
|
|
45
46
|
|
|
46
47
|
echo ""
|
|
47
48
|
info "bootstrap complete"
|
|
48
|
-
info "next: run
|
|
49
|
+
info "next: run cortex update while coding"
|
|
@@ -6,7 +6,9 @@ import { execSync } from "node:child_process";
|
|
|
6
6
|
|
|
7
7
|
const __filename = fileURLToPath(import.meta.url);
|
|
8
8
|
const __dirname = path.dirname(__filename);
|
|
9
|
-
const REPO_ROOT =
|
|
9
|
+
const REPO_ROOT = process.env.CORTEX_PROJECT_ROOT
|
|
10
|
+
? path.resolve(process.env.CORTEX_PROJECT_ROOT)
|
|
11
|
+
: path.resolve(__dirname, "..", "..");
|
|
10
12
|
const CONTEXT_DIR = path.join(REPO_ROOT, ".context");
|
|
11
13
|
const CACHE_DIR = path.join(CONTEXT_DIR, "cache");
|
|
12
14
|
const CONFIG_PATH = path.join(CONTEXT_DIR, "config.yaml");
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env bash
|
|
2
2
|
set -euo pipefail
|
|
3
3
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
4
|
-
REPO_ROOT="$(cd "$SCRIPT_DIR
|
|
4
|
+
REPO_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
|
|
5
5
|
MANIFEST="$REPO_ROOT/.context/cache/manifest.json"
|
|
6
6
|
|
|
7
7
|
if [[ ! -f "$MANIFEST" ]]; then
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
#!/usr/bin/env bash
|
|
2
2
|
set -euo pipefail
|
|
3
3
|
|
|
4
|
-
|
|
4
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
5
|
+
REPO_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
|
|
5
6
|
CONTEXT_DIR="$REPO_ROOT/.context"
|
|
6
7
|
MCP_DIR="$CONTEXT_DIR/mcp"
|
|
7
8
|
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
#!/usr/bin/env bash
|
|
2
2
|
set -euo pipefail
|
|
3
3
|
|
|
4
|
-
|
|
4
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
5
|
+
REPO_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
|
|
5
6
|
MCP_DIR="$REPO_ROOT/.context/mcp"
|
|
6
7
|
|
|
7
8
|
if ! command -v npm >/dev/null 2>&1; then
|
|
@@ -91,7 +91,9 @@ async function loadOptionalParsers() {
|
|
|
91
91
|
|
|
92
92
|
const __filename = fileURLToPath(import.meta.url);
|
|
93
93
|
const __dirname = path.dirname(__filename);
|
|
94
|
-
const REPO_ROOT =
|
|
94
|
+
const REPO_ROOT = process.env.CORTEX_PROJECT_ROOT
|
|
95
|
+
? path.resolve(process.env.CORTEX_PROJECT_ROOT)
|
|
96
|
+
: path.resolve(__dirname, "..", "..");
|
|
95
97
|
const CONTEXT_DIR = path.join(REPO_ROOT, ".context");
|
|
96
98
|
const CACHE_DIR = path.join(CONTEXT_DIR, "cache");
|
|
97
99
|
const DB_IMPORT_DIR = path.join(CONTEXT_DIR, "db", "import");
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
#!/usr/bin/env bash
|
|
2
2
|
set -euo pipefail
|
|
3
3
|
|
|
4
|
-
|
|
4
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
5
|
+
REPO_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
|
|
5
6
|
CONTEXT_DIR="$REPO_ROOT/.context"
|
|
6
7
|
|
|
7
8
|
printf "[ingest] repo: %s\n" "$REPO_ROOT"
|
|
@@ -17,4 +18,4 @@ if ! command -v node >/dev/null 2>&1; then
|
|
|
17
18
|
exit 1
|
|
18
19
|
fi
|
|
19
20
|
|
|
20
|
-
node "$
|
|
21
|
+
node "$SCRIPT_DIR/ingest.mjs" "$@"
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
#!/usr/bin/env bash
|
|
2
2
|
set -euo pipefail
|
|
3
3
|
|
|
4
|
-
|
|
4
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
5
|
+
REPO_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
|
|
5
6
|
HOOKS_DIR="$REPO_ROOT/.githooks"
|
|
6
7
|
|
|
7
8
|
if [[ ! -d "$HOOKS_DIR" ]]; then
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env bash
|
|
2
2
|
set -euo pipefail
|
|
3
3
|
|
|
4
|
-
|
|
4
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
5
5
|
echo "[graph-load] warning: load-kuzu.sh is deprecated; using RyuGraph loader"
|
|
6
|
-
"$
|
|
6
|
+
"$SCRIPT_DIR/load-ryu.sh" "$@"
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
#!/usr/bin/env bash
|
|
2
2
|
set -euo pipefail
|
|
3
3
|
|
|
4
|
-
|
|
4
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
5
|
+
REPO_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
|
|
5
6
|
MCP_DIR="$REPO_ROOT/.context/mcp"
|
|
6
7
|
|
|
7
8
|
if [[ ! -f "$MCP_DIR/package.json" ]]; then
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import fs from "node:fs";
|
|
3
3
|
import path from "node:path";
|
|
4
4
|
import { fileURLToPath } from "node:url";
|
|
5
|
-
import { parseFrontmatter, parseStringList } from "
|
|
5
|
+
import { parseFrontmatter, parseStringList } from "../mcp/dist/frontmatter.js";
|
|
6
6
|
|
|
7
7
|
const __filename = fileURLToPath(import.meta.url);
|
|
8
8
|
const __dirname = path.dirname(__filename);
|
|
@@ -17,7 +17,7 @@ function normalizeForWsl(rawPath) {
|
|
|
17
17
|
|
|
18
18
|
const REPO_ROOT = process.env.CORTEX_PROJECT_ROOT
|
|
19
19
|
? path.resolve(normalizeForWsl(process.env.CORTEX_PROJECT_ROOT))
|
|
20
|
-
: path.resolve(__dirname, "..");
|
|
20
|
+
: path.resolve(__dirname, "..", "..");
|
|
21
21
|
const CONTEXT_DIR = path.join(REPO_ROOT, ".context");
|
|
22
22
|
const MEMORY_DIR = path.join(CONTEXT_DIR, "memory");
|
|
23
23
|
const RAW_DIR = path.join(MEMORY_DIR, "raw");
|
|
@@ -2,7 +2,8 @@
|
|
|
2
2
|
# Keep in sync with scripts/memory-compile.sh
|
|
3
3
|
set -euo pipefail
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
6
|
+
REPO_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
|
|
6
7
|
CONTEXT_DIR="$REPO_ROOT/.context"
|
|
7
8
|
|
|
8
9
|
printf "[memory-compile] repo: %s\n" "$REPO_ROOT"
|
|
@@ -17,4 +18,4 @@ if ! command -v node >/dev/null 2>&1; then
|
|
|
17
18
|
exit 1
|
|
18
19
|
fi
|
|
19
20
|
|
|
20
|
-
node "$
|
|
21
|
+
CORTEX_PROJECT_ROOT="$REPO_ROOT" node "$SCRIPT_DIR/memory-compile.mjs" "$@"
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import fs from "node:fs";
|
|
3
3
|
import path from "node:path";
|
|
4
4
|
import { fileURLToPath } from "node:url";
|
|
5
|
-
import { parseFrontmatter, parseStringList } from "
|
|
5
|
+
import { parseFrontmatter, parseStringList } from "../mcp/dist/frontmatter.js";
|
|
6
6
|
|
|
7
7
|
const __filename = fileURLToPath(import.meta.url);
|
|
8
8
|
const __dirname = path.dirname(__filename);
|
|
@@ -17,7 +17,7 @@ function normalizeForWsl(rawPath) {
|
|
|
17
17
|
|
|
18
18
|
const REPO_ROOT = process.env.CORTEX_PROJECT_ROOT
|
|
19
19
|
? path.resolve(normalizeForWsl(process.env.CORTEX_PROJECT_ROOT))
|
|
20
|
-
: path.resolve(__dirname, "..");
|
|
20
|
+
: path.resolve(__dirname, "..", "..");
|
|
21
21
|
const CONTEXT_DIR = path.join(REPO_ROOT, ".context");
|
|
22
22
|
const MEMORY_DIR = path.join(CONTEXT_DIR, "memory");
|
|
23
23
|
const COMPILED_DIR = path.join(MEMORY_DIR, "compiled");
|
|
@@ -2,7 +2,8 @@
|
|
|
2
2
|
# Keep in sync with scripts/memory-lint.sh
|
|
3
3
|
set -euo pipefail
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
6
|
+
REPO_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
|
|
6
7
|
CONTEXT_DIR="$REPO_ROOT/.context"
|
|
7
8
|
|
|
8
9
|
printf "[memory-lint] repo: %s\n" "$REPO_ROOT"
|
|
@@ -17,4 +18,4 @@ if ! command -v node >/dev/null 2>&1; then
|
|
|
17
18
|
exit 1
|
|
18
19
|
fi
|
|
19
20
|
|
|
20
|
-
node "$
|
|
21
|
+
CORTEX_PROJECT_ROOT="$REPO_ROOT" node "$SCRIPT_DIR/memory-lint.mjs" "$@"
|
|
@@ -21,7 +21,6 @@
|
|
|
21
21
|
"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz",
|
|
22
22
|
"integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==",
|
|
23
23
|
"license": "MIT",
|
|
24
|
-
"peer": true,
|
|
25
24
|
"bin": {
|
|
26
25
|
"acorn": "bin/acorn"
|
|
27
26
|
},
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
#!/usr/bin/env bash
|
|
2
2
|
set -euo pipefail
|
|
3
3
|
|
|
4
|
-
|
|
4
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
5
5
|
|
|
6
6
|
echo "[refresh] running ingestion"
|
|
7
|
-
"$
|
|
7
|
+
"$SCRIPT_DIR/ingest.sh" "$@"
|
|
8
8
|
|
|
9
9
|
echo "[refresh] done"
|
|
@@ -1,14 +1,15 @@
|
|
|
1
1
|
#!/usr/bin/env bash
|
|
2
2
|
set -euo pipefail
|
|
3
3
|
|
|
4
|
-
|
|
4
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
5
|
+
REPO_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
|
|
5
6
|
MANIFEST="$REPO_ROOT/.context/cache/manifest.json"
|
|
6
7
|
GRAPH_MANIFEST="$REPO_ROOT/.context/cache/graph-manifest.json"
|
|
7
8
|
EMBED_MANIFEST="$REPO_ROOT/.context/embeddings/manifest.json"
|
|
8
9
|
|
|
9
10
|
if [[ ! -f "$MANIFEST" ]]; then
|
|
10
11
|
echo "[status] No ingest manifest found."
|
|
11
|
-
echo "[status] Run:
|
|
12
|
+
echo "[status] Run: cortex ingest"
|
|
12
13
|
exit 0
|
|
13
14
|
fi
|
|
14
15
|
|
|
@@ -47,7 +48,7 @@ console.log(`[status] graph files=${c.files ?? 0} rules=${c.rules ?? 0} adrs=${c
|
|
|
47
48
|
console.log(`[status] graph rels constrains=${c.constrains ?? 0} implements=${c.implements ?? 0} supersedes=${c.supersedes ?? 0}`);
|
|
48
49
|
' "$GRAPH_MANIFEST"
|
|
49
50
|
else
|
|
50
|
-
echo "[status] graph manifest missing (run:
|
|
51
|
+
echo "[status] graph manifest missing (run: cortex graph-load)"
|
|
51
52
|
fi
|
|
52
53
|
|
|
53
54
|
if [[ -f "$EMBED_MANIFEST" ]]; then
|
|
@@ -68,13 +69,13 @@ if (embedded > 0 && output > 0 && failed === 0) {
|
|
|
68
69
|
} else if (embedded > 0 && output > 0) {
|
|
69
70
|
console.log(`[status] semantic_search=embedding+lexical-partial (failed=${failed})`);
|
|
70
71
|
} else if (entities > 0) {
|
|
71
|
-
console.log("[status] semantic_search=lexical-only (run:
|
|
72
|
+
console.log("[status] semantic_search=lexical-only (run: cortex embed)");
|
|
72
73
|
} else {
|
|
73
74
|
console.log("[status] semantic_search=lexical-only (no indexed entities)");
|
|
74
75
|
}
|
|
75
76
|
' "$EMBED_MANIFEST"
|
|
76
77
|
else
|
|
77
|
-
echo "[status] embeddings manifest missing (run:
|
|
78
|
+
echo "[status] embeddings manifest missing (run: cortex embed)"
|
|
78
79
|
echo "[status] semantic_search=lexical-only (embeddings manifest missing)"
|
|
79
80
|
fi
|
|
80
81
|
|
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
#!/usr/bin/env bash
|
|
2
2
|
set -euo pipefail
|
|
3
3
|
|
|
4
|
-
|
|
4
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
5
5
|
|
|
6
6
|
echo "[update] ingesting changed files"
|
|
7
|
-
"$
|
|
7
|
+
"$SCRIPT_DIR/ingest.sh" --changed
|
|
8
8
|
|
|
9
9
|
echo "[update] embedding changed entities"
|
|
10
|
-
if ! "$
|
|
10
|
+
if ! "$SCRIPT_DIR/embed.sh" --changed; then
|
|
11
11
|
echo "[update] warning: embedding generation failed; continuing with lexical search fallback"
|
|
12
12
|
fi
|
|
13
13
|
|
|
14
14
|
echo "[update] rebuilding graph"
|
|
15
|
-
"$
|
|
15
|
+
"$SCRIPT_DIR/load-ryu.sh"
|
|
16
16
|
|
|
17
17
|
echo "[update] status"
|
|
18
|
-
"$
|
|
18
|
+
"$SCRIPT_DIR/status.sh"
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
#!/usr/bin/env bash
|
|
2
2
|
set -euo pipefail
|
|
3
3
|
|
|
4
|
-
|
|
4
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
5
|
+
REPO_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
|
|
5
6
|
WATCH_DIR="$REPO_ROOT/.context/watch"
|
|
6
7
|
PID_FILE="$WATCH_DIR/watch.pid"
|
|
7
8
|
STAMP_FILE="$WATCH_DIR/last-stamp.sha1"
|
|
@@ -21,7 +22,7 @@ EVENT_BACKEND=""
|
|
|
21
22
|
|
|
22
23
|
print_usage() {
|
|
23
24
|
cat <<'USAGE'
|
|
24
|
-
Usage:
|
|
25
|
+
Usage: cortex watch [start|stop|status|run|once] [--interval <sec>] [--debounce <sec>] [--mode <auto|event|poll>]
|
|
25
26
|
|
|
26
27
|
Commands:
|
|
27
28
|
start Start background watch loop
|
|
@@ -149,8 +150,8 @@ status_digest() {
|
|
|
149
150
|
# .context/ excludes the relocated .context/mcp/ tree as well.
|
|
150
151
|
find "$REPO_ROOT" -type f \
|
|
151
152
|
! -path "$REPO_ROOT/.context/*" \
|
|
152
|
-
! -path "$REPO_ROOT/scripts/parsers/node_modules/*" \
|
|
153
|
-
! -path "$REPO_ROOT/scripts/parsers/.npm-cache/*" \
|
|
153
|
+
! -path "$REPO_ROOT/.context/scripts/parsers/node_modules/*" \
|
|
154
|
+
! -path "$REPO_ROOT/.context/scripts/parsers/.npm-cache/*" \
|
|
154
155
|
-print \
|
|
155
156
|
| LC_ALL=C sort \
|
|
156
157
|
| shasum -a 1 \
|
|
@@ -162,7 +163,7 @@ run_update() {
|
|
|
162
163
|
start_ts="$(date -u +"%Y-%m-%dT%H:%M:%SZ")"
|
|
163
164
|
echo "[watch] update start at $start_ts"
|
|
164
165
|
|
|
165
|
-
if bash "$
|
|
166
|
+
if bash "$SCRIPT_DIR/context.sh" update; then
|
|
166
167
|
echo "[watch] update success"
|
|
167
168
|
return 0
|
|
168
169
|
fi
|
|
@@ -199,15 +200,13 @@ wait_for_change_event() {
|
|
|
199
200
|
inotifywait)
|
|
200
201
|
inotifywait -q -r \
|
|
201
202
|
-e modify,create,delete,move \
|
|
202
|
-
--exclude '(^|/)\\.git(/|$)|(^|/)\\.context(/|$)
|
|
203
|
+
--exclude '(^|/)\\.git(/|$)|(^|/)\\.context(/|$)' \
|
|
203
204
|
"$REPO_ROOT" >/dev/null 2>&1 || true
|
|
204
205
|
;;
|
|
205
206
|
fswatch)
|
|
206
207
|
fswatch -1 -r \
|
|
207
208
|
--exclude '(^|/)\\.git(/|$)' \
|
|
208
209
|
--exclude '(^|/)\\.context(/|$)' \
|
|
209
|
-
--exclude '(^|/)scripts/parsers/node_modules(/|$)' \
|
|
210
|
-
--exclude '(^|/)scripts/parsers/\\.npm-cache(/|$)' \
|
|
211
210
|
"$REPO_ROOT" >/dev/null 2>&1 || true
|
|
212
211
|
;;
|
|
213
212
|
*)
|