@cat-factory/agents 0.7.3 → 0.8.1

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.
@@ -1,4 +1,5 @@
1
- import type { AgentConfigDescriptor, AgentKind, AgentRunContext } from '@cat-factory/kernel';
1
+ import type { AgentConfigDescriptor, AgentKind, AgentRunContext, AgentStepSpec, RepoOp } from '@cat-factory/kernel';
2
+ import type { AgentPresentation } from '@cat-factory/contracts';
2
3
  import type { AgentTrait } from './traits.js';
3
4
  export interface AgentKindDefinition {
4
5
  /** The free-form agent-kind id used in pipelines and steps (e.g. `security-auditor`). */
@@ -46,6 +47,34 @@ export interface AgentKindDefinition {
46
47
  * their own traits registered via `registerAgentTrait`. Omitted ⇒ no traits.
47
48
  */
48
49
  traits?: AgentTrait[];
50
+ /**
51
+ * The optional LLM step's execution surface + output/clone spec (inline, or a
52
+ * container explore/coding run). Present ⇒ the kind runs an agent step; omitted ⇒ the
53
+ * kind is pure pre/post-op work (no LLM). A container surface implies the kind needs a
54
+ * checkout — see {@link registeredKindRequiresContainer}, which now also derives the
55
+ * container requirement from this — so `requiresContainer` need not be set alongside it.
56
+ */
57
+ agent?: AgentStepSpec;
58
+ /**
59
+ * Deterministic backend operations run BEFORE the agent step (over a checkout-free
60
+ * {@link RepoOp} context): read a baseline artifact into the prompt, etc. Plain TS,
61
+ * runs on the backend — never in the container. Omitted ⇒ no pre-op.
62
+ */
63
+ preOps?: RepoOp[];
64
+ /**
65
+ * Deterministic backend operations run AFTER the agent step, consuming its structured
66
+ * result: render artifact files and commit them via the RepoFiles port (the
67
+ * blueprint/spec renderers live in `repo-ops/render.ts`). Plain TS — never in the
68
+ * container. Omitted ⇒ no post-op.
69
+ */
70
+ postOps?: RepoOp[];
71
+ /**
72
+ * Frontend display metadata (label / icon / colour / category / result view). The
73
+ * server serialises this into the workspace snapshot so a registered kind becomes a
74
+ * first-class palette block instead of the generic fallback. Omitted ⇒ the SPA renders
75
+ * the kind with its generic fallback metadata.
76
+ */
77
+ presentation?: AgentPresentation;
49
78
  }
50
79
  /** Register a custom agent kind. A later registration of the same id replaces the earlier one. */
51
80
  export declare function registerAgentKind(definition: AgentKindDefinition): void;
@@ -55,7 +84,11 @@ export declare function registerAgentKinds(definitions: Iterable<AgentKindDefini
55
84
  export declare function registeredAgentKind(kind: AgentKind): AgentKindDefinition | undefined;
56
85
  /** All registered custom agent kinds (registration order). */
57
86
  export declare function registeredAgentKinds(): AgentKindDefinition[];
58
- /** Whether a registered kind asked to run in a container. False for built-in / unregistered kinds. */
87
+ /**
88
+ * Whether a registered kind runs in a container — either it set `requiresContainer`
89
+ * explicitly, or its `agent` step declares a container surface. False for built-in /
90
+ * unregistered kinds.
91
+ */
59
92
  export declare function registeredKindRequiresContainer(kind: AgentKind): boolean;
60
93
  /** Drop all registered kinds. Intended for tests that exercise registration. */
61
94
  export declare function clearRegisteredAgentKinds(): void;
@@ -67,4 +100,12 @@ export declare function registeredUserPrompt(context: AgentRunContext): string |
67
100
  export declare function registeredWebResearchHint(kind: AgentKind): string | undefined;
68
101
  /** A registered kind's contributed config descriptors, or an empty array when none. */
69
102
  export declare function registeredConfigContributions(kind: AgentKind): AgentConfigDescriptor[];
103
+ /** A registered kind's agent-step spec (surface/output/clone), or undefined when none. */
104
+ export declare function registeredAgentStep(kind: AgentKind): AgentStepSpec | undefined;
105
+ /** A registered kind's pre-op hooks (run before the agent step), or an empty array. */
106
+ export declare function registeredPreOps(kind: AgentKind): RepoOp[];
107
+ /** A registered kind's post-op hooks (run after the agent step), or an empty array. */
108
+ export declare function registeredPostOps(kind: AgentKind): RepoOp[];
109
+ /** A registered kind's frontend presentation metadata, or undefined when not supplied. */
110
+ export declare function registeredAgentPresentation(kind: AgentKind): AgentPresentation | undefined;
70
111
  //# sourceMappingURL=registry.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/agents/kinds/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AAC5F,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAY7C,MAAM,WAAW,mBAAmB;IAClC,yFAAyF;IACzF,IAAI,EAAE,SAAS,CAAA;IACf;;;OAGG;IACH,YAAY,EAAE,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE,SAAS,KAAK,MAAM,CAAC,CAAA;IACpD;;;;OAIG;IACH,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,eAAe,KAAK,MAAM,CAAA;IACjD;;;;;;OAMG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAA;IAC3B;;;;;;;OAOG;IACH,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB;;;;;;OAMG;IACH,mBAAmB,CAAC,EAAE,qBAAqB,EAAE,CAAA;IAC7C;;;;;OAKG;IACH,MAAM,CAAC,EAAE,UAAU,EAAE,CAAA;CACtB;AAOD,kGAAkG;AAClG,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,mBAAmB,GAAG,IAAI,CAEvE;AAED,mDAAmD;AACnD,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,QAAQ,CAAC,mBAAmB,CAAC,GAAG,IAAI,CAEnF;AAED,4FAA4F;AAC5F,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,SAAS,GAAG,mBAAmB,GAAG,SAAS,CAEpF;AAED,8DAA8D;AAC9D,wBAAgB,oBAAoB,IAAI,mBAAmB,EAAE,CAE5D;AAED,sGAAsG;AACtG,wBAAgB,+BAA+B,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAExE;AAED,gFAAgF;AAChF,wBAAgB,yBAAyB,IAAI,IAAI,CAEhD;AAED,uFAAuF;AACvF,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,GAAG,SAAS,CAM1E;AAED,sGAAsG;AACtG,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,eAAe,GAAG,MAAM,GAAG,SAAS,CAEjF;AAED,4FAA4F;AAC5F,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,GAAG,SAAS,CAE7E;AAED,uFAAuF;AACvF,wBAAgB,6BAA6B,CAAC,IAAI,EAAE,SAAS,GAAG,qBAAqB,EAAE,CAEtF"}
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/agents/kinds/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,qBAAqB,EACrB,SAAS,EACT,eAAe,EACf,aAAa,EACb,MAAM,EACP,MAAM,qBAAqB,CAAA;AAC5B,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAC/D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAY7C,MAAM,WAAW,mBAAmB;IAClC,yFAAyF;IACzF,IAAI,EAAE,SAAS,CAAA;IACf;;;OAGG;IACH,YAAY,EAAE,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE,SAAS,KAAK,MAAM,CAAC,CAAA;IACpD;;;;OAIG;IACH,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,eAAe,KAAK,MAAM,CAAA;IACjD;;;;;;OAMG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAA;IAC3B;;;;;;;OAOG;IACH,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB;;;;;;OAMG;IACH,mBAAmB,CAAC,EAAE,qBAAqB,EAAE,CAAA;IAC7C;;;;;OAKG;IACH,MAAM,CAAC,EAAE,UAAU,EAAE,CAAA;IACrB;;;;;;OAMG;IACH,KAAK,CAAC,EAAE,aAAa,CAAA;IACrB;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;IACjB;;;;;OAKG;IACH,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;IAClB;;;;;OAKG;IACH,YAAY,CAAC,EAAE,iBAAiB,CAAA;CACjC;AAOD,kGAAkG;AAClG,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,mBAAmB,GAAG,IAAI,CAEvE;AAED,mDAAmD;AACnD,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,QAAQ,CAAC,mBAAmB,CAAC,GAAG,IAAI,CAEnF;AAED,4FAA4F;AAC5F,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,SAAS,GAAG,mBAAmB,GAAG,SAAS,CAEpF;AAED,8DAA8D;AAC9D,wBAAgB,oBAAoB,IAAI,mBAAmB,EAAE,CAE5D;AAED;;;;GAIG;AACH,wBAAgB,+BAA+B,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAMxE;AAED,gFAAgF;AAChF,wBAAgB,yBAAyB,IAAI,IAAI,CAEhD;AAED,uFAAuF;AACvF,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,GAAG,SAAS,CAM1E;AAED,sGAAsG;AACtG,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,eAAe,GAAG,MAAM,GAAG,SAAS,CAEjF;AAED,4FAA4F;AAC5F,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,GAAG,SAAS,CAE7E;AAED,uFAAuF;AACvF,wBAAgB,6BAA6B,CAAC,IAAI,EAAE,SAAS,GAAG,qBAAqB,EAAE,CAEtF;AAED,0FAA0F;AAC1F,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,SAAS,GAAG,aAAa,GAAG,SAAS,CAE9E;AAED,uFAAuF;AACvF,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,EAAE,CAE1D;AAED,uFAAuF;AACvF,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,EAAE,CAE3D;AAED,0FAA0F;AAC1F,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,SAAS,GAAG,iBAAiB,GAAG,SAAS,CAE1F"}
@@ -19,9 +19,19 @@ export function registeredAgentKind(kind) {
19
19
  export function registeredAgentKinds() {
20
20
  return [...registry.values()];
21
21
  }
22
- /** Whether a registered kind asked to run in a container. False for built-in / unregistered kinds. */
22
+ /**
23
+ * Whether a registered kind runs in a container — either it set `requiresContainer`
24
+ * explicitly, or its `agent` step declares a container surface. False for built-in /
25
+ * unregistered kinds.
26
+ */
23
27
  export function registeredKindRequiresContainer(kind) {
24
- return registry.get(kind)?.requiresContainer === true;
28
+ const definition = registry.get(kind);
29
+ if (!definition)
30
+ return false;
31
+ if (definition.requiresContainer === true)
32
+ return true;
33
+ const surface = definition.agent?.surface;
34
+ return surface === 'container-explore' || surface === 'container-coding';
25
35
  }
26
36
  /** Drop all registered kinds. Intended for tests that exercise registration. */
27
37
  export function clearRegisteredAgentKinds() {
@@ -48,4 +58,20 @@ export function registeredWebResearchHint(kind) {
48
58
  export function registeredConfigContributions(kind) {
49
59
  return registry.get(kind)?.configContributions ?? [];
50
60
  }
61
+ /** A registered kind's agent-step spec (surface/output/clone), or undefined when none. */
62
+ export function registeredAgentStep(kind) {
63
+ return registry.get(kind)?.agent;
64
+ }
65
+ /** A registered kind's pre-op hooks (run before the agent step), or an empty array. */
66
+ export function registeredPreOps(kind) {
67
+ return registry.get(kind)?.preOps ?? [];
68
+ }
69
+ /** A registered kind's post-op hooks (run after the agent step), or an empty array. */
70
+ export function registeredPostOps(kind) {
71
+ return registry.get(kind)?.postOps ?? [];
72
+ }
73
+ /** A registered kind's frontend presentation metadata, or undefined when not supplied. */
74
+ export function registeredAgentPresentation(kind) {
75
+ return registry.get(kind)?.presentation;
76
+ }
51
77
  //# sourceMappingURL=registry.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/agents/kinds/registry.ts"],"names":[],"mappings":"AA6DA,sFAAsF;AACtF,uFAAuF;AACvF,kFAAkF;AAClF,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA+B,CAAA;AAEvD,kGAAkG;AAClG,MAAM,UAAU,iBAAiB,CAAC,UAA+B;IAC/D,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,CAAA;AAC3C,CAAC;AAED,mDAAmD;AACnD,MAAM,UAAU,kBAAkB,CAAC,WAA0C;IAC3E,KAAK,MAAM,UAAU,IAAI,WAAW;QAAE,iBAAiB,CAAC,UAAU,CAAC,CAAA;AACrE,CAAC;AAED,4FAA4F;AAC5F,MAAM,UAAU,mBAAmB,CAAC,IAAe;IACjD,OAAO,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;AAC3B,CAAC;AAED,8DAA8D;AAC9D,MAAM,UAAU,oBAAoB;IAClC,OAAO,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAA;AAC/B,CAAC;AAED,sGAAsG;AACtG,MAAM,UAAU,+BAA+B,CAAC,IAAe;IAC7D,OAAO,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,iBAAiB,KAAK,IAAI,CAAA;AACvD,CAAC;AAED,gFAAgF;AAChF,MAAM,UAAU,yBAAyB;IACvC,QAAQ,CAAC,KAAK,EAAE,CAAA;AAClB,CAAC;AAED,uFAAuF;AACvF,MAAM,UAAU,sBAAsB,CAAC,IAAe;IACpD,MAAM,UAAU,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;IACrC,IAAI,CAAC,UAAU;QAAE,OAAO,SAAS,CAAA;IACjC,OAAO,OAAO,UAAU,CAAC,YAAY,KAAK,UAAU;QAClD,CAAC,CAAC,UAAU,CAAC,YAAY,CAAC,IAAI,CAAC;QAC/B,CAAC,CAAC,UAAU,CAAC,YAAY,CAAA;AAC7B,CAAC;AAED,sGAAsG;AACtG,MAAM,UAAU,oBAAoB,CAAC,OAAwB;IAC3D,OAAO,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,UAAU,EAAE,CAAC,OAAO,CAAC,CAAA;AAC/D,CAAC;AAED,4FAA4F;AAC5F,MAAM,UAAU,yBAAyB,CAAC,IAAe;IACvD,OAAO,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,eAAe,CAAA;AAC5C,CAAC;AAED,uFAAuF;AACvF,MAAM,UAAU,6BAA6B,CAAC,IAAe;IAC3D,OAAO,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,mBAAmB,IAAI,EAAE,CAAA;AACtD,CAAC"}
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/agents/kinds/registry.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -3,7 +3,7 @@ export { type InlineWebSearchOptions, DEFAULT_INLINE_WEB_SEARCH_KINDS, DEFAULT_I
3
3
  export { type AgentModelConfig, type AgentRouting, type StepModelResolvers, type StepModelInputs, resolveAgentConfig, resolveStepModelRef, resolveInlineModelRef, } from './agents/runtime/routing.js';
4
4
  export { systemPromptFor, userPromptFor } from './agents/catalog.js';
5
5
  export { TASK_ESTIMATOR_AGENT_KIND } from './agents/prompts/roles.js';
6
- export { type AgentKindDefinition, registerAgentKind, registerAgentKinds, registeredAgentKind, registeredAgentKinds, registeredKindRequiresContainer, registeredConfigContributions, clearRegisteredAgentKinds, } from './agents/kinds/registry.js';
6
+ export { type AgentKindDefinition, registerAgentKind, registerAgentKinds, registeredAgentKind, registeredAgentKinds, registeredKindRequiresContainer, registeredConfigContributions, registeredAgentStep, registeredPreOps, registeredPostOps, registeredAgentPresentation, clearRegisteredAgentKinds, } from './agents/kinds/registry.js';
7
7
  export { type AgentTrait, type AgentTraitDefinition, CODE_AWARE_TRAIT, SPEC_AWARE_TRAIT, SPEC_AWARE_GUIDANCE, STANDARD_AGENT_TRAITS, registerAgentTrait, registerAgentTraits, registeredAgentTrait, clearRegisteredAgentTraits, assignAgentTraits, clearAssignedAgentTraits, traitsFor, hasTrait, traitGuidanceFor, } from './agents/kinds/traits.js';
8
8
  export { TESTER_ENVIRONMENT_CONFIG_ID, PLAYWRIGHT_E2E_TARGET_CONFIG_ID, configContributionsFor, configContributionCatalog, } from './agents/kinds/configs.js';
9
9
  export { isTestingKind, testingSystemPrompt, testerEnvironmentSection, } from './agents/prompts/testing.js';
@@ -20,6 +20,7 @@ export { MOCK_AGENT_KIND, isMockKind, mockSystemPrompt } from './agents/prompts/
20
20
  export { type BusinessLogicAgentKind, BUSINESS_LOGIC_AGENT_KINDS, BUSINESS_DOCUMENTER_KIND, BUSINESS_REVIEWER_KIND, BUSINESS_LOGIC_DOCS_DIR, isBusinessLogicKind, businessLogicSystemPrompt, } from './agents/prompts/business-logic.js';
21
21
  export { PLATFORM_DELIVERY_CONTRACT } from './agents/prompts/delivery-contract.js';
22
22
  export { FINAL_ANSWER_IN_REPLY, STANDARDS_FOOTER } from './agents/prompts/shared.js';
23
+ export { type RenderedFile, coerceBlueprintService, moduleSlug, canonicalBlueprintJson, hashBlueprint, renderBlueprintFiles, renderBlueprintVersionFile, nextBlueprintVersion, coerceSpecDoc, dedupeSpecIds, canonicalSpecJson, hashSpec, renderSpecFiles, renderSpecFeatureFiles, renderSpecVersionFile, nextSpecVersion, } from './repo-ops/render.js';
23
24
  export { CompositeModelProvider, InstrumentedModelProvider, catFactoryObservability, type InlineObservabilityContext, type ModelResolver, type ProviderRegistry, anthropicResolver, baseProviderRegistry, cloudflareRestResolver, openAiCompatibleResolver, openAiResolver, DEEPSEEK_BASE_URL, DEFAULT_OPENAI_COMPATIBLE_BASE_URLS, MOONSHOT_BASE_URL, OPENAI_BASE_URL, OPENROUTER_BASE_URL, QWEN_BASE_URL, type CachePolicy, cachedTokensFromUsage, inlineCacheProviderOptions, promptCacheParams, providerCachePolicy, } from './providers/index.js';
24
25
  export { FragmentLibraryService, type FragmentLibraryServiceDependencies, } from './fragmentLibrary/FragmentLibraryService.js';
25
26
  export { FragmentSourceService, type FragmentSourceServiceDependencies, type ResolveFragmentInstallationId, } from './fragmentLibrary/FragmentSourceService.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -6,7 +6,7 @@ export { TASK_ESTIMATOR_AGENT_KIND } from './agents/prompts/roles.js';
6
6
  // Installation-level extension point for custom agent kinds (mirrors the model-provider
7
7
  // registry seam): a deployment registers extra kinds at startup and the prompt catalog +
8
8
  // the Worker's executor routing pick them up.
9
- export { registerAgentKind, registerAgentKinds, registeredAgentKind, registeredAgentKinds, registeredKindRequiresContainer, registeredConfigContributions, clearRegisteredAgentKinds, } from './agents/kinds/registry.js';
9
+ export { registerAgentKind, registerAgentKinds, registeredAgentKind, registeredAgentKinds, registeredKindRequiresContainer, registeredConfigContributions, registeredAgentStep, registeredPreOps, registeredPostOps, registeredAgentPresentation, clearRegisteredAgentKinds, } from './agents/kinds/registry.js';
10
10
  // Agent capability traits (standard + custom). `code-aware` gates the engine's folding
11
11
  // of the service's best-practice fragments; `spec-aware` appends the in-repo-spec guidance.
12
12
  export { CODE_AWARE_TRAIT, SPEC_AWARE_TRAIT, SPEC_AWARE_GUIDANCE, STANDARD_AGENT_TRAITS, registerAgentTrait, registerAgentTraits, registeredAgentTrait, clearRegisteredAgentTraits, assignAgentTraits, clearAssignedAgentTraits, traitsFor, hasTrait, traitGuidanceFor, } from './agents/kinds/traits.js';
@@ -30,6 +30,11 @@ export { MOCK_AGENT_KIND, isMockKind, mockSystemPrompt } from './agents/prompts/
30
30
  export { BUSINESS_LOGIC_AGENT_KINDS, BUSINESS_DOCUMENTER_KIND, BUSINESS_REVIEWER_KIND, BUSINESS_LOGIC_DOCS_DIR, isBusinessLogicKind, businessLogicSystemPrompt, } from './agents/prompts/business-logic.js';
31
31
  export { PLATFORM_DELIVERY_CONTRACT } from './agents/prompts/delivery-contract.js';
32
32
  export { FINAL_ANSWER_IN_REPLY, STANDARDS_FOOTER } from './agents/prompts/shared.js';
33
+ // Deterministic, container-free rendering + lenient coercion of the in-repo
34
+ // `blueprints/`/`spec/` artifacts (lifted out of the executor-harness image). Invoked
35
+ // from an agent's post-op: coerce the model's JSON, render the files, commit via the
36
+ // RepoFiles port. Pure functions — same input → same bytes.
37
+ export { coerceBlueprintService, moduleSlug, canonicalBlueprintJson, hashBlueprint, renderBlueprintFiles, renderBlueprintVersionFile, nextBlueprintVersion, coerceSpecDoc, dedupeSpecIds, canonicalSpecJson, hashSpec, renderSpecFiles, renderSpecFeatureFiles, renderSpecVersionFile, nextSpecVersion, } from './repo-ops/render.js';
33
38
  // The generic AI provisioning facade: a mixable provider registry + the base,
34
39
  // runtime-neutral resolvers. Optional/heavier backends ship as their own packages
35
40
  // (e.g. @cat-factory/provider-bedrock) and are mixed into a CompositeModelProvider.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,90 @@
1
+ import { type BlueprintService, type BlueprintVersion, type SpecDoc, type SpecVersion } from '@cat-factory/contracts';
2
+ /** A repo-relative file to write (path + UTF-8 content). */
3
+ export interface RenderedFile {
4
+ path: string;
5
+ content: string;
6
+ }
7
+ /**
8
+ * Coerce an agent's parsed JSON into a well-formed {@link BlueprintService},
9
+ * dropping anything malformed. Returns null when no usable service name remains.
10
+ * Tolerates either a bare service object or `{ service: {...} }`. The strict Valibot
11
+ * `parseBlueprintService` re-validates the result before it touches the board.
12
+ */
13
+ export declare function coerceBlueprintService(parsed: unknown, fallbackName: string): BlueprintService | null;
14
+ /** Turn a module name into a stable, filesystem-safe slug for its deep-dive file. */
15
+ export declare function moduleSlug(name: string): string;
16
+ /** The exact canonical JSON bytes written to `blueprint.json` (and hashed). */
17
+ export declare function canonicalBlueprintJson(service: BlueprintService): string;
18
+ /** A stable content hash of the blueprint tree, used for quick staleness checks. */
19
+ export declare function hashBlueprint(service: BlueprintService): Promise<string>;
20
+ /** Render the lightweight `version.json` manifest for `service`. */
21
+ export declare function renderBlueprintVersionFile(service: BlueprintService, meta: {
22
+ version: number;
23
+ generatedAt: string;
24
+ }): Promise<RenderedFile>;
25
+ /**
26
+ * Decide the version manifest for a freshly generated tree: when the content is
27
+ * byte-identical to the previous generation the version + timestamp are kept (so an
28
+ * unchanged blueprint produces no diff and no commit); otherwise the counter is
29
+ * bumped and the timestamp refreshed.
30
+ */
31
+ export declare function nextBlueprintVersion(service: BlueprintService, previous: BlueprintVersion | null, now: Date): Promise<{
32
+ version: number;
33
+ generatedAt: string;
34
+ }>;
35
+ /**
36
+ * Deterministically render a blueprint tree into the in-repo artifact files: the
37
+ * canonical `blueprint.json`, a high-level `overview.md` (service + each module with
38
+ * a one-line summary — what agents read first), and one `modules/<slug>.md` deep-dive
39
+ * per module (summary + code references). Pure: same tree → same bytes.
40
+ */
41
+ export declare function renderBlueprintFiles(service: BlueprintService): RenderedFile[];
42
+ /**
43
+ * Force every requirement / acceptance / rule id in the doc to be globally unique (in
44
+ * place), suffixing `-2`, `-3` … on collision — the same scheme the feature-file slugs
45
+ * use. Ids double as Gherkin scenario / test names and provenance anchors, so
46
+ * duplicates would otherwise silently alias. Deterministic: same tree → same ids.
47
+ */
48
+ export declare function dedupeSpecIds(doc: SpecDoc): void;
49
+ /**
50
+ * Coerce an agent's parsed JSON into a well-formed {@link SpecDoc}, dropping anything
51
+ * malformed. Returns null when no usable service name remains. Tolerates either a bare
52
+ * doc object or `{ requirements: {...} }`. The strict `parseSpecDoc` re-validates the
53
+ * returned doc before use.
54
+ */
55
+ export declare function coerceSpecDoc(parsed: unknown, fallbackName: string): SpecDoc | null;
56
+ /** The exact canonical JSON bytes written to `spec.json` (and hashed). */
57
+ export declare function canonicalSpecJson(doc: SpecDoc): string;
58
+ /** A stable content hash of the spec doc, used for quick staleness checks. */
59
+ export declare function hashSpec(doc: SpecDoc): Promise<string>;
60
+ /** Render the lightweight `version.json` manifest for `doc`. */
61
+ export declare function renderSpecVersionFile(doc: SpecDoc, meta: {
62
+ version: number;
63
+ generatedAt: string;
64
+ }): Promise<RenderedFile>;
65
+ /**
66
+ * Decide the version manifest for a freshly generated doc: when the content is
67
+ * byte-identical to the previous generation the version + timestamp are kept (so an
68
+ * unchanged doc produces no diff and no commit); otherwise the counter is bumped and
69
+ * the timestamp refreshed. Mirrors {@link nextBlueprintVersion}.
70
+ */
71
+ export declare function nextSpecVersion(doc: SpecDoc, previous: SpecVersion | null, now: Date): Promise<{
72
+ version: number;
73
+ generatedAt: string;
74
+ }>;
75
+ /**
76
+ * Deterministically render a spec doc into the in-repo artifact files: the canonical
77
+ * `spec.json`, a high-level `overview.md` (intent + every group's requirements), and a
78
+ * `rules.md` of the cross-cutting domain rules. Pure: same doc → same bytes.
79
+ */
80
+ export declare function renderSpecFiles(doc: SpecDoc): RenderedFile[];
81
+ /**
82
+ * Pass-1 (mechanical) Gherkin render: one `.feature` file per requirement group, one
83
+ * `Scenario` per acceptance criterion. Deterministic (same doc → same bytes), so the
84
+ * feature files can never silently drift from `spec.json`; a `must` requirement's
85
+ * scenarios are tagged `@must`. The `acceptance` agent later polishes these (pass 2).
86
+ * Groups with no acceptance criteria produce no feature file. The caller seeds these
87
+ * once (writes only when absent) so pass-2 polish survives a re-run.
88
+ */
89
+ export declare function renderSpecFeatureFiles(doc: SpecDoc): RenderedFile[];
90
+ //# sourceMappingURL=render.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../../src/repo-ops/render.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,EAMrB,KAAK,OAAO,EACZ,KAAK,WAAW,EAUjB,MAAM,wBAAwB,CAAA;AAkB/B,4DAA4D;AAC5D,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;CAChB;AAyDD;;;;;GAKG;AACH,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,OAAO,EACf,YAAY,EAAE,MAAM,GACnB,gBAAgB,GAAG,IAAI,CAqBzB;AAED,qFAAqF;AACrF,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAM/C;AAED,+EAA+E;AAC/E,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,gBAAgB,GAAG,MAAM,CAExE;AAED,oFAAoF;AACpF,wBAAgB,aAAa,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,CAExE;AAED,oEAAoE;AACpE,wBAAsB,0BAA0B,CAC9C,OAAO,EAAE,gBAAgB,EACzB,IAAI,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,GAC7C,OAAO,CAAC,YAAY,CAAC,CAQvB;AAED;;;;;GAKG;AACH,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,gBAAgB,EACzB,QAAQ,EAAE,gBAAgB,GAAG,IAAI,EACjC,GAAG,EAAE,IAAI,GACR,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CAAC,CAKnD;AAOD;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,gBAAgB,GAAG,YAAY,EAAE,CAqC9E;AA2HD;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI,CAShD;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI,CAsBnF;AAED,0EAA0E;AAC1E,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAEtD;AAED,8EAA8E;AAC9E,wBAAgB,QAAQ,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAEtD;AAMD,gEAAgE;AAChE,wBAAsB,qBAAqB,CACzC,GAAG,EAAE,OAAO,EACZ,IAAI,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,GAC7C,OAAO,CAAC,YAAY,CAAC,CASvB;AAED;;;;;GAKG;AACH,wBAAsB,eAAe,CACnC,GAAG,EAAE,OAAO,EACZ,QAAQ,EAAE,WAAW,GAAG,IAAI,EAC5B,GAAG,EAAE,IAAI,GACR,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CAAC,CAKnD;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,OAAO,GAAG,YAAY,EAAE,CA6C5D;AAED;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,OAAO,GAAG,YAAY,EAAE,CAiCnE"}
@@ -0,0 +1,471 @@
1
+ import { BLUEPRINT_JSON_PATH, BLUEPRINT_MODULES_DIR, BLUEPRINT_OVERVIEW_PATH, BLUEPRINT_VERSION_PATH, SPEC_FEATURES_DIR, SPEC_JSON_PATH, SPEC_OVERVIEW_PATH, SPEC_RULES_PATH, SPEC_VERSION_PATH, } from '@cat-factory/contracts';
2
+ /** SHA-256 hex digest — Web Crypto, runs on both runtimes. */
3
+ async function sha256Hex(input) {
4
+ const digest = await crypto.subtle.digest('SHA-256', new TextEncoder().encode(input));
5
+ return [...new Uint8Array(digest)].map((b) => b.toString(16).padStart(2, '0')).join('');
6
+ }
7
+ function asString(value) {
8
+ return typeof value === 'string' && value.trim() !== '' ? value.trim() : undefined;
9
+ }
10
+ // ---------------------------------------------------------------------------
11
+ // Blueprint (service → modules)
12
+ // ---------------------------------------------------------------------------
13
+ // Coercion limits, mirroring the board-scan schema so a committed blueprint can
14
+ // never balloon past what the board/schema accept.
15
+ const MAX_MODULES = 40;
16
+ const MAX_REFERENCES = 40;
17
+ // The board frame types a service may present as. Kept in lockstep with
18
+ // @cat-factory/contracts `blockTypeSchema`.
19
+ const BLOCK_TYPES = [
20
+ 'frontend',
21
+ 'service',
22
+ 'api',
23
+ 'database',
24
+ 'queue',
25
+ 'integration',
26
+ 'external',
27
+ 'environment',
28
+ ];
29
+ function coerceReferences(value) {
30
+ if (!Array.isArray(value))
31
+ return [];
32
+ const seen = new Set();
33
+ for (const raw of value) {
34
+ const path = asString(raw);
35
+ if (path)
36
+ seen.add(path);
37
+ if (seen.size >= MAX_REFERENCES)
38
+ break;
39
+ }
40
+ return [...seen];
41
+ }
42
+ function coerceModule(value) {
43
+ if (typeof value !== 'object' || value === null)
44
+ return null;
45
+ const obj = value;
46
+ const name = asString(obj.name);
47
+ if (!name)
48
+ return null;
49
+ return {
50
+ name,
51
+ summary: asString(obj.summary) ?? '',
52
+ references: coerceReferences(obj.references),
53
+ };
54
+ }
55
+ /**
56
+ * Coerce an agent's parsed JSON into a well-formed {@link BlueprintService},
57
+ * dropping anything malformed. Returns null when no usable service name remains.
58
+ * Tolerates either a bare service object or `{ service: {...} }`. The strict Valibot
59
+ * `parseBlueprintService` re-validates the result before it touches the board.
60
+ */
61
+ export function coerceBlueprintService(parsed, fallbackName) {
62
+ if (typeof parsed !== 'object' || parsed === null)
63
+ return null;
64
+ const root = parsed;
65
+ const obj = typeof root.service === 'object' && root.service !== null
66
+ ? root.service
67
+ : root;
68
+ const name = asString(obj.name) ?? asString(fallbackName);
69
+ if (!name)
70
+ return null;
71
+ const type = BLOCK_TYPES.includes(obj.type) ? obj.type : 'service';
72
+ const modules = (Array.isArray(obj.modules) ? obj.modules : [])
73
+ .map(coerceModule)
74
+ .filter((m) => m !== null)
75
+ .slice(0, MAX_MODULES);
76
+ return {
77
+ type,
78
+ name,
79
+ summary: asString(obj.summary) ?? '',
80
+ references: coerceReferences(obj.references),
81
+ modules,
82
+ };
83
+ }
84
+ /** Turn a module name into a stable, filesystem-safe slug for its deep-dive file. */
85
+ export function moduleSlug(name) {
86
+ const slug = name
87
+ .toLowerCase()
88
+ .replace(/[^a-z0-9]+/g, '-')
89
+ .replace(/^-+|-+$/g, '');
90
+ return slug || 'module';
91
+ }
92
+ /** The exact canonical JSON bytes written to `blueprint.json` (and hashed). */
93
+ export function canonicalBlueprintJson(service) {
94
+ return `${JSON.stringify(service, null, 2)}\n`;
95
+ }
96
+ /** A stable content hash of the blueprint tree, used for quick staleness checks. */
97
+ export function hashBlueprint(service) {
98
+ return sha256Hex(canonicalBlueprintJson(service));
99
+ }
100
+ /** Render the lightweight `version.json` manifest for `service`. */
101
+ export async function renderBlueprintVersionFile(service, meta) {
102
+ const manifest = {
103
+ version: meta.version,
104
+ generatedAt: meta.generatedAt,
105
+ hash: await hashBlueprint(service),
106
+ modules: (service.modules ?? []).length,
107
+ };
108
+ return { path: BLUEPRINT_VERSION_PATH, content: `${JSON.stringify(manifest, null, 2)}\n` };
109
+ }
110
+ /**
111
+ * Decide the version manifest for a freshly generated tree: when the content is
112
+ * byte-identical to the previous generation the version + timestamp are kept (so an
113
+ * unchanged blueprint produces no diff and no commit); otherwise the counter is
114
+ * bumped and the timestamp refreshed.
115
+ */
116
+ export async function nextBlueprintVersion(service, previous, now) {
117
+ if (previous && previous.hash === (await hashBlueprint(service))) {
118
+ return { version: previous.version, generatedAt: previous.generatedAt };
119
+ }
120
+ return { version: (previous?.version ?? 0) + 1, generatedAt: now.toISOString() };
121
+ }
122
+ function renderReferences(references) {
123
+ if (references.length === 0)
124
+ return [];
125
+ return ['', '**Code references:**', ...references.map((r) => `- \`${r}\``)];
126
+ }
127
+ /**
128
+ * Deterministically render a blueprint tree into the in-repo artifact files: the
129
+ * canonical `blueprint.json`, a high-level `overview.md` (service + each module with
130
+ * a one-line summary — what agents read first), and one `modules/<slug>.md` deep-dive
131
+ * per module (summary + code references). Pure: same tree → same bytes.
132
+ */
133
+ export function renderBlueprintFiles(service) {
134
+ const files = [];
135
+ const modules = service.modules ?? [];
136
+ files.push({ path: BLUEPRINT_JSON_PATH, content: canonicalBlueprintJson(service) });
137
+ const overview = [`# ${service.name}`, ''];
138
+ overview.push('> Generated service blueprint. Read this overview first for the');
139
+ overview.push('> high-level structure; open `modules/<name>.md` only for a module');
140
+ overview.push('> directly relevant to your task.');
141
+ overview.push('');
142
+ if (service.summary)
143
+ overview.push(service.summary, '');
144
+ if (modules.length === 0) {
145
+ overview.push('_No modules mapped yet._');
146
+ }
147
+ else {
148
+ overview.push('## Modules', '');
149
+ for (const m of modules) {
150
+ const slug = moduleSlug(m.name);
151
+ overview.push(`### [${m.name}](modules/${slug}.md)`);
152
+ if (m.summary)
153
+ overview.push('', m.summary);
154
+ overview.push('');
155
+ }
156
+ }
157
+ files.push({ path: BLUEPRINT_OVERVIEW_PATH, content: `${overview.join('\n').trimEnd()}\n` });
158
+ for (const m of modules) {
159
+ const slug = moduleSlug(m.name);
160
+ const lines = [`# ${m.name}`, ''];
161
+ if (m.summary)
162
+ lines.push(m.summary, '');
163
+ lines.push(...renderReferences(m.references ?? []));
164
+ files.push({
165
+ path: `${BLUEPRINT_MODULES_DIR}/${slug}.md`,
166
+ content: `${lines.join('\n').trimEnd()}\n`,
167
+ });
168
+ }
169
+ return files;
170
+ }
171
+ // ---------------------------------------------------------------------------
172
+ // Spec (service → groups → requirements → acceptance, + domain rules)
173
+ // ---------------------------------------------------------------------------
174
+ const MAX_GROUPS = 40;
175
+ const MAX_REQUIREMENTS_PER_GROUP = 60;
176
+ const MAX_ACCEPTANCE = 20;
177
+ const MAX_RULES = 100;
178
+ const PRIORITIES = ['must', 'should', 'could'];
179
+ const KINDS = ['functional', 'nonfunctional', 'constraint'];
180
+ function slugify(name, fallback) {
181
+ const slug = name
182
+ .toLowerCase()
183
+ .replace(/[^a-z0-9]+/g, '-')
184
+ .replace(/^-+|-+$/g, '');
185
+ return slug || fallback;
186
+ }
187
+ function coerceStringList(value, max) {
188
+ if (!Array.isArray(value))
189
+ return [];
190
+ const out = [];
191
+ for (const raw of value) {
192
+ const s = asString(raw);
193
+ if (s)
194
+ out.push(s);
195
+ if (out.length >= max)
196
+ break;
197
+ }
198
+ return out;
199
+ }
200
+ // A fallback acceptance id is derived deterministically from its owning requirement
201
+ // id + position (`<reqId>-ac-<n>`), so the SAME doc always renders the SAME bytes — no
202
+ // module-global counter that leaks state across calls. A model-supplied id still wins.
203
+ function coerceAcceptance(value, reqId, index) {
204
+ if (typeof value !== 'object' || value === null)
205
+ return null;
206
+ const o = value;
207
+ const given = typeof o.given === 'string' ? o.given.trim() : '';
208
+ const when = typeof o.when === 'string' ? o.when.trim() : '';
209
+ // Accept either `outcome` (canonical) or a model-emitted `then` as the Then clause.
210
+ const outcome = typeof o.outcome === 'string'
211
+ ? o.outcome.trim()
212
+ : typeof o.then === 'string'
213
+ ? o.then.trim()
214
+ : '';
215
+ // A criterion with no Then clause is not testable; drop it.
216
+ if (outcome === '')
217
+ return null;
218
+ return { id: asString(o.id) ?? `${reqId}-ac-${index + 1}`, given, when, outcome };
219
+ }
220
+ function coerceRequirement(value, index) {
221
+ if (typeof value !== 'object' || value === null)
222
+ return null;
223
+ const o = value;
224
+ const title = asString(o.title);
225
+ const statement = asString(o.statement) ?? asString(o.title);
226
+ if (!statement)
227
+ return null;
228
+ const priority = PRIORITIES.includes(o.priority)
229
+ ? o.priority
230
+ : 'should';
231
+ const kind = KINDS.includes(o.kind)
232
+ ? o.kind
233
+ : 'functional';
234
+ const id = asString(o.id) ?? `req-${slugify(title ?? statement.slice(0, 40), `${index + 1}`)}`;
235
+ const acceptance = (Array.isArray(o.acceptance) ? o.acceptance : [])
236
+ .map((a, i) => coerceAcceptance(a, id, i))
237
+ .filter((a) => a !== null)
238
+ .slice(0, MAX_ACCEPTANCE);
239
+ return {
240
+ id,
241
+ title: title ?? statement.slice(0, 120),
242
+ statement,
243
+ kind,
244
+ priority,
245
+ sourceBlockIds: coerceStringList(o.sourceBlockIds, 40),
246
+ acceptance,
247
+ };
248
+ }
249
+ function coerceGroup(value) {
250
+ if (typeof value !== 'object' || value === null)
251
+ return null;
252
+ const o = value;
253
+ const name = asString(o.name);
254
+ if (!name)
255
+ return null;
256
+ const requirements = (Array.isArray(o.requirements) ? o.requirements : [])
257
+ .map((r, i) => coerceRequirement(r, i))
258
+ .filter((r) => r !== null)
259
+ .slice(0, MAX_REQUIREMENTS_PER_GROUP);
260
+ return { name, summary: asString(o.summary) ?? '', requirements };
261
+ }
262
+ function coerceRule(value, index) {
263
+ if (typeof value !== 'object' || value === null)
264
+ return null;
265
+ const o = value;
266
+ const rule = asString(o.rule);
267
+ if (!rule)
268
+ return null;
269
+ return {
270
+ id: asString(o.id) ?? `rule-${index + 1}`,
271
+ rule,
272
+ rationale: asString(o.rationale) ?? '',
273
+ sourceBlockIds: coerceStringList(o.sourceBlockIds, 40),
274
+ };
275
+ }
276
+ /** Return `id` if unseen, else the first `id-2` / `id-3` … not already in `used`. */
277
+ function uniqueId(id, used) {
278
+ if (!used.has(id)) {
279
+ used.add(id);
280
+ return id;
281
+ }
282
+ let n = 2;
283
+ while (used.has(`${id}-${n}`))
284
+ n++;
285
+ const unique = `${id}-${n}`;
286
+ used.add(unique);
287
+ return unique;
288
+ }
289
+ /**
290
+ * Force every requirement / acceptance / rule id in the doc to be globally unique (in
291
+ * place), suffixing `-2`, `-3` … on collision — the same scheme the feature-file slugs
292
+ * use. Ids double as Gherkin scenario / test names and provenance anchors, so
293
+ * duplicates would otherwise silently alias. Deterministic: same tree → same ids.
294
+ */
295
+ export function dedupeSpecIds(doc) {
296
+ const used = new Set();
297
+ for (const g of doc.groups ?? []) {
298
+ for (const r of g.requirements ?? []) {
299
+ r.id = uniqueId(r.id, used);
300
+ for (const a of r.acceptance ?? [])
301
+ a.id = uniqueId(a.id, used);
302
+ }
303
+ }
304
+ for (const rule of doc.rules ?? [])
305
+ rule.id = uniqueId(rule.id, used);
306
+ }
307
+ /**
308
+ * Coerce an agent's parsed JSON into a well-formed {@link SpecDoc}, dropping anything
309
+ * malformed. Returns null when no usable service name remains. Tolerates either a bare
310
+ * doc object or `{ requirements: {...} }`. The strict `parseSpecDoc` re-validates the
311
+ * returned doc before use.
312
+ */
313
+ export function coerceSpecDoc(parsed, fallbackName) {
314
+ if (typeof parsed !== 'object' || parsed === null)
315
+ return null;
316
+ const root = parsed;
317
+ const obj = typeof root.requirements === 'object' &&
318
+ root.requirements !== null &&
319
+ !Array.isArray(root.requirements)
320
+ ? root.requirements
321
+ : root;
322
+ const service = asString(obj.service) ?? asString(fallbackName);
323
+ if (!service)
324
+ return null;
325
+ const groups = (Array.isArray(obj.groups) ? obj.groups : [])
326
+ .map(coerceGroup)
327
+ .filter((g) => g !== null)
328
+ .slice(0, MAX_GROUPS);
329
+ const rules = (Array.isArray(obj.rules) ? obj.rules : [])
330
+ .map((r, i) => coerceRule(r, i))
331
+ .filter((r) => r !== null)
332
+ .slice(0, MAX_RULES);
333
+ const doc = { service, summary: asString(obj.summary) ?? '', groups, rules };
334
+ dedupeSpecIds(doc);
335
+ return doc;
336
+ }
337
+ /** The exact canonical JSON bytes written to `spec.json` (and hashed). */
338
+ export function canonicalSpecJson(doc) {
339
+ return `${JSON.stringify(doc, null, 2)}\n`;
340
+ }
341
+ /** A stable content hash of the spec doc, used for quick staleness checks. */
342
+ export function hashSpec(doc) {
343
+ return sha256Hex(canonicalSpecJson(doc));
344
+ }
345
+ function countRequirements(doc) {
346
+ return (doc.groups ?? []).reduce((n, g) => n + (g.requirements ?? []).length, 0);
347
+ }
348
+ /** Render the lightweight `version.json` manifest for `doc`. */
349
+ export async function renderSpecVersionFile(doc, meta) {
350
+ const manifest = {
351
+ version: meta.version,
352
+ generatedAt: meta.generatedAt,
353
+ hash: await hashSpec(doc),
354
+ requirements: countRequirements(doc),
355
+ rules: (doc.rules ?? []).length,
356
+ };
357
+ return { path: SPEC_VERSION_PATH, content: `${JSON.stringify(manifest, null, 2)}\n` };
358
+ }
359
+ /**
360
+ * Decide the version manifest for a freshly generated doc: when the content is
361
+ * byte-identical to the previous generation the version + timestamp are kept (so an
362
+ * unchanged doc produces no diff and no commit); otherwise the counter is bumped and
363
+ * the timestamp refreshed. Mirrors {@link nextBlueprintVersion}.
364
+ */
365
+ export async function nextSpecVersion(doc, previous, now) {
366
+ if (previous && previous.hash === (await hashSpec(doc))) {
367
+ return { version: previous.version, generatedAt: previous.generatedAt };
368
+ }
369
+ return { version: (previous?.version ?? 0) + 1, generatedAt: now.toISOString() };
370
+ }
371
+ /**
372
+ * Deterministically render a spec doc into the in-repo artifact files: the canonical
373
+ * `spec.json`, a high-level `overview.md` (intent + every group's requirements), and a
374
+ * `rules.md` of the cross-cutting domain rules. Pure: same doc → same bytes.
375
+ */
376
+ export function renderSpecFiles(doc) {
377
+ const files = [];
378
+ const groups = doc.groups ?? [];
379
+ const domainRules = doc.rules ?? [];
380
+ files.push({ path: SPEC_JSON_PATH, content: canonicalSpecJson(doc) });
381
+ const overview = [`# ${doc.service} — Requirements`, ''];
382
+ overview.push('> Generated, prescriptive requirements for this service (what MUST be');
383
+ overview.push('> true). Read this first. `rules.md` lists cross-cutting invariants;');
384
+ overview.push('> `features/*.feature` are the acceptance scenarios your work must satisfy.');
385
+ overview.push('');
386
+ if (doc.summary)
387
+ overview.push(doc.summary, '');
388
+ if (groups.length === 0) {
389
+ overview.push('_No requirements captured yet._');
390
+ }
391
+ else {
392
+ for (const g of groups) {
393
+ overview.push(`## ${g.name}`);
394
+ if (g.summary)
395
+ overview.push('', g.summary);
396
+ overview.push('');
397
+ for (const r of g.requirements ?? []) {
398
+ overview.push(`- **${r.title}** _(${r.priority}, ${r.kind})_ — ${r.statement}`);
399
+ for (const a of r.acceptance ?? []) {
400
+ overview.push(` - _Given_ ${a.given} _When_ ${a.when} _Then_ ${a.outcome}`);
401
+ }
402
+ }
403
+ overview.push('');
404
+ }
405
+ }
406
+ files.push({ path: SPEC_OVERVIEW_PATH, content: `${overview.join('\n').trimEnd()}\n` });
407
+ const rules = [`# ${doc.service} — Domain rules`, ''];
408
+ rules.push('> Cross-cutting invariants and constraints this service must never violate.');
409
+ rules.push('');
410
+ if (domainRules.length === 0) {
411
+ rules.push('_No domain rules captured yet._');
412
+ }
413
+ else {
414
+ for (const r of domainRules) {
415
+ rules.push(`- **${r.rule}**`);
416
+ if (r.rationale)
417
+ rules.push(` - _Why:_ ${r.rationale}`);
418
+ }
419
+ }
420
+ files.push({ path: SPEC_RULES_PATH, content: `${rules.join('\n').trimEnd()}\n` });
421
+ return files;
422
+ }
423
+ /**
424
+ * Pass-1 (mechanical) Gherkin render: one `.feature` file per requirement group, one
425
+ * `Scenario` per acceptance criterion. Deterministic (same doc → same bytes), so the
426
+ * feature files can never silently drift from `spec.json`; a `must` requirement's
427
+ * scenarios are tagged `@must`. The `acceptance` agent later polishes these (pass 2).
428
+ * Groups with no acceptance criteria produce no feature file. The caller seeds these
429
+ * once (writes only when absent) so pass-2 polish survives a re-run.
430
+ */
431
+ export function renderSpecFeatureFiles(doc) {
432
+ const files = [];
433
+ const used = new Set();
434
+ for (const g of doc.groups ?? []) {
435
+ const scenarios = [];
436
+ for (const r of g.requirements ?? []) {
437
+ const acceptance = r.acceptance ?? [];
438
+ for (let i = 0; i < acceptance.length; i++) {
439
+ const a = acceptance[i];
440
+ const name = acceptance.length > 1 ? `${r.title} (#${i + 1})` : r.title;
441
+ if (r.priority === 'must')
442
+ scenarios.push(' @must');
443
+ scenarios.push(` Scenario: ${name}`);
444
+ if (a.given)
445
+ scenarios.push(` Given ${a.given}`);
446
+ if (a.when)
447
+ scenarios.push(` When ${a.when}`);
448
+ scenarios.push(` Then ${a.outcome}`);
449
+ scenarios.push('');
450
+ }
451
+ }
452
+ if (scenarios.length === 0)
453
+ continue;
454
+ let slug = slugify(g.name, 'feature');
455
+ let n = 2;
456
+ while (used.has(slug))
457
+ slug = `${slugify(g.name, 'feature')}-${n++}`;
458
+ used.add(slug);
459
+ const lines = [`Feature: ${g.name}`];
460
+ if (g.summary)
461
+ lines.push(` ${g.summary}`);
462
+ lines.push('');
463
+ lines.push(...scenarios);
464
+ files.push({
465
+ path: `${SPEC_FEATURES_DIR}/${slug}.feature`,
466
+ content: `${lines.join('\n').trimEnd()}\n`,
467
+ });
468
+ }
469
+ return files;
470
+ }
471
+ //# sourceMappingURL=render.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render.js","sourceRoot":"","sources":["../../src/repo-ops/render.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cat-factory/agents",
3
- "version": "0.7.3",
3
+ "version": "0.8.1",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "git+https://github.com/kibertoad/cat-factory.git",
@@ -29,16 +29,19 @@
29
29
  "@ai-sdk/openai-compatible": "^2.0.51",
30
30
  "ai": "^6.0.208",
31
31
  "handlebars": "^4.7.9",
32
- "@cat-factory/contracts": "0.7.2",
33
- "@cat-factory/kernel": "0.7.3",
34
- "@cat-factory/prompt-fragments": "0.7.2"
32
+ "@cat-factory/contracts": "0.8.0",
33
+ "@cat-factory/kernel": "0.9.0",
34
+ "@cat-factory/prompt-fragments": "0.7.3"
35
35
  },
36
36
  "devDependencies": {
37
- "typescript": "7.0.1-rc"
37
+ "typescript": "7.0.1-rc",
38
+ "vitest": "^4.1.9"
38
39
  },
39
40
  "scripts": {
40
41
  "build": "tsc -b tsconfig.build.json",
41
42
  "typecheck": "tsc -p tsconfig.json --noEmit",
43
+ "test": "vitest run",
44
+ "test:run": "vitest run",
42
45
  "precompile:templates": "node scripts/precompile-prompts.mjs"
43
46
  }
44
47
  }