Remove wflpkg package manager before RC1 - #649
Conversation
Pins the post-removal contract before the code changes land, so the
removal has auditable Red->Green evidence (root testing.md ss3/ss6).
Red run against the current tree (6 failing for the intended reasons,
2 regression guards green):
package_protocol_no_longer_resolves ......... FAILED (import succeeds today)
package_import_failure_mentions_no_package_manager FAILED (no failure to inspect)
bare_package_prefix_is_not_special_cased .... FAILED ("requires a package name")
package_subcommands_are_removed ............. FAILED (wfl logout exits 0)
run_and_test_positional_aliases_are_removed . FAILED (wfl run main.wfl runs it)
help_has_no_package_management_section ...... FAILED (PACKAGE MANAGEMENT present)
relative_module_paths_still_work ............ ok
relative_load_module_still_works ............ ok
The package tests invoke the script by absolute path: the resolver's
find_project_root walked up from the source file's parent, so a bare
relative argument gave it an empty parent and it bailed out before ever
reaching packages/. The absolute path exercises the real resolve path.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011TH11eg1F6V8W4t1Nmo3xx
WFL is heading into its first RC, and the package manager is being
rethought from scratch. Package managers are the hardest part of a
project to revise after release -- manifest, lockfile and archive
formats, and above all the registry trust root, are things other people
build against as soon as they exist. Withdrawing it before the RC costs
nothing because nothing depends on it yet; shipping and then redesigning
would break every early package.
Removed:
* crates/wflpkg in full -- manifest/lockfile parsers, the resolver, the
.wflpkg archive format, the wflhash:v2: integrity transcript, the
download cache, the wflhub.org registry client and credential store,
and the standalone wflpkg binary. Drops five dependencies nothing
else used (rpassword, flate2, tar, ignore, unix libc) and reqwest's
multipart feature.
* the positional wfl subcommands (create/add/remove/update/build/run/
share/search/info/login/logout/check), DEFAULT_REGISTRY,
parse_create_project_args, and the PACKAGE MANAGEMENT help section.
* the package: import protocol in the interpreter, plus
resolve_package_path and find_project_root.
* the eight [Unreleased] Security CHANGELOG bullets covering package
publishing and registry credentials -- they describe code that will
never ship a release.
Kept: the file-based module system (load module from / include from /
export) is untouched and covered by two regression tests. The design
documents move to Docs/Archive/wflpkg/ with a README stating up front
that nothing in the folder describes shipping behavior.
BREAKING CHANGE: `wfl run <file>.wfl` and `wfl test <file>.wfl` were
handled inside the removed subcommand block and go with it. Use the
documented spellings `wfl <file.wfl>` and `wfl --test <file.wfl>`;
neither alias appeared in --help, CLAUDE.md, or Docs/. Confirmed with
the Maintainer before implementation.
Risk class R3 (backward compatibility). Red evidence in afe8c05, a
test-only ancestor of this commit: 6 of 8 tests in
tests/package_protocol_removed_test.rs failed there for the intended
reasons, 2 were green regression guards; all 8 are green here.
Verification: cargo fmt --check clean; clippy -D warnings clean;
cargo test --workspace 130 binaries / 0 failures; TestPrograms 110
passed / 0 failed / 24 skipped against the release binary;
validate_docs_examples.py 18/18. See the Dev diary entry for the
disk-allowance workaround used to fit the debug test build.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011TH11eg1F6V8W4t1Nmo3xx
📝 WalkthroughWalkthroughThe Changeswflpkg removal
Estimated code review effort: 4 (Complex) | ~45 minutes Sequence Diagram(s)sequenceDiagram
participant WflCLI
participant Interpreter
participant ModuleResolver
participant Tests
WflCLI->>Interpreter: execute source file
Interpreter->>ModuleResolver: resolve module path
ModuleResolver-->>Interpreter: relative module or unresolved package path
Interpreter-->>WflCLI: result and diagnostics
Tests->>WflCLI: assert package paths fail
Tests->>WflCLI: assert relative modules execute
Possibly related PRs
Suggested reviewers: 🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 2f1786dd4c
ℹ️ 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".
| let _profiler = dhat::Profiler::new_ad_hoc(); | ||
|
|
||
| let mut args: Vec<String> = env::args().collect(); | ||
| let args: Vec<String> = env::args().collect(); |
There was a problem hiding this comment.
Preserve the existing run/test aliases
When existing scripts invoke wfl run x.wfl or wfl test x.wfl, this removal now treats the alias as an input filename and fails instead of executing x.wfl; the new Dev Diary explicitly confirms this compatibility break. Removing package-management commands does not require removing these two aliases, so keep their argument rewrites until they have completed the documented deprecation path required by repository policy.
AGENTS.md reference: AGENTS.md:L194-L196
Useful? React with 👍 / 👎.
There was a problem hiding this comment.
Removing the wfl run <file>/wfl test <file> aliases is a deliberate, maintainer-approved break documented in the Dev Diary ("The one backward-compatibility break") and pinned by the intentional Red→Green test run_and_test_positional_aliases_are_removed. The aliases were never documented in --help, CLAUDE.md, or Docs/, and the documented wfl <file.wfl> / wfl --test <file.wfl> spellings still work; restoring them would revert the confirmed decision and break the existing test.
There was a problem hiding this comment.
Not restoring these — the cited policy doesn't reach this change, and the repo already settled the question.
Policy scope. Both AGENTS.md:194 and GOVERNANCE.md §3.1 scope the deprecation window to breaking existing WFL programs:
Never break existing WFL programs without a documented path.
wfl run x.wfl is a CLI invocation surface, not a WFL program. No WFL program is affected by this diff: all 110 TestPrograms/ pass against the release build (0 failed, 24 skipped per the runner's own skip list), and the language — load module from, include from, export — is untouched. package: was a runtime string prefix, opaque to the parser.
Precedent. The immediately preceding entry in the same [Unreleased] ### Removed section (the JavaScript transpiler sunset) made exactly this argument and it was accepted:
the ≥ 1-year deprecation window applies to breaking existing WFL programs, and no WFL program is affected […] What is withdrawn is a build-tooling surface (the
--transpileCLI mode) […] Per §2.2, breaking-change decisions rest with the Maintainer, who directed this sunset and accepted the immediate removal rather than a deferred one.
Same shape here, and §2.2 applies the same way — this removal was raised with the Maintainer before implementation, including the alias break specifically, and the immediate removal was confirmed.
Why the aliases went with the block. They weren't independent code. run and test were arms of the package-subcommand match in src/main.rs that mutated args in place (args.remove(1), args.insert(1, "--test")) before falling through. Keeping them means keeping the positional-dispatch block that this change exists to delete.
Discoverability. Neither alias appeared in print_help(), in CLAUDE.md/AGENTS.md's CLI list, or anywhere in Docs/. The documented spellings wfl <file.wfl> and wfl --test <file.wfl> are unchanged and verified working. wfl run x.wfl now exits 1 with a not-found error — loud, not silent.
The break is recorded in CHANGELOG.md under ### Removed, as a BREAKING CHANGE: trailer on 2f1786d, in the Dev Diary, and pinned by run_and_test_positional_aliases_are_removed. Restoring the aliases would revert the Maintainer's decision and fail that test.
Generated by Claude Code
There was a problem hiding this comment.
Pull request overview
Removes the in-tree wflpkg package-manager system ahead of RC1, including its CLI surface area and the interpreter’s package: import behavior, while preserving the existing file-based module system and archiving the prior design docs for reference.
Changes:
- Removed
wflpkgworkspace member/dependency, thewflpositional package subcommands, and the interpreterpackage:protocol handling. - Archived
wflpkgdesign documents underDocs/Archive/wflpkg/and updated user-facing docs/governance/changelog accordingly. - Added integration “contract” tests to lock in the post-removal CLI/runtime behavior and updated doc-audit categorization to reflect the new error surface.
Reviewed changes
Copilot reviewed 54 out of 63 changed files in this pull request and generated no comments.
Show a summary per file
| File | Description |
|---|---|
| tests/package_protocol_removed_test.rs | Adds contract tests asserting package: no longer resolves and package-related positional subcommands/help text are gone, while relative module loading still works. |
| src/main.rs | Removes package-manager subcommand dispatch and related help text/constants; CLI now only supports documented flags and file execution. |
| src/interpreter/mod.rs | Deletes package: protocol special-casing and associated package-resolution helpers, leaving standard relative-path module resolution. |
| scripts/test_docs_code_blocks.py | Updates doc-block failure categorization to match the post-removal module-resolution error strings. |
| GOVERNANCE.md | Removes governance references to in-tree package-design ADRs and records that WFL currently has no package manager (docs archived). |
| fuzz/Cargo.lock | Regenerates fuzz workspace lockfile to drop wflpkg-related dependencies. |
| Docs/Archive/wflpkg/README.md | Adds an explicit “archived prior art only” README for the removed package manager docs. |
| Docs/Archive/wflpkg/wflpkg-open-decisions-resolved.md | Archives prior wflpkg decision record (historical reference only). |
| Docs/Archive/wflpkg/wflpkg-adr-001-binary-and-crate-structure.md | Archives prior ADR for wflpkg binary/library topology (historical reference only). |
| Docs/Archive/wflpkg/wflpkg_prd.md | Archives prior WFLHub PRD tied to the removed package-manager system. |
| Docs/04-advanced-features/modules.md | Removes the documented “Package System (V4)” section that referenced package: imports. |
| Dev diary/2026-07-26-remove-wflpkg-system.md | Adds a dev diary entry documenting rationale, compatibility impact, and testing notes for the removal. |
| Cargo.toml | Removes crates/wflpkg from workspace members and drops the wflpkg dependency from the root crate. |
| Cargo.lock | Updates lockfile to remove wflpkg and its transitive dependencies. |
| CHANGELOG.md | Drops unreleased security entries that described non-shipping wflpkg behavior and adds a “Removed” entry documenting the package-manager removal and CLI impact. |
| CLAUDE.md | Updates project-structure documentation to remove the (now-deleted) wflpkg/ design-docs location. |
| AGENTS.md | Updates project-structure documentation to remove the (now-deleted) wflpkg/ design-docs location. |
| .github/workflows/ci.yml | Adjusts CI commentary to reflect the updated workspace composition after removing wflpkg. |
| crates/wflpkg/Cargo.toml | Deletes the wflpkg crate manifest as part of removing the crate. |
| crates/wflpkg/src/lib.rs | Deletes the wflpkg library root/module exports as part of removing the crate. |
| crates/wflpkg/src/main.rs | Deletes the standalone wflpkg binary entrypoint as part of removing the crate. |
| crates/wflpkg/src/error.rs | Deletes package-manager error types/messages as part of removing the crate. |
| crates/wflpkg/src/permissions.rs | Deletes package permission prompting/types as part of removing the crate. |
| crates/wflpkg/src/package_files.rs | Deletes packaging file-selection/ignore-stack logic as part of removing the crate. |
| crates/wflpkg/src/cache/mod.rs | Deletes global package-cache implementation as part of removing the crate. |
| crates/wflpkg/src/commands/mod.rs | Deletes package-manager CLI command module wiring as part of removing the crate. |
| crates/wflpkg/src/commands/create.rs | Deletes wfl create project implementation as part of removing the crate. |
| crates/wflpkg/src/commands/add.rs | Deletes wfl add implementation as part of removing the crate. |
| crates/wflpkg/src/commands/remove.rs | Deletes wfl remove implementation as part of removing the crate. |
| crates/wflpkg/src/commands/update.rs | Deletes wfl update implementation as part of removing the crate. |
| crates/wflpkg/src/commands/build.rs | Deletes wfl build implementation as part of removing the crate. |
| crates/wflpkg/src/commands/run.rs | Deletes package-manager wfl run project-entry behavior as part of removing the crate. |
| crates/wflpkg/src/commands/share.rs | Deletes wfl share publishing implementation as part of removing the crate. |
| crates/wflpkg/src/commands/search.rs | Deletes wfl search implementation as part of removing the crate. |
| crates/wflpkg/src/commands/info.rs | Deletes wfl info implementation as part of removing the crate. |
| crates/wflpkg/src/commands/login.rs | Deletes registry login/logout implementation as part of removing the crate. |
| crates/wflpkg/src/commands/check.rs | Deletes wfl check implementations as part of removing the crate. |
| crates/wflpkg/src/manifest/mod.rs | Deletes manifest data model as part of removing the crate. |
| crates/wflpkg/src/manifest/parser.rs | Deletes manifest parser as part of removing the crate. |
| crates/wflpkg/src/manifest/writer.rs | Deletes manifest writer as part of removing the crate. |
| crates/wflpkg/src/manifest/version.rs | Deletes manifest version/constraint types as part of removing the crate. |
| crates/wflpkg/src/lockfile/mod.rs | Deletes lockfile data model as part of removing the crate. |
| crates/wflpkg/src/lockfile/parser.rs | Deletes lockfile parser as part of removing the crate. |
| crates/wflpkg/src/lockfile/writer.rs | Deletes lockfile writer as part of removing the crate. |
| crates/wflpkg/src/registry/mod.rs | Deletes registry module wiring as part of removing the crate. |
| crates/wflpkg/src/registry/advisory.rs | Deletes advisory lookup client logic as part of removing the crate. |
| crates/wflpkg/src/resolver/mod.rs | Deletes resolver module wiring as part of removing the crate. |
| crates/wflpkg/src/resolver/algorithm.rs | Deletes dependency-resolution algorithm as part of removing the crate. |
| crates/wflpkg/src/resolver/package_path.rs | Deletes package-path resolution logic as part of removing the crate. |
| crates/wflpkg/src/workspace/mod.rs | Deletes workspace module as part of removing the crate. |
| crates/wflpkg/src/workspace/parser.rs | Deletes workspace parser as part of removing the crate. |
| crates/wflpkg/tests/workflow_integration.rs | Deletes package workflow integration tests as part of removing the crate. |
| crates/wflpkg/tests/error_handling.rs | Deletes package error-handling tests as part of removing the crate. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
There was a problem hiding this comment.
Actionable comments posted: 10
🤖 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 `@CHANGELOG.md`:
- Around line 89-102: The immediate removal of the package: protocol breaks the
required compatibility path. In CHANGELOG.md lines 89-102, document the
deprecation and migration plan instead of declaring immediate withdrawal; in Dev
diary/2026-07-26-remove-wflpkg-system.md lines 75-90, record the transition
decision and deprecation period; in tests/package_protocol_removed_test.rs lines
76-162, replace removal assertions with tests for supported compatibility
behavior during that transition, preserving removal coverage for the eventual
deprecation-removal release.
In `@Docs/Archive/wflpkg/wflhub_language_gaps_prd.md`:
- Around line 1-11: Mark all seven archived WFL package documents as historical
and superseded: Docs/Archive/wflpkg/wflhub_language_gaps_prd.md (lines 1-11)
should identify WFLHub requirements as historical;
Docs/Archive/wflpkg/wflpkg-adr-001-binary-and-crate-structure.md (lines 1-9)
should state that the ADR is superseded;
Docs/Archive/wflpkg/wflpkg-brainstorm-results.md (lines 1-9) should mark
existing-wflpkg claims historical;
Docs/Archive/wflpkg/wflpkg-manifest-grammar-1.0.md (lines 1-8) should remove or
qualify its active launch-gate status;
Docs/Archive/wflpkg/wflpkg-open-decisions-resolved.md (lines 1-14) should label
the decisions historical; Docs/Archive/wflpkg/wflpkg_prd.md (lines 1-5) should
label registry/API requirements retired; and Docs/Archive/wflpkg/wflpkgdesign.md
(lines 1-9) should mark the package-manager design superseded. Add a consistent
banner to each document with the removal date and a link to the removal diary or
archive README.
- Around line 576-593: Update the proposed Value::RateLimiter representation and
RateLimiterState ownership to use an Arc with an appropriate concurrency-safe
guard, or explicitly document and enforce a single-threaded runtime constraint.
Ensure the chosen design satisfies the “safe for concurrent use” acceptance
criterion while preserving shared limiter state across handlers.
In `@Docs/Archive/wflpkg/wflpkg_prd.md`:
- Around line 36-52: In Docs/Archive/wflpkg/wflpkg_prd.md (lines 36-52) and
Docs/Archive/wflpkg/wflpkgdesign.md (lines 36-52), update every fenced code
block to include an appropriate language identifier such as wfl, json, or text,
ensuring all Markdown fences satisfy MD040.
In `@Docs/Archive/wflpkg/wflpkg-manifest-grammar-1.0.md`:
- Around line 356-360: Update the executable ABNF for string/unescaped in the
manifest grammar to exclude DEL, C1 controls, BOM, bidi controls, and zero-width
characters required by Gate L rejection rules. Ensure the grammar itself matches
the documented MG-L03/MG-L05/MG-L06 behavior rather than relying only on an
implicit post-lexical check.
- Around line 133-143: Resolve the key-character contract in the N3 Key and
N4-String documentation: either restrict quoted keys to ASCII explicitly, or
update the JSON projection and JCS ordering rules to define non-ASCII key
behavior and add corresponding tests. Apply the same clarification to the
related JSON-projection section so the grammar and projection remain consistent.
- Around line 226-230: The “Canonical on-disk form” section conflates parser
acceptance with writer output. Revise the grammar documentation to define
accepted input separately from the canonical output emitted by `wfl fmt`,
explicitly documenting whether whitespace and blank-line variants are accepted
and how `fmt` normalizes them; update the injectivity, rejection, and round-trip
claims to match that distinction.
- Around line 82-125: Update every illustrative manifest and lockfile example,
including the inline example near the referenced grammar section, to begin with
the required wflpkg grammar-version record. Use the exact multiline syntax
defined by the ABNF production and ensure each example’s envelope is consistent
with the required version format.
In `@Docs/Archive/wflpkg/wflpkg-open-decisions-resolved.md`:
- Around line 50-53: Update the resolved syntax description near “The right
answer” to remove null from the permitted literal types, matching the frozen
grammar’s rejection of nothing, missing, and undefined. Keep the remaining
string, number, boolean, list, and record literal description unchanged.
In `@tests/package_protocol_removed_test.rs`:
- Around line 219-240: Extend run_and_test_positional_aliases_are_removed with a
positive compatibility check for wfl --test main.wfl: invoke run_in with the
--test flag, assert a successful exit, and verify the program output is
produced. Keep the existing assertions for the removed run and test positional
aliases unchanged.
🪄 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: defaults
Review profile: CHILL
Plan: Pro Plus
Run ID: 47d7a80e-a5bf-41f4-b316-dc09837cce38
⛔ Files ignored due to path filters (2)
Cargo.lockis excluded by!**/*.lockfuzz/Cargo.lockis excluded by!**/*.lock
📒 Files selected for processing (61)
.github/workflows/ci.ymlAGENTS.mdCHANGELOG.mdCLAUDE.mdCargo.tomlDev diary/2026-07-26-remove-wflpkg-system.mdDocs/04-advanced-features/modules.mdDocs/Archive/wflpkg/README.mdDocs/Archive/wflpkg/wflhub_language_gaps_prd.mdDocs/Archive/wflpkg/wflpkg-adr-001-binary-and-crate-structure.mdDocs/Archive/wflpkg/wflpkg-brainstorm-results.mdDocs/Archive/wflpkg/wflpkg-manifest-grammar-1.0.mdDocs/Archive/wflpkg/wflpkg-open-decisions-resolved.mdDocs/Archive/wflpkg/wflpkg_prd.mdDocs/Archive/wflpkg/wflpkgdesign.mdGOVERNANCE.mdcrates/wflpkg/Cargo.tomlcrates/wflpkg/src/archive.rscrates/wflpkg/src/cache/mod.rscrates/wflpkg/src/checksum.rscrates/wflpkg/src/commands/add.rscrates/wflpkg/src/commands/build.rscrates/wflpkg/src/commands/check.rscrates/wflpkg/src/commands/create.rscrates/wflpkg/src/commands/info.rscrates/wflpkg/src/commands/login.rscrates/wflpkg/src/commands/mod.rscrates/wflpkg/src/commands/remove.rscrates/wflpkg/src/commands/run.rscrates/wflpkg/src/commands/search.rscrates/wflpkg/src/commands/share.rscrates/wflpkg/src/commands/update.rscrates/wflpkg/src/error.rscrates/wflpkg/src/lib.rscrates/wflpkg/src/lockfile/mod.rscrates/wflpkg/src/lockfile/parser.rscrates/wflpkg/src/lockfile/writer.rscrates/wflpkg/src/main.rscrates/wflpkg/src/manifest/mod.rscrates/wflpkg/src/manifest/parser.rscrates/wflpkg/src/manifest/version.rscrates/wflpkg/src/manifest/writer.rscrates/wflpkg/src/package_files.rscrates/wflpkg/src/permissions.rscrates/wflpkg/src/registry/advisory.rscrates/wflpkg/src/registry/api.rscrates/wflpkg/src/registry/auth.rscrates/wflpkg/src/registry/mod.rscrates/wflpkg/src/resolver/algorithm.rscrates/wflpkg/src/resolver/mod.rscrates/wflpkg/src/resolver/package_path.rscrates/wflpkg/src/workspace/mod.rscrates/wflpkg/src/workspace/parser.rscrates/wflpkg/tests/error_handling.rscrates/wflpkg/tests/security_tests.rscrates/wflpkg/tests/version_and_lockfile_tests.rscrates/wflpkg/tests/workflow_integration.rsscripts/test_docs_code_blocks.pysrc/interpreter/mod.rssrc/main.rstests/package_protocol_removed_test.rs
💤 Files with no reviewable changes (45)
- crates/wflpkg/src/archive.rs
- crates/wflpkg/src/manifest/writer.rs
- crates/wflpkg/src/commands/run.rs
- crates/wflpkg/tests/error_handling.rs
- crates/wflpkg/src/commands/info.rs
- crates/wflpkg/src/commands/search.rs
- crates/wflpkg/src/lockfile/writer.rs
- crates/wflpkg/src/permissions.rs
- crates/wflpkg/src/registry/mod.rs
- crates/wflpkg/src/main.rs
- crates/wflpkg/src/manifest/mod.rs
- crates/wflpkg/tests/workflow_integration.rs
- crates/wflpkg/src/workspace/mod.rs
- crates/wflpkg/Cargo.toml
- crates/wflpkg/src/lib.rs
- crates/wflpkg/src/commands/share.rs
- crates/wflpkg/src/commands/check.rs
- crates/wflpkg/src/commands/create.rs
- crates/wflpkg/src/registry/advisory.rs
- crates/wflpkg/src/commands/update.rs
- crates/wflpkg/src/resolver/package_path.rs
- crates/wflpkg/src/resolver/algorithm.rs
- crates/wflpkg/src/workspace/parser.rs
- crates/wflpkg/src/commands/add.rs
- crates/wflpkg/src/manifest/parser.rs
- crates/wflpkg/src/lockfile/parser.rs
- crates/wflpkg/src/commands/login.rs
- crates/wflpkg/src/registry/api.rs
- crates/wflpkg/src/checksum.rs
- crates/wflpkg/src/manifest/version.rs
- AGENTS.md
- crates/wflpkg/tests/security_tests.rs
- crates/wflpkg/src/commands/build.rs
- crates/wflpkg/src/lockfile/mod.rs
- crates/wflpkg/src/package_files.rs
- crates/wflpkg/src/registry/auth.rs
- crates/wflpkg/tests/version_and_lockfile_tests.rs
- crates/wflpkg/src/commands/remove.rs
- Docs/04-advanced-features/modules.md
- crates/wflpkg/src/error.rs
- crates/wflpkg/src/commands/mod.rs
- CLAUDE.md
- crates/wflpkg/src/cache/mod.rs
- crates/wflpkg/src/resolver/mod.rs
- src/interpreter/mod.rs
There was a problem hiding this comment.
Caution
Inline review comments failed to post. This is likely due to GitHub's internal server error or limits when posting large numbers of comments. If you are seeing this consistently it is likely a permissions issue. Please check "Moderation" -> "Code review limits" under your organization settings.
Actionable comments posted: 10
🤖 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 `@CHANGELOG.md`:
- Around line 89-102: The immediate removal of the package: protocol breaks the
required compatibility path. In CHANGELOG.md lines 89-102, document the
deprecation and migration plan instead of declaring immediate withdrawal; in Dev
diary/2026-07-26-remove-wflpkg-system.md lines 75-90, record the transition
decision and deprecation period; in tests/package_protocol_removed_test.rs lines
76-162, replace removal assertions with tests for supported compatibility
behavior during that transition, preserving removal coverage for the eventual
deprecation-removal release.
In `@Docs/Archive/wflpkg/wflhub_language_gaps_prd.md`:
- Around line 1-11: Mark all seven archived WFL package documents as historical
and superseded: Docs/Archive/wflpkg/wflhub_language_gaps_prd.md (lines 1-11)
should identify WFLHub requirements as historical;
Docs/Archive/wflpkg/wflpkg-adr-001-binary-and-crate-structure.md (lines 1-9)
should state that the ADR is superseded;
Docs/Archive/wflpkg/wflpkg-brainstorm-results.md (lines 1-9) should mark
existing-wflpkg claims historical;
Docs/Archive/wflpkg/wflpkg-manifest-grammar-1.0.md (lines 1-8) should remove or
qualify its active launch-gate status;
Docs/Archive/wflpkg/wflpkg-open-decisions-resolved.md (lines 1-14) should label
the decisions historical; Docs/Archive/wflpkg/wflpkg_prd.md (lines 1-5) should
label registry/API requirements retired; and Docs/Archive/wflpkg/wflpkgdesign.md
(lines 1-9) should mark the package-manager design superseded. Add a consistent
banner to each document with the removal date and a link to the removal diary or
archive README.
- Around line 576-593: Update the proposed Value::RateLimiter representation and
RateLimiterState ownership to use an Arc with an appropriate concurrency-safe
guard, or explicitly document and enforce a single-threaded runtime constraint.
Ensure the chosen design satisfies the “safe for concurrent use” acceptance
criterion while preserving shared limiter state across handlers.
In `@Docs/Archive/wflpkg/wflpkg_prd.md`:
- Around line 36-52: In Docs/Archive/wflpkg/wflpkg_prd.md (lines 36-52) and
Docs/Archive/wflpkg/wflpkgdesign.md (lines 36-52), update every fenced code
block to include an appropriate language identifier such as wfl, json, or text,
ensuring all Markdown fences satisfy MD040.
In `@Docs/Archive/wflpkg/wflpkg-manifest-grammar-1.0.md`:
- Around line 356-360: Update the executable ABNF for string/unescaped in the
manifest grammar to exclude DEL, C1 controls, BOM, bidi controls, and zero-width
characters required by Gate L rejection rules. Ensure the grammar itself matches
the documented MG-L03/MG-L05/MG-L06 behavior rather than relying only on an
implicit post-lexical check.
- Around line 133-143: Resolve the key-character contract in the N3 Key and
N4-String documentation: either restrict quoted keys to ASCII explicitly, or
update the JSON projection and JCS ordering rules to define non-ASCII key
behavior and add corresponding tests. Apply the same clarification to the
related JSON-projection section so the grammar and projection remain consistent.
- Around line 226-230: The “Canonical on-disk form” section conflates parser
acceptance with writer output. Revise the grammar documentation to define
accepted input separately from the canonical output emitted by `wfl fmt`,
explicitly documenting whether whitespace and blank-line variants are accepted
and how `fmt` normalizes them; update the injectivity, rejection, and round-trip
claims to match that distinction.
- Around line 82-125: Update every illustrative manifest and lockfile example,
including the inline example near the referenced grammar section, to begin with
the required wflpkg grammar-version record. Use the exact multiline syntax
defined by the ABNF production and ensure each example’s envelope is consistent
with the required version format.
In `@Docs/Archive/wflpkg/wflpkg-open-decisions-resolved.md`:
- Around line 50-53: Update the resolved syntax description near “The right
answer” to remove null from the permitted literal types, matching the frozen
grammar’s rejection of nothing, missing, and undefined. Keep the remaining
string, number, boolean, list, and record literal description unchanged.
In `@tests/package_protocol_removed_test.rs`:
- Around line 219-240: Extend run_and_test_positional_aliases_are_removed with a
positive compatibility check for wfl --test main.wfl: invoke run_in with the
--test flag, assert a successful exit, and verify the program output is
produced. Keep the existing assertions for the removed run and test positional
aliases unchanged.
🪄 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: defaults
Review profile: CHILL
Plan: Pro Plus
Run ID: 47d7a80e-a5bf-41f4-b316-dc09837cce38
⛔ Files ignored due to path filters (2)
Cargo.lockis excluded by!**/*.lockfuzz/Cargo.lockis excluded by!**/*.lock
📒 Files selected for processing (61)
.github/workflows/ci.ymlAGENTS.mdCHANGELOG.mdCLAUDE.mdCargo.tomlDev diary/2026-07-26-remove-wflpkg-system.mdDocs/04-advanced-features/modules.mdDocs/Archive/wflpkg/README.mdDocs/Archive/wflpkg/wflhub_language_gaps_prd.mdDocs/Archive/wflpkg/wflpkg-adr-001-binary-and-crate-structure.mdDocs/Archive/wflpkg/wflpkg-brainstorm-results.mdDocs/Archive/wflpkg/wflpkg-manifest-grammar-1.0.mdDocs/Archive/wflpkg/wflpkg-open-decisions-resolved.mdDocs/Archive/wflpkg/wflpkg_prd.mdDocs/Archive/wflpkg/wflpkgdesign.mdGOVERNANCE.mdcrates/wflpkg/Cargo.tomlcrates/wflpkg/src/archive.rscrates/wflpkg/src/cache/mod.rscrates/wflpkg/src/checksum.rscrates/wflpkg/src/commands/add.rscrates/wflpkg/src/commands/build.rscrates/wflpkg/src/commands/check.rscrates/wflpkg/src/commands/create.rscrates/wflpkg/src/commands/info.rscrates/wflpkg/src/commands/login.rscrates/wflpkg/src/commands/mod.rscrates/wflpkg/src/commands/remove.rscrates/wflpkg/src/commands/run.rscrates/wflpkg/src/commands/search.rscrates/wflpkg/src/commands/share.rscrates/wflpkg/src/commands/update.rscrates/wflpkg/src/error.rscrates/wflpkg/src/lib.rscrates/wflpkg/src/lockfile/mod.rscrates/wflpkg/src/lockfile/parser.rscrates/wflpkg/src/lockfile/writer.rscrates/wflpkg/src/main.rscrates/wflpkg/src/manifest/mod.rscrates/wflpkg/src/manifest/parser.rscrates/wflpkg/src/manifest/version.rscrates/wflpkg/src/manifest/writer.rscrates/wflpkg/src/package_files.rscrates/wflpkg/src/permissions.rscrates/wflpkg/src/registry/advisory.rscrates/wflpkg/src/registry/api.rscrates/wflpkg/src/registry/auth.rscrates/wflpkg/src/registry/mod.rscrates/wflpkg/src/resolver/algorithm.rscrates/wflpkg/src/resolver/mod.rscrates/wflpkg/src/resolver/package_path.rscrates/wflpkg/src/workspace/mod.rscrates/wflpkg/src/workspace/parser.rscrates/wflpkg/tests/error_handling.rscrates/wflpkg/tests/security_tests.rscrates/wflpkg/tests/version_and_lockfile_tests.rscrates/wflpkg/tests/workflow_integration.rsscripts/test_docs_code_blocks.pysrc/interpreter/mod.rssrc/main.rstests/package_protocol_removed_test.rs
💤 Files with no reviewable changes (45)
- crates/wflpkg/src/archive.rs
- crates/wflpkg/src/manifest/writer.rs
- crates/wflpkg/src/commands/run.rs
- crates/wflpkg/tests/error_handling.rs
- crates/wflpkg/src/commands/info.rs
- crates/wflpkg/src/commands/search.rs
- crates/wflpkg/src/lockfile/writer.rs
- crates/wflpkg/src/permissions.rs
- crates/wflpkg/src/registry/mod.rs
- crates/wflpkg/src/main.rs
- crates/wflpkg/src/manifest/mod.rs
- crates/wflpkg/tests/workflow_integration.rs
- crates/wflpkg/src/workspace/mod.rs
- crates/wflpkg/Cargo.toml
- crates/wflpkg/src/lib.rs
- crates/wflpkg/src/commands/share.rs
- crates/wflpkg/src/commands/check.rs
- crates/wflpkg/src/commands/create.rs
- crates/wflpkg/src/registry/advisory.rs
- crates/wflpkg/src/commands/update.rs
- crates/wflpkg/src/resolver/package_path.rs
- crates/wflpkg/src/resolver/algorithm.rs
- crates/wflpkg/src/workspace/parser.rs
- crates/wflpkg/src/commands/add.rs
- crates/wflpkg/src/manifest/parser.rs
- crates/wflpkg/src/lockfile/parser.rs
- crates/wflpkg/src/commands/login.rs
- crates/wflpkg/src/registry/api.rs
- crates/wflpkg/src/checksum.rs
- crates/wflpkg/src/manifest/version.rs
- AGENTS.md
- crates/wflpkg/tests/security_tests.rs
- crates/wflpkg/src/commands/build.rs
- crates/wflpkg/src/lockfile/mod.rs
- crates/wflpkg/src/package_files.rs
- crates/wflpkg/src/registry/auth.rs
- crates/wflpkg/tests/version_and_lockfile_tests.rs
- crates/wflpkg/src/commands/remove.rs
- Docs/04-advanced-features/modules.md
- crates/wflpkg/src/error.rs
- crates/wflpkg/src/commands/mod.rs
- CLAUDE.md
- crates/wflpkg/src/cache/mod.rs
- crates/wflpkg/src/resolver/mod.rs
- src/interpreter/mod.rs
🛑 Comments failed to post (10)
CHANGELOG.md (1)
89-102: 🎯 Functional Correctness | 🟠 Major | 🏗️ Heavy lift
Preserve
package:through the documented deprecation path.
package:is a WFL program construct. Declaring that no released program could practically use it does not satisfy the repository’s compatibility invariant; restore a supported transition path before enforcing this removal.
CHANGELOG.md#L89-L102: replace the immediate language-protocol withdrawal with the documented deprecation and migration plan.Dev diary/2026-07-26-remove-wflpkg-system.md#L75-L90: record the transition/deprecation decision rather than an immediate compatibility exception.tests/package_protocol_removed_test.rs#L76-L162: test the supported compatibility behavior during the transition, then move these removal assertions to the deprecation-removal release.As per coding guidelines, “Never break existing WFL programs without the documented deprecation path; preserve backward compatibility as a project invariant.”
📍 Affects 3 files
CHANGELOG.md#L89-L102(this comment)Dev diary/2026-07-26-remove-wflpkg-system.md#L75-L90tests/package_protocol_removed_test.rs#L76-L162🤖 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 `@CHANGELOG.md` around lines 89 - 102, The immediate removal of the package: protocol breaks the required compatibility path. In CHANGELOG.md lines 89-102, document the deprecation and migration plan instead of declaring immediate withdrawal; in Dev diary/2026-07-26-remove-wflpkg-system.md lines 75-90, record the transition decision and deprecation period; in tests/package_protocol_removed_test.rs lines 76-162, replace removal assertions with tests for supported compatibility behavior during that transition, preserving removal coverage for the eventual deprecation-removal release.Source: Coding guidelines
Docs/Archive/wflpkg/wflhub_language_gaps_prd.md (2)
1-11: 📐 Maintainability & Code Quality | 🟠 Major | ⚡ Quick win
Mark every archived document as historical and superseded.
These headers still present wflpkg,
package:imports, active CLI commands, and WFLHub contracts as current, while this PR removes them. Add a consistent banner with the removal date and a link to the removal diary/archive README; change statuses such asAcceptedorlaunch-gatewhere necessary.
Docs/Archive/wflpkg/wflhub_language_gaps_prd.md#L1-L11: identify the WFLHub requirements as historical.Docs/Archive/wflpkg/wflpkg-adr-001-binary-and-crate-structure.md#L1-L9: mark the ADR superseded by package-manager removal.Docs/Archive/wflpkg/wflpkg-brainstorm-results.md#L1-L9: mark the existing-wflpkg claims historical.Docs/Archive/wflpkg/wflpkg-manifest-grammar-1.0.md#L1-L8: remove or qualify the active launch-gate status.Docs/Archive/wflpkg/wflpkg-open-decisions-resolved.md#L1-L14: label the decisions as historical.Docs/Archive/wflpkg/wflpkg_prd.md#L1-L5: label the registry/API requirements as retired.Docs/Archive/wflpkg/wflpkgdesign.md#L1-L9: label the package-manager design as superseded.📍 Affects 7 files
Docs/Archive/wflpkg/wflhub_language_gaps_prd.md#L1-L11(this comment)Docs/Archive/wflpkg/wflpkg-adr-001-binary-and-crate-structure.md#L1-L9Docs/Archive/wflpkg/wflpkg-brainstorm-results.md#L1-L9Docs/Archive/wflpkg/wflpkg-manifest-grammar-1.0.md#L1-L8Docs/Archive/wflpkg/wflpkg-open-decisions-resolved.md#L1-L14Docs/Archive/wflpkg/wflpkg_prd.md#L1-L5Docs/Archive/wflpkg/wflpkgdesign.md#L1-L9🤖 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 `@Docs/Archive/wflpkg/wflhub_language_gaps_prd.md` around lines 1 - 11, Mark all seven archived WFL package documents as historical and superseded: Docs/Archive/wflpkg/wflhub_language_gaps_prd.md (lines 1-11) should identify WFLHub requirements as historical; Docs/Archive/wflpkg/wflpkg-adr-001-binary-and-crate-structure.md (lines 1-9) should state that the ADR is superseded; Docs/Archive/wflpkg/wflpkg-brainstorm-results.md (lines 1-9) should mark existing-wflpkg claims historical; Docs/Archive/wflpkg/wflpkg-manifest-grammar-1.0.md (lines 1-8) should remove or qualify its active launch-gate status; Docs/Archive/wflpkg/wflpkg-open-decisions-resolved.md (lines 1-14) should label the decisions historical; Docs/Archive/wflpkg/wflpkg_prd.md (lines 1-5) should label registry/API requirements retired; and Docs/Archive/wflpkg/wflpkgdesign.md (lines 1-9) should mark the package-manager design superseded. Add a consistent banner to each document with the removal date and a link to the removal diary or archive README.
576-593: 🩺 Stability & Availability | 🟠 Major | ⚡ Quick win
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash set -euo pipefail echo "## Candidate doc excerpt" sed -n '550,610p' Docs/Archive/wflpkg/wflhub_language_gaps_prd.md 2>/dev/null || true echo echo "## Search for Rust runtime/concurrency hints and Rc/RefCell in relevant docs/candidates" rg -n "rate limiter|RateLimiter|Rc<RefCell|Arc<(Mutex|RwLock)|async runtime|concurrent|single-threaded|multi-threaded" -S . \ -g '!target/**' -g '!Cargo.lock' | head -n 200Repository: WebFirstLanguage/wfl
Length of output: 27667
Use a concurrent-safe owned state for rate limiters.
Rc<RefCell<RateLimiterState>>can be cloned across concurrent handlers, but neither type isSend, so the acceptance criterion “safe for concurrent use” cannot be satisfied with this design. Document an intentional single-threaded constraint, or switch to anArc<_>-guarded limiter state.🤖 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 `@Docs/Archive/wflpkg/wflhub_language_gaps_prd.md` around lines 576 - 593, Update the proposed Value::RateLimiter representation and RateLimiterState ownership to use an Arc with an appropriate concurrency-safe guard, or explicitly document and enforce a single-threaded runtime constraint. Ensure the chosen design satisfies the “safe for concurrent use” acceptance criterion while preserving shared limiter state across handlers.Docs/Archive/wflpkg/wflpkg_prd.md (1)
36-52: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win
Add language identifiers to all fenced code blocks.
Markdownlint reports MD040 for these files. Label each fence as
wfl,json,text, or another appropriate language so documentation validation passes.📍 Affects 2 files
Docs/Archive/wflpkg/wflpkg_prd.md#L36-L52(this comment)Docs/Archive/wflpkg/wflpkgdesign.md#L36-L52🤖 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 `@Docs/Archive/wflpkg/wflpkg_prd.md` around lines 36 - 52, In Docs/Archive/wflpkg/wflpkg_prd.md (lines 36-52) and Docs/Archive/wflpkg/wflpkgdesign.md (lines 36-52), update every fenced code block to include an appropriate language identifier such as wfl, json, or text, ensuring all Markdown fences satisfy MD040.Source: Linters/SAST tools
Docs/Archive/wflpkg/wflpkg-manifest-grammar-1.0.md (4)
82-125: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win
Make the required version envelope consistent with the examples.
The specification requires every file to begin with a
wflpkggrammar-version record, but both illustrative files omit it. The inline form at Line 284 also does not match the multiline ABNF production. Add the envelope to every example and show it using the exact grammar accepted by the spec.Also applies to: 274-285
🤖 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 `@Docs/Archive/wflpkg/wflpkg-manifest-grammar-1.0.md` around lines 82 - 125, Update every illustrative manifest and lockfile example, including the inline example near the referenced grammar section, to begin with the required wflpkg grammar-version record. Use the exact multiline syntax defined by the ABNF production and ensure each example’s envelope is consistent with the required version format.
133-143: 🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win
Resolve the quoted-key versus ASCII-key contradiction.
Quoted keys are defined as strings, and strings permit non-ASCII NFC text; however, the JSON-projection section assumes that all keys are ASCII. Either restrict quoted keys to ASCII explicitly or define and test the non-ASCII JCS ordering behavior.
Also applies to: 232-234
🤖 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 `@Docs/Archive/wflpkg/wflpkg-manifest-grammar-1.0.md` around lines 133 - 143, Resolve the key-character contract in the N3 Key and N4-String documentation: either restrict quoted keys to ASCII explicitly, or update the JSON projection and JCS ordering rules to define non-ASCII key behavior and add corresponding tests. Apply the same clarification to the related JSON-projection section so the grammar and projection remain consistent.
226-230: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win
Separate accepted input from canonical output.
Line 230 says every non-canonical form is rejected, then says the pre-
fmtparser accepts extra whitespace and blank lines. Define the accepted grammar separately from the canonical writer; otherwise implementations will disagree about whether formatting variants are valid.🧰 Tools
🪛 markdownlint-cli2 (0.23.0)
[warning] 230-230: Spaces inside code span elements
(MD038, no-space-in-code)
🤖 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 `@Docs/Archive/wflpkg/wflpkg-manifest-grammar-1.0.md` around lines 226 - 230, The “Canonical on-disk form” section conflates parser acceptance with writer output. Revise the grammar documentation to define accepted input separately from the canonical output emitted by `wfl fmt`, explicitly documenting whether whitespace and blank-line variants are accepted and how `fmt` normalizes them; update the injectivity, rejection, and round-trip claims to match that distinction.
356-360: 🔒 Security & Privacy | 🟠 Major | 🏗️ Heavy lift
Align the executable ABNF with the rejection rules.
The
unescapedrange admits DEL, C1 controls, bidi controls, and zero-width characters that Gate L says must be rejected. Because Appendix A is declared executable, encode those exclusions in the grammar or make the post-lexical rejection pass explicitly part of the oracle.🤖 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 `@Docs/Archive/wflpkg/wflpkg-manifest-grammar-1.0.md` around lines 356 - 360, Update the executable ABNF for string/unescaped in the manifest grammar to exclude DEL, C1 controls, BOM, bidi controls, and zero-width characters required by Gate L rejection rules. Ensure the grammar itself matches the documented MG-L03/MG-L05/MG-L06 behavior rather than relying only on an implicit post-lexical check.Docs/Archive/wflpkg/wflpkg-open-decisions-resolved.md (1)
50-53: 🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win
Remove
nullfrom the resolved syntax description.This document says the subset admits string/number/boolean/null/list/record literals, while the frozen grammar explicitly rejects
nothing,missing, andundefined. Update the resolution text to match the grammar, or clearly identify this sentence as superseded design.🤖 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 `@Docs/Archive/wflpkg/wflpkg-open-decisions-resolved.md` around lines 50 - 53, Update the resolved syntax description near “The right answer” to remove null from the permitted literal types, matching the frozen grammar’s rejection of nothing, missing, and undefined. Keep the remaining string, number, boolean, list, and record literal description unchanged.tests/package_protocol_removed_test.rs (1)
219-240: 📐 Maintainability & Code Quality | 🟠 Major | ⚡ Quick win
Add a positive
--testcompatibility assertion.The test states that
wfl --test <file>remains supported, but only checks removed aliases. Executewfl --test main.wfland assert successful execution so deleting shared dispatch cannot silently break the retained flag.Proposed test addition
for alias in ["run", "test"] { // existing negative assertions } + + let (stdout, stderr, code) = run_in(dir.path(), &["--test", "main.wfl"]); + let combined = format!("{stdout}{stderr}"); + assert_eq!(code, Some(0), "`wfl --test main.wfl` should remain supported; got:\n{combined}"); + assert!(stdout.contains("hello from wfl"), "supported test mode must execute the file; got:\n{combined}"); }As per coding guidelines, R3 compatibility work requires risk-triggered tests for retained and failure-path behavior.
📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements./// The `wfl run <file>` and `wfl test <file>` positional aliases lived inside /// the package-subcommand dispatch block and went with it. Only `wfl <file>` /// and `wfl --test <file>` remain. #[test] fn run_and_test_positional_aliases_are_removed() { let dir = TempDir::new().expect("tempdir"); fs::write(dir.path().join("main.wfl"), "display \"hello from wfl\"\n").expect("write main.wfl"); for alias in ["run", "test"] { let (stdout, stderr, code) = run_in(dir.path(), &[alias, "main.wfl"]); let combined = format!("{stdout}{stderr}"); assert_ne!( code, Some(0), "`wfl {alias} main.wfl` should no longer be accepted; got:\n{combined}" ); assert!( !stdout.contains("hello from wfl"), "`wfl {alias} main.wfl` must not execute the program; got:\n{combined}" ); } let (stdout, stderr, code) = run_in(dir.path(), &["--test", "main.wfl"]); let combined = format!("{stdout}{stderr}"); assert_eq!( code, Some(0), "`wfl --test main.wfl` should remain supported; got:\n{combined}" ); assert!( stdout.contains("hello from wfl"), "supported test mode must execute the file; got:\n{combined}" ); }🤖 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 `@tests/package_protocol_removed_test.rs` around lines 219 - 240, Extend run_and_test_positional_aliases_are_removed with a positive compatibility check for wfl --test main.wfl: invoke run_in with the --test flag, assert a successful exit, and verify the program output is produced. Keep the existing assertions for the removed run and test positional aliases unchanged.Source: Coding guidelines
Summary
Remove the
wflpkgpackage manager system entirely before the first release candidate. The package manager — a ~7,700-line crate with twelvewflsubcommands, apackage:import protocol, and extensive design documentation — is being redesigned from scratch and should not ship in RC1.Breaking Changes
wfl run <file>.wflandwfl test <file>.wflno longer work.These two aliases were not package-management commands, but they lived inside the same positional-subcommand
matchinsrc/main.rsand were implemented by mutatingargsin place (args.remove(1),args.insert(1, "--test")) before falling through to normal file handling. Keeping them would mean keeping the dispatch block this PR exists to delete.wfl run program.wflwfl program.wflwfl test program.wflwfl --test program.wflThe replacements are the documented spellings and are unchanged. After this PR,
wfl run program.wflexits 1 with a not-found error for the literal pathrun— it fails loudly rather than silently doing something else.Neither alias ever appeared in
print_help(), in the CLI lists inCLAUDE.md/AGENTS.md, or anywhere inDocs/, so the discoverable surface is unaffected.package:imports no longer resolve.load module from "package:my-lib"is now an ordinary relative path and fails as one. This is nominal rather than practical: resolving it required an installedpackages/tree that only the removedwfl addcould produce.No WFL program is affected. The file-based module system —
load module from "path.wfl",include from "path.wfl", andexport— is untouched;package:was a runtime string prefix, opaque to the parser. All 110TestPrograms/pass against the release build.Governance.
GOVERNANCE.md§3.1 andAGENTS.mdscope the ≥ 1-year deprecation window to breaking existing WFL programs; what is withdrawn here is a CLI invocation surface. This mirrors the JavaScript transpiler sunset in the same[Unreleased] ### Removedsection, where the same reasoning was accepted. Per §2.2, the break was raised with the Maintainer before implementation and the immediate removal was confirmed. It is recorded inCHANGELOG.md, as aBREAKING CHANGE:trailer on2f1786d, in the Dev Diary, and pinned by therun_and_test_positional_aliases_are_removedtest.Key Changes
Removed
crates/wflpkg/crate entirely: All package manager code, including:archive.rs,checksum.rs)registry/api.rs,registry/auth.rs)manifest/,lockfile/)resolver/)commands/create.rs,add.rs,share.rs,login.rs, etc.)security_tests.rs,version_and_lockfile_tests.rs,workflow_integration.rs,error_handling.rs)Removed
package:import protocol from interpreter (src/interpreter/mod.rs):package:prefix in module resolutionpackage:is now treated as an ordinary (unresolvable) relative pathRemoved CLI subcommands from
src/main.rs:create,add,remove,update,build,run,test,share,login,search,info,checksubcommandsDEFAULT_REGISTRYconstantUpdated workspace configuration:
crates/wflpkgfromCargo.tomlworkspace memberswflpkgcrate dependency from root packageArchived design documentation:
wflpkg/design documents toDocs/Archive/wflpkg/for historical referenceDocs/Archive/wflpkg/README.mdexplaining the archiveDev diary/2026-07-26-remove-wflpkg-system.md) documenting the decisionUpdated governance and CI:
GOVERNANCE.mdto remove references to package design ADRs.github/workflows/ci.ymlto remove wflpkg from workspace test runsAGENTS.mdandCLAUDE.mdto remove wflpkg from project structureAdded post-removal contract tests (
tests/package_protocol_removed_test.rs):package:protocol is no longer recognizedRationale
Package managers are irreversible commitments: manifest formats, lockfile formats, archive formats, and registry trust roots cannot be redesigned after early adoption. Shipping a half-formed system and redesigning it later would either break every early package or require carrying a design nobody wanted. Removing it before RC1 preserves the option to ship a well-designed system in a future release.
The file-based module system (
load module from) remains fully functional and unaffected.[View with code smith](https://app.blacksmith.sh/WebFirstLanguage/codesmith/wfl/pr/649)
Need help on this PR? Tag
@codesmith-botwith what you need. Autofix is enabled.