mirror of
https://github.com/garrytan/gstack.git
synced 2026-09-09 14:38:59 +02:00
gstack's design skills now write DESIGN.md in the open DESIGN.md format and
read tokens from it. {{DESIGN_MD_CHECK}} renders the format check through
bin/gstack-design-md.ts: design-consultation's Phase 0 settles the format once
(spec → update tokens in the front matter; legacy without a marker → one
AskUserQuestion: convert with a .legacy.bak, keep the legacy file, or start
fresh; the answer is written into the file as the format marker so no skill
asks again; a marker already present is obeyed silently; unknown → prose;
missing → Phase 6 writes one). Phase 6's template is the spec form: YAML front
matter with name, description, and exactly the five token groups (colors,
typography.display/body/label/mono with fontFeature: tnum on mono, rounded,
spacing, components with {path} references), then Overview (Creative North
Star, product context, mode per surface, references, key characteristics),
Colors (opening with the Restrained / Committed / Full palette / Drenched
strategy), Typography, Layout, Elevation & Depth, Shapes, Components, Do's and
Don'ts, plus gstack's Motion and Decisions Log as extras; the template ends
with a check that the file parses as `spec`.
design-review runs the `:calibrate` form in Setup: a spec file's flat tokens
are the calibration source (a value present in the tokens is never a finding),
the marker is respected, and conversion is never offered there; its DESIGN.md
export writes the spec form. design-html's token extraction writes the spec
form and respects an existing choice. review/design-checklist.md category 5 and
ship's review-lite step 1 name `gstack-design-md tokens` as the calibration
source; plan-design-review Pass 5 cites tokens by path when front matter
exists.
The contract owns the bin's DESIGN_MD_MARKER / REASON / WRITTEN / BACKUP
lines; the contract test's pending list closes. Carve guard: design-
consultation skeleton 66,500 → 67,500 (measured 67,014; +1,508 B against the
1.5 KB cap). Codex and Factory ship goldens refreshed (review-lite step 1).
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
115 lines
6.3 KiB
TypeScript
115 lines
6.3 KiB
TypeScript
/**
|
|
* RESOLVERS record — maps {{PLACEHOLDER}} names to generator functions
|
|
* or gated entries.
|
|
*
|
|
* Each resolver takes a TemplateContext and returns the replacement string.
|
|
* Resolvers may be either a bare function (always fires) or a gated entry
|
|
* ({ resolve, appliesTo }) where appliesTo can return false to skip the
|
|
* resolver for a given skill. See ./types.ts: ResolverEntry.
|
|
*
|
|
* Most resolvers don't need a gate — the {{NAME}} placeholder system is
|
|
* already conditional at the template level (the resolver only fires for
|
|
* skills that reference it). Use a gate when you want a structural
|
|
* guardrail that says "this placeholder is meaningful only in skills X, Y, Z"
|
|
* even if someone later adds {{NAME}} to skill W.
|
|
*/
|
|
|
|
import type { TemplateContext, ResolverFn } from './types';
|
|
|
|
// Domain modules
|
|
import { generatePreamble } from './preamble';
|
|
import { generateTestFailureTriage } from './preamble';
|
|
import { generateDesignMethodology, generateDesignHardRules, generateDesignOutsideVoices, generateDesignReviewLite, generateDesignSketch, generateDesignSetup, generateDesignMockup, generateDesignShotgunLoop, generateTasteProfile, generateUXPrinciples, generateOverusedFonts, generateDesignSlopBullets, generateDesignDetector, generateDesignMdCheck } from './design';
|
|
import { generateTestBootstrap, generateTestCoverageAuditPlan, generateTestCoverageAuditShip } from './testing';
|
|
import { generateReviewDashboard, generatePlanFileReviewReport, generateExitPlanModeGate, generateAntiShortcutClause, generateSpecReviewLoop, generateBenefitsFrom, generateCodexSecondOpinion, generateAdversarialStep, generateCodexPlanReview, generateCodexDocReview, generatePlanCompletionAuditShip, generatePlanCompletionAuditReview, generatePlanVerificationExec, generateScopeDrift, generateCrossReviewDedup } from './review';
|
|
import { generateSlugEval, generateSlugSetup, generateBaseBranchDetect, generateDeployBootstrap, generateQAMethodology, generateCoAuthorTrailer, generateChangelogWorkflow, generateCodexWebSearchFlag, generateSetupCommand } from './utility';
|
|
import { generateLearningsSearch, generateLearningsLog } from './learnings';
|
|
import { generateConfidenceCalibration } from './confidence';
|
|
import { generateInvokeSkill } from './composition';
|
|
import { generateReviewArmy } from './review-army';
|
|
import { generateDxFramework } from './dx';
|
|
import { generateGBrainContextLoad, generateGBrainSaveResults, generateBrainPreflight, generateBrainCacheRefresh, generateBrainWriteBack } from './gbrain';
|
|
import { generateTasksSectionEmit, generateTasksSectionAggregate } from './tasks-section';
|
|
import { SECTION, SECTION_INDEX } from './sections';
|
|
import { generateRedactInvocationBlock } from './redact-doc';
|
|
import { FOREGROUND_DISPATCH_NOTE } from './constants';
|
|
import { generateThirdPartyActions } from './third-party-actions';
|
|
import { generateAsideSetup, generateAsideCookbook, generateAsideResearch, generateUntrustedContentWarning, asideExecPrelude } from './aside';
|
|
import { generateCommandReference, generateSnapshotFlags, generateBrowseSetup, generateBrowseFallback } from './browse';
|
|
import { generateDesignDocDiscovery } from './design-doc-discovery';
|
|
|
|
export const RESOLVERS: Record<string, ResolverFn> = {
|
|
SLUG_EVAL: generateSlugEval,
|
|
SLUG_SETUP: generateSlugSetup,
|
|
CODEX_WEB_SEARCH_FLAG: generateCodexWebSearchFlag,
|
|
REDACT_INVOCATION_BLOCK: generateRedactInvocationBlock,
|
|
THIRD_PARTY_ACTIONS: generateThirdPartyActions,
|
|
DESIGN_DOC_DISCOVERY: generateDesignDocDiscovery,
|
|
UNTRUSTED_CONTENT_WARNING: generateUntrustedContentWarning,
|
|
COMMAND_REFERENCE: generateCommandReference,
|
|
SNAPSHOT_FLAGS: generateSnapshotFlags,
|
|
BROWSE_SETUP: generateBrowseSetup,
|
|
BROWSE_FALLBACK: generateBrowseFallback,
|
|
PREAMBLE: generatePreamble,
|
|
ASIDE_SETUP: generateAsideSetup,
|
|
ASIDE_COOKBOOK: generateAsideCookbook,
|
|
ASIDE_RESEARCH: generateAsideResearch,
|
|
ASIDE_EXEC_PRELUDE: asideExecPrelude,
|
|
BASE_BRANCH_DETECT: generateBaseBranchDetect,
|
|
QA_METHODOLOGY: generateQAMethodology,
|
|
DESIGN_METHODOLOGY: generateDesignMethodology,
|
|
DESIGN_HARD_RULES: generateDesignHardRules,
|
|
OVERUSED_FONTS: generateOverusedFonts,
|
|
DESIGN_DETECTOR: generateDesignDetector,
|
|
DESIGN_MD_CHECK: generateDesignMdCheck,
|
|
DESIGN_SLOP_BULLETS: generateDesignSlopBullets,
|
|
UX_PRINCIPLES: generateUXPrinciples,
|
|
DESIGN_OUTSIDE_VOICES: generateDesignOutsideVoices,
|
|
DESIGN_REVIEW_LITE: generateDesignReviewLite,
|
|
REVIEW_DASHBOARD: generateReviewDashboard,
|
|
PLAN_FILE_REVIEW_REPORT: generatePlanFileReviewReport,
|
|
EXIT_PLAN_MODE_GATE: generateExitPlanModeGate,
|
|
ANTI_SHORTCUT_CLAUSE: generateAntiShortcutClause,
|
|
TEST_BOOTSTRAP: generateTestBootstrap,
|
|
TEST_COVERAGE_AUDIT_PLAN: generateTestCoverageAuditPlan,
|
|
TEST_COVERAGE_AUDIT_SHIP: generateTestCoverageAuditShip,
|
|
TEST_FAILURE_TRIAGE: generateTestFailureTriage,
|
|
SPEC_REVIEW_LOOP: generateSpecReviewLoop,
|
|
DESIGN_SKETCH: generateDesignSketch,
|
|
DESIGN_SETUP: generateDesignSetup,
|
|
DESIGN_MOCKUP: generateDesignMockup,
|
|
DESIGN_SHOTGUN_LOOP: generateDesignShotgunLoop,
|
|
BENEFITS_FROM: generateBenefitsFrom,
|
|
CODEX_SECOND_OPINION: generateCodexSecondOpinion,
|
|
ADVERSARIAL_STEP: generateAdversarialStep,
|
|
SCOPE_DRIFT: generateScopeDrift,
|
|
DEPLOY_BOOTSTRAP: generateDeployBootstrap,
|
|
CODEX_PLAN_REVIEW: generateCodexPlanReview,
|
|
CODEX_DOC_REVIEW: generateCodexDocReview,
|
|
PLAN_COMPLETION_AUDIT_SHIP: generatePlanCompletionAuditShip,
|
|
PLAN_COMPLETION_AUDIT_REVIEW: generatePlanCompletionAuditReview,
|
|
PLAN_VERIFICATION_EXEC: generatePlanVerificationExec,
|
|
CO_AUTHOR_TRAILER: generateCoAuthorTrailer,
|
|
SETUP_COMMAND: generateSetupCommand,
|
|
LEARNINGS_SEARCH: generateLearningsSearch,
|
|
LEARNINGS_LOG: generateLearningsLog,
|
|
CONFIDENCE_CALIBRATION: generateConfidenceCalibration,
|
|
INVOKE_SKILL: generateInvokeSkill,
|
|
CHANGELOG_WORKFLOW: generateChangelogWorkflow,
|
|
REVIEW_ARMY: generateReviewArmy,
|
|
CROSS_REVIEW_DEDUP: generateCrossReviewDedup,
|
|
DX_FRAMEWORK: generateDxFramework,
|
|
TASTE_PROFILE: generateTasteProfile,
|
|
BIN_DIR: (ctx) => ctx.paths.binDir,
|
|
FOREGROUND_DISPATCH_NOTE: () => FOREGROUND_DISPATCH_NOTE,
|
|
GBRAIN_CONTEXT_LOAD: generateGBrainContextLoad,
|
|
GBRAIN_SAVE_RESULTS: generateGBrainSaveResults,
|
|
BRAIN_PREFLIGHT: generateBrainPreflight,
|
|
BRAIN_CACHE_REFRESH: generateBrainCacheRefresh,
|
|
BRAIN_WRITE_BACK: generateBrainWriteBack,
|
|
TASKS_SECTION_EMIT: generateTasksSectionEmit,
|
|
TASKS_SECTION_AGGREGATE: generateTasksSectionAggregate,
|
|
SECTION,
|
|
SECTION_INDEX,
|
|
};
|