mirror of
https://github.com/garrytan/gstack.git
synced 2026-11-06 08:54:04 +01:00
* feat(design-html): craft section and free craft check, adapted from Elaya design skills (GSTA-92) Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> * fix(GSTA-92): restore the full CHANGELOG under the Unreleased entry; drop a $-digit literal from craft.md; count only craft-check executions in design-html-slop-gate Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> * feat(design-shotgun,design-html): carry the chosen archetype into approved.json; persist accepted craft exceptions in finalized.json (GSTA-92 phase 2) Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> * feat(design-review,plan-design-review): craft audit carved on every host, Persuade plan checks, craft tells as catalog entries (GSTA-92 phase 2) Size pins and caps raised to measured sizes only: design-review (13 hosts), plan-design-review (12), design-consultation (9), design-consultation maxSizeRatio, and the new design-review parity guard. Garry 2026-10-25 "Do it" (GSTA-92). Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> * refactor(design-catalog): craft tells are checker-only entries; trim design-review and plan-design-review growth to the planned size (GSTA-92) Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> * test(touchfiles): design-html-slop-gate selects on the craft check it runs (GSTA-92) Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> * test(touchfiles): design-review and plan-design-review cases select on the craft resolver; slop gate on the catalog (GSTA-92) Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> * test(placeholders): allow the craft audit page path placeholder (GSTA-92) Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> * fix: pre-landing review fixes (GSTA-92) A malformed or missing --accepted exceptions file now gets the full craft check with nothing accepted, after a warning, still exiting 2. Before, it printed nothing, and the craft section treats a missing CRAFT_RESULT as 'check unavailable', so one bad finalized.json switched the gate off (found by both adversarial passes). The header comment and the craft section now document the accepted-count suffix on CRAFT_RESULT. Tests cover duplicate carried-forward exception ids and the slop-gate touchfiles selection. Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> * fix: scope --accepted to the same page; record current counts (GSTA-92) The craft section passed --accepted whenever a finalized.json sat beside the page, so a same-day Start fresh build inherited the old page's exceptions. It now passes them only when evolving or rerunning a page it finalized, records the count the check reports now, and writes [] when nothing was accepted instead of the template's placeholder entry. A test pins exit 2 for a clean page with a broken exceptions file. Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> * docs: note the archetype handoff in the shotgun and design-html loops (GSTA-92) Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> * fix: craft audit capture, exceptions and trigger from /ship review (GSTA-92) - craft-audit: no CRAFT_RESULT line means unavailable (exit 2 after a malformed --accepted record still printed findings); --accepted only for a /design-html finalized page, never for needs-proof or lorem; never add [Needs proof] markers to a live page; Aside capture via pg.evaluate; the saved raw DOM is deleted in the checking block and never reported - manifest trigger covers an explicit craft audit (skeleton -6 bytes; pins lowered to measured size, union ratio back under its cap) - autoFixEntries reads RENDERED; DESIGN_CRAFT_RULE needs exactly one lead - tests: checkerOnly contract, resolver throw paths, Persuade checks in both skills, resolver touchfile selection, exception state cells - CHANGELOG: host counts and the audit's new rules Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> * fix: craft audit live-page limits, claim handling and guards (GSTA-92) - craft-audit: linked CSS/JS is unchecked on a saved page (judge by eye); a mount-node shell is framework source; --accepted takes that screen's finalized.json or none; on a live page a claim without proof is filed and asked about, never marked or cut; the saved page is removed whatever the exit code; shorter fix-order and Tailwind prose keeps the union under cap - tests: exact-lead red cases, autoFixEntries in the checkerOnly union, the audit's outcome/exception/session-data clauses; carve guard checks the session-data rule and records measured sizes (skeleton cap 137_767) Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> * fix: craft check skips mount-node shells and script bodies; audit capture order (GSTA-92) Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> * revert: craft checker back to bed645a's reviewed behavior; textless mount-node shell judged by eye (GSTA-92) cycle-cap exception (GSTA-92 lane, 2026-10-25): reverted 216987e's checker half to bed645a's reviewed behavior; byte-neutral prose reword; no new logic Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> * fix: craft audit judges any mount-node shell by eye; pin the clause (GSTA-92) second cycle-cap exception: GStack Minder's decision under Garry's 'do it' on phase 2 (GSTA-92, 2026-10-25): one deleted word plus one test Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> * docs: craft resolver placeholders, carved-on-every-host list, design-craft resolver (GSTA-92 /ship docs audit) Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> * fix: pre-landing review fixes after main merge: claim rule covers repo files, craft temp var, guard tests (GSTA-92) Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> * fix: craft audit files failed Persuade checks as deferred High, judges source tells by eye; stderr pin (GSTA-92) Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> * fix(design-review): never cut a claim a rule or printed fix says to drop Pass R3 (native adversarial, Medium): the CRAFT_CHECK fix text for round-number and needs-proof says to drop or remove the claim, which could lead Phase 8 to delete a real claim. The audit sentence now covers both a rule and the printed fix: defer the claim and ask for the proof. Byte-neutral (80 -> 80); design-review/SKILL.md 137,767, union 145,037, unchanged. The test pin moves with the sentence; no carve-guard mustContain held this sentence. third cycle-cap exception (Captain, 2026-10-26): zero-byte reword closing the content-deletion path; test pin and carve-guard mustContain moved Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> * design-craft: reconcile ids with the design lint (layout-transition is static-tier; legacy transition-all exceptions map to it) Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> --------- Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
196 lines
12 KiB
TypeScript
196 lines
12 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 { getHostConfig } from '../../hosts/index';
|
|
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, generateDesignShotgunGeneration, generateDesignShotgunLoop, generateTasteProfile, generateUXPrinciples, generateOverusedFonts, generateDesignSlopBullets, generateDesignDetector, generateDesignMdCheck } from './design';
|
|
import { generateTestBootstrap, generateTestCoverageAuditPlan, generateTestCoverageAuditShip, generateTestCoverageGateShip } from './testing';
|
|
import { generateReviewDashboard, generatePlanFileReviewReport } from './review-dashboard';
|
|
import { generatePlanReviewApprovalCheck, generateExitPlanModeGate, generatePlanCompletionAuditShip, generatePlanCompletionGateShip, generatePlanCompletionAuditReview, generatePlanVerificationExec } from './plan-gates';
|
|
import { generateAntiShortcutClause, generateSpecReviewLoop, generateBenefitsFrom } from './spec-review';
|
|
import { generateCodexSecondOpinion, generateAdversarialStep, generateCodexPlanReview, generateCodexDocReview } from './outside-voice-steps';
|
|
import { generateImplementationModelHandoff } from './plan-review';
|
|
import { generateScopeDrift, generateCrossReviewDedup, generateSharedCodeReuse } from './review-scope';
|
|
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 { generateGateScanBlock } from './gate-scan';
|
|
import { generateInvokeSkill, generateAutoplanReviewFile, generateAutoplanSnapshotTool, generateAutoplanPublicationHook, generateCeoModeHandoffHook } from './composition';
|
|
import { generateReviewArmy } from './review-army';
|
|
import { generateDxFramework, generateDxErrorCompact, generateDxErrorItems } from './dx';
|
|
import { generateGBrainContextLoad, generateGBrainSaveResults, generateBrainPreflight, generateBrainCacheRefresh, generateBrainWriteBack } from './gbrain';
|
|
import { generateTasksSectionEmit, generateTasksSectionAggregate } from './tasks-section';
|
|
import { SECTION, SECTION_INDEX } from './sections';
|
|
import { DESIGN_CRAFT_RULE, DESIGN_PERSUADE_CHECKS } from './design-craft';
|
|
import { generateRedactInvocationBlock } from './redact-doc';
|
|
import { generateFreeTextFile } from './free-text-file';
|
|
import { FOREGROUND_DISPATCH_NOTE, codexSelect } from './constants';
|
|
import { generateThirdPartyActions } from './third-party-actions';
|
|
import { generateAsideSetup, generateAsideCookbook, generateAsideResearch, generateUntrustedContentWarning, asideExecPrelude, asideResearchSend } 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 { generateImplementerDispatchRules } from './dispatch-rules';
|
|
import { generatePlanRealityRows } from './plan-reality';
|
|
import { generateSidewaysSweep, generateFlakeFixNumber } from './sideways';
|
|
import { generateCoordinatorContract } from './coordinator-contract';
|
|
import { generateAutoplanDriverCodes, generateAutoplanDriverCommands, generateAutoplanDriverFiles, generateAutoplanDriverGate, generateAutoplanDriverPhases, generateAutoplanDriverResultFormat } from './autoplan-driver';
|
|
import { generateQAScope, generateQAExploratory, generateQAFunctional, generateQAResource, generateQAReview, generateQAReviewPreflight, generateQAMethodReads } from './qa';
|
|
import { generateVoiceTriggerRouting } from './voice-triggers';
|
|
|
|
export const RESOLVERS: Record<string, ResolverFn> = {
|
|
AUTOPLAN_PUBLICATION_HOOK: generateAutoplanPublicationHook,
|
|
CEO_MODE_HANDOFF_HOOK: generateCeoModeHandoffHook,
|
|
OUTSIDE_SELF_GUARD: (ctx, args) => outsideVoiceGuard({ ...ctx, host: args?.[0] === 'claude-code' ? 'codex' : 'claude' }),
|
|
OUTSIDE_VOICE_ROUTING: generateOutsideVoiceRouting,
|
|
VOICE_TRIGGER_ROUTING: generateVoiceTriggerRouting,
|
|
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', ...(args?.[0] === 'autoplan' || args?.[1] === 'plan-review' ? { role: 'plan-review' as const } : {}) }),
|
|
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 } : {}) }),
|
|
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,
|
|
CODEX_SELECT: (_ctx, args) => codexSelect(args?.[0] === 'review' ? 'review' : 'exec', undefined, args?.[1] ? { budgetSecs: Number(args[1]), optional: true } : undefined),
|
|
CLAUDE_MODEL_FLAG: generateClaudeModelFlag,
|
|
REDACT_INVOCATION_BLOCK: generateRedactInvocationBlock,
|
|
FREE_TEXT_FILE: generateFreeTextFile,
|
|
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,
|
|
ASIDE_RESEARCH_SEND: asideResearchSend,
|
|
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,
|
|
DESIGN_CRAFT_RULE,
|
|
DESIGN_PERSUADE_CHECKS,
|
|
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,
|
|
IMPLEMENTER_DISPATCH_RULES: generateImplementerDispatchRules,
|
|
TEST_FAILURE_TRIAGE: generateTestFailureTriage,
|
|
SPEC_REVIEW_LOOP: generateSpecReviewLoop,
|
|
DESIGN_SKETCH: generateDesignSketch,
|
|
DESIGN_SETUP: generateDesignSetup,
|
|
DESIGN_MOCKUP: generateDesignMockup,
|
|
DESIGN_SHOTGUN_GENERATION: generateDesignShotgunGeneration,
|
|
DESIGN_SHOTGUN_LOOP: generateDesignShotgunLoop,
|
|
BENEFITS_FROM: generateBenefitsFrom,
|
|
CODEX_SECOND_OPINION: generateCodexSecondOpinion,
|
|
ADVERSARIAL_STEP: generateAdversarialStep,
|
|
SCOPE_DRIFT: generateScopeDrift,
|
|
DEPLOY_BOOTSTRAP: generateDeployBootstrap,
|
|
CODEX_PLAN_REVIEW: generateCodexPlanReview,
|
|
IMPLEMENTATION_MODEL_HANDOFF: generateImplementationModelHandoff,
|
|
CODEX_DOC_REVIEW: generateCodexDocReview,
|
|
PLAN_COMPLETION_AUDIT_SHIP: generatePlanCompletionAuditShip,
|
|
PLAN_COMPLETION_GATE_SHIP: generatePlanCompletionGateShip,
|
|
PLAN_COMPLETION_AUDIT_REVIEW: generatePlanCompletionAuditReview,
|
|
PLAN_VERIFICATION_EXEC: generatePlanVerificationExec,
|
|
PLAN_REALITY_ROWS: generatePlanRealityRows,
|
|
SIDEWAYS_SWEEP: generateSidewaysSweep,
|
|
FLAKE_FIX_NUMBER: generateFlakeFixNumber,
|
|
CO_AUTHOR_TRAILER: generateCoAuthorTrailer,
|
|
SETUP_COMMAND: generateSetupCommand,
|
|
LEARNINGS_SEARCH: generateLearningsSearch,
|
|
LEARNINGS_LOG: generateLearningsLog,
|
|
CONFIDENCE_CALIBRATION: generateConfidenceCalibration,
|
|
GATE_SCAN_BLOCK: generateGateScanBlock,
|
|
INVOKE_SKILL: generateInvokeSkill,
|
|
AUTOPLAN_REVIEW_FILE: generateAutoplanReviewFile,
|
|
AUTOPLAN_SNAPSHOT_TOOL: generateAutoplanSnapshotTool,
|
|
CHANGELOG_WORKFLOW: generateChangelogWorkflow,
|
|
REVIEW_ARMY: generateReviewArmy,
|
|
CROSS_REVIEW_DEDUP: generateCrossReviewDedup,
|
|
DX_FRAMEWORK: generateDxFramework,
|
|
DX_ERROR_ITEMS: generateDxErrorItems,
|
|
DX_ERROR_COMPACT: generateDxErrorCompact,
|
|
TASTE_PROFILE: generateTasteProfile,
|
|
BIN_DIR: (ctx) => ctx.paths.binDir,
|
|
// Quotable runtime root for paths under gstack's install (freeze/bin, bin, lib):
|
|
// $GSTACK_ROOT on env-var hosts (each fence gets the runtime prelude), the
|
|
// literal $HOME path on Claude, so a quoted path keeps working with spaces.
|
|
RUNTIME_ROOT: (ctx) => getHostConfig(ctx.host).usesEnvVars ? '$GSTACK_ROOT' : `$HOME/${getHostConfig(ctx.host).globalRoot}`,
|
|
// Literal bin dir for skills that skip the shared preamble, where
|
|
// $GSTACK_BIN is never set (#2906): the per-install root when rendering for
|
|
// one, else the host's default global root.
|
|
INSTALLED_ROOT: (ctx) => ctx.installRoot ? ctx.installRoot.replace(/\/+$/, '') : `~/${getHostConfig(ctx.host).globalRoot}`,
|
|
INSTALLED_BIN_DIR: (ctx) => ctx.installRoot ? `${ctx.installRoot.replace(/\/+$/, '')}/bin` : `~/${getHostConfig(ctx.host).globalRoot}/bin`,
|
|
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,
|
|
COORDINATOR_CONTRACT: generateCoordinatorContract,
|
|
AUTOPLAN_DRIVER_PHASES: generateAutoplanDriverPhases,
|
|
AUTOPLAN_DRIVER_COMMANDS: generateAutoplanDriverCommands,
|
|
AUTOPLAN_DRIVER_RESULT_FORMAT: generateAutoplanDriverResultFormat,
|
|
AUTOPLAN_DRIVER_GATE: generateAutoplanDriverGate,
|
|
AUTOPLAN_DRIVER_FILES: generateAutoplanDriverFiles,
|
|
AUTOPLAN_DRIVER_CODES: generateAutoplanDriverCodes,
|
|
SECTION,
|
|
SECTION_INDEX,
|
|
};
|