-
Notifications
You must be signed in to change notification settings - Fork 1
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
refactor: rewrite in rust (host) #107
Conversation
Important Review skippedAuto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the You can disable this status message by setting the WalkthroughThis pull request introduces significant architectural and structural changes to the Changes
Sequence DiagramsequenceDiagram
participant User
participant CLI
participant Config
participant Systems
participant Worker
participant Runtime
User->>CLI: Execute Command
CLI->>Config: Source Configuration
Config-->>CLI: Return Configuration
CLI->>Systems: Load Systems
Systems->>Worker: Prepare Module
Worker->>Runtime: Initialize Deno Context
Runtime-->>Worker: Return Worker Handle
Worker-->>Systems: Return System Instances
Systems-->>CLI: Return Available Commands
CLI->>User: Display/Execute Commands
Possibly related PRs
Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media? 🪧 TipsChatThere are 3 ways to chat with CodeRabbit:
Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments. CodeRabbit Commands (Invoked using PR comments)
Other keywords and placeholders
CodeRabbit Configuration File (
|
@coderabbitai review |
✅ Actions performedReview triggered.
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 7
🔭 Outside diff range comments (1)
modules/ports/mod.ts (1)
Line range hint
113-180
: Check for concurrency issues in the “resolve” or “updateInstall” flows.
Multiple “resolve” operations might be triggered in parallel from different commands. Without synchronization, concurrently modifyingpcx.config.sets
or the same environment might cause data race conditions.
🧹 Nitpick comments (65)
modules/mod.ts (2)
11-15
: Consider unifying the return type ofloadConfig
Returning both
Promise<void>
andvoid
in the same signature can cause confusion for consumers of the API. It’s usually clearer to consistently return a promise-based type, even if some implementations are synchronous internally.
20-21
: Maintain consistent async return typesSimilar to
loadConfig
, merging both sync and async return types (Promise<Json> | Json
) can introduce complexity. You might find it more straightforward to consistently return a promise forgenLockEntry
.src/ghjk/host/deno.rs (4)
14-15
: Add helpful metadata to the tracing instrumentationYou’ve annotated the function with
#[tracing::instrument(skip(hcx))]
. Consider adding relevant fields (like the path being operated on) to help with debugging.
25-40
: Possible improvement: Validate blackboard contentThe current block sets up
ext_conf.blackboard
. If invalid data is passed in, the code will fail further downstream. You may want to validate or sanitize these values before usage.
46-55
: Restrict read permissions further if feasibleCurrently,
allow_read: Some(vec![])
can be misread as “allow reading everything.” If the rest of your code does not strictly require universal read access, it’s safer to highlight the specific files or directories that are permissible.
61-64
: Surface additional debug info when the Deno module exits with a non-zero statusConsider logging the exit code or additional diagnostic context from the worker to help with debugging why it failed.
src/ghjk/log.rs (1)
37-53
: Potentially exit on unhandled panicsThe comment states the desire to exit the process on unhandled panics, but it's commented out. If you truly need this behavior, consider gating it behind a feature flag or environment variable.
src/ghjk/ext.rs (4)
54-63
: Docs field forextension!
is helpfulProviding documentation for the extension helps others know how to use these ops. Consider linking to relevant references or usage examples for new team members.
77-79
: Encapsulatecallbacks::worker(ctx.clone())
logicSince
callbacks::worker()
is invoked once the context is established, consider a safer initialization pattern to avoid partially constructed states if an exception arises mid-flow.
81-88
: Check for missing keys in the blackboard
op_blackboard_get
returnsOption<serde_json::Value>
. If your environment depends on these keys being present, consider adding logging or error handling if they are absent.
109-125
: Robust error messages forop_hostcall
When no hostcall is found, you bail with a generic message. Consider enumerating available hostcalls in the error’s message to aid debugging.
src/deno_systems/bindings.ts (4)
1-2
: Consider removing the commented-out import or clarifying its intended use.
Leaving commented code in the repo may cause confusion. If it’s needed for debugging or reference, add a comment explaining why.
9-16
: Review optional/required fields in Zod schema.
Consider ifghjkfile_path
or other fields should have default values, or be required, depending on usage. This can improve type safety and reduce runtime checks.
55-66
: Check collision risk for cryptographic random UUID usage.
Although collisions are very unlikely, consider logging or versioning in the callback keys if deterministic keys are ever needed for reference or caching.
116-124
: Re-evaluate the indefinite interval approach.
UsingsetInterval
indefinitely keeps the event loop alive, which can block graceful shutdown. Consider an event-driven approach or a mechanism to clear the interval once no longer needed.ghjk.ts (3)
4-5
: Consider consolidating environment setup.
Multiple environment/config imports can lead to confusion about the source of each variable. Consolidating them or clearly separating their responsibilities may enhance maintainability.
21-31
: Check version constraints for dependencies (Rust, protoc, cmake).
Pinned versions ensure reproducible builds but risk falling out of date quickly. Periodic review or automation of version updates may be beneficial.
42-48
: Evaluate dynamic mold installation approach.
This logic conditionally installs mold if NO_MOLD is unset. That might be appropriate, but watch out for cases where a developer might need mold forcibly absent. Consider a more explicit config pattern.src/ghjk/host/hashfile.rs (2)
5-17
: Clarify version handling inHashObj
.
A plain string “version” might need a semantic version or incremental approach if expanded usage is planned.
69-81
: Review hashing logic for environment variables.
Hashing string values is straightforward, but be mindful that some environment variables might change frequently. A more flexible approach or explicit allowlists might help.src/ghjk/utils.rs (4)
6-8
: Rename or document the genericdefault()
function.
A free function nameddefault
might obscure the standard notion ofDefault::default()
. Consider clarifying its usage or directly callingT::default()
.
23-27
: Assess potential memory overhead inCHeapStr
.
Storing both the string and a hash is efficient for comparisons, but watch out for frequent allocations if strings are often short-lived.
69-81
: DocumentCHeapStr::new
usage.
If future expansions might require custom hashing or partial string references, consider clarifying any constraints in docstrings.
204-223
:find_entry_recursive
might be expensive in large directory trees.
Repeatedly climbing up file paths can lead to performance bottlenecks. Consider a caching mechanism or a bounded search approach if the directory structure is deep.src/ghjk/systems/deno.rs (3)
19-30
: Enhance the termination process.
Callingterminate()
sets a boolean but relies on an external join handle. A more robust approach (e.g., channel shutdown signals with timeouts) could improve resilience.
34-41
: Consider making the path tobindings.ts
configurable.
Hardcoding the main module path tosrc/deno_systems/bindings.ts
can restrict usage if the layout changes. A parameter or config might improve maintainability.
161-165
: Name consistency forManifestDesc
.
The struct naming might benefit from a closer alignment with other domain concepts, for maintainability. E.g.,DenoManifestRegistration
.src/ghjk/ext/callbacks.rs (4)
14-24
: Use more granular error variants or contextual data if possible.
TheCallbackError
enum sufficiently categorizes errors, but you may consider adding more contextual fields (e.g., original cause or additional metadata) for debugging complex callback issues.
46-57
: Consider clarifying the error reporting whenwas_set
is false.
Thewarn!("callback line was not set");
log might be confusing to maintainers. It might help to expand the message with more guidance on remediation steps (e.g., "Callbacks were not properly initialized...").
195-220
: Ensure promise resolution handles large or complex data gracefully.
The callback flow for resolving or rejecting the V8 promise looks correct, but consider adding guards or checks if large JSON responses or multiple concurrent promises occur. Potential out-of-memory or performance bottlenecks may arise if many large promises are processed in parallel.
272-293
: Provide a parallel mechanism to remove callbacks.
op_callbacks_set
inserts callbacks, but there's no clear public method for removing them if no longer needed. Or if re-registration occurs, old callbacks might remain stale. Consider exposing a deregister function.modules/envs/mod.ts (2)
58-58
: Avoid potential collision in array updates.
When appending[name]
toecx.keyToName[key]
, confirm there's no conflict if multiple environment names share the same key. If it’s intentional, consider clarifying in code comments.
Line range hint
215-225
: Check version mismatch early by throwing a clearer error message.
If thelockEntry.version
isn’t"0"
, the code throws a generic error. Provide the user with a more context-specific message (e.g., “Unsupported lock file version: expected 0 but received X.”). This can help diagnose environment lock issues faster.src/ghjk/host.rs (3)
66-74
: Re-evaluate early exit strategy for missing lockfiles or hashfiles.
Whenlocked
istrue
and one of the files is missing, you bail out. Ensure you’re not discarding partial progress or possible fallback solutions. Possibly let the user choose an action or see a more descriptive prompt.
201-267
: Consider partial lock generation if some systems fail.
write_lockfile
discards changes if a single system’s lock entry generation fails. For large projects, partial updates could be beneficial, or at least a fallback approach might help. Evaluate whether an all-or-nothing approach is truly desired.
316-335
: Handle read-file or parse-file errors more gracefully.
Thefrom_file
method bails on read or parse failures. If you anticipate partially corrupted lock.json, you might consider a more robust fallback or repair strategy.modules/ports/mod.ts (2)
Line range hint
52-77
: Consider lazy loading or incremental updates.
loadConfig
eagerly reifies references and sets environment reducers for the install sets. If some sets are rarely used, lazy loading might enhance performance and reduce memory usage.
Line range hint
270-280
: Improve clarity for partial lock entry usage inloadLockEntry
.
The code merges configResolutions from the lock entry in memory. If some ports are missing resolutions, either skip them or mark them as unresolved. Provide clearer logging or error messages to ease debugging.src/denort/lib.rs (2)
60-96
: Separate worker creation from message processing logic.
worker
spawns a thread, then processes messages. If you scale or add more message types, consider using a dedicated dispatcher or single responsibility for message handling, improving maintainability.
495-557
: Differentiate partial runs from full runs.
Methods likerun
orexecute
can cause confusion for devs about event-loop differences. Consider clarifying docstrings or naming to highlight the difference (e.g. “executeAndReturnImmediately” vs. “runUntilComplete”).src/ghjk/build.rs (1)
1-3
: Consider adding build script documentation and error context
The build script appears straightforward—callingshadow_rs::new()
and returning itsSdResult<()>
. It might be beneficial to add a short doc comment explaining the intentions behind this build script and possibly enrich error handling or context in caseshadow_rs::new()
fails.src/deno_systems/mod.ts (1)
4-10
: Check for missing constructor or invalid system definitions
The spread of entries[id, (gcx) => new sys.ctor(gcx)]
relies on eachsys
having a validctor
. Consider gracefully handling unexpected or invalidsys
objects by adding runtime checks or warnings to ensure stability.src/ghjk/js/mock.sfx.ts (2)
7-10
: Ensure callback handling meets actual usage needs
callbacks.set()
currently just returns the passedkey
without storing anything. If this mock is intended to simulate real callback registration, consider retaining the callback function to replicate production behavior more accurately.
11-11
: Consider mocking return data
hostcall()
resolves to an empty object. This might be sufficient for some tests, but if your code checks for specific properties, you might want to allow for parameterized or richer mock responses.src/ghjk/js/runtime.d.ts (1)
6-15
: Expand doc comments for each method
Theblackboard
,callbacks.set()
, andhostcall()
methods are fundamental to theGhjk
API. It may help future maintainers to add doc comments clarifying usage scenarios, expected parameters, and common return patterns.src/ghjk/js/00_runtime.js (3)
1-5
: Consider evaluatingensureFastOps()
UsingensureFastOps()
can offer performance benefits. If you decide to revisit it, ensure proper handling of any potential issues that might arise from using a lower-level API.
29-41
: Modular design suggestion for theGhjk
object
Exposing blackboard, callbacks, and hostcall as a single global object is functional. However, consider grouping these functionalities by feature or placing them in separate modules for easier reusability and testing in larger codebases.
43-43
: Global attachment caution
AssigningGhjk
toglobalThis
can be convenient but introduces a global dependency. For maintainability, consider an alternative export pattern for shared usage without polluting the global namespace.files/deno/bindings.ts (1)
18-31
: Consider adding error handling for dynamic imports and config retrieval.
While the call toawait import(args.uri)
andmod.sophon.getConfig
is valid, you may want to handle potential runtime errors (e.g., invalid URI or thrown errors fromgetConfig
). Logging or throwing a more informative exception could help pinpoint issues during debugging.async function serialize(args: zod.infer<typeof serializeArgs>) { try { const shimHandle = shimDenoNamespace(Deno.env.toObject()); const { setup: setupLogger } = await import("../../utils/logger.ts"); setupLogger(); const mod = await import(args.uri); const rawConfig = await mod.sophon.getConfig(args.uri, mod.secureConfig); const config = JSON.parse(JSON.stringify(rawConfig)); return { config, accessedEnvKeys: shimHandle.getAccessedEnvKeys(), readFilePaths: shimHandle.getReadFiles(), listedFilePaths: shimHandle.getListedFiles(), }; } catch (ex) { // Provide additional context for the error throw new Error(`Failed to serialize config: ${ex.message}`, { cause: ex }); } }scripts/dev.ts (2)
54-54
: Provide a clearer fallback for additional arguments.Right now, the code handles the case where exactly one argument is passed to "bash". If you need to handle multiple arguments, consider updating your condition or providing a fallback message for unexpected extra arguments.
56-60
: Consider standardizing shell handling logic.The logic for "fish" is slightly different from "bash". If you want unified behavior, refactor these condition blocks to share common logic or to handle initialization in a more uniform way.
modules/tasks/mod.ts (3)
42-42
: Check ifgcx
is sufficient or consider passingconfig
togetTasksCtx
.While your approach here is perfectly valid, you might consider a pattern that consistently passes configuration details to each context to improve testability and modularity.
Also applies to: 44-46
49-52
: Method chaining is clear, but consider documenting usage.The
commands()
method’s approach to building and chaining commands is good. A short docstring explaining expected usage or typical argument patterns can help maintainers quickly understand the logic.
96-96
: Version checks may become a maintenance burden.The string literal check for
"0"
is fine for now, but if versions increment over time, consider a more flexible approach or store version definitions in a single location for easy updates.utils/unarchive.ts (1)
95-95
: Consider buffering large extractions.Copying data directly with
std_io.copy(entry, file)
works well in most cases. However, for very large files, ensure that the underlying file system and resource constraints are handled properly. If needed, implement streaming or chunk-based copying to reduce memory usage and better manage large extractions.src/ghjk/main.rs (4)
1-30
: Module re-exports enhance readability.Aggregating frequently used items in
mod interlude
helps keep other modules concise. Ensure you only export items needed externally to maintain minimal exposure and reduce potential coupling issues.
40-57
: Main function setup is clear.The signal handling for
SIGPIPE
and logging initialization are straightforward. Consider explaining the rationale behind choosing thenew_current_thread()
runtime builder if concurrency grows more complex in the future.
64-108
: Configuration logic is flexible.Locating the
.ghjk
directory orghjk.ts
leads to a user-friendly approach. However, consider offering more explicit error messages or prompts if no configuration is found to guide the user toward resolution.
140-184
: System setup appears logical.Creating
GhjkCtx
and using it withinHostCtx
is clear. Although this pattern is easy to follow, adding additional inline comments might help future maintainers understand howsystems_from_ghjkfile
interacts with the rest of the workflow.utils/mod.ts (1)
547-573
:switchMap
function logic
This is a neat, type-safe emulation of a Rust-likematch
statement in TypeScript.
- Verify that unhandled cases are acceptable, as the function can return
undefined
ifval
is not inbranches
.- Consider adding a default branch for improved clarity and to prevent silent fallbacks.
src/ghjk/Cargo.toml (2)
49-49
: Consider reducing tokio featuresUsing
full
feature flag for tokio includes all features, which may increase binary size. Consider explicitly listing only the required features.-tokio = { workspace = true, features = ["full", "parking_lot"] } +tokio = { workspace = true, features = [ + "rt-multi-thread", + "parking_lot", + "io-util", + "fs", + "process", + "macros" +] }
52-52
: Consider DashMap alternativesDashMap is used for concurrent maps, but consider if a simpler solution like
Arc<RwLock<HashMap>>
orparking_lot::RwLock<HashMap>
would suffice, especially sinceparking_lot
is already a dependency..github/workflows/nightly.yml (1)
66-68
: Consider using environment fileInstead of inline environment variables, consider using a reusable environment file for consistency across different workflow steps.
🧰 Tools
🪛 actionlint (1.7.4)
68-68: shellcheck reported issue in this script: SC2046:warning:2:3: Quote this to prevent word splitting
(shellcheck)
src/xtask/main.rs (2)
16-54
: Consider enhancing error context in test commandWhile the error handling is generally good, consider adding more context to errors in the file pattern conversion.
.map(|path| { - deno_config::glob::PathOrPattern::from_relative(&cwd, &path) + deno_config::glob::PathOrPattern::from_relative(&cwd, &path) + .wrap_err_with(|| format!("Failed to process test path: {}", path)) })
65-69
: TODO: Uncomment or remove Run commandThere's a commented-out Run command. Either implement it or remove the commented code to maintain cleanliness.
Would you like me to help implement the Run command or create an issue to track this task?
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
⛔ Files ignored due to path filters (2)
Cargo.lock
is excluded by!**/*.lock
deno.lock
is excluded by!**/*.lock
📒 Files selected for processing (55)
.cargo/config.toml
(1 hunks).ghjk/lock.json
(6 hunks).github/workflows/nightly.yml
(3 hunks).github/workflows/tests.yml
(2 hunks).gitignore
(1 hunks).pre-commit-config.yaml
(3 hunks).vscode/settings.json
(1 hunks)Cargo.toml
(1 hunks)deno.jsonc
(3 hunks)deps/common.ts
(1 hunks)docs/manual.md
(1 hunks)files/deno/bindings.ts
(1 hunks)files/deno/mod.ts
(1 hunks)files/deno/worker.ts
(1 hunks)ghjk.ts
(3 hunks)host/mod.ts
(3 hunks)install.sh
(1 hunks)modules/envs/mod.ts
(4 hunks)modules/mod.ts
(1 hunks)modules/ports/mod.ts
(5 hunks)modules/ports/worker.ts
(1 hunks)modules/tasks/mod.ts
(5 hunks)ports/infisical.ts
(1 hunks)ports/poetry.ts
(2 hunks)scripts/check.ts
(1 hunks)scripts/dev.ts
(2 hunks)src/deno_systems/bindings.ts
(1 hunks)src/deno_systems/mod.ts
(1 hunks)src/denort/Cargo.toml
(1 hunks)src/denort/lib.rs
(1 hunks)src/denort/promises.rs
(1 hunks)src/ghjk/Cargo.toml
(1 hunks)src/ghjk/build.rs
(1 hunks)src/ghjk/ext.rs
(1 hunks)src/ghjk/ext/callbacks.rs
(1 hunks)src/ghjk/host.rs
(1 hunks)src/ghjk/host/deno.rs
(1 hunks)src/ghjk/host/hashfile.rs
(1 hunks)src/ghjk/js/00_runtime.js
(1 hunks)src/ghjk/js/mock.sfx.ts
(1 hunks)src/ghjk/js/runtime.d.ts
(1 hunks)src/ghjk/js/runtime.js
(1 hunks)src/ghjk/log.rs
(1 hunks)src/ghjk/main.rs
(1 hunks)src/ghjk/systems.rs
(1 hunks)src/ghjk/systems/deno.rs
(1 hunks)src/ghjk/utils.rs
(1 hunks)src/xtask/Cargo.toml
(1 hunks)src/xtask/main.rs
(1 hunks)src/xtask/utils.rs
(1 hunks)std/sedLock.ts
(1 hunks)tests/utils.ts
(1 hunks)utils/logger.ts
(1 hunks)utils/mod.ts
(4 hunks)utils/unarchive.ts
(3 hunks)
✅ Files skipped from review due to trivial changes (8)
- .gitignore
- .cargo/config.toml
- .vscode/settings.json
- std/sedLock.ts
- src/ghjk/js/runtime.js
- modules/ports/worker.ts
- src/denort/Cargo.toml
- src/xtask/Cargo.toml
🧰 Additional context used
🪛 Gitleaks (8.21.2)
.ghjk/lock.json
311-311: Detected a Generic API Key, potentially exposing access to various services and sensitive operations.
(generic-api-key)
317-317: Detected a Generic API Key, potentially exposing access to various services and sensitive operations.
(generic-api-key)
🔇 Additional comments (81)
modules/mod.ts (1)
6-7
: No immediate issues spotted in constructor usage
Storing GhjkCtx
in a protected field is a valid approach to ensure it remains accessible for derived classes. This looks good to me.
src/ghjk/host/deno.rs (1)
3-4
: Ensure you’re using the correct deno_runtime version
Using denort::deno::deno_runtime
is acceptable, but make sure your Cargo.toml references the correct versions to avoid unexpected runtime errors.
src/ghjk/systems.rs (2)
10-12
: Enum-based approach is clear
Using an enum for SystemManifest
is a neat way to branch your system logic. This approach looks clean and extensible for future system types.
22-36
: Solid abstraction via SystemInstance
Defining SystemInstance
as an async trait with load, lock, and generation methods is an elegant approach. It clearly separates concerns and paves the way for multiple system implementations.
src/ghjk/log.rs (1)
3-5
: Thread-safe initialization of logging and panic hooks
Using std::sync::Once
ensures this code is executed only once. This is a reliable way to assemble the logging environment for the entire runtime.
src/ghjk/ext.rs (1)
12-22
: Arc usage for extension callbacks
This block uses an Arc
to store the callback for generating the extension array. If repeated calls to extensions(config.clone())
occur, ensure you are not re-initializing state that needs uniqueness.
src/deno_systems/bindings.ts (2)
38-46
: Confirm concurrency safety for shared blackboard
.
Map
usage can introduce race conditions if there are parallel system preparations. If concurrency is possible, consider using threadsafe structures or synchronization.
125-126
: Validate blackboard content before parsing.
Parsing arguments directly from the blackboard without existence checks or error handling might lead to runtime errors if “args” is missing or malformed.
ghjk.ts (3)
12-12
: Switching defaultEnv to "dev" can cause breaking changes.
Previously, a default of "test" might have been relied upon. Verify downstream processes that depended on the old default.
63-106
: Validate memory and disk usage in “cache-v8” task.
Cloning multiple versions of large artifacts can be resource-intensive. Ensure you have sufficient checks or docs describing how to manage them (e.g., cleaning old versions).
116-118
: Confirm that "0.3.0" is correct for Cargo.toml updates.
The lock-sed script updates Cargo.toml to "0.3.0". Validate that this version is correct and doesn't inadvertently overwrite a more recent version.
src/ghjk/host/hashfile.rs (2)
24-29
: Handle missing hash.json
more gracefully.
Currently, this code errors out if the file doesn’t exist. If a missing file is possible, consider returning a default or logging a user-friendly message.
83-98
: canonicalize
can break relative references or symlinks.
In file_digests
, canonicalizing might not always match user expectations, especially if symlinks are significant. Evaluate whether to store the symlink path vs. final resolved path.
src/ghjk/utils.rs (1)
10-10
: Confirm concurrency strategy for DHashMap
.
DashMap is concurrency-friendly, but usage patterns must be clear to avoid partial readers/writers. Double-check usage across threads or tasks.
src/ghjk/systems/deno.rs (2)
9-15
: Reassess locking mechanisms for exit_code_channel
.
Using a Mutex
around an Option<JoinHandle<i32>>
can be safe but may complicate concurrency if other threads try to check on termination.
79-90
: Handle concurrency or multiple “register_systems” calls.
If the system can be queried more than once, storing manifests_tx
in a single channel might cause collisions or unexpected overwrites.
src/ghjk/ext/callbacks.rs (1)
67-82
: Validate or handle channel send errors more gracefully.
If any error occurs when sending CallbacksMsg::Exec
, you currently call expect_or_log("channel error")
. In production, such errors can indicate serious communication breakdowns that might require different handling, such as cleanup routines or a fallback strategy.
modules/envs/mod.ts (2)
Line range hint 36-56
: Handle scenarios where GHJK_ENV
is invalid.
Your loadConfig
sets activeEnv
based on GHJK_ENV
or config.defaultEnv
, but there is no check whether GHJK_ENV
is present in envsNamed
. Consider warning or raising an error if GHJK_ENV
references an unrecognized environment.
Line range hint 62-112
: Validate assumptions about environment naming within commands()
.
The code references activeEnv
to decide which environment to cook or show, but some logic branches only handle recognized env keys. If a user passes an unrecognized env name, you raise errors. Confirm that any fallback scenario or user guidance is properly handled.
src/ghjk/host.rs (1)
138-155
: Confirm correctness of “fresh_serialized” logic.
The fresh_serialized = true;
flag triggers writing or discarding files later. Verify that transitions from stale → fresh states are always set or unset correctly in corner cases such as concurrency or file read errors.
modules/ports/mod.ts (1)
Line range hint 289-300
: Performance overhead for collecting memo entries.
Array.fromAsync
with iteration over large memo
sets could be a bottleneck if the memo grows. Confirm that this reflection-based approach remains performant for large lockfiles or many resolution entries.
src/denort/lib.rs (2)
39-51
: Consider re-running init
conditionally.
Calling init
sets environment variables, but if init
is invoked multiple times or from different threads, it might conflict or override. Check that repeated calls won’t cause unexpected behavior.
111-170
: Add backpressure or queue limits for “module_worker” tasks.
The code spawns a local task that processes an unbounded queue (tokio::sync::mpsc::channel(1)
is bounded by 1, but re-sending or repeated calls might accumulate). Ensure that slow tasks do not block new modules or starve the worker.
src/deno_systems/mod.ts (1)
1-3
: Validate import usage
Confirm that map
from "../../modules/std.ts"
is adequately tested or validated. If the map object is dynamic or user-provided, inadvertent changes or undefined entries could cause subtle bugs when constructing the systems object.
src/ghjk/js/mock.sfx.ts (1)
12-19
: Confirm returning old value from blackboard ‘set’
When setting a new value in blackboard
, the function returns the old value from the map. Verify that this aligns with the intended usage in the actual code. If returning the newly set value is preferred, this logic should be reversed.
src/ghjk/js/runtime.d.ts (2)
1-4
: Confirm whether undefined should be classified as valid JSON
These type definitions correctly omit undefined
from Json
. If your code frequently handles missing values, consider whether to unify them or leave them separate.
16-16
: Ensure the global export aligns with usage
Exporting const Ghjk: GhjkNs;
is a convenient approach for providing a single entry point. Confirm that your codebase consistently references Ghjk
or that it merges well with any existing global patterns.
scripts/check.ts (2)
7-7
: Double-check directory traversal logic
Invoking parentOrThrow()
twice can be risky if the script is moved to a deeper or shallower directory structure. Consider trying relative paths or verifying the behavior in various runtime contexts to prevent possible file path resolution errors.
10-19
: Excluding build artifacts is a good practice
Adding "target/"
to the exclusion list helps keep the search results clean of build artifacts and aligns with the broader Rust-based workflow now in use.
src/xtask/utils.rs (2)
5-12
: Ensure thread-safe usage of _setup_tracing_once()
The _setup_tracing_once
function relies on a static Lazy
initialization, which is generally thread-safe. However, be mindful of potential conflicts if tests spawn threads or external processes.
14-29
: Good approach for centralized tracing
The setup_tracing
function correctly configures color_eyre
and sets default logging levels. This approach ensures consistent error reporting and log formatting throughout the codebase.
deno.jsonc (3)
3-3
: Shifting to Rust-based tests
Switching from deno test
to cargo x test
indicates a move toward Rust-based testing. Verify that all necessary test dependencies and environment configurations are in place for a smooth transition.
17-18
: Consistent exclusion for build artifacts
Excluding vendor/**
and ./target/
from formatting aligns with ignoring compiled code and third-party dependencies, keeping deno fmt
operations focused on source files only.
28-29
: Consistent lint exclusion
Excluding vendor/**
and ./target/
from linting mirrors the formatting exclusions, ensuring build artifacts are not processed.
src/ghjk/js/00_runtime.js (1)
9-22
: Clear error handling for undefined ops
The getOp(name)
function cleanly throws an error if an operation is not found, preventing silent failures. This is a straightforward implementation to handle missing operations.
files/deno/bindings.ts (3)
1-2
: Nice documentation header and purpose statement.
Your header comment concisely explains the file's purpose. Great work on clarity!
9-10
: Dynamic imports are well-structured.
Using dynamic imports here is a good strategy to ensure the environment can be modified prior to loading modules.
33-35
: Good approach for reading and writing to the shared blackboard.
Be mindful of potential concurrency or usage in parallel tasks; if multiple workers or modules access the Ghjk.blackboard
simultaneously, consider synchronization or concurrency controls.
files/deno/worker.ts (1)
10-10
: Switch to type-only import is appropriate.
This helps clarify that DriverRequests
and DriverResponse
are only used as types, potentially improving tree-shaking and bundling.
deps/common.ts (1)
13-13
: Dependency version update to [email protected].
Updating dependencies frequently is good practice, but verify that the changes do not break existing functionality, especially if the new version introduces breaking changes.
ports/poetry.ts (1)
52-52
: Use of override
is a good practice for clarity.
Explicitly declaring override
ensures that you’re extending existing methods properly and helps with type safety if the base class signatures change. This is a neat improvement for maintainability.
Also applies to: 67-67
files/deno/mod.ts (1)
56-56
: Assess the necessity of granting import
permission to the worker.
Enabling import: true
can open the door to unintended dynamic imports if the worker code is uncontrolled. Verify that you truly need this permission and ensure the worker code is thoroughly audited.
Here’s a script to detect any dynamic import usage within the worker code:
✅ Verification successful
Dynamic imports are actively used in the worker and related code
The verification reveals that dynamic imports are indeed necessary for the worker's functionality. Several critical operations rely on dynamic imports:
- In
files/deno/worker.ts
:- Imports logger setup:
import("../../utils/logger.ts")
- Dynamically loads modules:
import(uri)
- Imports logger setup:
- In
files/deno/bindings.ts
:- Similar pattern of importing logger and modules dynamically
- In
modules/ports/worker.ts
and other modules:- Uses dynamic imports for loading Port classes and task execution
The import: true
permission is justified as it's a core part of the worker's module loading mechanism. The security concerns are mitigated since the imports are controlled and used for internal module loading rather than arbitrary external resources.
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Description: Searches for dynamic import statements in worker source code.
rg --multiline --context 2 "import\s*\("
Length of output: 2447
scripts/dev.ts (1)
27-27
: Confirm that commenting out HOME
is intentional.
If your script logic depends on the $HOME
environment variable, commenting it out may cause unexpected behavior. Ensure it’s no longer needed or remove it completely if it’s obsolete.
ports/infisical.ts (1)
42-42
: Use of override
is appropriate.
Marking the method as override
clarifies the intention to override a superclass method.
modules/tasks/mod.ts (3)
8-8
: Import of ModuleManifest
looks good.
This helps keep type definitions clear and consistent.
24-25
: Constructor signature is consistent with ModuleBase
.
The updated class signature aligns well with the expected inheritance structure. No immediate issues detected.
105-105
: Generating lock entries is straightforward.
Returning a simple versioned object is concise and meets the immediate requirements.
utils/unarchive.ts (2)
47-47
: Check for potential error handling.
While std_io.copy
is generally reliable, consider adding a try-catch (or checking errors) to handle unexpected read/write disruptions when copying from the .tgz
file. This could help gracefully recover or log a clear error message if the file becomes unavailable during the copy operation.
79-79
: Parameter type update is appropriate.
Switching to std_io.Reader
aligns with the updated dependency usage. The updated type signature is consistent with the rest of the file.
src/denort/promises.rs (3)
39-47
: Fulfillment callback logic looks correct.
The approach here properly retrieves the closure from the external reference and invokes it with a successful result. No issues detected.
48-56
: Good handling of rejected promises.
Similarly, this code path correctly handles the rejected promise case by retrieving the closure and invoking it with an error. Consider reinforcing concurrency safety by ensuring no shared state is unexpectedly mutated.
57-70
: Ensure V8 runtime shutdown logic covers external references.
The code gracefully returns None
if the runtime is shutting down, which is good. However, confirm that any leftover references or closure data is properly cleaned up to avoid memory leaks during shutdown.
utils/logger.ts (1)
110-110
: Override keyword usage is correct.
Explicitly marking the handle
method as override
ensures clarity about which method is being overridden. The logic remains sound and well-handled.
src/ghjk/main.rs (3)
62-67
: DENO_UNSTABLE_FLAGS are well-defined.
Listing out the unstable features in DENO_UNSTABLE_FLAGS
is beneficial for clarity. Watch for future changes in Deno's CLI arguments to ensure continued compatibility.
124-138
: Initializing a Deno worker with default flags.
This pattern is consistent with Deno’s recommended usage. Verify that the feature flags in unstable_config
match your actual usage, to avoid enabling unused features that could introduce maintenance overhead.
191-205
: Context & Config structs provide necessary data.
The new structures encapsulate your environment variables, script paths, and worker handles effectively. This is a solid approach for maintainability.
tests/utils.ts (1)
137-137
: Validate the new parameter usage
The newly introduced ghjkExecDenoExec: "deno"
parameter looks consistent with the updated Deno version (2.0.6). Ensure downstream code referencing this parameter handles the "deno"
value appropriately.
utils/mod.ts (2)
284-284
: Exporting dbg
Exporting the dbg
helper in the $
context is useful for debugging. Just ensure it does not unconditionally output sensitive data in production.
606-611
: Enhanced error context in unwrapZodRes
Attaching the cause object to the Zod error is a good addition to debugging.
- Ensure that any sensitive data is sanitized before logging or storing in
zodErr.cause
.
host/mod.ts (5)
271-271
: Instantiating module with new mod.ctor(gcx)
Switching to ModuleBase<unknown>
with direct constructor calls is more streamlined. Keep an eye on any placeholders for advanced type usage in the future.
315-315
: Building instances
array
Including [string, ModuleBase<unknown>]
clarifies the module ID and its corresponding instance. This fosters better readability and ensures consistent usage across modules.
322-323
: Constructor usage for each module
The direct new mod.ctor(gcx)
usage eliminates the second type parameter. Double-check that modules that rely on shared context or lock entries adapt to the simplified signature properly.
328-329
: Collecting module instances
Storing [man.id, instance]
in instances
is a good practice, ensuring you can iterate them later for lock entry generation. Verify no other modules rely on the older, extended signature.
369-370
: Generating lock entries after config load
Deferring lock entry generation until after configuration processing ensures a more complete capture of runtime data. Confirm that no race condition or concurrency issue arises when multiple modules generate lock entries concurrently.
Cargo.toml (3)
1-5
: Workspace configuration
Defining a workspace with members = ["src/*"]
and resolving to version "2" is appropriate. Ensure that excluding src/deno_systems
is intentional if any Rust crates there need to remain isolated.
10-29
: Package & dependencies
The local path dependency on denort
and pinning deno_core
to 0.318.0
ensures alignment with your fork of Deno. Watch out for future changes upstream that might require an update here for compatibility.
31-36
: Additional dependencies
Including clap = "=4.5"
ensures you match the version in Deno. The usage of tokio = "1"
aligns well with asynchronous tasks. Please validate that pinned dependency versions work seamlessly with the rest of the workspace.
install.sh (1)
8-8
: Verify Deno v2.0.6 compatibility with Rust migration
The Deno version update aligns with the PR objectives. However, since this is part of a larger Rust rewrite, we should verify that v2.0.6 is the minimum required version for any remaining Deno components.
✅ Verification successful
Let me gather more information about the Deno usage in the codebase.
Let me check the Deno version requirements in the codebase.
Deno v2.0.6 is compatible with the Rust migration
The version update to Deno v2.0.6 is appropriate for this codebase as it aligns with:
- The Rust dependencies using a custom Deno fork
metatypedev/deno
branchv2.0.6-embeddable
- No higher version requirements found in the remaining TypeScript files
- The codebase's Deno usage is primarily focused on basic APIs (file system, environment, etc.) that are stable across Deno versions
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Check for Deno version requirements in remaining TypeScript files
rg -l "Deno\." | xargs rg "Deno\.version|deno [0-9]|v[0-9]+\.[0-9]+\.[0-9]+" -A 2 -B 2
Length of output: 266
Script:
#!/bin/bash
# Check for any Deno-specific APIs or features being used
rg "Deno\." -A 2 -B 2
# Look for any Deno configuration files
fd "deno.json|deno.jsonc"
# Check for any TypeScript files that might have Deno imports or runtime checks
rg "import.*from.*deno" -A 2 -B 2
Length of output: 30557
Script:
#!/bin/bash
# Check for any explicit Deno version requirements in the codebase
rg "deno [0-9]|Deno [0-9]|v[0-9]+\.[0-9]+\.[0-9]+" -A 2 -B 2
# Check deno.jsonc for any version constraints
cat deno.jsonc
Length of output: 26936
src/ghjk/Cargo.toml (1)
59-59
: Review exact version pin for futures
The futures crate is pinned to exactly 0.3.30
. This strict pinning might cause compatibility issues with other dependencies. Consider using ^0.3.30
unless there's a specific reason for the exact version.
.github/workflows/nightly.yml (2)
7-7
: LGTM: Version update consistent with install.sh
The Deno version update to 2.0.6 matches the version specified in install.sh.
Line range hint 19-24
: Clarify Windows support status
Windows tests are commented out in the matrix. Since this is a major rewrite, please clarify if Windows support is planned or intentionally dropped.
✅ Verification successful
Windows support appears to be intentionally disabled
The codebase shows that Windows support was previously configured in both nightly.yml
and tests.yml
workflows but is currently commented out. There's minimal platform-specific code, and no explicit Windows-related documentation in README.md, suggesting that Windows support is intentionally not included in the current implementation.
.github/workflows/nightly.yml
: Windows runner is commented out.github/workflows/tests.yml
: Windows runner is commented out- No Windows-specific documentation or implementation found in the codebase
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Check for Windows-specific code or issues
rg -l "cfg\(windows\)|#\[cfg\(windows\)\]|if cfg!(windows)"
Length of output: 61
Script:
#!/bin/bash
# Search for Windows-related patterns in workflow files and documentation
rg -i "windows|win32|win64" .github/workflows/
rg -i "windows|win32|win64" "README.md"
# Look for platform-specific code patterns
rg -i "platform|os\." --type rust
Length of output: 352
.pre-commit-config.yaml (2)
41-41
: LGTM: Task-based approach improves maintainability
The change from direct Deno commands to using deno task self
improves maintainability by centralizing task definitions.
Also applies to: 46-46
69-81
: Verify Rust toolchain compatibility
The addition of Rust pre-commit hooks aligns with the project's Rust rewrite. However, ensure all contributors have the necessary Rust toolchain installed.
Consider adding a note in the project's contributing guidelines about Rust toolchain requirements.
Run this check to verify Rust toolchain setup instructions exist:
src/xtask/main.rs (1)
1-11
: LGTM: Well-organized common imports
The interlude
module effectively centralizes common imports and type aliases, improving maintainability.
.github/workflows/tests.yml (2)
86-88
: LGTM: Explicit platform configuration
Adding DOCKER_PLATFORM as an environment variable improves clarity and maintainability of the cross-platform testing setup.
12-12
: Verify compatibility with Deno 2.0.6
The Deno version upgrade is significant (1.44.2 → 2.0.6). Ensure all Deno scripts are compatible with the new version.
Run this check to identify potential compatibility issues:
✅ Verification successful
Deno 2.0.6 upgrade appears safe for this codebase
Based on the analysis of Deno API usage in the codebase, the upgrade to Deno 2.0.6 appears safe as the code primarily uses stable APIs that haven't had breaking changes:
- File system operations (
Deno.readFile
,Deno.writeFile
, etc.) - Environment variables (
Deno.env
) - Process management (
Deno.exit
,Deno.execPath
) - Platform detection (
Deno.build
) - Basic I/O operations (
Deno.stderr
,Deno.open
)
The only potentially sensitive API usage is Deno.Kv
in modules/ports/db.ts
, but it's already marked with a comment indicating it's unstable, and the code appears to use it with proper error handling.
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Search for Deno APIs that might have changed between versions
rg --type ts 'Deno\.' | sort -u
Length of output: 9331
docs/manual.md (1)
417-418
: LGTM! Installation command improved for better readability and POSIX compliance.
The changes improve the installation command by:
- Moving the environment variable to be scoped only to the shell command execution
- Using
sh
instead ofbash
for better POSIX compliance - Splitting into multiple lines for better readability
.ghjk/lock.json (4)
104-109
: LGTM! Deno version updated to 2.0.6.
The update aligns with the PR objective and maintains consistency across the configuration.
276-287
: LGTM! Well-structured Rust environment configuration.
The Rust environment is properly configured with:
- Correct version (1.82.0)
- Essential components (rustfmt, clippy)
- Proper build dependencies
311-311
: False positive alerts for API keys can be safely ignored.
The static analysis tool flagged environment identifiers as potential API keys. These are actually internal environment configuration identifiers and not sensitive data.
Also applies to: 317-317
🧰 Tools
🪛 Gitleaks (8.21.2)
311-311: Detected a Generic API Key, potentially exposing access to various services and sensitive operations.
(generic-api-key)
313-317
: LGTM! New cache-v8 task added with proper configuration.
The task is well-defined with:
- Clear description
- Proper environment configuration
- Consistent task naming
🧰 Tools
🪛 Gitleaks (8.21.2)
317-317: Detected a Generic API Key, potentially exposing access to various services and sensitive operations.
(generic-api-key)
@coderabbitai review |
✅ Actions performedReview triggered.
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 15
♻️ Duplicate comments (1)
src/ghjk/systems.rs (1)
82-84
:⚠️ Potential issueHandle downcast errors more gracefully.
The current implementation uses
expect_or_log
which could cause crashes. This issue was previously identified and should be handled more gracefully.-let state: Option<Box<L>> = state.map(|st| st.downcast().expect_or_log("downcast error")); +let state: Option<Box<L>> = match state { + Some(st) => match st.downcast::<L>() { + Ok(x) => Some(x), + Err(_) => return Err(eyre::eyre!("downcast error: invalid type for LockState")), + }, + None => None, +};
🧹 Nitpick comments (63)
src/deno_systems/types.ts (3)
11-51
: Consider adding defaults or stricter validations
Optional schema fields likevalue_hint
andaction
could benefit from defaults or additional guards to enhance resilience. For instance, specifying a defaultaction
ensures a consistent fallback.
63-79
: Doubleoptional()
usage
args: zod.record(cliArg).optional().optional()
andflags: zod.record(cliFlag).optional().optional()
might be redundant, as chaining.optional()
repeatedly yields the same effect. Consolidate to a single.optional()
.
139-145
: Default export might hamper tree-shaking
Exporting a default object can be less friendly to tree-shaking. Consider named exports if module size or client bundling is a concern.tests/utils.ts (2)
83-87
: Commented-out code
There's a block of debugging code commented out. Consider removing it if no longer needed or wrapping it in a feature flag for dedicated debugging.
178-180
: Refactor runner selection
This array of runners might be extended in the future; consider using a configuration-based approach to scale easily or to conditionally add more test runners.src/denort/unsync.rs (2)
149-155
: Potential concurrency confusion
JoinSet
aims to handle multiple tasks in a !Send environment. Ensure it's only used under single-thread constraints to avoid subtle concurrency oversights.
166-195
: Large tasks caution
spawn
andspawn_named
do not limit the size or lifetime of queued tasks. If extremely large tasks are spawned, they might block other tasks. Consider load-balancing or partitioning.src/ghjk/systems/deno.rs (2)
11-17
: Unused field inDenoSystemsContext
#[allow(unused)]
is pragmatic during development, but consider removing it or referencing it in the near future to avoid confusion.
34-133
: Refactor long function
systems_from_deno
is quite lengthy. Extracting smaller helpers (e.g., for spawn logic, message channel setup) could boost readability and maintainability.src/ghjk/config.rs (2)
64-81
: Optional file or directory detection
If neitherghjkfile_path
norghjkdir_path
is present, the warning is helpful. An additional fallback or clear error might assist new users.
161-186
: Consolidate repeated path resolution
source_global_config
andsource_local_config
share logic for data_dir, deno_dir, and repo_root. Consider refactoring into a helper function to keep logic DRY.src/ghjk/systems/deno/cli.rs (3)
29-66
: Consider robust error handling for potential naming collisions.
When building subcommands and aliases, a conflict or mismatch can occur. Instead of panicking, you might return a descriptive error or ignore duplicates gracefully, providing a better user experience than a hard crash.
89-107
: Revisit subcommand with no action.
When there's noaction_cb_key
and no subcommands, the command ends up without functionality. Consider providing a fallback action or usage information to avoid confusion.
334-370
: Refine or remove unimplemented value hint variants.
AllValueHintSerde
variants map toUnknown
. If you do not plan to implement them, removing or marking them clearly as unsupported will help prevent confusion and reduce maintenance overhead.modules/envs/mod.ts (3)
Line range hint
63-108
: Validate flag and argument correctness in CLI definitions.
By mergingcommonFlags
andcommonArgs
, there's a risk of unintended key collisions or malformed input. Consider adding more robust checks or specialized validators for better user feedback.
Line range hint
253-262
: Plan ahead for lock version upgrades.
loadLockEntry
explicitly checksversion != "0"
. If you anticipate multiple lock format versions in the future, consider a fallback strategy or a version migration path.
Line range hint
264-308
: Restore diff confirmation or finalize approach.
The code includes commented logic related todiff_kit.diff
and user approval. If user confirmation is important, reintroduce this flow or ensure there's a different safeguard in place.src/ghjk/cli.rs (3)
13-35
: Show friendlier message when no ghjk directory is present.
Currently, callingquick_err.exit()
abruptly terminates the process. You could guide the user to initialize a ghjk project or specify a directory instead of ending execution silently.
129-148
: Confirm unreachable paths remain truly unreachable.
QuickComands::Deno { .. } => unreachable!()
relies on prior checks to ensure this variant is never parsed at runtime. Regularly validate these assumptions to avoid unexpected panics.
179-211
: Unify all error scenarios intry_quick_cli
.
While certain error kinds are handled by returningOk(Some(err))
, other cases exit immediately. Consistent error handling or uniform help messages could improve user comprehension.src/denort/worker.rs (3)
19-70
: Gracefully handle repeated termination signals.
Currently, the worker loop exits on any signal change. Consider providing partial shutdown states (e.g., draining queued messages or final logging) to ensure a smooth termination even under repeated signals.
136-180
: Encapsulate worker construction logic in a builder pattern.
WorkerContext::from_config
eagerly creates all fields. A builder pattern might help keep the code streamlined, especially if more fields or configuration parameters are added later.
399-426
: Handle partial or early termination in the event loop.
When the loop is exited by a term signal, confirm that coverage collectors or potential watchers (like HMR) are fully stopped. Consider logging or returning explicit exit states.src/denort/macros.rs (1)
8-16
: Provide optional backtrace capture for deeper debugging.
This macro discards backtraces to align with your design choice. Consider optionally enabling backtrace support for advanced troubleshooting scenarios.install/utils.ts (1)
7-7
: Doc comment improvement.Noting that this shim is running inside the ghjk embedded runtime is helpful. Readers will benefit from a brief explanatory statement of what that runtime entails.
install.ts (1)
8-9
: Clarifying the comment.Stating that imported modules “get cached” may confuse new contributors. Consider elaborating that “importing these modules ensures they are in the Deno cache for offline usage.”
tests/envHooks.ts (1)
81-90
: Manage environment consistency with added "fs" property
The newfs
property centralizes the file layout for this test. If other tests rely on the same environment setup, consider extracting it into a shared helper for consistency and maintainability.tests/hashfile.ts (2)
4-6
: Introduce stronger type checks
Adding astdin: string
property is straightforward, but consider potential future expansions, such as typed commands or arguments to ensure more robust and descriptive test data.
56-75
: Centralize repetitive test harness setup
Repeated references toghjk.ts
,extra.ts
, and directory setup might be refactored into a helper if used across multiple test files, improving maintainability.tools/dev.ts (1)
63-69
: Ensure shell-specific commands handle unexpected arguments
You handlebash
andfish
shells specifically, but you callcmd = $
${Deno.args}`` if the arguments don't match. Consider a fallback or validation if unknown or partial arguments are provided to gracefully manage potential errors.install/mod.ts (1)
108-119
: Architectural clarity forgetHomeDir
.
This helper function succinctly retrieves the user’s home directory across platforms. Consider logging the resolved home directory (with debug level logs) to facilitate troubleshooting in user environments.function getHomeDir() { switch (Deno.build.os) { case "linux": case "darwin": return Deno.env.get("HOME") ?? null; case "windows": return Deno.env.get("USERPROFILE") ?? null; default: return null; } } +// Potentially: +logger.debug("Using home dir:", homeDir);tests/ports.ts (1)
161-161
: Concise multi-commandePoint
.
Executing multiple commands with logical operators/&&
is neat. If future expansions are needed, consider splitting them for clarity.tests/reloadHooks.ts (2)
202-202
: Consider clarifying properties in the custom type.
The newCustomE2eTestCase
type addsinstallConf?
alongsidestdin, ePoint
. Confirm that each property’s meaning is clearly documented to help maintain clarity about what is optional or required.
299-315
: Add extra validations forinstallConf
.
WhentestCase.installConf
is absent, the code defaults to[dummy()]
. Consider verifying that the test suite covers both scenarios (with and withoutinstallConf
) to ensure consistent test coverage.tests/envs.ts (2)
12-12
: Document the rationale for omitting"fs"
.
TheOmit<E2eTestCase, "ePoints" | "fs">
approach is valid, but a short comment explaining why"fs"
is replaced would help maintainers understand the shift in test structure.
338-347
: Ensure consistent environment merging logic.
When mergingtestCase.envs
withtestCase.secureConfig?.envs
, confirm that any overlapping environment definitions won’t produce unexpected results.modules/envs/posix.ts (1)
305-306
: Typo in comment: "to improve to improve reliability".
There’s a minor repetition in the comment. Consider rephrasing to "…to improve reliability…".-# on this shim to improve to improve reliablity +# on this shim to improve reliabilitymodules/ports/sync.ts (1)
521-528
: Improve error context when no matching version is found.
The enhanced message is quite helpful, but also consider logging the requested version with more descriptive text (e.g. "Requested version was X, but found none."). This extra clarity can save significant debug time.src/ghjk/js/runtime.js (1)
10-10
: Consider a more explicit global object nameThe global object name
____GhjkHost
uses underscores as a naming convention to avoid conflicts, but this approach might be improved.Consider using a more explicit namespace like
__GHJK_HOST__
or implementing a proper global registration mechanism to avoid potential naming conflicts.-export const Ghjk = globalThis.____GhjkHost; +export const Ghjk = globalThis.__GHJK_HOST__;Cargo.toml (1)
31-33
: Ensure clap version compatibilityThe warning about matching clap versions with Deno is important. Consider documenting this constraint more formally.
Consider adding a cargo-deny rule or workspace-level version resolution to enforce this constraint automatically. This would prevent accidental version mismatches during updates.
deno.jsonc (2)
3-4
: Review test and self task dependenciesThe test task now depends on cargo build, which is correct but could be optimized:
- Consider using
--no-run
for the test task to avoid unnecessary binary execution- The self task might benefit from additional flags for development
Consider these improvements:
- "test": "cargo build -p ghjk && deno test --unstable-worker-options --unstable-kv -A tests/*", + "test": "cargo test --no-run -p ghjk && deno test --unstable-worker-options --unstable-kv -A tests/*", - "self": "cargo run -p ghjk", + "self": "cargo run -p ghjk --features dev"
17-18
: Standardize exclusion patternsThe exclusion patterns in fmt and lint sections should be consistent. The
./target/
path uses a leading./
while other paths don't.Standardize the path format:
- "./target/" + "target/**"Also applies to: 28-29
src/ghjk/main.rs (1)
69-73
: Add documentation for GhjkCtx structConsider adding documentation comments to describe the purpose and usage of this context struct.
#[derive(Debug)] +/// Context struct holding the Deno worker handle and configuration +/// for managing the ghjk environment pub struct GhjkCtx { deno: denort::worker::DenoWorkerHandle, config: config::Config, }src/ghjk/Cargo.toml (1)
66-67
: Track TODO for config format supportThe TODO comment indicates plans to support additional config formats. Consider creating an issue to track this enhancement.
Would you like me to create a GitHub issue to track the implementation of additional config format support?
src/ghjk/host/deno.rs (2)
23-24
: Improve error handling for file path operationsThe error message "repo url error" could be more descriptive about the specific failure.
- .wrap_err("repo url error")?; + .wrap_err_with(|| format!("failed to construct path to bindings.ts in repo root: {:?}", hcx.gcx.config.repo_root))?;
68-70
: Consider more graceful error handlingUsing
expect_or_log
might be too aggressive for runtime errors. Consider usingok_or_else
with more descriptive error messages.- let (_, resp) = bb.remove("resp").expect_or_log("resp missing"); - let resp: InternalSerializationResult = - serde_json::from_value(resp).expect_or_log("error deserializing resp"); + let (_, resp) = bb.remove("resp") + .ok_or_else(|| eyre::eyre!("response missing from blackboard"))?; + let resp: InternalSerializationResult = serde_json::from_value(resp) + .wrap_err("failed to deserialize response from Deno module")?;.github/workflows/release.yml (1)
61-63
: Track Deno musl supportConsider creating an issue to track the musl support limitation, as it affects the ability to provide static binaries.
Would you like me to create a GitHub issue to track this limitation and its impact on the project?
src/ghjk/log.rs (2)
37-53
: Consider enhancing panic message handlingThe panic hook implementation has duplicate code for checking panic messages.
-if let Some(msg) = panic_info.payload().downcast_ref::<&str>() { - if msg.contains("A Tokio 1.x context was found, but it is being shutdown.") { - warn!("improper shutdown, make sure to terminate all workers first"); - return; - } -} else if let Some(msg) = panic_info.payload().downcast_ref::<String>() { - if msg.contains("A Tokio 1.x context was found, but it is being shutdown.") { - warn!("improper shutdown, make sure to terminate all workers first"); - return; - } -} +let msg = panic_info + .payload() + .downcast_ref::<&str>() + .map(|s| s.to_string()) + .or_else(|| panic_info.payload().downcast_ref::<String>().cloned()); + +if let Some(msg) = msg { + if msg.contains("A Tokio 1.x context was found, but it is being shutdown.") { + warn!("improper shutdown, make sure to terminate all workers first"); + return; + } +}
85-87
: Address FIXME comment regarding console-subscriberThere's an unresolved FIXME comment about tokio-console integration.
Would you like me to help investigate and implement a fix for the console-subscriber integration? I can create a GitHub issue to track this.
install/hook.fish (1)
112-115
: Fix indentation and line continuation in fish scriptThe indentation and line continuation in the
__ghjk_preexec
function could be improved for better readability.- and test -e $next_env_dir/activate.fish; - and test (__ghjk_get_mtime_ts $GHJK_LAST_ENV_DIR/activate.fish) -gt $GHJK_LAST_ENV_DIR_MTIME; - ghjk_hook + and test -e $GHJK_LAST_ENV_DIR/activate.fish \ + and test (__ghjk_get_mtime_ts $GHJK_LAST_ENV_DIR/activate.fish) -gt $GHJK_LAST_ENV_DIR_MTIME + ghjk_hooksrc/ghjk/ext.rs (1)
28-33
: Consider using RwLock for blackboard access.The current implementation uses Arc for the blackboard, which might cause contention under high concurrent access. Consider using RwLock for better performance in read-heavy scenarios.
-pub blackboard: Arc<DHashMap<CHeapStr, serde_json::Value>>, +pub blackboard: Arc<RwLock<DHashMap<CHeapStr, serde_json::Value>>>,src/ghjk/systems.rs (1)
129-130
: Consider adding context to CLI command actions.The
CliCommandAction
type could benefit from having context information passed to the action handler. This would make it easier to access shared state or configuration.pub type CliCommandAction = - Box<dyn Fn(clap::ArgMatches) -> BoxFuture<'static, Res<()>> + Send + Sync>; + Box<dyn Fn(clap::ArgMatches, Arc<Context>) -> BoxFuture<'static, Res<()>> + Send + Sync>;src/ghjk/utils.rs (1)
6-8
: Consider simplifying the default function.The function could be simplified to a one-liner using
T::default()
directly.-pub fn default<T: Default>() -> T { - std::default::Default::default() -} +pub fn default<T: Default>() -> T { T::default() }src/ghjk/host/hashfile.rs (1)
165-200
: Consider adding file size check before hashing.Large files could impact performance. Consider adding a size check and potentially using a different strategy for large files.
pub async fn file_digest_hash(hcx: &HostCtx, path: &Path) -> Res<Option<String>> { let path = match tokio::fs::canonicalize(path).await { Ok(val) => val, Err(err) if err.kind() == std::io::ErrorKind::NotFound => { return Ok(None); } Err(err) => return Err(err).wrap_err("error resolving realpath"), }; match tokio::fs::metadata(&path).await { Ok(stat) => { + const LARGE_FILE_THRESHOLD: u64 = 100 * 1024 * 1024; // 100MB let content_hash = if stat.file_type().is_file() || stat.file_type().is_symlink() { + if stat.len() > LARGE_FILE_THRESHOLD { + // For large files, consider using only metadata or partial content + Some(crate::utils::hash_obj(&stat)) + } else { Some( file_content_digest_hash(hcx, &path) .await? .await .map_err(|err| ferr!(err))?, ) + } } else { None };modules/ports/mod.ts (1)
114-167
: Consider breaking down the commands method.The command structure is well-organized but could be more modular. Consider extracting each command into its own function for better maintainability.
+ private async resolveCommand() { + const gcx = this.gcx; + const pcx = getPortsCtx(gcx); + await using scx = await syncCtxFromGhjk(gcx); + for (const [_id, set] of Object.entries(pcx.config.sets)) { + void await buildInstallGraph(scx, set); + } + } override commands() { const gcx = this.gcx; const pcx = getPortsCtx(gcx); const out: CliCommand[] = [{ name: "ports", visible_aliases: ["p"], about: "Ports module, install programs into your env.", sub_commands: [ { name: "resolve", about: "Resolve all installs declared in config.", before_long_help: `- Useful to pre-resolve and add all install configs to the lockfile.`, - action: async function () { - await using scx = await syncCtxFromGhjk(gcx); - for (const [_id, set] of Object.entries(pcx.config.sets)) { - void await buildInstallGraph(scx, set); - } - }, + action: () => this.resolveCommand(), },src/ghjk/host.rs (3)
130-132
: Address TODO comment about version migratorThe TODO comment indicates missing version migration functionality.
Would you like me to help implement the version migrator or create a GitHub issue to track this task?
157-159
: Remove commented-out codeThe commented-out code should be either implemented or removed to maintain code cleanliness.
Apply this diff to remove the commented-out code:
- // if obj.version != "0" { - // hash_obj = None; - // }
161-162
: Implement or remove empty TODO commentThe empty TODO comment should be either implemented or removed.
Would you like me to help implement the missing functionality or create a GitHub issue to track this task?
install/bash-preexec.sh (1)
286-286
: Improve trap string extractionThe current implementation could mask return values. Declare and assign separately.
Apply this diff to improve the code:
- local prior_trap=$(sed "s/[^']*'\(.*\)'[^']*/\1/" <<<"${__bp_trap_string:-}") + local prior_trap + prior_trap=$(sed "s/[^']*'\(.*\)'[^']*/\1/" <<<"${__bp_trap_string:-}")🧰 Tools
🪛 Shellcheck (0.10.0)
[warning] 286-286: Declare and assign separately to avoid masking return values.
(SC2155)
src/ghjk/ext/callbacks.rs (4)
28-64
: Add documentation for struct fieldsWhile the struct-level documentation is good, consider adding field-level documentation to explain:
- The purpose of
rx
in CallbackCtx- The role of
was_set
in CallbackLinestruct CallbackCtx { + /// Channel for receiving callback messages rx: mpsc::Receiver<CallbacksMsg>, + /// Signal for runtime termination term_signal: tokio::sync::watch::Receiver<bool>, } #[derive(Default)] pub struct CallbackLine { + /// The callback context, if available cx: Option<CallbackCtx>, + /// Whether this line was initialized with a context was_set: bool, }
205-209
: Remove commented codeThe commented-out code block should either be:
- Removed if it's no longer needed
- Implemented if it represents a better approach
- Documented if it's kept for future reference
356-361
: Enhance safety documentation for SendPtrThe current safety comment is minimal. Consider expanding it to document:
- The exact thread-safety invariants that must be maintained
- How these invariants are enforced by the codebase
- What operations could potentially violate these invariants
#[derive(Clone, Copy)] #[repr(transparent)] struct SendPtr<T>(std::ptr::NonNull<T>); -// SAFETY: we only ever access this value from within the same thread -// as deno +// SAFETY: This type implements Send to allow moving V8 objects between threads. +// The safety invariants that must be maintained are: +// 1. The pointer is only ever dereferenced on the V8/Deno main thread +// 2. The lifetime of the pointed-to object is guaranteed by the V8 scope +// 3. No concurrent access occurs as all operations are serialized through the main thread unsafe impl<T> Send for SendPtr<T> {}
363-389
: Enhance logging for operation registrationConsider adding debug logging for successful callback registration to aid in debugging:
callbacks.store.insert( name.into(), Callback { js_fn: SendPtr(cb.into_raw()), async_work_sender, }, ); + debug!("registered callback: {}", name); Ok(())
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
⛔ Files ignored due to path filters (3)
-
.ghjk/deno.lock
is excluded by!**/*.lock
-
Cargo.lock
is excluded by!**/*.lock
-
deno.lock
is excluded by!**/*.lock
📒 Files selected for processing (79)
-
.cargo/config.toml
(1 hunks) -
.ghjk/lock.json
(11 hunks) -
.github/workflows/nightly.yml
(3 hunks) -
.github/workflows/release.yml
(1 hunks) -
.github/workflows/tests.yml
(4 hunks) -
.gitignore
(1 hunks) -
.pre-commit-config.yaml
(3 hunks) -
Cargo.toml
(1 hunks) -
README.md
(4 hunks) -
deno.jsonc
(3 hunks) -
deps/install.ts
(1 hunks) -
docs/manual.md
(3 hunks) -
ghjk.ts
(4 hunks) -
host/mod.ts
(0 hunks) -
install.sh
(1 hunks) -
install.ts
(2 hunks) -
install/bash-preexec.sh
(1 hunks) -
install/ghjk.sh
(0 hunks) -
install/hook.fish
(1 hunks) -
install/hook.sh
(1 hunks) -
install/mod.ts
(5 hunks) -
install/utils.ts
(1 hunks) -
main.ts
(0 hunks) -
modules/envs/mod.ts
(8 hunks) -
modules/envs/posix.ts
(6 hunks) -
modules/mod.ts
(1 hunks) -
modules/ports/mod.ts
(7 hunks) -
modules/ports/sync.ts
(2 hunks) -
modules/ports/worker.ts
(1 hunks) -
modules/tasks/mod.ts
(3 hunks) -
modules/types.ts
(1 hunks) -
ports/asdf.ts
(2 hunks) -
ports/cmake.ts
(0 hunks) -
ports/mod.ts
(0 hunks) -
rust-toolchain.toml
(1 hunks) -
src/deno_systems/bindings.ts
(1 hunks) -
src/deno_systems/mod.ts
(1 hunks) -
src/deno_systems/types.ts
(1 hunks) -
src/denort/lib.rs
(1 hunks) -
src/denort/macros.rs
(1 hunks) -
src/denort/promises.rs
(1 hunks) -
src/denort/unsync.rs
(1 hunks) -
src/denort/worker.rs
(1 hunks) -
src/ghjk/Cargo.toml
(1 hunks) -
src/ghjk/cli.rs
(1 hunks) -
src/ghjk/config.rs
(1 hunks) -
src/ghjk/ext.rs
(1 hunks) -
src/ghjk/ext/callbacks.rs
(1 hunks) -
src/ghjk/host.rs
(1 hunks) -
src/ghjk/host/deno.rs
(1 hunks) -
src/ghjk/host/hashfile.rs
(1 hunks) -
src/ghjk/js/00_runtime.js
(1 hunks) -
src/ghjk/js/runtime.d.ts
(1 hunks) -
src/ghjk/js/runtime.js
(1 hunks) -
src/ghjk/log.rs
(1 hunks) -
src/ghjk/main.rs
(1 hunks) -
src/ghjk/systems.rs
(1 hunks) -
src/ghjk/systems/deno.rs
(1 hunks) -
src/ghjk/systems/deno/cli.rs
(1 hunks) -
src/ghjk/utils.rs
(1 hunks) -
src/play/Cargo.toml
(1 hunks) -
src/play/main.rs
(1 hunks) -
src/xtask/main.rs
(1 hunks) -
tests/envHooks.ts
(3 hunks) -
tests/envs.ts
(4 hunks) -
tests/hashfile.ts
(1 hunks) -
tests/ports.ts
(4 hunks) -
tests/portsOutdated.ts
(2 hunks) -
tests/reloadHooks.ts
(3 hunks) -
tests/tasks.ts
(2 hunks) -
tests/test-alpine.Dockerfile
(0 hunks) -
tests/test.Dockerfile
(0 hunks) -
tests/test.Dockerfile.dockerignore
(0 hunks) -
tests/todo.ts
(1 hunks) -
tests/utils.ts
(4 hunks) -
tools/check.ts
(1 hunks) -
tools/dev.ts
(1 hunks) -
utils/logger.ts
(2 hunks) -
utils/mod.ts
(6 hunks)
💤 Files with no reviewable changes (8)
- tests/test.Dockerfile.dockerignore
- ports/mod.ts
- ports/cmake.ts
- main.ts
- install/ghjk.sh
- tests/test-alpine.Dockerfile
- tests/test.Dockerfile
- host/mod.ts
✅ Files skipped from review due to trivial changes (5)
- tests/todo.ts
- deps/install.ts
- src/play/main.rs
- rust-toolchain.toml
- src/play/Cargo.toml
🚧 Files skipped from review as they are similar to previous changes (14)
- src/deno_systems/mod.ts
- .gitignore
- .cargo/config.toml
- .github/workflows/nightly.yml
- docs/manual.md
- modules/ports/worker.ts
- utils/logger.ts
- utils/mod.ts
- src/deno_systems/bindings.ts
- src/ghjk/js/00_runtime.js
- src/ghjk/js/runtime.d.ts
- src/xtask/main.rs
- .pre-commit-config.yaml
- modules/mod.ts
🧰 Additional context used
🪛 actionlint (1.7.4)
.github/workflows/release.yml
64-64: label "custom-arm" is unknown. available labels are "windows-latest", "windows-latest-8-cores", "windows-2022", "windows-2019", "ubuntu-latest", "ubuntu-latest-4-cores", "ubuntu-latest-8-cores", "ubuntu-latest-16-cores", "ubuntu-24.04", "ubuntu-22.04", "ubuntu-20.04", "macos-latest", "macos-latest-xl", "macos-latest-xlarge", "macos-latest-large", "macos-15-xlarge", "macos-15-large", "macos-15", "macos-14-xl", "macos-14-xlarge", "macos-14-large", "macos-14", "macos-13-xl", "macos-13-xlarge", "macos-13-large", "macos-13", "macos-12-xl", "macos-12-xlarge", "macos-12-large", "macos-12", "self-hosted", "x64", "arm", "arm64", "linux", "macos", "windows". if it is a custom label for self-hosted runner, set list of labels in actionlint.yaml config file
(runner-label)
.github/workflows/tests.yml
59-59: label "custom-arm" is unknown. available labels are "windows-latest", "windows-latest-8-cores", "windows-2022", "windows-2019", "ubuntu-latest", "ubuntu-latest-4-cores", "ubuntu-latest-8-cores", "ubuntu-latest-16-cores", "ubuntu-24.04", "ubuntu-22.04", "ubuntu-20.04", "macos-latest", "macos-latest-xl", "macos-latest-xlarge", "macos-latest-large", "macos-15-xlarge", "macos-15-large", "macos-15", "macos-14-xl", "macos-14-xlarge", "macos-14-large", "macos-14", "macos-13-xl", "macos-13-xlarge", "macos-13-large", "macos-13", "macos-12-xl", "macos-12-xlarge", "macos-12-large", "macos-12", "self-hosted", "x64", "arm", "arm64", "linux", "macos", "windows". if it is a custom label for self-hosted runner, set list of labels in actionlint.yaml config file
(runner-label)
🪛 Shellcheck (0.10.0)
install/bash-preexec.sh
[error] 1-1: Tips depend on target shell and yours is unknown. Add a shebang or a 'shell' directive.
(SC2148)
[warning] 137-137: BP_PIPESTATUS appears unused. Verify use (or export if used externally).
(SC2034)
[warning] 241-241: Remove space after = if trying to assign a value (for empty string, use var='' ... ).
(SC1007)
[warning] 286-286: Declare and assign separately to avoid masking return values.
(SC2155)
[error] 312-312: Use braces when expanding arrays, e.g. ${array[idx]} (or ${var}[.. to quiet).
(SC1087)
🪛 Gitleaks (8.21.2)
.ghjk/lock.json
366-366: Detected a Generic API Key, potentially exposing access to various services and sensitive operations.
(generic-api-key)
372-372: Detected a Generic API Key, potentially exposing access to various services and sensitive operations.
(generic-api-key)
🔇 Additional comments (91)
src/deno_systems/types.ts (2)
5-7
: Schema definition looks fine
Defining denoSystemsRoot
as a record of function values in Zod is clear and straightforward.
89-93
: Solid schema for CLI action arguments
It cleanly separates flags
and args
into a flexible union. The approach is commendable, laying out a robust structure for CLI processing.
tests/utils.ts (3)
19-26
: E2eTestCase struct refactoring
Replacing tsGhjkfileStr
with a generic fs
mapping is a flexible improvement. It allows multiple files to be tested more comprehensively.
30-59
: Potential concurrency concerns
localE2eTest
writes multiple files concurrently. Ensure no concurrency conflicts if tests run in parallel, especially if the same filenames are reused across tests.
Line range hint 181-186
: Removed Docker test runner
The error message clarifies that Docker-based tests are no longer supported. Looks consistent with the new approach focusing solely on local tests.
src/denort/unsync.rs (3)
1-3
: License acknowledgment
Retaining the original license headers is correct when adapting code from external sources.
19-28
: Abort method usage
JoinHandle::abort()
cleanly cancels the spawned task. Ensure downstream code handles partial progress or side effects consistently after abort.
50-65
: Ensure single-thread executor
spawn
relies on a current-thread runtime. The debug_assert!
provides a safeguard in debug mode; consider a release-mode safety fallback or documentation note.
src/ghjk/systems/deno.rs (3)
1-3
: Clear and concise module documentation
The provided doc comments concisely explain that the module supports TypeScript-based systems via Deno.
19-31
: Check concurrency for terminate
The function extracts and awaits a JoinHandle
. Ensure no other references to the same handle remain, which could lead to race conditions if concurrently invoked.
303-320
: Validate command structure
The commands
method fetches CLI command definitions from the Deno side. Ensure the JSON schema remains stable and doesn't break external tooling.
src/ghjk/config.rs (3)
29-63
: Path resolution approach
Sourcing GHJK_DIR
or searching recursively for .ghjk
is flexible and user-friendly. The fallback logic is well-handled.
105-124
: Concurrent global config reading
All config file reads are executed in a spawned blocking task. Generally fine, but ensure no other parallel user code modifies these files mid-read.
132-139
: Appending slash to repo_root
Appending a trailing slash ensures consistent resolution of joined paths. This is a neat detail preventing subtle URL-based issues.
modules/envs/mod.ts (2)
Line range hint 38-59
: Review unguarded environment variable usage.
loadConfig
reads from Deno.env
to set activeEnv
. Confirm that the environment variable matches a known environment or at least provide a warning when it doesn't, preventing unexpected usage.
186-216
: Ensure user is alerted for missing environments.
If an environment key is invalid or absent, the code throws an error message. Confirm that this gracefully informs the user. Optionally, suggest a list of valid environments for convenience.
src/ghjk/cli.rs (1)
107-117
: Support advanced conflict handling in commands_from_systems
.
The code prevents command name collisions by failing early. Optionally, an override or merging strategy could help advanced users unify commands under a single name.
src/denort/worker.rs (2)
74-134
: Assess parallel module workers for shared resources.
Multiple module workers can spawn concurrently. Confirm that no shared data structures cause inconsistent states or data races, especially when multiple tasks try to mutate shared references.
232-253
: Carefully validate module specifiers.
User input can be malicious if not verified. Properly validating ModuleSpecifier
ensures no unexpected remote code execution or filesystem traversal vulnerabilities.
[security]
modules/types.ts (1)
19-19
: Renaming ghjkShareDir
to ghjkDataDir
streamlines naming consistency.
This change clarifies that the directory is for holding data rather than “shared” items. Please ensure that all references to ghjkDataDir
across the codebase are updated, so the naming remains consistent.
tools/check.ts (3)
1-2
: Check script shebang line looks fine.
Using ghjk deno run
in the shebang line is a creative way to streamline usage. Just keep in mind that users who do not have the ghjk
alias or environment set might encounter issues.
6-22
: Validate the glob pattern and exclusions.
The file expansion logic excludes critical folders like .git
and vendor
, which is good. However, confirm that no necessary files are mistakenly excluded (e.g., test files or config files).
24-24
: Confirm Deno version compatibility.
deno check
has seen changes in various Deno versions. Ensure the project’s targeted Deno version fully supports this command.
install/utils.ts (3)
15-15
: Environment variable usage.
This line sets GHJK_DIR
but does not set GHJK_DATA_DIR
. If the code depends on ghjkDataDir
in other places, consider adding it here for consistency. Otherwise, confirm that it’s intentionally omitted.
21-21
: Doc comment is consistent with the POSIX version.
The same note about “embedded deno runtime” is repeated for the fish function. Keep documentation synchronized across shells.
29-29
: Potential quoting for fish CLI invocation.
If $argv
has arguments with special characters or spaces, consider adding proper quoting or escaping. For most cases, this approach is fine, but it’s safer to confirm shell parsing for edge cases.
install.ts (3)
10-12
: Good practice: Preloading vital modules.
Preloading modules before running install steps is a helpful design. It prevents potential runtime fetch delays, especially in CI scenarios.
14-14
: Entry point condition is well-structured.
Checking import.meta.main
clarifies that this script is intended as a direct CLI entry point. Nice approach.
30-31
: Use of ghjkDataDir
aligns with new naming.
Great job unifying the naming convention across the codebase. Ensure external references (like docs or environment variable documentation) also reflect the updated GHJK_DATA_DIR
.
tests/portsOutdated.ts (2)
7-7
: Clarify naming consistency for omitted properties
You're now omitting "fs"
rather than "tsGhjkfileStr"
, which may better reflect the updated design. Ensure that all references to the old property are removed or updated elsewhere in the code.
40-51
: Check usage for new "fs" property
The new field fs
is a well-structured approach to defining file contents for tests. Verify if other test harness calls also adopt this pattern for consistency and maintainability.
tests/envHooks.ts (2)
Line range hint 52-56
: Confirm correctness of omitted properties
You're now omitting "fs"
instead of "tsGhjkfileStr"
. Ensure you have updated all references so that no extraneous 'tsGhjkfileStr'
references remain.
63-63
: Validate interactive shell usage
Using bash --rcfile $BASH_ENV -si
is a neat approach to simulate an interactive shell environment. Make sure that $BASH_ENV
is being set up properly for all your test scenarios.
tests/hashfile.ts (1)
9-53
: Ensure all "invalidated_*" scenarios are thoroughly tested
These test cases cover a range of file modification scenarios. Confirm that each scenario is indeed triggering and verifying the correct code paths. Consider adding corner cases (e.g., partial file removals) to strengthen coverage.
tools/dev.ts (3)
17-17
: Rename variable references consistently
Renaming ghjkShareDir
to ghjkDataDir
clarifies its purpose. Thoroughly update references in other files or scripts so that references to the old name are fully removed.
22-29
: Validate generated script permissions
Writing a shell script with mode: 0o700
is correct for an executable. Verify that this is the intended permission level in all deployment scenarios to avoid accidental exposure in multi-user environments.
32-37
: Check environment variable usage
You've introduced GHJK_DATA_DIR
and GHJK_CONFIG_DIR
. Confirm that any references to GHJK_SHARE_DIR
or redundant environment settings are removed to prevent confusion or conflicts across the codebase.
tests/tasks.ts (2)
7-7
: Switch from "tsGhjkfileStr"
to "fs"
looks good.
This change simplifies the test case structure and aligns with the new file-based approach.
174-185
: Ensure consistent usage of the new fs
property.
This refactoring correctly initializes the file system content within the fs
object. Verify that references to ghjkTs
elsewhere in the test suite are updated accordingly.
install/mod.ts (2)
100-106
: Refactored InstallArgs
to use ghjkDataDir
.
The removal of the old properties and the addition of ghjkDataDir
make the installation logic more coherent. No further issues found.
170-178
: Shell hook installation logic is solid.
Installs the GHJK hook script into the user’s shell RC. The chosen approach is straightforward. No issues found.
ports/asdf.ts (2)
127-127
: Directory creation for download path is correct.
Ensuring the directory exists before invoking the download script helps avoid file path errors.
140-140
: Directory creation for install path is correct.
Similar to the download path change, this prevents installation failures due to missing directories.
tests/ports.ts (3)
9-9
: Refactor from tsGhjkfileStr
to fs
.
This unifies the test setup structure, making it easier to manage generated test files.
31-38
: New jq
test using asdf plugin.
This test effectively verifies the integration of the jq
plugin from the specified repository. Good addition for coverage.
222-233
: Harness updated with the fs
object.
Generating ghjk.ts
ensures each test scenario has its own specialized configuration file. Confirm that test cleanup scripts remove these files if ephemeral.
tests/reloadHooks.ts (1)
211-212
: Verify presence of $BASH_ENV
.
While specifying --rcfile $BASH_ENV
helps isolate the test environment, ensure $BASH_ENV
is set within all relevant testing contexts. Otherwise, bash
might fail to locate the file.
tests/envs.ts (2)
50-50
: Review potential environment leak.
Printing all environment variables via env
can expose credentials in CI logs. If secrets or sensitive data could be present, consider filtering them or removing this statement.
[security/PII]
61-61
: Ensure error checking around $?
Capturing the exit status with echo $?
is informative, but there's no subsequent handling. Consider verifying or asserting this value if you intend to test for success or failure.
modules/envs/posix.ts (3)
205-205
: Double-check data directory usage.
Renaming _ghjk_data_dir
clarifies its purpose. Ensure references in any related scripts or logic are updated accordingly to avoid confusion or broken paths.
214-214
: Handle edge cases when substituting $dataDirVar
.
The .replace(gcx.ghjkDataDir.toString(), "$" + dataDirVar)
logic may fail if ghjkDataDir
is somehow a substring of a path segment. Consider anchoring string replacements or validating them.
373-374
: Consistent naming of function calls.
For the fish-based shim function, maintaining a parallel naming scheme to the POSIX code can aid readability. Double-check that ghjk_fish
matches naming conventions in other shells.
modules/ports/sync.ts (1)
56-56
: Validate the existence of ghjkDataDir
.
Using gcx.ghjkDataDir
in portsPath
implies that directory creation or assignment logic is complete elsewhere. Confirm that ghjkDataDir
is never empty or undefined.
src/ghjk/js/runtime.js (1)
1-2
: Verify type definition file existence
The reference to ./runtime.d.ts
is crucial for type safety. Ensure this file exists and contains the corresponding type definitions.
✅ Verification successful
Type definition file exists and is properly defined
The referenced type definition file ./runtime.d.ts
exists at src/ghjk/js/runtime.d.ts
and contains the complete type definitions for the GhjkNs
interface, including:
-
blackboard
operations for get/set -
callbacks
registration -
hostcall
for async operations - Exception handling via
dispatchException
The type safety between JavaScript and Rust is properly maintained through these definitions.
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Check if runtime.d.ts exists and contains GhjkNs type
fd -t f "runtime.d.ts" -x cat {} | grep -A 5 "interface GhjkNs"
Length of output: 65
Script:
#!/bin/bash
# Let's first check if the file exists and see its content
fd -t f "runtime.d.ts" -x cat {}
Length of output: 603
Script:
#!/bin/bash
# As a backup, let's search for any .d.ts files in the src/ghjk directory
fd -t f ".+\.d\.ts$" src/ghjk
Length of output: 56
Script:
#!/bin/bash
# Let's also check the directory structure around runtime.js
ls -la "$(dirname $(fd "runtime.js" | grep "src/ghjk"))"
Length of output: 207
Cargo.toml (1)
12-15
: Verify Deno fork compatibility and security
Using a custom Deno fork introduces potential security and maintenance risks:
- The fork might lag behind security updates from the main Deno repository
- The specific version pinning of deno_core is tightly coupled to the fork
✅ Verification successful
Fork is reasonably up-to-date and follows stable releases
The custom Deno fork at metatypedev/deno
branch v2.1.2-embeddable
was last updated on December 4th, 2024, which aligns with the v2.1.2 release timeline from the upstream Deno repository (released on November 28th, 2024). The fork is tracking stable releases and is only about 2 minor versions behind (v2.1.4).
Let's verify the specific modifications made in the fork to ensure they are minimal and focused on embedding capabilities:
Let me try a different approach to check the fork's modifications:
Custom Deno fork appears to be maintained and minimal
Based on the verification:
- The fork is tracking stable Deno releases (based on v2.1.2)
- Last update was on Dec 4th, 2024, only one week behind the latest release (v2.1.4)
- The fork contains minimal modifications (single commit "feat: lib")
- The pinned deno_core version (0.323.0) aligns with the Deno v2.1.2 release timeframe
The version constraints and fork usage appear to be a deliberate choice for embedding capabilities, with reasonable maintenance practices in place. The security risk is minimal as the fork closely tracks upstream releases.
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Check if the fork is up to date with upstream
gh api repos/metatypedev/deno/commits/v2.1.2-embeddable --jq '.commit.committer.date'
# Compare with upstream Deno releases
gh api repos/denoland/deno/releases --jq '.[0:5] | .[] | {tag_name, published_at}'
Length of output: 491
Script:
#!/bin/bash
# Check the fork's README or documentation for embedding-specific changes
gh api repos/metatypedev/deno/contents/README.md --ref v2.1.2-embeddable | jq -r '.content' | base64 -d
# Look for any embedding-related modifications in recent commits
gh api repos/metatypedev/deno/commits --ref v2.1.2-embeddable --jq '[.[0:3] | .[] | {message: .commit.message, date: .commit.committer.date}]'
Length of output: 3073
Script:
#!/bin/bash
# Check the fork's comparison with upstream
gh api repos/metatypedev/deno/compare/denoland:v2.1.2...metatypedev:v2.1.2-embeddable --jq '.commits[] | {message: .commit.message, date: .commit.committer.date}'
# Check if there are any embedding-related files or modifications
gh api repos/metatypedev/deno/git/trees/v2.1.2-embeddable?recursive=1 --jq '.tree[] | select(.path | contains("embed"))'
Length of output: 343
src/ghjk/main.rs (3)
1-29
: Well-organized module structure!
The interlude module provides a clean centralized import point with logically grouped dependencies, making the codebase more maintainable.
47-52
: Verify signal handler implementation
The FIXME comments indicate pending improvements for the signal handler implementation. Consider tracking these improvements.
60-64
: Verify single-threaded runtime choice
The application uses a single-threaded tokio runtime. Ensure this is intentional and sufficient for the expected workload.
✅ Verification successful
Let me check the actual usage of async operations to better understand the concurrency requirements.
Let me check the actual usage context of these async operations to understand if they truly need concurrent execution.
Single-threaded runtime is appropriate for this workload
The single-threaded runtime choice is appropriate for this application based on the following analysis:
-
The async operations are primarily I/O-bound tasks (file operations, command execution) rather than CPU-intensive work:
- File operations (reading/writing config, lockfiles)
- Command execution and environment management
- No heavy computational tasks running in parallel
-
The concurrent operations found are lightweight and don't require true parallelism:
- Concurrent file reads for hash and lock files
- Task monitoring via
tokio::spawn
in limited scenarios - No heavy parallel processing patterns
-
The application is a CLI tool where most operations are sequential by nature, and the async runtime is mainly used for efficient I/O handling rather than parallel computation.
The current single-threaded runtime configuration is sufficient for the application's needs and aligns well with its usage patterns.
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Search for concurrent operations that might benefit from multi-threading
rg -l 'tokio::spawn|futures::join|\.await'
Length of output: 338
Script:
#!/bin/bash
# Check for tokio::spawn usage to understand concurrent task spawning
rg 'tokio::spawn' -B 2 -A 2
# Also check for any parallel processing patterns
rg 'parallel|concurrent' -B 2 -A 2
Length of output: 1960
Script:
#!/bin/bash
# Check the context of async operations in key files
rg '\.await' -B 2 -A 2 src/ghjk/cli.rs src/ghjk/host.rs
# Also check if there's any documentation about runtime requirements
fd README.md --exec cat {}
Length of output: 13838
src/ghjk/Cargo.toml (1)
57-58
: Review exact version pinning strategy
The futures crate is pinned to an exact version (=0.3.30). Consider if this strict pinning is necessary or if a more flexible version constraint would be more appropriate.
✅ Verification successful
Exact version pinning is consistent with project's dependency strategy
Looking at the Cargo.toml files, there's a clear pattern of exact version pinning for critical dependencies:
-
deno_core = "=0.323.0"
(with a warning comment about tracking deno version) -
clap = "=4.5"
(with a warning about matching deno's version) clap_complete = "=4.5.24"
futures = "=0.3.30"
The exact pinning of the futures crate appears to be intentional and consistent with the project's dependency management strategy, particularly for dependencies that need version synchronization or stability. This is especially important given the project's heavy use of async functionality and its integration with the Deno runtime.
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Check for other dependencies that might need exact pinning
rg '=' Cargo.toml | grep -E 'version = "='
Length of output: 42
Script:
#!/bin/bash
# Let's try a different approach to find all Cargo.toml files and check their dependencies
fd Cargo.toml --type f --exec cat {}
Length of output: 3775
src/ghjk/host/deno.rs (2)
5-12
: LGTM! Well-structured serialization type
The struct is properly designed for Deno integration with appropriate field naming conventions.
49-55
: Good security practice with restricted permissions!
The Deno worker is configured with minimal permissions by default, following the principle of least privilege.
.github/workflows/tests.yml (2)
33-33
: LGTM: Improved workflow structure
The addition of timeouts and proper job organization enhances the workflow's reliability and maintainability.
Also applies to: 51-51
37-37
: LGTM: Rust toolchain integration
The addition of rust-toolchain setup steps across all test jobs aligns well with the Rust rewrite objective.
Also applies to: 68-68, 93-93
modules/tasks/mod.ts (2)
54-92
: LGTM: Enhanced CLI command structure
The command structure is well-organized with:
- Proper type safety using CliCommand[]
- Sorted subcommands for better UX
- Clear visibility control through namedSet
- Proper argument handling with trailing_var_arg support
25-25
: LGTM: Simplified context management
The removal of explicit context parameters in favor of this.gcx
reduces boilerplate while maintaining proper context access. This change makes the code more maintainable and aligns with modern TypeScript practices.
Also applies to: 50-50, 96-96
.github/workflows/release.yml (2)
64-65
: Configure custom runner label in actionlint.yaml
The "custom-arm" label needs to be configured in actionlint.yaml, similar to the issue in the test workflow.
🧰 Tools
🪛 actionlint (1.7.4)
64-64: label "custom-arm" is unknown. available labels are "windows-latest", "windows-latest-8-cores", "windows-2022", "windows-2019", "ubuntu-latest", "ubuntu-latest-4-cores", "ubuntu-latest-8-cores", "ubuntu-latest-16-cores", "ubuntu-24.04", "ubuntu-22.04", "ubuntu-20.04", "macos-latest", "macos-latest-xl", "macos-latest-xlarge", "macos-latest-large", "macos-15-xlarge", "macos-15-large", "macos-15", "macos-14-xl", "macos-14-xlarge", "macos-14-large", "macos-14", "macos-13-xl", "macos-13-xlarge", "macos-13-large", "macos-13", "macos-12-xl", "macos-12-xlarge", "macos-12-large", "macos-12", "self-hosted", "x64", "arm", "arm64", "linux", "macos", "windows". if it is a custom label for self-hosted runner, set list of labels in actionlint.yaml config file
(runner-label)
38-90
: LGTM: Well-structured release process
The release workflow is well-designed with:
- Proper platform matrix including ARM support
- Controlled artifact overwrite behavior
- Proper dependency on check-bump job
- Efficient use of sccache for faster builds
🧰 Tools
🪛 actionlint (1.7.4)
64-64: label "custom-arm" is unknown. available labels are "windows-latest", "windows-latest-8-cores", "windows-2022", "windows-2019", "ubuntu-latest", "ubuntu-latest-4-cores", "ubuntu-latest-8-cores", "ubuntu-latest-16-cores", "ubuntu-24.04", "ubuntu-22.04", "ubuntu-20.04", "macos-latest", "macos-latest-xl", "macos-latest-xlarge", "macos-latest-large", "macos-15-xlarge", "macos-15-large", "macos-15", "macos-14-xl", "macos-14-xlarge", "macos-14-large", "macos-14", "macos-13-xl", "macos-13-xlarge", "macos-13-large", "macos-13", "macos-12-xl", "macos-12-xlarge", "macos-12-large", "macos-12", "self-hosted", "x64", "arm", "arm64", "linux", "macos", "windows". if it is a custom label for self-hosted runner, set list of labels in actionlint.yaml config file
(runner-label)
src/denort/promises.rs (3)
17-31
: LGTM: Well-documented function signature
The function signature and documentation clearly explain the purpose and side effects of the promise wrapper.
59-62
: LGTM: Proper cleanup on runtime shutdown
Good handling of runtime shutdown cases with proper cleanup of external references.
Also applies to: 65-68
32-38
:
Critical: Potential memory safety issue in handler retrieval
The get_handler
function performs unsafe operations that could lead to memory safety issues:
- Converting raw pointer to Box
- Taking ownership of the closure
- No synchronization for potential concurrent access
Consider this safer approach:
-fn get_handler<F>(external: v8::Local<v8::External>) -> F {
- unsafe { Box::<Option<F>>::from_raw(external.value() as _) }
- .take()
- .unwrap()
-}
+fn get_handler<F>(external: v8::Local<v8::External>) -> Option<F> {
+ let ptr = external.value() as *mut Option<F>;
+ unsafe { (*ptr).take() }
+}
Likely invalid or redundant comment.
src/ghjk/log.rs (1)
3-5
: LGTM: Thread-safe initialization
Good use of std::sync::Once
to ensure thread-safe single initialization.
install/hook.sh (1)
112-112
: LGTM! Improved robustness with file existence check.
The additional check for file existence ([ -e "$GHJK_LAST_ENV_DIR/activate.sh" ]
) prevents potential errors that could occur when trying to get the modification time of a non-existent file.
src/ghjk/ext.rs (1)
15-24
: Consider adding retry mechanism for extension initialization.
The extension initialization could fail silently if the tokio::LocalSet is not properly set up. Consider adding a retry mechanism or better error handling.
Run this script to check for potential initialization failures:
src/ghjk/systems.rs (1)
132-137
: Add validation for CLI command names.
The SystemCliCommand
struct should validate that command names don't contain spaces or special characters that could cause issues in the CLI.
README.md (3)
3-3
: LGTM! Clear and accurate description update.
The new description better reflects the tool's purpose as a comprehensive developer environment management solution.
154-155
: LGTM! Enhanced test filtering capability.
The addition of the --filter
option improves developer experience by allowing targeted test execution.
49-49
: Verify version consistency across documentation.
The version has been updated to v0.3.0-rc.1 consistently in import statements and installation instructions.
Also applies to: 64-66
✅ Verification successful
Let me verify the exact version references in these files to ensure consistency.
Version v0.3.0-rc.1 is consistently used across all documentation and configuration files
The version v0.3.0-rc.1
(or 0.3.0-rc.1
without the 'v' prefix in some cases) is consistently referenced across:
- README.md: In installation command and import statements
- ghjk.ts: In
GHJK_VERSION
constant - Cargo.toml: In version field
- docs/manual.md: In installation command, URL reference, and Docker ARG
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Description: Verify version consistency across documentation and configuration files
# Test: Search for version references to ensure they match v0.3.0-rc.1
rg -l "0\.3\.0-rc\.1"
Length of output: 78
Script:
#!/bin/bash
# Check the actual version strings in the identified files
echo "=== README.md ==="
rg "0\.3\.0-rc\.1" README.md
echo -e "\n=== ghjk.ts ==="
rg "0\.3\.0-rc\.1" ghjk.ts
echo -e "\n=== Cargo.toml ==="
rg "0\.3\.0-rc\.1" Cargo.toml
echo -e "\n=== docs/manual.md ==="
rg "0\.3\.0-rc\.1" docs/manual.md
Length of output: 816
install.sh (5)
5-13
: LGTM! Essential dependency checks added.
Good addition of dependency checks with clear error messages for missing requirements.
24-26
: LGTM! Dynamic version detection.
The script now automatically detects the latest version from GitHub releases, making it more maintainable.
37-77
: LGTM! Comprehensive platform detection.
The platform detection logic is thorough and includes:
- Support for multiple architectures
- Clear user guidance when platform cannot be detected
- Proper handling of Windows, Linux, and macOS
114-125
: LGTM! Important directory permission check.
Critical security improvement by verifying write permissions before installation.
133-174
: LGTM! User-friendly shell configuration.
Excellent addition of shell configuration handling:
- Supports multiple shell types (bash, zsh, fish, ksh)
- Interactive prompt for PATH configuration
- Clear instructions for manual configuration
ghjk.ts (3)
12-21
: LGTM! Well-structured Rust configuration.
Good practice to:
- Keep Rust version in sync with toolchain file
- Include essential components like rust-src
29-54
: LGTM! Comprehensive logging configuration.
Well-structured logging setup with granular control over different modules.
Line range hint 148-205
: LGTM! Comprehensive version management in lock-sed task.
The task properly handles version updates across multiple files with appropriate ignore patterns.
src/ghjk/utils.rs (3)
10-11
: LGTM! Good choice of hash implementation.
Using dashmap
with ahash
is a good choice for concurrent hash maps, as ahash
provides good performance characteristics.
20-27
: LGTM! Well-documented borrowed implementation.
The attribution to Bevy's implementation is properly documented with the license information.
141-165
: Consider adding hash function benchmarks.
The hash functions are well-implemented, but it would be beneficial to benchmark them with different input sizes to ensure optimal performance.
Run the following script to check for existing benchmarks:
✅ Verification successful
Let me check the content of these files to see if they contain hash-related benchmarks.
Let me check if there are any benchmark-specific files or test files that might contain performance tests.
Let me check the test directory for any hash-related tests that might include performance tests.
Consider adding hash function benchmarks
Based on the verification, there are currently no performance benchmarks for the hash functions in the codebase. While tests/hashfile.ts
exists, it only contains functional tests for file invalidation scenarios, not performance benchmarks. Given that these hash functions are utility functions that might be called frequently, having performance benchmarks would indeed be valuable to:
- Measure performance with different input sizes
- Track performance changes over time
- Compare performance across different hash implementations
Consider using the Rust benchmark framework or Criterion.rs for implementing these benchmarks.
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Description: Check for benchmark files
rg -l 'bench|criterion|test.*hash'
Length of output: 76
Script:
#!/bin/bash
# Check content of the found files for hash-related benchmarks
echo "=== Content of tests/hashfile.ts ==="
rg -A 5 -B 5 'hash' tests/hashfile.ts
echo -e "\n=== Content of modules/tasks/exec.ts ==="
rg -A 5 -B 5 'hash' modules/tasks/exec.ts
Length of output: 3379
Script:
#!/bin/bash
# Look for benchmark-specific files and directories
echo "=== Looking for benchmark files ==="
fd -t f "bench|criterion|perf"
echo -e "\n=== Looking for test directories ==="
fd -t d "tests|test|benches|benchmark"
echo -e "\n=== Check for Cargo.toml for any benchmark dependencies ==="
rg "criterion|bench" Cargo.toml || echo "No Cargo.toml found or no matches"
Length of output: 496
Script:
#!/bin/bash
# Look for hash-related tests in the test directory
echo "=== Looking for hash-related tests ==="
fd . tests -t f -x rg -l "hash.*test|test.*hash|#\[test\].*hash"
echo -e "\n=== Check for any performance-related code in Rust files ==="
rg -l "performance|benchmark|criterion" src/
Length of output: 355
src/ghjk/ext/callbacks.rs (2)
16-26
: Well-structured error handling!
The error enum provides comprehensive error categorization with proper error chaining using thiserror.
192-196
: Verify safety of transmute operation
The current implementation uses an unsafe transmute between SendPtr<v8::Function>
and v8::Local<v8::Function>
. While the comment indicates this pattern is from the Deno codebase, it's crucial to:
- Document the safety invariants that must be maintained
- Consider adding runtime checks to verify these invariants
.ghjk/lock.json (1)
Line range hint 3-1071
: Well-structured configuration with clear versioning
The configuration file maintains a clear structure with:
- Proper version tracking for all components
- Comprehensive platform support definitions
- Well-organized dependency relationships
🧰 Tools
🪛 Gitleaks (8.21.2)
366-366: Detected a Generic API Key, potentially exposing access to various services and sensitive operations.
(generic-api-key)
372-372: Detected a Generic API Key, potentially exposing access to various services and sensitive operations.
(generic-api-key)
Replaces the host and CLI sections of ghjk with a rust implementation.
Solves Custom deno runtime #93,
Updates to Deno
2.0.62.12Host
CLI refactor: rewrite in rust (cli) #108
Track dynamic imports in
hash.json
#74...
Summary by CodeRabbit
Release Notes for v0.3.0-rc.1
New Features
Improvements
Bug Fixes
Documentation
Breaking Changes
ghjkShareDir
toghjkDataDir