fathom-cli 0.3.5 → 0.3.6

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.
@@ -35,7 +35,9 @@ var TechSchema = external_exports.object({
35
35
  });
36
36
  var ProvidersSchema = external_exports.object({
37
37
  preferred: external_exports.string().optional(),
38
- api_key_env: external_exports.string().optional(),
38
+ api_key_env: external_exports.string().regex(/^[A-Z_][A-Z0-9_]*$/, {
39
+ message: "Environment variable name must match ^[A-Z_][A-Z0-9_]*$ (uppercase letters, digits, underscores)"
40
+ }).optional(),
39
41
  fallback: external_exports.string().optional(),
40
42
  local_models: external_exports.array(external_exports.string()).default([])
41
43
  });
@@ -67,7 +69,7 @@ async function loadIntent(dir) {
67
69
  throw new Error(`Intent file not found: ${filePath}`);
68
70
  }
69
71
  const content = readFileSync(filePath, "utf-8");
70
- const raw = jsYaml.load(content);
72
+ const raw = jsYaml.load(content, { schema: jsYaml.JSON_SCHEMA });
71
73
  return IntentSchema.parse(raw);
72
74
  }
73
75
  async function saveIntent(dir, intent) {
@@ -98,6 +100,11 @@ function findDataDir() {
98
100
  }
99
101
  }
100
102
  function loadTemplate(name) {
103
+ if (!/^[a-zA-Z0-9_-]+$/.test(name)) {
104
+ throw new Error(
105
+ `Invalid template name: "${name}". Template names must contain only letters, digits, hyphens, and underscores.`
106
+ );
107
+ }
101
108
  const dir = findDataDir();
102
109
  const filePath = resolve(dir, `${name}.yaml`);
103
110
  let content;
@@ -108,7 +115,7 @@ function loadTemplate(name) {
108
115
  `Unknown guardrail template: "${name}". Use listTemplates() to see available templates.`
109
116
  );
110
117
  }
111
- const raw = jsYaml.load(content);
118
+ const raw = jsYaml.load(content, { schema: jsYaml.JSON_SCHEMA });
112
119
  return GuardrailTemplateSchema.parse(raw);
113
120
  }
