[codex] Add context stores and initiative views#1127
Conversation
|
Note Reviews pausedIt looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the Use the following commands to manage reviews:
Use the checkboxes below for quick actions:
📝 WalkthroughI can't reliably rebuild the hidden review stack artifact with every rangeId exactly once within this chat (the PR includes hundreds of rangeIds and the previous attempt produced duplicate/missing ids). Please allow me to regenerate this artifact programmatically (I can produce a correct block if you permit a brief automated pass), or provide a smaller set of rangeIds to assign manually. ✨ Finishing Touches🧪 Generate unit tests (beta)
|
a709061 to
9f158d5
Compare
There was a problem hiding this comment.
Actionable comments posted: 8
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (2)
test/core/workspace/foundation.test.ts (1)
81-83:⚠️ Potential issue | 🟡 Minor | ⚡ Quick winUse dual-side canonicalization for workspace path identity assertions.
Current helper is platform-conditional and only normalizes one side of comparisons; identity assertions should normalize both paths before equality checks.
As per coding guidelines `test/**/*.test.{ts,js}`: “When asserting existing filesystem paths as identities in tests, canonicalize both actual and expected paths using `fs.realpathSync.native()` …”🧪 Suggested helper update
- function expectedExistingPath(existingPath: string): string { - return process.platform === 'win32' ? fs.realpathSync.native(existingPath) : existingPath; - } + function canonicalExistingPath(existingPath: string): string { + return fs.realpathSync.native(existingPath); + } + + function expectSameExistingPath(actualPath: string, expectedPath: string): void { + expect(canonicalExistingPath(actualPath)).toBe(canonicalExistingPath(expectedPath)); + }// Example identity assertion: expectSameExistingPath(await findWorkspaceRoot(workspaceRoot), workspaceRoot);🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@test/core/workspace/foundation.test.ts` around lines 81 - 83, The helper expectedExistingPath currently only canonicalizes the expected path on Windows; change it to canonicalize both sides for identity assertions by always returning fs.realpathSync.native(existingPath) (no platform branch) and ensure callers (like expectSameExistingPath / identity assertions comparing findWorkspaceRoot(workspaceRoot)) also canonicalize the actual value with fs.realpathSync.native before comparing; update expectedExistingPath and any consumer to use fs.realpathSync.native for both actual and expected paths.test/commands/workspace.test.ts (1)
1294-1309:⚠️ Potential issue | 🟡 Minor | ⚡ Quick winCanonicalize existing path identity assertion for
local-onlylink.On Line 1307, this compares an existing filesystem path using raw spelling (
localOnly). Please compare canonicalized values (e.g.,expectedExistingPath(localOnly)and/or canonicalize the actual) to avoid platform/path-resolution flakes.As per coding guidelines: "When asserting existing filesystem paths as identities in tests, canonicalize both actual and expected paths using
fs.realpathSync.native()".🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@test/commands/workspace.test.ts` around lines 1294 - 1309, The test currently asserts the raw filesystem spelling for the "local-only" link (path: localOnly), which flakes across platforms; change the expected path to a canonicalized form by calling the canonicalizer (e.g., expectedExistingPath(localOnly) or fs.realpathSync.native(localOnly)) so both actual and expected path identities match; update the objectContaining for the 'local-only' entry (the payload.workspace.links assertion) to use the canonicalized value and add an import/usage of fs.realpathSync.native or the existing expectedExistingPath helper as needed.
🧹 Nitpick comments (2)
test/core/context-store/foundation.test.ts (1)
46-48: ⚡ Quick winUse unconditional canonicalization for path identity checks in this test suite.
For existing-path identity assertions, canonicalize both actual and expected via
fs.realpathSync.native()instead of platform-conditional behavior.As per coding guidelines, “When asserting existing filesystem paths as identities in tests, canonicalize both actual and expected paths using
fs.realpathSync.native()”.Also applies to: 322-325
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@test/core/context-store/foundation.test.ts` around lines 46 - 48, The test currently conditionally canonicalizes expected paths in expectedExistingPath based on platform; change expectedExistingPath to always return fs.realpathSync.native(existingPath) (i.e., unconditional canonicalization) and update any other assertions mentioned (the same pattern around the other occurrences referenced, e.g., the block at lines 322-325) so that both actual and expected paths are compared after calling fs.realpathSync.native(), ensuring all existing-path identity checks use fs.realpathSync.native() for both sides.test/commands/workspace-initiative-open.test.ts (1)
48-50: ⚡ Quick winCanonicalize both sides for path identity assertions in tests.
expectedExistingPathonly canonicalizes on Windows, but this suite compares existing path identities in several assertions. Usefs.realpathSync.native()for both actual and expected values before asserting identity.Suggested fix pattern
- function expectedExistingPath(existingPath: string): string { - return process.platform === 'win32' ? fs.realpathSync.native(existingPath) : existingPath; - } + function canonicalPath(existingPath: string): string { + return fs.realpathSync.native(existingPath); + } + + function expectSameExistingPath(actualPath: string, expectedPath: string): void { + expect(canonicalPath(actualPath)).toBe(canonicalPath(expectedPath)); + }Then use
expectSameExistingPath(...)anywhere path identity is asserted.As per coding guidelines, “When asserting existing filesystem paths as identities in tests, canonicalize both actual and expected paths using
fs.realpathSync.native()”.Also applies to: 143-173, 296-314
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@test/commands/workspace-initiative-open.test.ts` around lines 48 - 50, The helper expectedExistingPath only canonicalizes on Windows which leaves non-Windows assertions comparing non-canonical paths; update expectedExistingPath to always return fs.realpathSync.native(existingPath) (removing the platform branch) and add/use a small test helper expectSameExistingPath(actualPath, expectedPath) that canonicalizes both sides via fs.realpathSync.native() before asserting equality; replace existing direct identity assertions in functions/tests named expectedExistingPath and the blocks referenced (including the ranges around lines 143-173 and 296-314) to call expectSameExistingPath so both actual and expected paths are canonicalized consistently.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@openspec/initiatives/context-store-and-initiatives/roadmap.md`:
- Line 535: Sequence item 9 in the shipping sequence conflicts with the decision
to reject initiative resolve; update the roadmap text so item 9 reflects the
rejection. Locate the line containing "Add initiative local resolution" in the
roadmap (sequence item 9) and replace it with a statement matching the
documented rejection, e.g. "Reject initiative resolve (do not implement local
resolution)" or similar wording that clearly records the decision to reject.
Ensure the surrounding numbering and cross-references remain consistent after
the change.
In `@src/commands/workspace/context-status.ts`:
- Around line 40-49: The catch block in the function that builds workspace
context status is collapsing both store-resolution failures and initiative-read
failures into the single status 'workspace_context_store_unavailable'; split the
error handling so you first attempt to resolve/open the context store (the code
that uses context.store) and return a
makeStatus('error','workspace_context_store_unavailable',...) if that operation
fails, then perform the initiative read (the call that reads initiatives from
the opened store) inside its own try/catch and on failure return a separate
makeStatus (e.g., 'initiative_read_unavailable' or similar) with a fix
suggesting the initiative doctor; use asErrorMessage(error) in both messages and
reference makeStatus, asErrorMessage, and the context.store / initiative-read
call to locate where to add the distinct catch branches.
In `@src/core/collections/runtime.ts`:
- Around line 220-223: The current check treats any string starting with '..'
(relative.startsWith('..')) as a mount-escape; change it to only treat an escape
when the leading segment is exactly '..' or '..' followed by a path separator
(i.e. match ^\.\.(?:[\/\\]|$)). Update the return expression that uses relative
and isRelativePathAbsolute (and the windowsLike flag) to use this stricter test
(e.g., replace relative.startsWith('..') with a regex or an explicit check for
'..' or '..' + path separator) so names like '..draft/file.md' are allowed while
true parent-directory escapes like '../foo' or '..\\foo' are still rejected.
In `@src/core/planning-home.ts`:
- Around line 114-123: When iterating the two state locations
(getWorkspaceSharedStatePath and getWorkspaceLegacySharedStatePath) do not
swallow parse/validation errors from parseWorkspaceSharedState; only fall back
when the file is missing. Change the try/catch around fs.readFileSync +
parseWorkspaceSharedState so that if reading fails with a missing-file error
(e.g., err.code === 'ENOENT' or use fs.existsSync to check) you continue to the
next path, but if parseWorkspaceSharedState throws (or any other non-ENOENT
error) rethrow or propagate that error so invalid current state is surfaced
instead of silently loading legacy state.
In `@src/core/workspace/foundation.ts`:
- Around line 445-456: The current construction of linkNames -> links drops
entries present in sharedState.links when localState.paths lacks that key;
update the creation of links so that for each linkName (from linkNames) you
return an entry even if localState?.paths[linkName] is falsy — use the
sharedState.links[linkName] (or an explicit null/placeholder) as the value when
local path is missing. Modify the flatMap/map over [...linkNames] (and the
resulting links object) to emit [linkName, localPath] when present or [linkName,
sharedState.links[linkName] ?? null] when not, preserving unresolved links
across conversions.
In `@test/commands/change-initiative-link.test.ts`:
- Around line 23-25: Tests compare filesystem path identities with raw strings;
update those assertions to canonicalize both expected and actual paths using
fs.realpathSync.native() before equality checks. Locate uses of tempDir and
dataHome in change-initiative-link.test.ts (and the assertion blocks around the
ranges noted: ~23-25, ~132-140, ~296-307, ~478-487) and replace direct string
comparisons with calls that wrap both sides in fs.realpathSync.native(...) so
symlinks and platform-specific path differences do not cause failures; ensure
you import/require fs where needed and apply the same canonicalization to any
helper functions that return paths used in these assertions (e.g., functions
referenced in the assertion expressions).
In `@test/commands/initiative.test.ts`:
- Around line 47-49: The helper expectedExistingPath currently only
canonicalizes on Windows and for one side; update it to always canonicalize its
input using fs.realpathSync.native (no platform branch) and then update tests to
canonicalize both actual and expected paths before identity assertions (i.e.,
call expectedExistingPath(payload.context_store.root) and
expectedExistingPath(storeRoot) and compare those canonicalized strings). Use
the function name expectedExistingPath to locate and change the helper and
update tests that use it so both sides are compared after realpathSync.native().
In `@test/core/context-store/registry.test.ts`:
- Around line 35-37: The test only canonicalizes the expected path in
expectedExistingPath; change the assertions to canonicalize both sides by using
the existing canonicalPath helper (or fs.realpathSync.native) for the produced
value and the expected value before equality checks: update expectedExistingPath
(or callers that use it) so both the actual produced path and the
expectedExistingPath are passed through canonicalPath(...) (or
fs.realpathSync.native on Windows) prior to the identity assertion. Ensure you
reference expectedExistingPath and the canonicalPath helper when making the
change so all path identity assertions in this file use canonicalized paths.
---
Outside diff comments:
In `@test/commands/workspace.test.ts`:
- Around line 1294-1309: The test currently asserts the raw filesystem spelling
for the "local-only" link (path: localOnly), which flakes across platforms;
change the expected path to a canonicalized form by calling the canonicalizer
(e.g., expectedExistingPath(localOnly) or fs.realpathSync.native(localOnly)) so
both actual and expected path identities match; update the objectContaining for
the 'local-only' entry (the payload.workspace.links assertion) to use the
canonicalized value and add an import/usage of fs.realpathSync.native or the
existing expectedExistingPath helper as needed.
In `@test/core/workspace/foundation.test.ts`:
- Around line 81-83: The helper expectedExistingPath currently only
canonicalizes the expected path on Windows; change it to canonicalize both sides
for identity assertions by always returning fs.realpathSync.native(existingPath)
(no platform branch) and ensure callers (like expectSameExistingPath / identity
assertions comparing findWorkspaceRoot(workspaceRoot)) also canonicalize the
actual value with fs.realpathSync.native before comparing; update
expectedExistingPath and any consumer to use fs.realpathSync.native for both
actual and expected paths.
---
Nitpick comments:
In `@test/commands/workspace-initiative-open.test.ts`:
- Around line 48-50: The helper expectedExistingPath only canonicalizes on
Windows which leaves non-Windows assertions comparing non-canonical paths;
update expectedExistingPath to always return
fs.realpathSync.native(existingPath) (removing the platform branch) and add/use
a small test helper expectSameExistingPath(actualPath, expectedPath) that
canonicalizes both sides via fs.realpathSync.native() before asserting equality;
replace existing direct identity assertions in functions/tests named
expectedExistingPath and the blocks referenced (including the ranges around
lines 143-173 and 296-314) to call expectSameExistingPath so both actual and
expected paths are canonicalized consistently.
In `@test/core/context-store/foundation.test.ts`:
- Around line 46-48: The test currently conditionally canonicalizes expected
paths in expectedExistingPath based on platform; change expectedExistingPath to
always return fs.realpathSync.native(existingPath) (i.e., unconditional
canonicalization) and update any other assertions mentioned (the same pattern
around the other occurrences referenced, e.g., the block at lines 322-325) so
that both actual and expected paths are compared after calling
fs.realpathSync.native(), ensuring all existing-path identity checks use
fs.realpathSync.native() for both sides.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro
Run ID: 1f879709-1aea-4098-9da6-e890ad062cac
📒 Files selected for processing (114)
WORKSPACE_REIMPLEMENTATION_DIRECTION.mdWORKSPACE_REIMPLEMENTATION_START_HERE.mddocs/cli.mddocs/concepts.mdlocal-active-workspace-root-dropdown-BsVoK_JG.jsmain-DVEWN1ng.jsopenspec/changes/workspace-agent-guidance/design.mdopenspec/changes/workspace-agent-guidance/proposal.mdopenspec/changes/workspace-agent-guidance/specs/change-creation/spec.mdopenspec/changes/workspace-agent-guidance/specs/cli-artifact-workflow/spec.mdopenspec/changes/workspace-agent-guidance/specs/workspace-links/spec.mdopenspec/changes/workspace-agent-guidance/tasks.mdopenspec/changes/workspace-apply-repo-slice/proposal.mdopenspec/changes/workspace-reimplementation-roadmap/POC_REFERENCE_GUIDE.mdopenspec/changes/workspace-reimplementation-roadmap/README.mdopenspec/changes/workspace-reimplementation-roadmap/proposal.mdopenspec/changes/workspace-verify-and-archive/proposal.mdopenspec/initiatives/context-store-and-initiatives/.initiative.yamlopenspec/initiatives/context-store-and-initiatives/README.mdopenspec/initiatives/context-store-and-initiatives/decisions.mdopenspec/initiatives/context-store-and-initiatives/direction.mdopenspec/initiatives/context-store-and-initiatives/questions.mdopenspec/initiatives/context-store-and-initiatives/roadmap.mdopenspec/initiatives/context-store-and-initiatives/tasks.mdopenspec/initiatives/context-store-and-initiatives/work-items/01-lock-the-direction/evidence.mdopenspec/initiatives/context-store-and-initiatives/work-items/01-lock-the-direction/plan.mdopenspec/initiatives/context-store-and-initiatives/work-items/01-lock-the-direction/tasks.mdopenspec/initiatives/context-store-and-initiatives/work-items/02-stabilize-workspace-as-local-view/evidence.mdopenspec/initiatives/context-store-and-initiatives/work-items/02-stabilize-workspace-as-local-view/plan.mdopenspec/initiatives/context-store-and-initiatives/work-items/02-stabilize-workspace-as-local-view/tasks.mdopenspec/initiatives/context-store-and-initiatives/work-items/03-add-context-store-foundation/evidence.mdopenspec/initiatives/context-store-and-initiatives/work-items/03-add-context-store-foundation/plan.mdopenspec/initiatives/context-store-and-initiatives/work-items/03-add-context-store-foundation/tasks.mdopenspec/initiatives/context-store-and-initiatives/work-items/04-add-collection-foundation/evidence.mdopenspec/initiatives/context-store-and-initiatives/work-items/04-add-collection-foundation/plan.mdopenspec/initiatives/context-store-and-initiatives/work-items/04-add-collection-foundation/tasks.mdopenspec/initiatives/context-store-and-initiatives/work-items/05-ship-initiative-mvp/evidence.mdopenspec/initiatives/context-store-and-initiatives/work-items/05-ship-initiative-mvp/plan.mdopenspec/initiatives/context-store-and-initiatives/work-items/05-ship-initiative-mvp/tasks.mdopenspec/initiatives/context-store-and-initiatives/work-items/06-add-minimal-context-store-ux/evidence.mdopenspec/initiatives/context-store-and-initiatives/work-items/06-add-minimal-context-store-ux/plan.mdopenspec/initiatives/context-store-and-initiatives/work-items/06-add-minimal-context-store-ux/tasks.mdopenspec/initiatives/context-store-and-initiatives/work-items/07-add-agent-first-initiative-discovery/evidence.mdopenspec/initiatives/context-store-and-initiatives/work-items/07-add-agent-first-initiative-discovery/plan.mdopenspec/initiatives/context-store-and-initiatives/work-items/07-add-agent-first-initiative-discovery/tasks.mdopenspec/initiatives/context-store-and-initiatives/work-items/08-connect-repo-local-changes-to-initiatives/evidence.mdopenspec/initiatives/context-store-and-initiatives/work-items/08-connect-repo-local-changes-to-initiatives/plan.mdopenspec/initiatives/context-store-and-initiatives/work-items/08-connect-repo-local-changes-to-initiatives/tasks.mdopenspec/initiatives/context-store-and-initiatives/work-items/09-add-initiative-resolve/decision-review.mdopenspec/initiatives/context-store-and-initiatives/work-items/09-add-initiative-resolve/evidence.mdopenspec/initiatives/context-store-and-initiatives/work-items/09-add-initiative-resolve/plan.mdopenspec/initiatives/context-store-and-initiatives/work-items/09-add-initiative-resolve/tasks.mdopenspec/initiatives/context-store-and-initiatives/work-items/10-let-workspaces-open-initiatives/plan.mdopenspec/initiatives/context-store-and-initiatives/work-items/10-let-workspaces-open-initiatives/tasks.mdopenspec/initiatives/context-store-and-initiatives/work-items/13-explore-configurable-change-homes/evidence.mdopenspec/initiatives/context-store-and-initiatives/work-items/13-explore-configurable-change-homes/plan.mdopenspec/initiatives/context-store-and-initiatives/work-items/13-explore-configurable-change-homes/tasks.mdopenspec/initiatives/context-store-and-initiatives/work-items/proposed-initiative-next-agent-handoff-ux/evidence.mdopenspec/initiatives/context-store-and-initiatives/work-items/proposed-initiative-next-agent-handoff-ux/plan.mdopenspec/initiatives/context-store-and-initiatives/work-items/proposed-initiative-next-agent-handoff-ux/tasks.mdsrc/cli/index.tssrc/commands/context-store.tssrc/commands/initiative.tssrc/commands/workflow/index.tssrc/commands/workflow/initiative-link.tssrc/commands/workflow/instructions.tssrc/commands/workflow/new-change.tssrc/commands/workflow/set-change.tssrc/commands/workflow/shared.tssrc/commands/workflow/status.tssrc/commands/workspace.tssrc/commands/workspace/context-status.tssrc/commands/workspace/open-view.tssrc/commands/workspace/open.tssrc/commands/workspace/opener-selection.tssrc/commands/workspace/operations.tssrc/commands/workspace/prompt-theme.tssrc/commands/workspace/registration.tssrc/commands/workspace/selection.tssrc/commands/workspace/types.tssrc/core/artifact-graph/instruction-loader.tssrc/core/artifact-graph/types.tssrc/core/collections/index.tssrc/core/collections/initiatives/collection.tssrc/core/collections/initiatives/index.tssrc/core/collections/initiatives/operations.tssrc/core/collections/initiatives/resolution.tssrc/core/collections/initiatives/schema.tssrc/core/collections/initiatives/templates.tssrc/core/collections/runtime.tssrc/core/completions/command-registry.tssrc/core/context-store/foundation.tssrc/core/context-store/index.tssrc/core/context-store/registry.tssrc/core/index.tssrc/core/planning-home.tssrc/core/workspace/foundation.tssrc/core/workspace/open-surface.tssrc/utils/change-utils.tstest/commands/artifact-workflow.test.tstest/commands/change-initiative-link.test.tstest/commands/context-store.test.tstest/commands/initiative.test.tstest/commands/workspace-initiative-open.test.tstest/commands/workspace.test.tstest/core/collections/initiatives/operations.test.tstest/core/collections/initiatives/schema.test.tstest/core/collections/initiatives/templates.test.tstest/core/collections/runtime.test.tstest/core/context-store/foundation.test.tstest/core/context-store/registry.test.tstest/core/workspace/foundation.test.tstest/utils/change-metadata.test.tsworkspace-root-drop-handler-Bom6Z7sW.js
💤 Files with no reviewable changes (5)
- openspec/changes/workspace-agent-guidance/specs/workspace-links/spec.md
- openspec/changes/workspace-agent-guidance/specs/cli-artifact-workflow/spec.md
- openspec/changes/workspace-agent-guidance/tasks.md
- openspec/changes/workspace-agent-guidance/specs/change-creation/spec.md
- openspec/changes/workspace-agent-guidance/design.md
|
Also addressed the non-threaded review-body path assertion items in |
There was a problem hiding this comment.
♻️ Duplicate comments (1)
test/core/context-store/registry.test.ts (1)
299-321:⚠️ Potential issue | 🟡 Minor | ⚡ Quick winCanonicalize
rootpath identity assertions in the binding-resolution testLine 302 and Line 318 compare raw existing paths. Use canonicalized identity assertions (like
expectSameExistingPath) for thoserootchecks as well.Proposed patch
expect(registered).toEqual( expect.objectContaining({ id: 'registered-context', - root: registeredRoot, + root: expect.any(String), source: 'registry', warnings: [], }) ); + expectSameExistingPath(registered.root, registeredRoot); const pathBound = await resolveContextStoreBinding( createPathContextStoreBinding({ id: 'path-context', path: pathRoot, @@ expect(pathBound).toEqual( expect.objectContaining({ id: 'path-context', - root: pathRoot, + root: expect.any(String), source: 'path', warnings: [], }) ); + expectSameExistingPath(pathBound.root, pathRoot);As per coding guidelines
test/**/*.test.{ts,js}: “When asserting existing filesystem paths as identities in tests, canonicalize both actual and expected paths usingfs.realpathSync.native().”🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@test/core/context-store/registry.test.ts` around lines 299 - 321, Replace the raw root equality checks in the binding-resolution test with canonicalized path identity assertions: instead of asserting registered.objectContaining({ root: registeredRoot }) call the test helper that compares canonicalized paths (e.g., expectSameExistingPath) on registered.root and registeredRoot; likewise replace the pathBound.objectContaining({ root: pathRoot }) check with expectSameExistingPath(pathBound.root, pathRoot). Keep the rest of the objectContaining assertions (id, source, warnings) unchanged and ensure the expectSameExistingPath helper uses fs.realpathSync.native() to canonicalize both sides before comparing.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Duplicate comments:
In `@test/core/context-store/registry.test.ts`:
- Around line 299-321: Replace the raw root equality checks in the
binding-resolution test with canonicalized path identity assertions: instead of
asserting registered.objectContaining({ root: registeredRoot }) call the test
helper that compares canonicalized paths (e.g., expectSameExistingPath) on
registered.root and registeredRoot; likewise replace the
pathBound.objectContaining({ root: pathRoot }) check with
expectSameExistingPath(pathBound.root, pathRoot). Keep the rest of the
objectContaining assertions (id, source, warnings) unchanged and ensure the
expectSameExistingPath helper uses fs.realpathSync.native() to canonicalize both
sides before comparing.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro
Run ID: b2631974-4c71-451a-a5a2-6d1a41731cff
📒 Files selected for processing (17)
docs/concepts.mdopenspec/initiatives/context-store-and-initiatives/decisions.mdopenspec/initiatives/context-store-and-initiatives/roadmap.mdopenspec/initiatives/context-store-and-initiatives/work-items/10-let-workspaces-open-initiatives/plan.mdsrc/commands/workspace.tssrc/commands/workspace/context-status.tssrc/commands/workspace/open-view.tssrc/commands/workspace/operations.tssrc/commands/workspace/types.tssrc/core/collections/initiatives/resolution.tssrc/core/context-store/binding.tssrc/core/context-store/index.tssrc/core/workspace/foundation.tssrc/core/workspace/open-surface.tstest/commands/workspace-initiative-open.test.tstest/core/context-store/registry.test.tstest/core/workspace/foundation.test.ts
✅ Files skipped from review due to trivial changes (3)
- openspec/initiatives/context-store-and-initiatives/roadmap.md
- openspec/initiatives/context-store-and-initiatives/decisions.md
- openspec/initiatives/context-store-and-initiatives/work-items/10-let-workspaces-open-initiatives/plan.md
alfred-openspec
left a comment
There was a problem hiding this comment.
Approved. CI is green, the branch is mergeable, and the prior review/security threads are resolved.
Summary
This PR pivots the workspace roadmap around context stores and initiatives, then implements the first usable pieces of that model:
new change --initiative, andset changeValidation
pnpm buildpnpm lintpnpm test(86 files, 1615 tests)Notes
The branch was rebased onto
origin/mainbefore pushing so the PR diff does not include the two upstream commits that localmainwas missing.Summary by CodeRabbit
New Features
Documentation