import type { BrandPreset, BriefSections, DbStrategy, ProjectType } from "./index.js"; export interface ParsedBrief { slug: string | null; description: string | null; projectType: ProjectType | null; brand: BrandPreset | null; githubOrg: string | null; targetPath: string | null; dbStrategy: DbStrategy | null; hasWebUi: boolean | null; hasCron: boolean | null; participateInBulletin: boolean | null; /** * Whether the project sends transactional / auth email. Not nullable — absent * signal means `false` (no mailer emitted), which is the safe default (the * mailer pulls in the AWS/Resend SDKs). Honored only by nextjs / node-service. */ sendsEmail: boolean; /** * Whether the project accepts user-generated content. Not nullable — absent * signal means `false` (no moderation standard inserted), the safe default. * Gates the [[moderation-system]] standard for non-WP app types. */ hasUserContent: boolean; /** * Whether to wire Sentry runtime-error/APM observability. Not nullable — the * inference resolves a definite boolean by applying the smart default (ON for * customer-facing nextjs / cf-pages web apps) when the brief gives no explicit * signal. Gates the [[sentry-runtime-errors]] standard; only inserted for the * nextjs / cf-pages types downstream. */ hasObservability: boolean; /** * Whether the project will accept credit cards. Not nullable — absent signal * means `false` (nothing emitted), the safe default. Gates the card-path * bot-protection standard and, for `nextjs`, the protected-endpoint shape. */ acceptsCards: boolean; /** * Whether the project has a PUBLIC SURFACE — pages meant for the general * public and therefore for search engines. Not nullable; absent signal means * `false`. * * 🔴 Unlike every other inference here, "no signal" resolves to the * RESTRICTIVE answer rather than the common one. A brief for a public site * nearly always says so (marketing, landing page, visitors, SEO, blog), while * a brief for an internal console often just describes the work without ever * using the word "internal" — so absence of evidence is far weaker evidence of * "public" than it looks. A human confirms on line 15 either way. */ hasPublicSurface: boolean; /** Free-text planning sections lifted verbatim from the brief, if any. */ briefSections: BriefSections | undefined; raw: string; } /** * Extract the body of a labelled section. Body extends to the next recognized * section heading (any style) or end of brief. */ export declare function extractSection(brief: string, name: string): string | null; /** * Expand a leading `~` / `~/` to the user's home directory. Briefs and * confirm-screen entries routinely carry `~/Desktop/...` paths, which the * shell would expand on a command line but which arrive literal here. Without * this, `inferTargetPath` rejected every tilde path as non-absolute (a * contributor to the 2026-06-03 "Target path [unset]" dogfood finding). */ export declare function expandHome(p: string): string; export declare function kebabCase(input: string): string; export declare function isValidSlug(slug: string): boolean; export declare function githubOrgForBrand(brand: BrandPreset): string | null; /** * Lift the free-text planning sections out of the brief so they can flow into * the scaffolded ROADMAP.md + README.md (per [[instantiate-z2w-project]] * SKILL Step 1a.4) instead of being discarded after field inference. * * Scans EVERY markdown heading (ATX `## Foo` and standalone bold `**Foo**`), * classifies each by alias keyword, and bounds a section's body at the next * heading of ANY kind. This tolerates real-world brief heading vocabulary * rather than demanding the exact canonical words, and prevents one section's * body from bleeding into the next when an unrecognized heading sits between * them. Only sections actually present appear in the result; returns * `undefined` when none are found (the wizard/`--input` shape). */ export declare function extractBriefSections(brief: string): BriefSections | undefined; /** * Parse a pasted project-instantiation brief into a ParsedBrief. Every field * that cannot be inferred deterministically is left as `null` — the * confirmation layer is responsible for prompting the user to fill blanks. * * This function never throws on parse-failure; it only throws on an empty * or non-string input, which is a programmer error. */ export declare function parseBrief(brief: string): ParsedBrief;