@blundergoat/goat-flow
Version:
AI coding agent harness and local dashboard for Claude Code, OpenAI Codex, Google Antigravity, and GitHub Copilot - setup audits, guardrails, structured skills, deny hooks, and persistent learning loops.
172 lines • 6.14 kB
TypeScript
/**
* Manifest schema for goat-flow's single source of truth (M06a).
*
* `workflow/manifest.json` is the on-disk form. `loadManifest()` returns a
* resolved `Manifest` where every `facts` field has been computed against
* canonical code sources (SETUP_CHECKS, AGENT_CHECKS, HARNESS_CHECKS,
* SKILL_NAMES, preset catalog JSON) or validated against observed on-disk
* state (dashboard views).
*
* Derived values are never written into the JSON - they are computed at load
* time so `facts` cannot drift from code. Static values are written into the
* JSON and validated against observed reality on load; a mismatch raises a
* `ManifestValidationError`.
*/
/** Manifest hook event names for one runtime. */
interface ManifestHookEvents {
pre_tool: string;
post_turn: string | null;
}
/** Prompt invocation syntax an agent expects for goat-flow skills. */
type ManifestPromptInvocationStyle = "slash" | "dollar";
/** Skill mirror/source classification used by quality inventory. */
type ManifestSkillSource = "installed" | "agent-mirror" | "github-mirror";
/** Stable capability metadata consumed outside setup/audit internals. */
interface ManifestAgentCapabilities {
terminal_binary: string;
setup_surfaces: string[];
prompt_invocation_style: ManifestPromptInvocationStyle;
skill_source: ManifestSkillSource;
}
/** Manifest deny-mechanism metadata for one runtime. */
export type ManifestDenyMechanism = {
type: "settings-deny";
path: string;
} | {
type: "deny-script";
path: string;
} | {
type: "both";
settings_path: string;
script_path: string;
};
/** The manifest-backed framework-support record for one agent runtime.
*
* `deny_mechanism` and `hook_events` are optional to model agents whose
* upstream runtime has no documented project-local hook wiring for a given
* capability; enforcement/audit code must guard for the null case. */
export interface AgentProfile {
name: string;
instruction_file: string;
skills_dir: string;
capabilities: ManifestAgentCapabilities;
hooks_dir?: string;
settings?: string;
hook_config_file?: string;
deny_hook?: string;
deny_mechanism?: ManifestDenyMechanism;
local_pattern: string;
hook_events?: ManifestHookEvents;
hooks?: string[];
}
/** The existing `skills:` block. */
interface SkillsStructure {
canonical: string[];
stale_names: string[];
references?: Record<string, string[]>;
}
/** Instruction-file contract declared by the manifest. `required_sections` is
* the canonical list of hot-path headings each agent instruction file must
* carry; harness checks build their regex patterns from these labels so the
* harness cannot drift from the manifest. */
interface ManifestInstructionFile {
line_target: number;
line_limit: number;
required_sections: string[];
version_header_pattern: string;
}
/** On-disk shape of `workflow/manifest.json` after M06a extends it.
*
* `facts` is optional so the loader can detect older manifests (missing key)
* and produce a clean validation error instead of a cryptic type coercion. */
export interface ManifestJson {
description: string;
version: string;
required_files: string[];
required_dirs: string[];
directory_purposes: Record<string, string>;
optional_files: Record<string, string>;
never_create: string[];
skills: SkillsStructure;
agents: Record<string, AgentProfile>;
instruction_file: ManifestInstructionFile;
/** Added by M06a. Only holds values that cannot be derived from code. */
facts?: ManifestJsonFacts;
}
/** The `facts:` block as it appears on disk. Only static values. */
interface ManifestJsonFacts {
dashboard_views: string[];
}
/** Resolved skill facts derived from `src/cli/constants.ts` `SKILL_NAMES`. */
export interface SkillFacts {
total: number;
names: readonly string[];
dispatcher: string;
functional_count: number;
stale_names: readonly string[];
}
/** Resolved check counts derived from the audit check arrays. */
export interface CheckFacts {
setup: number;
agent: number;
harness: number;
total: number;
}
/** Resolved dashboard-view facts. Static list validated against disk. */
interface DashboardViewFacts {
count: number;
names: readonly string[];
}
/** Resolved preset facts derived from the preset catalog JSON length. */
interface PresetFacts {
count: number;
}
/** Fully-populated facts returned by `loadManifest()`. */
export interface ResolvedFacts {
version: string;
skills: SkillFacts;
checks: CheckFacts;
dashboard_views: DashboardViewFacts;
presets: PresetFacts;
}
/** Resolved manifest - on-disk JSON plus computed `facts`. */
export interface Manifest {
version: string;
/** Files the project must contain; validated against disk by audit checks. */
required_files: string[];
/** Directories the project must contain; validated against disk by audit checks. */
required_dirs: string[];
skills: SkillsStructure;
agents: Record<string, AgentProfile>;
instruction_file: ManifestInstructionFile;
facts: ResolvedFacts;
}
/** Inputs to `validateManifest` and `composeManifest`. Derived from running
* code state; `loadManifest` builds these from disk and test helpers
* construct them directly. */
export interface ObservedFacts {
views: string[];
presetsCount: number;
skills: readonly string[];
setupChecks: number;
agentChecks: number;
harnessChecks: number;
version: string;
}
/** Raised when the on-disk manifest's static facts disagree with observed reality. */
declare class ManifestValidationError extends Error {
readonly findings: string[];
constructor(message: string, findings: string[]);
}
export { ManifestValidationError };
/** One consistency finding produced by `checkManifest()`. */
interface ManifestCheckFinding {
rule: string;
message: string;
}
/** Report returned by `checkManifest()`. */
export interface ManifestCheckReport {
status: "pass" | "fail";
findings: ManifestCheckFinding[];
}
//# sourceMappingURL=types.d.ts.map