auden 0.1.0-alpha.2
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/LICENSE +21 -0
- package/README.md +59 -0
- package/dist/auden-paths.d.ts +8 -0
- package/dist/auden-paths.d.ts.map +1 -0
- package/dist/auden-paths.js +10 -0
- package/dist/auden-paths.js.map +1 -0
- package/dist/bin.d.ts +11 -0
- package/dist/bin.d.ts.map +1 -0
- package/dist/bin.js +13 -0
- package/dist/bin.js.map +1 -0
- package/dist/chunk.d.ts +3 -0
- package/dist/chunk.d.ts.map +1 -0
- package/dist/chunk.js +13 -0
- package/dist/chunk.js.map +1 -0
- package/dist/commands/doctor.d.ts +13 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +125 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/eval/index.d.ts +2 -0
- package/dist/commands/eval/index.d.ts.map +1 -0
- package/dist/commands/eval/index.js +2 -0
- package/dist/commands/eval/index.js.map +1 -0
- package/dist/commands/eval/run.d.ts +38 -0
- package/dist/commands/eval/run.d.ts.map +1 -0
- package/dist/commands/eval/run.js +179 -0
- package/dist/commands/eval/run.js.map +1 -0
- package/dist/commands/guides/active.d.ts +2 -0
- package/dist/commands/guides/active.d.ts.map +1 -0
- package/dist/commands/guides/active.js +38 -0
- package/dist/commands/guides/active.js.map +1 -0
- package/dist/commands/guides/index.d.ts +2 -0
- package/dist/commands/guides/index.d.ts.map +1 -0
- package/dist/commands/guides/index.js +13 -0
- package/dist/commands/guides/index.js.map +1 -0
- package/dist/commands/guides/project.d.ts +13 -0
- package/dist/commands/guides/project.d.ts.map +1 -0
- package/dist/commands/guides/project.js +71 -0
- package/dist/commands/guides/project.js.map +1 -0
- package/dist/commands/guides/search.d.ts +8 -0
- package/dist/commands/guides/search.d.ts.map +1 -0
- package/dist/commands/guides/search.js +46 -0
- package/dist/commands/guides/search.js.map +1 -0
- package/dist/commands/init.d.ts +43 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +436 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/mcp.d.ts +23 -0
- package/dist/commands/mcp.d.ts.map +1 -0
- package/dist/commands/mcp.js +55 -0
- package/dist/commands/mcp.js.map +1 -0
- package/dist/commands/pull.d.ts +38 -0
- package/dist/commands/pull.d.ts.map +1 -0
- package/dist/commands/pull.js +127 -0
- package/dist/commands/pull.js.map +1 -0
- package/dist/commands/rules/export.d.ts +140 -0
- package/dist/commands/rules/export.d.ts.map +1 -0
- package/dist/commands/rules/export.js +635 -0
- package/dist/commands/rules/export.js.map +1 -0
- package/dist/commands/rules/import.d.ts +33 -0
- package/dist/commands/rules/import.d.ts.map +1 -0
- package/dist/commands/rules/import.js +122 -0
- package/dist/commands/rules/import.js.map +1 -0
- package/dist/commands/rules/index.d.ts +2 -0
- package/dist/commands/rules/index.d.ts.map +1 -0
- package/dist/commands/rules/index.js +13 -0
- package/dist/commands/rules/index.js.map +1 -0
- package/dist/commands/rules/watch.d.ts +43 -0
- package/dist/commands/rules/watch.d.ts.map +1 -0
- package/dist/commands/rules/watch.js +125 -0
- package/dist/commands/rules/watch.js.map +1 -0
- package/dist/commands/status.d.ts +2 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +61 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/suggest.d.ts +8 -0
- package/dist/commands/suggest.d.ts.map +1 -0
- package/dist/commands/suggest.js +43 -0
- package/dist/commands/suggest.js.map +1 -0
- package/dist/commands/sync.d.ts +23 -0
- package/dist/commands/sync.d.ts.map +1 -0
- package/dist/commands/sync.js +193 -0
- package/dist/commands/sync.js.map +1 -0
- package/dist/commands/verdict/index.d.ts +2 -0
- package/dist/commands/verdict/index.d.ts.map +1 -0
- package/dist/commands/verdict/index.js +11 -0
- package/dist/commands/verdict/index.js.map +1 -0
- package/dist/commands/verdict/record.d.ts +18 -0
- package/dist/commands/verdict/record.d.ts.map +1 -0
- package/dist/commands/verdict/record.js +60 -0
- package/dist/commands/verdict/record.js.map +1 -0
- package/dist/config.d.ts +96 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +246 -0
- package/dist/config.js.map +1 -0
- package/dist/context/pull.d.ts +40 -0
- package/dist/context/pull.d.ts.map +1 -0
- package/dist/context/pull.js +46 -0
- package/dist/context/pull.js.map +1 -0
- package/dist/dashboard-health.d.ts +20 -0
- package/dist/dashboard-health.d.ts.map +1 -0
- package/dist/dashboard-health.js +24 -0
- package/dist/dashboard-health.js.map +1 -0
- package/dist/eval-provider.d.ts +30 -0
- package/dist/eval-provider.d.ts.map +1 -0
- package/dist/eval-provider.js +359 -0
- package/dist/eval-provider.js.map +1 -0
- package/dist/eval-summary.d.ts +24 -0
- package/dist/eval-summary.d.ts.map +1 -0
- package/dist/eval-summary.js +30 -0
- package/dist/eval-summary.js.map +1 -0
- package/dist/feedback/extract.d.ts +6 -0
- package/dist/feedback/extract.d.ts.map +1 -0
- package/dist/feedback/extract.js +580 -0
- package/dist/feedback/extract.js.map +1 -0
- package/dist/http-retry.d.ts +23 -0
- package/dist/http-retry.d.ts.map +1 -0
- package/dist/http-retry.js +54 -0
- package/dist/http-retry.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +33 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/client.d.ts +70 -0
- package/dist/mcp/client.d.ts.map +1 -0
- package/dist/mcp/client.js +121 -0
- package/dist/mcp/client.js.map +1 -0
- package/dist/mcp/scope.d.ts +30 -0
- package/dist/mcp/scope.d.ts.map +1 -0
- package/dist/mcp/scope.js +64 -0
- package/dist/mcp/scope.js.map +1 -0
- package/dist/mcp/server.d.ts +57 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +427 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/write-items.d.ts +34 -0
- package/dist/mcp/write-items.d.ts.map +1 -0
- package/dist/mcp/write-items.js +59 -0
- package/dist/mcp/write-items.js.map +1 -0
- package/dist/rules/deletions-client.d.ts +16 -0
- package/dist/rules/deletions-client.d.ts.map +1 -0
- package/dist/rules/deletions-client.js +40 -0
- package/dist/rules/deletions-client.js.map +1 -0
- package/dist/rules/diff.d.ts +19 -0
- package/dist/rules/diff.d.ts.map +1 -0
- package/dist/rules/diff.js +36 -0
- package/dist/rules/diff.js.map +1 -0
- package/dist/rules/discover.d.ts +81 -0
- package/dist/rules/discover.d.ts.map +1 -0
- package/dist/rules/discover.js +307 -0
- package/dist/rules/discover.js.map +1 -0
- package/dist/rules/file-origin.d.ts +16 -0
- package/dist/rules/file-origin.d.ts.map +1 -0
- package/dist/rules/file-origin.js +31 -0
- package/dist/rules/file-origin.js.map +1 -0
- package/dist/rules/global-flag.d.ts +12 -0
- package/dist/rules/global-flag.d.ts.map +1 -0
- package/dist/rules/global-flag.js +15 -0
- package/dist/rules/global-flag.js.map +1 -0
- package/dist/rules/import-client.d.ts +37 -0
- package/dist/rules/import-client.d.ts.map +1 -0
- package/dist/rules/import-client.js +98 -0
- package/dist/rules/import-client.js.map +1 -0
- package/dist/rules/init-pull.d.ts +34 -0
- package/dist/rules/init-pull.d.ts.map +1 -0
- package/dist/rules/init-pull.js +43 -0
- package/dist/rules/init-pull.js.map +1 -0
- package/dist/rules/member-files-client.d.ts +17 -0
- package/dist/rules/member-files-client.d.ts.map +1 -0
- package/dist/rules/member-files-client.js +29 -0
- package/dist/rules/member-files-client.js.map +1 -0
- package/dist/rules/path-contains.d.ts +9 -0
- package/dist/rules/path-contains.d.ts.map +1 -0
- package/dist/rules/path-contains.js +17 -0
- package/dist/rules/path-contains.js.map +1 -0
- package/dist/rules/payload.d.ts +13 -0
- package/dist/rules/payload.d.ts.map +1 -0
- package/dist/rules/payload.js +35 -0
- package/dist/rules/payload.js.map +1 -0
- package/dist/rules/pull-bundle.d.ts +13 -0
- package/dist/rules/pull-bundle.d.ts.map +1 -0
- package/dist/rules/pull-bundle.js +32 -0
- package/dist/rules/pull-bundle.js.map +1 -0
- package/dist/rules/watch.d.ts +121 -0
- package/dist/rules/watch.d.ts.map +1 -0
- package/dist/rules/watch.js +457 -0
- package/dist/rules/watch.js.map +1 -0
- package/dist/skill-template.d.ts +19 -0
- package/dist/skill-template.d.ts.map +1 -0
- package/dist/skill-template.js +174 -0
- package/dist/skill-template.js.map +1 -0
- package/dist/sync-batches.d.ts +37 -0
- package/dist/sync-batches.d.ts.map +1 -0
- package/dist/sync-batches.js +67 -0
- package/dist/sync-batches.js.map +1 -0
- package/dist/sync-client.d.ts +22 -0
- package/dist/sync-client.d.ts.map +1 -0
- package/dist/sync-client.js +38 -0
- package/dist/sync-client.js.map +1 -0
- package/dist/sync-response.d.ts +23 -0
- package/dist/sync-response.d.ts.map +1 -0
- package/dist/sync-response.js +22 -0
- package/dist/sync-response.js.map +1 -0
- package/dist/token-verify.d.ts +14 -0
- package/dist/token-verify.d.ts.map +1 -0
- package/dist/token-verify.js +30 -0
- package/dist/token-verify.js.map +1 -0
- package/dist/usage/extract.d.ts +31 -0
- package/dist/usage/extract.d.ts.map +1 -0
- package/dist/usage/extract.js +200 -0
- package/dist/usage/extract.js.map +1 -0
- package/dist/usage/providers.d.ts +8 -0
- package/dist/usage/providers.d.ts.map +1 -0
- package/dist/usage/providers.js +23 -0
- package/dist/usage/providers.js.map +1 -0
- package/dist/verdict-queue.d.ts +50 -0
- package/dist/verdict-queue.d.ts.map +1 -0
- package/dist/verdict-queue.js +131 -0
- package/dist/verdict-queue.js.map +1 -0
- package/package.json +72 -0
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { defineCommand } from 'citty';
|
|
2
|
+
export const guidesCommand = defineCommand({
|
|
3
|
+
meta: {
|
|
4
|
+
name: 'guides',
|
|
5
|
+
description: 'Generate and manage project guides',
|
|
6
|
+
},
|
|
7
|
+
subCommands: {
|
|
8
|
+
project: () => import('./project.js').then((m) => m.guidesProjectCommand),
|
|
9
|
+
active: () => import('./active.js').then((m) => m.guidesActiveCommand),
|
|
10
|
+
search: () => import('./search.js').then((m) => m.guidesSearchCommand),
|
|
11
|
+
},
|
|
12
|
+
});
|
|
13
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/guides/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAA;AAErC,MAAM,CAAC,MAAM,aAAa,GAAG,aAAa,CAAC;IACzC,IAAI,EAAE;QACJ,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,oCAAoC;KAClD;IACD,WAAW,EAAE;QACX,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,oBAAoB,CAAC;QACzE,MAAM,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,mBAAmB,CAAC;QACtE,MAAM,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,mBAAmB,CAAC;KACvE;CACF,CAAC,CAAA"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export declare const guidesProjectCommand: import("citty").CommandDef<{
|
|
2
|
+
out: {
|
|
3
|
+
type: "string";
|
|
4
|
+
description: string;
|
|
5
|
+
default: string;
|
|
6
|
+
};
|
|
7
|
+
config: {
|
|
8
|
+
type: "string";
|
|
9
|
+
description: string;
|
|
10
|
+
default: string;
|
|
11
|
+
};
|
|
12
|
+
}>;
|
|
13
|
+
//# sourceMappingURL=project.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../../../src/commands/guides/project.ts"],"names":[],"mappings":"AA8BA,eAAO,MAAM,oBAAoB;;;;;;;;;;;EA2C/B,CAAA"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { readFile, readdir, stat, writeFile, mkdir } from 'node:fs/promises';
|
|
2
|
+
import { dirname, join, extname } from 'node:path';
|
|
3
|
+
import { renderAgentsMd, renderAgentsDir } from '@auden.to/projections';
|
|
4
|
+
import { parseAgentConfig } from '@auden.to/protocol';
|
|
5
|
+
import { defineCommand } from 'citty';
|
|
6
|
+
async function loadAgentConfigs(configPath) {
|
|
7
|
+
const s = await stat(configPath).catch(() => null);
|
|
8
|
+
if (!s)
|
|
9
|
+
throw new Error(`Config path does not exist: ${configPath}`);
|
|
10
|
+
let raw;
|
|
11
|
+
if (s.isDirectory()) {
|
|
12
|
+
const entries = await readdir(configPath);
|
|
13
|
+
const jsonFiles = entries.filter((f) => extname(f) === '.json');
|
|
14
|
+
const configs = [];
|
|
15
|
+
for (const file of jsonFiles) {
|
|
16
|
+
const content = await readFile(join(configPath, file), 'utf8');
|
|
17
|
+
configs.push(JSON.parse(content));
|
|
18
|
+
}
|
|
19
|
+
raw = configs;
|
|
20
|
+
}
|
|
21
|
+
else {
|
|
22
|
+
const content = await readFile(configPath, 'utf8');
|
|
23
|
+
raw = JSON.parse(content);
|
|
24
|
+
}
|
|
25
|
+
const entries = Array.isArray(raw) ? raw : [raw];
|
|
26
|
+
return entries.map((entry) => parseAgentConfig(entry));
|
|
27
|
+
}
|
|
28
|
+
export const guidesProjectCommand = defineCommand({
|
|
29
|
+
meta: {
|
|
30
|
+
name: 'project',
|
|
31
|
+
description: 'Generate project-level agent guide (AGENTS.md and .agents/)',
|
|
32
|
+
},
|
|
33
|
+
args: {
|
|
34
|
+
out: {
|
|
35
|
+
type: 'string',
|
|
36
|
+
description: 'Output path for AGENTS.md',
|
|
37
|
+
default: 'AGENTS.md',
|
|
38
|
+
},
|
|
39
|
+
config: {
|
|
40
|
+
type: 'string',
|
|
41
|
+
description: 'Path to agent config file or directory',
|
|
42
|
+
default: '.auden/',
|
|
43
|
+
},
|
|
44
|
+
},
|
|
45
|
+
async run({ args }) {
|
|
46
|
+
let agents;
|
|
47
|
+
try {
|
|
48
|
+
agents = await loadAgentConfigs(args.config);
|
|
49
|
+
}
|
|
50
|
+
catch (err) {
|
|
51
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
52
|
+
console.error(` Error: ${msg}`);
|
|
53
|
+
process.exit(1);
|
|
54
|
+
}
|
|
55
|
+
// Write AGENTS.md
|
|
56
|
+
const agentsMd = renderAgentsMd(agents);
|
|
57
|
+
await writeFile(args.out, agentsMd);
|
|
58
|
+
console.log(` wrote ${args.out} (${agents.length} agent(s))`);
|
|
59
|
+
// Write .agents/ directory next to AGENTS.md
|
|
60
|
+
const agentsDirPath = join(dirname(args.out), '.agents');
|
|
61
|
+
const agentsDir = renderAgentsDir(agents);
|
|
62
|
+
if (Object.keys(agentsDir).length > 0) {
|
|
63
|
+
await mkdir(agentsDirPath, { recursive: true });
|
|
64
|
+
for (const [filename, content] of Object.entries(agentsDir)) {
|
|
65
|
+
await writeFile(join(agentsDirPath, filename), content);
|
|
66
|
+
}
|
|
67
|
+
console.log(` wrote .agents/ (${Object.keys(agentsDir).length} files)`);
|
|
68
|
+
}
|
|
69
|
+
},
|
|
70
|
+
});
|
|
71
|
+
//# sourceMappingURL=project.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project.js","sourceRoot":"","sources":["../../../src/commands/guides/project.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../../src/commands/guides/search.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,mBAAmB;;;;;;EA8C9B,CAAA"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { readFile } from 'node:fs/promises';
|
|
2
|
+
import { parseGuideBundleResponse } from '@auden.to/protocol';
|
|
3
|
+
import { defineCommand } from 'citty';
|
|
4
|
+
import { AUDEN_GUIDES_FILE } from '../../auden-paths.js';
|
|
5
|
+
export const guidesSearchCommand = defineCommand({
|
|
6
|
+
meta: {
|
|
7
|
+
name: 'search',
|
|
8
|
+
description: 'Search active guides by keyword',
|
|
9
|
+
},
|
|
10
|
+
args: {
|
|
11
|
+
query: {
|
|
12
|
+
type: 'positional',
|
|
13
|
+
description: 'Search query',
|
|
14
|
+
required: true,
|
|
15
|
+
},
|
|
16
|
+
},
|
|
17
|
+
async run({ args }) {
|
|
18
|
+
let bundle;
|
|
19
|
+
try {
|
|
20
|
+
const raw = await readFile(AUDEN_GUIDES_FILE, 'utf8');
|
|
21
|
+
bundle = parseGuideBundleResponse(JSON.parse(raw));
|
|
22
|
+
}
|
|
23
|
+
catch (err) {
|
|
24
|
+
if (err.code === 'ENOENT') {
|
|
25
|
+
console.log(' No guides cache found. Run "auden sync" to pull the latest guides.');
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
console.log(' Guides cache is unreadable — run "auden sync" to refresh.');
|
|
29
|
+
}
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
const q = args.query.toLowerCase();
|
|
33
|
+
const matches = bundle.guides.filter((g) => g.enabled &&
|
|
34
|
+
(g.title.toLowerCase().includes(q) || g.content.toLowerCase().includes(q)));
|
|
35
|
+
if (matches.length === 0) {
|
|
36
|
+
console.log(` No guides match "${args.query}".`);
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
console.log(`Guides matching "${args.query}" (${matches.length}):`);
|
|
40
|
+
for (const guide of matches) {
|
|
41
|
+
console.log(`\n [${guide.title}]`);
|
|
42
|
+
console.log(` ${guide.content}`);
|
|
43
|
+
}
|
|
44
|
+
},
|
|
45
|
+
});
|
|
46
|
+
//# sourceMappingURL=search.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search.js","sourceRoot":"","sources":["../../../src/commands/guides/search.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAE3C,OAAO,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAA;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAA;AAErC,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;AAExD,MAAM,CAAC,MAAM,mBAAmB,GAAG,aAAa,CAAC;IAC/C,IAAI,EAAE;QACJ,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,iCAAiC;KAC/C;IACD,IAAI,EAAE;QACJ,KAAK,EAAE;YACL,IAAI,EAAE,YAAY;YAClB,WAAW,EAAE,cAAc;YAC3B,QAAQ,EAAE,IAAI;SACf;KACF;IACD,KAAK,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE;QAChB,IAAI,MAAmD,CAAA;QACvD,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAA;YACrD,MAAM,GAAG,wBAAwB,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAA;QACpD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAK,GAA6B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACrD,OAAO,CAAC,GAAG,CACT,sEAAsE,CACvE,CAAA;YACH,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,6DAA6D,CAAC,CAAA;YAC5E,CAAC;YACD,OAAM;QACR,CAAC;QAED,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAA;QAClC,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAClC,CAAC,CAAuD,EAAE,EAAE,CAC1D,CAAC,CAAC,OAAO;YACT,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAC7E,CAAA;QAED,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,OAAO,CAAC,GAAG,CAAC,sBAAsB,IAAI,CAAC,KAAK,IAAI,CAAC,CAAA;YACjD,OAAM;QACR,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,CAAC,KAAK,MAAM,OAAO,CAAC,MAAM,IAAI,CAAC,CAAA;QACnE,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,CAAC,KAAK,GAAG,CAAC,CAAA;YACnC,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC,CAAA;QACnC,CAAC;IACH,CAAC;CACF,CAAC,CAAA"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
export declare const initCommand: import("citty").CommandDef<{
|
|
2
|
+
force: {
|
|
3
|
+
type: "boolean";
|
|
4
|
+
description: string;
|
|
5
|
+
default: false;
|
|
6
|
+
};
|
|
7
|
+
'no-skill': {
|
|
8
|
+
type: "boolean";
|
|
9
|
+
description: string;
|
|
10
|
+
default: false;
|
|
11
|
+
};
|
|
12
|
+
'no-eval-hook': {
|
|
13
|
+
type: "boolean";
|
|
14
|
+
description: string;
|
|
15
|
+
default: false;
|
|
16
|
+
};
|
|
17
|
+
'no-prompt': {
|
|
18
|
+
type: "boolean";
|
|
19
|
+
description: string;
|
|
20
|
+
default: false;
|
|
21
|
+
};
|
|
22
|
+
'pull-guides': {
|
|
23
|
+
type: "boolean";
|
|
24
|
+
description: string;
|
|
25
|
+
default: false;
|
|
26
|
+
};
|
|
27
|
+
'no-pull-guides': {
|
|
28
|
+
type: "boolean";
|
|
29
|
+
description: string;
|
|
30
|
+
default: false;
|
|
31
|
+
};
|
|
32
|
+
'dashboard-url': {
|
|
33
|
+
type: "string";
|
|
34
|
+
description: string;
|
|
35
|
+
default: string;
|
|
36
|
+
};
|
|
37
|
+
token: {
|
|
38
|
+
type: "string";
|
|
39
|
+
description: string;
|
|
40
|
+
default: string;
|
|
41
|
+
};
|
|
42
|
+
}>;
|
|
43
|
+
//# sourceMappingURL=init.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AA8EA,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA4atB,CAAA"}
|
|
@@ -0,0 +1,436 @@
|
|
|
1
|
+
import { mkdir, writeFile, readFile, access, chmod } from 'node:fs/promises';
|
|
2
|
+
import { homedir } from 'node:os';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
import { createInterface } from 'node:readline/promises';
|
|
5
|
+
import { PROTOCOL_VERSION } from '@auden.to/protocol';
|
|
6
|
+
import { defineCommand } from 'citty';
|
|
7
|
+
import { AUDEN_CONFIG, AUDEN_HOOKS_DIR, AUDEN_HOOK_SCRIPT, AUDEN_HOME, AUDEN_RUNS_DIR, } from '../auden-paths.js';
|
|
8
|
+
import { AUDEN_CONFIG_MODE, DEFAULT_DASHBOARD_URL, ensureAudenDir, normalizeDashboardUrl, readConfigDashboardUrl, readConfigDiscoverGlobal, readConfigToken, resolveDashboardUrl, writeConfigDashboardUrl, writeConfigDiscoverGlobal, writeConfigToken, } from '../config.js';
|
|
9
|
+
import { DEFAULT_EVAL_PROVIDER, DEFAULT_OPENROUTER_MODEL } from '../eval-provider.js';
|
|
10
|
+
import { discoverGuideFiles } from '../rules/discover.js';
|
|
11
|
+
import { pullGuidesIntoRepo } from '../rules/init-pull.js';
|
|
12
|
+
import { BUNDLED_SKILLS } from '../skill-template.js';
|
|
13
|
+
import { verifyDashboardToken } from '../token-verify.js';
|
|
14
|
+
const HOOK_SCRIPT = `#!/usr/bin/env node
|
|
15
|
+
/**
|
|
16
|
+
* Auden PostToolUse hook — logs agent actions to ~/.auden/runs/<session_id>.jsonl
|
|
17
|
+
* Always exits 0 so it never blocks the agent.
|
|
18
|
+
*/
|
|
19
|
+
import { appendFileSync, mkdirSync } from 'node:fs'
|
|
20
|
+
import { homedir } from 'node:os'
|
|
21
|
+
import { join } from 'node:path'
|
|
22
|
+
|
|
23
|
+
let body = ''
|
|
24
|
+
process.stdin.setEncoding('utf8')
|
|
25
|
+
process.stdin.on('data', (chunk) => { body += chunk })
|
|
26
|
+
process.stdin.on('end', () => {
|
|
27
|
+
try {
|
|
28
|
+
const event = JSON.parse(body)
|
|
29
|
+
const sessionId = event.session_id ?? 'unknown'
|
|
30
|
+
const toolName = event.tool_name ?? 'unknown'
|
|
31
|
+
const toolInput = event.tool_input ?? {}
|
|
32
|
+
|
|
33
|
+
const entry = {
|
|
34
|
+
timestamp: new Date().toISOString(),
|
|
35
|
+
sessionId,
|
|
36
|
+
toolName,
|
|
37
|
+
filePath: toolInput.file_path ?? toolInput.path ?? undefined,
|
|
38
|
+
command: toolInput.command ?? undefined,
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
const runsDir = join(homedir(), '.auden', 'runs')
|
|
42
|
+
mkdirSync(runsDir, { recursive: true })
|
|
43
|
+
appendFileSync(join(runsDir, \`\${sessionId}.jsonl\`), JSON.stringify(entry) + '\\n')
|
|
44
|
+
} catch {
|
|
45
|
+
// Never block the agent
|
|
46
|
+
}
|
|
47
|
+
process.exit(0)
|
|
48
|
+
})
|
|
49
|
+
`;
|
|
50
|
+
const AGENTS_MD_TEMPLATE = `# AGENTS.md
|
|
51
|
+
|
|
52
|
+
## Rules
|
|
53
|
+
|
|
54
|
+
<!-- Add rules below. \`auden eval\` checks agent actions against these. -->
|
|
55
|
+
`;
|
|
56
|
+
export const initCommand = defineCommand({
|
|
57
|
+
meta: {
|
|
58
|
+
name: 'init',
|
|
59
|
+
description: 'Set up auden: install action logging hook and create AGENTS.md',
|
|
60
|
+
},
|
|
61
|
+
args: {
|
|
62
|
+
force: {
|
|
63
|
+
type: 'boolean',
|
|
64
|
+
description: 'Overwrite existing ~/.auden/config.json, AGENTS.md, and .claude/skills/; ensure .agents/ exists',
|
|
65
|
+
default: false,
|
|
66
|
+
},
|
|
67
|
+
'no-skill': {
|
|
68
|
+
type: 'boolean',
|
|
69
|
+
description: 'Skip writing the Claude Code skills to .claude/skills/',
|
|
70
|
+
default: false,
|
|
71
|
+
},
|
|
72
|
+
'no-eval-hook': {
|
|
73
|
+
type: 'boolean',
|
|
74
|
+
description: 'Skip registering the Claude Code Stop hook that runs "auden eval" at session end',
|
|
75
|
+
default: false,
|
|
76
|
+
},
|
|
77
|
+
'no-prompt': {
|
|
78
|
+
type: 'boolean',
|
|
79
|
+
description: 'Skip interactive prompts (e.g. the global rule discovery question)',
|
|
80
|
+
default: false,
|
|
81
|
+
},
|
|
82
|
+
'pull-guides': {
|
|
83
|
+
type: 'boolean',
|
|
84
|
+
description: 'Pull your guides from the dashboard into this repo without prompting (requires a token)',
|
|
85
|
+
default: false,
|
|
86
|
+
},
|
|
87
|
+
'no-pull-guides': {
|
|
88
|
+
type: 'boolean',
|
|
89
|
+
description: 'Never offer to pull guides from the dashboard into this repo',
|
|
90
|
+
default: false,
|
|
91
|
+
},
|
|
92
|
+
'dashboard-url': {
|
|
93
|
+
type: 'string',
|
|
94
|
+
description: 'Dashboard base URL to persist in ~/.auden/config.json (default: prompt, fall back to ' +
|
|
95
|
+
DEFAULT_DASHBOARD_URL +
|
|
96
|
+
')',
|
|
97
|
+
default: '',
|
|
98
|
+
},
|
|
99
|
+
token: {
|
|
100
|
+
type: 'string',
|
|
101
|
+
description: 'Optional dashboard API token to persist in ~/.auden/config.json — everything local works without one; needed only to sync with the dashboard (can also be set later via `auden sync --token`)',
|
|
102
|
+
default: '',
|
|
103
|
+
},
|
|
104
|
+
},
|
|
105
|
+
async run({ args }) {
|
|
106
|
+
const cwd = process.cwd();
|
|
107
|
+
// 1. Global config + runs dir
|
|
108
|
+
// ~/.auden/ holds the bearer token in config.json — owner-only
|
|
109
|
+
// permissions on both the directory and the file.
|
|
110
|
+
await ensureAudenDir(AUDEN_HOME);
|
|
111
|
+
await mkdir(AUDEN_RUNS_DIR, { recursive: true });
|
|
112
|
+
const config = {
|
|
113
|
+
platform: 'claude_code',
|
|
114
|
+
protocolVersion: PROTOCOL_VERSION,
|
|
115
|
+
eval: {
|
|
116
|
+
provider: DEFAULT_EVAL_PROVIDER,
|
|
117
|
+
model: DEFAULT_OPENROUTER_MODEL,
|
|
118
|
+
},
|
|
119
|
+
};
|
|
120
|
+
const configExists = await access(AUDEN_CONFIG)
|
|
121
|
+
.then(() => true)
|
|
122
|
+
.catch(() => false);
|
|
123
|
+
if (configExists && !args.force) {
|
|
124
|
+
console.log(' ~/.auden/config.json already exists — reused (use --force to overwrite)');
|
|
125
|
+
await chmod(AUDEN_CONFIG, AUDEN_CONFIG_MODE).catch(() => { });
|
|
126
|
+
}
|
|
127
|
+
else {
|
|
128
|
+
await writeFile(AUDEN_CONFIG, JSON.stringify(config, null, 2) + '\n', {
|
|
129
|
+
mode: AUDEN_CONFIG_MODE,
|
|
130
|
+
});
|
|
131
|
+
await chmod(AUDEN_CONFIG, AUDEN_CONFIG_MODE).catch(() => { });
|
|
132
|
+
console.log(configExists ? ' updated ~/.auden/config.json' : ' created ~/.auden/config.json');
|
|
133
|
+
}
|
|
134
|
+
// 1b. Dashboard URL. Persisted into the same config so subsequent
|
|
135
|
+
// commands resolve flag → config → baked default in a single helper.
|
|
136
|
+
// normalizeDashboardUrl strips paths/queries/whitespace so e.g.
|
|
137
|
+
// "https://app.auden.to/some/path " collapses to origin only.
|
|
138
|
+
const flagDashboardUrl = normalizeDashboardUrl(args['dashboard-url']);
|
|
139
|
+
if (args['dashboard-url'].trim() && !flagDashboardUrl) {
|
|
140
|
+
throw new Error(`--dashboard-url is not a valid http(s) URL: ${args['dashboard-url']}`);
|
|
141
|
+
}
|
|
142
|
+
const existingDashboardUrl = await readConfigDashboardUrl().catch(() => '');
|
|
143
|
+
if (flagDashboardUrl) {
|
|
144
|
+
await writeConfigDashboardUrl(flagDashboardUrl);
|
|
145
|
+
console.log(` ~/.auden/config.json: dashboardUrl = ${flagDashboardUrl}`);
|
|
146
|
+
}
|
|
147
|
+
else if (existingDashboardUrl) {
|
|
148
|
+
console.log(` ~/.auden/config.json: dashboardUrl = ${existingDashboardUrl} (pass --dashboard-url to change)`);
|
|
149
|
+
}
|
|
150
|
+
else if (args['no-prompt'] || !process.stdin.isTTY) {
|
|
151
|
+
console.log(` ~/.auden/config.json: dashboardUrl unset — runtime falls back to ${DEFAULT_DASHBOARD_URL}`);
|
|
152
|
+
}
|
|
153
|
+
else {
|
|
154
|
+
const rl = createInterface({ input: process.stdin, output: process.stdout });
|
|
155
|
+
try {
|
|
156
|
+
const raw = await rl.question(`\nDashboard URL [${DEFAULT_DASHBOARD_URL}]: `);
|
|
157
|
+
const normalized = normalizeDashboardUrl(raw);
|
|
158
|
+
let chosen;
|
|
159
|
+
if (!raw.trim()) {
|
|
160
|
+
chosen = DEFAULT_DASHBOARD_URL;
|
|
161
|
+
}
|
|
162
|
+
else if (!normalized) {
|
|
163
|
+
console.warn(` warning: "${raw.trim()}" is not a valid http(s) URL — using ${DEFAULT_DASHBOARD_URL}`);
|
|
164
|
+
chosen = DEFAULT_DASHBOARD_URL;
|
|
165
|
+
}
|
|
166
|
+
else {
|
|
167
|
+
chosen = normalized;
|
|
168
|
+
}
|
|
169
|
+
await writeConfigDashboardUrl(chosen);
|
|
170
|
+
console.log(` ~/.auden/config.json: dashboardUrl = ${chosen}`);
|
|
171
|
+
}
|
|
172
|
+
finally {
|
|
173
|
+
rl.close();
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
// 1c. Optional token. Init never needs one itself — everything it does is
|
|
177
|
+
// local — but persisting a token here means the first `auden sync`
|
|
178
|
+
// just works. Verified against the dashboard when reachable; a token
|
|
179
|
+
// the server outright rejects is not stored, while an unreachable
|
|
180
|
+
// server stores it unverified so offline/CI init still works.
|
|
181
|
+
if (args.token.trim()) {
|
|
182
|
+
const verifyUrl = await resolveDashboardUrl();
|
|
183
|
+
const verification = await verifyDashboardToken(verifyUrl, args.token.trim());
|
|
184
|
+
if (verification === 'rejected') {
|
|
185
|
+
console.warn(` warning: token rejected by ${verifyUrl} — not stored. Check it and run \`auden sync --token <token>\`.`);
|
|
186
|
+
}
|
|
187
|
+
else {
|
|
188
|
+
await writeConfigToken(args.token);
|
|
189
|
+
console.log(verification === 'ok'
|
|
190
|
+
? ' ~/.auden/config.json: token verified and stored'
|
|
191
|
+
: ` ~/.auden/config.json: token stored (could not reach ${verifyUrl} to verify)`);
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
// 2. Hook script
|
|
195
|
+
await mkdir(AUDEN_HOOKS_DIR, { recursive: true });
|
|
196
|
+
await writeFile(AUDEN_HOOK_SCRIPT, HOOK_SCRIPT);
|
|
197
|
+
await chmod(AUDEN_HOOK_SCRIPT, 0o755);
|
|
198
|
+
console.log(' installed ~/.auden/hooks/log-action.mjs');
|
|
199
|
+
// 3. Claude Code hooks in .claude/settings.json
|
|
200
|
+
const claudeDir = join(cwd, '.claude');
|
|
201
|
+
const settingsPath = join(claudeDir, 'settings.json');
|
|
202
|
+
const audenHookEntry = {
|
|
203
|
+
type: 'command',
|
|
204
|
+
// JSON.stringify safely quotes/escapes paths (e.g. home directories with spaces).
|
|
205
|
+
command: `node ${JSON.stringify(AUDEN_HOOK_SCRIPT)}`,
|
|
206
|
+
timeout: 5,
|
|
207
|
+
};
|
|
208
|
+
try {
|
|
209
|
+
await mkdir(claudeDir, { recursive: true });
|
|
210
|
+
let settings = {};
|
|
211
|
+
let skipHookMerge = false;
|
|
212
|
+
try {
|
|
213
|
+
const raw = await readFile(settingsPath, 'utf8');
|
|
214
|
+
settings = JSON.parse(raw);
|
|
215
|
+
}
|
|
216
|
+
catch (err) {
|
|
217
|
+
if (err.code !== 'ENOENT') {
|
|
218
|
+
console.warn(' warning: .claude/settings.json is malformed — skipping hook merge');
|
|
219
|
+
skipHookMerge = true;
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
if (!skipHookMerge) {
|
|
223
|
+
if (!settings['hooks'])
|
|
224
|
+
settings['hooks'] = {};
|
|
225
|
+
const hooks = settings['hooks'];
|
|
226
|
+
let settingsChanged = false;
|
|
227
|
+
// PostToolUse: action logger
|
|
228
|
+
if (!Array.isArray(hooks['PostToolUse']))
|
|
229
|
+
hooks['PostToolUse'] = [];
|
|
230
|
+
const postToolUse = hooks['PostToolUse'];
|
|
231
|
+
const loggerInstalled = postToolUse.some((group) => {
|
|
232
|
+
const groupHooks = group['hooks'];
|
|
233
|
+
return (Array.isArray(groupHooks) &&
|
|
234
|
+
groupHooks.some((h) => typeof h === 'object' &&
|
|
235
|
+
h !== null &&
|
|
236
|
+
h['command']
|
|
237
|
+
?.toString()
|
|
238
|
+
.includes('log-action.mjs')));
|
|
239
|
+
});
|
|
240
|
+
if (!loggerInstalled) {
|
|
241
|
+
postToolUse.push({ hooks: [audenHookEntry] });
|
|
242
|
+
settingsChanged = true;
|
|
243
|
+
console.log(' updated .claude/settings.json with PostToolUse hook');
|
|
244
|
+
}
|
|
245
|
+
else {
|
|
246
|
+
console.log(' .claude/settings.json already has auden PostToolUse hook — skipped');
|
|
247
|
+
}
|
|
248
|
+
// Stop: session-end eval (skipped when --no-eval-hook)
|
|
249
|
+
if (!args['no-eval-hook']) {
|
|
250
|
+
if (!Array.isArray(hooks['Stop']))
|
|
251
|
+
hooks['Stop'] = [];
|
|
252
|
+
const stop = hooks['Stop'];
|
|
253
|
+
const evalInstalled = stop.some((group) => {
|
|
254
|
+
const groupHooks = group['hooks'];
|
|
255
|
+
return (Array.isArray(groupHooks) &&
|
|
256
|
+
groupHooks.some((h) => typeof h === 'object' &&
|
|
257
|
+
h !== null &&
|
|
258
|
+
h['command']
|
|
259
|
+
?.toString()
|
|
260
|
+
.includes('auden eval')));
|
|
261
|
+
});
|
|
262
|
+
if (!evalInstalled) {
|
|
263
|
+
stop.push({
|
|
264
|
+
hooks: [{ type: 'command', command: 'auden eval', timeout: 30 }],
|
|
265
|
+
});
|
|
266
|
+
settingsChanged = true;
|
|
267
|
+
console.log(' updated .claude/settings.json with Stop hook (auden eval)');
|
|
268
|
+
}
|
|
269
|
+
else {
|
|
270
|
+
console.log(' .claude/settings.json already has auden Stop hook — skipped');
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
if (settingsChanged) {
|
|
274
|
+
await writeFile(settingsPath, JSON.stringify(settings, null, 2) + '\n');
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
catch {
|
|
279
|
+
console.warn(' warning: could not update .claude/settings.json');
|
|
280
|
+
}
|
|
281
|
+
// 4. AGENTS.md
|
|
282
|
+
const agentsMdPath = join(cwd, 'AGENTS.md');
|
|
283
|
+
const agentsMdExists = await access(agentsMdPath)
|
|
284
|
+
.then(() => true)
|
|
285
|
+
.catch(() => false);
|
|
286
|
+
if (agentsMdExists && !args.force) {
|
|
287
|
+
console.log(' AGENTS.md already exists — skipped (use --force to overwrite)');
|
|
288
|
+
}
|
|
289
|
+
else {
|
|
290
|
+
await writeFile(agentsMdPath, AGENTS_MD_TEMPLATE);
|
|
291
|
+
console.log(' created AGENTS.md');
|
|
292
|
+
}
|
|
293
|
+
// 5. .agents/
|
|
294
|
+
const agentsDirPath = join(cwd, '.agents');
|
|
295
|
+
const agentsDirExists = await access(agentsDirPath)
|
|
296
|
+
.then(() => true)
|
|
297
|
+
.catch(() => false);
|
|
298
|
+
if (agentsDirExists && !args.force) {
|
|
299
|
+
console.log(' .agents/ already exists — skipped (use --force to overwrite)');
|
|
300
|
+
}
|
|
301
|
+
else {
|
|
302
|
+
await mkdir(agentsDirPath, { recursive: true });
|
|
303
|
+
await writeFile(join(agentsDirPath, '.gitkeep'), '');
|
|
304
|
+
console.log(' created .agents/');
|
|
305
|
+
}
|
|
306
|
+
// 6. Claude Code skills (auden + context-layer round-trip skills)
|
|
307
|
+
if (!args['no-skill']) {
|
|
308
|
+
for (const skill of BUNDLED_SKILLS) {
|
|
309
|
+
const rel = `.claude/skills/${skill.name}/SKILL.md`;
|
|
310
|
+
const skillDir = join(cwd, '.claude', 'skills', skill.name);
|
|
311
|
+
const skillPath = join(skillDir, 'SKILL.md');
|
|
312
|
+
try {
|
|
313
|
+
const skillExists = await access(skillPath)
|
|
314
|
+
.then(() => true)
|
|
315
|
+
.catch(() => false);
|
|
316
|
+
if (skillExists && !args.force) {
|
|
317
|
+
console.log(` ${rel} already exists — skipped (use --force to overwrite)`);
|
|
318
|
+
}
|
|
319
|
+
else {
|
|
320
|
+
await mkdir(skillDir, { recursive: true });
|
|
321
|
+
await writeFile(skillPath, skill.content);
|
|
322
|
+
console.log(` created ${rel}`);
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
catch (err) {
|
|
326
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
327
|
+
console.warn(` warning: could not write ${rel} — ${message}`);
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
// 7. Optional: ask whether to enable global rule discovery
|
|
332
|
+
if (!args['no-prompt'] && process.stdin.isTTY) {
|
|
333
|
+
const alreadyEnabled = await readConfigDiscoverGlobal().catch(() => false);
|
|
334
|
+
if (alreadyEnabled) {
|
|
335
|
+
console.log(' ~/.auden/config.json: discoverGlobal already enabled — skipping prompt');
|
|
336
|
+
console.log(' (pass `auden rules import --no-global` to skip globals for one run)');
|
|
337
|
+
}
|
|
338
|
+
else {
|
|
339
|
+
const home = homedir();
|
|
340
|
+
const allFiles = await discoverGuideFiles({ cwd, global: true, homedir: home });
|
|
341
|
+
const globalFiles = allFiles.filter((f) => f.displayPath.startsWith('~/'));
|
|
342
|
+
if (globalFiles.length > 0) {
|
|
343
|
+
const summary = globalFiles.map((f) => f.displayPath).join(', ');
|
|
344
|
+
const rl = createInterface({ input: process.stdin, output: process.stdout });
|
|
345
|
+
try {
|
|
346
|
+
const answer = (await rl.question(`\nFound global rule file(s): ${summary}\n` +
|
|
347
|
+
'Scan global config by default during "auden rules import"? [y/N] '))
|
|
348
|
+
.trim()
|
|
349
|
+
.toLowerCase();
|
|
350
|
+
if (answer === 'y' || answer === 'yes') {
|
|
351
|
+
try {
|
|
352
|
+
await writeConfigDiscoverGlobal(true);
|
|
353
|
+
console.log(' ~/.auden/config.json: discoverGlobal = true');
|
|
354
|
+
}
|
|
355
|
+
catch (err) {
|
|
356
|
+
console.warn(` warning: could not persist discoverGlobal — ${err instanceof Error ? err.message : String(err)}`);
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
finally {
|
|
361
|
+
rl.close();
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
const storedToken = await readConfigToken().catch(() => '');
|
|
367
|
+
const hasToken = Boolean(storedToken);
|
|
368
|
+
// 8. Optional: pull the user's guides into this repo so a fresh project
|
|
369
|
+
// starts with their accumulated setup rather than cold. Needs a token —
|
|
370
|
+
// everything above is local; this is the one step that talks to the
|
|
371
|
+
// dashboard. Forced with --pull-guides, suppressed with --no-pull-guides
|
|
372
|
+
// or --no-prompt, otherwise offered interactively.
|
|
373
|
+
if (hasToken && !args['no-pull-guides']) {
|
|
374
|
+
const interactive = !args['no-prompt'] && process.stdin.isTTY === true;
|
|
375
|
+
let shouldPull = args['pull-guides'];
|
|
376
|
+
if (!shouldPull && interactive) {
|
|
377
|
+
const rl = createInterface({ input: process.stdin, output: process.stdout });
|
|
378
|
+
try {
|
|
379
|
+
const answer = (await rl.question('\nPull your guides from the dashboard into this repo now? [Y/n] '))
|
|
380
|
+
.trim()
|
|
381
|
+
.toLowerCase();
|
|
382
|
+
shouldPull = answer === '' || answer === 'y' || answer === 'yes';
|
|
383
|
+
}
|
|
384
|
+
finally {
|
|
385
|
+
rl.close();
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
if (shouldPull) {
|
|
389
|
+
const dashboardUrl = await resolveDashboardUrl();
|
|
390
|
+
try {
|
|
391
|
+
const result = await pullGuidesIntoRepo({
|
|
392
|
+
cwd,
|
|
393
|
+
dashboardUrl,
|
|
394
|
+
token: storedToken,
|
|
395
|
+
color: process.stdout.isTTY === true,
|
|
396
|
+
onPull: (count, target) => {
|
|
397
|
+
console.log(` Pulled ${count} guide(s) from ${dashboardUrl} → ${target}`);
|
|
398
|
+
},
|
|
399
|
+
});
|
|
400
|
+
if (result.written > 0) {
|
|
401
|
+
const parts = [`wrote ${result.written} guide file(s)`];
|
|
402
|
+
if (result.unchanged > 0)
|
|
403
|
+
parts.push(`${result.unchanged} unchanged`);
|
|
404
|
+
if (result.declined > 0)
|
|
405
|
+
parts.push(`${result.declined} declined`);
|
|
406
|
+
console.log(` ${parts.join('; ')}`);
|
|
407
|
+
}
|
|
408
|
+
else if (result.pulledCount === 0) {
|
|
409
|
+
console.log(' No guides on the dashboard yet — nothing to pull.');
|
|
410
|
+
}
|
|
411
|
+
else if (result.plans.length === 0) {
|
|
412
|
+
console.log(' No file-backed guides to restore into this repo.');
|
|
413
|
+
}
|
|
414
|
+
else {
|
|
415
|
+
console.log(' Guides already up to date — nothing to write.');
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
catch (err) {
|
|
419
|
+
console.warn(` warning: could not pull guides — ${err instanceof Error ? err.message : String(err)}`);
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
console.log('\nDone. Next steps:');
|
|
424
|
+
console.log(' Edit AGENTS.md to add your rules');
|
|
425
|
+
if (hasToken) {
|
|
426
|
+
console.log(' auden sync — pull active guides and push any queued verdicts');
|
|
427
|
+
}
|
|
428
|
+
else {
|
|
429
|
+
console.log(' auden sync --token <token> — connect your dashboard (Settings → Developer → CLI Token); remembered after the first run');
|
|
430
|
+
}
|
|
431
|
+
console.log(' auden guides active — list cached guides');
|
|
432
|
+
console.log(' auden doctor — verify your environment');
|
|
433
|
+
console.log(' auden eval — evaluate the most recent agent run (also runs at session end via Stop hook)');
|
|
434
|
+
},
|
|
435
|
+
});
|
|
436
|
+
//# sourceMappingURL=init.js.map
|