Commit Graph

71 Commits

Author SHA1 Message Date
Bently c9c263832e Ghidra's pseudo-C uses the names you set, in the code and in its summary (#488)
In Deep mode, Ghidra's pseudo-C uses the names set with native_name_set in the function field, the summary and the code (whole identifiers only, never inside comments, literals or fields); names that can't stand in C or would clash are listed in a limitation.
2026-11-03 14:50:54 +07:00
Afloat d5e07a8262 Report unavailable cached bodies in stand-in replay (#543)
A stand-in backend no longer replays a recorded 304 without its cached body: such samples are kept for diagnosis, skipped in replay, and a request with no usable answer gets cached_body_unavailable. Builds count them.
2026-11-03 14:50:01 +07:00
BFlat c2ad022f50 Page states select the original tab again after photographing another (#475)
Fixes #335. Before a tab is clicked, web_page_states_capture marks the tab its list has selected and clicks it again after the picture, so later states and the next capture see the page as it was.
2026-11-03 02:47:05 +07:00
BFlat 1e8f661673 A builder never continues a session another builder saved (#471)
Fixes #469. craft.json records which coding agent saved the session (agent_session_by). A build or a question continues the session only with that agent; after the builder changes, the new one starts from the brief. A follow-up to an agent with no saved session also gets the brief.
2026-11-03 02:38:46 +07:00
Bently 09401b6458 Changing a setting keeps a test session to its configured engines, and the live browser tests find the installed browser (#479)
settings_set keeps a test session's engines.only_configured across its settings round trip, so a test that changes a setting still doesn't find this computer's engines. New testing::live_session() finds installed engines for the --ignored live tests; the live website tests use it.
2026-11-03 02:29:14 +07:00
BFlat 843099abca Page states at a second width open that width's own controls (#474)
Fixes #339. web_page_states_capture drops the data-craft-state marks an earlier call left before marking, so a capture at a second width opens that width's own controls instead of a hidden one from the first width.
2026-11-03 02:24:26 +07:00
Jesse Houston f5ed134bdd Keep building with Claude Code after moving a project to another computer (#458)
Fixes #451, fixes #452, closes #446. Claude Code's result for a --resume session it doesn't have is recognised (StreamParser::session_missing); the build forgets the stale id and starts a new session from the brief, what is in app/ and what the project kept of the old conversation, and questions answer from the project's files. After every builder turn the project keeps a private copy of the session, which is put back under Claude Code's folder on another computer when it isn't there (never over an existing one).
2026-11-03 02:20:28 +07:00
BFlat 5b09ab03ab A website capture says when its HTML was cut at the size limit (#472)
Fixes #336. web_site_capture keeps the first 4 MiB of the page's HTML; when the page has more, the evidence carries an html_cut limitation with both sizes and the README says page.html is the first part, cut at the size limit.
2026-11-03 02:12:11 +07:00
Bently 7bf8220006 Test sessions find only the engines their settings name (#466)
Test sessions set engines.only_configured (never saved), so Settings::ghidra_launcher and engine_path look only where the settings and the managed store say, not on PATH or in the usual install folders. Tests now pass the same on a machine with Ghidra installed. New locate_configured and ghidra::get::headless_configured are the first half of locate and headless, which return the same as before.
2026-11-03 01:53:53 +07:00
Bently 826efdbcb8 native_function_find gives a negative offset for an address below the function's entry (#465)
native_function_find works out the offset as a signed value, so an address in a block below the function's entry gives a negative offset ("-0x70") instead of wrapping to a huge number or panicking with overflow checks.
2026-11-03 01:53:48 +07:00
GGWA ecbd519c6a Read SQLite WITHOUT ROWID tables, rows older than added columns and capped records correctly (#412)
Merges the whole SQLite stack in one commit (#410, #411 and #412): WITHOUT ROWID tables are read in primary-key order, rows older than ALTER TABLE ADD COLUMN show the added columns, and records over the payload cap say which values were cut.

Fixes #406, fixes #407, fixes #408.
2026-11-03 01:43:19 +07:00
NetterSilver 28df99e066 Report folders that couldn't be listed in archive and JS app evidence (#459)
Fixes #294. walk_dir returns an error when the root folder can't be listed and keeps each unlistable folder below it; core_archive_show and js_app_map mark those folders, add an unlisted_folders limitation and report partial coverage.
2026-11-03 01:43:12 +07:00
NetterSilver b11554d7cc Check folder inventory evidence with the scope it was recorded with (#461)
core_archive_show records max_entries and max_total_bytes, and a shared recorded_inventory helper checks a folder's freshness at the scope it was recorded with, so core_archives_compare and the Android, Apple and Harmony graph tools no longer refuse unchanged folders as file_changed.
2026-11-03 01:43:05 +07:00
NetterSilver f94cbe72db Disclose the serialized-file read limit in Unity bundle listings (#454)
game_unity_bundle_list adds a files_unread limitation when a bundle has more serialized files than it reads (16) and says "at least N object(s)" in its summary.
2026-11-03 01:42:51 +07:00
NetterSilver 5bc54ce64a Keep every tensor in a model summary's saved evidence (#457)
In summary mode formats_ai_weights_show saves every tensor in its evidence record with complete coverage, so core_evidence_browse can page through all of them instead of stopping after the first page.
2026-11-03 01:42:44 +07:00
NetterSilver 977ee5c6b5 Fetch source maps served from the script's own loopback origin (#464)
Declared source maps on the script's own loopback origin (http://127.0.0.1 or [::1] with a port) are now resolved against the script URL and fetched with the bounded HTTP client, reporting fetched, bytes or the reason. Other hosts, ports, schemes and remote https maps are still never requested.
2026-11-03 01:42:37 +07:00
BFlat bbb28b3aa6 An app folder survey says when a file couldn't be opened, and its coverage is partial (#453)
app_folder_explain counts files it couldn't open to look inside (unopened_files) and reports partial coverage then, and when its walk couldn't read something, instead of a complete 'nothing points to a runtime'. Fixes #292.
2026-11-03 00:24:10 +07:00
Afloat fed67edd38 Pinned builds keep runtime models in obj folders (R2.10) (#439)
Frozen and light pins keep a project's runtime models in assets/obj; only obj folders beside a .NET project file are left out as build output. Fixes #274.
2026-11-03 00:16:57 +07:00
muraa-p c6c8f35612 List a remote Frida device without frida-ls-devices -H (#227)
Listing Frida devices with a remote address returns that remote as one device, marked not contacted, instead of running frida-ls-devices with a -H flag it doesn't have.
2026-11-03 00:12:33 +07:00
BFlat d6780ff30e build_file_read shows a line longer than a page, cut, instead of nothing (#447)
build_file_read always shows the first line of a page, cut to 256 KiB with a note when it is longer, so a long minified line no longer reads as an empty page that no offset gets past. Fixes #280.
2026-11-03 00:00:38 +07:00
bently-bot 11166b3589 Deep mode decompiles position-independent programs by name: addresses move between our image base and Ghidra's (#426)
In Deep mode, a position-independent program is decompiled by name: addresses move between our image base and the one Ghidra loaded it at (the bridge now reports it), with engine_entry and an engine_rebased limitation when they differ.
2026-11-02 23:50:33 +07:00
Afloat fa4aae2e79 Compare WebAssembly exported tag parameter types (R0.5) (#441)
WebAssembly comparison reports changes to exported tags' parameter types. Fixes #309.
2026-11-02 23:48:32 +07:00
muraa-p a7a04333c0 Show a pin's folder from its right-click menu (#215)
A pin's right-click menu has Show folder, which opens the pinned build's folder (project_open_folder takes pin).
2026-11-02 23:47:24 +07:00
GGWA 004e1c1dfc Firmware extraction reports a region-scan cap as partial (#366)
firmware_image_extract reports a region scan stopped at its cap as truncated, partial coverage. Fixes #302.
2026-11-02 23:40:07 +07:00
GGWA f58c3a66ba Triage says a damaged ELF, PE or Mach-O header can't be read (#365)
Triage says a file that starts like an ELF, PE or Mach-O but can't be read is damaged, with the parse error, instead of calling it an unknown format. Fixes #319.
2026-11-02 23:39:40 +07:00
Max Mittelstädt df18c969b2 Allow packaged programs with crash in their names (#376)
Play's packaged-program choice skips crash reporters by name (crashreport, crashhandler, crashpad), not every name containing crash. Fixes #275.
2026-11-02 23:38:48 +07:00
Max Mittelstädt 54bef1e6e2 Trace universal helper executables (#375)
Library resolution also follows universal (fat) helper executables found in app bundles. Fixes #276.
2026-11-02 23:38:22 +07:00
GGWA 6e9fc1a3d2 External tools' stderr survives a cap inside a multibyte character (#364)
objdump's and rtl_433's stderr keep the text before a cap that falls inside a multibyte character instead of losing it all. Fixes #287.
2026-11-02 23:35:13 +07:00
phatloi0010 53586bb9cf Call resolution retains the known memory slot of an indirect import (#424)
native_call_site_resolve keeps the memory slot of a call through an import. Fixes #349.
2026-11-02 23:34:56 +07:00
phatloi0010 0c0a776ed6 Return header metadata for unencrypted IoStore containers without a directory index (#396)
Unencrypted IoStore containers without a directory index return their header facts and a not_indexed limitation, with unknown file totals. Fixes #303.
2026-11-02 23:34:29 +07:00
phatloi0010 766234ba40 Record folder truncation notices in js_sources_restore (#392)
js_sources_restore notes when a folder listing was cut short by its file-count or depth limit. Fixes #332.
2026-11-02 23:34:02 +07:00
BFlat 8f81b8edf2 Reopening raw bytes with a new architecture or address uses them (#432)
Reopening the same raw bytes with another architecture or entry point replaces the open target instead of silently keeping the first settings and caches. Fixes #305.
2026-11-02 23:32:25 +07:00
NetterSilver cf267b0f9d Recognise bare Java classes in target triage (#431)
Triage of a bare .class file says it is a compiled Java class and recommends the java toolset (java_class_show, java_classes_find) instead of calling it an unrecognised format. Fixes #348.
2026-11-02 23:29:55 +07:00
BFlat 51f48fe6f0 Live coverage and module traces record the scripts they show (#429)
web_coverage_measure and web_modules_trace settle their page size once (limit 0 shows one), and record the scripts they show as examined. Fixes #331.
2026-11-02 23:23:07 +07:00
phatloi0010 dd0731f8e9 Display annotated function name in native function tool summaries (#418)
Native function summaries use a function's annotated name after a rename. Fixes #350.
2026-11-02 23:14:04 +07:00
phatloi0010 4bb8f76158 Walkthrough preflight rejects timeout_secs values outside 1..=600 (#390)
The walkthrough check refuses timeout_secs outside 1..=600, as the recorder does. Fixes #288.
2026-11-02 23:11:25 +07:00
phatloi0010 735a96db2f URL sanitization only strips @ userinfo inside the authority (#389)
URL sanitising only strips user-info before the path, so an @ in a path or query is kept. Fixes #308.
2026-11-02 23:10:59 +07:00
phatloi0010 d7583c8063 Generated Ghidra function names parse their address suffix as hexadecimal (#388)
Generated Ghidra names such as FUN_00401000 are read as hexadecimal addresses. Fixes #318.
2026-11-02 23:10:30 +07:00
phatloi0010 b1d6f012e5 Module-filtered macOS function breakpoints omit unsupported --name-mask (#383)
Module-filtered function breakpoints on macOS no longer pass the unsupported --name-mask option to LLDB. Fixes #360.
2026-11-02 23:09:09 +07:00
phatloi0010 bcc08c0ada Truncated sBPF .text sections decode readable bytes and report partial coverage (#381)
A .text section that runs past the end of the file is decoded as far as the bytes go, with a text_truncated limitation and partial coverage. Fixes #306.
2026-11-02 22:35:15 +07:00
BFlat 9bec65baf2 The change summary counts a comparison where files only moved as changed (#345)
`app_changes_summarize` decided whether each comparison found changes. For records with `counts` it added added + removed + changed, which left out moves. So an archive or folder comparison whose only difference was a moved file (reported `identical: false`, `moved: 1`) counted as unchanged ("0 of 1 comparisons found changes").

A record's own `identical` verdict now decides when it has one, and moves count otherwise. Archive `counts.changed` keeps its meaning (content-edited files).

**Verified:** a new test of the verdict: a move-only comparison is changed (with and without `identical`), and an identical one is not. The engine's compare tests, clippy and fmt pass.

Fixes #286
2026-11-02 15:38:16 +07:00
BFlat cc2e7b7eee Comparing two runs tells a deleted file from a created one (#340)
`runtime_captures_compare` compared the filesystem dimension by the set of changed paths only. A run that deleted a watched file and a run that created the same file both "changed" that path, so they matched, and the comparison said the two runs were the same.

Each path is now compared together with how it changed (created, deleted or modified). Two deletions of the same file still match, and different paths still differ.

**Verified:** a new test of the filesystem comparison covering deleted vs created (changed), deleted vs deleted (unchanged), different paths (changed), and an `unchanged` effect against none (unchanged). The engine's process-tool tests, clippy and fmt pass.

Fixes #300
2026-11-02 15:29:06 +07:00
BFlat 460e2a3c3d The approval check allows npx vite build and still refuses dev servers (#328)
The builder's approval check refused dev servers before looking at the safe build list. `npx vite build` is on that list, but it also starts with `npx vite` (a dev server), so it was refused as one, whatever the mode or Auto setting.

A listed build is no longer read as a dev server: `npx vite build` and `cd app && npx vite build` are allowed, while `npx vite` and `npx vite --host …` are still refused. A command in watch mode (`--watch`) is now refused with the same hint, since it never exits either. That includes a listed build such as `npx vite build --watch`. The safe-list match moved into one helper used by both checks.

**Verified:** new cases in the approval tests (three spellings of the build allowed; two server forms and a watch build refused). The engine's approval tests, clippy and fmt pass.

Fixes #291
2026-11-02 15:02:34 +07:00
BFlat 09fdc72e8d Saves from two threads at once never collide or mix a project file (#311)
The engine had its own `write_atomic` (used for `craft.json`, the inbox, reports and session files). Its temp file was named by process only, so two threads saving the same file at once wrote into one temp file. One rename then found it gone ("craft.json: No such file or directory"), and the file could end up with two versions mixed ("trailing characters").

The engine now uses the platform crate's `write_atomic`, which already gave each write its own temp file and kept the file's permissions. It also gains the engine's short retry when Windows briefly can't replace a file another program holds open. There is one atomic writer now; docs/pitfalls.md says so.

**Verified:**
- A new engine test: four threads each save one file 50 times and read it back. Every save succeeds, every read is one whole version, and no temp files are left. It fails against the old engine writer (checked) and passes now.
- The existing "file held open for a moment" test still passes.
- `cargo test -p craft-anything-engine` (397), the platform fs tests, clippy on both crates and fmt.

**Not covered:** two saves that overlap can still each start from what was on disk, so the later one wins for fields that aren't the person's (the person's fields are kept, as before). That's separate from the write itself.

Fixes #273
2026-11-02 14:45:46 +07:00
BFlat d1d36cd110 android_package_show's summary says signatures are verified (#290)
`android_package_show`'s summary, shown in CLI help and the MCP tool list, said "signatures are not verified". The tool does verify them: v2/v3 signatures over the signed data with a recomputed content digest, and v1 PKCS#7 with the per-file digests. Its own `verification_scope` limitation says so. The summary now says signatures and content digests are verified, but not whether the certificate is one you trust.

**Verified:** text only. `cargo xtask tools` leaves docs/tools.md unchanged, and fmt passes.

Fixes #247
2026-11-02 14:09:26 +07:00
BFlat 9a829f7c31 A failed adb download or capture doesn't leave a folder that blocks the retry (#266)
`adb_screenshot_take`, `adb_bugreport_save`, `adb_file_download` and `adb_app_download` create their fresh `output_directory` first, then check adb and the device. A device that was offline (or a missing adb, or a failed pull) left that folder behind, empty. The retry the error recommends then failed with "already exists", without ever reaching adb.

These tools now hold the folder in a small guard (`UnlessWritten`, next to `create_absent_dir`). When the tool stops, the guard removes the folder only if nothing was written into it, so partial pulls stay. On success the tool keeps the folder.

**Verified:**
- A new test: the guard removes an empty folder, keeps one with a file in it and keeps one marked kept.
- The same test calls all four tools through the engine with adb missing: no folder is left, and the identical retry reaches the same adb error rather than "already exists". That half runs only where adb isn't installed, like the other adb tests; it was skipped here because adb is on this machine.
- `cargo test -p craft-anything-engine adb`, clippy, fmt.

**Not changed:** the website, web, firmware and packed tools create output folders the same way. They can take the guard if needed.

Fixes #234
2026-11-02 13:54:31 +07:00
BFlat c89f6603dd adb_app_show says a missing package isn't installed (#258)
`adb_app_show` treated `dumpsys package <name>` output as describing the package if it merely contained the name. Android's answer for a missing package, `Unable to find package: <name>`, contains the name, so the tool returned successful evidence with no fields and complete coverage.

It now requires that package's own `Package [<name>]` block and otherwise returns the existing `NotFound` error with the "List installed packages with adb_apps_list." remediation.

**Verified:** a unit test with Android's missing-package reply, another package's block and an installed package; `cargo test -p craft-anything-engine adb`, clippy, fmt.

**Not verified:** a run against a real device.

Fixes #235
2026-11-02 13:43:22 +07:00
BFlat 4419c674cf "It's done" keeps a build as it is and stops offering to carry on (#221)
A paused, stopped or failed build only offered Continue or Try again; there was no way to say "enough now". project_build_finish marks the project Ready and adds a Done step to its conversation, keeping everything; the project screen shows It's done beside Continue and Try again when nothing is running.

Fixes #210
2026-11-02 11:51:58 +07:00
BFlat fe6a8ad98c From the CLI, a capture with no open site says each command starts its own browser (#213)
web_site_open keeps its browser for one session, and each CLI command is a session of its own that closes its browser when it ends. From the CLI, a capture with no open site now says so, and to run the steps together in an MCP client, the app or rebuild. Documented in tool-status.

Fixes #153
2026-11-02 11:31:28 +07:00
GGWA fff225d319 The Windows pipe gap in project_play is noted in its tool help and kept as an ignored test (#212)
project_play's help says that on Windows a started program inherits the caller's output pipe (#207), and the reproducing test is kept in platform as an ignored test.
2026-11-02 11:28:57 +07:00