mirror of
https://github.com/garrytan/gstack.git
synced 2026-10-02 17:40:02 +02:00
The skill made the model retype a long safe-Git prefix on each call and a
dropped flag failed shared-libs-read-only. bin/gstack-safe-git applies the
fixed env + flag prefix, adds --no-ext-diff --no-textconv to log/show/diff,
allows diff only between two explicit object IDs and ls-files only in the
NUL-delimited overlay form, and refuses every other shape with one line
naming the allowed forms. The template now points at the installed helper
(host global runtime via {{SAFE_GIT}}) and drops the prose it enforces.
Fixtures resolve the helper to this checkout, the git shim records the safety
environment, and isGuardedGitRequest requires the complete prefix (env
included) for every repository read.
149 lines
8.9 KiB
TypeScript
149 lines
8.9 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';
|
|
import { outsideVoiceFor, outsideVoiceGuard, outsideVoiceInvocation, outsideVoicePreflight, outsideVoiceProvenance, generateOutsideVoiceRouting } from './outside-voice';
|
|
|
|
// 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, generateTestCoverageGateShip } from './testing';
|
|
import { generateReviewDashboard, generatePlanFileReviewReport, generatePlanReviewApprovalCheck, generateExitPlanModeGate, generateAntiShortcutClause, generateSpecReviewLoop, generateBenefitsFrom, generateCodexSecondOpinion, generateAdversarialStep, generateCodexPlanReview, generateCodexDocReview, generatePlanCompletionAuditShip, generatePlanCompletionGateShip, generatePlanCompletionAuditReview, generatePlanVerificationExec, generateScopeDrift, generateCrossReviewDedup, generateSharedCodeReuse } from './review';
|
|
import { generateSlugEval, generateSlugSetup, generateBaseBranchDetect, generateDeployBootstrap, generateQAMethodology, generateCoAuthorTrailer, generateChangelogWorkflow, generateCodexWebSearchFlag, generateCodexModelConfigFlag, generateCodexReviewModelConfigFlag, generateClaudeModelFlag, generateSetupCommand } from './utility';
|
|
import { generateLearningsSearch, generateLearningsLog } from './learnings';
|
|
import { generateConfidenceCalibration } from './confidence';
|
|
import { generateInvokeSkill, generateAutoplanReviewFile, generateAutoplanSnapshotTool, generateAutoplanPublicationHook } 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';
|
|
import { generateSharedLibsRubric, generateSafeGitPath } from './shared-libs';
|
|
import { generateTestValueBar, generateTestValueMessage } from './test-value';
|
|
import { generateQAScope, generateQAExploratory, generateQAFunctional, generateQAResource, generateQAReview, generateQAReviewPreflight, generateQAMethodReads } from './qa';
|
|
|
|
export const RESOLVERS: Record<string, ResolverFn> = {
|
|
AUTOPLAN_PUBLICATION_HOOK: generateAutoplanPublicationHook,
|
|
OUTSIDE_SELF_GUARD: (ctx, args) => outsideVoiceGuard({ ...ctx, host: args?.[0] === 'claude-code' ? 'codex' : 'claude' }),
|
|
OUTSIDE_VOICE_ROUTING: generateOutsideVoiceRouting,
|
|
OUTSIDE_LABEL: (ctx) => outsideVoiceFor(ctx).label,
|
|
NATIVE_LABEL: (ctx) => outsideVoiceFor(ctx).nativeLabel,
|
|
OUTSIDE_PROVIDER: (ctx) => outsideVoiceFor(ctx).id,
|
|
HOST_ID: (ctx) => ctx.host,
|
|
OUTSIDE_PREFLIGHT: (ctx, args) => outsideVoicePreflight(ctx, { disabledBehavior: args?.[0] === 'opt-in' ? 'opt-in' : 'codex-only' }),
|
|
OUTSIDE_INVOCATION: (ctx, args) => outsideVoiceInvocation(ctx, { timeoutMs: args?.[0] === 'spec' ? 120000 : 600000, gate: args?.[0] === 'spec' ? 'spec' : 'review', reasoningEffort: args?.[0] === 'spec' ? 'medium' : 'high' }),
|
|
OUTSIDE_PROVENANCE: (ctx, args) => outsideVoiceProvenance(ctx, args?.[0] ?? ctx.skillName),
|
|
SLUG_EVAL: generateSlugEval,
|
|
SLUG_SETUP: generateSlugSetup,
|
|
CODEX_WEB_SEARCH_FLAG: generateCodexWebSearchFlag,
|
|
CODEX_MODEL_CONFIG_FLAG: generateCodexModelConfigFlag,
|
|
CODEX_REVIEW_MODEL_CONFIG_FLAG: generateCodexReviewModelConfigFlag,
|
|
CLAUDE_MODEL_FLAG: generateClaudeModelFlag,
|
|
REDACT_INVOCATION_BLOCK: generateRedactInvocationBlock,
|
|
THIRD_PARTY_ACTIONS: generateThirdPartyActions,
|
|
DESIGN_DOC_DISCOVERY: generateDesignDocDiscovery,
|
|
SHARED_LIBS_RUBRIC: generateSharedLibsRubric,
|
|
SAFE_GIT: generateSafeGitPath,
|
|
SHARED_CODE_REUSE: generateSharedCodeReuse,
|
|
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,
|
|
QA_SCOPE: generateQAScope,
|
|
QA_EXPLORATORY: generateQAExploratory,
|
|
QA_FUNCTIONAL: generateQAFunctional,
|
|
QA_RESOURCE: generateQAResource,
|
|
QA_REVIEW: generateQAReview,
|
|
QA_REVIEW_PREFLIGHT: generateQAReviewPreflight,
|
|
QA_METHOD_READS: generateQAMethodReads,
|
|
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,
|
|
PLAN_REVIEW_APPROVAL_CHECK: generatePlanReviewApprovalCheck,
|
|
ANTI_SHORTCUT_CLAUSE: generateAntiShortcutClause,
|
|
TEST_BOOTSTRAP: generateTestBootstrap,
|
|
TEST_COVERAGE_AUDIT_PLAN: generateTestCoverageAuditPlan,
|
|
TEST_COVERAGE_AUDIT_SHIP: generateTestCoverageAuditShip,
|
|
TEST_COVERAGE_GATE_SHIP: generateTestCoverageGateShip,
|
|
TEST_VALUE_BAR: generateTestValueBar,
|
|
TEST_VALUE_MESSAGE: generateTestValueMessage,
|
|
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_GATE_SHIP: generatePlanCompletionGateShip,
|
|
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,
|
|
AUTOPLAN_REVIEW_FILE: generateAutoplanReviewFile,
|
|
AUTOPLAN_SNAPSHOT_TOOL: generateAutoplanSnapshotTool,
|
|
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,
|
|
};
|