@kawacode/mcp 10.1.1 → 10.3.0

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.
Files changed (62) hide show
  1. package/build/kawacode-on-stop.js +14 -2
  2. package/build/kawacode-on-stop.js.map +1 -1
  3. package/build/prompts/intent-first-workflow.d.ts +11 -0
  4. package/build/prompts/intent-first-workflow.js +51 -3
  5. package/build/prompts/intent-first-workflow.js.map +1 -1
  6. package/build/stop/uncompleted-commit.d.ts +5 -3
  7. package/build/stop/uncompleted-commit.js +21 -6
  8. package/build/stop/uncompleted-commit.js.map +1 -1
  9. package/build/stop/uncompleted-commit.test.js +23 -0
  10. package/build/stop/uncompleted-commit.test.js.map +1 -1
  11. package/build/tools/activate-intent.js +1 -1
  12. package/build/tools/activate-intent.js.map +1 -1
  13. package/build/tools/arbiter-apply.js +1 -1
  14. package/build/tools/arbiter-apply.js.map +1 -1
  15. package/build/tools/arbiter-resolve.js +1 -1
  16. package/build/tools/arbiter-resolve.js.map +1 -1
  17. package/build/tools/check-active-intent.js +1 -1
  18. package/build/tools/check-active-intent.js.map +1 -1
  19. package/build/tools/complete-intent.js +5 -5
  20. package/build/tools/complete-intent.js.map +1 -1
  21. package/build/tools/create-intent.js +1 -1
  22. package/build/tools/create-intent.js.map +1 -1
  23. package/build/tools/detect-intent-conflicts.js +1 -1
  24. package/build/tools/detect-intent-conflicts.js.map +1 -1
  25. package/build/tools/edit-session-decision.js +1 -1
  26. package/build/tools/edit-session-decision.js.map +1 -1
  27. package/build/tools/get-decision-detail.js +1 -1
  28. package/build/tools/get-decision-detail.js.map +1 -1
  29. package/build/tools/get-intents-for-file.js +1 -1
  30. package/build/tools/get-intents-for-file.js.map +1 -1
  31. package/build/tools/get-project-decisions.js +1 -1
  32. package/build/tools/get-project-decisions.js.map +1 -1
  33. package/build/tools/get-relevant-context.js +1 -1
  34. package/build/tools/get-relevant-context.js.map +1 -1
  35. package/build/tools/get-resolution-context.js +1 -1
  36. package/build/tools/get-resolution-context.js.map +1 -1
  37. package/build/tools/get-session-decisions.js +1 -1
  38. package/build/tools/get-session-decisions.js.map +1 -1
  39. package/build/tools/list-team-intents.js +1 -1
  40. package/build/tools/list-team-intents.js.map +1 -1
  41. package/build/tools/log-work.js +1 -1
  42. package/build/tools/log-work.js.map +1 -1
  43. package/build/tools/pre-edit-acknowledge.js +1 -1
  44. package/build/tools/pre-edit-acknowledge.js.map +1 -1
  45. package/build/tools/pre-edit-decision-check.js +1 -1
  46. package/build/tools/pre-edit-decision-check.js.map +1 -1
  47. package/build/tools/record-decision.js +1 -1
  48. package/build/tools/record-decision.js.map +1 -1
  49. package/build/tools/resolve-origin.d.ts +13 -7
  50. package/build/tools/resolve-origin.js +17 -8
  51. package/build/tools/resolve-origin.js.map +1 -1
  52. package/build/tools/resume-intent.js +1 -1
  53. package/build/tools/resume-intent.js.map +1 -1
  54. package/build/tools/update-intent.js +1 -1
  55. package/build/tools/update-intent.js.map +1 -1
  56. package/build/tools/vcs.d.ts +41 -0
  57. package/build/tools/vcs.js +111 -0
  58. package/build/tools/vcs.js.map +1 -0
  59. package/build/tools/vcs.test.d.ts +1 -0
  60. package/build/tools/vcs.test.js +88 -0
  61. package/build/tools/vcs.test.js.map +1 -0
  62. package/package.json +1 -1
