@kawacode/mcp 10.0.0 → 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.
- package/CLAUDE.md.example +6 -4
- package/README.md +39 -2
- package/build/kawacode-on-stop.js +14 -2
- package/build/kawacode-on-stop.js.map +1 -1
- package/build/prompts/intent-first-workflow.d.ts +11 -0
- package/build/prompts/intent-first-workflow.js +51 -3
- package/build/prompts/intent-first-workflow.js.map +1 -1
- package/build/stop/uncompleted-commit.d.ts +5 -3
- package/build/stop/uncompleted-commit.js +21 -6
- package/build/stop/uncompleted-commit.js.map +1 -1
- package/build/stop/uncompleted-commit.test.js +23 -0
- package/build/stop/uncompleted-commit.test.js.map +1 -1
- package/build/tools/_complete-intent-label.test.d.ts +1 -0
- package/build/tools/_complete-intent-label.test.js +18 -0
- package/build/tools/_complete-intent-label.test.js.map +1 -0
- package/build/tools/_create-intent.test.js +14 -5
- package/build/tools/_create-intent.test.js.map +1 -1
- package/build/tools/activate-intent.js +1 -1
- package/build/tools/activate-intent.js.map +1 -1
- package/build/tools/arbiter-apply.js +1 -1
- package/build/tools/arbiter-apply.js.map +1 -1
- package/build/tools/arbiter-resolve.js +1 -1
- package/build/tools/arbiter-resolve.js.map +1 -1
- package/build/tools/check-active-intent.js +1 -1
- package/build/tools/check-active-intent.js.map +1 -1
- package/build/tools/complete-intent.d.ts +11 -0
- package/build/tools/complete-intent.js +25 -14
- package/build/tools/complete-intent.js.map +1 -1
- package/build/tools/create-intent.js +37 -18
- package/build/tools/create-intent.js.map +1 -1
- package/build/tools/detect-intent-conflicts.js +1 -1
- package/build/tools/detect-intent-conflicts.js.map +1 -1
- package/build/tools/edit-session-decision.js +1 -1
- package/build/tools/edit-session-decision.js.map +1 -1
- package/build/tools/get-decision-detail.js +1 -1
- package/build/tools/get-decision-detail.js.map +1 -1
- package/build/tools/get-intents-for-file.js +1 -1
- package/build/tools/get-intents-for-file.js.map +1 -1
- package/build/tools/get-project-decisions.d.ts +15 -0
- package/build/tools/get-project-decisions.js +20 -16
- package/build/tools/get-project-decisions.js.map +1 -1
- package/build/tools/get-relevant-context.js +1 -1
- package/build/tools/get-relevant-context.js.map +1 -1
- package/build/tools/get-resolution-context.js +1 -1
- package/build/tools/get-resolution-context.js.map +1 -1
- package/build/tools/get-session-decisions.js +1 -1
- package/build/tools/get-session-decisions.js.map +1 -1
- package/build/tools/index.d.ts +8 -2
- package/build/tools/list-team-intents.d.ts +4 -4
- package/build/tools/list-team-intents.js +1 -1
- package/build/tools/list-team-intents.js.map +1 -1
- package/build/tools/log-work.js +1 -1
- package/build/tools/log-work.js.map +1 -1
- package/build/tools/pre-edit-acknowledge.js +1 -1
- package/build/tools/pre-edit-acknowledge.js.map +1 -1
- package/build/tools/pre-edit-decision-check.js +1 -1
- package/build/tools/pre-edit-decision-check.js.map +1 -1
- package/build/tools/record-decision.js +1 -1
- package/build/tools/record-decision.js.map +1 -1
- package/build/tools/resolve-origin.d.ts +13 -7
- package/build/tools/resolve-origin.js +17 -8
- package/build/tools/resolve-origin.js.map +1 -1
- package/build/tools/resume-intent.js +1 -1
- package/build/tools/resume-intent.js.map +1 -1
- package/build/tools/update-intent.js +1 -1
- package/build/tools/update-intent.js.map +1 -1
- package/build/tools/vcs.d.ts +41 -0
- package/build/tools/vcs.js +111 -0
- package/build/tools/vcs.js.map +1 -0
- package/build/tools/vcs.test.d.ts +1 -0
- package/build/tools/vcs.test.js +88 -0
- package/build/tools/vcs.test.js.map +1 -0
- 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(/</g, '<')
|
|
82
|
+
.replace(/>/g, '>')
|
|
83
|
+
.replace(/"/g, '"')
|
|
84
|
+
.replace(/'/g, "'")
|
|
85
|
+
.replace(/&/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.
|
|
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": {
|