Skip to content

Add Claude Code GitHub Workflow#1

Merged
arcaputo3 merged 2 commits intomainfrom
add-claude-github-actions-1762799850260
Nov 10, 2025
Merged

Add Claude Code GitHub Workflow#1
arcaputo3 merged 2 commits intomainfrom
add-claude-github-actions-1762799850260

Conversation

@arcaputo3
Copy link
Copy Markdown
Contributor

🤖 Installing Claude Code GitHub App

This PR adds a GitHub Actions workflow that enables Claude Code integration in our repository.

What is Claude Code?

Claude Code is an AI coding agent that can help with:

  • Bug fixes and improvements
  • Documentation updates
  • Implementing new features
  • Code reviews and suggestions
  • Writing tests
  • And more!

How it works

Once this PR is merged, we'll be able to interact with Claude by mentioning @claude in a pull request or issue comment.
Once the workflow is triggered, Claude will analyze the comment and surrounding context, and execute on the request in a GitHub action.

Important Notes

  • This workflow won't take effect until this PR is merged
  • @claude mentions won't work until after the merge is complete
  • The workflow runs automatically whenever Claude is mentioned in PR or issue comments
  • Claude gets access to the entire PR or issue context including files, diffs, and previous comments

Security

  • Our Anthropic API key is securely stored as a GitHub Actions secret
  • Only users with write access to the repository can trigger the workflow
  • All Claude runs are stored in the GitHub Actions run history
  • Claude's default tools are limited to reading/writing files and interacting with our repo by creating comments, branches, and commits.
  • We can add more allowed tools by adding them to the workflow file like:
allowed_tools: Bash(npm install),Bash(npm run build),Bash(npm run lint),Bash(npm run test)

There's more information in the Claude Code action repo.

After merging this PR, let's try mentioning @claude in a comment on any PR to get started!

@arcaputo3 arcaputo3 merged commit 3de052d into main Nov 10, 2025
2 checks passed
@arcaputo3 arcaputo3 deleted the add-claude-github-actions-1762799850260 branch November 10, 2025 18:38
@claude
Copy link
Copy Markdown

claude Bot commented Nov 10, 2025

Code Review: Claude Code GitHub Workflow Integration

Thank you for adding Claude Code integration! I've reviewed the PR against the XL project's conventions and standards.

Strengths

  1. Clear Documentation: The PR description thoroughly explains what Claude Code does, how it works, and security considerations.

  2. Appropriate Permissions: Both workflows follow least-privilege principles with read-only access to contents, PRs, and issues.

  3. Secure Secret Management: Uses GitHub Actions secrets for the Anthropic API key.

  4. Dual Workflow Pattern: Smart separation between interactive @claude mentions and automated PR reviews.

Issues & Recommendations

1. Scala/Mill-Specific Path Filters (Medium Priority)

The commented-out path filters are for TypeScript/JavaScript. Update to match XL's Scala 3 structure in xl-core, xl-macros, xl-ooxml, xl-cats-effect modules plus build.mill and .scalafmt.conf.

2. Missing Mill Build Tool Integration (High Priority)

Add Mill commands to allowed-tools so Claude can run ./mill __.checkFormat, ./mill __.compile, and ./mill __.test. This enables verification of formatting, compilation, and the 77 property-based tests.

3. CLAUDE.md Integration Not Enforced

Enhance the review prompt to explicitly instruct Claude to read CLAUDE.md and reference project-specific conventions: purity requirements, opaque types, Monoid laws, deterministic XML output, and 90%+ test coverage targets.

4. Security Documentation

Document that GitHub Actions automatically restricts workflow triggers to users with write access. Add a comment in claude.yml explaining this permission model.

5. Automated Review Timing

The workflow triggers on every push (synchronize event). Consider filtering to opened and ready_for_review only, or document that contributors should expect reviews on every push.

6. Missing CI Integration

Instruct Claude in the prompt to check CI status or run build/test commands before providing feedback.

Overall Assessment

Verdict: Approve with requested changes

This is a valuable addition that aligns with modern AI-assisted development. The core implementation is sound, but needs customization for XL's Scala/Mill environment.

Action Items Before Merge (High Priority):

  1. Update path filters to Scala/Mill structure
  2. Add Mill build commands to allowed-tools
  3. Document security model
  4. Enhance review prompt with CLAUDE.md instructions