@@ -0,0 +1,111 @@
1
+ import { execFileSync } from 'child_process';
2
+ import { createHash } from 'crypto';
3
+ import { existsSync, statSync } from 'fs';
4
+ import { dirname, resolve } from 'path';
5
+ /**
6
+ * Walk up from `path`; the NEAREST `.git` (directory or file) or `.svn`
7
+ * (directory) marker wins. Null when there is none. A directory holding both
8
+ * is an error: guessing would attribute work to the wrong repository.
9
+ */
10
+ export function detectVcs(path) {
11
+ let dir = resolve(path);
12
+ for (;;) {
13
+ const git = existsSync(`${dir}/.git`);
14
+ const svn = isDir(`${dir}/.svn`);
15
+ if (git && svn) {
16
+ throw new Error(`'${dir}' holds both .git and .svn; Kawa Code cannot tell which one owns it.`);
17
+ }
18
+ if (git)
19
+ return { kind: 'git', root: dir };
20
+ if (svn)
21
+ return { kind: 'svn', root: dir };
22
+ const up = dirname(dir);
23
+ if (up === dir)
24
+ return null;
25
+ dir = up;
26
+ }
27
+ }
28
+ function isDir(p) {
29
+ try {
30
+ return statSync(p).isDirectory();
31
+ }
32
+ catch {
33
+ return false;
34
+ }
35
+ }
36
+ /** The pseudo-branch of a repository with no trunk/branches/tags layout. */
37
+ export const ROOT_BRANCH = '/';
38
+ /** Parse an svn `relative-url` (`^/…`, percent-encoded). The innermost layout segment wins. */
39
+ export function layoutFromRelativeUrl(relativeUrl) {
40
+ const raw = relativeUrl.trim().replace(/^\^+/, '');
41
+ let decoded;
42
+ try {
43
+ decoded = decodeURIComponent(raw);
44
+ }
45
+ catch {
46
+ decoded = raw;
47
+ }
48
+ const segs = decoded.split('/').filter(s => s !== '');
49
+ for (let j = segs.length - 1; j >= 0; j--) {
50
+ if (j >= 1 && (segs[j - 1] === 'branches' || segs[j - 1] === 'tags')) {
51
+ return {
52
+ projectPath: segs.slice(0, j - 1).join('/'),
53
+ branch: `${segs[j - 1]}/${segs[j]}`,
54
+ subpath: segs.slice(j + 1).join('/'),
55
+ };
56
+ }
57
+ if (segs[j] === 'trunk') {
58
+ return { projectPath: segs.slice(0, j).join('/'), branch: 'trunk', subpath: segs.slice(j + 1).join('/') };
59
+ }
60
+ }
61
+ return { projectPath: '', branch: ROOT_BRANCH, subpath: segs.join('/') };
62
+ }
63
+ /** `hex(SHA-256("kawa-svn-repo-id-v1" ‖ lowercase(trim(uuid))))[0..32]`. */
64
+ export function svnIdHash(uuid) {
65
+ return createHash('sha256')
66
+ .update('kawa-svn-repo-id-v1')
67
+ .update(uuid.trim().toLowerCase())
68
+ .digest('hex')
69
+ .slice(0, 32);
70
+ }
71
+ /** `svn:<idhash>/<project-path>`, or `svn:<idhash>` for a whole-repository project. */
72
+ export function svnOrigin(uuid, projectPath) {
73
+ const h = svnIdHash(uuid);
74
+ return projectPath ? `svn:${h}/${projectPath}` : `svn:${h}`;
75
+ }
76
+ function xmlText(xml, tag) {
77
+ const m = new RegExp(`<${tag}>([^<]*)</${tag}>`).exec(xml);
78
+ if (!m)
79
+ return null;
80
+ return m[1]
81
+ .replace(/&lt;/g, '<')
82
+ .replace(/&gt;/g, '>')
83
+ .replace(/&quot;/g, '"')
84
+ .replace(/&apos;/g, "'")
85
+ .replace(/&amp;/g, '&');
86
+ }
87
+ /** `svn info --xml` for `dir` (offline). Throws when svn is missing or `dir` is not a working copy. */
88
+ function svnInfo(dir) {
89
+ const xml = execFileSync('svn', ['info', '--xml', '--non-interactive', dir], {
90
+ encoding: 'utf-8',
91
+ timeout: 5000,
92
+ windowsHide: true,
93
+ env: { ...process.env, LC_ALL: 'C' },
94
+ });
95
+ const uuid = xmlText(xml, 'uuid');
96
+ const relativeUrl = xmlText(xml, 'relative-url');
97
+ if (!uuid || relativeUrl === null) {
98
+ throw new Error(`svn info for '${dir}' has no repository identity (svn 1.8 or newer is required).`);
99
+ }
100
+ return { uuid, relativeUrl };
101
+ }
102
+ /** The wire origin of the svn working copy containing `dir`. */
103
+ export function svnOriginOf(dir) {
104
+ const info = svnInfo(dir);
105
+ return svnOrigin(info.uuid, layoutFromRelativeUrl(info.relativeUrl).projectPath);
106
+ }
107
+ /** The branch (`trunk`, `branches/x`, …) of the svn working copy containing `dir`. */
108
+ export function svnBranchOf(dir) {
109
+ return layoutFromRelativeUrl(svnInfo(dir).relativeUrl).branch;
110
+ }
111
+ //# sourceMappingURL=vcs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vcs.js","sourceRoot":"","sources":["../../src/tools/vcs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,88 @@
1
+ import { test } from 'node:test';
2
+ import assert from 'node:assert/strict';
3
+ import { execFileSync } from 'node:child_process';
4
+ import { mkdirSync, mkdtempSync, realpathSync, writeFileSync } from 'node:fs';
5
+ import { tmpdir } from 'node:os';
6
+ import { join } from 'node:path';
7
+ import { detectVcs, layoutFromRelativeUrl, svnBranchOf, svnIdHash, svnOrigin, svnOriginOf } from './vcs.js';
8
+ import { resolveOrigin } from './resolve-origin.js';
9
+ import { forSvn, gitWorkflowText, SVN_REPLACEMENTS } from '../prompts/intent-first-workflow.js';
10
+ // Shared vector: the same value is pinned in Kawa Code's layout.rs tests.
11
+ test('svn id hash matches Kawa Code', () => {
12
+ assert.equal(svnIdHash('145C411B-187C-4D9D-8FE6-ED218B269742'), '5971449abcb9782da45d48ab6ab3e5ee');
13
+ assert.equal(svnIdHash(' 145c411b-187c-4d9d-8fe6-ed218b269742\n'), '5971449abcb9782da45d48ab6ab3e5ee');
14
+ const h = svnIdHash('145c411b-187c-4d9d-8fe6-ed218b269742');
15
+ assert.equal(svnOrigin('145c411b-187c-4d9d-8fe6-ed218b269742', 'Products/Billing'), `svn:${h}/Products/Billing`);
16
+ assert.equal(svnOrigin('145c411b-187c-4d9d-8fe6-ed218b269742', ''), `svn:${h}`);
17
+ });
18
+ // Same cases as Kawa Code's layout.rs `layout_shapes`.
19
+ test('layout parser matches Kawa Code', () => {
20
+ const l = (projectPath, branch, subpath) => ({ projectPath, branch, subpath });
21
+ const cases = [
22
+ ['^/trunk', l('', 'trunk', '')],
23
+ ['^/trunk/src/sub', l('', 'trunk', 'src/sub')],
24
+ ['^/branches/feature', l('', 'branches/feature', '')],
25
+ ['^/tags/v1.0/docs', l('', 'tags/v1.0', 'docs')],
26
+ ['^/products/billing/trunk', l('products/billing', 'trunk', '')],
27
+ ['^/products/billing/branches/fix-1/src', l('products/billing', 'branches/fix-1', 'src')],
28
+ ['^/a/trunk/b/trunk', l('a/trunk/b', 'trunk', '')],
29
+ ['^/p/branches/trunk', l('p', 'branches/trunk', '')],
30
+ ['^/p/branches/x/src/trunk', l('p/branches/x/src', 'trunk', '')],
31
+ ['^/', l('', '/', '')],
32
+ ['^', l('', '/', '')],
33
+ ['^/src/lib', l('', '/', 'src/lib')],
34
+ ['^/my%20proj/trunk', l('my proj', 'trunk', '')],
35
+ ['^/branches', l('', '/', 'branches')],
36
+ ['^/Products/Billing/trunk', l('Products/Billing', 'trunk', '')],
37
+ ];
38
+ for (const [url, want] of cases)
39
+ assert.deepEqual(layoutFromRelativeUrl(url), want, url);
40
+ });
41
+ test('nearest marker wins; both in one directory is refused', () => {
42
+ const t = realpathSync(mkdtempSync(join(tmpdir(), 'kawa-vcs-')));
43
+ mkdirSync(join(t, 'g/.git'), { recursive: true });
44
+ mkdirSync(join(t, 'g/vendor/lib/.svn'), { recursive: true });
45
+ mkdirSync(join(t, 'g/vendor/lib/src'), { recursive: true });
46
+ assert.deepEqual(detectVcs(join(t, 'g/vendor/lib/src')), { kind: 'svn', root: join(t, 'g/vendor/lib') });
47
+ assert.deepEqual(detectVcs(join(t, 'g')), { kind: 'git', root: join(t, 'g') });
48
+ mkdirSync(join(t, 's/.svn'), { recursive: true });
49
+ mkdirSync(join(t, 's/tools'), { recursive: true });
50
+ writeFileSync(join(t, 's/tools/.git'), 'gitdir: elsewhere\n');
51
+ assert.equal(detectVcs(join(t, 's/tools'))?.kind, 'git', 'a .git file (worktree) counts');
52
+ mkdirSync(join(t, 'both/.git'), { recursive: true });
53
+ mkdirSync(join(t, 'both/.svn'), { recursive: true });
54
+ assert.throws(() => detectVcs(join(t, 'both')), /both \.git and \.svn/);
55
+ });
56
+ function haveSvn() {
57
+ try {
58
+ execFileSync('svnadmin', ['--version'], { stdio: 'ignore' });
59
+ return true;
60
+ }
61
+ catch {
62
+ return false;
63
+ }
64
+ }
65
+ test('resolveOrigin computes the svn origin locally and never exposes the UUID', { skip: !haveSvn() }, () => {
66
+ const t = realpathSync(mkdtempSync(join(tmpdir(), 'kawa-svn-')));
67
+ mkdirSync(join(t, 'seed/products/billing/trunk/src'), { recursive: true });
68
+ writeFileSync(join(t, 'seed/products/billing/trunk/src/a.rs'), 'x\n');
69
+ execFileSync('svnadmin', ['create', join(t, 'repo')]);
70
+ const url = `file://${t}/repo`;
71
+ execFileSync('svn', ['import', '-q', '-m', 'i', join(t, 'seed'), url]);
72
+ execFileSync('svn', ['co', '-q', `${url}/products/billing/trunk`, join(t, 'wc')]);
73
+ const uuid = execFileSync('svn', ['info', '--show-item', 'repos-uuid', join(t, 'wc')], { encoding: 'utf-8' }).trim();
74
+ const origin = resolveOrigin(undefined, join(t, 'wc'));
75
+ assert.equal(origin, `svn:${svnIdHash(uuid)}/products/billing`);
76
+ assert.ok(!origin.includes(uuid));
77
+ assert.equal(svnOriginOf(join(t, 'wc/src')), origin, 'any directory of the working copy');
78
+ assert.equal(svnBranchOf(join(t, 'wc/src')), 'trunk');
79
+ });
80
+ test('every svn prompt replacement applies to the git text', () => {
81
+ const git = gitWorkflowText('');
82
+ for (const [from] of SVN_REPLACEMENTS)
83
+ assert.ok(git.includes(from), `missing in git text: ${from}`);
84
+ const svn = forSvn(git);
85
+ assert.ok(!/\bgit (status|add|commit|diff)\b/.test(svn), 'no git command is left in the svn text');
86
+ assert.ok(svn.includes('never run it yourself'));
87
+ });
88
+ //# sourceMappingURL=vcs.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vcs.test.js","sourceRoot":"","sources":["../../src/tools/vcs.test.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kawacode/mcp",
3
- "version": "10.1.1",
3
+ "version": "10.3.0",
4
4
  "description": "Team-aware memory for Claude Code, Cursor, and other AI coding assistants — intent tracking, decision history, real-time team conflict detection.",
5
5
  "main": "build/index.js",
6
6
  "bin": {