Agentic Skills

Configuration Reference

The .claude/ds-config.json settings read or written by DevStride for Claude Code v0.9.0.

Configuration Reference: .claude/ds-config.json

This page describes the repository contract for plugin v0.9.0. The file lives in the consuming repository, and its values override the plugin’s inline fallbacks.

The easiest way to create it is:

/devstride:setup

Every setting is optional at runtime, but setup writes explicit values so important behavior is visible and reviewable. Re-run /devstride:setup validate after a hand edit.

Branches

KeyShapeSetup value or absent behaviorPurpose
baseBranchstring"develop" fallbackNormal feature base and merge target.
hotfixBaseBranchstring"master" fallbackFresh base for production hotfixes.
protectedBranchesstring['develop', 'master'] fallbackHeads the loop must not rebase, force-push, delete, or write lessons onto. Setup includes the base, release source, and production branch.
integrationBranchstring or nullnullExplicit working-base override. Non-null takes precedence over per-release-unit derivation.
branchNaming.patternstring"<prefix>/<MM-DD-YY>/<slug>"Feature branch shape.
branchNaming.prefixSourcestring"git user.name first name, lowercased; ask if empty or ambiguous"How the prefix is chosen.
branchNaming.dateFormatstring"MM-DD-YY"Branch date format.

Static fallbacks versus repository detection

develop and master are deterministic runtime fallbacks for a repository with no config. They are not claims that every repository uses those names, and /devstride:setup does not copy them when it can inspect origin.

Setup enumerates actual remote branches and uses exact common names as role candidates:

RoleCandidate names
Normal development and release sourcedevelop, development, staging, stage, canary, test, testing, qa
Production and hotfix basemain, master, production, prod
Possible single trunktrunk

Exactly one development candidate and one production candidate produce a proposed four-key mapping. Multiple matches remain a question; setup never picks whichever name happens to appear first. A development candidate without a production candidate can suggest baseBranch and release.releaseSource, but it cannot establish the production or hotfix branch.

The detector considers only branches that exist on origin, matches whole names rather than substrings, and treats origin/HEAD as evidence for the ordinary pull-request base rather than proof of production. Existing explicit config always wins.

/devstride:doctor config resolves the configured values or inline fallbacks and checks them against the remote. If an effective fallback does not exist, doctor prints the concrete candidates and the mapping setup would propose. Doctor never writes the file.

Release-unit integration branches

KeyShapeSetup value or absent behaviorPurpose
epicIntegrationBranches.enabledbooleantrueGive each release unit its own integration branch. false sends planned items to baseBranch.
epicIntegrationBranches.patternstring"<prefix>/<MM-DD-YY>/<epic-number>-<epic-title-slug>"Integration branch pattern. The date is the branch’s creation date.
epicIntegrationBranches.slugRulestringKebab-case, lower-case, [a-z0-9-], strip [N], about six wordsDeterministic release-unit slug rule.
epicIntegrationBranches.releaseTargetstring"baseBranch"Base of the completed release-unit pull request. The literal baseBranch resolves to the configured branch.
epicIntegrationBranches.autoReleasebooleanfalseWhen true, the loop cuts and merges the release-unit pull request after the final leaf. false stops at release-ready.
epicIntegrationBranches.deleteBranchAfterReleasebooleantrueDelete the release-unit branch after a successful release. Set false to retain it.
epicIntegrationBranches.fastStoryMerges.enabledbooleanSetup decides; runtime fallback is enabledWith an integration working base, locally review and merge the leaf with no item pull request. Setup writes true only when a local engine, verify.typecheck, and verify.test are available; otherwise it writes false.
epicIntegrationBranches.fastStoryMerges.requireLocalVerifyGreenbooleantrueRequire the configured local checks before a fast merge.
epicIntegrationBranches.fastStoryMerges.epicReleaseIsFirstCloudPassbooleantrueTell the release review that it must inspect the full accumulated diff.

Two optional sibling keys found in established configs are descriptive only: epicIntegrationBranches.example shows a sample branch name, and epicIntegrationBranches.fastStoryMerges.localEngines documents the expected local roster. The skills resolve actual behavior from the active settings and probes.

Verification