Great work bringing AI assistance to the project!


Review conducted by Claude Code using XL project standards from CLAUDE.md

@claude claude Bot mentioned this pull request Nov 11, 2025
13 tasks
arcaputo3 added a commit that referenced this pull request Nov 11, 2025
Addresses PR #4 critical feedback (Issue 1) and documents medium-priority
improvements for future phases.

**Critical Fix: Unsafe Fallbacks Eliminated**

Refactored SharedStrings to use direct pattern matching instead of nested
matches with unsafe fallbacks.

**Changed Functions:**
1. fromWorkbook (lines 121-131):
   - Before: Nested match with case _ => "" fallback
   - After: Direct flatMap with Option-based pattern matching
   - Eliminates "should never happen" code path

2. shouldUseSST (lines 139-146):
   - Before: Nested match with case _ => "" fallback
   - After: Direct flatMap with Option-based pattern matching
   - Safer and more idiomatic

**Benefits:**
- Eliminates unsafe fallbacks that could silently introduce empty strings
- More idiomatic Scala (flatMap + Option is the standard pattern)
- Clearer code: explicit None for non-text cells
- Type-safe: No unsafe casts or assumptions

**Verification:**
- All 698/698 tests passing
- No behavior change (just safer implementation)
- Zero compilation warnings
- Code formatted

**Documentation: Future Improvements Plan**

Created docs/plan/future-improvements.md documenting medium-priority enhancements
from PR #4 review:

**P6.5: Performance & Quality Polish (8-10 hours)**
1. O(n²) → O(1) style indexOf optimization (Styles.scala:179-181)
   - Pre-build Maps for O(1) lookups
   - Critical for workbooks with 1000+ unique styles

2. Extract whitespace check to XmlUtil.needsXmlSpacePreserve
   - DRY: Replace 5 duplicated occurrences
   - Single source of truth

3. Logging for missing/malformed files
   - Defer to P11 (comprehensive logging strategy)

4. XlsxReader error path tests (10+ tests)
   - Malformed XML, missing files, corrupt ZIP, invalid relationships

5. Full XLSX round-trip integration test
   - Verify byte-identical output on write → read → write

**Updated Planning Docs:**
- roadmap.md: Added P6.5 phase to table and remaining phases
- README.md: Added future-improvements.md as item #1 in core future work

**Note on PR #4 Issue 2 (Lens.modify):**
Reviewer asked for verification - the fix IS in the diff (optics.scala:29).
Changed from: def modify(f: A => A)(s: S): A = f(get(s))
To: def modify(f: A => A)(s: S): S = set(f(get(s)), s)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
arcaputo3 added a commit that referenced this pull request Nov 11, 2025
Addresses 3 high-priority issues identified in PR #4 code review:

**Issue #1: O(n²) Performance**
- Changed style indexOf from O(n²) to O(1) using Maps
- Pre-build fontMap, fillMap, borderMap for constant-time lookups
- Styles.scala:185-193

**Issue #2: Non-Deterministic allFills Ordering**
- Fixed .distinct using Set with non-deterministic iteration
- Replaced with manual LinkedHashSet-style tracking
- Preserves first-occurrence order for stable diffs
- Styles.scala:166-179

**Issue #3: XXE Security Vulnerability**
- Added XXE protection to XML parser
- Configured SAXParserFactory to reject DOCTYPE declarations
- Disabled external entity references
- XlsxReader.scala:205-232

**Tests Added** (+20 tests, 645 total passing):
- StylePerformanceSpec: 2 tests (1000+ styles, sub-quadratic scaling)
- DeterminismSpec: 4 tests (fill ordering, XML stability)
- SecuritySpec: 3 tests (XXE rejection, legitimate file parsing)

All existing tests pass. Code formatted with Scalafmt 3.10.1.

Fixes #1 (performance), #2 (determinism), #3 (security) from PR #4 review.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
arcaputo3 added a commit that referenced this pull request Nov 11, 2025
Marked Issues #1, #2, #3 as completed with implementation details.
Updated Definition of Done with all completed items.
Status changed to Partially Complete (3 critical fixes done, 4 medium-priority deferred).

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
arcaputo3 added a commit that referenced this pull request Nov 12, 2025
Addresses PR #8 feedback: Add property-based tests for RefType parsing,
round-trip laws, and escaped quote support.