114
121
  function listTemplates() {
@@ -116,7 +123,7 @@ function listTemplates() {
116
123
  const files = readdirSync(dir).filter((f) => f.endsWith(".yaml"));
117
124
  return files.map((file) => {
118
125
  const content = readFileSync2(resolve(dir, file), "utf-8");
119
- const raw = jsYaml.load(content);
126
+ const raw = jsYaml.load(content, { schema: jsYaml.JSON_SCHEMA });
120
127
  return {
121
128
  name: raw.name,
122
129
  description: raw.description,
@@ -166,4 +173,4 @@ export {
166
173
  listTemplates,
167
174
  resolveGuardrails
168
175
  };
169
- //# sourceMappingURL=chunk-TXIC6BY4.js.map
176
+ //# sourceMappingURL=chunk-E6YGKUJB.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../intent/src/schema.ts","../../intent/src/loader.ts","../../intent/src/guardrails.ts"],"sourcesContent":["import { z } from \"zod\";\n\n// ── Value schema ────────────────────────────────────────────\n\nexport const ValueSchema = z.object({\n name: z.string(),\n description: z.string(),\n priority: z.enum([\"critical\", \"high\", \"medium\", \"low\"]).default(\"medium\"),\n details: z.string().optional(),\n});\n\nexport type Value = z.infer<typeof ValueSchema>;\n\n// ── Budget schema ───────────────────────────────────────────\n\nexport const BudgetSchema = z.object({\n monthly_limit: z.number().positive(),\n alert_threshold: z.number().min(0).max(1).default(0.8),\n prefer_batch: z.boolean().default(false),\n currency: z.string().default(\"USD\"),\n});\n\nexport type Budget = z.infer<typeof BudgetSchema>;\n\n// ── Guardrails schema ───────────────────────────────────────\n\nexport const GuardrailsSchema = z.object({\n security: z\n .object({\n templates: z.array(z.string()).default([]),\n custom: z.array(z.string()).default([]),\n })\n .optional(),\n quality: z.array(z.string()).default([]),\n process: z.array(z.string()).default([]),\n});\n\nexport type Guardrails = z.infer<typeof GuardrailsSchema>;\n\n// ── Tech schema ─────────────────────────────────────────────\n\nexport const TechSchema = z.object({\n stack: z.array(z.string()).default([]),\n opinions: z.array(z.string()).default([]),\n});\n\nexport type Tech = z.infer<typeof TechSchema>;\n\n// ── Providers schema ────────────────────────────────────────\n\nexport const ProvidersSchema = z.object({\n preferred: z.string().optional(),\n api_key_env: z.string().regex(/^[A-Z_][A-Z0-9_]*$/, {\n message: \"Environment variable name must match ^[A-Z_][A-Z0-9_]*$ (uppercase letters, digits, underscores)\",\n }).optional(),\n fallback: z.string().optional(),\n local_models: z.array(z.string()).default([]),\n});\n\nexport type Providers = z.infer<typeof ProvidersSchema>;\n\n// ── Intent schema (top-level) ───────────────────────────────\n\nexport const IntentSchema = z.object({\n project: z.string(),\n description: z.string(),\n audience: z.string().optional(),\n values: z.array(ValueSchema).default([]),\n budget: BudgetSchema.optional(),\n guardrails: GuardrailsSchema.optional(),\n tech: TechSchema.optional(),\n providers: ProvidersSchema.optional(),\n});\n\nexport type IntentConfig = z.infer<typeof IntentSchema>;\n\n// ── Guardrail template schema ───────────────────────────────\n\nexport const GuardrailTemplateSchema = z.object({\n name: z.string(),\n description: z.string(),\n category: z.enum([\"security\", \"quality\"]),\n status: z.string().optional(),\n rules: z.array(z.string()),\n});\n\nexport type GuardrailTemplate = z.infer<typeof GuardrailTemplateSchema>;\n\n// ── Resolved guardrails (flat output) ───────────────────────\n\nexport interface ResolvedGuardrails {\n security: string[];\n quality: string[];\n process: string[];\n}\n\nexport interface TemplateInfo {\n name: string;\n description: string;\n category: string;\n status?: string;\n}\n","import { readFileSync, writeFileSync, mkdirSync, existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport yaml from \"js-yaml\";\nimport { IntentSchema, type IntentConfig } from \"./schema.js\";\n\nconst INTENT_DIR = \".fathom\";\nconst INTENT_FILE = \"intent.yaml\";\n\nfunction intentPath(dir: string): string {\n return join(dir, INTENT_DIR, INTENT_FILE);\n}\n\n/**\n * Load and validate intent from a project directory.\n * Reads `.fathom/intent.yaml`, parses YAML, validates with Zod.\n */\nexport async function loadIntent(dir: string): Promise<IntentConfig> {\n const filePath = intentPath(dir);\n\n if (!existsSync(filePath)) {\n throw new Error(`Intent file not found: ${filePath}`);\n }\n\n const content = readFileSync(filePath, \"utf-8\");\n const raw = yaml.load(content, { schema: yaml.JSON_SCHEMA });\n return IntentSchema.parse(raw);\n}\n\n/**\n * Validate and save intent to a project directory.\n * Writes validated YAML to `.fathom/intent.yaml`. Creates `.fathom/` if needed.\n */\nexport async function saveIntent(dir: string, intent: IntentConfig): Promise<void> {\n // Validate before writing\n const validated = IntentSchema.parse(intent);\n\n const fathomDir = join(dir, INTENT_DIR);\n if (!existsSync(fathomDir)) {\n mkdirSync(fathomDir, { recursive: true });\n }\n\n const content = yaml.dump(validated, {\n lineWidth: 120,\n noRefs: true,\n quotingType: '\"',\n forceQuotes: false,\n });\n\n writeFileSync(intentPath(dir), content, \"utf-8\");\n}\n\n/**\n * Synchronously check if `.fathom/intent.yaml` exists in a directory.\n */\nexport function detectIntent(dir: string): boolean {\n return existsSync(intentPath(dir));\n}\n","import { readFileSync, readdirSync } from \"node:fs\";\nimport { resolve, basename } from \"node:path\";\nimport yaml from \"js-yaml\";\nimport {\n GuardrailTemplateSchema,\n type GuardrailTemplate,\n type IntentConfig,\n type ResolvedGuardrails,\n type TemplateInfo,\n} from \"./schema.js\";\n\nfunction findDataDir(): string {\n const base = import.meta.dirname ?? __dirname;\n // Try bundled location first (dist/data/ when installed from npm)\n const bundled = resolve(base, \"data\", \"guardrails\");\n try {\n readdirSync(bundled);\n return bundled;\n } catch {\n // Fall back to monorepo location (packages/intent/data/guardrails from dist/)\n return resolve(base, \"..\", \"data\", \"guardrails\");\n }\n}\n\n/**\n * Load a guardrail template by name.\n */\nexport function loadTemplate(name: string): GuardrailTemplate {\n // SEC-02: Prevent path traversal via template name\n if (!/^[a-zA-Z0-9_-]+$/.test(name)) {\n throw new Error(\n `Invalid template name: \"${name}\". Template names must contain only letters, digits, hyphens, and underscores.`,\n );\n }\n\n const dir = findDataDir();\n const filePath = resolve(dir, `${name}.yaml`);\n\n let content: string;\n try {\n content = readFileSync(filePath, \"utf-8\");\n } catch {\n throw new Error(\n `Unknown guardrail template: \"${name}\". Use listTemplates() to see available templates.`,\n );\n }\n\n const raw = yaml.load(content, { schema: yaml.JSON_SCHEMA });\n return GuardrailTemplateSchema.parse(raw);\n}\n\n/**\n * List all available guardrail templates.\n */\nexport function listTemplates(): TemplateInfo[] {\n const dir = findDataDir();\n const files = readdirSync(dir).filter((f) => f.endsWith(\".yaml\"));\n\n return files.map((file) => {\n const content = readFileSync(resolve(dir, file), \"utf-8\");\n const raw = yaml.load(content, { schema: yaml.JSON_SCHEMA }) as Record<string, unknown>;\n return {\n name: raw.name as string,\n description: raw.description as string,\n category: raw.category as string,\n status: raw.status as string | undefined,\n };\n });\n}\n\n/**\n * Resolve all guardrail templates and custom rules from an intent config\n * into a flat categorized object.\n */\nexport function resolveGuardrails(intent: IntentConfig): ResolvedGuardrails {\n const result: ResolvedGuardrails = {\n security: [],\n quality: [],\n process: [],\n };\n\n if (!intent.guardrails) {\n return result;\n }\n\n const { guardrails } = intent;\n\n // Expand security templates\n if (guardrails.security) {\n for (const templateName of guardrails.security.templates) {\n const template = loadTemplate(templateName);\n if (template.category === \"security\") {\n result.security.push(...template.rules);\n } else if (template.category === \"quality\") {\n result.quality.push(...template.rules);\n }\n }\n\n // Add custom security rules\n result.security.push(...guardrails.security.custom);\n }\n\n // Add quality rules (these are direct string rules, not template refs)\n result.quality.push(...guardrails.quality);\n\n // Add process rules\n result.process.push(...guardrails.process);\n\n return result;\n}\n"],"mappings":";;;;;;;ACAA,SAAS,cAAc,eAAe,WAAW,kBAAkB;AACnE,SAAS,YAAY;ACDrB,SAAS,gBAAAA,eAAc,mBAAmB;AAC1C,SAAS,eAAyB;AFG3B,IAAM,cAAc,iBAAE,OAAO;EAClC,MAAM,iBAAE,OAAO;EACf,aAAa,iBAAE,OAAO;EACtB,UAAU,iBAAE,KAAK,CAAC,YAAY,QAAQ,UAAU,KAAK,CAAC,EAAE,QAAQ,QAAQ;EACxE,SAAS,iBAAE,OAAO,EAAE,SAAS;AAC/B,CAAC;AAMM,IAAM,eAAe,iBAAE,OAAO;EACnC,eAAe,iBAAE,OAAO,EAAE,SAAS;EACnC,iBAAiB,iBAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,QAAQ,GAAG;EACrD,cAAc,iBAAE,QAAQ,EAAE,QAAQ,KAAK;EACvC,UAAU,iBAAE,OAAO,EAAE,QAAQ,KAAK;AACpC,CAAC;AAMM,IAAM,mBAAmB,iBAAE,OAAO;EACvC,UAAU,iBACP,OAAO;IACN,WAAW,iBAAE,MAAM,iBAAE,OAAO,CAAC,EAAE,QAAQ,CAAC,CAAC;IACzC,QAAQ,iBAAE,MAAM,iBAAE,OAAO,CAAC,EAAE,QAAQ,CAAC,CAAC;EACxC,CAAC,EACA,SAAS;EACZ,SAAS,iBAAE,MAAM,iBAAE,OAAO,CAAC,EAAE,QAAQ,CAAC,CAAC;EACvC,SAAS,iBAAE,MAAM,iBAAE,OAAO,CAAC,EAAE,QAAQ,CAAC,CAAC;AACzC,CAAC;AAMM,IAAM,aAAa,iBAAE,OAAO;EACjC,OAAO,iBAAE,MAAM,iBAAE,OAAO,CAAC,EAAE,QAAQ,CAAC,CAAC;EACrC,UAAU,iBAAE,MAAM,iBAAE,OAAO,CAAC,EAAE,QAAQ,CAAC,CAAC;AAC1C,CAAC;AAMM,IAAM,kBAAkB,iBAAE,OAAO;EACtC,WAAW,iBAAE,OAAO,EAAE,SAAS;EAC/B,aAAa,iBAAE,OAAO,EAAE,MAAM,sBAAsB;IAClD,SAAS;EACX,CAAC,EAAE,SAAS;EACZ,UAAU,iBAAE,OAAO,EAAE,SAAS;EAC9B,cAAc,iBAAE,MAAM,iBAAE,OAAO,CAAC,EAAE,QAAQ,CAAC,CAAC;AAC9C,CAAC;AAMM,IAAM,eAAe,iBAAE,OAAO;EACnC,SAAS,iBAAE,OAAO;EAClB,aAAa,iBAAE,OAAO;EACtB,UAAU,iBAAE,OAAO,EAAE,SAAS;EAC9B,QAAQ,iBAAE,MAAM,WAAW,EAAE,QAAQ,CAAC,CAAC;EACvC,QAAQ,aAAa,SAAS;EAC9B,YAAY,iBAAiB,SAAS;EACtC,MAAM,WAAW,SAAS;EAC1B,WAAW,gBAAgB,SAAS;AACtC,CAAC;AAMM,IAAM,0BAA0B,iBAAE,OAAO;EAC9C,MAAM,iBAAE,OAAO;EACf,aAAa,iBAAE,OAAO;EACtB,UAAU,iBAAE,KAAK,CAAC,YAAY,SAAS,CAAC;EACxC,QAAQ,iBAAE,OAAO,EAAE,SAAS;EAC5B,OAAO,iBAAE,MAAM,iBAAE,OAAO,CAAC;AAC3B,CAAC;AC/ED,IAAM,aAAa;AACnB,IAAM,cAAc;AAEpB,SAAS,WAAW,KAAqB;AACvC,SAAO,KAAK,KAAK,YAAY,WAAW;AAC1C;AAMA,eAAsB,WAAW,KAAoC;AACnE,QAAM,WAAW,WAAW,GAAG;AAE/B,MAAI,CAAC,WAAW,QAAQ,GAAG;AACzB,UAAM,IAAI,MAAM,0BAA0B,QAAQ,EAAE;EACtD;AAEA,QAAM,UAAU,aAAa,UAAU,OAAO;AAC9C,QAAM,MAAM,OAAK,KAAK,SAAS,EAAE,QAAQ,OAAK,YAAY,CAAC;AAC3D,SAAO,aAAa,MAAM,GAAG;AAC/B;AAMA,eAAsB,WAAW,KAAa,QAAqC;AAEjF,QAAM,YAAY,aAAa,MAAM,MAAM;AAE3C,QAAM,YAAY,KAAK,KAAK,UAAU;AACtC,MAAI,CAAC,WAAW,SAAS,GAAG;AAC1B,cAAU,WAAW,EAAE,WAAW,KAAK,CAAC;EAC1C;AAEA,QAAM,UAAU,OAAK,KAAK,WAAW;IACnC,WAAW;IACX,QAAQ;IACR,aAAa;IACb,aAAa;EACf,CAAC;AAED,gBAAc,WAAW,GAAG,GAAG,SAAS,OAAO;AACjD;AAKO,SAAS,aAAa,KAAsB;AACjD,SAAO,WAAW,WAAW,GAAG,CAAC;AACnC;AC7CA,SAAS,cAAsB;AAC7B,QAAM,OAAO,YAAY,WAAW;AAEpC,QAAM,UAAU,QAAQ,MAAM,QAAQ,YAAY;AAClD,MAAI;AACF,gBAAY,OAAO;AACnB,WAAO;EACT,QAAQ;AAEN,WAAO,QAAQ,MAAM,MAAM,QAAQ,YAAY;EACjD;AACF;AAKO,SAAS,aAAa,MAAiC;AAE5D,MAAI,CAAC,mBAAmB,KAAK,IAAI,GAAG;AAClC,UAAM,IAAI;MACR,2BAA2B,IAAI;IACjC;EACF;AAEA,QAAM,MAAM,YAAY;AACxB,QAAM,WAAW,QAAQ,KAAK,GAAG,IAAI,OAAO;AAE5C,MAAI;AACJ,MAAI;AACF,cAAUC,cAAa,UAAU,OAAO;EAC1C,QAAQ;AACN,UAAM,IAAI;MACR,gCAAgC,IAAI;IACtC;EACF;AAEA,QAAM,MAAMC,OAAK,KAAK,SAAS,EAAE,QAAQA,OAAK,YAAY,CAAC;AAC3D,SAAO,wBAAwB,MAAM,GAAG;AAC1C;AAKO,SAAS,gBAAgC;AAC9C,QAAM,MAAM,YAAY;AACxB,QAAM,QAAQ,YAAY,GAAG,EAAE,OAAO,CAAC,MAAM,EAAE,SAAS,OAAO,CAAC;AAEhE,SAAO,MAAM,IAAI,CAAC,SAAS;AACzB,UAAM,UAAUD,cAAa,QAAQ,KAAK,IAAI,GAAG,OAAO;AACxD,UAAM,MAAMC,OAAK,KAAK,SAAS,EAAE,QAAQA,OAAK,YAAY,CAAC;AAC3D,WAAO;MACL,MAAM,IAAI;MACV,aAAa,IAAI;MACjB,UAAU,IAAI;MACd,QAAQ,IAAI;IACd;EACF,CAAC;AACH;AAMO,SAAS,kBAAkB,QAA0C;AAC1E,QAAM,SAA6B;IACjC,UAAU,CAAC;IACX,SAAS,CAAC;IACV,SAAS,CAAC;EACZ;AAEA,MAAI,CAAC,OAAO,YAAY;AACtB,WAAO;EACT;AAEA,QAAM,EAAE,WAAW,IAAI;AAGvB,MAAI,WAAW,UAAU;AACvB,eAAW,gBAAgB,WAAW,SAAS,WAAW;AACxD,YAAM,WAAW,aAAa,YAAY;AAC1C,UAAI,SAAS,aAAa,YAAY;AACpC,eAAO,SAAS,KAAK,GAAG,SAAS,KAAK;MACxC,WAAW,SAAS,aAAa,WAAW;AAC1C,eAAO,QAAQ,KAAK,GAAG,SAAS,KAAK;MACvC;IACF;AAGA,WAAO,SAAS,KAAK,GAAG,WAAW,SAAS,MAAM;EACpD;AAGA,SAAO,QAAQ,KAAK,GAAG,WAAW,OAAO;AAGzC,SAAO,QAAQ,KAAK,GAAG,WAAW,OAAO;AAEzC,SAAO;AACT;","names":["readFileSync","readFileSync","yaml"]}
@@ -1,12 +1,12 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  resolveGuardrails
4
- } from "./chunk-TXIC6BY4.js";
4
+ } from "./chunk-E6YGKUJB.js";
5
5
  import "./chunk-MNGU6SI4.js";
6
6
  import "./chunk-SEGVTWSK.js";
7
7
 
8
8
  // ../projections/dist/index.js
9
- import { mkdirSync, writeFileSync } from "fs";
9
+ import { mkdir, writeFile } from "fs/promises";
10
10
  import { dirname, resolve } from "path";
11
11
  function generateClaudeSkill(intent, guardrails, context) {
12
12
  const sections = [];
@@ -486,11 +486,22 @@ function generateProjections(intent, context, targets) {
486
486
  async function writeProjections(dir, intent, context, targets) {
487
487
  const output = generateProjections(intent, context, targets);
488
488
  const written = [];
489
+ const errors = [];
489
490
  for (const [relativePath, content] of output.files) {
490
491
  const absPath = resolve(dir, ".fathom", relativePath);
491
- mkdirSync(dirname(absPath), { recursive: true });
492
- writeFileSync(absPath, content, "utf-8");
493
- written.push(absPath);
492
+ try {
493
+ await mkdir(dirname(absPath), { recursive: true });
494
+ await writeFile(absPath, content, "utf-8");
495
+ written.push(absPath);
496
+ } catch (err) {
497
+ errors.push({ path: absPath, error: err });
498
+ console.error(`[Projections] Failed to write ${absPath}:`, err);
499
+ }
500
+ }
501
+ if (errors.length > 0 && written.length === 0) {
502
+ throw new Error(
503
+ `Failed to write all projection files: ${errors.map((e) => e.path).join(", ")}`
504
+ );
494
505
  }
495
506
  return written;
496
507
  }
@@ -503,4 +514,4 @@ export {
503
514
  generateWindsurfRules,
504
515
  writeProjections
505
516
  };
506
- //# sourceMappingURL=dist-KXBSLOHP.js.map
517
+ //# sourceMappingURL=dist-HPXMBCZX.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../projections/src/templates/claude.ts","../../projections/src/templates/cursor.ts","../../projections/src/templates/generic.ts","../../projections/src/templates/copilot.ts","../../projections/src/templates/windsurf.ts","../../projections/src/generator.ts","../../projections/src/writer.ts"],"sourcesContent":["import type { IntentConfig, ResolvedGuardrails } from \"@fathom/intent\";\nimport type { ProjectionContext } from \"../types.js\";\n\n/**\n * Generate a Claude Code SKILL.md file from intent and guardrails.\n *\n * This is the primary projection — it should be thorough, well-structured,\n * and read naturally as instructions for an AI coding assistant.\n */\nexport function generateClaudeSkill(\n intent: IntentConfig,\n guardrails: ResolvedGuardrails,\n context?: ProjectionContext,\n): string {\n const sections: string[] = [];\n\n // Header\n sections.push(`# ${intent.project}`);\n\n // ── Project Context ────────────────────────────────────────\n sections.push(buildProjectContext(intent));\n\n // ── What Matters ───────────────────────────────────────────\n if (intent.values.length > 0) {\n sections.push(buildValues(intent));\n }\n\n // ── Budget Awareness ───────────────────────────────────────\n const budgetSection = buildBudget(intent, context);\n if (budgetSection) {\n sections.push(budgetSection);\n }\n\n // ── Guardrails ─────────────────────────────────────────────\n const guardrailSection = buildGuardrails(guardrails);\n if (guardrailSection) {\n sections.push(guardrailSection);\n }\n\n // ── Tech Context ───────────────────────────────────────────\n const techSection = buildTech(intent);\n if (techSection) {\n sections.push(techSection);\n }\n\n // ── Feature Registry ───────────────────────────────────────\n const registrySection = buildRegistry(context);\n if (registrySection) {\n sections.push(registrySection);\n }\n\n return sections.join(\"\\n\\n\") + \"\\n\";\n}\n\nfunction buildProjectContext(intent: IntentConfig): string {\n const lines: string[] = [\"## Project Context\"];\n lines.push(\"\");\n lines.push(intent.description);\n if (intent.audience) {\n lines.push(\"\");\n lines.push(`**Audience:** ${intent.audience}`);\n }\n return lines.join(\"\\n\");\n}\n\nfunction buildValues(intent: IntentConfig): string {\n const lines: string[] = [\"## What Matters\"];\n lines.push(\"\");\n lines.push(\n \"These are the project's core values, ordered by priority. Let them guide your decisions.\",\n );\n lines.push(\"\");\n\n // Sort by priority weight\n const priorityOrder = { critical: 0, high: 1, medium: 2, low: 3 };\n const sorted = [...intent.values].sort(\n (a, b) => priorityOrder[a.priority] - priorityOrder[b.priority],\n );\n\n for (const value of sorted) {\n const tag =\n value.priority === \"critical\"\n ? \" **(CRITICAL)**\"\n : value.priority === \"high\"\n ? \" **(high priority)**\"\n : \"\";\n lines.push(`- **${value.name}**${tag} — ${value.description}`);\n if (value.details) {\n lines.push(` - ${value.details}`);\n }\n }\n\n return lines.join(\"\\n\");\n}\n\nfunction buildBudget(\n intent: IntentConfig,\n context?: ProjectionContext,\n): string | null {\n if (!intent.budget) return null;\n\n const { budget } = intent;\n const lines: string[] = [\"## Budget Awareness\"];\n lines.push(\"\");\n lines.push(\n `This project has a monthly budget of **${budget.currency} ${budget.monthly_limit.toLocaleString()}**.`,\n );\n lines.push(\n `Alert threshold: ${Math.round(budget.alert_threshold * 100)}% of budget.`,\n );\n\n if (budget.prefer_batch) {\n lines.push(\"\");\n lines.push(\n \"**Prefer batch operations** where possible to reduce API costs.\",\n );\n }\n\n if (context?.trackingSummary) {\n const { totalCost, monthlySpend, totalTokens } = context.trackingSummary;\n const pct =\n budget.monthly_limit > 0\n ? Math.round((monthlySpend / budget.monthly_limit) * 100)\n : 0;\n lines.push(\"\");\n lines.push(\"### Current Spend\");\n lines.push(`- Monthly spend so far: ${budget.currency} ${monthlySpend.toFixed(2)} (${pct}% of budget)`);\n lines.push(`- Total project cost: ${budget.currency} ${totalCost.toFixed(2)}`);\n lines.push(`- Total tokens used: ${totalTokens.toLocaleString()}`);\n\n if (pct >= budget.alert_threshold * 100) {\n lines.push(\"\");\n lines.push(\n `> **Warning:** Monthly spend has reached ${pct}% of the budget. Be especially mindful of token usage.`,\n );\n }\n }\n\n return lines.join(\"\\n\");\n}\n\nfunction buildGuardrails(guardrails: ResolvedGuardrails): string | null {\n const hasAny =\n guardrails.security.length > 0 ||\n guardrails.quality.length > 0 ||\n guardrails.process.length > 0;\n\n if (!hasAny) return null;\n\n const lines: string[] = [\"## Guardrails\"];\n lines.push(\"\");\n lines.push(\"These rules are non-negotiable. Follow them in every change.\");\n\n if (guardrails.security.length > 0) {\n lines.push(\"\");\n lines.push(\"### Security\");\n for (const rule of guardrails.security) {\n lines.push(`- ${rule}`);\n }\n }\n\n if (guardrails.quality.length > 0) {\n lines.push(\"\");\n lines.push(\"### Quality\");\n for (const rule of guardrails.quality) {\n lines.push(`- ${rule}`);\n }\n }\n\n if (guardrails.process.length > 0) {\n lines.push(\"\");\n lines.push(\"### Process\");\n for (const rule of guardrails.process) {\n lines.push(`- ${rule}`);\n }\n }\n\n return lines.join(\"\\n\");\n}\n\nfunction buildTech(intent: IntentConfig): string | null {\n if (!intent.tech) return null;\n const { stack, opinions } = intent.tech;\n if (stack.length === 0 && opinions.length === 0) return null;\n\n const lines: string[] = [\"## Tech Context\"];\n\n if (stack.length > 0) {\n lines.push(\"\");\n lines.push(`**Stack:** ${stack.join(\", \")}`);\n }\n\n if (opinions.length > 0) {\n lines.push(\"\");\n lines.push(\"### Conventions\");\n for (const opinion of opinions) {\n lines.push(`- ${opinion}`);\n }\n }\n\n return lines.join(\"\\n\");\n}\n\nfunction buildRegistry(context?: ProjectionContext): string | null {\n if (!context?.registry || context.registry.length === 0) return null;\n\n const lines: string[] = [\"## Feature Registry\"];\n lines.push(\"\");\n lines.push(\"Current features being tracked:\");\n lines.push(\"\");\n\n const statusIcon: Record<string, string> = {\n active: \"🟢\",\n planned: \"🔵\",\n completed: \"✅\",\n paused: \"⏸️\",\n };\n\n for (const feature of context.registry) {\n const icon = statusIcon[feature.status] ?? \"⚪\";\n const tokens = feature.estimatedTokens\n ? ` (~${Math.round(feature.estimatedTokens / 1000)}K tokens)`\n : \"\";\n lines.push(`- ${icon} **${feature.name}** [${feature.status}]${tokens}`);\n }\n\n return lines.join(\"\\n\");\n}\n","import type { IntentConfig, ResolvedGuardrails } from \"@fathom/intent\";\nimport type { ProjectionContext } from \"../types.js\";\n\n/**\n * Generate a .cursorrules file from intent and guardrails.\n *\n * Cursor rules are plain text/markdown — no frontmatter.\n * More concise than the Claude skill, focused on actionable rules.\n */\nexport function generateCursorRules(\n intent: IntentConfig,\n guardrails: ResolvedGuardrails,\n context?: ProjectionContext,\n): string {\n const sections: string[] = [];\n\n // Project overview\n sections.push(`# ${intent.project}`);\n sections.push(\"\");\n sections.push(intent.description);\n if (intent.audience) {\n sections.push(`Audience: ${intent.audience}`);\n }\n\n // Values as rules\n if (intent.values.length > 0) {\n sections.push(\"\");\n sections.push(\"## Values\");\n const priorityOrder = { critical: 0, high: 1, medium: 2, low: 3 };\n const sorted = [...intent.values].sort(\n (a, b) => priorityOrder[a.priority] - priorityOrder[b.priority],\n );\n for (const value of sorted) {\n const priority =\n value.priority === \"critical\" || value.priority === \"high\"\n ? ` [${value.priority}]`\n : \"\";\n sections.push(`- ${value.name}${priority}: ${value.description}`);\n }\n }\n\n // Budget\n if (intent.budget) {\n sections.push(\"\");\n sections.push(\"## Budget\");\n sections.push(\n `- Monthly limit: ${intent.budget.currency} ${intent.budget.monthly_limit.toLocaleString()}`,\n );\n if (intent.budget.prefer_batch) {\n sections.push(\"- Prefer batch operations to reduce costs\");\n }\n if (context?.trackingSummary) {\n const pct = Math.round(\n (context.trackingSummary.monthlySpend / intent.budget.monthly_limit) *\n 100,\n );\n sections.push(\n `- Current monthly spend: ${intent.budget.currency} ${context.trackingSummary.monthlySpend.toFixed(2)} (${pct}%)`,\n );\n }\n }\n\n // Guardrails — all as flat rules\n const allRules = [\n ...guardrails.security.map((r) => `[security] ${r}`),\n ...guardrails.quality.map((r) => `[quality] ${r}`),\n ...guardrails.process.map((r) => `[process] ${r}`),\n ];\n\n if (allRules.length > 0) {\n sections.push(\"\");\n sections.push(\"## Rules\");\n for (const rule of allRules) {\n sections.push(`- ${rule}`);\n }\n }\n\n // Tech\n if (intent.tech) {\n const { stack, opinions } = intent.tech;\n if (stack.length > 0 || opinions.length > 0) {\n sections.push(\"\");\n sections.push(\"## Tech Stack\");\n if (stack.length > 0) {\n sections.push(`Stack: ${stack.join(\", \")}`);\n }\n if (opinions.length > 0) {\n for (const opinion of opinions) {\n sections.push(`- ${opinion}`);\n }\n }\n }\n }\n\n // Registry\n if (context?.registry && context.registry.length > 0) {\n sections.push(\"\");\n sections.push(\"## Features\");\n for (const feature of context.registry) {\n const tokens = feature.estimatedTokens\n ? ` (~${Math.round(feature.estimatedTokens / 1000)}K tokens)`\n : \"\";\n sections.push(`- ${feature.name} [${feature.status}]${tokens}`);\n }\n }\n\n return sections.join(\"\\n\") + \"\\n\";\n}\n","import type { IntentConfig, ResolvedGuardrails } from \"@fathom/intent\";\nimport type { ProjectionContext } from \"../types.js\";\n\n/**\n * Generate a generic system prompt suitable for any LLM API call.\n *\n * More concise than the other projections — focused on the essential\n * context and hard rules an LLM needs to follow.\n */\nexport function generateSystemPrompt(\n intent: IntentConfig,\n guardrails: ResolvedGuardrails,\n context?: ProjectionContext,\n): string {\n const parts: string[] = [];\n\n // Identity + context\n parts.push(\n `You are an AI assistant working on ${intent.project}. ${intent.description}`,\n );\n if (intent.audience) {\n parts.push(`The target audience is: ${intent.audience}.`);\n }\n\n // Values — keep concise\n if (intent.values.length > 0) {\n const priorityOrder = { critical: 0, high: 1, medium: 2, low: 3 };\n const sorted = [...intent.values].sort(\n (a, b) => priorityOrder[a.priority] - priorityOrder[b.priority],\n );\n const valueList = sorted\n .map((v) => {\n const tag = v.priority === \"critical\" ? \" (CRITICAL)\" : \"\";\n return `${v.name}${tag}: ${v.description}`;\n })\n .join(\"; \");\n parts.push(`Core values: ${valueList}.`);\n }\n\n // Budget — one line\n if (intent.budget) {\n let budgetLine = `Budget: ${intent.budget.currency} ${intent.budget.monthly_limit.toLocaleString()}/month.`;\n if (context?.trackingSummary) {\n const pct = Math.round(\n (context.trackingSummary.monthlySpend / intent.budget.monthly_limit) *\n 100,\n );\n budgetLine += ` Current spend: ${pct}%.`;\n }\n if (intent.budget.prefer_batch) {\n budgetLine += \" Prefer batch operations.\";\n }\n parts.push(budgetLine);\n }\n\n // Guardrails — mandatory rules\n const allRules = [\n ...guardrails.security,\n ...guardrails.quality,\n ...guardrails.process,\n ];\n if (allRules.length > 0) {\n parts.push(\"Mandatory rules:\");\n for (const rule of allRules) {\n parts.push(`- ${rule}`);\n }\n }\n\n // Tech — one line\n if (intent.tech) {\n const { stack, opinions } = intent.tech;\n if (stack.length > 0) {\n parts.push(`Tech stack: ${stack.join(\", \")}.`);\n }\n if (opinions.length > 0) {\n parts.push(`Conventions: ${opinions.join(\"; \")}.`);\n }\n }\n\n return parts.join(\"\\n\") + \"\\n\";\n}\n","import type { IntentConfig, ResolvedGuardrails } from \"@fathom/intent\";\nimport type { ProjectionContext } from \"../types.js\";\n\n/**\n * Generate a copilot-instructions.md file from intent and guardrails.\n *\n * GitHub Copilot reads .github/copilot-instructions.md for project-level\n * instructions. Format is plain markdown, similar to Cursor rules.\n */\nexport function generateCopilotInstructions(\n intent: IntentConfig,\n guardrails: ResolvedGuardrails,\n context?: ProjectionContext,\n): string {\n const sections: string[] = [];\n\n // Project overview\n sections.push(`# ${intent.project}`);\n sections.push(\"\");\n sections.push(intent.description);\n if (intent.audience) {\n sections.push(`Audience: ${intent.audience}`);\n }\n\n // Values as instructions\n if (intent.values.length > 0) {\n sections.push(\"\");\n sections.push(\"## Values\");\n const priorityOrder = { critical: 0, high: 1, medium: 2, low: 3 };\n const sorted = [...intent.values].sort(\n (a, b) => priorityOrder[a.priority] - priorityOrder[b.priority],\n );\n for (const value of sorted) {\n const priority =\n value.priority === \"critical\" || value.priority === \"high\"\n ? ` [${value.priority}]`\n : \"\";\n sections.push(`- ${value.name}${priority}: ${value.description}`);\n }\n }\n\n // Budget\n if (intent.budget) {\n sections.push(\"\");\n sections.push(\"## Budget\");\n sections.push(\n `- Monthly limit: ${intent.budget.currency} ${intent.budget.monthly_limit.toLocaleString()}`,\n );\n if (intent.budget.prefer_batch) {\n sections.push(\"- Prefer batch operations to reduce costs\");\n }\n if (context?.trackingSummary) {\n const pct = Math.round(\n (context.trackingSummary.monthlySpend / intent.budget.monthly_limit) *\n 100,\n );\n sections.push(\n `- Current monthly spend: ${intent.budget.currency} ${context.trackingSummary.monthlySpend.toFixed(2)} (${pct}%)`,\n );\n }\n }\n\n // Guardrails — flat list with category tags\n const allRules = [\n ...guardrails.security.map((r) => `[security] ${r}`),\n ...guardrails.quality.map((r) => `[quality] ${r}`),\n ...guardrails.process.map((r) => `[process] ${r}`),\n ];\n\n if (allRules.length > 0) {\n sections.push(\"\");\n sections.push(\"## Rules\");\n for (const rule of allRules) {\n sections.push(`- ${rule}`);\n }\n }\n\n // Tech stack\n if (intent.tech) {\n const { stack, opinions } = intent.tech;\n if (stack.length > 0 || opinions.length > 0) {\n sections.push(\"\");\n sections.push(\"## Tech Stack\");\n if (stack.length > 0) {\n sections.push(`Stack: ${stack.join(\", \")}`);\n }\n if (opinions.length > 0) {\n for (const opinion of opinions) {\n sections.push(`- ${opinion}`);\n }\n }\n }\n }\n\n // Features\n if (context?.registry && context.registry.length > 0) {\n sections.push(\"\");\n sections.push(\"## Features\");\n for (const feature of context.registry) {\n const tokens = feature.estimatedTokens\n ? ` (~${Math.round(feature.estimatedTokens / 1000)}K tokens)`\n : \"\";\n sections.push(`- ${feature.name} [${feature.status}]${tokens}`);\n }\n }\n\n return sections.join(\"\\n\") + \"\\n\";\n}\n","import type { IntentConfig, ResolvedGuardrails } from \"@fathom/intent\";\nimport type { ProjectionContext } from \"../types.js\";\n\n/**\n * Generate a .windsurfrules file from intent and guardrails.\n *\n * Windsurf reads .windsurfrules from the project root.\n * Format is plain text with rules, similar to .cursorrules.\n */\nexport function generateWindsurfRules(\n intent: IntentConfig,\n guardrails: ResolvedGuardrails,\n context?: ProjectionContext,\n): string {\n const sections: string[] = [];\n\n // Project overview\n sections.push(`# ${intent.project}`);\n sections.push(\"\");\n sections.push(intent.description);\n if (intent.audience) {\n sections.push(`Audience: ${intent.audience}`);\n }\n\n // Values\n if (intent.values.length > 0) {\n sections.push(\"\");\n sections.push(\"## Values\");\n const priorityOrder = { critical: 0, high: 1, medium: 2, low: 3 };\n const sorted = [...intent.values].sort(\n (a, b) => priorityOrder[a.priority] - priorityOrder[b.priority],\n );\n for (const value of sorted) {\n const priority =\n value.priority === \"critical\" || value.priority === \"high\"\n ? ` [${value.priority}]`\n : \"\";\n sections.push(`- ${value.name}${priority}: ${value.description}`);\n }\n }\n\n // Budget\n if (intent.budget) {\n sections.push(\"\");\n sections.push(\"## Budget\");\n sections.push(\n `- Monthly limit: ${intent.budget.currency} ${intent.budget.monthly_limit.toLocaleString()}`,\n );\n if (intent.budget.prefer_batch) {\n sections.push(\"- Prefer batch operations to reduce costs\");\n }\n if (context?.trackingSummary) {\n const pct = Math.round(\n (context.trackingSummary.monthlySpend / intent.budget.monthly_limit) *\n 100,\n );\n sections.push(\n `- Current monthly spend: ${intent.budget.currency} ${context.trackingSummary.monthlySpend.toFixed(2)} (${pct}%)`,\n );\n }\n }\n\n // Guardrails — flat rules\n const allRules = [\n ...guardrails.security.map((r) => `[security] ${r}`),\n ...guardrails.quality.map((r) => `[quality] ${r}`),\n ...guardrails.process.map((r) => `[process] ${r}`),\n ];\n\n if (allRules.length > 0) {\n sections.push(\"\");\n sections.push(\"## Rules\");\n for (const rule of allRules) {\n sections.push(`- ${rule}`);\n }\n }\n\n // Tech stack\n if (intent.tech) {\n const { stack, opinions } = intent.tech;\n if (stack.length > 0 || opinions.length > 0) {\n sections.push(\"\");\n sections.push(\"## Tech Stack\");\n if (stack.length > 0) {\n sections.push(`Stack: ${stack.join(\", \")}`);\n }\n if (opinions.length > 0) {\n for (const opinion of opinions) {\n sections.push(`- ${opinion}`);\n }\n }\n }\n }\n\n // Features\n if (context?.registry && context.registry.length > 0) {\n sections.push(\"\");\n sections.push(\"## Features\");\n for (const feature of context.registry) {\n const tokens = feature.estimatedTokens\n ? ` (~${Math.round(feature.estimatedTokens / 1000)}K tokens)`\n : \"\";\n sections.push(`- ${feature.name} [${feature.status}]${tokens}`);\n }\n }\n\n return sections.join(\"\\n\") + \"\\n\";\n}\n","import type { IntentConfig } from \"@fathom/intent\";\nimport { resolveGuardrails } from \"@fathom/intent\";\nimport type { ProjectionContext, ProjectionOutput, ProjectionTarget } from \"./types.js\";\nimport { generateClaudeSkill } from \"./templates/claude.js\";\nimport { generateCursorRules } from \"./templates/cursor.js\";\nimport { generateSystemPrompt } from \"./templates/generic.js\";\nimport { generateCopilotInstructions } from \"./templates/copilot.js\";\nimport { generateWindsurfRules } from \"./templates/windsurf.js\";\n\nconst ALL_TARGETS: ProjectionTarget[] = [\"claude\", \"cursor\", \"generic\", \"copilot\", \"windsurf\"];\n\n/**\n * Generate projection files from intent config.\n *\n * Returns a map of relative paths (within .fathom/) to file contents.\n * If `targets` is specified, only generates for those tools.\n */\nexport function generateProjections(\n intent: IntentConfig,\n context?: ProjectionContext,\n targets?: ProjectionTarget[],\n): ProjectionOutput {\n const guardrails = resolveGuardrails(intent);\n const activeTargets = targets ?? ALL_TARGETS;\n const files = new Map<string, string>();\n\n for (const target of activeTargets) {\n switch (target) {\n case \"claude\":\n files.set(\n \"projections/claude/SKILL.md\",\n generateClaudeSkill(intent, guardrails, context),\n );\n break;\n case \"cursor\":\n files.set(\n \"projections/cursor/.cursorrules\",\n generateCursorRules(intent, guardrails, context),\n );\n break;\n case \"generic\":\n files.set(\n \"projections/generic/SYSTEM_PROMPT.md\",\n generateSystemPrompt(intent, guardrails, context),\n );\n break;\n case \"copilot\":\n files.set(\n \"projections/copilot/copilot-instructions.md\",\n generateCopilotInstructions(intent, guardrails, context),\n );\n break;\n case \"windsurf\":\n files.set(\n \"projections/windsurf/.windsurfrules\",\n generateWindsurfRules(intent, guardrails, context),\n );\n break;\n }\n }\n\n return { files };\n}\n","import { mkdirSync, writeFileSync } from \"node:fs\";\nimport { dirname, resolve } from \"node:path\";\nimport type { IntentConfig } from \"@fathom/intent\";\nimport type { ProjectionContext, ProjectionTarget } from \"./types.js\";\nimport { generateProjections } from \"./generator.js\";\n\n/**\n * Generate and write projection files to disk.\n *\n * Files are written under `${dir}/.fathom/projections/`.\n * Creates directories as needed, overwrites existing files.\n *\n * @returns List of absolute paths that were written.\n */\nexport async function writeProjections(\n dir: string,\n intent: IntentConfig,\n context?: ProjectionContext,\n targets?: ProjectionTarget[],\n): Promise<string[]> {\n const output = generateProjections(intent, context, targets);\n const written: string[] = [];\n\n for (const [relativePath, content] of output.files) {\n const absPath = resolve(dir, \".fathom\", relativePath);\n mkdirSync(dirname(absPath), { recursive: true });\n writeFileSync(absPath, content, \"utf-8\");\n written.push(absPath);\n }\n\n return written;\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../projections/src/templates/claude.ts","../../projections/src/templates/cursor.ts","../../projections/src/templates/generic.ts","../../projections/src/templates/copilot.ts","../../projections/src/templates/windsurf.ts","../../projections/src/generator.ts","../../projections/src/writer.ts"],"sourcesContent":["import type { IntentConfig, ResolvedGuardrails } from \"@fathom/intent\";\nimport type { ProjectionContext } from \"../types.js\";\n\n/**\n * Generate a Claude Code SKILL.md file from intent and guardrails.\n *\n * This is the primary projection — it should be thorough, well-structured,\n * and read naturally as instructions for an AI coding assistant.\n */\nexport function generateClaudeSkill(\n intent: IntentConfig,\n guardrails: ResolvedGuardrails,\n context?: ProjectionContext,\n): string {\n const sections: string[] = [];\n\n // Header\n sections.push(`# ${intent.project}`);\n\n // ── Project Context ────────────────────────────────────────\n sections.push(buildProjectContext(intent));\n\n // ── What Matters ───────────────────────────────────────────\n if (intent.values.length > 0) {\n sections.push(buildValues(intent));\n }\n\n // ── Budget Awareness ───────────────────────────────────────\n const budgetSection = buildBudget(intent, context);\n if (budgetSection) {\n sections.push(budgetSection);\n }\n\n // ── Guardrails ─────────────────────────────────────────────\n const guardrailSection = buildGuardrails(guardrails);\n if (guardrailSection) {\n sections.push(guardrailSection);\n }\n\n // ── Tech Context ───────────────────────────────────────────\n const techSection = buildTech(intent);\n if (techSection) {\n sections.push(techSection);\n }\n\n // ── Feature Registry ───────────────────────────────────────\n const registrySection = buildRegistry(context);\n if (registrySection) {\n sections.push(registrySection);\n }\n\n return sections.join(\"\\n\\n\") + \"\\n\";\n}\n\nfunction buildProjectContext(intent: IntentConfig): string {\n const lines: string[] = [\"## Project Context\"];\n lines.push(\"\");\n lines.push(intent.description);\n if (intent.audience) {\n lines.push(\"\");\n lines.push(`**Audience:** ${intent.audience}`);\n }\n return lines.join(\"\\n\");\n}\n\nfunction buildValues(intent: IntentConfig): string {\n const lines: string[] = [\"## What Matters\"];\n lines.push(\"\");\n lines.push(\n \"These are the project's core values, ordered by priority. Let them guide your decisions.\",\n );\n lines.push(\"\");\n\n // Sort by priority weight\n const priorityOrder = { critical: 0, high: 1, medium: 2, low: 3 };\n const sorted = [...intent.values].sort(\n (a, b) => priorityOrder[a.priority] - priorityOrder[b.priority],\n );\n\n for (const value of sorted) {\n const tag =\n value.priority === \"critical\"\n ? \" **(CRITICAL)**\"\n : value.priority === \"high\"\n ? \" **(high priority)**\"\n : \"\";\n lines.push(`- **${value.name}**${tag} — ${value.description}`);\n if (value.details) {\n lines.push(` - ${value.details}`);\n }\n }\n\n return lines.join(\"\\n\");\n}\n\nfunction buildBudget(\n intent: IntentConfig,\n context?: ProjectionContext,\n): string | null {\n if (!intent.budget) return null;\n\n const { budget } = intent;\n const lines: string[] = [\"## Budget Awareness\"];\n lines.push(\"\");\n lines.push(\n `This project has a monthly budget of **${budget.currency} ${budget.monthly_limit.toLocaleString()}**.`,\n );\n lines.push(\n `Alert threshold: ${Math.round(budget.alert_threshold * 100)}% of budget.`,\n );\n\n if (budget.prefer_batch) {\n lines.push(\"\");\n lines.push(\n \"**Prefer batch operations** where possible to reduce API costs.\",\n );\n }\n\n if (context?.trackingSummary) {\n const { totalCost, monthlySpend, totalTokens } = context.trackingSummary;\n const pct =\n budget.monthly_limit > 0\n ? Math.round((monthlySpend / budget.monthly_limit) * 100)\n : 0;\n lines.push(\"\");\n lines.push(\"### Current Spend\");\n lines.push(`- Monthly spend so far: ${budget.currency} ${monthlySpend.toFixed(2)} (${pct}% of budget)`);\n lines.push(`- Total project cost: ${budget.currency} ${totalCost.toFixed(2)}`);\n lines.push(`- Total tokens used: ${totalTokens.toLocaleString()}`);\n\n if (pct >= budget.alert_threshold * 100) {\n lines.push(\"\");\n lines.push(\n `> **Warning:** Monthly spend has reached ${pct}% of the budget. Be especially mindful of token usage.`,\n );\n }\n }\n\n return lines.join(\"\\n\");\n}\n\nfunction buildGuardrails(guardrails: ResolvedGuardrails): string | null {\n const hasAny =\n guardrails.security.length > 0 ||\n guardrails.quality.length > 0 ||\n guardrails.process.length > 0;\n\n if (!hasAny) return null;\n\n const lines: string[] = [\"## Guardrails\"];\n lines.push(\"\");\n lines.push(\"These rules are non-negotiable. Follow them in every change.\");\n\n if (guardrails.security.length > 0) {\n lines.push(\"\");\n lines.push(\"### Security\");\n for (const rule of guardrails.security) {\n lines.push(`- ${rule}`);\n }\n }\n\n if (guardrails.quality.length > 0) {\n lines.push(\"\");\n lines.push(\"### Quality\");\n for (const rule of guardrails.quality) {\n lines.push(`- ${rule}`);\n }\n }\n\n if (guardrails.process.length > 0) {\n lines.push(\"\");\n lines.push(\"### Process\");\n for (const rule of guardrails.process) {\n lines.push(`- ${rule}`);\n }\n }\n\n return lines.join(\"\\n\");\n}\n\nfunction buildTech(intent: IntentConfig): string | null {\n if (!intent.tech) return null;\n const { stack, opinions } = intent.tech;\n if (stack.length === 0 && opinions.length === 0) return null;\n\n const lines: string[] = [\"## Tech Context\"];\n\n if (stack.length > 0) {\n lines.push(\"\");\n lines.push(`**Stack:** ${stack.join(\", \")}`);\n }\n\n if (opinions.length > 0) {\n lines.push(\"\");\n lines.push(\"### Conventions\");\n for (const opinion of opinions) {\n lines.push(`- ${opinion}`);\n }\n }\n\n return lines.join(\"\\n\");\n}\n\nfunction buildRegistry(context?: ProjectionContext): string | null {\n if (!context?.registry || context.registry.length === 0) return null;\n\n const lines: string[] = [\"## Feature Registry\"];\n lines.push(\"\");\n lines.push(\"Current features being tracked:\");\n lines.push(\"\");\n\n const statusIcon: Record<string, string> = {\n active: \"🟢\",\n planned: \"🔵\",\n completed: \"✅\",\n paused: \"⏸️\",\n };\n\n for (const feature of context.registry) {\n const icon = statusIcon[feature.status] ?? \"⚪\";\n const tokens = feature.estimatedTokens\n ? ` (~${Math.round(feature.estimatedTokens / 1000)}K tokens)`\n : \"\";\n lines.push(`- ${icon} **${feature.name}** [${feature.status}]${tokens}`);\n }\n\n return lines.join(\"\\n\");\n}\n","import type { IntentConfig, ResolvedGuardrails } from \"@fathom/intent\";\nimport type { ProjectionContext } from \"../types.js\";\n\n/**\n * Generate a .cursorrules file from intent and guardrails.\n *\n * Cursor rules are plain text/markdown — no frontmatter.\n * More concise than the Claude skill, focused on actionable rules.\n */\nexport function generateCursorRules(\n intent: IntentConfig,\n guardrails: ResolvedGuardrails,\n context?: ProjectionContext,\n): string {\n const sections: string[] = [];\n\n // Project overview\n sections.push(`# ${intent.project}`);\n sections.push(\"\");\n sections.push(intent.description);\n if (intent.audience) {\n sections.push(`Audience: ${intent.audience}`);\n }\n\n // Values as rules\n if (intent.values.length > 0) {\n sections.push(\"\");\n sections.push(\"## Values\");\n const priorityOrder = { critical: 0, high: 1, medium: 2, low: 3 };\n const sorted = [...intent.values].sort(\n (a, b) => priorityOrder[a.priority] - priorityOrder[b.priority],\n );\n for (const value of sorted) {\n const priority =\n value.priority === \"critical\" || value.priority === \"high\"\n ? ` [${value.priority}]`\n : \"\";\n sections.push(`- ${value.name}${priority}: ${value.description}`);\n }\n }\n\n // Budget\n if (intent.budget) {\n sections.push(\"\");\n sections.push(\"## Budget\");\n sections.push(\n `- Monthly limit: ${intent.budget.currency} ${intent.budget.monthly_limit.toLocaleString()}`,\n );\n if (intent.budget.prefer_batch) {\n sections.push(\"- Prefer batch operations to reduce costs\");\n }\n if (context?.trackingSummary) {\n const pct = Math.round(\n (context.trackingSummary.monthlySpend / intent.budget.monthly_limit) *\n 100,\n );\n sections.push(\n `- Current monthly spend: ${intent.budget.currency} ${context.trackingSummary.monthlySpend.toFixed(2)} (${pct}%)`,\n );\n }\n }\n\n // Guardrails — all as flat rules\n const allRules = [\n ...guardrails.security.map((r) => `[security] ${r}`),\n ...guardrails.quality.map((r) => `[quality] ${r}`),\n ...guardrails.process.map((r) => `[process] ${r}`),\n ];\n\n if (allRules.length > 0) {\n sections.push(\"\");\n sections.push(\"## Rules\");\n for (const rule of allRules) {\n sections.push(`- ${rule}`);\n }\n }\n\n // Tech\n if (intent.tech) {\n const { stack, opinions } = intent.tech;\n if (stack.length > 0 || opinions.length > 0) {\n sections.push(\"\");\n sections.push(\"## Tech Stack\");\n if (stack.length > 0) {\n sections.push(`Stack: ${stack.join(\", \")}`);\n }\n if (opinions.length > 0) {\n for (const opinion of opinions) {\n sections.push(`- ${opinion}`);\n }\n }\n }\n }\n\n // Registry\n if (context?.registry && context.registry.length > 0) {\n sections.push(\"\");\n sections.push(\"## Features\");\n for (const feature of context.registry) {\n const tokens = feature.estimatedTokens\n ? ` (~${Math.round(feature.estimatedTokens / 1000)}K tokens)`\n : \"\";\n sections.push(`- ${feature.name} [${feature.status}]${tokens}`);\n }\n }\n\n return sections.join(\"\\n\") + \"\\n\";\n}\n","import type { IntentConfig, ResolvedGuardrails } from \"@fathom/intent\";\nimport type { ProjectionContext } from \"../types.js\";\n\n/**\n * Generate a generic system prompt suitable for any LLM API call.\n *\n * More concise than the other projections — focused on the essential\n * context and hard rules an LLM needs to follow.\n */\nexport function generateSystemPrompt(\n intent: IntentConfig,\n guardrails: ResolvedGuardrails,\n context?: ProjectionContext,\n): string {\n const parts: string[] = [];\n\n // Identity + context\n parts.push(\n `You are an AI assistant working on ${intent.project}. ${intent.description}`,\n );\n if (intent.audience) {\n parts.push(`The target audience is: ${intent.audience}.`);\n }\n\n // Values — keep concise\n if (intent.values.length > 0) {\n const priorityOrder = { critical: 0, high: 1, medium: 2, low: 3 };\n const sorted = [...intent.values].sort(\n (a, b) => priorityOrder[a.priority] - priorityOrder[b.priority],\n );\n const valueList = sorted\n .map((v) => {\n const tag = v.priority === \"critical\" ? \" (CRITICAL)\" : \"\";\n return `${v.name}${tag}: ${v.description}`;\n })\n .join(\"; \");\n parts.push(`Core values: ${valueList}.`);\n }\n\n // Budget — one line\n if (intent.budget) {\n let budgetLine = `Budget: ${intent.budget.currency} ${intent.budget.monthly_limit.toLocaleString()}/month.`;\n if (context?.trackingSummary) {\n const pct = Math.round(\n (context.trackingSummary.monthlySpend / intent.budget.monthly_limit) *\n 100,\n );\n budgetLine += ` Current spend: ${pct}%.`;\n }\n if (intent.budget.prefer_batch) {\n budgetLine += \" Prefer batch operations.\";\n }\n parts.push(budgetLine);\n }\n\n // Guardrails — mandatory rules\n const allRules = [\n ...guardrails.security,\n ...guardrails.quality,\n ...guardrails.process,\n ];\n if (allRules.length > 0) {\n parts.push(\"Mandatory rules:\");\n for (const rule of allRules) {\n parts.push(`- ${rule}`);\n }\n }\n\n // Tech — one line\n if (intent.tech) {\n const { stack, opinions } = intent.tech;\n if (stack.length > 0) {\n parts.push(`Tech stack: ${stack.join(\", \")}.`);\n }\n if (opinions.length > 0) {\n parts.push(`Conventions: ${opinions.join(\"; \")}.`);\n }\n }\n\n return parts.join(\"\\n\") + \"\\n\";\n}\n","import type { IntentConfig, ResolvedGuardrails } from \"@fathom/intent\";\nimport type { ProjectionContext } from \"../types.js\";\n\n/**\n * Generate a copilot-instructions.md file from intent and guardrails.\n *\n * GitHub Copilot reads .github/copilot-instructions.md for project-level\n * instructions. Format is plain markdown, similar to Cursor rules.\n */\nexport function generateCopilotInstructions(\n intent: IntentConfig,\n guardrails: ResolvedGuardrails,\n context?: ProjectionContext,\n): string {\n const sections: string[] = [];\n\n // Project overview\n sections.push(`# ${intent.project}`);\n sections.push(\"\");\n sections.push(intent.description);\n if (intent.audience) {\n sections.push(`Audience: ${intent.audience}`);\n }\n\n // Values as instructions\n if (intent.values.length > 0) {\n sections.push(\"\");\n sections.push(\"## Values\");\n const priorityOrder = { critical: 0, high: 1, medium: 2, low: 3 };\n const sorted = [...intent.values].sort(\n (a, b) => priorityOrder[a.priority] - priorityOrder[b.priority],\n );\n for (const value of sorted) {\n const priority =\n value.priority === \"critical\" || value.priority === \"high\"\n ? ` [${value.priority}]`\n : \"\";\n sections.push(`- ${value.name}${priority}: ${value.description}`);\n }\n }\n\n // Budget\n if (intent.budget) {\n sections.push(\"\");\n sections.push(\"## Budget\");\n sections.push(\n `- Monthly limit: ${intent.budget.currency} ${intent.budget.monthly_limit.toLocaleString()}`,\n );\n if (intent.budget.prefer_batch) {\n sections.push(\"- Prefer batch operations to reduce costs\");\n }\n if (context?.trackingSummary) {\n const pct = Math.round(\n (context.trackingSummary.monthlySpend / intent.budget.monthly_limit) *\n 100,\n );\n sections.push(\n `- Current monthly spend: ${intent.budget.currency} ${context.trackingSummary.monthlySpend.toFixed(2)} (${pct}%)`,\n );\n }\n }\n\n // Guardrails — flat list with category tags\n const allRules = [\n ...guardrails.security.map((r) => `[security] ${r}`),\n ...guardrails.quality.map((r) => `[quality] ${r}`),\n ...guardrails.process.map((r) => `[process] ${r}`),\n ];\n\n if (allRules.length > 0) {\n sections.push(\"\");\n sections.push(\"## Rules\");\n for (const rule of allRules) {\n sections.push(`- ${rule}`);\n }\n }\n\n // Tech stack\n if (intent.tech) {\n const { stack, opinions } = intent.tech;\n if (stack.length > 0 || opinions.length > 0) {\n sections.push(\"\");\n sections.push(\"## Tech Stack\");\n if (stack.length > 0) {\n sections.push(`Stack: ${stack.join(\", \")}`);\n }\n if (opinions.length > 0) {\n for (const opinion of opinions) {\n sections.push(`- ${opinion}`);\n }\n }\n }\n }\n\n // Features\n if (context?.registry && context.registry.length > 0) {\n sections.push(\"\");\n sections.push(\"## Features\");\n for (const feature of context.registry) {\n const tokens = feature.estimatedTokens\n ? ` (~${Math.round(feature.estimatedTokens / 1000)}K tokens)`\n : \"\";\n sections.push(`- ${feature.name} [${feature.status}]${tokens}`);\n }\n }\n\n return sections.join(\"\\n\") + \"\\n\";\n}\n","import type { IntentConfig, ResolvedGuardrails } from \"@fathom/intent\";\nimport type { ProjectionContext } from \"../types.js\";\n\n/**\n * Generate a .windsurfrules file from intent and guardrails.\n *\n * Windsurf reads .windsurfrules from the project root.\n * Format is plain text with rules, similar to .cursorrules.\n */\nexport function generateWindsurfRules(\n intent: IntentConfig,\n guardrails: ResolvedGuardrails,\n context?: ProjectionContext,\n): string {\n const sections: string[] = [];\n\n // Project overview\n sections.push(`# ${intent.project}`);\n sections.push(\"\");\n sections.push(intent.description);\n if (intent.audience) {\n sections.push(`Audience: ${intent.audience}`);\n }\n\n // Values\n if (intent.values.length > 0) {\n sections.push(\"\");\n sections.push(\"## Values\");\n const priorityOrder = { critical: 0, high: 1, medium: 2, low: 3 };\n const sorted = [...intent.values].sort(\n (a, b) => priorityOrder[a.priority] - priorityOrder[b.priority],\n );\n for (const value of sorted) {\n const priority =\n value.priority === \"critical\" || value.priority === \"high\"\n ? ` [${value.priority}]`\n : \"\";\n sections.push(`- ${value.name}${priority}: ${value.description}`);\n }\n }\n\n // Budget\n if (intent.budget) {\n sections.push(\"\");\n sections.push(\"## Budget\");\n sections.push(\n `- Monthly limit: ${intent.budget.currency} ${intent.budget.monthly_limit.toLocaleString()}`,\n );\n if (intent.budget.prefer_batch) {\n sections.push(\"- Prefer batch operations to reduce costs\");\n }\n if (context?.trackingSummary) {\n const pct = Math.round(\n (context.trackingSummary.monthlySpend / intent.budget.monthly_limit) *\n 100,\n );\n sections.push(\n `- Current monthly spend: ${intent.budget.currency} ${context.trackingSummary.monthlySpend.toFixed(2)} (${pct}%)`,\n );\n }\n }\n\n // Guardrails — flat rules\n const allRules = [\n ...guardrails.security.map((r) => `[security] ${r}`),\n ...guardrails.quality.map((r) => `[quality] ${r}`),\n ...guardrails.process.map((r) => `[process] ${r}`),\n ];\n\n if (allRules.length > 0) {\n sections.push(\"\");\n sections.push(\"## Rules\");\n for (const rule of allRules) {\n sections.push(`- ${rule}`);\n }\n }\n\n // Tech stack\n if (intent.tech) {\n const { stack, opinions } = intent.tech;\n if (stack.length > 0 || opinions.length > 0) {\n sections.push(\"\");\n sections.push(\"## Tech Stack\");\n if (stack.length > 0) {\n sections.push(`Stack: ${stack.join(\", \")}`);\n }\n if (opinions.length > 0) {\n for (const opinion of opinions) {\n sections.push(`- ${opinion}`);\n }\n }\n }\n }\n\n // Features\n if (context?.registry && context.registry.length > 0) {\n sections.push(\"\");\n sections.push(\"## Features\");\n for (const feature of context.registry) {\n const tokens = feature.estimatedTokens\n ? ` (~${Math.round(feature.estimatedTokens / 1000)}K tokens)`\n : \"\";\n sections.push(`- ${feature.name} [${feature.status}]${tokens}`);\n }\n }\n\n return sections.join(\"\\n\") + \"\\n\";\n}\n","import type { IntentConfig } from \"@fathom/intent\";\nimport { resolveGuardrails } from \"@fathom/intent\";\nimport type { ProjectionContext, ProjectionOutput, ProjectionTarget } from \"./types.js\";\nimport { generateClaudeSkill } from \"./templates/claude.js\";\nimport { generateCursorRules } from \"./templates/cursor.js\";\nimport { generateSystemPrompt } from \"./templates/generic.js\";\nimport { generateCopilotInstructions } from \"./templates/copilot.js\";\nimport { generateWindsurfRules } from \"./templates/windsurf.js\";\n\nconst ALL_TARGETS: ProjectionTarget[] = [\"claude\", \"cursor\", \"generic\", \"copilot\", \"windsurf\"];\n\n/**\n * Generate projection files from intent config.\n *\n * Returns a map of relative paths (within .fathom/) to file contents.\n * If `targets` is specified, only generates for those tools.\n */\nexport function generateProjections(\n intent: IntentConfig,\n context?: ProjectionContext,\n targets?: ProjectionTarget[],\n): ProjectionOutput {\n const guardrails = resolveGuardrails(intent);\n const activeTargets = targets ?? ALL_TARGETS;\n const files = new Map<string, string>();\n\n for (const target of activeTargets) {\n switch (target) {\n case \"claude\":\n files.set(\n \"projections/claude/SKILL.md\",\n generateClaudeSkill(intent, guardrails, context),\n );\n break;\n case \"cursor\":\n files.set(\n \"projections/cursor/.cursorrules\",\n generateCursorRules(intent, guardrails, context),\n );\n break;\n case \"generic\":\n files.set(\n \"projections/generic/SYSTEM_PROMPT.md\",\n generateSystemPrompt(intent, guardrails, context),\n );\n break;\n case \"copilot\":\n files.set(\n \"projections/copilot/copilot-instructions.md\",\n generateCopilotInstructions(intent, guardrails, context),\n );\n break;\n case \"windsurf\":\n files.set(\n \"projections/windsurf/.windsurfrules\",\n generateWindsurfRules(intent, guardrails, context),\n );\n break;\n }\n }\n\n return { files };\n}\n","import { mkdir, writeFile } from \"node:fs/promises\";\nimport { dirname, resolve } from \"node:path\";\nimport type { IntentConfig } from \"@fathom/intent\";\nimport type { ProjectionContext, ProjectionTarget } from \"./types.js\";\nimport { generateProjections } from \"./generator.js\";\n\n/**\n * Generate and write projection files to disk using async I/O.\n *\n * Files are written under `${dir}/.fathom/projections/`.\n * Creates directories as needed, overwrites existing files.\n * Collects errors for individual file writes — partial failures\n * still return successfully written paths.\n *\n * @returns List of absolute paths that were successfully written.\n * @throws If ALL writes fail (no files written at all).\n */\nexport async function writeProjections(\n dir: string,\n intent: IntentConfig,\n context?: ProjectionContext,\n targets?: ProjectionTarget[],\n): Promise<string[]> {\n const output = generateProjections(intent, context, targets);\n const written: string[] = [];\n const errors: Array<{ path: string; error: unknown }> = [];\n\n for (const [relativePath, content] of output.files) {\n const absPath = resolve(dir, \".fathom\", relativePath);\n try {\n await mkdir(dirname(absPath), { recursive: true });\n await writeFile(absPath, content, \"utf-8\");\n written.push(absPath);\n } catch (err) {\n errors.push({ path: absPath, error: err });\n console.error(`[Projections] Failed to write ${absPath}:`, err);\n }\n }\n\n if (errors.length > 0 && written.length === 0) {\n throw new Error(\n `Failed to write all projection files: ${errors.map((e) => e.path).join(\", \")}`,\n );\n }\n\n return written;\n}\n"],"mappings":"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","names":[]}
@@ -13,7 +13,7 @@ import {
13
13
  loadTemplate,
14
14
  resolveGuardrails,
15
15
  saveIntent
16
- } from "./chunk-TXIC6BY4.js";
16
+ } from "./chunk-E6YGKUJB.js";
17
17
  import "./chunk-MNGU6SI4.js";
18
18
  import "./chunk-SEGVTWSK.js";
19
19
  export {
@@ -31,4 +31,4 @@ export {
31
31
  resolveGuardrails,
32
32
  saveIntent
33
33
  };
34
- //# sourceMappingURL=dist-XKZLNUDU.js.map
34
+ //# sourceMappingURL=dist-VMLJKWUO.js.map