fix(dry-run): thread { dryRun } through the loaders contribute, session save and recall use (#850) - #853
Merged
Conversation
…on save and recall use Tencent#837 threaded LoadOptions through the config loaders, and Tencent#850 fixes the three commands that still reach them bare (pull, push, status). Three more commands load their config before their own dry-run guard and pass nothing: - contribute (--scope project loads, then --scope user / auto-detect) - session save (same three branches) - recall (detection, the inherited user scope, and the user branch) On a config pending the legacy role migration each of them rewrote ~/.teamai/config.yaml under --dry-run, printing the migration line without any [dry-run] marker; the auto-detect and project branches can also adopt a pre-Tencent#546 partition and run the single-repo self-heal bootstrap. loadLocalConfigForScope is the loader Tencent#837 missed: it now takes LoadOptions and forwards them to detectProjectConfig and both migrateLegacyRoleConfig calls. Callers that pass nothing behave as before — a real run still migrates in place.
The PR description includes sufficient real-CLI verification for this runtime change, so no testing-record finding is warranted. |
jeff-r2026
approved these changes
Sep 27, 2026
5 tasks
Smilewithoutfalling
added a commit
to Smilewithoutfalling/teamai-cli
that referenced
this pull request
Sep 28, 2026
Fixes the red Lint & Test on the previous head (all four matrix entries).
pull-scope-isolation.test.ts asserted the exact argument list of
loadLocalConfigForScope, which this change widens to carry LoadOptions:
expect(loadLocalConfigForScope).toHaveBeenCalledWith('user');
received ['user', undefined, { dryRun: undefined }]
The shape is not a free choice: recall.ts:464 and recall.ts:515 already pass
the same third argument, landed with Tencent#853, so pull.ts matches the merged
precedent. recall-scope-isolation.test.ts never asserts the argument list,
which is why the same change left it green.
The affected set is derived from the changed symbols rather than from the
topic: every test file that mentions loadLocalConfigForScope,
detectProjectConfig or autoDetectInit (76 files, 1221 tests).
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Complements #850, which fixes
pull/push/status. This covers the three commands that issue lists as "Not audited, same bare-call shape" —contribute,session saveandrecall— with the loader change #850 itself proposes. Happy to fold this into #850 instead if one PR is preferred.Problem
#837 threaded
LoadOptionsthrough the config loaders, and its own out-of-scope note (quoted in #850) named the commands that still reach them bare. Beyond the three #850 fixes, three more commands load their config before their own dry-run guard and pass nothing:contributeloadLocalConfigForScope('project'),requireInit()×2,detectProjectConfig()[dry-run] Would pushcheck, after the loadsession saveloadLocalConfigForScope('project'),requireInit()×2,detectProjectConfig()recalldetectProjectConfig(…),loadLocalConfigForScope('user'),requireInit()On a config pending the legacy role migration, each of them rewrote
~/.teamai/config.yamlunder--dry-run, printingMigrated legacy teamai config to default role profile: haiwith no[dry-run]marker (real CLI, before,contribute --file note.md --scope user --dry-run):recall test --dry-rundid the same. The project-scope branches can also adopt a pre-#546 partition and run the single-repo self-heal bootstrap, exactly as #850 describes forpull—detectProjectConfigandselfHealAndReadPartitionalready honouroptions.dryRun; these commands simply never supplied it.Fix
loadLocalConfigForScope(scope, projectRoot?, options)— the loader fix(tags,roles): honor --dry-run and count namespaced skills in tags list (#836) #837 missed: forwardsoptionsintodetectProjectConfigand bothmigrateLegacyRoleConfigcalls.contribute,session saveandrecallpass{ dryRun: options.dryRun }into every config load that precedes their guards.recallrun still migrates in place (verified below), which is the compatibility promise fix(tags,roles): honor --dry-run and count namespaced skills in tags list (#836) #837 made.Tests
src/__tests__/dry-run-load-path.test.ts, reusing its fixtures, tree snapshot and provider-call recorder:recall --dry-runon the legacy-role fixture;contribute --scope user --dry-run) and the loader-level pair fail 3/3 onmain— each writesconfig.yaml— and pass on this branch.loadLocalConfigForScopestill migrates in place.--dry-run.npx tsc --noEmitclean;npm run lint0 warnings under--deny-warnings.Real-CLI verification (
3b3c97b)npm run build, thennode dist/index.jsagainst a sandboxHOMEholding a role-less~/.teamai/config.yamlnext to a team repo whosemanifest/roles.yamldeclareshai, the same single-variable method as #850 (sha256 overconfig.yaml, fixture restored between runs):