KeyShapeDefaultPurpose
verify.typecheckstringnoneCommands run in order during builds and before push or merge. This is the preferred form.
verify.typecheckCombinedstringnoneOne equivalent fallback command, used only when verify.typecheck is absent.
verify.teststringnoneStandard local suite. Required for setup to enable fast item merges.
verify.testSinglestringnoneSingle-spec command containing a <path/to/test.spec.ts> placeholder.
verify.lintstringnoneLint command, used when the changed paths are in its scope.
verify.testDirstringnoneTest directory used to place new specs.
verify.skipDuringStoryBuildsarray[]Slow suites that run as conditional cloud CI jobs. Every entry must match a real workflow job.

With no typecheck command, push asks instead of guessing. With no test command, setup disables fast merges; if fast merges were enabled manually anyway, the item would have review but no local test gate.

Conditional cloud suite entry

{
  "name": "e2e-matrix",
  "alwaysRunWhenBase": ["productionBranch"],
  "manualTriggerLabel": "run-e2e",
  "runWhenChangedPaths": ["apps/web/**", "packages/e2e/**"],
  "ciChecksByBase": {
    "baseBranch": ["E2E (PR gate)"],
    "productionBranch": ["E2E (full matrix)"]
  }
}
FieldMeaning
nameDisplay name.
alwaysRunWhenBaseBranch roles where the suite is always required, regardless of paths.
manualTriggerLabelLabel the loop adds when the suite is requested manually.
runWhenChangedPathsGlobs matched against the complete final diff, including both sides of renames.
ciChecksByBaseRequired check names for each branch role. No mapping means no requirement on that base.

An empty verify.skipDuringStoryBuilds means no slow cloud gate exists and no absent check should be awaited.

Local pre-ship checks

preShipChecks is an array of suites that run locally at a pull-request or production-release boundary and never appear in CI:

{
  "name": "integration-suite",
  "pathGlobs": ["packages/api/**", "migrations/**"],
  "command": "pnpm test:integration",
  "when": "perPr",
  "timeoutNote": "About 25 minutes; do not run beside another test process."
}
FieldMeaning
nameDisplay name.
pathGlobsPer-PR changed-path selector. Empty means every PR. Ignored for releaseOnly.
commandCommand to run.
whenperPr, releaseOnly, or always.
timeoutNoteDuration and environment guidance shown before the run.

Entries run sequentially in array order. A red per-PR check blocks the pull request. A release check can be waived only by the owner, with the waiver recorded.

Keep a suite in exactly one place: verify.skipDuringStoryBuilds for cloud CI, or preShipChecks for a local ship-boundary run.

preCommitWiringChecks is a string array of repository-specific wiring checks the build loop expects before commits. Setup leaves it [] because only the repository can name these checks.

Generated artifacts

KeyShapeDefaultPurpose
generated.regenCommandstringnoneRegenerate API or other derived output after relevant source changes.
generated.pathsstringnoneGenerated files excluded from hand-written-code review.
generated.toleratedTypeErrors{file, pattern}[]noneNarrow generated-file errors that may be tolerated. Anything else stops the build.

Generated files are regenerated and committed separately; they are never fixed by hand.

Review and CI ordering

KeyShapeDefaultPurpose
review.localCommandstring or nullnullOptional second local review engine. null means the built-in Claude pass is the only local reviewer.
review.localReviewerNamestring"Codex"Name used in roster and finding reports.
review.automatedReviewersarray[]Cloud reviewers to request. Empty means no cloud wave and nothing to wait for.
review.openPullRequestsAsDraftbooleantrueOpen pull requests as drafts in a draft-held repository.
review.readyForReviewReleasesCibooleantrueTreat the ready flip as the action that releases CI.
review.ciHeldUntilReviewSettledbooleantrueHold CI until review settles. All three ordering flags false means CI runs alongside review.
review.reviewDepthPolicystringnoneHuman-readable no-skip policy. The skills enforce maximum effort independently.
review.pollTimeoutMinutesnumber20Bound for each cloud-reviewer poll, not the full CI wait.
review.resolveAddressedThreadsbooleantrueReply to and resolve fixed, dismissed, or captured review threads.
review.notifyWhenSettledbooleanabsent means offNotify after a standalone settled review. Driven review never notifies.

Mixed draft-ordering booleans are unsupported but safe: the skills use the strictest behavior and report the mix.

Local Codex example

This is the DevStride repository’s command shape, not a universal default:

"localCommand": "codex exec review --base <base> -c model_reasoning_effort=\"xhigh\" -c mcp_servers.devstride.enabled=false"

The <base> placeholder is replaced with the review base. The reasoning flag pins the maximum tier. Disabling the DevStride MCP inside the isolated Codex review is load-bearing for this setup: leaving it enabled can wedge the review and look like a clean, empty result.

Cloud reviewer entry

{
  "name": "Copilot",
  "bot": "copilot-pull-request-reviewer[bot]",
  "how": "requested_reviewer",
  "value": "copilot-pull-request-reviewer[bot]",
  "graphqlBotId": "BOT_kgDOCnlnWA"
}

Each reviewer needs the identifiers required by its how mechanism. The skills iterate the full array. An incomplete entry can fail silently because GitHub may accept a request without registering a review event.

Pull requests, commits, and repository guidance

KeyShapeSetup value or defaultPurpose
prBodyTemplate.sections{heading, guidance}[]Four standard sectionsOrdered, closed set of pull-request sections. Setup adopts an existing GitHub template when you confirm it.
prBodyTemplate.noAiAttributionbooleantrueSuppress AI attribution in pull-request bodies. false permits it.
commitConventions.messageFormatstring"<type>(<scope>): <summary> <itemTag>"Ordinary commit subject shape.
commitConventions.reviewFixFormatstring"fix(<scope>): <summary> [<itemNumber> review]"Review-fix commit shape.
commitConventions.epicMergeFormatstring"merge: <itemNumber> [<N>] <short scope> into <epic-slug> integration"Fast item merge subject.
itemTagFormatstring"[I#####]"Item tag shape. Added only when the commit has a verified item.
conventionsDocstring"AGENTS.md" fallbackHuman-owned coding rules read by the build and review skills.
lessonsDocstring".claude/ds-lessons.md"Small review-lessons store. review is the only writer; absence is valid until the first qualifying lesson.

The lessons file is repository data. If it is created, make sure its path is not ignored.

DevStride hierarchy roles

KeyShapeDefaultPurpose
hierarchyRoles.releaseUnitstring or nullResolved at runtimeParent-item type whose completion cuts a release.
hierarchyRoles.leafstring or nullResolved at runtimeExecutable one-day item types.

Setup reads the real work-type hierarchy and asks you to confirm these roles. A configured type that no longer exists stops delivery; silently falling back could route planned work directly to the base branch.

GitHub Actions description

KeyShapeSetup valuePurpose
ci.workflowGlobsstring['.github/workflows/*.yaml', '.github/workflows/*.yml']Workflows inspected for draft gating.
ci.draftGateConditionstring"github.event.pull_request.draft == false"Describes the condition used in your workflows; it does not install the condition.
ci.gateJobNamestring or nullnull unless detected or suppliedCheap, path-independent job used to prove the ready flip released CI. With null, the skills look for a new run at the head commit.

For draft-held ordering, workflows must also subscribe to opened, synchronize, reopened, and ready_for_review.

Production release

KeyShapeDefaultPurpose
release.productionBranchstring"master"Production pull-request base.
release.releaseSourcestring"develop"Branch promoted to production.
release.autoDeployOnMergestringnone; setup asksPlain-English description quoted at the owner merge gate.
release.docsRepo.pathstringnoneSibling documentation checkout. Absence of the whole docsRepo block skips the docs phase.
release.docsRepo.branchstringnoneDocs branch to commit and push.
release.docsRepo.autoDeployOnPushbooleannoneWhether pushing that branch publishes documentation.
release.docsRepo.updateByDefaultbooleannoneWhether normal releases update docs without a per-release opt-in.
release.docsRepo.releaseNotesWhenstringnonePolicy for creating a release note, usually a large and user-facing delta.

The release skill discovers navigation, content locations, routes, and release-note placement from the docs repository itself.

Validate changes

After editing:

/devstride:setup validate
/devstride:doctor

Setup validates the config’s commands, branches, tools, engines, roles, lessons path, and CI consistency. Doctor checks the surrounding installation and reports exact fixes without changing anything.