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,36 @@
|
|
|
1
|
+
import { createTwoFilesPatch } from 'diff';
|
|
2
|
+
const RED = '\x1b[31m';
|
|
3
|
+
const GREEN = '\x1b[32m';
|
|
4
|
+
const CYAN = '\x1b[36m';
|
|
5
|
+
const DIM = '\x1b[2m';
|
|
6
|
+
const RESET = '\x1b[0m';
|
|
7
|
+
/**
|
|
8
|
+
* Render a unified diff between `oldContent` and `newContent` for `filePath`.
|
|
9
|
+
*
|
|
10
|
+
* Wraps `diff.createTwoFilesPatch` and optionally applies ANSI colors so the
|
|
11
|
+
* output matches what users expect from `git diff`. Trailing blank lines from
|
|
12
|
+
* `createTwoFilesPatch` are trimmed so callers can append directly.
|
|
13
|
+
*/
|
|
14
|
+
export function formatUnifiedDiff(oldContent, newContent, filePath, options = {}) {
|
|
15
|
+
const patch = createTwoFilesPatch(filePath, filePath, oldContent, newContent, options.oldHeader ?? 'on disk', options.newHeader ?? 'incoming', { context: options.context ?? 3 }).replace(/\n+$/, '');
|
|
16
|
+
if (!options.color)
|
|
17
|
+
return patch;
|
|
18
|
+
return patch.split('\n').map(colorizeLine).join('\n');
|
|
19
|
+
}
|
|
20
|
+
function colorizeLine(line) {
|
|
21
|
+
if (line.startsWith('+++') || line.startsWith('---'))
|
|
22
|
+
return `${CYAN}${line}${RESET}`;
|
|
23
|
+
if (line.startsWith('@@'))
|
|
24
|
+
return `${CYAN}${line}${RESET}`;
|
|
25
|
+
if (line.startsWith('==='))
|
|
26
|
+
return `${DIM}${line}${RESET}`;
|
|
27
|
+
// The patch header diff also starts with "Index:" on jsdiff; treat similarly.
|
|
28
|
+
if (line.startsWith('Index:'))
|
|
29
|
+
return `${DIM}${line}${RESET}`;
|
|
30
|
+
if (line.startsWith('+'))
|
|
31
|
+
return `${GREEN}${line}${RESET}`;
|
|
32
|
+
if (line.startsWith('-'))
|
|
33
|
+
return `${RED}${line}${RESET}`;
|
|
34
|
+
return line;
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=diff.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diff.js","sourceRoot":"","sources":["../../src/rules/diff.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,MAAM,CAAA;AAE1C,MAAM,GAAG,GAAG,UAAU,CAAA;AACtB,MAAM,KAAK,GAAG,UAAU,CAAA;AACxB,MAAM,IAAI,GAAG,UAAU,CAAA;AACvB,MAAM,GAAG,GAAG,SAAS,CAAA;AACrB,MAAM,KAAK,GAAG,SAAS,CAAA;AAavB;;;;;;GAMG;AACH,MAAM,UAAU,iBAAiB,CAC/B,UAAkB,EAClB,UAAkB,EAClB,QAAgB,EAChB,UAAoC,EAAE;IAEtC,MAAM,KAAK,GAAG,mBAAmB,CAC/B,QAAQ,EACR,QAAQ,EACR,UAAU,EACV,UAAU,EACV,OAAO,CAAC,SAAS,IAAI,SAAS,EAC9B,OAAO,CAAC,SAAS,IAAI,UAAU,EAC/B,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,CAAC,EAAE,CAClC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAA;IAErB,IAAI,CAAC,OAAO,CAAC,KAAK;QAAE,OAAO,KAAK,CAAA;IAEhC,OAAO,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACvD,CAAC;AAED,SAAS,YAAY,CAAC,IAAY;IAChC,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC;QAAE,OAAO,GAAG,IAAI,GAAG,IAAI,GAAG,KAAK,EAAE,CAAA;IACrF,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,GAAG,IAAI,GAAG,IAAI,GAAG,KAAK,EAAE,CAAA;IAC1D,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC;QAAE,OAAO,GAAG,GAAG,GAAG,IAAI,GAAG,KAAK,EAAE,CAAA;IAC1D,8EAA8E;IAC9E,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO,GAAG,GAAG,GAAG,IAAI,GAAG,KAAK,EAAE,CAAA;IAC7D,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,GAAG,KAAK,GAAG,IAAI,GAAG,KAAK,EAAE,CAAA;IAC1D,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,GAAG,GAAG,GAAG,IAAI,GAAG,KAAK,EAAE,CAAA;IACxD,OAAO,IAAI,CAAA;AACb,CAAC"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import type { GuideFileFormat } from '@auden.to/protocol';
|
|
2
|
+
export type DiscoveredSkillMember = {
|
|
3
|
+
/** Path relative to the skill's directory (posix separators). */
|
|
4
|
+
path: string;
|
|
5
|
+
rawContent: string;
|
|
6
|
+
lastModified: number;
|
|
7
|
+
contentHash: string;
|
|
8
|
+
};
|
|
9
|
+
export type DiscoveredGuideFile = {
|
|
10
|
+
/** Absolute path on disk. Used for reading and as a stable dedupe key. */
|
|
11
|
+
absolutePath: string;
|
|
12
|
+
/** Path emitted in the import payload — relative to the discovery root. */
|
|
13
|
+
payloadPath: string;
|
|
14
|
+
/** Path shown to the user in the preview list. */
|
|
15
|
+
displayPath: string;
|
|
16
|
+
format: GuideFileFormat;
|
|
17
|
+
rawContent: string;
|
|
18
|
+
lastModified: number;
|
|
19
|
+
contentHash: string;
|
|
20
|
+
/**
|
|
21
|
+
* Present only on `skill-md` files: the skill directory's other files
|
|
22
|
+
* (scripts/, references/, assets/, supporting docs), paths relative to the
|
|
23
|
+
* skill directory. `[]` means the skill has no member files — the server
|
|
24
|
+
* treats the array as the authoritative member list, so it must always be
|
|
25
|
+
* set when the directory was actually scanned (watch events, which see one
|
|
26
|
+
* file at a time, leave it undefined instead).
|
|
27
|
+
*/
|
|
28
|
+
members?: DiscoveredSkillMember[];
|
|
29
|
+
/**
|
|
30
|
+
* Member files that were found but not importable: binary or non-UTF-8
|
|
31
|
+
* content, oversized, unreadable, or beyond the per-skill cap. Set (with
|
|
32
|
+
* `members` left undefined) even when the skipped list overflows the
|
|
33
|
+
* payload cap and member sync is withheld for safety.
|
|
34
|
+
*/
|
|
35
|
+
membersSkipped?: number;
|
|
36
|
+
/**
|
|
37
|
+
* Skill-relative paths of the skipped files, sent alongside `members` so
|
|
38
|
+
* the server preserves (rather than removes) their previously synced rows.
|
|
39
|
+
*/
|
|
40
|
+
membersSkippedPaths?: string[];
|
|
41
|
+
};
|
|
42
|
+
export type DiscoverOptions = {
|
|
43
|
+
/** Project root to scan. Defaults to process.cwd(). */
|
|
44
|
+
cwd?: string;
|
|
45
|
+
/**
|
|
46
|
+
* When true, also scan `~/.claude/CLAUDE.md`. Defaults to `os.homedir()`
|
|
47
|
+
* when `homedir` is not supplied.
|
|
48
|
+
*/
|
|
49
|
+
global?: boolean;
|
|
50
|
+
/** Override the home directory. Primarily for tests. */
|
|
51
|
+
homedir?: string;
|
|
52
|
+
};
|
|
53
|
+
/**
|
|
54
|
+
* Re-scan a single skill directory and return its SKILL.md as a
|
|
55
|
+
* DiscoveredGuideFile carrying a fresh, authoritative `members` array — the
|
|
56
|
+
* same shape the initial discovery produces for that skill.
|
|
57
|
+
*
|
|
58
|
+
* `rules watch` calls this when a member file under a synced skill changes:
|
|
59
|
+
* the server treats `members` as the complete member set, so a single member
|
|
60
|
+
* edit must re-send the whole skill, never just the touched file. The
|
|
61
|
+
* SKILL.md's own identity (`payloadPath`/`displayPath`) is supplied by the
|
|
62
|
+
* caller so the re-sent payload matches what the initial import produced.
|
|
63
|
+
*
|
|
64
|
+
* Returns null when the SKILL.md is missing or unreadable (e.g. the whole
|
|
65
|
+
* skill was removed between the member event and this re-scan) — the caller
|
|
66
|
+
* relies on the SKILL.md's own deletion event to retire the guide.
|
|
67
|
+
*/
|
|
68
|
+
export declare function rescanSkill(params: {
|
|
69
|
+
skillMdAbsolutePath: string;
|
|
70
|
+
skillMdPayloadPath: string;
|
|
71
|
+
skillMdDisplayPath: string;
|
|
72
|
+
}): Promise<DiscoveredGuideFile | null>;
|
|
73
|
+
/**
|
|
74
|
+
* Discover supported guide files relative to the project root, optionally
|
|
75
|
+
* extending the scan to global config locations under the user's homedir.
|
|
76
|
+
*
|
|
77
|
+
* The function is intentionally narrow: it walks only the known roots listed
|
|
78
|
+
* above. It never crawls the broader filesystem.
|
|
79
|
+
*/
|
|
80
|
+
export declare function discoverGuideFiles(options?: DiscoverOptions): Promise<DiscoveredGuideFile[]>;
|
|
81
|
+
//# sourceMappingURL=discover.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discover.d.ts","sourceRoot":"","sources":["../../src/rules/discover.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AAGzD,MAAM,MAAM,qBAAqB,GAAG;IAClC,iEAAiE;IACjE,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU,EAAE,MAAM,CAAA;IAClB,YAAY,EAAE,MAAM,CAAA;IACpB,WAAW,EAAE,MAAM,CAAA;CACpB,CAAA;AAED,MAAM,MAAM,mBAAmB,GAAG;IAChC,0EAA0E;IAC1E,YAAY,EAAE,MAAM,CAAA;IACpB,2EAA2E;IAC3E,WAAW,EAAE,MAAM,CAAA;IACnB,kDAAkD;IAClD,WAAW,EAAE,MAAM,CAAA;IACnB,MAAM,EAAE,eAAe,CAAA;IACvB,UAAU,EAAE,MAAM,CAAA;IAClB,YAAY,EAAE,MAAM,CAAA;IACpB,WAAW,EAAE,MAAM,CAAA;IACnB;;;;;;;OAOG;IACH,OAAO,CAAC,EAAE,qBAAqB,EAAE,CAAA;IACjC;;;;;OAKG;IACH,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB;;;OAGG;IACH,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAA;CAC/B,CAAA;AAED,MAAM,MAAM,eAAe,GAAG;IAC5B,uDAAuD;IACvD,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ;;;OAGG;IACH,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,wDAAwD;IACxD,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB,CAAA;AAgMD;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,WAAW,CAAC,MAAM,EAAE;IACxC,mBAAmB,EAAE,MAAM,CAAA;IAC3B,kBAAkB,EAAE,MAAM,CAAA;IAC1B,kBAAkB,EAAE,MAAM,CAAA;CAC3B,GAAG,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC,CAmBtC;AA0DD;;;;;;GAMG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,GAAE,eAAoB,GAC5B,OAAO,CAAC,mBAAmB,EAAE,CAAC,CA4ChC"}
|
|
@@ -0,0 +1,307 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import { lstat, readdir, readFile } from 'node:fs/promises';
|
|
3
|
+
import { homedir as osHomedir } from 'node:os';
|
|
4
|
+
import { basename, dirname, join, relative, resolve } from 'node:path';
|
|
5
|
+
import { detectFormat } from '@auden.to/projections';
|
|
6
|
+
import { MAX_SKILL_MEMBER_FILES, MAX_SKILL_SKIPPED_MEMBER_PATHS, } from '@auden.to/protocol';
|
|
7
|
+
import { isPathWithin } from './path-contains.js';
|
|
8
|
+
const PROJECT_ROOT_FILES = [
|
|
9
|
+
'AGENTS.md',
|
|
10
|
+
'CLAUDE.md',
|
|
11
|
+
'.cursorrules',
|
|
12
|
+
];
|
|
13
|
+
const PROJECT_DIRS = [
|
|
14
|
+
'.agents',
|
|
15
|
+
'.claude/rules',
|
|
16
|
+
'.claude/skills',
|
|
17
|
+
'.cursor/rules',
|
|
18
|
+
];
|
|
19
|
+
const GLOBAL_FILES = ['.claude/CLAUDE.md'];
|
|
20
|
+
const GLOBAL_DIRS = ['.claude/skills', '.cursor/rules'];
|
|
21
|
+
const MAX_RAW_BYTES = 256 * 1024;
|
|
22
|
+
function sha256(content) {
|
|
23
|
+
return createHash('sha256').update(content, 'utf8').digest('hex');
|
|
24
|
+
}
|
|
25
|
+
async function readFileIfPossible(absolutePath) {
|
|
26
|
+
try {
|
|
27
|
+
// lstat (not stat): a guide-file path that is itself a symlink (e.g.
|
|
28
|
+
// .agents/sneaky -> ~/.ssh/id_rsa) must not be followed and read.
|
|
29
|
+
const info = await lstat(absolutePath);
|
|
30
|
+
if (!info.isFile())
|
|
31
|
+
return null;
|
|
32
|
+
// Check size before allocating the full buffer (stat.size is bytes on disk,
|
|
33
|
+
// a reliable early-exit for files well above the limit).
|
|
34
|
+
if (info.size > MAX_RAW_BYTES)
|
|
35
|
+
return null;
|
|
36
|
+
const raw = await readFile(absolutePath, 'utf8');
|
|
37
|
+
return { raw, mtime: info.mtimeMs };
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
return null;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
// Member files are arbitrary skill-directory contents, so unlike the known
|
|
44
|
+
// rule-file names above they can be binary (images under assets/, compiled
|
|
45
|
+
// artifacts). The import contract is text-only until blob storage lands:
|
|
46
|
+
// reject NUL bytes and anything that is not valid UTF-8 instead of importing
|
|
47
|
+
// lossily-decoded garbage. `ignoreBOM` keeps a leading BOM in the decoded
|
|
48
|
+
// string, matching how `readFile(path, 'utf8')` reads the sibling SKILL.md —
|
|
49
|
+
// the stored content must stay byte-faithful for the export round-trip.
|
|
50
|
+
async function readMemberFileIfPossible(absolutePath) {
|
|
51
|
+
try {
|
|
52
|
+
const info = await lstat(absolutePath);
|
|
53
|
+
if (!info.isFile())
|
|
54
|
+
return null;
|
|
55
|
+
if (info.size > MAX_RAW_BYTES)
|
|
56
|
+
return null;
|
|
57
|
+
const buffer = await readFile(absolutePath);
|
|
58
|
+
if (buffer.includes(0))
|
|
59
|
+
return null;
|
|
60
|
+
const raw = new TextDecoder('utf-8', { fatal: true, ignoreBOM: true }).decode(buffer);
|
|
61
|
+
return { raw, mtime: info.mtimeMs };
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
return null;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
async function* walkFiles(root) {
|
|
68
|
+
let entries;
|
|
69
|
+
try {
|
|
70
|
+
entries = await readdir(root, { withFileTypes: true, encoding: 'utf8' });
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
for (const entry of entries) {
|
|
76
|
+
const child = join(root, entry.name);
|
|
77
|
+
if (entry.isDirectory()) {
|
|
78
|
+
yield* walkFiles(child);
|
|
79
|
+
}
|
|
80
|
+
else if (entry.isFile()) {
|
|
81
|
+
yield child;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
async function makeDiscovered(absolutePath, payloadPath, displayPath) {
|
|
86
|
+
const format = detectFormat(payloadPath);
|
|
87
|
+
if (!format)
|
|
88
|
+
return null;
|
|
89
|
+
const file = await readFileIfPossible(absolutePath);
|
|
90
|
+
if (!file)
|
|
91
|
+
return null;
|
|
92
|
+
return {
|
|
93
|
+
absolutePath,
|
|
94
|
+
payloadPath,
|
|
95
|
+
displayPath,
|
|
96
|
+
format,
|
|
97
|
+
rawContent: file.raw,
|
|
98
|
+
lastModified: Math.floor(file.mtime),
|
|
99
|
+
contentHash: sha256(file.raw),
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
function toPosix(path) {
|
|
103
|
+
return path.replaceAll('\\', '/');
|
|
104
|
+
}
|
|
105
|
+
async function buildSkillMembers(skillDir, memberPaths) {
|
|
106
|
+
// Sort candidates by their skill-relative path with a plain codepoint
|
|
107
|
+
// comparison (localeCompare would make which files survive the cap depend on
|
|
108
|
+
// the running locale/ICU build), then stop all file I/O once the cap is
|
|
109
|
+
// reached — the cap bounds discovery cost, not just the payload.
|
|
110
|
+
const candidates = memberPaths
|
|
111
|
+
.map((absolutePath) => ({
|
|
112
|
+
absolutePath,
|
|
113
|
+
path: toPosix(relative(skillDir, absolutePath)),
|
|
114
|
+
}))
|
|
115
|
+
.sort((a, b) => (a.path < b.path ? -1 : a.path > b.path ? 1 : 0));
|
|
116
|
+
const members = [];
|
|
117
|
+
const skippedPaths = [];
|
|
118
|
+
for (const [index, candidate] of candidates.entries()) {
|
|
119
|
+
if (members.length >= MAX_SKILL_MEMBER_FILES) {
|
|
120
|
+
skippedPaths.push(...candidates.slice(index).map((c) => c.path));
|
|
121
|
+
break;
|
|
122
|
+
}
|
|
123
|
+
const file = await readMemberFileIfPossible(candidate.absolutePath);
|
|
124
|
+
if (!file) {
|
|
125
|
+
skippedPaths.push(candidate.path);
|
|
126
|
+
continue;
|
|
127
|
+
}
|
|
128
|
+
members.push({
|
|
129
|
+
path: candidate.path,
|
|
130
|
+
rawContent: file.raw,
|
|
131
|
+
lastModified: Math.floor(file.mtime),
|
|
132
|
+
contentHash: sha256(file.raw),
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
return { members, skippedPaths };
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Attach a re-scanned member set to a SKILL.md's discovered file, applying the
|
|
139
|
+
* skipped-path cap. Shared by the directory walk and the single-skill re-scan
|
|
140
|
+
* so both encode member sync the same way: when too many paths are skipped to
|
|
141
|
+
* enumerate, withhold the member list (leave `members` undefined) so the
|
|
142
|
+
* server preserves existing rows rather than reading absence as removal.
|
|
143
|
+
*/
|
|
144
|
+
function applySkillMembers(discovered, members, skippedPaths) {
|
|
145
|
+
if (skippedPaths.length > MAX_SKILL_SKIPPED_MEMBER_PATHS) {
|
|
146
|
+
discovered.membersSkipped = skippedPaths.length;
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
discovered.members = members;
|
|
150
|
+
if (skippedPaths.length > 0) {
|
|
151
|
+
discovered.membersSkipped = skippedPaths.length;
|
|
152
|
+
discovered.membersSkippedPaths = skippedPaths;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Collect the member-file paths owned by one skill directory. Inside a
|
|
157
|
+
* `skills/` tree every file except a SKILL.md is member content (detectFormat
|
|
158
|
+
* returns null for all of it), so a file belongs to THIS skill only when its
|
|
159
|
+
* nearest ancestor SKILL.md directory is `skillDir` — a nested skill claims
|
|
160
|
+
* its own subtree instead of leaking into the parent's member list.
|
|
161
|
+
*/
|
|
162
|
+
async function collectSkillMemberPaths(skillDir) {
|
|
163
|
+
const files = [];
|
|
164
|
+
for await (const child of walkFiles(skillDir))
|
|
165
|
+
files.push(child);
|
|
166
|
+
const isSkillMd = (path) => basename(path).toLowerCase() === 'skill.md';
|
|
167
|
+
// Longest-first so a nested skill's directory wins the ownership check.
|
|
168
|
+
const skillRoots = files
|
|
169
|
+
.filter(isSkillMd)
|
|
170
|
+
.map((child) => dirname(child))
|
|
171
|
+
.sort((a, b) => b.length - a.length);
|
|
172
|
+
const members = [];
|
|
173
|
+
for (const child of files) {
|
|
174
|
+
if (isSkillMd(child))
|
|
175
|
+
continue;
|
|
176
|
+
const owner = skillRoots.find((dir) => isPathWithin(dir, child));
|
|
177
|
+
if (owner === skillDir)
|
|
178
|
+
members.push(child);
|
|
179
|
+
}
|
|
180
|
+
return members;
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Re-scan a single skill directory and return its SKILL.md as a
|
|
184
|
+
* DiscoveredGuideFile carrying a fresh, authoritative `members` array — the
|
|
185
|
+
* same shape the initial discovery produces for that skill.
|
|
186
|
+
*
|
|
187
|
+
* `rules watch` calls this when a member file under a synced skill changes:
|
|
188
|
+
* the server treats `members` as the complete member set, so a single member
|
|
189
|
+
* edit must re-send the whole skill, never just the touched file. The
|
|
190
|
+
* SKILL.md's own identity (`payloadPath`/`displayPath`) is supplied by the
|
|
191
|
+
* caller so the re-sent payload matches what the initial import produced.
|
|
192
|
+
*
|
|
193
|
+
* Returns null when the SKILL.md is missing or unreadable (e.g. the whole
|
|
194
|
+
* skill was removed between the member event and this re-scan) — the caller
|
|
195
|
+
* relies on the SKILL.md's own deletion event to retire the guide.
|
|
196
|
+
*/
|
|
197
|
+
export async function rescanSkill(params) {
|
|
198
|
+
const skillFile = await readFileIfPossible(params.skillMdAbsolutePath);
|
|
199
|
+
if (!skillFile)
|
|
200
|
+
return null;
|
|
201
|
+
const skillDir = dirname(params.skillMdAbsolutePath);
|
|
202
|
+
const memberPaths = await collectSkillMemberPaths(skillDir);
|
|
203
|
+
const { members, skippedPaths } = await buildSkillMembers(skillDir, memberPaths);
|
|
204
|
+
const discovered = {
|
|
205
|
+
absolutePath: params.skillMdAbsolutePath,
|
|
206
|
+
payloadPath: params.skillMdPayloadPath,
|
|
207
|
+
displayPath: params.skillMdDisplayPath,
|
|
208
|
+
format: 'skill-md',
|
|
209
|
+
rawContent: skillFile.raw,
|
|
210
|
+
lastModified: Math.floor(skillFile.mtime),
|
|
211
|
+
contentHash: sha256(skillFile.raw),
|
|
212
|
+
};
|
|
213
|
+
applySkillMembers(discovered, members, skippedPaths);
|
|
214
|
+
return discovered;
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Discover the guide files under one walked directory root. Files whose path
|
|
218
|
+
* maps to a format import as before; the rest are grouped as skill members
|
|
219
|
+
* under their nearest ancestor directory holding a SKILL.md (or dropped when
|
|
220
|
+
* no skill claims them — discovery never imports arbitrary files).
|
|
221
|
+
*/
|
|
222
|
+
async function discoverDirRoot(absoluteDir, base, displayPrefix, collect) {
|
|
223
|
+
const formatByPath = new Map();
|
|
224
|
+
for await (const child of walkFiles(absoluteDir)) {
|
|
225
|
+
formatByPath.set(child, detectFormat(toPosix(relative(base, child))));
|
|
226
|
+
}
|
|
227
|
+
// Longest-first so a nested skill claims its own subtree before an outer one.
|
|
228
|
+
const skillDirs = Array.from(formatByPath.entries())
|
|
229
|
+
.filter(([, format]) => format === 'skill-md')
|
|
230
|
+
.map(([child]) => dirname(child))
|
|
231
|
+
.sort((a, b) => b.length - a.length);
|
|
232
|
+
const membersBySkillDir = new Map();
|
|
233
|
+
const guideFiles = [];
|
|
234
|
+
for (const [child, format] of formatByPath) {
|
|
235
|
+
if (format) {
|
|
236
|
+
guideFiles.push(child);
|
|
237
|
+
continue;
|
|
238
|
+
}
|
|
239
|
+
const owner = skillDirs.find((dir) => isPathWithin(dir, child));
|
|
240
|
+
if (!owner)
|
|
241
|
+
continue;
|
|
242
|
+
const bucket = membersBySkillDir.get(owner);
|
|
243
|
+
if (bucket)
|
|
244
|
+
bucket.push(child);
|
|
245
|
+
else
|
|
246
|
+
membersBySkillDir.set(owner, [child]);
|
|
247
|
+
}
|
|
248
|
+
for (const child of guideFiles) {
|
|
249
|
+
const payloadPath = toPosix(relative(base, child));
|
|
250
|
+
const discovered = await makeDiscovered(child, payloadPath, displayPrefix + payloadPath);
|
|
251
|
+
if (discovered?.format === 'skill-md') {
|
|
252
|
+
const skillDir = dirname(child);
|
|
253
|
+
const { members, skippedPaths } = await buildSkillMembers(skillDir, membersBySkillDir.get(skillDir) ?? []);
|
|
254
|
+
applySkillMembers(discovered, members, skippedPaths);
|
|
255
|
+
}
|
|
256
|
+
collect(discovered);
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
/**
|
|
260
|
+
* Discover supported guide files relative to the project root, optionally
|
|
261
|
+
* extending the scan to global config locations under the user's homedir.
|
|
262
|
+
*
|
|
263
|
+
* The function is intentionally narrow: it walks only the known roots listed
|
|
264
|
+
* above. It never crawls the broader filesystem.
|
|
265
|
+
*/
|
|
266
|
+
export async function discoverGuideFiles(options = {}) {
|
|
267
|
+
const cwd = resolve(options.cwd ?? process.cwd());
|
|
268
|
+
const home = options.global
|
|
269
|
+
? resolve(options.homedir ?? osHomedir())
|
|
270
|
+
: options.homedir
|
|
271
|
+
? resolve(options.homedir)
|
|
272
|
+
: null;
|
|
273
|
+
const seen = new Set();
|
|
274
|
+
const results = [];
|
|
275
|
+
const collect = (file) => {
|
|
276
|
+
if (!file)
|
|
277
|
+
return;
|
|
278
|
+
if (seen.has(file.absolutePath))
|
|
279
|
+
return;
|
|
280
|
+
seen.add(file.absolutePath);
|
|
281
|
+
results.push(file);
|
|
282
|
+
};
|
|
283
|
+
for (const name of PROJECT_ROOT_FILES) {
|
|
284
|
+
const absolutePath = join(cwd, name);
|
|
285
|
+
collect(await makeDiscovered(absolutePath, name, name));
|
|
286
|
+
}
|
|
287
|
+
for (const dir of PROJECT_DIRS) {
|
|
288
|
+
await discoverDirRoot(join(cwd, dir), cwd, '', collect);
|
|
289
|
+
}
|
|
290
|
+
if (options.global && home) {
|
|
291
|
+
for (const name of GLOBAL_FILES) {
|
|
292
|
+
const absolutePath = join(home, name);
|
|
293
|
+
// Keep the full relative path (.claude/CLAUDE.md) so provenance is
|
|
294
|
+
// preserved in the payload and the dashboard origin string is unambiguous.
|
|
295
|
+
const payloadPath = toPosix(name);
|
|
296
|
+
const displayPath = `~/${payloadPath}`;
|
|
297
|
+
collect(await makeDiscovered(absolutePath, payloadPath, displayPath));
|
|
298
|
+
}
|
|
299
|
+
for (const dir of GLOBAL_DIRS) {
|
|
300
|
+
await discoverDirRoot(join(home, dir), home, '~/', collect);
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
// Stable order: by display path, ascending.
|
|
304
|
+
results.sort((a, b) => a.displayPath.localeCompare(b.displayPath));
|
|
305
|
+
return results;
|
|
306
|
+
}
|
|
307
|
+
//# sourceMappingURL=discover.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discover.js","sourceRoot":"","sources":["../../src/rules/discover.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { type GuideFileFormat } from '@auden.to/protocol';
|
|
2
|
+
export type ParsedFileOrigin = {
|
|
3
|
+
format: GuideFileFormat;
|
|
4
|
+
path: string;
|
|
5
|
+
};
|
|
6
|
+
/**
|
|
7
|
+
* Parse the `file:{format}:{path}` origin string set by the dashboard import
|
|
8
|
+
* endpoint. Returns null for any other origin shape (`null`, `undefined`,
|
|
9
|
+
* non-`file:` prefixes, missing format, missing path, or a format that is not
|
|
10
|
+
* in the canonical 5-format schema).
|
|
11
|
+
*
|
|
12
|
+
* The path may contain `:` (Windows paths, schema-like segments). Everything
|
|
13
|
+
* after the second `:` is treated verbatim as the path.
|
|
14
|
+
*/
|
|
15
|
+
export declare function parseFileOrigin(origin: string | null | undefined): ParsedFileOrigin | null;
|
|
16
|
+
//# sourceMappingURL=file-origin.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-origin.d.ts","sourceRoot":"","sources":["../../src/rules/file-origin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAyB,KAAK,eAAe,EAAE,MAAM,oBAAoB,CAAA;AAGhF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,MAAM,EAAE,eAAe,CAAA;IACvB,IAAI,EAAE,MAAM,CAAA;CACb,CAAA;AAID;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAC7B,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAChC,gBAAgB,GAAG,IAAI,CAgBzB"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { GuideFileFormatSchema } from '@auden.to/protocol';
|
|
2
|
+
import * as v from 'valibot';
|
|
3
|
+
const FILE_PREFIX = 'file:';
|
|
4
|
+
/**
|
|
5
|
+
* Parse the `file:{format}:{path}` origin string set by the dashboard import
|
|
6
|
+
* endpoint. Returns null for any other origin shape (`null`, `undefined`,
|
|
7
|
+
* non-`file:` prefixes, missing format, missing path, or a format that is not
|
|
8
|
+
* in the canonical 5-format schema).
|
|
9
|
+
*
|
|
10
|
+
* The path may contain `:` (Windows paths, schema-like segments). Everything
|
|
11
|
+
* after the second `:` is treated verbatim as the path.
|
|
12
|
+
*/
|
|
13
|
+
export function parseFileOrigin(origin) {
|
|
14
|
+
if (typeof origin !== 'string' || origin.length === 0)
|
|
15
|
+
return null;
|
|
16
|
+
if (!origin.startsWith(FILE_PREFIX))
|
|
17
|
+
return null;
|
|
18
|
+
const afterPrefix = origin.slice(FILE_PREFIX.length);
|
|
19
|
+
const separatorIndex = afterPrefix.indexOf(':');
|
|
20
|
+
if (separatorIndex === -1)
|
|
21
|
+
return null;
|
|
22
|
+
const format = afterPrefix.slice(0, separatorIndex);
|
|
23
|
+
const path = afterPrefix.slice(separatorIndex + 1);
|
|
24
|
+
if (format.length === 0 || path.length === 0)
|
|
25
|
+
return null;
|
|
26
|
+
const parsedFormat = v.safeParse(GuideFileFormatSchema, format);
|
|
27
|
+
if (!parsedFormat.success)
|
|
28
|
+
return null;
|
|
29
|
+
return { format: parsedFormat.output, path };
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=file-origin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-origin.js","sourceRoot":"","sources":["../../src/rules/file-origin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAwB,MAAM,oBAAoB,CAAA;AAChF,OAAO,KAAK,CAAC,MAAM,SAAS,CAAA;AAO5B,MAAM,WAAW,GAAG,OAAO,CAAA;AAE3B;;;;;;;;GAQG;AACH,MAAM,UAAU,eAAe,CAC7B,MAAiC;IAEjC,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAA;IAClE,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,WAAW,CAAC;QAAE,OAAO,IAAI,CAAA;IAEhD,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAA;IACpD,MAAM,cAAc,GAAG,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;IAC/C,IAAI,cAAc,KAAK,CAAC,CAAC;QAAE,OAAO,IAAI,CAAA;IAEtC,MAAM,MAAM,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,cAAc,CAAC,CAAA;IACnD,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,CAAC,cAAc,GAAG,CAAC,CAAC,CAAA;IAClD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAA;IAEzD,MAAM,YAAY,GAAG,CAAC,CAAC,SAAS,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAA;IAC/D,IAAI,CAAC,YAAY,CAAC,OAAO;QAAE,OAAO,IAAI,CAAA;IAEtC,OAAO,EAAE,MAAM,EAAE,YAAY,CAAC,MAAM,EAAE,IAAI,EAAE,CAAA;AAC9C,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resolve the effective `--global` flag for `auden rules import`.
|
|
3
|
+
*
|
|
4
|
+
* `--no-global` always wins (explicit opt-out). Otherwise, an explicit
|
|
5
|
+
* `--global` flag wins over the config default. Falls back to the persisted
|
|
6
|
+
* `discoverGlobal` config value.
|
|
7
|
+
*/
|
|
8
|
+
export declare function resolveGlobalFlag(args: {
|
|
9
|
+
global: boolean;
|
|
10
|
+
'no-global': boolean;
|
|
11
|
+
}, configDiscoverGlobal: boolean): boolean;
|
|
12
|
+
//# sourceMappingURL=global-flag.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"global-flag.d.ts","sourceRoot":"","sources":["../../src/rules/global-flag.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,WAAW,EAAE,OAAO,CAAA;CAAE,EAC/C,oBAAoB,EAAE,OAAO,GAC5B,OAAO,CAIT"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resolve the effective `--global` flag for `auden rules import`.
|
|
3
|
+
*
|
|
4
|
+
* `--no-global` always wins (explicit opt-out). Otherwise, an explicit
|
|
5
|
+
* `--global` flag wins over the config default. Falls back to the persisted
|
|
6
|
+
* `discoverGlobal` config value.
|
|
7
|
+
*/
|
|
8
|
+
export function resolveGlobalFlag(args, configDiscoverGlobal) {
|
|
9
|
+
if (args['no-global'])
|
|
10
|
+
return false;
|
|
11
|
+
if (args.global)
|
|
12
|
+
return true;
|
|
13
|
+
return configDiscoverGlobal;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=global-flag.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"global-flag.js","sourceRoot":"","sources":["../../src/rules/global-flag.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,MAAM,UAAU,iBAAiB,CAC/B,IAA+C,EAC/C,oBAA6B;IAE7B,IAAI,IAAI,CAAC,WAAW,CAAC;QAAE,OAAO,KAAK,CAAA;IACnC,IAAI,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAA;IAC5B,OAAO,oBAAoB,CAAA;AAC7B,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import * as v from 'valibot';
|
|
2
|
+
import type { RawGuideFilePayload } from '@auden.to/protocol';
|
|
3
|
+
declare const ImportSuccessSchema: v.ObjectSchema<{
|
|
4
|
+
readonly imported: v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 0, undefined>]>;
|
|
5
|
+
readonly skipped: v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 0, undefined>]>;
|
|
6
|
+
readonly members: v.OptionalSchema<v.ObjectSchema<{
|
|
7
|
+
readonly added: v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 0, undefined>]>;
|
|
8
|
+
readonly updated: v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 0, undefined>]>;
|
|
9
|
+
readonly removed: v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 0, undefined>]>;
|
|
10
|
+
readonly unchanged: v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 0, undefined>]>;
|
|
11
|
+
}, undefined>, undefined>;
|
|
12
|
+
}, undefined>;
|
|
13
|
+
export type ImportRulesResult = v.InferOutput<typeof ImportSuccessSchema>;
|
|
14
|
+
export type ImportRulesOptions = {
|
|
15
|
+
dashboardUrl: string;
|
|
16
|
+
token: string;
|
|
17
|
+
rules: RawGuideFilePayload[];
|
|
18
|
+
/** Override fetch for tests. Defaults to globalThis.fetch. */
|
|
19
|
+
fetchImpl?: typeof fetch;
|
|
20
|
+
};
|
|
21
|
+
/**
|
|
22
|
+
* Split payloads into consecutive batches bounded by both count
|
|
23
|
+
* (`MAX_RULES_IMPORT_BATCH`) and approximate serialized size. A single
|
|
24
|
+
* payload larger than the byte budget still ships alone — the server's
|
|
25
|
+
* per-field caps are the authority on whether it is acceptable.
|
|
26
|
+
*/
|
|
27
|
+
export declare function chunkRulePayloads(rules: RawGuideFilePayload[]): RawGuideFilePayload[][];
|
|
28
|
+
/**
|
|
29
|
+
* POST `RawGuideFilePayload`s to the dashboard import endpoint, chunked to
|
|
30
|
+
* stay under the server's `MAX_RULES_IMPORT_BATCH` per-request cap and its
|
|
31
|
+
* request-body byte cap, and sum the parsed results. Throws on transport
|
|
32
|
+
* errors, non-2xx responses, or malformed bodies. Empty `rules` is rejected
|
|
33
|
+
* here so the CLI never sends a useless request.
|
|
34
|
+
*/
|
|
35
|
+
export declare function importRules(options: ImportRulesOptions): Promise<ImportRulesResult>;
|
|
36
|
+
export {};
|
|
37
|
+
//# sourceMappingURL=import-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"import-client.d.ts","sourceRoot":"","sources":["../../src/rules/import-client.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,CAAC,MAAM,SAAS,CAAA;AAE5B,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAA;AAa7D,QAAA,MAAM,mBAAmB;;;;;;;;;aAIvB,CAAA;AAEF,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,WAAW,CAAC,OAAO,mBAAmB,CAAC,CAAA;AAEzE,MAAM,MAAM,kBAAkB,GAAG;IAC/B,YAAY,EAAE,MAAM,CAAA;IACpB,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,mBAAmB,EAAE,CAAA;IAC5B,8DAA8D;IAC9D,SAAS,CAAC,EAAE,OAAO,KAAK,CAAA;CACzB,CAAA;AAaD;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,mBAAmB,EAAE,GAAG,mBAAmB,EAAE,EAAE,CAwBvF;AAED;;;;;;GAMG;AACH,wBAAsB,WAAW,CAC/B,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CAAC,iBAAiB,CAAC,CAyC5B"}
|