Dashboard › craft › Distillation
d7145922-a2d3-4912-b570-9b3dee29d496["f603bc75c3a5e6d8143673df28452974","9d5809dd44bfdfcaa903b24a6cad41ac","1d7f1dd178afc5978929180ac7e73b0d","fd5926a7b5df0997895fd62f54f9dedc","cefcd61e2a4eabc4acac7e1cdcfab692","81d20fd719fd057bf68524fb8dd25f3a","37ef9dfeaa5657b0c179c3579aa37870","5ec8853602dee4b3e966cf85f9fd87d4","564dce60f39cc0345b0358a37dde1c2c","5101dfa547d4eda2b43f9d8f07e7f029","91351a495e407b1f560834d9a6423e0a","dfd28a7e2fab7c550ef77a5cd374b19f"]
Date: July 21, 2026
craft targets scoping) beyond just the code selector, and proposed confirming the split with user before writing code.config.workspaces boolean on the npm target + expandWorkspaceTargets/NpmTarget.expand (same-version npm package expansion) vs. a new top-level workspaces: key for independently-versioned products — designed as one coherent "workspaces" concept with npm case as a sub-mode.isExpandableTarget() (checks for static expand method on target class) and expandWorkspaceTargets() (lines 577-599): takes TargetConfig[], lazy-imports getTargetByName from './targets' to avoid circular dependency, rootDir = getConfigFileDir()||process.cwd(), calls targetClass.expand(target, rootDir) per target if expandable (e.g. npm workspace expansion), else passes target through unchanged..opencode/plans/workspaces-redesign-design.md, chosen as version-controlled location per user's stated preference for durable artifacts.workspaces: (named, independently-versioned release units) from npm target's existing workspaces: true field (package discovery within a target) — no schema clash but docs must disambiguate; (2) real risk is action/publish-issue layer — publish-request pipeline disambiguates products only by version+subdirectory path, and single-file selector would collide on issue title (action.yml:241 format publish: <repo><subdir>@<version>), craft targets checklist, and publish-state key (publishState.ts:87) — matches reviewer's "publish repo" concern; (3) top-level CraftProjectConfigSchema is not .passthrough() so workspaces: must be added explicitly to schema, fully backward-compatible when absent.--workspace selector → prepare/publish threading → action-layer keying → docs; #844 parked (draft + pointer to design doc).publish: <repo> [<ws>] @<ver> vs <repo>#<ws>@<ver> vs reuse path/SUBDIRECTORY convention); 2. Config shape (shared top-level default target set + per-workspace overrides, vs all targets must live under a workspace once workspaces: present); 3. getsentry/publish accept-side (keep issue title parseable by appending workspace with no accept-side change, vs changing both sides); 4. Migration (support both single-file and per-.craft.yml models, or deprecate per-file one).[<ws>] to issue title (stays backward-parseable); allow shared base + per-workspace overrides; append-only approach so no accept-side change needed; support both single-file and per-file models with per-file soft-deprecated.