Tests added:
- Round-trip laws for all 4 RefType variants (Cell, Range, QualifiedCell, QualifiedRange)
- Simple parsing: A1, A1:B10
- Qualified parsing: Sales!A1, Sales!A1:B10
- Quoted sheet names: 'Q1 Sales'!A1
- Escaped quotes: 'It''s Q1'!A1 ('' → ')
- Multiple escapes: 'It''s ''Q1'''!A1
- Edge cases: empty, missing ref, max length (31 chars), invalid chars
- toA1 quoting behavior (quotes names with spaces/apostrophes)
- Pattern matching on RefType variants
- Integration with ARef/CellRange parsers

Test count: 286 tests (263 + 23 new RefType tests)

Reference: PR #8 Issue #1 (High Priority)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
arcaputo3 added a commit that referenced this pull request Nov 16, 2025
Fixes two high-priority issues identified by Codex review:

Issue #1: BigDecimal Precision Loss
- Removed .toDouble conversions in FormattedParsers (3 locations)
- parseMoney, parsePercent, parseAccounting now preserve full BigDecimal precision
- Added test to verify high-precision values (1234567890.123456789)

Issue #2: Formula Parser String Literals
- Enhanced validateParentheses to respect string literals ("text")
- Tracks quote state, ignores parens inside strings
- Handles escaped quotes ("") correctly per Excel convention
- Detects unclosed strings (returns false if inString at end)
- Added 6 tests for string literal edge cases:
  - Parens inside strings: =IF(A1=")", "yes", "no")
  - Escaped quotes: =CONCATENATE("Say ""hello""", A1)
  - Multiple string literals with parens
  - Unclosed string detection
  - Nested parens with strings

Testing:
- 33 tests in FormattedParsersSpec (32 + 1 precision)
- 23 tests in FormulaInterpolationSpec (17 + 6 string literals)
- All tests passing
- Zero compilation errors

Both fixes maintain Phase 1 minimal validation scope while addressing
real bugs that would reject valid user input.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
arcaputo3 added a commit that referenced this pull request Nov 16, 2025
Adds shared utilities for detecting and optimizing compile-time constant
interpolations (Phase 2). No functional changes to existing macros yet.

Infrastructure added:
- MacroUtil.allLiterals() - Detect if all args are compile-time constants
- MacroUtil.reconstructString() - Rebuild interpolated strings from parts + literals
- MacroUtil.formatCompileError() - Format helpful compile errors

Key implementation:
- Uses quotes.reflect to check if Expr is Literal or Inlined Literal
- Enforces StringContext invariant (parts.length == literals.length + 1)
- Zero-allocation string reconstruction with StringBuilder

Testing:
- 11 new tests in MacroUtilSpec
- Covers string reconstruction edge cases (empty, single, multiple, complex)
- Tests error formatting helpers
- Tests invariant violation detection

All 385 tests passing (374 from Phase 1 + 11 new).

Part of Phase 2 implementation (PR #1 of 3).
Next: PR #2 will use these utilities to optimize ref"$literal".

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
arcaputo3 added a commit that referenced this pull request Nov 16, 2025
BREAKTHROUGH: Successfully implemented zero-overhead compile-time optimization
using Scala 3's Expr.value / FromExpr mechanism instead of manual Term matching.

Key fix:
- Replaced manual Literal/Inlined pattern matching with typed extraction
- Uses Expr.unapply[T] which leverages FromExpr[T] instances
- Properly detects both direct literals AND inline vals
- Tries String, Int, Long, Double, Boolean in order

Implementation:
- MacroUtil.extractConst() - Extract constant of specific type
- MacroUtil.constOf[T]() - Typed extraction using FromExpr
- Three-branch pattern in refImplN now works correctly:
  * No args → compile-time literal (Phase 1)
  * All inline vals → OPTIMIZED (Phase 2) ← NEW!
  * Any runtime → runtime Either (Phase 1)

Optimization now works for:
- inline val sheet = "Sales"; ref"$sheet!A1" → RefType (unwrapped)
- inline val col = "A"; row = 1; ref"$col$row" → ARef
- Direct literals: ref"${"A"}${1}" → ARef
- Runtime: def f() = "A"; ref"$f()$1" → Either (correct fallback)

Testing:
- 18 new tests in RefCompileTimeOptimizationSpec
- All tests passing (385 from PR #1 + 18 new = 403 total)
- Identity law verified: optimized === non-interpolated
- Runtime path preserved (backward compatible)

Credit: Solution based on Scala 3 macro documentation pattern for
compile-time constant detection via FromExpr.

Phase 2 is NOW FEASIBLE! 🚀

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
arcaputo3 added a commit that referenced this pull request Nov 17, 2025
Addressed last 2 medium-high priority issues from final code review.

**Issue 1: Index Shift on Sheet Deletion (Data Integrity)**
- Fixed ModificationTracker.delete to shift all higher indices down by 1
- Prevents tracking corruption when sheets are deleted
- Example: Mark sheet 10, delete sheet 5 → sheet 10 becomes sheet 9, tracker now has index 9
- Added comprehensive Scaladoc explaining index adjustment logic
- Added property test to verify shifting behavior

**Issue 2: Workbook.put() Tracking (Surgical Write Optimization)**
- Added modification tracking when put() replaces existing sheet
- New sheets (add case) don't trigger tracking - only replacement does
- Updated Scaladoc to clarify tracking behavior
- Added 2 tests: one for replace (tracks), one for add (doesn't track)

**Test Coverage:**
- Added 3 new tests (1 property test for index shifting, 2 unit tests for put tracking)
- Total: 650 tests passing (11 property tests in ModificationTrackerPropertySpec)

**Verification:**
- All tests passing including new index shift verification
- Zero compilation warnings
- Proper index adjustment prevents surgical write corruption

**Review Status:**
- Issue #1 (Index shifting): FIXED ✅
- Issue #2 (put tracking): FIXED ✅
- All false positives documented in previous commit

PR #15 fully complete and ready for merge.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
arcaputo3 added a commit that referenced this pull request Nov 17, 2025
…ation

Resolves high-priority issues from PR review:

**Issue #1: ModificationTracker.delete() Index Shifting**
- Fixed delete() to correctly shift deletedSheets indices when multiple
  deletions occur sequentially
- Key insight: shift indices first, then remove deleted index
- Added 2 property tests + 2 unit tests for sequential deletion scenarios
- Prevents incorrect surgical write targeting after deletions

**Issue #2: PreservedPartStore Size Validation**
- Added byte counter and size validation in streamTo() method
- Validates bytes written against manifest expectation
- Protection against ZIP bombs and data corruption
- Added 2 tests: one for correct size, one for mismatch detection

**Test Results:**
- All 655 tests passing
- Added 4 new tests total (ModificationTrackerPropertySpec + ModificationTrackerSpec + PreservedPartStoreSpec)
- Zero compilation warnings
- Zero WartRemover warnings

**Files Modified:**
- ModificationTracker.scala: Fixed delete() index shifting logic
- ModificationTrackerPropertySpec.scala: Added 2 property tests
- ModificationTrackerSpec.scala: Added 2 unit tests with corrected expectations
- PreservedPartStore.scala: Added size validation with byte counter
- PreservedPartStoreSpec.scala: Added 2 validation tests + helper function

Addresses: PR #15 critical review feedback (Issues #1 and #2)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
arcaputo3 added a commit that referenced this pull request Nov 20, 2025
Reduces 18 lines of explicit given names to 2 lines using Scala 3 wildcard export.

## Changes

### xl-core/src/com/tjclp/xl/extensions.scala (lines 41-42)

**Before** (11 lines):
```scala
export com.tjclp.xl.codec.CellCodec.{
  given_CellCodec_String,
  given_CellCodec_Int,
  given_CellCodec_Long,
  given_CellCodec_Double,
  given_CellCodec_BigDecimal,
  given_CellCodec_Boolean,
  given_CellCodec_LocalDate,
  given_CellCodec_LocalDateTime,
  given_CellCodec_RichText
}
```

**After** (1 line):
```scala
export com.tjclp.xl.codec.CellCodec.given
```

### xl-cats-effect/src/com/tjclp/xl/easy.scala (lines 54-55)

**Before** (11 lines): Same verbose export

**After** (1 line):
```scala
export com.tjclp.xl.extensions.given
```

## Benefits

✅ **LOC reduction**: 22 lines → 2 lines (91% reduction in export boilerplate)
✅ **Single source of truth**: Future CellWriter instances automatically included
✅ **Zero maintenance**: No need to update export lists when adding types
✅ **Cleaner code**: Leverages Scala 3's wildcard given export feature
✅ **Same behavior**: All 583 tests passing, all demos work

## Verification

- ✅ Compilation successful (zero errors)
- ✅ All 583 tests passing
- ✅ easy-mode-demo.sc: All 8 examples passing
- ✅ patch-dsl-demo.sc: DSL examples working
- ✅ demo.sc: Core features working

Addresses Code Quality Observation #1 from both PR #20 reviews.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
arcaputo3 added a commit that referenced this pull request Nov 21, 2025
…COUNT/AVERAGE bugs

Fixes two critical P1 issues identified by Codex automated review:

## Issue 1: Concatenation Operator Stub (Fixed)
**Bug**: Parser accepted `&` operator but silently discarded right operand
**Impact**: `="foo"&"bar"` parsed as just `"foo"` (data loss)
**Fix**:
- Changed parseConcatenation to return ParseError.InvalidOperator
- Added test verifying proper error message
- Documented limitation in docs/LIMITATIONS.md (planned for WI-09)

## Issue 2: COUNT/AVERAGE Parsed as SUM (Fixed)
**Bug**: parseRange always created TExpr.sum(range), causing COUNT and AVERAGE
       to execute SUM semantics
**Impact**: COUNT(A1:A10) and AVERAGE(A1:A10) both summed instead of count/average
**Fix**:
- Updated parseCountFunction to extract range and call TExpr.count(range)
- Updated parseAverageFunction to extract range and call TExpr.average(range)
- Added 3 comprehensive tests verifying correct fold types

## Test Coverage
- Added 1 concatenation error test
- Added 3 function parsing tests (COUNT, AVERAGE, fold type verification)
- Total: 55 tests (51 → 55), all passing

## Documentation
- Updated docs/LIMITATIONS.md with formula system status
- Documented WI-07 completion and concatenation limitation

Closes: PR #25 Issue #1 (concatenation stub)
Closes: PR #25 Issue #2 (COUNT/AVERAGE bug)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
@claude claude Bot mentioned this pull request Nov 21, 2025
6 tasks
arcaputo3 added a commit that referenced this pull request Nov 21, 2025
…preservation

Addresses additional HIGH PRIORITY feedback:

Issue #1: fromColumnNames() Bypasses Validation
- Changed return type to XLResult[TableSpec]
- Delegates to create() for validation
- Added unsafeFromColumnNames() for tests

Issue #2: Primary Constructor (Mitigated)
- Kept case class for equals/copy/pattern matching
- fromColumnNames now validates
- Documentation warns against direct usage

Issue #3: UID Preservation Tests
- Added round-trip test for all UIDs
- Fixed parsing: elem.attributes.asAttrMap.get("xr:uid")

All 851 tests passing (56 table tests total).

🎉 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
arcaputo3 added a commit that referenced this pull request Nov 26, 2025
Implements 4 high-impact rendering features for closer Excel parity:

1. Merged Cells (#1) - Both renderers
   - HTML: colspan/rowspan attributes on anchor cells
   - SVG: single rect spanning merged region, text centered
   - Interior cells correctly skipped in both formats

2. Text Wrapping (#2) - SVG only
   - Word-boundary text wrapping via wrapText style property
   - Multi-line rendering using tspan elements with y positioning
   - Line height calculation (1.4x font size)
   - Vertical alignment respected for wrapped text blocks

3. Indentation (#3) - Both renderers
   - HTML: padding-left CSS (~21px per indent level)
   - SVG: x-position offset with alignment awareness
   - Center alignment shifts slightly, right alignment ignores indent

4. SVG Vertical Alignment (#4)
   - Top/Middle/Bottom alignment via textYPosition helper
   - Baseline offset calculation (80% of font size)
   - Default: Bottom (Excel's default behavior)

Test coverage: 35 new tests (20 SVG + 15 HTML)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.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