Skip to content
Merged

v9.3.0 #2541

Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
92 commits
Select commit Hold shift + click to select a range
aa42c2a
feat: Add support for union operator (|) for primitive types
piotrszul Dec 10, 2025
e69fa86
feat: Add support for union operator (|) for primitive types
piotrszul Dec 10, 2025
9d70259
feat: Add QuantityCollection support to union operator
piotrszul Dec 11, 2025
bc57150
feat: Add CodingCollection support to union operator
piotrszul Dec 11, 2025
73b8434
feat: Add TimeCollection support to union operator
piotrszul Dec 11, 2025
35b7980
feat: Add union operator support for Date and DateTime types
piotrszul Dec 11, 2025
52d08ae
refactor: Use comparator-based polymorphism in UnionOperator
piotrszul Dec 12, 2025
4e071d3
feat: Implement FHIRPath is() function for type checking
piotrszul Dec 15, 2025
b64e976
feat: Implement FHIRPath 'is' operator for type checking
piotrszul Dec 15, 2025
353927b
feat: Implement FHIRPath as() function for type casting
piotrszul Dec 17, 2025
ed5a526
feat: Implement FHIRPath as operator for type casting
piotrszul Dec 17, 2025
d94049f
feat: Add Quantity literal support to DSL test framework
piotrszul Dec 18, 2025
0d823eb
refactor: Use toQuantity() helper in DSL tests with YAML backward com…
piotrszul Dec 19, 2025
6b4ac21
refactor: Consolidate type function tests into TypeFunctionsDslTest
piotrszul Dec 22, 2025
cf208de
test: Add type function tests for FHIR complex types (HumanName, Addr…
piotrszul Dec 22, 2025
2e61d95
feat: Implement FHIRPath count() function
piotrszul Jan 7, 2026
38a884c
feat: Implement limited resolve() function for FHIRPath references
piotrszul Jan 7, 2026
a2c9e89
feat: Implement basic FHIR Search API support for fhirpath module
piotrszul Jan 8, 2026
9f1f49a
feat: Add array value support for token search parameters
piotrszul Jan 8, 2026
066a174
feat: Add STRING type search parameter support with family parameter
piotrszul Jan 8, 2026
87bb28b
refactor: Extract matching logic into ElementMatcher for better testa…
piotrszul Jan 8, 2026
0bcb277
feat: Add :not and :exact search modifiers
piotrszul Jan 8, 2026
bf83f58
feat: Add DATE type search parameter support with birthdate parameter
piotrszul Jan 9, 2026
80a59c7
feat: Add date search prefix support (eq, ne, gt, ge, lt, le)
piotrszul Jan 9, 2026
59e63fe
feat: Add NUMBER type search parameter support
piotrszul Jan 9, 2026
db7cbe5
refactor: Consolidate DatePrefix and NumberPrefix into SearchPrefix
piotrszul Jan 9, 2026
ab5c452
feat: Add Period type support for DATE search parameters
piotrszul Jan 9, 2026
b870be1
feat: Add full token search support for all FHIR types
piotrszul Jan 9, 2026
5a04871
refactor: Extract MatcherFactory interface for search filter creation
piotrszul Jan 12, 2026
de45cc6
feat: Add polymorphic union expression support for search parameters
piotrszul Jan 12, 2026
bc35aaa
feat: Add FHIR-compliant numeric search with range semantics
piotrszul Jan 12, 2026
00fa7df
feat: Add FHIR-compliant quantity search with system|code and UCUM no…
piotrszul Jan 13, 2026
1a47b72
refactor: Comprehensive code quality improvements and API refinements
piotrszul Jan 13, 2026
fdca4ca
refactor: Simplify TokenMatcher.matchSystemAndCode() with functional …
piotrszul Jan 13, 2026
6dea505
feat: Load search parameters from bundled JSON resource
piotrszul Jan 13, 2026
e8e37ce
refactor: Use official HL7 R4 search parameters with factory methods
piotrszul Jan 14, 2026
fcb3ea1
feat: Add URL query string parsing to FhirSearch
piotrszul Jan 14, 2026
86523ee
feat: Add FHIR search API to library-api module
piotrszul Jan 14, 2026
bdcbbd4
refactor: Unify query dispatchers with QueryContext and functional ex…
piotrszul Jan 14, 2026
86af0f1
feat: Add Python FHIR search API to DataSource
piotrszul Jan 14, 2026
957ca99
feat: Enhance FhirView compliance tests with exclusion handling and c…
piotrszul Jan 22, 2026
e8921a7
refactor: Extract ResourceFilter and schema transformation utilities
piotrszul Jan 20, 2026
274e778
refactor: Simplify FHIRPath evaluation interface
piotrszul Jan 23, 2026
134d660
chore: Create release branch and update version to 9.3.0-SNAPSHOT
piotrszul Jan 23, 2026
d52631d
chore: Reformat all java source with google-java-code
piotrszul Jan 27, 2026
ddc189d
chore: Reformatted python code with ruff
piotrszul Jan 27, 2026
0a98322
Merge branch 'release/9.3.0' into issue/1986
piotrszul Jan 27, 2026
9cc2c7f
fix: Resolve merge conflicts and compilation errors from release/9.3.…
piotrszul Jan 27, 2026
a3c1dd7
fix: Fix test failures and align Python API with release branch
piotrszul Jan 27, 2026
3f80e7f
chore: Add styler version logging to R format check
piotrszul Jan 28, 2026
9dc9ed7
chore: Apply styler formatting to R context module
piotrszul Jan 28, 2026
8aec7d4
merge: Fixes to server module to resolve merge conflicts and issues.
piotrszul Jan 29, 2026
a29b6e9
fix: Resolve remaining merge issues in fhirpath and server modules
piotrszul Jan 30, 2026
f8ac663
fix: Pass library JARs from build job to server test workflow
piotrszul Feb 2, 2026
2dfda06
test: Add Accept header to bulk export polling request
johngrimes Feb 3, 2026
b26e8a7
chore: Revert refactoring of mutiple ifs
piotrszul Feb 3, 2026
defdf32
chore: fix a Sonar issue with possible regex ambiguity.
piotrszul Feb 3, 2026
463264c
feat: Add searchToColumn API for FHIR search in Java and Python
piotrszul Feb 4, 2026
93246b0
fix: Use source package type for R dependency installation
piotrszul Feb 4, 2026
4dd56c5
chore: Log installed R package versions during build
piotrszul Feb 4, 2026
62a1a8c
chore: Adding sessionInfo() debug for R build
piotrszul Feb 4, 2026
8adcbe5
chore: Update spark version in R SystemRequirements to 4.0
piotrszul Feb 4, 2026
9516332
chore: Create release branch and update version to 9.3.0-SNAPSHOT
piotrszul Jan 23, 2026
4362974
test: Add Accept header to bulk export polling request
johngrimes Feb 3, 2026
5fa3975
fix: Address Trivy-reported security issues
piotrszul Feb 5, 2026
0c0e5a2
chore: Bump trivy-action from 0.32.0 to 0.33.1 and trivy version to '…
piotrszul Feb 5, 2026
ca3128e
chore: Bump trivy-action from 0.32.0 to 0.33.1 and trivy version to '…
piotrszul Feb 5, 2026
30bf8c8
Merge branch 'release/9.3.0' into issue/1986
piotrszul Feb 5, 2026
2fa7e19
Add spec
johngrimes Feb 5, 2026
3fed1a0
Update SQL on FHIR pointer
johngrimes Feb 13, 2026
2d1ffba
Initialise OpenSpec and rationalise contributing documentation
johngrimes Feb 13, 2026
33982fe
docs: Fix module dependency diagram in CONTRIBUTING.md
johngrimes Feb 13, 2026
04dc00e
chore: Add shared pre-commit formatting hook
johngrimes Feb 13, 2026
c2baf1a
chore: Add project-level Claude Code skills
johngrimes Feb 13, 2026
2d96106
feat: Add pc_search_to_column to R library
johngrimes Feb 13, 2026
9df0b3a
fix: Update dependencies to resolve Dependabot security alerts
johngrimes Feb 13, 2026
a90779c
fix: Make Python venv creation idempotent
johngrimes Feb 13, 2026
598d7bf
fix: Cache Spark downloads in CI to avoid flaky archive mirrors
johngrimes Feb 13, 2026
171aeec
chore: Add HAPI skill
johngrimes Feb 13, 2026
e4614a2
feat: Implement reference search parameter type
johngrimes Feb 13, 2026
aea0bb7
feat: Implement URI search parameter type
johngrimes Feb 13, 2026
03844ed
fix: Coalesce null arrays in :not search filter
johngrimes Feb 13, 2026
71ae9d0
feat: Add fhirPathToColumn method to library API
johngrimes Feb 13, 2026
a775f72
feat: Add pathling_filter and pathling_with_column to R library
johngrimes Feb 13, 2026
583f720
fix: Remove usage of deprecated AgnosticExpressionPathEncoder
johngrimes Feb 13, 2026
bb9d28c
chore: Upgrade Apache Spark from 4.0.1 to 4.0.2
johngrimes Feb 14, 2026
503e4e9
chore: Document CVE-2025-67721 investigation in .trivyignore
johngrimes Feb 14, 2026
fd6dd97
fix: Preserve extensions on elements within choice types
johngrimes Feb 14, 2026
427e517
fix: Resolve Javadoc reference errors preventing build completion
johngrimes Feb 14, 2026
eec0079
fix: Upgrade Apache Avro to 1.12.1 to address CVE-2025-33042
johngrimes Feb 15, 2026
5a701a6
docs: Add library documentation and correct FHIRPath references
johngrimes Feb 15, 2026
99555e1
chore: Update licenses
johngrimes Feb 15, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
164 changes: 164 additions & 0 deletions .claude/commands/opsx/apply.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,164 @@
---
name: "OPSX: Apply"
description: Implement tasks from an OpenSpec change (Experimental)
category: Workflow
tags: [workflow, artifacts, experimental]
---

Implement tasks from an OpenSpec change.

**Input**: Optionally specify a change name (e.g., `/opsx:apply add-auth`). If omitted, check if it can be inferred from conversation context. If vague or ambiguous you MUST prompt for available changes.

**Steps**

1. **Select the change**

If a name is provided, use it. Otherwise:

- Infer from conversation context if the user mentioned a change
- Auto-select if only one active change exists
- If ambiguous, run `openspec list --json` to get available changes and use the **AskUserQuestion tool** to let the user select

Always announce: "Using change: <name>" and how to override (e.g., `/opsx:apply <other>`).

2. **Check status to understand the schema**

```bash
openspec status --change "<name>" --json
```

Parse the JSON to understand:

- `schemaName`: The workflow being used (e.g., "spec-driven")
- Which artifact contains the tasks (typically "tasks" for spec-driven, check status for others)

3. **Get apply instructions**

```bash
openspec instructions apply --change "<name>" --json
```

This returns:

- Context file paths (varies by schema)
- Progress (total, complete, remaining)
- Task list with status
- Dynamic instruction based on current state

**Handle states:**

- If `state: "blocked"` (missing artifacts): show message, suggest using `/opsx:continue`
- If `state: "all_done"`: congratulate, suggest archive
- Otherwise: proceed to implementation

4. **Read context files**

Read the files listed in `contextFiles` from the apply instructions output.
The files depend on the schema being used:

- **spec-driven**: proposal, specs, design, tasks
- Other schemas: follow the contextFiles from CLI output

5. **Show current progress**

Display:

- Schema being used
- Progress: "N/M tasks complete"
- Remaining tasks overview
- Dynamic instruction from CLI

6. **Implement tasks (loop until done or blocked)**

For each pending task:

- Show which task is being worked on
- Make the code changes required
- Keep changes minimal and focused
- Mark task complete in the tasks file: `- [ ]` → `- [x]`
- Continue to next task

**Pause if:**

- Task is unclear → ask for clarification
- Implementation reveals a design issue → suggest updating artifacts
- Error or blocker encountered → report and wait for guidance
- User interrupts

7. **On completion or pause, show status**

Display:

- Tasks completed this session
- Overall progress: "N/M tasks complete"
- If all done: suggest archive
- If paused: explain why and wait for guidance

**Output During Implementation**

```
## Implementing: <change-name> (schema: <schema-name>)

Working on task 3/7: <task description>
[...implementation happening...]
✓ Task complete

Working on task 4/7: <task description>
[...implementation happening...]
✓ Task complete
```

**Output On Completion**

```
## Implementation Complete

**Change:** <change-name>
**Schema:** <schema-name>
**Progress:** 7/7 tasks complete ✓

### Completed This Session
- [x] Task 1
- [x] Task 2
...

All tasks complete! You can archive this change with `/opsx:archive`.
```

**Output On Pause (Issue Encountered)**

```
## Implementation Paused

**Change:** <change-name>
**Schema:** <schema-name>
**Progress:** 4/7 tasks complete

### Issue Encountered
<description of the issue>

**Options:**
1. <option 1>
2. <option 2>
3. Other approach

What would you like to do?
```

**Guardrails**

- Keep going through tasks until done or blocked
- Always read context files before starting (from the apply instructions output)
- If task is ambiguous, pause and ask before implementing
- If implementation reveals issues, pause and suggest artifact updates
- Keep code changes minimal and scoped to each task
- Update task checkbox immediately after completing each task
- Pause on errors, blockers, or unclear requirements - don't guess
- Use contextFiles from CLI output, don't assume specific file names

**Fluid Workflow Integration**

This skill supports the "actions on a change" model:

- **Can be invoked anytime**: Before all artifacts are done (if tasks exist), after partial implementation, interleaved with other actions
- **Allows artifact updates**: If implementation reveals design issues, suggest updating artifacts - not phase-locked, work fluidly
166 changes: 166 additions & 0 deletions .claude/commands/opsx/archive.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,166 @@
---
name: "OPSX: Archive"
description: Archive a completed change in the experimental workflow
category: Workflow
tags: [workflow, archive, experimental]
---

Archive a completed change in the experimental workflow.

**Input**: Optionally specify a change name after `/opsx:archive` (e.g., `/opsx:archive add-auth`). If omitted, check if it can be inferred from conversation context. If vague or ambiguous you MUST prompt for available changes.

**Steps**

1. **If no change name provided, prompt for selection**

Run `openspec list --json` to get available changes. Use the **AskUserQuestion tool** to let the user select.

Show only active changes (not already archived).
Include the schema used for each change if available.

**IMPORTANT**: Do NOT guess or auto-select a change. Always let the user choose.

2. **Check artifact completion status**

Run `openspec status --change "<name>" --json` to check artifact completion.

Parse the JSON to understand:

- `schemaName`: The workflow being used
- `artifacts`: List of artifacts with their status (`done` or other)

**If any artifacts are not `done`:**

- Display warning listing incomplete artifacts
- Prompt user for confirmation to continue
- Proceed if user confirms

3. **Check task completion status**

Read the tasks file (typically `tasks.md`) to check for incomplete tasks.

Count tasks marked with `- [ ]` (incomplete) vs `- [x]` (complete).

**If incomplete tasks found:**

- Display warning showing count of incomplete tasks
- Prompt user for confirmation to continue
- Proceed if user confirms

**If no tasks file exists:** Proceed without task-related warning.

4. **Assess delta spec sync state**

Check for delta specs at `openspec/changes/<name>/specs/`. If none exist, proceed without sync prompt.

**If delta specs exist:**

- Compare each delta spec with its corresponding main spec at `openspec/specs/<capability>/spec.md`
- Determine what changes would be applied (adds, modifications, removals, renames)
- Show a combined summary before prompting

**Prompt options:**

- If changes needed: "Sync now (recommended)", "Archive without syncing"
- If already synced: "Archive now", "Sync anyway", "Cancel"

If user chooses sync, execute `/opsx:sync` logic. Proceed to archive regardless of choice.

5. **Perform the archive**

Create the archive directory if it doesn't exist:

```bash
mkdir -p openspec/changes/archive
```

Generate target name using current date: `YYYY-MM-DD-<change-name>`

**Check if target already exists:**

- If yes: Fail with error, suggest renaming existing archive or using different date
- If no: Move the change directory to archive

```bash
mv openspec/changes/<name> openspec/changes/archive/YYYY-MM-DD-<name>
```

6. **Display summary**

Show archive completion summary including:

- Change name
- Schema that was used
- Archive location
- Spec sync status (synced / sync skipped / no delta specs)
- Note about any warnings (incomplete artifacts/tasks)

**Output On Success**

```
## Archive Complete

**Change:** <change-name>
**Schema:** <schema-name>
**Archived to:** openspec/changes/archive/YYYY-MM-DD-<name>/
**Specs:** ✓ Synced to main specs

All artifacts complete. All tasks complete.
```

**Output On Success (No Delta Specs)**

```
## Archive Complete

**Change:** <change-name>
**Schema:** <schema-name>
**Archived to:** openspec/changes/archive/YYYY-MM-DD-<name>/
**Specs:** No delta specs

All artifacts complete. All tasks complete.
```

**Output On Success With Warnings**

```
## Archive Complete (with warnings)

**Change:** <change-name>
**Schema:** <schema-name>
**Archived to:** openspec/changes/archive/YYYY-MM-DD-<name>/
**Specs:** Sync skipped (user chose to skip)

**Warnings:**
- Archived with 2 incomplete artifacts
- Archived with 3 incomplete tasks
- Delta spec sync was skipped (user chose to skip)

Review the archive if this was not intentional.
```

**Output On Error (Archive Exists)**

```
## Archive Failed

**Change:** <change-name>
**Target:** openspec/changes/archive/YYYY-MM-DD-<name>/

Target archive directory already exists.

**Options:**
1. Rename the existing archive
2. Delete the existing archive if it's a duplicate
3. Wait until a different date to archive
```

**Guardrails**

- Always prompt for change selection if not provided
- Use artifact graph (openspec status --json) for completion checking
- Don't block archive on warnings - just inform and confirm
- Preserve .openspec.yaml when moving to archive (it moves with the directory)
- Show clear summary of what happened
- If sync is requested, use /opsx:sync approach (agent-driven)
- If delta specs exist, always run the sync assessment and show the combined summary before prompting
Loading
Loading