gipity 1.0.336 → 1.0.339
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/__tests__/claude-trust.test.d.ts +1 -0
- package/dist/__tests__/claude-trust.test.js +71 -0
- package/dist/__tests__/claude-trust.test.js.map +1 -0
- package/dist/__tests__/cli-smoke.test.js +7 -2
- package/dist/__tests__/cli-smoke.test.js.map +1 -1
- package/dist/__tests__/relay-machine-id.test.d.ts +1 -0
- package/dist/__tests__/relay-machine-id.test.js +41 -0
- package/dist/__tests__/relay-machine-id.test.js.map +1 -0
- package/dist/__tests__/relay-redact.test.d.ts +1 -0
- package/dist/__tests__/relay-redact.test.js +78 -0
- package/dist/__tests__/relay-redact.test.js.map +1 -0
- package/dist/__tests__/setup-skills-block.test.d.ts +1 -0
- package/dist/__tests__/setup-skills-block.test.js +65 -0
- package/dist/__tests__/setup-skills-block.test.js.map +1 -0
- package/dist/adopt-cwd.d.ts +3 -0
- package/dist/adopt-cwd.js +1 -0
- package/dist/adopt-cwd.js.map +1 -1
- package/dist/auth.d.ts +5 -0
- package/dist/auth.js +14 -0
- package/dist/auth.js.map +1 -1
- package/dist/commands/add.js +13 -2
- package/dist/commands/add.js.map +1 -1
- package/dist/commands/claude.d.ts +14 -0
- package/dist/commands/claude.js +45 -1
- package/dist/commands/claude.js.map +1 -1
- package/dist/commands/init.js +71 -10
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/realtime.js +25 -1
- package/dist/commands/realtime.js.map +1 -1
- package/dist/index.js +33 -2
- package/dist/index.js.map +1 -1
- package/dist/knowledge.d.ts +4 -4
- package/dist/knowledge.js +40 -19
- package/dist/knowledge.js.map +1 -1
- package/dist/project-setup.d.ts +5 -0
- package/dist/project-setup.js +9 -4
- package/dist/project-setup.js.map +1 -1
- package/dist/prompts.js +1 -0
- package/dist/prompts.js.map +1 -1
- package/dist/relay/daemon.js +30 -4
- package/dist/relay/daemon.js.map +1 -1
- package/dist/relay/machine-id.d.ts +2 -0
- package/dist/relay/machine-id.js +64 -0
- package/dist/relay/machine-id.js.map +1 -0
- package/dist/relay/onboarding.js +2 -1
- package/dist/relay/onboarding.js.map +1 -1
- package/dist/relay/redact.d.ts +34 -0
- package/dist/relay/redact.js +80 -0
- package/dist/relay/redact.js.map +1 -0
- package/dist/setup.d.ts +38 -0
- package/dist/setup.js +82 -11
- package/dist/setup.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* markFolderTrusted - pre-accepts Claude Code's per-directory workspace-trust
|
|
3
|
+
* dialog by writing `projects["<dir>"].hasTrustDialogAccepted` into
|
|
4
|
+
* ~/.claude.json. Verifies the write is additive (every other key preserved),
|
|
5
|
+
* idempotent, and never clobbers a malformed config.
|
|
6
|
+
*/
|
|
7
|
+
import { describe, it, beforeEach, afterEach } from 'node:test';
|
|
8
|
+
import assert from 'node:assert/strict';
|
|
9
|
+
import { mkdtempSync, writeFileSync, readFileSync, existsSync } from 'fs';
|
|
10
|
+
import { join } from 'path';
|
|
11
|
+
import { tmpdir } from 'os';
|
|
12
|
+
import { markFolderTrusted } from '../commands/claude.js';
|
|
13
|
+
const PROJECT = '/home/test/GipityProjects/project-001';
|
|
14
|
+
let home;
|
|
15
|
+
let origHome;
|
|
16
|
+
beforeEach(() => {
|
|
17
|
+
home = mkdtempSync(`${tmpdir()}/gipity-trust-test-`);
|
|
18
|
+
origHome = process.env.HOME;
|
|
19
|
+
process.env.HOME = home; // os.homedir() honors $HOME on POSIX
|
|
20
|
+
});
|
|
21
|
+
afterEach(() => {
|
|
22
|
+
if (origHome === undefined)
|
|
23
|
+
delete process.env.HOME;
|
|
24
|
+
else
|
|
25
|
+
process.env.HOME = origHome;
|
|
26
|
+
});
|
|
27
|
+
function claudeJson() { return join(home, '.claude.json'); }
|
|
28
|
+
function readCfg() { return JSON.parse(readFileSync(claudeJson(), 'utf-8')); }
|
|
29
|
+
describe('markFolderTrusted', () => {
|
|
30
|
+
it('adds the trust entry while preserving other top-level keys and projects', () => {
|
|
31
|
+
writeFileSync(claudeJson(), JSON.stringify({
|
|
32
|
+
numStartups: 42,
|
|
33
|
+
projects: { '/some/other/dir': { hasTrustDialogAccepted: true, foo: 1 } },
|
|
34
|
+
}));
|
|
35
|
+
markFolderTrusted(PROJECT);
|
|
36
|
+
const cfg = readCfg();
|
|
37
|
+
assert.equal(cfg.projects[PROJECT].hasTrustDialogAccepted, true);
|
|
38
|
+
assert.equal(cfg.numStartups, 42, 'unrelated top-level keys preserved');
|
|
39
|
+
assert.deepEqual(cfg.projects['/some/other/dir'], { hasTrustDialogAccepted: true, foo: 1 }, 'other projects untouched');
|
|
40
|
+
});
|
|
41
|
+
it('merges into an existing project entry without dropping its other fields', () => {
|
|
42
|
+
writeFileSync(claudeJson(), JSON.stringify({
|
|
43
|
+
projects: { [PROJECT]: { allowedTools: ['Bash'], history: [1, 2] } },
|
|
44
|
+
}));
|
|
45
|
+
markFolderTrusted(PROJECT);
|
|
46
|
+
const cfg = readCfg();
|
|
47
|
+
assert.equal(cfg.projects[PROJECT].hasTrustDialogAccepted, true);
|
|
48
|
+
assert.deepEqual(cfg.projects[PROJECT].allowedTools, ['Bash']);
|
|
49
|
+
assert.deepEqual(cfg.projects[PROJECT].history, [1, 2]);
|
|
50
|
+
});
|
|
51
|
+
it('is a no-op when the folder is already trusted', () => {
|
|
52
|
+
const original = JSON.stringify({
|
|
53
|
+
projects: { [PROJECT]: { hasTrustDialogAccepted: true } },
|
|
54
|
+
}, null, 2);
|
|
55
|
+
writeFileSync(claudeJson(), original);
|
|
56
|
+
markFolderTrusted(PROJECT);
|
|
57
|
+
assert.equal(readFileSync(claudeJson(), 'utf-8'), original, 'file untouched');
|
|
58
|
+
});
|
|
59
|
+
it('creates ~/.claude.json when it does not exist', () => {
|
|
60
|
+
assert.equal(existsSync(claudeJson()), false);
|
|
61
|
+
markFolderTrusted(PROJECT);
|
|
62
|
+
assert.equal(readCfg().projects[PROJECT].hasTrustDialogAccepted, true);
|
|
63
|
+
});
|
|
64
|
+
it('leaves a malformed config untouched and does not throw', () => {
|
|
65
|
+
const garbage = '{ this is not json';
|
|
66
|
+
writeFileSync(claudeJson(), garbage);
|
|
67
|
+
assert.doesNotThrow(() => markFolderTrusted(PROJECT));
|
|
68
|
+
assert.equal(readFileSync(claudeJson(), 'utf-8'), garbage, 'malformed file not clobbered');
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
//# sourceMappingURL=claude-trust.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-trust.test.js","sourceRoot":"","sources":["../../src/__tests__/claude-trust.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,16 +7,21 @@ import { runCli } from './helpers/spawn-cli.js';
|
|
|
7
7
|
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
8
8
|
const PKG_VERSION = JSON.parse(readFileSync(resolve(__dirname, '..', '..', 'package.json'), 'utf-8')).version;
|
|
9
9
|
describe('cli-smoke: --version and --help', () => {
|
|
10
|
-
it('--version prints the package version', () => {
|
|
10
|
+
it('--version prints the package version + auth status', () => {
|
|
11
11
|
const r = runCli(['--version']);
|
|
12
12
|
assert.equal(r.status, 0);
|
|
13
|
-
|
|
13
|
+
// Branded line: "Gipity v1.2.3"
|
|
14
|
+
assert.match(r.stdout, new RegExp(`Gipity\\s+v${PKG_VERSION.replace(/\./g, '\\.')}`));
|
|
15
|
+
// Auth status: logged-in, session expired, or never logged in.
|
|
16
|
+
assert.match(r.stdout, /Logged in as |Session expired for |Not logged in\. Run: gipity login/);
|
|
14
17
|
});
|
|
15
18
|
it('--help shows version banner near the top and grouped sections in order', () => {
|
|
16
19
|
const r = runCli(['--help']);
|
|
17
20
|
assert.equal(r.status, 0);
|
|
18
21
|
const out = r.stdout;
|
|
19
22
|
assert.match(out, new RegExp(`Gipity CLI\\s+v${PKG_VERSION.replace(/\./g, '\\.')}`));
|
|
23
|
+
// Cross-agent positioning line surfaces in top-level help.
|
|
24
|
+
assert.match(out, /no MCP server needed/);
|
|
20
25
|
const sections = ['Common:', 'Connect:', 'Project:', 'Files:', 'App building:', 'Utilities:', 'Agent:', 'Setup:'];
|
|
21
26
|
let lastIdx = -1;
|
|
22
27
|
for (const s of sections) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli-smoke.test.js","sourceRoot":"","sources":["../../src/__tests__/cli-smoke.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACxC,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAEhD,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC1D,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,cAAc,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;AAE9G,QAAQ,CAAC,iCAAiC,EAAE,GAAG,EAAE;IAC/C,EAAE,CAAC,
|
|
1
|
+
{"version":3,"file":"cli-smoke.test.js","sourceRoot":"","sources":["../../src/__tests__/cli-smoke.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unit tests for the relay machine-id fingerprint. The native-id paths
|
|
3
|
+
* (Linux/macOS/Windows) are environment-specific; these cover the public
|
|
4
|
+
* guarantees: a uniform 64-char hex output, determinism, and that the
|
|
5
|
+
* GIPITY_RELAY_MACHINE_ID override drives the value (the path hosted
|
|
6
|
+
* relay-host containers rely on).
|
|
7
|
+
*/
|
|
8
|
+
import { describe, it, afterEach } from 'node:test';
|
|
9
|
+
import assert from 'node:assert/strict';
|
|
10
|
+
import { getMachineId } from '../relay/machine-id.js';
|
|
11
|
+
const ORIG = process.env.GIPITY_RELAY_MACHINE_ID;
|
|
12
|
+
describe('getMachineId', () => {
|
|
13
|
+
afterEach(() => {
|
|
14
|
+
if (ORIG === undefined)
|
|
15
|
+
delete process.env.GIPITY_RELAY_MACHINE_ID;
|
|
16
|
+
else
|
|
17
|
+
process.env.GIPITY_RELAY_MACHINE_ID = ORIG;
|
|
18
|
+
});
|
|
19
|
+
it('returns a uniform 64-char lowercase hex string', () => {
|
|
20
|
+
assert.match(getMachineId(), /^[0-9a-f]{64}$/);
|
|
21
|
+
});
|
|
22
|
+
it('is deterministic for a fixed override', () => {
|
|
23
|
+
process.env.GIPITY_RELAY_MACHINE_ID = 'relay-host:alice@example.com';
|
|
24
|
+
const a = getMachineId();
|
|
25
|
+
const b = getMachineId();
|
|
26
|
+
assert.equal(a, b);
|
|
27
|
+
assert.match(a, /^[0-9a-f]{64}$/);
|
|
28
|
+
});
|
|
29
|
+
it('different overrides produce different ids', () => {
|
|
30
|
+
process.env.GIPITY_RELAY_MACHINE_ID = 'relay-host:alice@example.com';
|
|
31
|
+
const alice = getMachineId();
|
|
32
|
+
process.env.GIPITY_RELAY_MACHINE_ID = 'relay-host:bob@example.com';
|
|
33
|
+
const bob = getMachineId();
|
|
34
|
+
assert.notEqual(alice, bob);
|
|
35
|
+
});
|
|
36
|
+
it('an empty override is ignored (falls through to a real id)', () => {
|
|
37
|
+
process.env.GIPITY_RELAY_MACHINE_ID = ' ';
|
|
38
|
+
assert.match(getMachineId(), /^[0-9a-f]{64}$/);
|
|
39
|
+
});
|
|
40
|
+
});
|
|
41
|
+
//# sourceMappingURL=relay-machine-id.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relay-machine-id.test.js","sourceRoot":"","sources":["../../src/__tests__/relay-machine-id.test.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACpD,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAEtD,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC;AAEjD,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC5B,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,IAAI,KAAK,SAAS;YAAE,OAAO,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC;;YAC9D,OAAO,CAAC,GAAG,CAAC,uBAAuB,GAAG,IAAI,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;QACxD,MAAM,CAAC,KAAK,CAAC,YAAY,EAAE,EAAE,gBAAgB,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,OAAO,CAAC,GAAG,CAAC,uBAAuB,GAAG,8BAA8B,CAAC;QACrE,MAAM,CAAC,GAAG,YAAY,EAAE,CAAC;QACzB,MAAM,CAAC,GAAG,YAAY,EAAE,CAAC;QACzB,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACnB,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,gBAAgB,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,OAAO,CAAC,GAAG,CAAC,uBAAuB,GAAG,8BAA8B,CAAC;QACrE,MAAM,KAAK,GAAG,YAAY,EAAE,CAAC;QAC7B,OAAO,CAAC,GAAG,CAAC,uBAAuB,GAAG,4BAA4B,CAAC;QACnE,MAAM,GAAG,GAAG,YAAY,EAAE,CAAC;QAC3B,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAC9B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2DAA2D,EAAE,GAAG,EAAE;QACnE,OAAO,CAAC,GAAG,CAAC,uBAAuB,GAAG,KAAK,CAAC;QAC5C,MAAM,CAAC,KAAK,CAAC,YAAY,EAAE,EAAE,gBAAgB,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unit tests for the relay secret-redaction pass. No daemon, no network -
|
|
3
|
+
* just `normalizeSecrets` and `redactEntries`. Uses node's built-in runner.
|
|
4
|
+
*/
|
|
5
|
+
import { describe, it } from 'node:test';
|
|
6
|
+
import assert from 'node:assert/strict';
|
|
7
|
+
import { normalizeSecrets, redactEntries, REDACTION_MARKER } from '../relay/redact.js';
|
|
8
|
+
// A realistic-length fake credential and a short one (must NOT be treated
|
|
9
|
+
// as a secret - see MIN_SECRET_LEN guard).
|
|
10
|
+
const OAUTH = 'sk-ant-oat01-AAAAAAAAAAAAAAAAAAAAAAAAAAAA';
|
|
11
|
+
const API_KEY = 'sk-ant-api03-BBBBBBBBBBBBBBBBBBBBBBBBBBBB';
|
|
12
|
+
const SHORT = 'abc';
|
|
13
|
+
describe('normalizeSecrets', () => {
|
|
14
|
+
it('drops empty, nullish, and too-short values', () => {
|
|
15
|
+
assert.deepEqual(normalizeSecrets([undefined, null, '', SHORT]), []);
|
|
16
|
+
});
|
|
17
|
+
it('dedups and sorts longest-first', () => {
|
|
18
|
+
const longer = API_KEY + 'XXXX';
|
|
19
|
+
const out = normalizeSecrets([API_KEY, longer, API_KEY]);
|
|
20
|
+
assert.deepEqual(out, [longer, API_KEY]);
|
|
21
|
+
});
|
|
22
|
+
});
|
|
23
|
+
describe('redactEntries', () => {
|
|
24
|
+
it('scrubs a secret out of a tool_result content string', () => {
|
|
25
|
+
const entries = [
|
|
26
|
+
{ kind: 'tool_result', tool_use_id: 't1', content: `the token is ${OAUTH} ok` },
|
|
27
|
+
];
|
|
28
|
+
const [out] = redactEntries(entries, normalizeSecrets([OAUTH]));
|
|
29
|
+
assert.equal(out.content, `the token is ${REDACTION_MARKER} ok`);
|
|
30
|
+
});
|
|
31
|
+
it('scrubs a secret out of assistant text and nested blocks', () => {
|
|
32
|
+
const entries = [
|
|
33
|
+
{
|
|
34
|
+
kind: 'assistant',
|
|
35
|
+
text: `here it is: ${API_KEY}`,
|
|
36
|
+
blocks: [{ type: 'text', text: `again ${API_KEY}` }],
|
|
37
|
+
},
|
|
38
|
+
];
|
|
39
|
+
const [out] = redactEntries(entries, normalizeSecrets([API_KEY]));
|
|
40
|
+
assert.equal(out.text, `here it is: ${REDACTION_MARKER}`);
|
|
41
|
+
assert.equal(out.blocks[0].text, `again ${REDACTION_MARKER}`);
|
|
42
|
+
});
|
|
43
|
+
it('handles either credential env value (oauth or api key)', () => {
|
|
44
|
+
const entries = [
|
|
45
|
+
{ kind: 'system', content: `oauth=${OAUTH} apikey=${API_KEY}` },
|
|
46
|
+
];
|
|
47
|
+
const [out] = redactEntries(entries, normalizeSecrets([OAUTH, API_KEY]));
|
|
48
|
+
assert.equal(out.content, `oauth=${REDACTION_MARKER} apikey=${REDACTION_MARKER}`);
|
|
49
|
+
});
|
|
50
|
+
it('leaves a clean entry untouched', () => {
|
|
51
|
+
const entries = [{ kind: 'prompt', prompt: 'build me a todo app' }];
|
|
52
|
+
const [out] = redactEntries(entries, normalizeSecrets([OAUTH]));
|
|
53
|
+
assert.equal(out.prompt, 'build me a todo app');
|
|
54
|
+
});
|
|
55
|
+
it('leaves clean content intact when there are no secrets', () => {
|
|
56
|
+
const entries = [{ kind: 'prompt', prompt: `mentions ${SHORT}` }];
|
|
57
|
+
const [out] = redactEntries(entries, normalizeSecrets([SHORT, '']));
|
|
58
|
+
assert.equal(out.prompt, `mentions ${SHORT}`);
|
|
59
|
+
});
|
|
60
|
+
it('redacts a JWT-shaped string even with no literal secrets', () => {
|
|
61
|
+
// Gipity access/refresh tokens are JWTs and rotate; the pattern pass
|
|
62
|
+
// catches them if the literal-secret list is momentarily stale.
|
|
63
|
+
const jwt = 'eyJhbGciOiJIUzI1NiJ9.eyJ1c2VySWQiOjQyfQ.s1gnatur3_AbC-dEf';
|
|
64
|
+
const entries = [
|
|
65
|
+
{ kind: 'tool_result', tool_use_id: 't1', content: `"accessToken":"${jwt}"` },
|
|
66
|
+
];
|
|
67
|
+
const [out] = redactEntries(entries, []);
|
|
68
|
+
assert.equal(out.content, `"accessToken":"${REDACTION_MARKER}"`);
|
|
69
|
+
});
|
|
70
|
+
it('does not mutate the input entries', () => {
|
|
71
|
+
const entries = [
|
|
72
|
+
{ kind: 'tool_result', tool_use_id: 't1', content: OAUTH },
|
|
73
|
+
];
|
|
74
|
+
redactEntries(entries, normalizeSecrets([OAUTH]));
|
|
75
|
+
assert.equal(entries[0].content, OAUTH);
|
|
76
|
+
});
|
|
77
|
+
});
|
|
78
|
+
//# sourceMappingURL=relay-redact.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relay-redact.test.js","sourceRoot":"","sources":["../../src/__tests__/relay-redact.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* applySkillsBlock - the managed CLAUDE.md / AGENTS.md integration block.
|
|
3
|
+
*
|
|
4
|
+
* The Gipity block is delimited by stable markers and fully managed: every
|
|
5
|
+
* run refreshes it to the current SKILLS_CONTENT while preserving the user's
|
|
6
|
+
* own content outside the markers. These cover the four input shapes plus
|
|
7
|
+
* idempotency - the property that makes per-session refresh safe.
|
|
8
|
+
*/
|
|
9
|
+
import { test } from 'node:test';
|
|
10
|
+
import assert from 'node:assert/strict';
|
|
11
|
+
import { applySkillsBlock, GIPITY_BLOCK_BEGIN, GIPITY_BLOCK_END, SKILLS_CONTENT } from '../setup.js';
|
|
12
|
+
function count(haystack, needle) {
|
|
13
|
+
return haystack.split(needle).length - 1;
|
|
14
|
+
}
|
|
15
|
+
test('no file: returns the managed block, marker-wrapped and newline-terminated', () => {
|
|
16
|
+
const out = applySkillsBlock(null);
|
|
17
|
+
assert.ok(out.includes(GIPITY_BLOCK_BEGIN), 'has begin marker');
|
|
18
|
+
assert.ok(out.includes(GIPITY_BLOCK_END), 'has end marker');
|
|
19
|
+
assert.ok(out.includes(SKILLS_CONTENT), 'has current skills content');
|
|
20
|
+
assert.ok(out.endsWith('\n'), 'ends with a newline');
|
|
21
|
+
});
|
|
22
|
+
test('marked block: content refreshed in place, surrounding text preserved', () => {
|
|
23
|
+
const stale = `${GIPITY_BLOCK_BEGIN}\n# Gipity Integration\n\nSTALE OLD TEXT\n${GIPITY_BLOCK_END}`;
|
|
24
|
+
const file = `# My Project\n\nMy own notes.\n\n${stale}\n\nNotes below the block.\n`;
|
|
25
|
+
const out = applySkillsBlock(file);
|
|
26
|
+
assert.ok(out.includes('My own notes.'), 'preserves content above the block');
|
|
27
|
+
assert.ok(out.includes('Notes below the block.'), 'preserves content below the block');
|
|
28
|
+
assert.ok(!out.includes('STALE OLD TEXT'), 'stale block content is replaced');
|
|
29
|
+
assert.ok(out.includes(SKILLS_CONTENT), 'has current skills content');
|
|
30
|
+
assert.equal(count(out, GIPITY_BLOCK_BEGIN), 1, 'exactly one block, no duplication');
|
|
31
|
+
});
|
|
32
|
+
test('legacy unmarked block: migrated to a marked block, stale text dropped', () => {
|
|
33
|
+
const file = '# Gipity Integration\n\nOLD UNMARKED CONTENT from a previous CLI version.\n';
|
|
34
|
+
const out = applySkillsBlock(file);
|
|
35
|
+
assert.ok(out.includes(GIPITY_BLOCK_BEGIN), 'now wrapped in markers');
|
|
36
|
+
assert.ok(!out.includes('OLD UNMARKED CONTENT'), 'legacy text dropped');
|
|
37
|
+
assert.ok(out.includes(SKILLS_CONTENT), 'has current skills content');
|
|
38
|
+
assert.equal(count(out, GIPITY_BLOCK_BEGIN), 1, 'exactly one block');
|
|
39
|
+
});
|
|
40
|
+
test('legacy unmarked block below user content: user content survives migration', () => {
|
|
41
|
+
const file = '# My Project\n\nImportant project notes.\n\n# Gipity Integration\n\nstale legacy text\n';
|
|
42
|
+
const out = applySkillsBlock(file);
|
|
43
|
+
assert.ok(out.includes('Important project notes.'), 'user content above is kept');
|
|
44
|
+
assert.ok(!out.includes('stale legacy text'), 'legacy block is replaced');
|
|
45
|
+
assert.equal(count(out, GIPITY_BLOCK_BEGIN), 1, 'exactly one block');
|
|
46
|
+
});
|
|
47
|
+
test('user file with no Gipity block: block appended, user content kept', () => {
|
|
48
|
+
const file = '# My Project\n\nJust my notes, no Gipity block.\n';
|
|
49
|
+
const out = applySkillsBlock(file);
|
|
50
|
+
assert.ok(out.startsWith('# My Project'), 'user content stays at the top');
|
|
51
|
+
assert.ok(out.includes('Just my notes, no Gipity block.'), 'user content kept');
|
|
52
|
+
assert.ok(out.includes(GIPITY_BLOCK_BEGIN), 'managed block appended');
|
|
53
|
+
});
|
|
54
|
+
test('idempotent: re-applying the result changes nothing', () => {
|
|
55
|
+
const inputs = [
|
|
56
|
+
null,
|
|
57
|
+
'# My Project\n\nNotes.\n',
|
|
58
|
+
'# Gipity Integration\n\nlegacy text\n',
|
|
59
|
+
];
|
|
60
|
+
for (const input of inputs) {
|
|
61
|
+
const once = applySkillsBlock(input);
|
|
62
|
+
assert.equal(applySkillsBlock(once), once, 'a second apply is a no-op');
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
//# sourceMappingURL=setup-skills-block.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup-skills-block.test.js","sourceRoot":"","sources":["../../src/__tests__/setup-skills-block.test.ts"],"names":[],"mappings":"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"}
|
package/dist/adopt-cwd.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { SUPPORTED_TOOLS } from './setup.js';
|
|
1
2
|
export interface ProjectData {
|
|
2
3
|
short_guid: string;
|
|
3
4
|
name: string;
|
|
@@ -56,6 +57,8 @@ export declare function adoptCurrentDir(opts: {
|
|
|
56
57
|
confirmDeletions: boolean;
|
|
57
58
|
/** Force a specific agent guid; skip the auto-lookup. */
|
|
58
59
|
agentOverride?: string;
|
|
60
|
+
/** Subset of AI-tool primers to write. Defaults to all. */
|
|
61
|
+
tools?: typeof SUPPORTED_TOOLS;
|
|
59
62
|
}): Promise<AdoptResult>;
|
|
60
63
|
/** Re-export so callers can unify on these constants for messaging. */
|
|
61
64
|
export declare const ADOPT_THRESHOLDS: {
|
package/dist/adopt-cwd.js
CHANGED
package/dist/adopt-cwd.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adopt-cwd.js","sourceRoot":"","sources":["../src/adopt-cwd.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,IAAI,CAAC;AAC3C,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,MAAM,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAC/C,OAAO,EAAE,aAAa,
|
|
1
|
+
{"version":3,"file":"adopt-cwd.js","sourceRoot":"","sources":["../src/adopt-cwd.ts"],"names":[],"mappings":"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"}
|
package/dist/auth.d.ts
CHANGED
|
@@ -5,6 +5,11 @@ export interface AuthData {
|
|
|
5
5
|
expiresAt: string;
|
|
6
6
|
}
|
|
7
7
|
export declare function getAuth(): AuthData | null;
|
|
8
|
+
/** Read auth.json directly from disk, bypassing the in-process cache.
|
|
9
|
+
* The relay daemon's secret-redaction needs the *current* tokens: a child
|
|
10
|
+
* `gipity sync` / `gipity claude` process can refresh and rewrite the file
|
|
11
|
+
* mid-run, after which the daemon's cached `getAuth()` would be stale. */
|
|
12
|
+
export declare function readAuthFresh(): AuthData | null;
|
|
8
13
|
export declare function saveAuth(data: AuthData): void;
|
|
9
14
|
export declare function clearAuth(): void;
|
|
10
15
|
export declare function isExpired(): boolean;
|
package/dist/auth.js
CHANGED
|
@@ -18,6 +18,20 @@ export function getAuth() {
|
|
|
18
18
|
return null;
|
|
19
19
|
}
|
|
20
20
|
}
|
|
21
|
+
/** Read auth.json directly from disk, bypassing the in-process cache.
|
|
22
|
+
* The relay daemon's secret-redaction needs the *current* tokens: a child
|
|
23
|
+
* `gipity sync` / `gipity claude` process can refresh and rewrite the file
|
|
24
|
+
* mid-run, after which the daemon's cached `getAuth()` would be stale. */
|
|
25
|
+
export function readAuthFresh() {
|
|
26
|
+
if (!existsSync(AUTH_FILE))
|
|
27
|
+
return null;
|
|
28
|
+
try {
|
|
29
|
+
return JSON.parse(readFileSync(AUTH_FILE, 'utf-8'));
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
21
35
|
export function saveAuth(data) {
|
|
22
36
|
mkdirSync(AUTH_DIR, { recursive: true });
|
|
23
37
|
writeFileSync(AUTH_FILE, JSON.stringify(data, null, 2));
|
package/dist/auth.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/add.js
CHANGED
|
@@ -11,9 +11,12 @@ import { run } from '../helpers/index.js';
|
|
|
11
11
|
// Templates scaffold a whole app (blank wiring or a working starter demo).
|
|
12
12
|
// Kits are reusable building blocks added into an existing app's src/packages/.
|
|
13
13
|
const TEMPLATES = ['web-simple', '3d-engine'];
|
|
14
|
-
const STARTERS = ['web-fullstack', '2d-game', '3d-world', 'api'];
|
|
14
|
+
const STARTERS = ['web-fullstack', 'web-vision-cam', '2d-game', '3d-world', 'api'];
|
|
15
15
|
const HIDDEN = [{ key: 'app-itsm', hint: 'IT service management / helpdesk / ticketing' }];
|
|
16
|
-
const KITS = [
|
|
16
|
+
const KITS = [
|
|
17
|
+
{ key: 'realtime', hint: 'multiplayer / presence / shared state' },
|
|
18
|
+
{ key: 'web-vision-mediapipe', hint: 'browser camera vision - gesture, pose, object detection' },
|
|
19
|
+
];
|
|
17
20
|
function printCatalog() {
|
|
18
21
|
console.log('');
|
|
19
22
|
console.log(`${bold('Templates')} ${muted('- scaffold a whole app into an empty project')}`);
|
|
@@ -66,6 +69,14 @@ export const addCommand = new Command('add')
|
|
|
66
69
|
for (const n of data.notes)
|
|
67
70
|
console.log(n);
|
|
68
71
|
}
|
|
72
|
+
// After scaffolding an app, point at kits as the next step - they add
|
|
73
|
+
// features (multiplayer, etc.) into the app you just created.
|
|
74
|
+
if (data.kind !== 'kit' && KITS.length > 0) {
|
|
75
|
+
console.log('');
|
|
76
|
+
console.log(muted('Add features with kits (gipity add <kit>):'));
|
|
77
|
+
for (const k of KITS)
|
|
78
|
+
console.log(muted(` ${k.key} - ${k.hint}`));
|
|
79
|
+
}
|
|
69
80
|
if (syncResult.applied > 0) {
|
|
70
81
|
console.log(`\nPulled ${syncResult.applied} files to local.`);
|
|
71
82
|
}
|
package/dist/commands/add.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"add.js","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EAAE,GAAG,EAAE,MAAM,qBAAqB,CAAC;AAE1C,+EAA+E;AAC/E,4EAA4E;AAC5E,0EAA0E;AAC1E,EAAE;AACF,2EAA2E;AAC3E,gFAAgF;AAChF,MAAM,SAAS,GAAG,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;AAC9C,MAAM,QAAQ,GAAG,CAAC,eAAe,EAAE,SAAS,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"add.js","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,2 +1,16 @@
|
|
|
1
1
|
import { Command } from 'commander';
|
|
2
|
+
/** Pre-accept Claude Code's per-directory workspace-trust dialog for a
|
|
3
|
+
* Gipity-managed project directory. `gipity claude` only ever launches the
|
|
4
|
+
* agent in a project the user created or explicitly chose, so the dialog is
|
|
5
|
+
* pure friction here - and a fresh `project-NNN` dir is untrusted on every
|
|
6
|
+
* interactive run.
|
|
7
|
+
*
|
|
8
|
+
* Writes `projects["<dir>"].hasTrustDialogAccepted = true` into
|
|
9
|
+
* `~/.claude.json` - the exact entry Claude records when the user clicks
|
|
10
|
+
* "Yes". Purely additive (a path Claude hadn't seen); every other key is
|
|
11
|
+
* preserved, and the write is atomic (temp + rename) so a crash can't
|
|
12
|
+
* truncate the file. Best-effort: a malformed or unreadable config is left
|
|
13
|
+
* untouched and never blocks the launch. Headless `-p` runs skip the dialog
|
|
14
|
+
* already, so this is only needed for interactive launches. */
|
|
15
|
+
export declare function markFolderTrusted(dir: string): void;
|
|
2
16
|
export declare const claudeCommand: Command;
|
package/dist/commands/claude.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Command } from 'commander';
|
|
2
2
|
import { join, dirname, resolve, basename } from 'path';
|
|
3
|
-
import { existsSync, mkdirSync, readFileSync, readdirSync, statSync } from 'fs';
|
|
3
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync, renameSync, readdirSync, statSync } from 'fs';
|
|
4
4
|
import { execSync, spawn } from 'child_process';
|
|
5
5
|
import { homedir } from 'os';
|
|
6
6
|
import { fileURLToPath } from 'url';
|
|
@@ -150,6 +150,44 @@ function formatElapsed(ms) {
|
|
|
150
150
|
const pad2 = (n) => String(n).padStart(2, '0');
|
|
151
151
|
return `${pad2(h)}:${pad2(m)}:${s.toFixed(1).padStart(4, '0')}`;
|
|
152
152
|
}
|
|
153
|
+
/** Pre-accept Claude Code's per-directory workspace-trust dialog for a
|
|
154
|
+
* Gipity-managed project directory. `gipity claude` only ever launches the
|
|
155
|
+
* agent in a project the user created or explicitly chose, so the dialog is
|
|
156
|
+
* pure friction here - and a fresh `project-NNN` dir is untrusted on every
|
|
157
|
+
* interactive run.
|
|
158
|
+
*
|
|
159
|
+
* Writes `projects["<dir>"].hasTrustDialogAccepted = true` into
|
|
160
|
+
* `~/.claude.json` - the exact entry Claude records when the user clicks
|
|
161
|
+
* "Yes". Purely additive (a path Claude hadn't seen); every other key is
|
|
162
|
+
* preserved, and the write is atomic (temp + rename) so a crash can't
|
|
163
|
+
* truncate the file. Best-effort: a malformed or unreadable config is left
|
|
164
|
+
* untouched and never blocks the launch. Headless `-p` runs skip the dialog
|
|
165
|
+
* already, so this is only needed for interactive launches. */
|
|
166
|
+
export function markFolderTrusted(dir) {
|
|
167
|
+
try {
|
|
168
|
+
const file = join(homedir(), '.claude.json');
|
|
169
|
+
const cfg = existsSync(file)
|
|
170
|
+
? JSON.parse(readFileSync(file, 'utf-8'))
|
|
171
|
+
: {};
|
|
172
|
+
if (typeof cfg !== 'object' || cfg === null)
|
|
173
|
+
return;
|
|
174
|
+
if (typeof cfg.projects !== 'object' || cfg.projects === null)
|
|
175
|
+
cfg.projects = {};
|
|
176
|
+
const entry = typeof cfg.projects[dir] === 'object' && cfg.projects[dir] !== null
|
|
177
|
+
? cfg.projects[dir]
|
|
178
|
+
: {};
|
|
179
|
+
if (entry.hasTrustDialogAccepted === true)
|
|
180
|
+
return; // already trusted - no write
|
|
181
|
+
entry.hasTrustDialogAccepted = true;
|
|
182
|
+
cfg.projects[dir] = entry;
|
|
183
|
+
const tmp = `${file}.gipity-tmp`;
|
|
184
|
+
writeFileSync(tmp, JSON.stringify(cfg, null, 2));
|
|
185
|
+
renameSync(tmp, file);
|
|
186
|
+
}
|
|
187
|
+
catch {
|
|
188
|
+
// A config-file hiccup must never block launching the agent.
|
|
189
|
+
}
|
|
190
|
+
}
|
|
153
191
|
function suggestProjectName(existingSlugs) {
|
|
154
192
|
// Canonical format: `project-NNN` (3-digit, zero-padded, hyphenated).
|
|
155
193
|
// Same shape the web "+ New Project" button uses, so both entry points
|
|
@@ -782,6 +820,12 @@ export const claudeCommand = new Command('claude')
|
|
|
782
820
|
else if (convGuidForHooks) {
|
|
783
821
|
childEnv.GIPITY_CONVERSATION_GUID = convGuidForHooks;
|
|
784
822
|
}
|
|
823
|
+
// A Gipity project directory is trusted by construction - the user
|
|
824
|
+
// created or explicitly chose it. Pre-accept Claude's per-directory
|
|
825
|
+
// trust dialog so an interactive launch doesn't stop to ask. Headless
|
|
826
|
+
// `-p` runs skip the dialog already, so this is only needed interactively.
|
|
827
|
+
if (!nonInteractive)
|
|
828
|
+
markFolderTrusted(process.cwd());
|
|
785
829
|
const child = spawn(claudeCmd, allArgs, {
|
|
786
830
|
stdio: 'inherit',
|
|
787
831
|
cwd: process.cwd(),
|