fix(templates): make a scaffolded project clean, and publishable as one artifact - #3594
Conversation
|
Warning Review limit reached
Next review available in: 16 minutes Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available. How can I continue?After more reviews become available, a review can be triggered using the To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews. How do review limits work?CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability. For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window. Please refer docs for additional details. Review details⚙️ Run configurationConfiguration used: Repository UI Review profile: CHILL Plan: Pro Plus Run ID: 📒 Files selected for processing (39)
📝 WalkthroughWalkthroughThe change centralizes scaffold generation, adds disk-free materialization and public manifest exports, updates starter templates, and expands parity, quality, export, smoke, API-reference, and documentation coverage. ChangesScaffold materialization
Estimated code review effort: 4 (Complex) | ~60 minutes Sequence Diagram(s)sequenceDiagram
participant Caller
participant materializeScaffold
participant ScaffoldAssembly
participant GeneratedFiles
Caller->>materializeScaffold: submit template and project options
materializeScaffold->>ScaffoldAssembly: resolve template and assemble files
ScaffoldAssembly->>GeneratedFiles: add source, metadata, environment, and .gitignore files
materializeScaffold-->>Caller: return sorted in-memory files
Possibly related PRs
Suggested reviewers: 🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✨ Finishing Touches 💡 1📝 Generate docstrings 💡
🧪 Generate unit tests (beta)
Comment |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: ae240152ee
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
There was a problem hiding this comment.
Actionable comments posted: 5
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
cli/templates/files/agentic-workflow/app/api/workflows/sample-runs.ts (1)
1-20: 🗄️ Data Integrity & Integration | 🟡 Minor | ⚡ Quick winAlign
DemoWorkflowRun.statuswithWorkflowStatus.
useWorkflow()exposesnodeStateswith the expectedNodeStatefields. However, the framework uses"waiting", not"waiting_for_approval". Replace that literal and add"cancelled"if this type represents production runs.🤖 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 `@cli/templates/files/agentic-workflow/app/api/workflows/sample-runs.ts` around lines 1 - 20, Update the DemoWorkflowRun.status union to match WorkflowStatus: replace "waiting_for_approval" with "waiting" and add "cancelled" so production run statuses are represented. Leave the DemoNodeStatus and DemoNodeState definitions unchanged.
🧹 Nitpick comments (1)
cli/templates/scaffold-parity.test.ts (1)
130-133: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winAssert the rejection reason for the unknown slug.
assertRejectswithout an error class or message passes for any rejection. A future unrelated failure insidematerializeScaffoldwould keep this test green. Assert theTEMPLATE_NOT_FOUNDerror, or at least match the message text.♻️ Proposed change
- await assertRejects(() => materializeScaffold({ template: "nope" })); + await assertRejects( + () => materializeScaffold({ template: "nope" }), + Error, + 'Unknown template "nope"', + );🤖 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 `@cli/templates/scaffold-parity.test.ts` around lines 130 - 133, Strengthen the unknown-slug test by updating the assertRejects call in “rejects an unknown slug instead of scaffolding something else” to verify the TEMPLATE_NOT_FOUND error or match its expected message, while preserving the existing resolveScaffoldTemplate assertion.
🤖 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 `@cli/commands/init/config-generator.ts`:
- Line 78: Validate request.projectName with validateProjectName() at the start
of materializeScaffold(), before assembling the scaffold or assigning the name
metadata, while preserving valid-name behavior. Add a focused test that verifies
materialization rejects an invalid project name before implementation.
In `@cli/shared/project-creation.ts`:
- Around line 656-682: The materializeScaffold flow can append duplicate
generated paths, while the parity test hides them by converting files to a Map.
In cli/shared/project-creation.ts:656-682, update materializeScaffold to remove
or merge existing entries for package.json, .gitignore, .env, and .env.example
before appending generated content, consistent with createPackageJson and
writeGitignore; in cli/templates/scaffold-parity.test.ts:69-85, assert that
materialized files have unique path values before constructing the Map.
In `@cli/templates/manifest.json`:
- Line 90: Update the generated orchestrator setup around getAgentsAsTools so
researcher and writer are registered before the orchestrator module creates its
tools. Preserve the existing delegation descriptions and orchestrator behavior,
while ensuring discovery order cannot leave the delegate-tools registry empty.
In `@docs/api-reference/veryfront/scaffold.md`:
- Around line 49-51: Document the exported types MaterializedScaffold,
MaterializeScaffoldRequest, and TemplateFile in the API reference table with
concise descriptions of their roles and usage, so callers can understand the
scaffold API without consulting implementation files.
- Line 3: Replace the scaffold description in the front matter of
docs/api-reference/veryfront/scaffold.md at lines 3-3 with the concise public
behavior: generate the same project files as veryfront init without writing to
disk. Update the corresponding API index description in
docs/api-reference/index.md at lines 41-41 to use the identical wording; remove
implementation paths and the internal issue reference from both locations.
---
Outside diff comments:
In `@cli/templates/files/agentic-workflow/app/api/workflows/sample-runs.ts`:
- Around line 1-20: Update the DemoWorkflowRun.status union to match
WorkflowStatus: replace "waiting_for_approval" with "waiting" and add
"cancelled" so production run statuses are represented. Leave the DemoNodeStatus
and DemoNodeState definitions unchanged.
---
Nitpick comments:
In `@cli/templates/scaffold-parity.test.ts`:
- Around line 130-133: Strengthen the unknown-slug test by updating the
assertRejects call in “rejects an unknown slug instead of scaffolding something
else” to verify the TEMPLATE_NOT_FOUND error or match its expected message,
while preserving the existing resolveScaffoldTemplate assertion.
🪄 Autofix
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: Repository UI
Review profile: CHILL
Plan: Pro Plus
Run ID: 3e9c22fb-c2e6-4059-af7f-9c15e2ecc252
📒 Files selected for processing (33)
cli/commands/init/config-generator.tscli/commands/init/deno-config-generator.tscli/shared/project-creation.tscli/templates/files/agentic-workflow/app/api/workflows/sample-runs.tscli/templates/files/agentic-workflow/app/page.tsxcli/templates/files/agentic-workflow/app/workflows/[id]/page.tsxcli/templates/files/agentic-workflow/tools/publish.tscli/templates/files/agentic-workflow/workflows/content-pipeline.tscli/templates/files/coding-agent/tools/list-files.tscli/templates/files/multi-agent-system/agents/orchestrator.tscli/templates/files/multi-agent-system/tools/web-search.tscli/templates/files/saas-starter/app/dashboard/page.tsxcli/templates/files/saas-starter/tools/search.tscli/templates/manifest.jsoncli/templates/scaffold-parity.test.tscli/templates/scaffold-quality.test.tscli/templates/scaffold.tsdeno.jsondocs/api-reference/index.mddocs/api-reference/veryfront/scaffold.mddocs/api-reference/veryfront/schedule.mddocs/api-reference/veryfront/schemas.mddocs/api-reference/veryfront/security.mddocs/api-reference/veryfront/server.mddocs/api-reference/veryfront/skill.mddocs/api-reference/veryfront/task.mddocs/api-reference/veryfront/testing.mddocs/api-reference/veryfront/tool.mddocs/api-reference/veryfront/trigger.mddocs/api-reference/veryfront/ui.mddocs/api-reference/veryfront/utils.mddocs/api-reference/veryfront/webhook.mddocs/api-reference/veryfront/workflow.md
There was a problem hiding this comment.
Actionable comments posted: 3
🤖 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 `@cli/templates/files/multi-agent-system/agents/orchestrator.ts`:
- Around line 11-13: Add a focused runtime test for the generated
multi-agent-system template in scaffold-quality.test.ts: scaffold and load the
generated agents, stub their execution, then invoke both agent_researcher and
agent_writer and verify delegation wiring works. Keep the existing type-check
and lint coverage unchanged.
In `@cli/templates/scaffold-quality.test.ts`:
- Line 94: Update the REPO_CONFIG initialization to convert the file URL with
fromFileUrl instead of using URL.pathname, then pass the resulting
platform-native path to runCommand.
In `@docs/rfcs/0001-ui-primitive-adapters.md`:
- Line 560: Update the example command in section 6.6 from the unsupported “add”
verb to the documented “generate adapter react-aria” command, while preserving
the existing adapter path and context.
🪄 Autofix
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: Repository UI
Review profile: CHILL
Plan: Pro Plus
Run ID: 9b71a18f-2857-4a23-a39a-15a291ae3bd9
📒 Files selected for processing (11)
cli/shared/project-creation.tscli/templates/files/multi-agent-system/agents/orchestrator.tscli/templates/manifest.jsoncli/templates/scaffold-parity.test.tscli/templates/scaffold-quality.test.tscli/templates/scaffold.tsdocs/api-reference/index.mddocs/api-reference/veryfront/scaffold.mddocs/guides/head-and-seo.mddocs/guides/index.mddocs/rfcs/0001-ui-primitive-adapters.md
🚧 Files skipped from review as they are similar to previous changes (5)
- docs/api-reference/veryfront/scaffold.md
- docs/api-reference/index.md
- cli/shared/project-creation.ts
- cli/templates/manifest.json
- cli/templates/scaffold.ts
There was a problem hiding this comment.
Actionable comments posted: 1
🤖 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 `@scripts/docs/generate-api-reference.test.ts`:
- Around line 373-380: Update the imports in the test containing the
cliReference assertions to use the required assertions from
`#veryfront/testing/assert.ts` instead of `#std/assert`, while preserving the
existing assertStringIncludes and assertEquals checks.
🪄 Autofix
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: Repository UI
Review profile: CHILL
Plan: Pro Plus
Run ID: ebc7bea1-8416-4379-91fe-3c29ce205654
📒 Files selected for processing (12)
cli/templates/files/multi-agent-system/README.mdcli/templates/loader.tscli/templates/manifest-export.test.tscli/templates/manifest.jsoncli/templates/public-manifest.tsdeno.jsondocs/api-reference/veryfront/cli.mddocs/guides/multi-agent.mdscripts/docs/generate-api-reference.test.tsscripts/docs/generate-api-reference.tsscripts/test/npm-install-smoke.shtsconfig.json
🚧 Files skipped from review as they are similar to previous changes (2)
- deno.json
- cli/templates/manifest.json
Added: the template manifest is now an exported subpathWhile wiring the API side to this PR's scaffold work, a second undeclared The starter templates ship as data at The undeclared part is what bites. If this repository changed its build The export
It is a thin re-export, so the manifest is still emitted once — the wrapper It cannot be named The enforcement, which is the actual point
Both were checked as real gates, not passing assertions. With the entry Proven end-to-end against a real Also in this push
Out of scope, worth its own issue
|
…ne artifact A new project is supposed to install, run and build with zero errors and zero lint errors (veryfront-issue-inbox #475). Three of the seven starters did not: agentic-workflow 6 tsc errors, 5 lint errors coding-agent 4 tsc errors multi-agent-system 1 tsc error, 1 lint error saas-starter 3 lint errors The worst was `agentic-workflow`. Its `publish` step passed an `execute` callback, which `StepOptions` does not accept: `tsc` rejected the object literal and `step()` throws "must specify either 'agent' or 'tool'" the moment the workflow runs, so the template's headline feature could never execute. That step now calls a real `tools/publish.ts`, and the run view renders `run.nodeStates` — the field `WorkflowRun` actually has — instead of a `steps` array that only the demo API invented. The rest were ordinary defects nobody could see: `readDir` streams entries but `list-files` filtered it like an array; `getAgentsAsTools` takes a description map, not a list of ids; four `async` callbacks never awaited anything; three `<button>`s had no `type`. None of this was caught because the templates are real files that the repo's own lint and typecheck never look at. `cli/templates/scaffold-quality.test.ts` closes that: it scaffolds every starter the way `veryfront init` does and runs the same `deno lint` that `veryfront lint` shells out to, expecting silence. It fails on the three templates above before this change. The second half of #475 is that a project created in Studio must be identical to one created by the CLI. It could not be: the hosted flow copies a stored project row, which has no repo, no lint gate and no link to the release train, so it froze at the pages-router era while these templates moved on. This adds the artifact that makes one source possible — `veryfront/scaffold` exports `materializeScaffold()`, which returns the complete contents of a new project without touching a disk, and maps Studio's `blank` slug onto the CLI's `minimal` starter. `createProject` now assembles through the same function it exposes, so the two cannot disagree, and `scaffold-parity.test.ts` proves it by diffing a really-scaffolded directory against the materializer's output for every template rather than against a snapshot a future template change would silently invalidate. Consuming it from veryfront-api, and retiring the DB 'blank' row, is the follow-up this unblocks.
The lint gate would not have caught the worst of what shipped: `step()` handed an `execute` callback `StepOptions` does not accept, `getAgentsAsTools` a list of ids where it takes a description map, and `readDir`'s async iterable filtered like an array. All three are type errors a user meets on their first `npm run typecheck`, and all three were invisible because `cli/templates/files/` is excluded from the workspace so the repo never type-checks it either. Scaffolding to a temp directory escapes that exclusion, so the gate now also `deno check`s each scaffold's agents, tools and workflows against the framework's own declarations. It fails for agentic-workflow, multi-agent-system and coding-agent before the template fixes.
…r its users Review follow-ups on the new `veryfront/scaffold` export. `createProject()` rejects an empty or path-bearing project name through `validateProjectName()`; `materializeScaffold()` passed the same value straight into `package.json#name`. Two creation paths that disagree about what a valid project is are exactly the drift this surface exists to prevent, so the materializer now runs the same validation. The published module description also read like an internal changelog - source-tree paths and an issue number - and its example called an undefined `store()`. Both now say what the module does for the person importing it, with an example that runs as written.
Review follow-ups. multi-agent-system's orchestrator built its delegate tools with a top-level `getAgentsAsTools()`. Discovery loads `agents/orchestrator.ts` before `researcher.ts` and `writer.ts`, so that call ran against an empty registry and the coordinator shipped with no one to coordinate - in the template whose whole subject is delegation. `delegates` is the API for this: each id becomes an `agent_<id>` tool resolved when the run happens, so load order cannot matter. `materializeScaffold()` also appended `package.json` and `.gitignore` without looking at what the template already had at those paths. No template ships either today, but one that did would have produced two entries for one path while the CLI merged them - and the parity test could not see it, because it collapsed the array into a Map first. The materializer now keys by path and merges exactly where the CLI merges, and the test rejects a repeated path instead of hiding it.
The generated reference listed `MaterializeScaffoldRequest` and `MaterializedScaffold` with empty descriptions, so a caller had to open the implementation to learn what either one is.
The multi-agent guide showed the same broken shape the template had: an `agents/orchestrator.ts` whose `tools` came from a top-level `getAgentsAsTools()`. Under discovery that call runs before the agents it is meant to wrap exist, so anyone following the guide built a coordinator with no delegates - and had no way to see it except an agent that never delegates. The example now names its delegates, and the paragraph after it says why, so the trap is documented rather than reproduced. `agentAsTool()` keeps its section, where the caller registers the agents and owns the order.
A `deno fmt docs/` reflowed three files this branch never touched. The repo's format gate covers src/, cli/ and react/, not docs/, so the churn was mine and not the gate's.
`URL.pathname` yields `/C:/repo/deno.json` on Windows, which `deno check` and `deno lint` cannot open, so the scaffold quality gate would fail there for a reason unrelated to the templates it grades. `fromFileUrl` gives the platform-native path.
The multi-agent template's headline defect was that its coordinator shipped with no one to coordinate, and nothing in the repo could see it: `deno check` and `deno lint` in scaffold-quality.test.ts grade syntax and types, and both were happy with a coordinator wired to nothing, while the delegation tests under src/agent use synthetic agents and never touch this template. This loads the template's own agent modules in the order discovery uses - orchestrator first, which is what broke it - and asserts the delegate tools exist, that each resolves to the specialist the template registers, and that a delegate run hands that agent to the executor. Execution is stubbed; the wiring is the subject. Checked against the pre-fix orchestrator: the first case fails with `[]` against `["agent_researcher", "agent_writer"]`, which is exactly the empty-registry bug.
AGENTS.md asks for assertions from `#veryfront/testing/assert.ts`; this file predated that and pulled them from `#std/assert`. `#veryfront/` resolves to `../src/` under scripts/test.deno.json, so the same three assertions come from the repo's own module with no other change.
…olds it Rebased onto the `cli/templates/` -> `templates/` move (#3596). `./scaffold` keeps its name - it names the capability, not the directory - and now points at `./templates/scaffold.ts`. The second export this branch declared, `./cli/templates/manifest`, is gone. The manifest is data; `materializeScaffold()` is the behaviour. A consumer reading the manifest has to reimplement package.json generation, AGENTS.md injection and .gitignore for itself - a second scaffolder fed from one data source, which is issue #475 one level down. veryfront-api will call `materializeScaffold()`, and nothing in this repository or its siblings reads the raw manifest, so the export had no consumer to keep. Nothing is published yet, so no name was burned. The enforcement stays, retargeted: - `templates/scaffold-export.test.ts` fails if `./scaffold` stops being declared, if it points at a file that no longer exists - the exact failure the directory move would have caused - or if the module stops exporting the behaviour a caller imports it for. - `npm-install-smoke.sh` step 6 imports the bare specifier from a clean-room install and materializes a project through it, so Node resolves it against the published `exports` map. The deep `node_modules/veryfront/esm/...` paths the other steps use bypass that map, so this is the only step that can catch the export going missing; without the entry it fails with ERR_PACKAGE_PATH_NOT_EXPORTED. `scaffold-quality.test.ts` reached the repo config through `../../deno.json`, which resolves above the repository now that the file sits one level higher; every template's type-check step failed on the missing config until it was repointed at `../deno.json`.
8ee0362 to
f1d5ba6
Compare
`exports` is indexed under `noUncheckedIndexedAccess`, so the subpath lookup is `string | undefined` and `deno check` rejected the `.replace()` on it. The assertion that follows already had to exist for the failure message to name the missing subpath rather than report a null dereference.
Closes the veryfront-code half of veryfront-issue-inbox #475.
What was actually broken
The issue asks that a new project install, run and build with zero errors, zero
lint errors and zero warnings. Four of the seven starters failed that on
main,reproducibly:
npx tsc --noEmitveryfront lintThe worst is
agentic-workflow. Itspublishstep passed anexecutecallback, which
StepOptionsdoes not accept:tscrejects the object literal, andstep()throwsStep "publish" must specify either 'agent' or 'tool'the moment the workflowruns — the template's headline feature could never execute. The same page also
mapped
run.steps, a fieldWorkflowRundoes not have (only the template's owndemo API invented it).
multi-agent-systemwas broken the same way, one level down. Its orchestratorbuilt delegate tools with a top-level
getAgentsAsTools(), butagent()registers on call and discovery loads
agents/orchestrator.tsbeforeresearcher.tsandwriter.ts- so the call ran against an empty registry andthe coordinator shipped with no one to coordinate, in the template whose entire
subject is delegation. It now uses
delegates: ["researcher", "writer"], whichthe runtime resolves when a run starts, so load order cannot matter. The
multi-agent guide taught the same broken shape and now teaches this one.
The rest were ordinary defects that nothing in this repo was looking for:
readDirstreams entries butlist-filesfiltered it like an array; fourasynccallbacks never awaited anything; three<button>s had notype.Why nothing caught them
The starter templates are real files under
templates/files/, but they areoutside the workspace lint and typecheck, so a template could ship anything.
templates/scaffold-quality.test.tscloses that hole. Scaffolding to a tempdirectory escapes the exclusion, so the gate can run both halves against a real
project: the same
deno lintthatveryfront lintshells out to, and adeno checkof the scaffold's agents, tools and workflows against theframework's own declarations. On the pre-fix templates it fails six ways -
lint for
agentic-workflow,multi-agent-system,saas-starter; types foragentic-workflow,multi-agent-system,coding-agent. After the fix allseven templates pass both. The whole gate runs in ~24s.
The parity half
The issue's other requirement — a project created in Studio must be identical to
one created by the CLI — could not hold, because the hosted flow copies a stored
project row: no repo, no PR, no lint gate, no link to the release train. It froze
at the pages-router era while these templates moved to the app router.
This adds the artifact that makes one source possible.
veryfront/scaffoldexports
materializeScaffold(), which returns the complete contents of a newproject (template files,
AGENTS.md,package.json,.env,.gitignore, anddeno.jsonon the Deno runtime) without touching a disk, and resolves Studio'sblankslug ontothe CLI's
minimalstarter.createProjectnow assembles through the samefunction it exposes, so the two paths cannot disagree.
templates/scaffold-parity.test.tsasserts the agreement by construction: itreally scaffolds each template to a temp directory, reads it back, and diffs it
against
materializeScaffold()for the same request — no snapshot for a futuretemplate change to invalidate silently.
One export, not two
An earlier revision of this branch also declared
./cli/templates/manifest, a wrapper publishingmanifest.jsonas data. It isgone.
The manifest is data;
materializeScaffold()is the behaviour. A consumer thatreads the manifest still has to reimplement package.json generation,
AGENTS.mdinjection and
.gitignorefor itself — a second scaffolder fed from one datasource, which is issue #475 one level down, in the PR whose subject is not
having two implementations. veryfront-api will call
materializeScaffold(), andno code in this repository or its siblings reads the raw manifest, so the export
had no consumer to keep. Nothing is published yet, so no name was burned; if a
real raw-manifest consumer turns up it can be declared then, under a name that
matches the current layout.
./scaffoldkeeps its name across thecli/templates/→templates/move(#3596). It names the capability, not the directory, so the move only repoints
its source.
How the export is held
A declared export with nothing asserting it is how the coupling breaks silently —
this branch proved that itself: the directory move would have dropped the entry
with every in-repo test still green, because they all import through relative
paths that moved with it.
templates/scaffold-export.test.tsfails if./scaffoldstops being declared,if it points at a file that no longer exists, or if the module stops exporting
the behaviour a caller imports it for.
npm-install-smoke.shstep 6 imports the bare specifier from a clean-roominstall and materializes a project through it, so Node resolves it against the
published
exportsmap. The deepnode_modules/veryfront/esm/...paths theother steps use bypass that map, so this is the only step that can catch the
export going missing; without the entry it fails with
ERR_PACKAGE_PATH_NOT_EXPORTED.Verification
deno linton a fresh scaffold: clean for all 7 templates (was 9 errors across 3).npm install && npx tsc --noEmiton a fresh scaffold: clean for all 7 (was 11 errors across 3).veryfront buildon the rewrittenagentic-workflowscaffold succeeds, and theworkflow module now loads and resolves its steps.
deno task build:npmemits"./scaffold": { "import": "./esm/templates/scaffold.js", "types": "./esm/templates/scaffold.d.ts" },the same shape as its siblings, and carries no manifest entry. Deleting that
entry and re-running the smoke step fails with
ERR_PACKAGE_PATH_NOT_EXPORTED,so the step is load-bearing.
deno task typecheck,deno task lint,deno task fmt:check,docs:api-reference:check, thetemplates/suite and the CLI unit suite all pass.Deliberately not done
The investigation suggested dropping the
@9.0.3suffix from the chat starters'react-markdown/remark-gfmimports on the grounds that "package.json alreadypins them, so the suffix buys nothing". Re-checking the pipeline says otherwise:
browser imports are resolved from the specifier, not from
package.json(
src/transforms/import-rewriter/strategies/bare-strategy.ts), and package.jsonpins only apply behind the dependency-pinning flag, which defaults to a 0%
rollout. Removing the suffix would send every scaffold back to an unversioned
esm.shURL and re-introduce the per-request "Unversioned import may causereproducibility issues" warning that #3438 fixed. I also could not reproduce the
reported
no-sloppy-importserror on that specifier with Deno 2.7.12 or theCI-pinned 2.7.7, in either runtime, before or after install. The scaffold lint
gate added here will now catch it in CI if a future Deno starts flagging it.
Follow-up, in veryfront-api: consume
veryfront/scaffoldfromcreate-project.tsand retire the DBblankrow as a scaffold source.