@auden.to/projections 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.
Files changed (59) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +7 -0
  3. package/dist/agents-dir.d.ts +13 -0
  4. package/dist/agents-dir.d.ts.map +1 -0
  5. package/dist/agents-dir.js +36 -0
  6. package/dist/agents-dir.js.map +1 -0
  7. package/dist/agents-dir.test.d.ts +2 -0
  8. package/dist/agents-dir.test.d.ts.map +1 -0
  9. package/dist/agents-dir.test.js +30 -0
  10. package/dist/agents-dir.test.js.map +1 -0
  11. package/dist/agents-md.d.ts +12 -0
  12. package/dist/agents-md.d.ts.map +1 -0
  13. package/dist/agents-md.js +47 -0
  14. package/dist/agents-md.js.map +1 -0
  15. package/dist/agents-md.test.d.ts +2 -0
  16. package/dist/agents-md.test.d.ts.map +1 -0
  17. package/dist/agents-md.test.js +44 -0
  18. package/dist/agents-md.test.js.map +1 -0
  19. package/dist/claude-md.d.ts +17 -0
  20. package/dist/claude-md.d.ts.map +1 -0
  21. package/dist/claude-md.js +43 -0
  22. package/dist/claude-md.js.map +1 -0
  23. package/dist/claude-md.test.d.ts +2 -0
  24. package/dist/claude-md.test.d.ts.map +1 -0
  25. package/dist/claude-md.test.js +61 -0
  26. package/dist/claude-md.test.js.map +1 -0
  27. package/dist/claude-rules.d.ts +17 -0
  28. package/dist/claude-rules.d.ts.map +1 -0
  29. package/dist/claude-rules.js +43 -0
  30. package/dist/claude-rules.js.map +1 -0
  31. package/dist/claude-rules.test.d.ts +2 -0
  32. package/dist/claude-rules.test.d.ts.map +1 -0
  33. package/dist/claude-rules.test.js +34 -0
  34. package/dist/claude-rules.test.js.map +1 -0
  35. package/dist/compatibility-attribution.d.ts +7 -0
  36. package/dist/compatibility-attribution.d.ts.map +1 -0
  37. package/dist/compatibility-attribution.js +11 -0
  38. package/dist/compatibility-attribution.js.map +1 -0
  39. package/dist/cursor-rules.d.ts +17 -0
  40. package/dist/cursor-rules.d.ts.map +1 -0
  41. package/dist/cursor-rules.js +33 -0
  42. package/dist/cursor-rules.js.map +1 -0
  43. package/dist/cursor-rules.test.d.ts +2 -0
  44. package/dist/cursor-rules.test.d.ts.map +1 -0
  45. package/dist/cursor-rules.test.js +58 -0
  46. package/dist/cursor-rules.test.js.map +1 -0
  47. package/dist/detect-format.d.ts +12 -0
  48. package/dist/detect-format.d.ts.map +1 -0
  49. package/dist/detect-format.js +67 -0
  50. package/dist/detect-format.js.map +1 -0
  51. package/dist/detect-format.test.d.ts +2 -0
  52. package/dist/detect-format.test.d.ts.map +1 -0
  53. package/dist/detect-format.test.js +85 -0
  54. package/dist/detect-format.test.js.map +1 -0
  55. package/dist/index.d.ts +15 -0
  56. package/dist/index.d.ts.map +1 -0
  57. package/dist/index.js +15 -0
  58. package/dist/index.js.map +1 -0
  59. package/package.json +47 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Auden
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,7 @@
1
+ # @auden.to/projections
2
+
3
+ Guide-file format detection and compatibility renderers for [Auden](https://app.auden.to) — `detectFormat()` for `AGENTS.md`, `.agents/`, `CLAUDE.md`, `.claude/rules/`, `.cursorrules`, and `.cursor/rules/*.mdc`, plus exporters that render Auden guides into those formats. Used by the [`auden` CLI](https://www.npmjs.com/package/auden).
4
+
5
+ You normally don't install this directly; it ships as a dependency of `auden`.
6
+
7
+ Source: https://github.com/auden-to/auden (`packages/projections`)
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Projection: .agents/ directory
3
+ *
4
+ * Generates per-agent files for the .agents/ directory.
5
+ * Pure function – no I/O.
6
+ */
7
+ import type { AgentConfig } from '@auden.to/protocol';
8
+ /**
9
+ * Returns a map of { filename: content } for the .agents/ directory.
10
+ * Each agent gets its own YAML-like descriptor file.
11
+ */
12
+ export declare function renderAgentsDir(agents: AgentConfig[]): Record<string, string>;
13
+ //# sourceMappingURL=agents-dir.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agents-dir.d.ts","sourceRoot":"","sources":["../src/agents-dir.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAErD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CA0B7E"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Projection: .agents/ directory
3
+ *
4
+ * Generates per-agent files for the .agents/ directory.
5
+ * Pure function – no I/O.
6
+ */
7
+ /**
8
+ * Returns a map of { filename: content } for the .agents/ directory.
9
+ * Each agent gets its own YAML-like descriptor file.
10
+ */
11
+ export function renderAgentsDir(agents) {
12
+ const files = {};
13
+ for (const agent of agents) {
14
+ const filename = `${agent.id}.md`;
15
+ const lines = [
16
+ `# ${agent.name}`,
17
+ '',
18
+ `id: ${agent.id}`,
19
+ `description: ${agent.description || '(none)'}`,
20
+ `capabilities:`,
21
+ ];
22
+ for (const cap of agent.capabilities) {
23
+ lines.push(` - ${cap}`);
24
+ }
25
+ if (agent.meta) {
26
+ lines.push('');
27
+ lines.push('meta:');
28
+ lines.push('```json');
29
+ lines.push(JSON.stringify(agent.meta, null, 2));
30
+ lines.push('```');
31
+ }
32
+ files[filename] = lines.join('\n');
33
+ }
34
+ return files;
35
+ }
36
+ //# sourceMappingURL=agents-dir.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agents-dir.js","sourceRoot":"","sources":["../src/agents-dir.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,MAAqB;IACnD,MAAM,KAAK,GAA2B,EAAE,CAAA;IAExC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,QAAQ,GAAG,GAAG,KAAK,CAAC,EAAE,KAAK,CAAA;QACjC,MAAM,KAAK,GAAa;YACtB,KAAK,KAAK,CAAC,IAAI,EAAE;YACjB,EAAE;YACF,OAAO,KAAK,CAAC,EAAE,EAAE;YACjB,gBAAgB,KAAK,CAAC,WAAW,IAAI,QAAQ,EAAE;YAC/C,eAAe;SAChB,CAAA;QACD,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,YAAY,EAAE,CAAC;YACrC,KAAK,CAAC,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC,CAAA;QAC1B,CAAC;QACD,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;YACf,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;YACd,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;YACnB,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;YACrB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;YAC/C,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QACnB,CAAC;QACD,KAAK,CAAC,QAAQ,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACpC,CAAC;IAED,OAAO,KAAK,CAAA;AACd,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=agents-dir.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agents-dir.test.d.ts","sourceRoot":"","sources":["../src/agents-dir.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,30 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { renderAgentsDir } from './agents-dir.js';
3
+ const sampleAgents = [
4
+ {
5
+ id: 'agent-alpha',
6
+ name: 'Alpha',
7
+ description: 'First agent',
8
+ capabilities: ['read'],
9
+ },
10
+ ];
11
+ describe('renderAgentsDir', () => {
12
+ it('creates a file per agent', () => {
13
+ const files = renderAgentsDir(sampleAgents);
14
+ expect(Object.keys(files)).toContain('agent-alpha.md');
15
+ });
16
+ it('file content contains id and capabilities', () => {
17
+ const files = renderAgentsDir(sampleAgents);
18
+ const content = files['agent-alpha.md'] ?? '';
19
+ expect(content).toContain('agent-alpha');
20
+ expect(content).toContain('- read');
21
+ });
22
+ it('returns empty object for empty input', () => {
23
+ expect(renderAgentsDir([])).toEqual({});
24
+ });
25
+ it('does not add compatibility attribution to canonical outputs', () => {
26
+ const files = renderAgentsDir(sampleAgents);
27
+ expect(files['agent-alpha.md']).not.toContain('Guides managed by Auden');
28
+ });
29
+ });
30
+ //# sourceMappingURL=agents-dir.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agents-dir.test.js","sourceRoot":"","sources":["../src/agents-dir.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAE7C,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAIjD,MAAM,YAAY,GAAkB;IAClC;QACE,EAAE,EAAE,aAAa;QACjB,IAAI,EAAE,OAAO;QACb,WAAW,EAAE,aAAa;QAC1B,YAAY,EAAE,CAAC,MAAM,CAAC;KACvB;CACF,CAAA;AAED,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC/B,EAAE,CAAC,0BAA0B,EAAE,GAAG,EAAE;QAClC,MAAM,KAAK,GAAG,eAAe,CAAC,YAAY,CAAC,CAAA;QAC3C,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAA;IACxD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,MAAM,KAAK,GAAG,eAAe,CAAC,YAAY,CAAC,CAAA;QAC3C,MAAM,OAAO,GAAG,KAAK,CAAC,gBAAgB,CAAC,IAAI,EAAE,CAAA;QAC7C,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAA;QACxC,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAA;IACrC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,MAAM,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;IACzC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,6DAA6D,EAAE,GAAG,EAAE;QACrE,MAAM,KAAK,GAAG,eAAe,CAAC,YAAY,CAAC,CAAA;QAC3C,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,yBAAyB,CAAC,CAAA;IAC1E,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Projection: AGENTS.md
3
+ *
4
+ * Generates the canonical AGENTS.md file content from an array of AgentConfig.
5
+ * Pure function – no I/O.
6
+ */
7
+ import type { AgentConfig } from '@auden.to/protocol';
8
+ /**
9
+ * Render the AGENTS.md content for the given agents.
10
+ */
11
+ export declare function renderAgentsMd(agents: AgentConfig[]): string;
12
+ //# sourceMappingURL=agents-md.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agents-md.d.ts","sourceRoot":"","sources":["../src/agents-md.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAErD;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,CAsC5D"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Projection: AGENTS.md
3
+ *
4
+ * Generates the canonical AGENTS.md file content from an array of AgentConfig.
5
+ * Pure function – no I/O.
6
+ */
7
+ /**
8
+ * Render the AGENTS.md content for the given agents.
9
+ */
10
+ export function renderAgentsMd(agents) {
11
+ const lines = [
12
+ '# Agents',
13
+ '',
14
+ '> Auto-generated by auden. Do not edit manually.',
15
+ '',
16
+ ];
17
+ for (const agent of agents) {
18
+ lines.push(`## ${agent.name}`);
19
+ lines.push('');
20
+ lines.push(`**ID:** \`${agent.id}\``);
21
+ lines.push('');
22
+ if (agent.description) {
23
+ lines.push(agent.description);
24
+ lines.push('');
25
+ }
26
+ if (agent.capabilities.length > 0) {
27
+ lines.push('**Capabilities:**');
28
+ lines.push('');
29
+ for (const cap of agent.capabilities) {
30
+ lines.push(`- ${cap}`);
31
+ }
32
+ lines.push('');
33
+ }
34
+ if (agent.meta && Object.keys(agent.meta).length > 0) {
35
+ lines.push('**Meta:**');
36
+ lines.push('');
37
+ lines.push('```json');
38
+ lines.push(JSON.stringify(agent.meta, null, 2));
39
+ lines.push('```');
40
+ lines.push('');
41
+ }
42
+ lines.push('---');
43
+ lines.push('');
44
+ }
45
+ return lines.join('\n');
46
+ }
47
+ //# sourceMappingURL=agents-md.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agents-md.js","sourceRoot":"","sources":["../src/agents-md.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,MAAqB;IAClD,MAAM,KAAK,GAAa;QACtB,UAAU;QACV,EAAE;QACF,kDAAkD;QAClD,EAAE;KACH,CAAA;IAED,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,KAAK,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC,CAAA;QAC9B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QACd,KAAK,CAAC,IAAI,CAAC,aAAa,KAAK,CAAC,EAAE,IAAI,CAAC,CAAA;QACrC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QACd,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;YACtB,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAA;YAC7B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QAChB,CAAC;QACD,IAAI,KAAK,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAClC,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAA;YAC/B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;YACd,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,YAAY,EAAE,CAAC;gBACrC,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC,CAAA;YACxB,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QAChB,CAAC;QACD,IAAI,KAAK,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrD,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;YACvB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;YACd,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;YACrB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;YAC/C,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;YACjB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QAChB,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QACjB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAChB,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACzB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=agents-md.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agents-md.test.d.ts","sourceRoot":"","sources":["../src/agents-md.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,44 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { renderAgentsMd } from './agents-md.js';
3
+ const sampleAgents = [
4
+ {
5
+ id: 'agent-alpha',
6
+ name: 'Alpha',
7
+ description: 'The first agent',
8
+ capabilities: ['read', 'write'],
9
+ },
10
+ {
11
+ id: 'agent-beta',
12
+ name: 'Beta',
13
+ description: 'The second agent',
14
+ capabilities: [],
15
+ },
16
+ ];
17
+ describe('renderAgentsMd', () => {
18
+ it('includes a header and agent entries', () => {
19
+ const md = renderAgentsMd(sampleAgents);
20
+ expect(md).toContain('# Agents');
21
+ expect(md).toContain('## Alpha');
22
+ expect(md).toContain('## Beta');
23
+ expect(md).toContain('`agent-alpha`');
24
+ });
25
+ it('lists capabilities', () => {
26
+ const md = renderAgentsMd(sampleAgents);
27
+ expect(md).toContain('- read');
28
+ expect(md).toContain('- write');
29
+ });
30
+ it('handles an empty agents array', () => {
31
+ const md = renderAgentsMd([]);
32
+ expect(md).toContain('# Agents');
33
+ expect(md).not.toContain('## ');
34
+ });
35
+ it('includes separator between agents', () => {
36
+ const md = renderAgentsMd(sampleAgents);
37
+ expect(md).toContain('---');
38
+ });
39
+ it('does not add compatibility attribution to canonical outputs', () => {
40
+ const md = renderAgentsMd(sampleAgents);
41
+ expect(md).not.toContain('Guides managed by Auden');
42
+ });
43
+ });
44
+ //# sourceMappingURL=agents-md.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agents-md.test.js","sourceRoot":"","sources":["../src/agents-md.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAE7C,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAI/C,MAAM,YAAY,GAAkB;IAClC;QACE,EAAE,EAAE,aAAa;QACjB,IAAI,EAAE,OAAO;QACb,WAAW,EAAE,iBAAiB;QAC9B,YAAY,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC;KAChC;IACD;QACE,EAAE,EAAE,YAAY;QAChB,IAAI,EAAE,MAAM;QACZ,WAAW,EAAE,kBAAkB;QAC/B,YAAY,EAAE,EAAE;KACjB;CACF,CAAA;AAED,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,EAAE,GAAG,cAAc,CAAC,YAAY,CAAC,CAAA;QACvC,MAAM,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAA;QAChC,MAAM,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAA;QAChC,MAAM,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAA;QAC/B,MAAM,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC,CAAA;IACvC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,oBAAoB,EAAE,GAAG,EAAE;QAC5B,MAAM,EAAE,GAAG,cAAc,CAAC,YAAY,CAAC,CAAA;QACvC,MAAM,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAA;QAC9B,MAAM,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAA;IACjC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACvC,MAAM,EAAE,GAAG,cAAc,CAAC,EAAE,CAAC,CAAA;QAC7B,MAAM,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAA;QAChC,MAAM,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC,CAAA;IACjC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,MAAM,EAAE,GAAG,cAAc,CAAC,YAAY,CAAC,CAAA;QACvC,MAAM,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAA;IAC7B,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,6DAA6D,EAAE,GAAG,EAAE;QACrE,MAAM,EAAE,GAAG,cAAc,CAAC,YAAY,CAAC,CAAA;QACvC,MAAM,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,yBAAyB,CAAC,CAAA;IACrD,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Compatibility exporter: CLAUDE.md
3
+ *
4
+ * Emits a CLAUDE.md-format file from an array of AgentConfig.
5
+ * Pure function – no I/O.
6
+ *
7
+ * This is a compatibility output, not the canonical projection target.
8
+ * Canonical outputs are AGENTS.md and .agents/ (see agents-md.ts, agents-dir.ts).
9
+ */
10
+ import type { CompatibilityRendererOptions } from './compatibility-attribution.js';
11
+ import type { AgentConfig } from '@auden.to/protocol';
12
+ /**
13
+ * Render CLAUDE.md content for the given agents.
14
+ * Emits a `## <agent name>` section per agent with capabilities listed as rules.
15
+ */
16
+ export declare function renderClaudeMd(agents: AgentConfig[], options?: CompatibilityRendererOptions): string;
17
+ //# sourceMappingURL=claude-md.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-md.d.ts","sourceRoot":"","sources":["../src/claude-md.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,gCAAgC,CAAA;AAClF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAErD;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,MAAM,EAAE,WAAW,EAAE,EACrB,OAAO,CAAC,EAAE,4BAA4B,GACrC,MAAM,CA8BR"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Compatibility exporter: CLAUDE.md
3
+ *
4
+ * Emits a CLAUDE.md-format file from an array of AgentConfig.
5
+ * Pure function – no I/O.
6
+ *
7
+ * This is a compatibility output, not the canonical projection target.
8
+ * Canonical outputs are AGENTS.md and .agents/ (see agents-md.ts, agents-dir.ts).
9
+ */
10
+ import { resolveCompatibilityAttribution } from './compatibility-attribution.js';
11
+ /**
12
+ * Render CLAUDE.md content for the given agents.
13
+ * Emits a `## <agent name>` section per agent with capabilities listed as rules.
14
+ */
15
+ export function renderClaudeMd(agents, options) {
16
+ const attribution = resolveCompatibilityAttribution(options);
17
+ const lines = [
18
+ '# Agent Rules',
19
+ '',
20
+ '> Auto-generated by auden. Edit in AGENTS.md, not here.',
21
+ '',
22
+ ];
23
+ for (const agent of agents) {
24
+ lines.push(`## ${agent.name}`);
25
+ lines.push('');
26
+ if (agent.description) {
27
+ lines.push(agent.description);
28
+ lines.push('');
29
+ }
30
+ if (agent.capabilities.length > 0) {
31
+ for (const cap of agent.capabilities) {
32
+ lines.push(`- ${cap}`);
33
+ }
34
+ lines.push('');
35
+ }
36
+ }
37
+ if (attribution) {
38
+ lines.push(`> ${attribution}`);
39
+ lines.push('');
40
+ }
41
+ return lines.join('\n');
42
+ }
43
+ //# sourceMappingURL=claude-md.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-md.js","sourceRoot":"","sources":["../src/claude-md.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,+BAA+B,EAAE,MAAM,gCAAgC,CAAA;AAKhF;;;GAGG;AACH,MAAM,UAAU,cAAc,CAC5B,MAAqB,EACrB,OAAsC;IAEtC,MAAM,WAAW,GAAG,+BAA+B,CAAC,OAAO,CAAC,CAAA;IAC5D,MAAM,KAAK,GAAa;QACtB,eAAe;QACf,EAAE;QACF,yDAAyD;QACzD,EAAE;KACH,CAAA;IAED,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,KAAK,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC,CAAA;QAC9B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QACd,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;YACtB,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAA;YAC7B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QAChB,CAAC;QACD,IAAI,KAAK,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAClC,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,YAAY,EAAE,CAAC;gBACrC,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC,CAAA;YACxB,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QAChB,CAAC;IACH,CAAC;IAED,IAAI,WAAW,EAAE,CAAC;QAChB,KAAK,CAAC,IAAI,CAAC,KAAK,WAAW,EAAE,CAAC,CAAA;QAC9B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAChB,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACzB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=claude-md.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-md.test.d.ts","sourceRoot":"","sources":["../src/claude-md.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,61 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { renderClaudeMd } from './claude-md.js';
3
+ const agent = {
4
+ id: 'reviewer',
5
+ name: 'Code Reviewer',
6
+ description: 'Reviews code for quality issues.',
7
+ capabilities: ['no trailing whitespace', 'prefer const over let'],
8
+ };
9
+ describe('renderClaudeMd', () => {
10
+ it('renders a header and agent rules section', () => {
11
+ const output = renderClaudeMd([agent]);
12
+ expect(output).toContain('# Agent Rules');
13
+ expect(output).toContain('## Code Reviewer');
14
+ expect(output).toContain('- no trailing whitespace');
15
+ expect(output).toContain('- prefer const over let');
16
+ expect(output).toContain('Reviews code for quality issues.');
17
+ });
18
+ it('includes the auto-generated note', () => {
19
+ const output = renderClaudeMd([agent]);
20
+ expect(output).toContain('Auto-generated by auden');
21
+ });
22
+ it('does not include attribution by default', () => {
23
+ const output = renderClaudeMd([agent]);
24
+ expect(output).not.toContain('Guides managed by Auden');
25
+ });
26
+ it('appends attribution when enabled', () => {
27
+ const output = renderClaudeMd([agent], { includeAttribution: true });
28
+ expect(output).toContain('> Guides managed by Auden (auden.to)');
29
+ });
30
+ it('uses a custom attribution string when provided', () => {
31
+ const output = renderClaudeMd([agent], {
32
+ includeAttribution: true,
33
+ attribution: 'Managed by Auden — 94% alignment score',
34
+ });
35
+ expect(output).toContain('> Managed by Auden — 94% alignment score');
36
+ });
37
+ it('returns a valid string for an empty agent list', () => {
38
+ const output = renderClaudeMd([]);
39
+ expect(typeof output).toBe('string');
40
+ expect(output).toContain('# Agent Rules');
41
+ });
42
+ it('renders multiple agents in order', () => {
43
+ const second = {
44
+ id: 'formatter',
45
+ name: 'Formatter',
46
+ description: '',
47
+ capabilities: ['use 2-space indentation'],
48
+ };
49
+ const output = renderClaudeMd([agent, second]);
50
+ const reviewerPos = output.indexOf('## Code Reviewer');
51
+ const formatterPos = output.indexOf('## Formatter');
52
+ expect(reviewerPos).toBeLessThan(formatterPos);
53
+ });
54
+ it('skips the description block when description is empty', () => {
55
+ const noDesc = { ...agent, description: '' };
56
+ const output = renderClaudeMd([noDesc]);
57
+ // Should not emit a blank description paragraph
58
+ expect(output).not.toMatch(/## Code Reviewer\n\n\n/);
59
+ });
60
+ });
61
+ //# sourceMappingURL=claude-md.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-md.test.js","sourceRoot":"","sources":["../src/claude-md.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Compatibility exporter: .claude/rules/
3
+ *
4
+ * Emits a file map for `.claude/rules/` from an array of AgentConfig.
5
+ * Pure function – no I/O.
6
+ *
7
+ * This is a compatibility output, not the canonical projection target.
8
+ * Canonical outputs are AGENTS.md and .agents/ (see agents-md.ts, agents-dir.ts).
9
+ */
10
+ import type { CompatibilityRendererOptions } from './compatibility-attribution.js';
11
+ import type { AgentConfig } from '@auden.to/protocol';
12
+ /**
13
+ * Returns a map of `{ filename: content }` for `.claude/rules/`.
14
+ * Each agent gets its own markdown rule file.
15
+ */
16
+ export declare function renderClaudeRules(agents: AgentConfig[], options?: CompatibilityRendererOptions): Record<string, string>;
17
+ //# sourceMappingURL=claude-rules.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-rules.d.ts","sourceRoot":"","sources":["../src/claude-rules.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,gCAAgC,CAAA;AAClF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAErD;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,WAAW,EAAE,EACrB,OAAO,CAAC,EAAE,4BAA4B,GACrC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAiCxB"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Compatibility exporter: .claude/rules/
3
+ *
4
+ * Emits a file map for `.claude/rules/` from an array of AgentConfig.
5
+ * Pure function – no I/O.
6
+ *
7
+ * This is a compatibility output, not the canonical projection target.
8
+ * Canonical outputs are AGENTS.md and .agents/ (see agents-md.ts, agents-dir.ts).
9
+ */
10
+ import { resolveCompatibilityAttribution } from './compatibility-attribution.js';
11
+ /**
12
+ * Returns a map of `{ filename: content }` for `.claude/rules/`.
13
+ * Each agent gets its own markdown rule file.
14
+ */
15
+ export function renderClaudeRules(agents, options) {
16
+ const attribution = resolveCompatibilityAttribution(options);
17
+ const files = {};
18
+ for (const agent of agents) {
19
+ const lines = [
20
+ `# ${agent.name}`,
21
+ '',
22
+ '> Auto-generated by auden. Edit in AGENTS.md, not here.',
23
+ '',
24
+ ];
25
+ if (agent.description) {
26
+ lines.push(agent.description);
27
+ lines.push('');
28
+ }
29
+ if (agent.capabilities.length > 0) {
30
+ for (const capability of agent.capabilities) {
31
+ lines.push(`- ${capability}`);
32
+ }
33
+ lines.push('');
34
+ }
35
+ if (attribution) {
36
+ lines.push(`> ${attribution}`);
37
+ lines.push('');
38
+ }
39
+ files[`${agent.id}.md`] = lines.join('\n');
40
+ }
41
+ return files;
42
+ }
43
+ //# sourceMappingURL=claude-rules.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-rules.js","sourceRoot":"","sources":["../src/claude-rules.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,+BAA+B,EAAE,MAAM,gCAAgC,CAAA;AAKhF;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAC/B,MAAqB,EACrB,OAAsC;IAEtC,MAAM,WAAW,GAAG,+BAA+B,CAAC,OAAO,CAAC,CAAA;IAC5D,MAAM,KAAK,GAA2B,EAAE,CAAA;IAExC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,KAAK,GAAa;YACtB,KAAK,KAAK,CAAC,IAAI,EAAE;YACjB,EAAE;YACF,yDAAyD;YACzD,EAAE;SACH,CAAA;QAED,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;YACtB,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAA;YAC7B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QAChB,CAAC;QAED,IAAI,KAAK,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAClC,KAAK,MAAM,UAAU,IAAI,KAAK,CAAC,YAAY,EAAE,CAAC;gBAC5C,KAAK,CAAC,IAAI,CAAC,KAAK,UAAU,EAAE,CAAC,CAAA;YAC/B,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QAChB,CAAC;QAED,IAAI,WAAW,EAAE,CAAC;YAChB,KAAK,CAAC,IAAI,CAAC,KAAK,WAAW,EAAE,CAAC,CAAA;YAC9B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QAChB,CAAC;QAED,KAAK,CAAC,GAAG,KAAK,CAAC,EAAE,KAAK,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAC5C,CAAC;IAED,OAAO,KAAK,CAAA;AACd,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=claude-rules.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-rules.test.d.ts","sourceRoot":"","sources":["../src/claude-rules.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,34 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { renderClaudeRules } from './claude-rules.js';
3
+ const agent = {
4
+ id: 'reviewer',
5
+ name: 'Code Reviewer',
6
+ description: 'Reviews code for quality issues.',
7
+ capabilities: ['no trailing whitespace', 'prefer const over let'],
8
+ };
9
+ describe('renderClaudeRules', () => {
10
+ it('creates a file per agent', () => {
11
+ const files = renderClaudeRules([agent]);
12
+ expect(Object.keys(files)).toContain('reviewer.md');
13
+ });
14
+ it('renders markdown rule content for each file', () => {
15
+ const files = renderClaudeRules([agent]);
16
+ const content = files['reviewer.md'] ?? '';
17
+ expect(content).toContain('# Code Reviewer');
18
+ expect(content).toContain('Reviews code for quality issues.');
19
+ expect(content).toContain('- no trailing whitespace');
20
+ expect(content).toContain('- prefer const over let');
21
+ });
22
+ it('does not include attribution by default', () => {
23
+ const files = renderClaudeRules([agent]);
24
+ expect(files['reviewer.md']).not.toContain('Guides managed by Auden');
25
+ });
26
+ it('appends attribution when enabled', () => {
27
+ const files = renderClaudeRules([agent], { includeAttribution: true });
28
+ expect(files['reviewer.md']).toContain('> Guides managed by Auden (auden.to)');
29
+ });
30
+ it('returns an empty object for empty input', () => {
31
+ expect(renderClaudeRules([])).toEqual({});
32
+ });
33
+ });
34
+ //# sourceMappingURL=claude-rules.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-rules.test.js","sourceRoot":"","sources":["../src/claude-rules.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAE7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AAIrD,MAAM,KAAK,GAAgB;IACzB,EAAE,EAAE,UAAU;IACd,IAAI,EAAE,eAAe;IACrB,WAAW,EAAE,kCAAkC;IAC/C,YAAY,EAAE,CAAC,wBAAwB,EAAE,uBAAuB,CAAC;CAClE,CAAA;AAED,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,EAAE,CAAC,0BAA0B,EAAE,GAAG,EAAE;QAClC,MAAM,KAAK,GAAG,iBAAiB,CAAC,CAAC,KAAK,CAAC,CAAC,CAAA;QACxC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAA;IACrD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,MAAM,KAAK,GAAG,iBAAiB,CAAC,CAAC,KAAK,CAAC,CAAC,CAAA;QACxC,MAAM,OAAO,GAAG,KAAK,CAAC,aAAa,CAAC,IAAI,EAAE,CAAA;QAC1C,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAA;QAC5C,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,kCAAkC,CAAC,CAAA;QAC7D,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,0BAA0B,CAAC,CAAA;QACrD,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,yBAAyB,CAAC,CAAA;IACtD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,MAAM,KAAK,GAAG,iBAAiB,CAAC,CAAC,KAAK,CAAC,CAAC,CAAA;QACxC,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,yBAAyB,CAAC,CAAA;IACvE,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,MAAM,KAAK,GAAG,iBAAiB,CAAC,CAAC,KAAK,CAAC,EAAE,EAAE,kBAAkB,EAAE,IAAI,EAAE,CAAC,CAAA;QACtE,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,sCAAsC,CAAC,CAAA;IAChF,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,MAAM,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;IAC3C,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
@@ -0,0 +1,7 @@
1
+ export type CompatibilityRendererOptions = {
2
+ includeAttribution?: boolean;
3
+ attribution?: string;
4
+ };
5
+ export declare const DEFAULT_COMPATIBILITY_ATTRIBUTION = "Guides managed by Auden (auden.to)";
6
+ export declare function resolveCompatibilityAttribution(options?: CompatibilityRendererOptions): string | null;
7
+ //# sourceMappingURL=compatibility-attribution.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compatibility-attribution.d.ts","sourceRoot":"","sources":["../src/compatibility-attribution.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,4BAA4B,GAAG;IACzC,kBAAkB,CAAC,EAAE,OAAO,CAAA;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB,CAAA;AAED,eAAO,MAAM,iCAAiC,uCAAuC,CAAA;AAErF,wBAAgB,+BAA+B,CAC7C,OAAO,CAAC,EAAE,4BAA4B,GACrC,MAAM,GAAG,IAAI,CASf"}
@@ -0,0 +1,11 @@
1
+ export const DEFAULT_COMPATIBILITY_ATTRIBUTION = 'Guides managed by Auden (auden.to)';
2
+ export function resolveCompatibilityAttribution(options) {
3
+ if (!options?.includeAttribution) {
4
+ return null;
5
+ }
6
+ const attribution = options.attribution?.trim();
7
+ return attribution && attribution.length > 0
8
+ ? attribution
9
+ : DEFAULT_COMPATIBILITY_ATTRIBUTION;
10
+ }
11
+ //# sourceMappingURL=compatibility-attribution.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compatibility-attribution.js","sourceRoot":"","sources":["../src/compatibility-attribution.ts"],"names":[],"mappings":"AAKA,MAAM,CAAC,MAAM,iCAAiC,GAAG,oCAAoC,CAAA;AAErF,MAAM,UAAU,+BAA+B,CAC7C,OAAsC;IAEtC,IAAI,CAAC,OAAO,EAAE,kBAAkB,EAAE,CAAC;QACjC,OAAO,IAAI,CAAA;IACb,CAAC;IAED,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,EAAE,IAAI,EAAE,CAAA;IAC/C,OAAO,WAAW,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC;QAC1C,CAAC,CAAC,WAAW;QACb,CAAC,CAAC,iCAAiC,CAAA;AACvC,CAAC"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Compatibility exporter: .cursorrules
3
+ *
4
+ * Emits a .cursorrules-format file from an array of AgentConfig.
5
+ * Pure function – no I/O.
6
+ *
7
+ * This is a compatibility output, not the canonical projection target.
8
+ * Canonical outputs are AGENTS.md and .agents/ (see agents-md.ts, agents-dir.ts).
9
+ */
10
+ import type { CompatibilityRendererOptions } from './compatibility-attribution.js';
11
+ import type { AgentConfig } from '@auden.to/protocol';
12
+ /**
13
+ * Render .cursorrules content for the given agents.
14
+ * Emits one rule line per capability, prefixed with the agent name.
15
+ */
16
+ export declare function renderCursorRules(agents: AgentConfig[], options?: CompatibilityRendererOptions): string;
17
+ //# sourceMappingURL=cursor-rules.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cursor-rules.d.ts","sourceRoot":"","sources":["../src/cursor-rules.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,gCAAgC,CAAA;AAClF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAErD;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,WAAW,EAAE,EACrB,OAAO,CAAC,EAAE,4BAA4B,GACrC,MAAM,CAmBR"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Compatibility exporter: .cursorrules
3
+ *
4
+ * Emits a .cursorrules-format file from an array of AgentConfig.
5
+ * Pure function – no I/O.
6
+ *
7
+ * This is a compatibility output, not the canonical projection target.
8
+ * Canonical outputs are AGENTS.md and .agents/ (see agents-md.ts, agents-dir.ts).
9
+ */
10
+ import { resolveCompatibilityAttribution } from './compatibility-attribution.js';
11
+ /**
12
+ * Render .cursorrules content for the given agents.
13
+ * Emits one rule line per capability, prefixed with the agent name.
14
+ */
15
+ export function renderCursorRules(agents, options) {
16
+ const attribution = resolveCompatibilityAttribution(options);
17
+ const lines = ['# Auto-generated by auden. Edit in AGENTS.md, not here.', ''];
18
+ for (const agent of agents) {
19
+ if (agent.capabilities.length === 0)
20
+ continue;
21
+ lines.push(`# ${agent.name}`);
22
+ for (const cap of agent.capabilities) {
23
+ lines.push(`[${agent.name}] ${cap}`);
24
+ }
25
+ lines.push('');
26
+ }
27
+ if (attribution) {
28
+ lines.push(`# ${attribution}`);
29
+ lines.push('');
30
+ }
31
+ return lines.join('\n');
32
+ }
33
+ //# sourceMappingURL=cursor-rules.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cursor-rules.js","sourceRoot":"","sources":["../src/cursor-rules.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,+BAA+B,EAAE,MAAM,gCAAgC,CAAA;AAKhF;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAC/B,MAAqB,EACrB,OAAsC;IAEtC,MAAM,WAAW,GAAG,+BAA+B,CAAC,OAAO,CAAC,CAAA;IAC5D,MAAM,KAAK,GAAa,CAAC,yDAAyD,EAAE,EAAE,CAAC,CAAA;IAEvF,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,KAAK,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC;YAAE,SAAQ;QAC7C,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,IAAI,EAAE,CAAC,CAAA;QAC7B,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,YAAY,EAAE,CAAC;YACrC,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,GAAG,EAAE,CAAC,CAAA;QACtC,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAChB,CAAC;IAED,IAAI,WAAW,EAAE,CAAC;QAChB,KAAK,CAAC,IAAI,CAAC,KAAK,WAAW,EAAE,CAAC,CAAA;QAC9B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAChB,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACzB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=cursor-rules.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cursor-rules.test.d.ts","sourceRoot":"","sources":["../src/cursor-rules.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,58 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { renderCursorRules } from './cursor-rules.js';
3
+ const agent = {
4
+ id: 'reviewer',
5
+ name: 'Code Reviewer',
6
+ description: 'Reviews code for quality issues.',
7
+ capabilities: ['no trailing whitespace', 'prefer const over let'],
8
+ };
9
+ describe('renderCursorRules', () => {
10
+ it('renders capabilities as prefixed rule lines', () => {
11
+ const output = renderCursorRules([agent]);
12
+ expect(output).toContain('[Code Reviewer] no trailing whitespace');
13
+ expect(output).toContain('[Code Reviewer] prefer const over let');
14
+ });
15
+ it('includes the auto-generated header', () => {
16
+ const output = renderCursorRules([agent]);
17
+ expect(output).toContain('Auto-generated by auden');
18
+ });
19
+ it('does not include attribution by default', () => {
20
+ const output = renderCursorRules([agent]);
21
+ expect(output).not.toContain('Guides managed by Auden');
22
+ });
23
+ it('appends attribution when enabled', () => {
24
+ const output = renderCursorRules([agent], { includeAttribution: true });
25
+ expect(output).toContain('# Guides managed by Auden (auden.to)');
26
+ });
27
+ it('uses a custom attribution string when provided', () => {
28
+ const output = renderCursorRules([agent], {
29
+ includeAttribution: true,
30
+ attribution: 'Managed by Auden — 94% alignment score',
31
+ });
32
+ expect(output).toContain('# Managed by Auden — 94% alignment score');
33
+ });
34
+ it('returns a valid string for an empty agent list', () => {
35
+ const output = renderCursorRules([]);
36
+ expect(typeof output).toBe('string');
37
+ });
38
+ it('skips agents with no capabilities', () => {
39
+ const noCapAgent = { ...agent, capabilities: [] };
40
+ const output = renderCursorRules([noCapAgent]);
41
+ expect(output).not.toContain('# Code Reviewer');
42
+ expect(output).not.toContain('[Code Reviewer]');
43
+ });
44
+ it('renders multiple agents in order', () => {
45
+ const second = {
46
+ id: 'formatter',
47
+ name: 'Formatter',
48
+ description: '',
49
+ capabilities: ['use 2-space indentation'],
50
+ };
51
+ const output = renderCursorRules([agent, second]);
52
+ const reviewerPos = output.indexOf('# Code Reviewer');
53
+ const formatterPos = output.indexOf('# Formatter');
54
+ expect(reviewerPos).toBeLessThan(formatterPos);
55
+ expect(output).toContain('[Formatter] use 2-space indentation');
56
+ });
57
+ });
58
+ //# sourceMappingURL=cursor-rules.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cursor-rules.test.js","sourceRoot":"","sources":["../src/cursor-rules.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { GuideFileFormat } from '@auden.to/protocol';
2
+ export declare function detectFormat(path: string): GuideFileFormat | null;
3
+ export declare function isSupportedGuidePath(path: string): boolean;
4
+ /**
5
+ * True for a path inside a `skills/<name>/` tree that is NOT itself the
6
+ * SKILL.md — i.e. skill *member* content (scripts, references, assets).
7
+ * `detectFormat` deliberately returns `null` for these, so consumers that
8
+ * treat a member edit as belonging to its owning skill (e.g. `rules watch`
9
+ * re-sync) use this to recognise them rather than dropping them as unknown.
10
+ */
11
+ export declare function isSkillMemberPath(path: string): boolean;
12
+ //# sourceMappingURL=detect-format.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detect-format.d.ts","sourceRoot":"","sources":["../src/detect-format.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AAsBzD,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI,CAgDjE;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,WAEhD;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,WAG7C"}
@@ -0,0 +1,67 @@
1
+ function normalizeGuidePath(path) {
2
+ return path.replaceAll('\\', '/').replace(/\/+/g, '/').toLowerCase();
3
+ }
4
+ function isUnderSkillsDir(normalizedPath) {
5
+ return (normalizedPath.startsWith('.claude/skills/') ||
6
+ normalizedPath.includes('/.claude/skills/') ||
7
+ normalizedPath.startsWith('.agents/skills/') ||
8
+ normalizedPath.includes('/.agents/skills/'));
9
+ }
10
+ function isUnderCursorRulesDir(normalizedPath) {
11
+ return (normalizedPath.startsWith('.cursor/rules/') ||
12
+ normalizedPath.includes('/.cursor/rules/'));
13
+ }
14
+ export function detectFormat(path) {
15
+ const normalizedPath = normalizeGuidePath(path);
16
+ // Checked ahead of the generic `.agents/` rule below: a SKILL.md nested
17
+ // under a `skills/` directory is a distinct artifact (npx-skills / Claude
18
+ // Code skill installs), not a freeform `.agents/` guide entry. Every other
19
+ // file in a skills/ tree (scripts, references, assets) is skill *member*
20
+ // content — imported alongside its SKILL.md by discovery, never as a
21
+ // standalone guide — so the whole subtree is opaque to the rules below
22
+ // (previously `.agents/skills/<skill>/scripts/…` leaked through the
23
+ // `.agents/` catch-all as its own agents-dir guide).
24
+ if (isUnderSkillsDir(normalizedPath)) {
25
+ return normalizedPath.endsWith('/skill.md') ? 'skill-md' : null;
26
+ }
27
+ if (normalizedPath === 'agents.md' || normalizedPath.endsWith('/agents.md')) {
28
+ return 'agents-md';
29
+ }
30
+ if (normalizedPath === 'claude.md' || normalizedPath.endsWith('/claude.md')) {
31
+ return 'claude-md';
32
+ }
33
+ if (normalizedPath === '.cursorrules' || normalizedPath.endsWith('/.cursorrules')) {
34
+ return 'cursorrules';
35
+ }
36
+ // Modern Cursor "Project Rules": a directory of `.mdc` files under
37
+ // `.cursor/rules/` (project or `~/.cursor/rules/` global), distinct from the
38
+ // legacy single-file `.cursorrules` above. Cursor only reads `.mdc` files
39
+ // here, so other files (README.md, assets) fall through to `null`. Nested
40
+ // rule directories (`.cursor/rules/frontend/*.mdc`) are matched too.
41
+ if (isUnderCursorRulesDir(normalizedPath) && normalizedPath.endsWith('.mdc')) {
42
+ return 'cursor-rules';
43
+ }
44
+ if (normalizedPath.startsWith('.agents/') || normalizedPath.includes('/.agents/')) {
45
+ return 'agents-dir';
46
+ }
47
+ if (normalizedPath.startsWith('.claude/rules/') ||
48
+ normalizedPath.includes('/.claude/rules/')) {
49
+ return 'claude-rules';
50
+ }
51
+ return null;
52
+ }
53
+ export function isSupportedGuidePath(path) {
54
+ return detectFormat(path) !== null;
55
+ }
56
+ /**
57
+ * True for a path inside a `skills/<name>/` tree that is NOT itself the
58
+ * SKILL.md — i.e. skill *member* content (scripts, references, assets).
59
+ * `detectFormat` deliberately returns `null` for these, so consumers that
60
+ * treat a member edit as belonging to its owning skill (e.g. `rules watch`
61
+ * re-sync) use this to recognise them rather than dropping them as unknown.
62
+ */
63
+ export function isSkillMemberPath(path) {
64
+ const normalizedPath = normalizeGuidePath(path);
65
+ return isUnderSkillsDir(normalizedPath) && !normalizedPath.endsWith('/skill.md');
66
+ }
67
+ //# sourceMappingURL=detect-format.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detect-format.js","sourceRoot":"","sources":["../src/detect-format.ts"],"names":[],"mappings":"AAEA,SAAS,kBAAkB,CAAC,IAAY;IACtC,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,WAAW,EAAE,CAAA;AACtE,CAAC;AAED,SAAS,gBAAgB,CAAC,cAAsB;IAC9C,OAAO,CACL,cAAc,CAAC,UAAU,CAAC,iBAAiB,CAAC;QAC5C,cAAc,CAAC,QAAQ,CAAC,kBAAkB,CAAC;QAC3C,cAAc,CAAC,UAAU,CAAC,iBAAiB,CAAC;QAC5C,cAAc,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAC5C,CAAA;AACH,CAAC;AAED,SAAS,qBAAqB,CAAC,cAAsB;IACnD,OAAO,CACL,cAAc,CAAC,UAAU,CAAC,gBAAgB,CAAC;QAC3C,cAAc,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAC3C,CAAA;AACH,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,MAAM,cAAc,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAA;IAE/C,wEAAwE;IACxE,0EAA0E;IAC1E,2EAA2E;IAC3E,yEAAyE;IACzE,qEAAqE;IACrE,uEAAuE;IACvE,oEAAoE;IACpE,qDAAqD;IACrD,IAAI,gBAAgB,CAAC,cAAc,CAAC,EAAE,CAAC;QACrC,OAAO,cAAc,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAA;IACjE,CAAC;IAED,IAAI,cAAc,KAAK,WAAW,IAAI,cAAc,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;QAC5E,OAAO,WAAW,CAAA;IACpB,CAAC;IAED,IAAI,cAAc,KAAK,WAAW,IAAI,cAAc,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;QAC5E,OAAO,WAAW,CAAA;IACpB,CAAC;IAED,IAAI,cAAc,KAAK,cAAc,IAAI,cAAc,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC;QAClF,OAAO,aAAa,CAAA;IACtB,CAAC;IAED,mEAAmE;IACnE,6EAA6E;IAC7E,0EAA0E;IAC1E,0EAA0E;IAC1E,qEAAqE;IACrE,IAAI,qBAAqB,CAAC,cAAc,CAAC,IAAI,cAAc,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QAC7E,OAAO,cAAc,CAAA;IACvB,CAAC;IAED,IAAI,cAAc,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,cAAc,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;QAClF,OAAO,YAAY,CAAA;IACrB,CAAC;IAED,IACE,cAAc,CAAC,UAAU,CAAC,gBAAgB,CAAC;QAC3C,cAAc,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EAC1C,CAAC;QACD,OAAO,cAAc,CAAA;IACvB,CAAC;IAED,OAAO,IAAI,CAAA;AACb,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,IAAY;IAC/C,OAAO,YAAY,CAAC,IAAI,CAAC,KAAK,IAAI,CAAA;AACpC,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC5C,MAAM,cAAc,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAA;IAC/C,OAAO,gBAAgB,CAAC,cAAc,CAAC,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAA;AAClF,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=detect-format.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detect-format.test.d.ts","sourceRoot":"","sources":["../src/detect-format.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,85 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { detectFormat, isSkillMemberPath, isSupportedGuidePath } from './detect-format.js';
3
+ describe('detectFormat', () => {
4
+ it('detects canonical single-file formats', () => {
5
+ expect(detectFormat('AGENTS.md')).toBe('agents-md');
6
+ expect(detectFormat('/repo/CLAUDE.md')).toBe('claude-md');
7
+ expect(detectFormat('.cursorrules')).toBe('cursorrules');
8
+ });
9
+ it('detects directory-backed formats by path only', () => {
10
+ expect(detectFormat('.agents/reviewer/SKILL.md')).toBe('agents-dir');
11
+ expect(detectFormat('/repo/.claude/rules/backend.md')).toBe('claude-rules');
12
+ });
13
+ it('detects a SKILL.md nested under a skills/ directory as skill-md', () => {
14
+ expect(detectFormat('.claude/skills/reviewer/SKILL.md')).toBe('skill-md');
15
+ expect(detectFormat('/repo/.claude/skills/reviewer/SKILL.md')).toBe('skill-md');
16
+ expect(detectFormat('.agents/skills/reviewer/SKILL.md')).toBe('skill-md');
17
+ expect(detectFormat('/repo/.agents/skills/reviewer/SKILL.md')).toBe('skill-md');
18
+ });
19
+ it('ignores non-SKILL.md files inside a skills/ directory', () => {
20
+ expect(detectFormat('.claude/skills/reviewer/script.py')).toBeNull();
21
+ expect(detectFormat('.claude/skills/reviewer/README.md')).toBeNull();
22
+ // The whole skills/ subtree is opaque: under .agents/skills/ member files
23
+ // must not leak through the generic .agents/ catch-all as agents-dir
24
+ // guides — they import with their skill, as members.
25
+ expect(detectFormat('.agents/skills/reviewer/scripts/lint.py')).toBeNull();
26
+ expect(detectFormat('.agents/skills/reviewer/references/api.md')).toBeNull();
27
+ // Even an AGENTS.md nested in a skill directory is skill member content.
28
+ expect(detectFormat('.claude/skills/reviewer/references/AGENTS.md')).toBeNull();
29
+ });
30
+ it('detects .mdc files under .cursor/rules/ as cursor-rules', () => {
31
+ expect(detectFormat('.cursor/rules/backend.mdc')).toBe('cursor-rules');
32
+ expect(detectFormat('/repo/.cursor/rules/backend.mdc')).toBe('cursor-rules');
33
+ // Nested rule directories are supported.
34
+ expect(detectFormat('.cursor/rules/frontend/api.mdc')).toBe('cursor-rules');
35
+ // Global (~/.cursor/rules/) paths resolve to absolute home paths.
36
+ expect(detectFormat('/home/user/.cursor/rules/style.mdc')).toBe('cursor-rules');
37
+ });
38
+ it('ignores non-.mdc files under .cursor/rules/ and the legacy single file', () => {
39
+ expect(detectFormat('.cursor/rules/README.md')).toBeNull();
40
+ expect(detectFormat('.cursor/rules/assets/logo.png')).toBeNull();
41
+ // The legacy single-file format stays distinct from the directory format.
42
+ expect(detectFormat('.cursorrules')).toBe('cursorrules');
43
+ });
44
+ it('normalizes windows-style paths', () => {
45
+ expect(detectFormat('C:\\repo\\AGENTS.md')).toBe('agents-md');
46
+ expect(detectFormat('C:\\repo\\CLAUDE.md')).toBe('claude-md');
47
+ expect(detectFormat('C:\\repo\\.agents\\reviewer\\SKILL.md')).toBe('agents-dir');
48
+ expect(detectFormat('C:\\repo\\.claude\\rules\\backend.md')).toBe('claude-rules');
49
+ expect(detectFormat('C:\\repo\\.claude\\skills\\reviewer\\SKILL.md')).toBe('skill-md');
50
+ expect(detectFormat('C:\\repo\\.cursor\\rules\\backend.mdc')).toBe('cursor-rules');
51
+ });
52
+ it('returns null for unsupported paths', () => {
53
+ expect(detectFormat('README.md')).toBeNull();
54
+ expect(detectFormat('.agents')).toBeNull();
55
+ expect(detectFormat('.claude/settings.json')).toBeNull();
56
+ });
57
+ });
58
+ describe('isSupportedGuidePath', () => {
59
+ it('tracks detectFormat support', () => {
60
+ expect(isSupportedGuidePath('AGENTS.md')).toBe(true);
61
+ expect(isSupportedGuidePath('docs/guide.md')).toBe(false);
62
+ });
63
+ });
64
+ describe('isSkillMemberPath', () => {
65
+ it('is true for member content inside a skills/ tree', () => {
66
+ expect(isSkillMemberPath('.claude/skills/reviewer/script.py')).toBe(true);
67
+ expect(isSkillMemberPath('.claude/skills/reviewer/references/api.md')).toBe(true);
68
+ expect(isSkillMemberPath('/repo/.claude/skills/reviewer/assets/logo.png')).toBe(true);
69
+ expect(isSkillMemberPath('.agents/skills/reviewer/scripts/lint.py')).toBe(true);
70
+ // Even a nested AGENTS.md is member content, matching detectFormat.
71
+ expect(isSkillMemberPath('.claude/skills/reviewer/references/AGENTS.md')).toBe(true);
72
+ });
73
+ it('is false for the SKILL.md itself', () => {
74
+ expect(isSkillMemberPath('.claude/skills/reviewer/SKILL.md')).toBe(false);
75
+ expect(isSkillMemberPath('/repo/.agents/skills/reviewer/SKILL.md')).toBe(false);
76
+ expect(isSkillMemberPath('C:\\repo\\.claude\\skills\\reviewer\\SKILL.md')).toBe(false);
77
+ });
78
+ it('is false for paths outside a skills/ tree', () => {
79
+ expect(isSkillMemberPath('AGENTS.md')).toBe(false);
80
+ expect(isSkillMemberPath('.claude/rules/backend.md')).toBe(false);
81
+ expect(isSkillMemberPath('.cursor/rules/backend.mdc')).toBe(false);
82
+ expect(isSkillMemberPath('docs/guide.md')).toBe(false);
83
+ });
84
+ });
85
+ //# sourceMappingURL=detect-format.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detect-format.test.js","sourceRoot":"","sources":["../src/detect-format.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * @auden.to/projections
3
+ *
4
+ * Pure projection logic for canonical AGENTS.md and .agents/ outputs,
5
+ * plus compatibility exporters for platform-native formats.
6
+ * This package must remain importable outside the CLI package.
7
+ */
8
+ export * from './agents-md.js';
9
+ export * from './agents-dir.js';
10
+ export * from './claude-md.js';
11
+ export * from './claude-rules.js';
12
+ export * from './compatibility-attribution.js';
13
+ export * from './cursor-rules.js';
14
+ export * from './detect-format.js';
15
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,cAAc,gBAAgB,CAAA;AAC9B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,mBAAmB,CAAA;AACjC,cAAc,gCAAgC,CAAA;AAC9C,cAAc,mBAAmB,CAAA;AACjC,cAAc,oBAAoB,CAAA"}
package/dist/index.js ADDED
@@ -0,0 +1,15 @@
1
+ /**
2
+ * @auden.to/projections
3
+ *
4
+ * Pure projection logic for canonical AGENTS.md and .agents/ outputs,
5
+ * plus compatibility exporters for platform-native formats.
6
+ * This package must remain importable outside the CLI package.
7
+ */
8
+ export * from './agents-md.js';
9
+ export * from './agents-dir.js';
10
+ export * from './claude-md.js';
11
+ export * from './claude-rules.js';
12
+ export * from './compatibility-attribution.js';
13
+ export * from './cursor-rules.js';
14
+ export * from './detect-format.js';
15
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,cAAc,gBAAgB,CAAA;AAC9B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,mBAAmB,CAAA;AACjC,cAAc,gCAAgC,CAAA;AAC9C,cAAc,mBAAmB,CAAA;AACjC,cAAc,oBAAoB,CAAA"}
package/package.json ADDED
@@ -0,0 +1,47 @@
1
+ {
2
+ "name": "@auden.to/projections",
3
+ "version": "0.1.0-alpha.2",
4
+ "private": false,
5
+ "description": "Guide file format detection and compatibility renderers for Auden — AGENTS.md, .agents/, CLAUDE.md, .claude/rules/, .cursorrules.",
6
+ "license": "MIT",
7
+ "type": "module",
8
+ "main": "./dist/index.js",
9
+ "types": "./dist/index.d.ts",
10
+ "exports": {
11
+ ".": {
12
+ "import": "./dist/index.js",
13
+ "types": "./dist/index.d.ts"
14
+ }
15
+ },
16
+ "files": [
17
+ "dist",
18
+ "!dist/.tsbuildinfo",
19
+ "README.md",
20
+ "LICENSE"
21
+ ],
22
+ "repository": {
23
+ "type": "git",
24
+ "url": "https://github.com/auden-to/auden.git",
25
+ "directory": "packages/projections"
26
+ },
27
+ "publishConfig": {
28
+ "access": "public",
29
+ "provenance": false
30
+ },
31
+ "scripts": {
32
+ "build": "tsc --project tsconfig.json",
33
+ "dev": "tsc --project tsconfig.json --watch",
34
+ "typecheck": "tsc --project tsconfig.json --noEmit",
35
+ "lint": "oxlint",
36
+ "lint:fix": "oxfmt && oxlint --fix",
37
+ "format": "oxfmt",
38
+ "format:check": "oxfmt --check",
39
+ "test": "vitest run"
40
+ },
41
+ "dependencies": {
42
+ "@auden.to/protocol": "0.1.0-alpha.2"
43
+ },
44
+ "devDependencies": {
45
+ "typescript": "*"
46
+ }
47
+ }