xtctx 0.11.1 → 0.11.4
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/CHANGELOG.md +58 -0
- package/dist/src/cli/hook.d.ts.map +1 -1
- package/dist/src/cli/hook.js +25 -14
- package/dist/src/cli/hook.js.map +1 -1
- package/dist/src/cli/index.d.ts.map +1 -1
- package/dist/src/cli/index.js +16 -1
- package/dist/src/cli/index.js.map +1 -1
- package/dist/src/cli/setup.d.ts.map +1 -1
- package/dist/src/cli/setup.js +1 -2
- package/dist/src/cli/setup.js.map +1 -1
- package/dist/src/cli/status.d.ts.map +1 -1
- package/dist/src/cli/status.js +54 -5
- package/dist/src/cli/status.js.map +1 -1
- package/dist/src/config/disconnect.d.ts +2 -0
- package/dist/src/config/disconnect.d.ts.map +1 -1
- package/dist/src/config/disconnect.js +109 -27
- package/dist/src/config/disconnect.js.map +1 -1
- package/dist/src/config/managed-block.d.ts +29 -0
- package/dist/src/config/managed-block.d.ts.map +1 -0
- package/dist/src/config/managed-block.js +67 -0
- package/dist/src/config/managed-block.js.map +1 -0
- package/dist/src/config/mcp-config.d.ts +2 -0
- package/dist/src/config/mcp-config.d.ts.map +1 -1
- package/dist/src/config/mcp-config.js +101 -7
- package/dist/src/config/mcp-config.js.map +1 -1
- package/dist/src/config/setup.d.ts +2 -0
- package/dist/src/config/setup.d.ts.map +1 -1
- package/dist/src/config/setup.js +78 -37
- package/dist/src/config/setup.js.map +1 -1
- package/dist/src/config/skills.d.ts.map +1 -1
- package/dist/src/config/skills.js +4 -4
- package/dist/src/config/skills.js.map +1 -1
- package/dist/src/handoff/embeddings.d.ts +11 -0
- package/dist/src/handoff/embeddings.d.ts.map +1 -1
- package/dist/src/handoff/embeddings.js +74 -5
- package/dist/src/handoff/embeddings.js.map +1 -1
- package/dist/src/handoff/sqlite-index.d.ts +9 -0
- package/dist/src/handoff/sqlite-index.d.ts.map +1 -1
- package/dist/src/handoff/sqlite-index.js +285 -98
- package/dist/src/handoff/sqlite-index.js.map +1 -1
- package/dist/src/handoff/types.d.ts +6 -0
- package/dist/src/handoff/types.d.ts.map +1 -1
- package/dist/src/mcp/server.d.ts +1 -1
- package/dist/src/mcp/server.d.ts.map +1 -1
- package/dist/src/mcp/server.js +17 -8
- package/dist/src/mcp/server.js.map +1 -1
- package/dist/src/mcp/tools/continuity.d.ts +19 -1
- package/dist/src/mcp/tools/continuity.d.ts.map +1 -1
- package/dist/src/mcp/tools/continuity.js +27 -2
- package/dist/src/mcp/tools/continuity.js.map +1 -1
- package/dist/src/mcp/tools/manifest.d.ts.map +1 -1
- package/dist/src/mcp/tools/manifest.js +15 -6
- package/dist/src/mcp/tools/manifest.js.map +1 -1
- package/dist/src/mcp/tools/sessions.d.ts +9 -1
- package/dist/src/mcp/tools/sessions.d.ts.map +1 -1
- package/dist/src/mcp/tools/sessions.js +68 -9
- package/dist/src/mcp/tools/sessions.js.map +1 -1
- package/dist/src/runtime/services.d.ts.map +1 -1
- package/dist/src/runtime/services.js +22 -2
- package/dist/src/runtime/services.js.map +1 -1
- package/dist/src/scrapers/antigravity.d.ts +11 -0
- package/dist/src/scrapers/antigravity.d.ts.map +1 -1
- package/dist/src/scrapers/antigravity.js +47 -36
- package/dist/src/scrapers/antigravity.js.map +1 -1
- package/dist/src/scrapers/base.d.ts.map +1 -1
- package/dist/src/scrapers/base.js +4 -1
- package/dist/src/scrapers/base.js.map +1 -1
- package/dist/src/scrapers/claude-code.d.ts +17 -0
- package/dist/src/scrapers/claude-code.d.ts.map +1 -1
- package/dist/src/scrapers/claude-code.js +115 -59
- package/dist/src/scrapers/claude-code.js.map +1 -1
- package/dist/src/scrapers/codex.d.ts.map +1 -1
- package/dist/src/scrapers/codex.js +166 -153
- package/dist/src/scrapers/codex.js.map +1 -1
- package/dist/src/scrapers/copilot-cli.d.ts +2 -1
- package/dist/src/scrapers/copilot-cli.d.ts.map +1 -1
- package/dist/src/scrapers/copilot-cli.js +88 -3
- package/dist/src/scrapers/copilot-cli.js.map +1 -1
- package/dist/src/scrapers/cursor.d.ts.map +1 -1
- package/dist/src/scrapers/cursor.js +20 -9
- package/dist/src/scrapers/cursor.js.map +1 -1
- package/dist/src/scrapers/index.d.ts +7 -2
- package/dist/src/scrapers/index.d.ts.map +1 -1
- package/dist/src/scrapers/index.js +7 -2
- package/dist/src/scrapers/index.js.map +1 -1
- package/dist/src/scrapers/opencode.d.ts +2 -1
- package/dist/src/scrapers/opencode.d.ts.map +1 -1
- package/dist/src/scrapers/opencode.js +38 -9
- package/dist/src/scrapers/opencode.js.map +1 -1
- package/dist/src/tools/sources.d.ts.map +1 -1
- package/dist/src/tools/sources.js +2 -2
- package/dist/src/tools/sources.js.map +1 -1
- package/dist/src/utils/atomic-file.d.ts +8 -0
- package/dist/src/utils/atomic-file.d.ts.map +1 -0
- package/dist/src/utils/atomic-file.js +15 -0
- package/dist/src/utils/atomic-file.js.map +1 -0
- package/dist/src/utils/errors.d.ts +5 -0
- package/dist/src/utils/errors.d.ts.map +1 -1
- package/dist/src/utils/errors.js +9 -0
- package/dist/src/utils/errors.js.map +1 -1
- package/dist/src/utils/project-scope.d.ts +16 -0
- package/dist/src/utils/project-scope.d.ts.map +1 -1
- package/dist/src/utils/project-scope.js +18 -2
- package/dist/src/utils/project-scope.js.map +1 -1
- package/package.json +3 -3
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,64 @@ All notable changes to this project are documented in this file.
|
|
|
5
5
|
The format is based on Keep a Changelog, and this project follows Semantic Versioning.
|
|
6
6
|
This file is maintained automatically by Release Please.
|
|
7
7
|
|
|
8
|
+
## [0.11.4](https://github.com/fstubner/xtctx/compare/xtctx-v0.11.3...xtctx-v0.11.4) (2026-08-20)
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
### Bug Fixes
|
|
12
|
+
|
|
13
|
+
* **ci:** smoke the published package outside the repo checkout ([93a5df6](https://github.com/fstubner/xtctx/commit/93a5df6037ff8192d3ad215381d2203f9a529cf8))
|
|
14
|
+
* **ci:** smoke the published package outside the repo checkout ([9843937](https://github.com/fstubner/xtctx/commit/98439370170a85bb1d8f1924a2b321b2d4739fa1))
|
|
15
|
+
|
|
16
|
+
## [0.11.3](https://github.com/fstubner/xtctx/compare/xtctx-v0.11.2...xtctx-v0.11.3) (2026-08-20)
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
### Bug Fixes
|
|
20
|
+
|
|
21
|
+
* **ci:** enable auto-merge with the PAT so the release chain continues ([a057317](https://github.com/fstubner/xtctx/commit/a057317a9ecb4a7f6435989b13b328fdc9c35480))
|
|
22
|
+
* **demo:** keep embedding verification in-process, not through the spawned server ([4cc2365](https://github.com/fstubner/xtctx/commit/4cc236510e351aa5b12a7ccbe62f521f2ebecd14))
|
|
23
|
+
* **demo:** use the real path encoder instead of a drifted copy ([b261f60](https://github.com/fstubner/xtctx/commit/b261f609ca82559408a096b860c7fe8b5719c1d5))
|
|
24
|
+
* **runtime:** resolve the project root through symlinks ([8d48637](https://github.com/fstubner/xtctx/commit/8d486376a2509c2070482b6da5bf722bfb8cf132))
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
### Tests
|
|
28
|
+
|
|
29
|
+
* canonicalise temp roots and raise the suite timeout for CI runners ([eb9def3](https://github.com/fstubner/xtctx/commit/eb9def3446d90016441d5096efb5b346299074fe))
|
|
30
|
+
|
|
31
|
+
## [0.11.2](https://github.com/fstubner/xtctx/compare/xtctx-v0.11.1...xtctx-v0.11.2) (2026-08-19)
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
### Bug Fixes
|
|
35
|
+
|
|
36
|
+
* **antigravity:** attribute conversations by path, never by project name ([9ba1ac7](https://github.com/fstubner/xtctx/commit/9ba1ac782c7c25caaaee4466c4f1bf65edee4ab6))
|
|
37
|
+
* **antigravity:** match the listening PID exactly and complete the barrel exports ([b9c3ad5](https://github.com/fstubner/xtctx/commit/b9c3ad5daea2cf370b1d425f02e851a2ec392a34))
|
|
38
|
+
* **ci:** check RELEASE_PLEASE_TOKEN in run, not in a step-level if ([ec736b7](https://github.com/fstubner/xtctx/commit/ec736b7cbd6f958c7910a0f9c3dcd69bae784541))
|
|
39
|
+
* **ci:** repair the release-please token guard ([52f6a73](https://github.com/fstubner/xtctx/commit/52f6a739f5211901fd6b398f155d68e3a61a7838))
|
|
40
|
+
* **cli:** fail open in the session hook and release the index handle ([b536cf1](https://github.com/fstubner/xtctx/commit/b536cf1fcb0cad74403ba6f55a3a38135a57467f))
|
|
41
|
+
* **config:** preserve line endings on disconnect and stop leaving litter ([6f800d2](https://github.com/fstubner/xtctx/commit/6f800d2dce99aa2413fb9ec8939979cc789c32b9))
|
|
42
|
+
* **config:** report disconnect accurately and remove the stubs it leaves ([9dfab9b](https://github.com/fstubner/xtctx/commit/9dfab9b4fbdb92fc2c628e7b555c75320f70ebfc))
|
|
43
|
+
* **config:** write other tools' config files safely ([6f48086](https://github.com/fstubner/xtctx/commit/6f480866fb79020cb1034709202b7d76f4779b13))
|
|
44
|
+
* **deps:** bump transitive postcss out of the path-traversal advisories ([51e3d58](https://github.com/fstubner/xtctx/commit/51e3d580bf6f9bc0fe76a60fe1c2019ff9feab3e))
|
|
45
|
+
* **handoff:** make the index crash-safe, correct, and cheap to refresh ([269fefb](https://github.com/fstubner/xtctx/commit/269fefbaa3a8b1cb491175fc2b2c69cea292c1f3))
|
|
46
|
+
* **handoff:** repair the embedding pipeline and stop it failing silently ([6ee6255](https://github.com/fstubner/xtctx/commit/6ee62551d55f2fd91af8a23282a52c380e3060f1))
|
|
47
|
+
* **handoff:** require real evidence for a semantic match ([7c4bf8b](https://github.com/fstubner/xtctx/commit/7c4bf8b8fd8379a3e75fd7b484437b89a70571d9))
|
|
48
|
+
* **handoff:** reset cursors whenever the index is empty, and stop indexing scaffolding ([0a1aa76](https://github.com/fstubner/xtctx/commit/0a1aa768dabb077f6ab898cf8627b8974de88d6e))
|
|
49
|
+
* **landing:** upgrade Astro to 7 and pin the published version ([73a20e9](https://github.com/fstubner/xtctx/commit/73a20e973f70ca8398a0ac967e0f32525a405c5a))
|
|
50
|
+
* **mcp:** fence untrusted transcript content and validate tool arguments ([a662805](https://github.com/fstubner/xtctx/commit/a662805bf65a521aac992233ea35aafbda202007))
|
|
51
|
+
* **mcp:** keep session previews from forging response structure ([799d7ff](https://github.com/fstubner/xtctx/commit/799d7ff1ba5c4417550350cbb810de9fe77f5c3c))
|
|
52
|
+
* **mcp:** redact paths in reported errors and always end status with a next step ([626e2bf](https://github.com/fstubner/xtctx/commit/626e2bf8f6837414b8ebd817bfa8513583d10367))
|
|
53
|
+
* **opencode:** report a corrupt store instead of an empty one ([83d8872](https://github.com/fstubner/xtctx/commit/83d88721857e1b47c3724b73b950df0e438ddb87))
|
|
54
|
+
* remediate the full-product audit findings ([5198690](https://github.com/fstubner/xtctx/commit/5198690a425399b94d6cd234e3b8ffa87e79c38c))
|
|
55
|
+
* **scrapers:** attribute Claude Code sessions by cwd, not by encoded name ([9b5a6ad](https://github.com/fstubner/xtctx/commit/9b5a6ada818464f28532677fb94e0e2a8f0fa400))
|
|
56
|
+
* **scrapers:** contain read errors and stabilise chunk identity ([31f5ecb](https://github.com/fstubner/xtctx/commit/31f5ecb9c0d7ff8bb4dec766c286ec315210690d))
|
|
57
|
+
* **scrapers:** parse current Copilot CLI events and scope sessions to the project ([6a387f8](https://github.com/fstubner/xtctx/commit/6a387f80679bec1ca5e472b98953bcdec82deaa5))
|
|
58
|
+
* stop reporting false drift and close the prefix-sibling leak ([6dc4e68](https://github.com/fstubner/xtctx/commit/6dc4e68a9c2bdea098df7dda1d165de2ac950943))
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
### Documentation
|
|
62
|
+
|
|
63
|
+
* add the product, architecture, and design contracts ([147d2af](https://github.com/fstubner/xtctx/commit/147d2aff4e8d5e9afbbe3936c33fa0886fe24548))
|
|
64
|
+
* correct the session-hook failure wording ([d31ac2f](https://github.com/fstubner/xtctx/commit/d31ac2f68ddb253e6debbdc745b05d43e15a5ef4))
|
|
65
|
+
|
|
8
66
|
## [0.11.1](https://github.com/fstubner/xtctx/compare/xtctx-v0.11.0...xtctx-v0.11.1) (2026-08-05)
|
|
9
67
|
|
|
10
68
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hook.d.ts","sourceRoot":"","sources":["../../../src/cli/hook.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,WAAW;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,OAAO,CAAC,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"hook.d.ts","sourceRoot":"","sources":["../../../src/cli/hook.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,WAAW;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,OAAO,CAAC,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CA+BtE"}
|
package/dist/src/cli/hook.js
CHANGED
|
@@ -3,19 +3,30 @@ export async function runHook(options = {}) {
|
|
|
3
3
|
if (options.event && options.event !== "session-start") {
|
|
4
4
|
return;
|
|
5
5
|
}
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
6
|
+
// Fail open throughout: this runs inside the host agent's session startup,
|
|
7
|
+
// so a broken index or config must never surface as a startup error there.
|
|
8
|
+
let services;
|
|
9
|
+
try {
|
|
10
|
+
services = await createProjectServices(options.projectPath);
|
|
11
|
+
const status = await services.sessions.getStatus();
|
|
12
|
+
const tool = options.tool ?? "unknown";
|
|
13
|
+
process.stdout.write([
|
|
14
|
+
"# xtctx handoff",
|
|
15
|
+
"",
|
|
16
|
+
`Tool: ${tool}`,
|
|
17
|
+
`Project root: ${services.projectRoot}`,
|
|
18
|
+
`Last scan: ${status.last_scan_at ?? "never"}`,
|
|
19
|
+
"",
|
|
20
|
+
"Recent transcript context is available through MCP.",
|
|
21
|
+
"Call `xtctx_recent_sessions`, then `xtctx_session_detail` for relevant sessions.",
|
|
22
|
+
"",
|
|
23
|
+
].join("\n"));
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
finally {
|
|
29
|
+
await services?.sessions.close().catch(() => { });
|
|
30
|
+
}
|
|
20
31
|
}
|
|
21
32
|
//# sourceMappingURL=hook.js.map
|
package/dist/src/cli/hook.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hook.js","sourceRoot":"","sources":["../../../src/cli/hook.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAQ/D,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,UAAuB,EAAE;IACrD,IAAI,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,KAAK,KAAK,eAAe,EAAE,CAAC;QACvD,OAAO;IACT,CAAC;IAED,
|
|
1
|
+
{"version":3,"file":"hook.js","sourceRoot":"","sources":["../../../src/cli/hook.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAQ/D,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,UAAuB,EAAE;IACrD,IAAI,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,KAAK,KAAK,eAAe,EAAE,CAAC;QACvD,OAAO;IACT,CAAC;IAED,2EAA2E;IAC3E,2EAA2E;IAC3E,IAAI,QAAuE,CAAC;IAC5E,IAAI,CAAC;QACH,QAAQ,GAAG,MAAM,qBAAqB,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QAC5D,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC;QACnD,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,SAAS,CAAC;QAEvC,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB;YACE,iBAAiB;YACjB,EAAE;YACF,SAAS,IAAI,EAAE;YACf,iBAAiB,QAAQ,CAAC,WAAW,EAAE;YACvC,cAAc,MAAM,CAAC,YAAY,IAAI,OAAO,EAAE;YAC9C,EAAE;YACF,qDAAqD;YACrD,kFAAkF;YAClF,EAAE;SACH,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;IACT,CAAC;YAAS,CAAC;QACT,MAAM,QAAQ,EAAE,QAAQ,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IACnD,CAAC;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/cli/index.ts"],"names":[],"mappings":";AAYA,wBAAsB,IAAI,CAAC,IAAI,WAAe,GAAG,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/cli/index.ts"],"names":[],"mappings":";AAYA,wBAAsB,IAAI,CAAC,IAAI,WAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAsG7D"}
|
package/dist/src/cli/index.js
CHANGED
|
@@ -11,7 +11,22 @@ const { version: CLI_VERSION } = readXtctxPackage(import.meta.url);
|
|
|
11
11
|
export async function main(argv = process.argv) {
|
|
12
12
|
if (shouldStartMcp(argv)) {
|
|
13
13
|
const services = await createProjectServices(process.cwd());
|
|
14
|
-
|
|
14
|
+
let closed = false;
|
|
15
|
+
const shutdown = (exit) => {
|
|
16
|
+
if (closed)
|
|
17
|
+
return;
|
|
18
|
+
closed = true;
|
|
19
|
+
void services.sessions
|
|
20
|
+
.close()
|
|
21
|
+
.catch(() => { })
|
|
22
|
+
.finally(() => {
|
|
23
|
+
if (exit)
|
|
24
|
+
process.exit(0);
|
|
25
|
+
});
|
|
26
|
+
};
|
|
27
|
+
process.once("SIGINT", () => shutdown(true));
|
|
28
|
+
process.once("SIGTERM", () => shutdown(true));
|
|
29
|
+
await startMcpServer({ sessions: services.sessions }, () => shutdown(false));
|
|
15
30
|
return;
|
|
16
31
|
}
|
|
17
32
|
const program = new Command();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cli/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAE5D,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,gBAAgB,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAEnE,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI;IAC5C,IAAI,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC;QACzB,MAAM,QAAQ,GAAG,MAAM,qBAAqB,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QAC5D,MAAM,cAAc,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cli/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../../src/cli/setup.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,eAAe;IAC9B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,wBAAsB,QAAQ,CAAC,OAAO,GAAE,eAAoB,GAAG,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../../src/cli/setup.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,eAAe;IAC9B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,wBAAsB,QAAQ,CAAC,OAAO,GAAE,eAAoB,GAAG,OAAO,CAAC,IAAI,CAAC,CAqB3E"}
|
package/dist/src/cli/setup.js
CHANGED
|
@@ -19,8 +19,7 @@ export async function runSetup(options = {}) {
|
|
|
19
19
|
selectedSkillIds,
|
|
20
20
|
includeGlobalMcp: options.includeGlobalMcp,
|
|
21
21
|
});
|
|
22
|
-
|
|
23
|
-
if (hasCriticalFailure) {
|
|
22
|
+
if (result.failures.length > 0) {
|
|
24
23
|
process.exitCode = 1;
|
|
25
24
|
}
|
|
26
25
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../../src/cli/setup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,KAAK,IAAI,KAAK,EAAE,MAAM,IAAI,MAAM,EAAE,MAAM,cAAc,CAAC;AAChE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,iBAAiB,EAAE,QAAQ,IAAI,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC1E,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAS/E,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,UAA2B,EAAE;IAC1D,MAAM,gBAAgB,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,oBAAoB,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IACnG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;QACjB,MAAM,SAAS,GAAG,MAAM,YAAY,CAAC,OAAO,EAAE,gBAAgB,CAAC,CAAC;QAChE,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;YACjD,OAAO;QACT,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC;QACzB,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,gBAAgB;QAChB,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;KAC3C,CAAC,CAAC;IAEH,
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../../src/cli/setup.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../src/cli/status.ts"],"names":[],"mappings":"AAGA,OAAO,EAAyB,KAAK,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAIrF,MAAM,WAAW,aAAa;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,wBAAsB,SAAS,CAAC,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../src/cli/status.ts"],"names":[],"mappings":"AAGA,OAAO,EAAyB,KAAK,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAIrF,MAAM,WAAW,aAAa;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,wBAAsB,SAAS,CAAC,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAQ1E;AAED,wBAAsB,iBAAiB,CAAC,QAAQ,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CAqGlF"}
|
package/dist/src/cli/status.js
CHANGED
|
@@ -7,7 +7,12 @@ import { readXtctxPackage } from "../utils/package-info.js";
|
|
|
7
7
|
export async function runStatus(options = {}) {
|
|
8
8
|
const projectRoot = resolve(options.projectPath ?? process.cwd());
|
|
9
9
|
const services = await createProjectServices(projectRoot);
|
|
10
|
-
|
|
10
|
+
try {
|
|
11
|
+
process.stdout.write((await renderStatusBlock(services)) + "\n");
|
|
12
|
+
}
|
|
13
|
+
finally {
|
|
14
|
+
await services.sessions.close().catch(() => { });
|
|
15
|
+
}
|
|
11
16
|
}
|
|
12
17
|
export async function renderStatusBlock(services) {
|
|
13
18
|
const { version } = readXtctxPackage(import.meta.url);
|
|
@@ -26,19 +31,26 @@ export async function renderStatusBlock(services) {
|
|
|
26
31
|
lines.push(`Index ${services.dbPath}`);
|
|
27
32
|
lines.push(`MCP npx -y xtctx`);
|
|
28
33
|
lines.push(`Scan ${status.last_scan_at ?? "never"}`);
|
|
34
|
+
if (status.embedding_error) {
|
|
35
|
+
lines.push(`Search semantic unavailable (keyword only): ${status.embedding_error}`);
|
|
36
|
+
}
|
|
29
37
|
lines.push(`Data ${status.sessions} sessions, ${status.messages} messages, ` +
|
|
30
38
|
`${status.retrieval_units} retrieval windows, ${status.vectorized_units} vectorized`);
|
|
31
|
-
if (status.last_scan_at === null && status.sessions === 0) {
|
|
32
|
-
lines.push("Next No sessions are indexed yet. Ask a configured agent to call xtctx_recent_sessions.");
|
|
33
|
-
}
|
|
34
39
|
lines.push("");
|
|
35
40
|
lines.push("Tools:");
|
|
36
41
|
for (const tool of status.tools) {
|
|
37
42
|
const definition = SUPPORTED_TOOLS.find((item) => item.id === tool.tool);
|
|
38
43
|
const hook = definition?.hookMode ?? "mcp-only";
|
|
39
44
|
const marker = tool.detected ? "+" : "-";
|
|
45
|
+
const error = tool.last_error ? `; last scrape error: ${tool.last_error}` : "";
|
|
40
46
|
lines.push(` ${marker} ${tool.tool.padEnd(13)} ${tool.detected ? "detected" : "not detected"}; ` +
|
|
41
|
-
`${tool.indexed_sessions} sessions; hook: ${hook}`);
|
|
47
|
+
`${tool.indexed_sessions} sessions; hook: ${hook}${error}`);
|
|
48
|
+
// `.xtctx/config.yaml` is committable, so a cloned repo can point a
|
|
49
|
+
// scraper at any directory on disk. Overrides stay legal but visible.
|
|
50
|
+
const custom = customStorePaths(definition, tool.store_paths);
|
|
51
|
+
for (const path of custom) {
|
|
52
|
+
lines.push(` custom store path (not the ${tool.tool} default): ${path}`);
|
|
53
|
+
}
|
|
42
54
|
}
|
|
43
55
|
lines.push("");
|
|
44
56
|
lines.push("Skills:");
|
|
@@ -70,6 +82,26 @@ export async function renderStatusBlock(services) {
|
|
|
70
82
|
}
|
|
71
83
|
lines.push(` ${state.padEnd(12)} ${file.label} ${file.path}${details.length ? ` (${details.join("; ")})` : ""}`);
|
|
72
84
|
}
|
|
85
|
+
// Status always ends with one concrete next step, as ux-walkthrough.md
|
|
86
|
+
// promises. Repairing wiring outranks indexing advice: a drifted managed
|
|
87
|
+
// file or missing skill target is why an agent would see nothing at all.
|
|
88
|
+
const needsRepair = !configPresent ||
|
|
89
|
+
managed.some((file) => file.exists && (file.blockCount !== 1 || file.staleReferences.length > 0)) ||
|
|
90
|
+
skills.selected.some((skill) => !skill.exists) ||
|
|
91
|
+
// Only `missing` and `drift` are faults. `managed-block` and
|
|
92
|
+
// `unsupported` are the normal, healthy states for tools that carry
|
|
93
|
+
// skills inside their instruction file or not at all.
|
|
94
|
+
skills.targets.some((target) => target.state === "missing" || target.state === "drift");
|
|
95
|
+
lines.push("");
|
|
96
|
+
if (needsRepair) {
|
|
97
|
+
lines.push("Next Wiring has drifted. Run: xtctx setup --repair");
|
|
98
|
+
}
|
|
99
|
+
else if (status.sessions === 0) {
|
|
100
|
+
lines.push("Next No sessions are indexed yet. Ask a configured agent to call xtctx_recent_sessions.");
|
|
101
|
+
}
|
|
102
|
+
else {
|
|
103
|
+
lines.push("Next Handoff is wired. Ask a configured agent to call xtctx_recent_sessions.");
|
|
104
|
+
}
|
|
73
105
|
return lines.join("\n");
|
|
74
106
|
}
|
|
75
107
|
function managedTargets(projectRoot) {
|
|
@@ -81,4 +113,21 @@ function managedTargets(projectRoot) {
|
|
|
81
113
|
{ label: "copilot", path: join(projectRoot, ".github", "copilot-instructions.md") },
|
|
82
114
|
];
|
|
83
115
|
}
|
|
116
|
+
/** Store paths that differ from the tool's built-in default location. */
|
|
117
|
+
function customStorePaths(definition, storePaths) {
|
|
118
|
+
if (!definition) {
|
|
119
|
+
return [];
|
|
120
|
+
}
|
|
121
|
+
let fallback;
|
|
122
|
+
try {
|
|
123
|
+
fallback = normalizePath(definition.defaultStorePath());
|
|
124
|
+
}
|
|
125
|
+
catch {
|
|
126
|
+
return [];
|
|
127
|
+
}
|
|
128
|
+
return storePaths.filter((path) => normalizePath(path) !== fallback);
|
|
129
|
+
}
|
|
130
|
+
function normalizePath(value) {
|
|
131
|
+
return value.replace(/\\/g, "/").replace(/\/+$/, "").toLowerCase();
|
|
132
|
+
}
|
|
84
133
|
//# sourceMappingURL=status.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../../src/cli/status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACpE,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAAwB,MAAM,wBAAwB,CAAC;AACrF,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAM5D,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,UAAyB,EAAE;IACzD,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAClE,MAAM,QAAQ,GAAG,MAAM,qBAAqB,CAAC,WAAW,CAAC,CAAC;IAC1D,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,iBAAiB,CAAC,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../../src/cli/status.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"disconnect.d.ts","sourceRoot":"","sources":["../../../src/config/disconnect.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"disconnect.d.ts","sourceRoot":"","sources":["../../../src/config/disconnect.ts"],"names":[],"mappings":"AAOA,OAAO,EAAsC,KAAK,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAiBtF,MAAM,WAAW,iBAAiB;IAChC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,gBAAgB;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,MAAM,EAAE,KAAK,CAAC;QACZ,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,OAAO,CAAC;QACjB,0EAA0E;QAC1E,MAAM,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC;QAC/B,IAAI,CAAC,EAAE,MAAM,CAAC;KACf,CAAC,CAAC;IACH,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,sBAAsB,CAAC,OAAO,GAAE,iBAAsB,GAAG;IACvE,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,MAAM,EAAE,sBAAsB,EAAE,CAAC;IACjC,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB,CAiCA;AAED,wBAAsB,iBAAiB,CAAC,OAAO,GAAE,iBAAsB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA4ElG;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,gBAAgB,GAAG,IAAI,CAapE"}
|
|
@@ -1,13 +1,11 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { readFile, rm, stat } from "node:fs/promises";
|
|
2
|
+
import { join, resolve } from "node:path";
|
|
3
|
+
import { writeFileAtomic } from "../utils/atomic-file.js";
|
|
4
|
+
import { matchLineEndings, normalizeNewlines, removeManagedBlocks } from "./managed-block.js";
|
|
3
5
|
import { parse as parseYaml, stringify as stringifyYaml } from "yaml";
|
|
4
6
|
import { removeMcpServerConfigs } from "./mcp-config.js";
|
|
5
7
|
import { BUILT_IN_SKILL_ID, removeSyncedSkillsForTools } from "./skills.js";
|
|
6
8
|
import { SUPPORTED_TOOLS, getToolDefinition } from "../tools/sources.js";
|
|
7
|
-
const MARKERS = {
|
|
8
|
-
begin: "<!-- xtctx:begin -->",
|
|
9
|
-
end: "<!-- xtctx:end -->",
|
|
10
|
-
};
|
|
11
9
|
const TOOL_ALIASES = {
|
|
12
10
|
claude: "claude-code",
|
|
13
11
|
"claude_code": "claude-code",
|
|
@@ -35,6 +33,7 @@ export function describeDisconnectPlan(options = {}) {
|
|
|
35
33
|
continue;
|
|
36
34
|
writes.push(...plannedMcpWrites(projectRoot, tool, options.homeDir));
|
|
37
35
|
if (tool === "claude-code") {
|
|
36
|
+
writes.push({ path: join(projectRoot, ".claude", "settings.json"), kind: "hook:claude-code" });
|
|
38
37
|
writes.push({ path: join(projectRoot, ".claude", "hooks.json"), kind: "hook:claude-code" });
|
|
39
38
|
}
|
|
40
39
|
writes.push(...plannedSkillWrites(projectRoot, tool));
|
|
@@ -56,6 +55,9 @@ export async function disconnectProject(options = {}) {
|
|
|
56
55
|
writes.push({
|
|
57
56
|
path: configPath,
|
|
58
57
|
kind: "config",
|
|
58
|
+
// config.yaml is rewritten with the tools disabled, never deleted — it is
|
|
59
|
+
// the record that xtctx was disconnected.
|
|
60
|
+
action: "updated",
|
|
59
61
|
changed: await disableToolsInProjectConfig(configPath, tools),
|
|
60
62
|
});
|
|
61
63
|
const mcpSummary = await removeMcpServerConfigs(projectRoot, "xtctx", tools, options.homeDir ? { homeDir: options.homeDir } : {});
|
|
@@ -77,12 +79,34 @@ export async function disconnectProject(options = {}) {
|
|
|
77
79
|
});
|
|
78
80
|
}
|
|
79
81
|
writes.push(...(await removeSyncedSkillsForTools(projectRoot, tools)));
|
|
82
|
+
if (options.all === true) {
|
|
83
|
+
// Nothing is left managing skills, so the synced source and the ignore
|
|
84
|
+
// file setup wrote are xtctx's own scaffolding, not user content.
|
|
85
|
+
// Transcript data under .xtctx/state is deliberately untouched.
|
|
86
|
+
for (const path of [
|
|
87
|
+
join(projectRoot, ".xtctx", "skills"),
|
|
88
|
+
join(projectRoot, ".xtctx", ".gitignore"),
|
|
89
|
+
]) {
|
|
90
|
+
writes.push({
|
|
91
|
+
path,
|
|
92
|
+
kind: "skill-source",
|
|
93
|
+
changed: await removeIfPresent(path),
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
}
|
|
80
97
|
if (tools.includes("claude-code")) {
|
|
81
|
-
const
|
|
98
|
+
const settingsPath = join(projectRoot, ".claude", "settings.json");
|
|
99
|
+
writes.push({
|
|
100
|
+
path: settingsPath,
|
|
101
|
+
kind: "hook:claude-code",
|
|
102
|
+
changed: await removeClaudeHookFromSettings(settingsPath),
|
|
103
|
+
});
|
|
104
|
+
const legacyHooksPath = join(projectRoot, ".claude", "hooks.json");
|
|
82
105
|
writes.push({
|
|
83
|
-
path:
|
|
106
|
+
path: legacyHooksPath,
|
|
84
107
|
kind: "hook:claude-code",
|
|
85
|
-
changed: await removeClaudeHook(
|
|
108
|
+
changed: await removeClaudeHook(legacyHooksPath),
|
|
109
|
+
note: "legacy hook file",
|
|
86
110
|
});
|
|
87
111
|
}
|
|
88
112
|
if (tools.includes("antigravity")) {
|
|
@@ -96,7 +120,7 @@ export function printDisconnectResult(result) {
|
|
|
96
120
|
process.stdout.write(`Project: ${result.projectRoot}\n`);
|
|
97
121
|
process.stdout.write(`Tools: ${result.tools.join(", ")}\n`);
|
|
98
122
|
for (const write of result.writes) {
|
|
99
|
-
const marker = write.changed ? "removed" : "ok";
|
|
123
|
+
const marker = write.changed ? (write.action ?? "removed") : "ok";
|
|
100
124
|
const note = write.note ? ` (${write.note})` : "";
|
|
101
125
|
process.stdout.write(` ${marker.padEnd(8)} ${write.kind} ${write.path}${note}\n`);
|
|
102
126
|
}
|
|
@@ -144,8 +168,7 @@ async function disableToolsInProjectConfig(configPath, tools) {
|
|
|
144
168
|
return false;
|
|
145
169
|
}
|
|
146
170
|
config.tools = currentTools;
|
|
147
|
-
await
|
|
148
|
-
await writeFile(configPath, stringifyYaml(config), "utf-8");
|
|
171
|
+
await writeFileAtomic(configPath, stringifyYaml(config));
|
|
149
172
|
return true;
|
|
150
173
|
}
|
|
151
174
|
function memoryPathsToDisconnect(projectRoot, tools, all) {
|
|
@@ -236,8 +259,79 @@ async function removeManagedBlocksFromFile(filePath) {
|
|
|
236
259
|
if (normalizeNewlines(existing).trimEnd() === repaired) {
|
|
237
260
|
return false;
|
|
238
261
|
}
|
|
239
|
-
|
|
240
|
-
|
|
262
|
+
if (!repaired || isOnlyFrontmatter(repaired)) {
|
|
263
|
+
// The file held nothing but the xtctx block — or the YAML frontmatter
|
|
264
|
+
// xtctx itself wrote above it, which Cursor would keep loading as an
|
|
265
|
+
// xtctx rule. Either way setup created it and disconnect owns removing
|
|
266
|
+
// it, rather than leaving a stub behind.
|
|
267
|
+
await rm(filePath, { force: true });
|
|
268
|
+
return true;
|
|
269
|
+
}
|
|
270
|
+
// Put the author's line endings back: removal must not reformat the file.
|
|
271
|
+
await writeFileAtomic(filePath, matchLineEndings(`${repaired}\n`, existing));
|
|
272
|
+
return true;
|
|
273
|
+
}
|
|
274
|
+
async function removeIfPresent(path) {
|
|
275
|
+
try {
|
|
276
|
+
await stat(path);
|
|
277
|
+
}
|
|
278
|
+
catch {
|
|
279
|
+
return false;
|
|
280
|
+
}
|
|
281
|
+
await rm(path, { recursive: true, force: true });
|
|
282
|
+
return true;
|
|
283
|
+
}
|
|
284
|
+
/** True when nothing survives but a single YAML frontmatter block. */
|
|
285
|
+
function isOnlyFrontmatter(content) {
|
|
286
|
+
const trimmed = content.trim();
|
|
287
|
+
if (!trimmed.startsWith("---")) {
|
|
288
|
+
return false;
|
|
289
|
+
}
|
|
290
|
+
const end = trimmed.indexOf("\n---", 3);
|
|
291
|
+
return end !== -1 && trimmed.slice(end + 4).trim().length === 0;
|
|
292
|
+
}
|
|
293
|
+
/** Strip xtctx SessionStart matcher groups from .claude/settings.json. */
|
|
294
|
+
async function removeClaudeHookFromSettings(settingsPath) {
|
|
295
|
+
const raw = await readUtf8IfExists(settingsPath);
|
|
296
|
+
if (raw === null) {
|
|
297
|
+
return false;
|
|
298
|
+
}
|
|
299
|
+
let parsed;
|
|
300
|
+
try {
|
|
301
|
+
parsed = JSON.parse(raw);
|
|
302
|
+
}
|
|
303
|
+
catch {
|
|
304
|
+
return false;
|
|
305
|
+
}
|
|
306
|
+
if (!isRecord(parsed) || !isRecord(parsed.hooks)) {
|
|
307
|
+
return false;
|
|
308
|
+
}
|
|
309
|
+
const sessionStart = Array.isArray(parsed.hooks.SessionStart) ? parsed.hooks.SessionStart : [];
|
|
310
|
+
const kept = sessionStart
|
|
311
|
+
.map((group) => {
|
|
312
|
+
if (!isRecord(group) || !Array.isArray(group.hooks)) {
|
|
313
|
+
return group;
|
|
314
|
+
}
|
|
315
|
+
const hooks = group.hooks.filter((hook) => !isRecord(hook) ||
|
|
316
|
+
typeof hook.command !== "string" ||
|
|
317
|
+
!hook.command.includes("xtctx --hook session-start"));
|
|
318
|
+
return hooks.length === group.hooks.length ? group : { ...group, hooks };
|
|
319
|
+
})
|
|
320
|
+
.filter((group) => !isRecord(group) || !Array.isArray(group.hooks) || group.hooks.length > 0);
|
|
321
|
+
if (JSON.stringify(kept) === JSON.stringify(sessionStart)) {
|
|
322
|
+
return false;
|
|
323
|
+
}
|
|
324
|
+
parsed.hooks.SessionStart = kept;
|
|
325
|
+
// A settings file left holding nothing but an empty SessionStart list was
|
|
326
|
+
// created by setup for that hook alone; remove it rather than leave litter.
|
|
327
|
+
const hooksOnly = Object.keys(parsed).length === 1 &&
|
|
328
|
+
Object.keys(parsed.hooks).length === 1 &&
|
|
329
|
+
kept.length === 0;
|
|
330
|
+
if (hooksOnly) {
|
|
331
|
+
await rm(settingsPath, { force: true });
|
|
332
|
+
return true;
|
|
333
|
+
}
|
|
334
|
+
await writeFileAtomic(settingsPath, JSON.stringify(parsed, null, 2) + "\n");
|
|
241
335
|
return true;
|
|
242
336
|
}
|
|
243
337
|
async function removeClaudeHook(hooksPath) {
|
|
@@ -263,15 +357,9 @@ async function removeClaudeHook(hooksPath) {
|
|
|
263
357
|
return false;
|
|
264
358
|
}
|
|
265
359
|
parsed.hooks.SessionStart = nextSessionStart;
|
|
266
|
-
await
|
|
267
|
-
await writeFile(hooksPath, JSON.stringify(parsed, null, 2) + "\n", "utf-8");
|
|
360
|
+
await writeFileAtomic(hooksPath, JSON.stringify(parsed, null, 2) + "\n");
|
|
268
361
|
return true;
|
|
269
362
|
}
|
|
270
|
-
function removeManagedBlocks(content) {
|
|
271
|
-
const normalized = normalizeNewlines(content);
|
|
272
|
-
const pattern = new RegExp(`${escapeRegExp(MARKERS.begin)}[\\s\\S]*?${escapeRegExp(MARKERS.end)}\\n?`, "g");
|
|
273
|
-
return normalized.replace(pattern, "").replace(/\n{3,}/g, "\n\n");
|
|
274
|
-
}
|
|
275
363
|
async function readUtf8IfExists(filePath) {
|
|
276
364
|
try {
|
|
277
365
|
return await readFile(filePath, "utf-8");
|
|
@@ -280,12 +368,6 @@ async function readUtf8IfExists(filePath) {
|
|
|
280
368
|
return null;
|
|
281
369
|
}
|
|
282
370
|
}
|
|
283
|
-
function normalizeNewlines(input) {
|
|
284
|
-
return input.replace(/\r\n/g, "\n");
|
|
285
|
-
}
|
|
286
|
-
function escapeRegExp(value) {
|
|
287
|
-
return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
288
|
-
}
|
|
289
371
|
function isRecord(value) {
|
|
290
372
|
return Boolean(value) && typeof value === "object" && !Array.isArray(value);
|
|
291
373
|
}
|