Skip to content

Annotate code: explain the non-obvious operations - #30

Merged
vertesy merged 3 commits into
devfrom
codex-review/annotate-code
Aug 31, 2026
Merged

vertesy merged 3 commits into
devfrom
codex-review/annotate-code

Conversation

@vertesy

@vertesy vertesy commented Aug 30, 2026

Copy link
Copy Markdown
Owner

Summary

Adds a few targeted comments (the row-names reset trick in column.2.row.names()), and normalizes two stray bare-string "comments" into real #/# TODO: comments.

Bugs found while reading (not fixed, just flagged with # NOTE: comments)

  • read.simple.ssv(): references asTibble, which isn't a parameter of this function -- errors by default (wRownames = TRUE).
  • write.simple.xlsx(): its internal assignRownames helper uses df (undefined) instead of its own argument x -- errors whenever has_row_names = FALSE.
  • qs.2.table(): broken throughout -- qs:qread (single colon, should be ::), stringi::stri_detect isn't a real function, and base_filename/out_path are used but never defined on most branches. This function doesn't currently work for any input.

Flagging these for your call on whether/how to fix; didn't want to bundle behavior changes into a comments-only PR.

@vertesy

vertesy commented Aug 31, 2026

Copy link
Copy Markdown
Owner Author

@claude

Understand this is an annotation request, but fix the following 3 bugs that have been identified:

  1. read.simple.ssv(): references asTibble, which isn't a parameter of this function -- errors by default (wRownames = TRUE).
  2. write.simple.xlsx(): its internal assignRownames helper uses df (undefined) instead of its own argument x -- errors whenever has_row_names = FALSE.
  3. qs.2.table(): broken throughout -- qs:qread (single colon, should be ::), stringi::stri_detect isn't a real function, and base_filename/out_path are used but never defined on most branches. This function doesn't currently work for any input.

@claude

claude Bot commented Aug 31, 2026 •

Copy link
Copy Markdown

Claude finished @vertesy's task in 2m 44s —— View job


Tasks

  • Gather context (read PR diff, locate the 3 flagged functions)
  • Fix read.simple.ssv(): remove/fix bad asTibble reference
  • Fix write.simple.xlsx(): assignRownames should use x not df
  • Fix qs.2.table(): qs::qread, real string-detect function, define base_filename/out_path
  • Commit and push
  • Final summary

Summary

Fixed all 3 bugs you flagged, on top of the annotation-only diff, in commit 1ef3f08:

  1. read.simple.ssv() (R/ReadWriter.R): added the missing asTibble = FALSE parameter to the function signature (and its @param doc) — matching how read.simple.tsv()/read.simple.csv() already declare it. Previously !asTibble referenced an undefined object whenever wRownames = TRUE (the default), so the function always errored.

  2. write.simple.xlsx(): the internal assignRownames <- function(x) column.2.row.names(df, ...) now correctly uses its own argument, column.2.row.names(x, ...), instead of the undefined df. Previously this errored whenever has_row_names = FALSE.

  3. qs.2.table(): rewrote the broken parts so the function actually runs:

    • qs:qread → qs::qread
    • stringi::stri_detect(..., regex=) (not a real function) → stringi::stri_detect_regex(..., pattern=)
    • base_filename is now derived from path (strip the .qs suffix), and out_path is set consistently on every branch (tsv/csv/csv2/excel) instead of being left undefined on most of them
    • Also removed a redundant/dead duplicate excel branch that existed before the if/else if chain
    • Since stringi is now genuinely called, added it to DESCRIPTION (Imports) and NAMESPACE (importFrom(stringi, stri_detect_regex))

Not able to verify: R/Rscript isn't available in this sandbox, so I could not run R CMD check, devtools::load_all(), or the roxygen regeneration for NAMESPACE — I hand-edited NAMESPACE/DESCRIPTION to match what roxygen2::roxygenise() would produce for the new @importFrom stringi stri_detect_regex tag. Please run devtools::document() / R CMD check locally to confirm before merging.

The original comments-only annotation work from this PR is untouched; these are additive fixes layered on top per your explicit request in the trigger comment.

claude Bot pushed a commit that referenced this pull request Aug 31, 2026
- read.simple.ssv(): add missing `asTibble` parameter (was referenced
  but never defined, erroring whenever wRownames = TRUE, the default).
- write.simple.xlsx(): assignRownames() now uses its own argument `x`
  instead of the undefined `df`, fixing has_row_names = FALSE.
- qs.2.table(): fix `qs:qread` -> `qs::qread`, use the real
  `stringi::stri_detect_regex` function, and define `base_filename`/
  `out_path` on every branch so the function actually runs. Also adds
  `stringi` to Imports/NAMESPACE since it's now genuinely used.

Co-authored-by: Abel Vertesy <5101911+vertesy@users.noreply.github.com>
vertesy and others added 3 commits August 31, 2026 22:31
- read.simple.ssv(): add missing `asTibble` parameter (was referenced
  but never defined, erroring whenever wRownames = TRUE, the default).
- write.simple.xlsx(): assignRownames() now uses its own argument `x`
  instead of the undefined `df`, fixing has_row_names = FALSE.
- qs.2.table(): fix `qs:qread` -> `qs::qread`, use the real
  `stringi::stri_detect_regex` function, and define `base_filename`/
  `out_path` on every branch so the function actually runs. Also adds
  `stringi` to Imports/NAMESPACE since it's now genuinely used.

Co-authored-by: Abel Vertesy <5101911+vertesy@users.noreply.github.com>
write.simple.xlsx() requires a list of sheets; qs.2.table() was
passing the loaded table directly, which fails its
is.data.frame(x)-per-element assertion. Wrap it in a list first.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@vertesy
vertesy force-pushed the codex-review/annotate-code branch from 1ef3f08 to db3d67d Compare August 31, 2026 20:33
@vertesy
vertesy changed the base branch from main to dev August 31, 2026 20:33
@vertesy
vertesy merged commit 8431b78 into dev Aug 31, 2026
vertesy added a commit that referenced this pull request Sep 1, 2026
* docs: remove duplicate title

* Fix documentation typos and metadata (#17)

* Add AGENTS guide for repository (#19)

* Add defensive stopifnot checks to file path builder (#18)

* Annotate code: explain the non-obvious operations (#30)

* Annotate code; flag 3 pre-existing bugs (not fixed)

* Fix 3 bugs flagged in PR #30 review

- read.simple.ssv(): add missing `asTibble` parameter (was referenced
  but never defined, erroring whenever wRownames = TRUE, the default).
- write.simple.xlsx(): assignRownames() now uses its own argument `x`
  instead of the undefined `df`, fixing has_row_names = FALSE.
- qs.2.table(): fix `qs:qread` -> `qs::qread`, use the real
  `stringi::stri_detect_regex` function, and define `base_filename`/
  `out_path` on every branch so the function actually runs. Also adds
  `stringi` to Imports/NAMESPACE since it's now genuinely used.


* Fix qs.2.table()'s excel branch crashing on a bare data.frame

write.simple.xlsx() requires a list of sheets; qs.2.table() was
passing the loaded table directly, which fails its
is.data.frame(x)-per-element assertion. Wrap it in a list first.
vertesy added a commit that referenced this pull request Sep 1, 2026
* docs: remove duplicate title

* Fix documentation typos and metadata (#17)

* Add AGENTS guide for repository (#19)

* Add defensive stopifnot checks to file path builder (#18)

* Annotate code: explain the non-obvious operations (#30)

* Annotate code; flag 3 pre-existing bugs (not fixed)

* Fix 3 bugs flagged in PR #30 review

- read.simple.ssv(): add missing `asTibble` parameter (was referenced
  but never defined, erroring whenever wRownames = TRUE, the default).
- write.simple.xlsx(): assignRownames() now uses its own argument `x`
  instead of the undefined `df`, fixing has_row_names = FALSE.
- qs.2.table(): fix `qs:qread` -> `qs::qread`, use the real
  `stringi::stri_detect_regex` function, and define `base_filename`/
  `out_path` on every branch so the function actually runs. Also adds
  `stringi` to Imports/NAMESPACE since it's now genuinely used.

Co-authored-by: Abel Vertesy <5101911+vertesy@users.noreply.github.com>

* Fix qs.2.table()'s excel branch crashing on a bare data.frame

write.simple.xlsx() requires a list of sheets; qs.2.table() was
passing the loaded table directly, which fails its
is.data.frame(x)-per-element assertion. Wrap it in a list first.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

---------

Co-authored-by: claude[bot] <41898282+claude[bot]@users.noreply.github.com>
Co-authored-by: Abel Vertesy <5101911+vertesy@users.noreply.github.com>
Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>

* Address Codex review: declare stringi dependency, preserve row names on xlsx export

- DESCRIPTION: add stringi to Imports, since R/ReadWriter.R now calls
  stringi::stri_detect_regex() and NAMESPACE already declares the importFrom.
- write.simple.xlsx(): when has_row_names = FALSE, the identifier column is
  moved into row names via column.2.row.names() before writing. The final
  write.xlsx() call still passed the original has_row_names (FALSE) as
  rowNames, so those converted identifiers were dropped from the workbook.
  Track the post-conversion state separately (write_row_names) and pass that
  to write.xlsx() instead.

Co-authored-by: Abel Vertesy <5101911+vertesy@users.noreply.github.com>

---------

Co-authored-by: claude[bot] <41898282+claude[bot]@users.noreply.github.com>
Co-authored-by: Abel Vertesy <5101911+vertesy@users.noreply.github.com>
Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
vertesy added a commit that referenced this pull request Sep 1, 2026
* docs: remove duplicate title

* Fix documentation typos and metadata (#17)

* Add AGENTS guide for repository (#19)

* Add defensive stopifnot checks to file path builder (#18)

* Annotate code: explain the non-obvious operations (#30)

* Annotate code; flag 3 pre-existing bugs (not fixed)

* Fix 3 bugs flagged in PR #30 review

- read.simple.ssv(): add missing `asTibble` parameter (was referenced
  but never defined, erroring whenever wRownames = TRUE, the default).
- write.simple.xlsx(): assignRownames() now uses its own argument `x`
  instead of the undefined `df`, fixing has_row_names = FALSE.
- qs.2.table(): fix `qs:qread` -> `qs::qread`, use the real
  `stringi::stri_detect_regex` function, and define `base_filename`/
  `out_path` on every branch so the function actually runs. Also adds
  `stringi` to Imports/NAMESPACE since it's now genuinely used.

Co-authored-by: Abel Vertesy <5101911+vertesy@users.noreply.github.com>

* Fix qs.2.table()'s excel branch crashing on a bare data.frame

write.simple.xlsx() requires a list of sheets; qs.2.table() was
passing the loaded table directly, which fails its
is.data.frame(x)-per-element assertion. Wrap it in a list first.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

---------

Co-authored-by: claude[bot] <41898282+claude[bot]@users.noreply.github.com>
Co-authored-by: Abel Vertesy <5101911+vertesy@users.noreply.github.com>
Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>

* Address Codex review: declare stringi dependency, preserve row names on xlsx export

- DESCRIPTION: add stringi to Imports, since R/ReadWriter.R now calls
  stringi::stri_detect_regex() and NAMESPACE already declares the importFrom.
- write.simple.xlsx(): when has_row_names = FALSE, the identifier column is
  moved into row names via column.2.row.names() before writing. The final
  write.xlsx() call still passed the original has_row_names (FALSE) as
  rowNames, so those converted identifiers were dropped from the workbook.
  Track the post-conversion state separately (write_row_names) and pass that
  to write.xlsx() instead.

Co-authored-by: Abel Vertesy <5101911+vertesy@users.noreply.github.com>

---------

Co-authored-by: claude[bot] <41898282+claude[bot]@users.noreply.github.com>
Co-authored-by: Abel Vertesy <5101911+vertesy@users.noreply.github.com>
Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
vertesy added a commit that referenced this pull request Sep 1, 2026
* docs: remove duplicate title

* Fix documentation typos and metadata (#17)

* Add AGENTS guide for repository (#19)

* Add defensive stopifnot checks to file path builder (#18)

* Annotate code: explain the non-obvious operations (#30)

* Annotate code; flag 3 pre-existing bugs (not fixed)

* Fix 3 bugs flagged in PR #30 review

- read.simple.ssv(): add missing `asTibble` parameter (was referenced
  but never defined, erroring whenever wRownames = TRUE, the default).
- write.simple.xlsx(): assignRownames() now uses its own argument `x`
  instead of the undefined `df`, fixing has_row_names = FALSE.
- qs.2.table(): fix `qs:qread` -> `qs::qread`, use the real
  `stringi::stri_detect_regex` function, and define `base_filename`/
  `out_path` on every branch so the function actually runs. Also adds
  `stringi` to Imports/NAMESPACE since it's now genuinely used.

Co-authored-by: Abel Vertesy <5101911+vertesy@users.noreply.github.com>

* Fix qs.2.table()'s excel branch crashing on a bare data.frame

write.simple.xlsx() requires a list of sheets; qs.2.table() was
passing the loaded table directly, which fails its
is.data.frame(x)-per-element assertion. Wrap it in a list first.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

---------

Co-authored-by: claude[bot] <41898282+claude[bot]@users.noreply.github.com>
Co-authored-by: Abel Vertesy <5101911+vertesy@users.noreply.github.com>
Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>

* Address Codex review: declare stringi dependency, preserve row names on xlsx export

- DESCRIPTION: add stringi to Imports, since R/ReadWriter.R now calls
  stringi::stri_detect_regex() and NAMESPACE already declares the importFrom.
- write.simple.xlsx(): when has_row_names = FALSE, the identifier column is
  moved into row names via column.2.row.names() before writing. The final
  write.xlsx() call still passed the original has_row_names (FALSE) as
  rowNames, so those converted identifiers were dropped from the workbook.
  Track the post-conversion state separately (write_row_names) and pass that
  to write.xlsx() instead.

Co-authored-by: Abel Vertesy <5101911+vertesy@users.noreply.github.com>

* Consolidate list-of-functions cleanup into one file.remove() call (#34)

Replaces the per-file file.remove() call with a single call that matches every generated list.of.functions.in.*.det.md report by pattern (this repo generates 2: ReadWriter and Deprecated.Functions -- only the first was ever cleaned up before). The old line is commented out, not deleted.

Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>

---------

Co-authored-by: claude[bot] <41898282+claude[bot]@users.noreply.github.com>
Co-authored-by: Abel Vertesy <5101911+vertesy@users.noreply.github.com>
Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
vertesy added a commit that referenced this pull request Sep 2, 2026
* docs: remove duplicate title

* Fix documentation typos and metadata (#17)

* Add AGENTS guide for repository (#19)

* Add defensive stopifnot checks to file path builder (#18)

* Annotate code: explain the non-obvious operations (#30)

* Annotate code; flag 3 pre-existing bugs (not fixed)

* Fix 3 bugs flagged in PR #30 review

- read.simple.ssv(): add missing `asTibble` parameter (was referenced
  but never defined, erroring whenever wRownames = TRUE, the default).
- write.simple.xlsx(): assignRownames() now uses its own argument `x`
  instead of the undefined `df`, fixing has_row_names = FALSE.
- qs.2.table(): fix `qs:qread` -> `qs::qread`, use the real
  `stringi::stri_detect_regex` function, and define `base_filename`/
  `out_path` on every branch so the function actually runs. Also adds
  `stringi` to Imports/NAMESPACE since it's now genuinely used.

Co-authored-by: Abel Vertesy <5101911+vertesy@users.noreply.github.com>

* Fix qs.2.table()'s excel branch crashing on a bare data.frame

write.simple.xlsx() requires a list of sheets; qs.2.table() was
passing the loaded table directly, which fails its
is.data.frame(x)-per-element assertion. Wrap it in a list first.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

---------

Co-authored-by: claude[bot] <41898282+claude[bot]@users.noreply.github.com>
Co-authored-by: Abel Vertesy <5101911+vertesy@users.noreply.github.com>
Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>

* Address Codex review: declare stringi dependency, preserve row names on xlsx export

- DESCRIPTION: add stringi to Imports, since R/ReadWriter.R now calls
  stringi::stri_detect_regex() and NAMESPACE already declares the importFrom.
- write.simple.xlsx(): when has_row_names = FALSE, the identifier column is
  moved into row names via column.2.row.names() before writing. The final
  write.xlsx() call still passed the original has_row_names (FALSE) as
  rowNames, so those converted identifiers were dropped from the workbook.
  Track the post-conversion state separately (write_row_names) and pass that
  to write.xlsx() instead.

Co-authored-by: Abel Vertesy <5101911+vertesy@users.noreply.github.com>

* Consolidate list-of-functions cleanup into one file.remove() call (#34)

Replaces the per-file file.remove() call with a single call that matches every generated list.of.functions.in.*.det.md report by pattern (this repo generates 2: ReadWriter and Deprecated.Functions -- only the first was ever cleaned up before). The old line is commented out, not deleted.

Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>

---------

Co-authored-by: claude[bot] <41898282+claude[bot]@users.noreply.github.com>
Co-authored-by: Abel Vertesy <5101911+vertesy@users.noreply.github.com>
Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
vertesy added a commit that referenced this pull request Sep 2, 2026
* docs: remove duplicate title

* Fix documentation typos and metadata (#17)

* Add AGENTS guide for repository (#19)

* Add defensive stopifnot checks to file path builder (#18)

* Annotate code: explain the non-obvious operations (#30)

* Annotate code; flag 3 pre-existing bugs (not fixed)

* Fix 3 bugs flagged in PR #30 review

- read.simple.ssv(): add missing `asTibble` parameter (was referenced
  but never defined, erroring whenever wRownames = TRUE, the default).
- write.simple.xlsx(): assignRownames() now uses its own argument `x`
  instead of the undefined `df`, fixing has_row_names = FALSE.
- qs.2.table(): fix `qs:qread` -> `qs::qread`, use the real
  `stringi::stri_detect_regex` function, and define `base_filename`/
  `out_path` on every branch so the function actually runs. Also adds
  `stringi` to Imports/NAMESPACE since it's now genuinely used.

Co-authored-by: Abel Vertesy <5101911+vertesy@users.noreply.github.com>

* Fix qs.2.table()'s excel branch crashing on a bare data.frame

write.simple.xlsx() requires a list of sheets; qs.2.table() was
passing the loaded table directly, which fails its
is.data.frame(x)-per-element assertion. Wrap it in a list first.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

---------

Co-authored-by: claude[bot] <41898282+claude[bot]@users.noreply.github.com>
Co-authored-by: Abel Vertesy <5101911+vertesy@users.noreply.github.com>
Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>

* Address Codex review: declare stringi dependency, preserve row names on xlsx export

- DESCRIPTION: add stringi to Imports, since R/ReadWriter.R now calls
  stringi::stri_detect_regex() and NAMESPACE already declares the importFrom.
- write.simple.xlsx(): when has_row_names = FALSE, the identifier column is
  moved into row names via column.2.row.names() before writing. The final
  write.xlsx() call still passed the original has_row_names (FALSE) as
  rowNames, so those converted identifiers were dropped from the workbook.
  Track the post-conversion state separately (write_row_names) and pass that
  to write.xlsx() instead.

Co-authored-by: Abel Vertesy <5101911+vertesy@users.noreply.github.com>

* Consolidate list-of-functions cleanup into one file.remove() call (#34)

Replaces the per-file file.remove() call with a single call that matches every generated list.of.functions.in.*.det.md report by pattern (this repo generates 2: ReadWriter and Deprecated.Functions -- only the first was ever cleaned up before). The old line is commented out, not deleted.

Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>

* Fix qs.2.table to preserve directory of absolute input paths

Pass dirname(path) as manual_directory and the extensionless
basename(path) as manual_file_name for every output branch, so
construct.file.path() no longer prepends getwd() to an already
absolute filename (Codex review feedback on #38).

Co-authored-by: Abel Vertesy <5101911+vertesy@users.noreply.github.com>

---------

Co-authored-by: claude[bot] <41898282+claude[bot]@users.noreply.github.com>
Co-authored-by: Abel Vertesy <5101911+vertesy@users.noreply.github.com>
Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
vertesy added a commit that referenced this pull request Sep 2, 2026
* docs: remove duplicate title

* Fix documentation typos and metadata (#17)

* Add AGENTS guide for repository (#19)

* Add defensive stopifnot checks to file path builder (#18)

* Annotate code: explain the non-obvious operations (#30)

* Annotate code; flag 3 pre-existing bugs (not fixed)

* Fix 3 bugs flagged in PR #30 review

- read.simple.ssv(): add missing `asTibble` parameter (was referenced
  but never defined, erroring whenever wRownames = TRUE, the default).
- write.simple.xlsx(): assignRownames() now uses its own argument `x`
  instead of the undefined `df`, fixing has_row_names = FALSE.
- qs.2.table(): fix `qs:qread` -> `qs::qread`, use the real
  `stringi::stri_detect_regex` function, and define `base_filename`/
  `out_path` on every branch so the function actually runs. Also adds
  `stringi` to Imports/NAMESPACE since it's now genuinely used.

Co-authored-by: Abel Vertesy <5101911+vertesy@users.noreply.github.com>

* Fix qs.2.table()'s excel branch crashing on a bare data.frame

write.simple.xlsx() requires a list of sheets; qs.2.table() was
passing the loaded table directly, which fails its
is.data.frame(x)-per-element assertion. Wrap it in a list first.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

---------

Co-authored-by: claude[bot] <41898282+claude[bot]@users.noreply.github.com>
Co-authored-by: Abel Vertesy <5101911+vertesy@users.noreply.github.com>
Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>

* Address Codex review: declare stringi dependency, preserve row names on xlsx export

- DESCRIPTION: add stringi to Imports, since R/ReadWriter.R now calls
  stringi::stri_detect_regex() and NAMESPACE already declares the importFrom.
- write.simple.xlsx(): when has_row_names = FALSE, the identifier column is
  moved into row names via column.2.row.names() before writing. The final
  write.xlsx() call still passed the original has_row_names (FALSE) as
  rowNames, so those converted identifiers were dropped from the workbook.
  Track the post-conversion state separately (write_row_names) and pass that
  to write.xlsx() instead.

Co-authored-by: Abel Vertesy <5101911+vertesy@users.noreply.github.com>

* Consolidate list-of-functions cleanup into one file.remove() call (#34)

Replaces the per-file file.remove() call with a single call that matches every generated list.of.functions.in.*.det.md report by pattern (this repo generates 2: ReadWriter and Deprecated.Functions -- only the first was ever cleaned up before). The old line is commented out, not deleted.

Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>

* Fix qs.2.table to preserve directory of absolute input paths

Pass dirname(path) as manual_directory and the extensionless
basename(path) as manual_file_name for every output branch, so
construct.file.path() no longer prepends getwd() to an already
absolute filename (Codex review feedback on #38).

Co-authored-by: Abel Vertesy <5101911+vertesy@users.noreply.github.com>

* Fix Excel output path for QS conversion

---------

Co-authored-by: claude[bot] <41898282+claude[bot]@users.noreply.github.com>
Co-authored-by: Abel Vertesy <5101911+vertesy@users.noreply.github.com>
Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant