Skill Tracer
Skills › gstack › gstack › index.ts

index.ts

200 lines · scripts/resolvers/index.ts at 3f79d81

1/**
2 * RESOLVERS record — maps {{PLACEHOLDER}} names to generator functions
3 * or gated entries.
4 *
5 * Each resolver takes a TemplateContext and returns the replacement string.
6 * Resolvers may be either a bare function (always fires) or a gated entry
7 * ({ resolve, appliesTo }) where appliesTo can return false to skip the
8 * resolver for a given skill. See ./types.ts: ResolverEntry.
9 *
10 * Most resolvers don't need a gate — the {{NAME}} placeholder system is
11 * already conditional at the template level (the resolver only fires for
12 * skills that reference it). Use a gate when you want a structural
13 * guardrail that says "this placeholder is meaningful only in skills X, Y, Z"
14 * even if someone later adds {{NAME}} to skill W.
15 */
17import type { TemplateContext, ResolverFn } from './types';
18import { getHostConfig } from '../../hosts/index';
19import { outsideVoiceFor, outsideVoiceGuard, outsideVoiceInvocation, outsideVoicePreflight, outsideVoiceProvenance, generateOutsideVoiceRouting } from './outside-voice';
21// Domain modules
22import { generateSkillPreamble } from './preamble-hoist';
23import { generateTestFailureTriage } from './preamble';
24import { generateDesignMethodology, generateDesignHardRules, generateDesignOutsideVoices, generateDesignReviewLite, generateDesignSketch, generateDesignSetup, generateDesignMockup, generateDesignShotgunGeneration, generateDesignShotgunLoop, generateTasteProfile, generateUXPrinciples, generateOverusedFonts, generateDesignSlopBullets, generateDesignDetector, generateDesignMdCheck } from './design';
25import { generateTestBootstrap, generateTestCoverageAuditPlan, generateTestCoverageAuditShip, generateTestCoverageGateShip } from './testing';
26import { generateReviewDashboard, generatePlanFileReviewReport } from './review-dashboard';
27import { generatePlanReviewApprovalCheck, generateExitPlanModeGate, generatePlanCompletionAuditShip, generatePlanCompletionGateShip, generatePlanCompletionAuditReview, generatePlanVerificationExec } from './plan-gates';
28import { generateAntiShortcutClause, generateSpecReviewLoop, generateBenefitsFrom } from './spec-review';
29import { generateCodexSecondOpinion, generateAdversarialStep, generateCodexPlanReview, generateCodexDocReview } from './outside-voice-steps';
30import { generateImplementationModelHandoff } from './plan-review';
31import { generateScopeDrift, generateCrossReviewDedup, generateSharedCodeReuse } from './review-scope';
32import { generateSlugEval, generateSlugSetup, generateBaseBranchDetect, generateDeployBootstrap, generateQAMethodology, generateCoAuthorTrailer, generateChangelogWorkflow, generateCodexWebSearchFlag, generateCodexModelConfigFlag, generateCodexReviewModelConfigFlag, generateClaudeModelFlag, generateSetupCommand } from './utility';
33import { generateLearningsSearch, generateLearningsLog } from './learnings';
34import { generateConfidenceCalibration } from './confidence';
35import { generateGateScanBlock } from './gate-scan';
36import { generateInvokeSkill, generateAutoplanReviewFile, generateAutoplanSnapshotTool, generateAutoplanPublicationHook, generateCeoModeHandoffHook } from './composition';
37import { generateReviewArmy } from './review-army';
38import { generateDxFramework, generateDxErrorCompact, generateDxErrorItems } from './dx';
39import { generateGBrainContextLoad, generateGBrainSaveResults, generateBrainPreflight, generateBrainCacheRefresh, generateBrainWriteBack } from './gbrain';
40import { generateTasksSectionEmit, generateTasksSectionAggregate } from './tasks-section';
41import { SECTION, SECTION_INDEX } from './sections';
42import { DESIGN_CRAFT_RULE, DESIGN_PERSUADE_CHECKS } from './design-craft';
43import { generateRedactInvocationBlock } from './redact-doc';
44import { generateFreeTextFile } from './free-text-file';
45import { FOREGROUND_DISPATCH_NOTE, codexSelect } from './constants';
46import { generateThirdPartyActions } from './third-party-actions';
47import { generateAsideSetup, generateAsideCookbook, generateAsideResearch, generateUntrustedContentWarning, asideExecPrelude, asideResearchSend } from './aside';
48import { generateCommandReference, generateSnapshotFlags, generateBrowseSetup, generateBrowseFallback } from './browse';
49import { generateDesignDocDiscovery } from './design-doc-discovery';
50import { generateSharedLibsRubric, generateSafeGitPath } from './shared-libs';
51import { generateTestValueBar, generateTestValueMessage } from './test-value';
52import { generateImplementerDispatchRules } from './dispatch-rules';
53import { generatePlanRealityRows } from './plan-reality';
54import { generateSidewaysSweep, generateFlakeFixNumber } from './sideways';
55import { generateCoordinatorContract } from './coordinator-contract';
56import { generateAutoplanDriverCodes, generateAutoplanDriverCommands, generateAutoplanDriverFiles, generateAutoplanDriverGate, generateAutoplanDriverPhases, generateAutoplanDriverResultFormat } from './autoplan-driver';
57import { generateShipDriverStops } from './ship-driver';
58import { generateQAScope, generateQAExploratory, generateQAFunctional, generateQAResource, generateQAReview, generateQAReviewPreflight, generateQAMethodReads } from './qa';
59import { generateVoiceTriggerRouting } from './voice-triggers';
60import { generateTranscriptDiscovery, generateTranscriptSources } from './transcripts';
62export const RESOLVERS: Record<string, ResolverFn> = {
63 AUTOPLAN_PUBLICATION_HOOK: generateAutoplanPublicationHook,
64 CEO_MODE_HANDOFF_HOOK: generateCeoModeHandoffHook,
65 OUTSIDE_SELF_GUARD: (ctx, args) => outsideVoiceGuard({ ...ctx, host: args?.[0] === 'claude-code' ? 'codex' : 'claude' }),
66 OUTSIDE_VOICE_ROUTING: generateOutsideVoiceRouting,
67 VOICE_TRIGGER_ROUTING: generateVoiceTriggerRouting,
68 OUTSIDE_LABEL: (ctx) => outsideVoiceFor(ctx).label,
69 NATIVE_LABEL: (ctx) => outsideVoiceFor(ctx).nativeLabel,
70 OUTSIDE_PROVIDER: (ctx) => outsideVoiceFor(ctx).id,
71 HOST_ID: (ctx) => ctx.host,
72 OUTSIDE_PREFLIGHT: (ctx, args) => outsideVoicePreflight(ctx, { disabledBehavior: args?.[0] === 'opt-in' ? 'opt-in' : 'codex-only', ...(args?.[0] === 'autoplan' || args?.[1] === 'plan-review' ? { role: 'plan-review' as const } : {}) }),
73 OUTSIDE_INVOCATION: (ctx, args) => outsideVoiceInvocation(ctx, { timeoutMs: args?.[0] === 'spec' ? 120000 : 540000, gate: args?.[0] === 'spec' ? 'spec' : 'review', reasoningEffort: args?.[0] === 'spec' ? 'medium' : 'high', ...(args?.[0] === 'autoplan' || args?.[0] === 'spec' ? { role: 'plan-review' as const } : {}) }),
74 OUTSIDE_PROVENANCE: (ctx, args) => outsideVoiceProvenance(ctx, args?.[0] ?? ctx.skillName),
75 SLUG_EVAL: generateSlugEval,
76 SLUG_SETUP: generateSlugSetup,
77 CODEX_WEB_SEARCH_FLAG: generateCodexWebSearchFlag,
78 CODEX_MODEL_CONFIG_FLAG: generateCodexModelConfigFlag,
79 CODEX_REVIEW_MODEL_CONFIG_FLAG: generateCodexReviewModelConfigFlag,
80 CODEX_SELECT: (_ctx, args) => codexSelect(args?.[0] === 'review' ? 'review' : 'exec', undefined, args?.[1] ? { budgetSecs: Number(args[1]), optional: true } : undefined),
81 CLAUDE_MODEL_FLAG: generateClaudeModelFlag,
82 REDACT_INVOCATION_BLOCK: generateRedactInvocationBlock,
83 FREE_TEXT_FILE: generateFreeTextFile,
84 THIRD_PARTY_ACTIONS: generateThirdPartyActions,
85 DESIGN_DOC_DISCOVERY: generateDesignDocDiscovery,
86 SHARED_LIBS_RUBRIC: generateSharedLibsRubric,
87 SAFE_GIT: generateSafeGitPath,
88 SHARED_CODE_REUSE: generateSharedCodeReuse,
89 UNTRUSTED_CONTENT_WARNING: generateUntrustedContentWarning,
90 COMMAND_REFERENCE: generateCommandReference,
91 SNAPSHOT_FLAGS: generateSnapshotFlags,
92 BROWSE_SETUP: generateBrowseSetup,
93 BROWSE_FALLBACK: generateBrowseFallback,
94 PREAMBLE: generateSkillPreamble,
95 ASIDE_SETUP: generateAsideSetup,
96 ASIDE_COOKBOOK: generateAsideCookbook,
97 ASIDE_RESEARCH: generateAsideResearch,
98 ASIDE_EXEC_PRELUDE: asideExecPrelude,
99 ASIDE_RESEARCH_SEND: asideResearchSend,
100 BASE_BRANCH_DETECT: generateBaseBranchDetect,
101 QA_METHODOLOGY: generateQAMethodology,
102 QA_SCOPE: generateQAScope,
103 QA_EXPLORATORY: generateQAExploratory,
104 QA_FUNCTIONAL: generateQAFunctional,
105 QA_RESOURCE: generateQAResource,
106 QA_REVIEW: generateQAReview,
107 QA_REVIEW_PREFLIGHT: generateQAReviewPreflight,
108 QA_METHOD_READS: generateQAMethodReads,
109 DESIGN_METHODOLOGY: generateDesignMethodology,
110 DESIGN_HARD_RULES: generateDesignHardRules,
111 OVERUSED_FONTS: generateOverusedFonts,
112 DESIGN_DETECTOR: generateDesignDetector,
113 DESIGN_MD_CHECK: generateDesignMdCheck,
114 DESIGN_SLOP_BULLETS: generateDesignSlopBullets,
115 DESIGN_CRAFT_RULE,
116 DESIGN_PERSUADE_CHECKS,
117 UX_PRINCIPLES: generateUXPrinciples,
118 DESIGN_OUTSIDE_VOICES: generateDesignOutsideVoices,
119 DESIGN_REVIEW_LITE: generateDesignReviewLite,
120 REVIEW_DASHBOARD: generateReviewDashboard,
121 PLAN_FILE_REVIEW_REPORT: generatePlanFileReviewReport,
122 EXIT_PLAN_MODE_GATE: generateExitPlanModeGate,
123 PLAN_REVIEW_APPROVAL_CHECK: generatePlanReviewApprovalCheck,
124 ANTI_SHORTCUT_CLAUSE: generateAntiShortcutClause,
125 TEST_BOOTSTRAP: generateTestBootstrap,
126 TEST_COVERAGE_AUDIT_PLAN: generateTestCoverageAuditPlan,
127 TEST_COVERAGE_AUDIT_SHIP: generateTestCoverageAuditShip,
128 TEST_COVERAGE_GATE_SHIP: generateTestCoverageGateShip,
129 TEST_VALUE_BAR: generateTestValueBar,
130 TEST_VALUE_MESSAGE: generateTestValueMessage,
131 IMPLEMENTER_DISPATCH_RULES: generateImplementerDispatchRules,
132 TEST_FAILURE_TRIAGE: generateTestFailureTriage,
133 SPEC_REVIEW_LOOP: generateSpecReviewLoop,
134 DESIGN_SKETCH: generateDesignSketch,
135 DESIGN_SETUP: generateDesignSetup,
136 DESIGN_MOCKUP: generateDesignMockup,
137 DESIGN_SHOTGUN_GENERATION: generateDesignShotgunGeneration,
138 DESIGN_SHOTGUN_LOOP: generateDesignShotgunLoop,
139 BENEFITS_FROM: generateBenefitsFrom,
140 CODEX_SECOND_OPINION: generateCodexSecondOpinion,
141 ADVERSARIAL_STEP: generateAdversarialStep,
142 SCOPE_DRIFT: generateScopeDrift,
143 DEPLOY_BOOTSTRAP: generateDeployBootstrap,
144 CODEX_PLAN_REVIEW: generateCodexPlanReview,
145 IMPLEMENTATION_MODEL_HANDOFF: generateImplementationModelHandoff,
146 CODEX_DOC_REVIEW: generateCodexDocReview,
147 PLAN_COMPLETION_AUDIT_SHIP: generatePlanCompletionAuditShip,
148 PLAN_COMPLETION_GATE_SHIP: generatePlanCompletionGateShip,
149 PLAN_COMPLETION_AUDIT_REVIEW: generatePlanCompletionAuditReview,
150 PLAN_VERIFICATION_EXEC: generatePlanVerificationExec,
151 PLAN_REALITY_ROWS: generatePlanRealityRows,
152 SIDEWAYS_SWEEP: generateSidewaysSweep,
153 FLAKE_FIX_NUMBER: generateFlakeFixNumber,
154 CO_AUTHOR_TRAILER: generateCoAuthorTrailer,
155 SETUP_COMMAND: generateSetupCommand,
156 LEARNINGS_SEARCH: generateLearningsSearch,
157 LEARNINGS_LOG: generateLearningsLog,
158 CONFIDENCE_CALIBRATION: generateConfidenceCalibration,
159 GATE_SCAN_BLOCK: generateGateScanBlock,
160 INVOKE_SKILL: generateInvokeSkill,
161 AUTOPLAN_REVIEW_FILE: generateAutoplanReviewFile,
162 AUTOPLAN_SNAPSHOT_TOOL: generateAutoplanSnapshotTool,
163 CHANGELOG_WORKFLOW: generateChangelogWorkflow,
164 REVIEW_ARMY: generateReviewArmy,
165 CROSS_REVIEW_DEDUP: generateCrossReviewDedup,
166 DX_FRAMEWORK: generateDxFramework,
167 DX_ERROR_ITEMS: generateDxErrorItems,
168 DX_ERROR_COMPACT: generateDxErrorCompact,
169 TASTE_PROFILE: generateTasteProfile,
170 BIN_DIR: (ctx) => ctx.paths.binDir,
171 // Quotable runtime root for paths under gstack's install (freeze/bin, bin, lib):
172 // $GSTACK_ROOT on env-var hosts (each fence gets the runtime prelude), the
173 // literal $HOME path on Claude, so a quoted path keeps working with spaces.
174 RUNTIME_ROOT: (ctx) => getHostConfig(ctx.host).usesEnvVars ? '$GSTACK_ROOT' : `$HOME/${getHostConfig(ctx.host).globalRoot}`,
175 // Literal bin dir for skills that skip the shared preamble, where
176 // $GSTACK_BIN is never set (#2906): the per-install root when rendering for
177 // one, else the host's default global root.
178 INSTALLED_ROOT: (ctx) => ctx.installRoot ? ctx.installRoot.replace(/\/+$/, '') : `~/${getHostConfig(ctx.host).globalRoot}`,
179 INSTALLED_BIN_DIR: (ctx) => ctx.installRoot ? `${ctx.installRoot.replace(/\/+$/, '')}/bin` : `~/${getHostConfig(ctx.host).globalRoot}/bin`,
180 FOREGROUND_DISPATCH_NOTE: () => FOREGROUND_DISPATCH_NOTE,
181 GBRAIN_CONTEXT_LOAD: generateGBrainContextLoad,
182 GBRAIN_SAVE_RESULTS: generateGBrainSaveResults,
183 BRAIN_PREFLIGHT: generateBrainPreflight,
184 BRAIN_CACHE_REFRESH: generateBrainCacheRefresh,
185 BRAIN_WRITE_BACK: generateBrainWriteBack,
186 TASKS_SECTION_EMIT: generateTasksSectionEmit,
187 TASKS_SECTION_AGGREGATE: generateTasksSectionAggregate,
188 COORDINATOR_CONTRACT: generateCoordinatorContract,
189 AUTOPLAN_DRIVER_PHASES: generateAutoplanDriverPhases,
190 AUTOPLAN_DRIVER_COMMANDS: generateAutoplanDriverCommands,
191 AUTOPLAN_DRIVER_RESULT_FORMAT: generateAutoplanDriverResultFormat,
192 AUTOPLAN_DRIVER_GATE: generateAutoplanDriverGate,
193 AUTOPLAN_DRIVER_FILES: generateAutoplanDriverFiles,
194 AUTOPLAN_DRIVER_CODES: generateAutoplanDriverCodes,
195 SHIP_DRIVER_STOPS: generateShipDriverStops,
196 SECTION,
197 SECTION_INDEX,
198 TRANSCRIPT_SOURCES: generateTranscriptSources,
199 TRANSCRIPT_DISCOVERY: generateTranscriptDiscovery,
200};