Skip to content

Re-settled form logic in the interactive TUI after each accepted edit.#80

Merged
AlexSkrypnyk merged 6 commits into
mainfrom
feature/arch-consistency
Jul 21, 2026
Merged

Re-settled form logic in the interactive TUI after each accepted edit.#80
AlexSkrypnyk merged 6 commits into
mainfrom
feature/arch-consistency

Conversation

@AlexSkrypnyk

@AlexSkrypnyk AlexSkrypnyk commented Jul 21, 2026

Copy link
Copy Markdown
Member

Summary

The interactive panel controller now re-settles the form's logic through the Engine after every accepted edit, so an editing session in the TUI behaves exactly like a headless collection: derive rules recompute, when conditions show and hide fields live, and fix-ups re-apply. Condition-hidden fields no longer render as phantom empty rows or contribute answers, and editing a derive-ruled field pins it with Provenance::Override the same way a headless input does. Tui::interact() now throws CancelException (a subclass of InterruptException) when the session ends via the Cancel button, so a cancelled session can no longer be mistaken for a submitted one. Alongside this, the unused Field::$weight API was removed, Scan discovery now returns NULL for a missing directory instead of an empty list, the agent JSON schema no longer emits an incorrect multipleOf for a number field's step, and the architecture diagrams and docs were regenerated to match.

Changes

Engine

  • Added Engine::settle(), which re-runs derive rules (skipping pinned targets), when conditions and fix-ups over an edited value set to a fixpoint, returning the active map and settled values.
  • Added Engine::resolveState(), the full-map twin of collect(): the same resolution and settling, but keeping every field - including inactive ones, which retain their settled value and provenance so a later activation change can surface them without re-resolving.

Interactive controller

  • PanelController now owns an Engine instance and an $active map, settled once at construction (via a new resettle() method) and again after every accepted edit and after a modal dialog closes.
  • answers() filters out fields whose condition currently fails, matching what headless collection returns, while the controller keeps their settled values internally so a later activation surfaces them intact.
  • A new viewPanel() builds a per-frame filtered copy of the panel tree containing only currently-active fields (recursively), used by both the hub and modal frame renderers so hidden fields never render as empty rows.
  • Cursor handling (moveCursor(), activate()) and item counting now go through itemCountFor()/visibleFields() instead of the raw panel field list, so the cursor clamps correctly when a condition hides the field it was on.
  • Editing a field whose value is derive-ruled now writes Provenance::Override instead of Provenance::Edited, mirroring how a headless input to that field is recorded.
  • Tui::controller() seeds the controller from Engine::resolveState() instead of collect(), so an inactive field's default is available the moment its condition later turns true.

Cancel signal

  • Added src/CancelException.php, a CancelException extends InterruptException thrown when the session ends via the Cancel button rather than a submit.
  • Tui::interact() now checks $controller->isCancelled() after the run loop ends and throws CancelException instead of returning the session's answers.

Discovery

  • Scan::discover() returns NULL for a missing directory instead of [], aligning it with its sibling discovery rules where NULL means "nothing to discover" and [] means a genuine empty result from an existing, scannable directory.

Schema

  • AgentHelp no longer emits multipleOf for a NumberBounds field's step, since the step is a keyboard increment for the interactive editor, not a value constraint the collection enforces.

Field weight removal

  • Removed the unused weight() builder method and the $weight property from FieldBuilder and Field, and its propagation into the Answer/Answers snapshot - nothing in the codebase ordered by it.

Docs and diagrams

  • Regenerated docs/architecture/architecture.puml/.svg to add the PanelController -> Engine dependency, and docs/architecture/dataflow-tui.puml/.svg to add the settle step after an accepted edit.
  • Updated docs/architecture/README.md, docs/content/architecture.mdx, docs/content/configuration.mdx, docs/content/installation.mdx, docs/content/self-describing-answers.mdx, docs/content/widgets/pause.mdx, AGENTS.md and playground/01-quickstart.php to drop stale weight() references, document the Cancel/CancelException behaviour, and fix a stale playground autoloader path.

Before / After

BEFORE - accepting an edit
┌───────────────┐     ┌──────────────────────────────┐     ┌────────────────────┐
│ Edit accepted │ ──▶ │ value written, marked edited │ ──▶ │ next frame renders │
└───────────────┘     └──────────────────────────────┘     └────────────────────┘
(no engine re-run: condition-hidden fields still render as empty rows and still count as answers)

BEFORE - cancelling
┌────────────────┐     ┌─────────────────────────────────┐
│ Cancel pressed │ ──▶ │ Tui::interact() returns Answers │
└────────────────┘     └─────────────────────────────────┘
(looks exactly like a submitted form)


AFTER - accepting an edit
┌───────────────┐     ┌──────────────────────────────────────────┐     ┌───────────────────────┐
│ Edit accepted │ ──▶ │ value written (override if derive-ruled) │ ──▶ │ Engine::settle() runs │
└───────────────┘     └──────────────────────────────────────────┘     └───────────────────────┘
  - derive rules recompute (unless pinned)
  - when conditions re-evaluate the active map
  - fix-ups re-apply
(hidden fields vanish from view and answers(); re-shown fields carry their settled defaults)

AFTER - cancelling
┌────────────────┐     ┌───────────────────────┐     ┌────────────────────────────────────────┐
│ Cancel pressed │ ──▶ │ isCancelled() == true │ ──▶ │ Tui::interact() throws CancelException │
└────────────────┘     └───────────────────────┘     └────────────────────────────────────────┘

Summary by CodeRabbit

  • New Features

    • Added dedicated Cancel-button cancellation distinct from Ctrl-C, with unified abort behavior.
    • Interactive edits now trigger a full re-settle cycle, updating condition visibility, derived values, and fix-ups while preserving derived overrides.
    • Inactive fields are now handled consistently during interactive sessions.
  • Changes

    • Removed the “weight” concept from configuration and self-describing answer snapshots.
    • Number step no longer constrains generated JSON schema via multipleOf.
  • Documentation

    • Refreshed architecture diagrams and clarified edited/override semantics and the consumer answer-processing contract.
  • Tests

    • Expanded coverage for cancellation, conditional/derived settling, discovery edge-cases, and schema expectations.

Editing now recomputes derive rules, re-evaluates 'when' conditions and re-applies fix-ups through the engine, so fields show and hide live, derived values follow their sources, and an edited derive target pins as 'override' - matching what headless collection does. Condition-hidden fields no longer render as empty rows and contribute no answer, while keeping their settled values so a later activation surfaces them with their defaults.

Surfaced the cancel button through the facade: 'Tui::interact()' now throws 'CancelException' (an 'InterruptException' subclass) instead of returning a cancelled session's answers exactly like a submitted form.

Removed the unused field 'weight' (nothing ordered by it), made 'Scan' discovery return NULL for a missing directory like its sibling rules, dropped the incorrect 'multipleOf' from the agent schema (the step is a keyboard increment, not a value constraint), and fixed stale documentation references.
@coderabbitai

coderabbitai Bot commented Jul 21, 2026

Copy link
Copy Markdown

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: e8c24f24-5910-4670-86e1-3e9ffb22f0f4

📥 Commits

Reviewing files that changed from the base of the PR and between ff1c564 and d1c1521.

📒 Files selected for processing (1)
  • docs/content/architecture.mdx

📝 Walkthrough

Walkthrough

Changes

The PR adds engine-backed state resolution and interactive re-settling, including conditional visibility, derived-value overrides, fix-ups, active-field rendering, cursor clamping, and cancellation exceptions. It also removes field processing weight from public models and snapshots, clarifies discovery and schema behavior, and updates documentation and tests.

Interactive engine flow

Layer / File(s) Summary
Engine state resolution and settling
src/Engine/Engine.php, src/Tui.php, tests/phpunit/Unit/Engine/*
Adds full-form state resolution and re-settlement for derivation, activation, provenance, and fix-ups.
Active-field rendering and navigation
src/Render/PanelController.php, tests/phpunit/Unit/Render/*
Filters inactive fields, preserves settled defaults, supports overrides and fix-ups, and recalculates answers and cursor state.
Cancellation and abort handling
src/CancelException.php, src/Tui.php, src/InterruptException.php, tests/phpunit/Unit/TuiTest.php, docs/content/installation.mdx
Cancel actions raise CancelException, while interrupt handling covers both abort paths.
Interactive architecture documentation and validation
docs/architecture/*, docs/content/architecture.mdx, tests/phpunit/Unit/Testing/*
Documents engine settlement and consumer-defined ordering, with tests for conditional defaults and encoded terminal input.

Field and answer contract cleanup

Layer / File(s) Summary
Remove field weight state and snapshots
src/Model/Field.php, src/Builder/FieldBuilder.php, src/Answers/*, tests/phpunit/Unit/{Answers,Builder}/*, docs/content/{configuration,self-describing-answers,widgets}/*
Removes configurable field weight from construction, builder APIs, answer snapshots, tests, and documentation.

Discovery and schema contract corrections

Layer / File(s) Summary
Directory discovery results
src/Discovery/Scan.php, tests/phpunit/Unit/Discovery/*
Missing or failed directories return NULL, while existing empty directories return an empty list.
Numeric schema bounds
src/Schema/AgentHelp.php, tests/phpunit/Unit/Schema/*
Numeric step no longer produces a multipleOf schema constraint.
API documentation corrections
src/Translation/Translator.php
The translation documentation references Translator::t().

Estimated code review effort: 4 (Complex) | ~45 minutes

Sequence Diagram(s)

sequenceDiagram
  participant User
  participant Tui
  participant PanelController
  participant Engine
  User->>Tui: Edit field
  Tui->>PanelController: Process accepted edit
  PanelController->>Engine: settle(values, pinned)
  Engine-->>PanelController: Settled values and active map
  PanelController-->>User: Render active fields
  User->>Tui: Cancel session
  Tui-->>User: Raise CancelException
Loading

Possibly related PRs

  • drevops/tui#42: Both changes use the TUI test harness and modify the scripted PanelController execution path.
  • drevops/tui#62: Both changes modify PanelController modal handling and modal state restoration.
🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 48.28% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly summarizes the main change: re-settling interactive TUI form logic after accepted edits.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feature/arch-consistency

Comment @coderabbitai help to get the list of available commands.

@github-actions

This comment has been minimized.

@codecov

codecov Bot commented Jul 21, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 98.20%. Comparing base (0e1edd0) to head (d1c1521).
✅ All tests successful. No failed tests found.

Additional details and impacted files
@@            Coverage Diff             @@
##             main      #80      +/-   ##
==========================================
+ Coverage   98.18%   98.20%   +0.01%     
==========================================
  Files         100      100              
  Lines        3306     3342      +36     
==========================================
+ Hits         3246     3282      +36     
  Misses         60       60              

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

@github-actions

github-actions Bot commented Jul 21, 2026

Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@docs/architecture/README.md`:
- Line 56: Clarify the interactive answer contract in the concluding “same
Answers object” wording: settled values for hidden fields remain retained
internally, but hidden fields are omitted from the returned active answers.
Apply this documentation change in docs/architecture/README.md at lines 56-56
and docs/content/architecture.mdx at lines 60-60, preserving the existing
headless parity description for visible fields.

In `@src/Engine/Engine.php`:
- Around line 109-137: Extract the shared derive-rule-building loop from
settle() into a helper such as deriveRulesOnly(array $fields), collecting only
fields whose derive property is non-null. Update settle() and deriveRules() to
use this helper, leaving deriveRules()’s pinned-value computation unchanged.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 0fad257e-2705-4e6f-88aa-0aeb5a9fa4f6

📥 Commits

Reviewing files that changed from the base of the PR and between 0e1edd0 and 0a899cc.

⛔ Files ignored due to path filters (4)
  • docs/architecture/architecture-dark.svg is excluded by !**/*.svg
  • docs/architecture/architecture.svg is excluded by !**/*.svg
  • docs/architecture/dataflow-tui-dark.svg is excluded by !**/*.svg
  • docs/architecture/dataflow-tui.svg is excluded by !**/*.svg
📒 Files selected for processing (30)
  • AGENTS.md
  • docs/architecture/README.md
  • docs/architecture/architecture.puml
  • docs/architecture/dataflow-tui.puml
  • docs/content/architecture.mdx
  • docs/content/configuration.mdx
  • docs/content/installation.mdx
  • docs/content/self-describing-answers.mdx
  • docs/content/widgets/pause.mdx
  • playground/01-quickstart.php
  • src/Answers/Answer.php
  • src/Answers/Answers.php
  • src/Builder/FieldBuilder.php
  • src/CancelException.php
  • src/Discovery/Scan.php
  • src/Engine/Engine.php
  • src/InterruptException.php
  • src/Model/Field.php
  • src/Render/PanelController.php
  • src/Schema/AgentHelp.php
  • src/Translation/Translator.php
  • src/Tui.php
  • tests/phpunit/Unit/Answers/AnswersTest.php
  • tests/phpunit/Unit/Builder/FormTest.php
  • tests/phpunit/Unit/Discovery/DiscoverSpecsTest.php
  • tests/phpunit/Unit/Engine/EngineConditionalTest.php
  • tests/phpunit/Unit/Render/PanelControllerTest.php
  • tests/phpunit/Unit/Schema/AgentHelpTest.php
  • tests/phpunit/Unit/Testing/TuiTesterTest.php
  • tests/phpunit/Unit/TuiTest.php
💤 Files with no reviewable changes (2)
  • src/Builder/FieldBuilder.php
  • src/Model/Field.php

Comment thread docs/architecture/README.md Outdated
Comment thread src/Engine/Engine.php
@github-actions

This comment has been minimized.

@AlexSkrypnyk

Copy link
Copy Markdown
Member Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Jul 21, 2026

Copy link
Copy Markdown
✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@github-actions

This comment has been minimized.

@github-actions

This comment has been minimized.

@AlexSkrypnyk

Copy link
Copy Markdown
Member Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Jul 21, 2026

Copy link
Copy Markdown
✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@AlexSkrypnyk

Copy link
Copy Markdown
Member Author

@coderabbitai full review

@coderabbitai

coderabbitai Bot commented Jul 21, 2026

Copy link
Copy Markdown
✅ Action performed

Full review finished.


You're currently rate limited under our Fair Usage Limits Policy. Your recent PR review activity is in the 95th percentile or higher among CodeRabbit users, so adaptive limits apply. Your next review will be available in 44 minutes.

@AlexSkrypnyk

Copy link
Copy Markdown
Member Author

https://github.com/coderabbitai full review

@AlexSkrypnyk

Copy link
Copy Markdown
Member Author

@coderabbitai full review

@coderabbitai

coderabbitai Bot commented Jul 21, 2026

Copy link
Copy Markdown
✅ Action performed

Full review finished.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@docs/architecture/README.md`:
- Line 56: The architecture walkthroughs must describe the same current
Tui/ThemeManager theme configuration contract. Update
docs/architecture/README.md lines 56-56 and docs/content/architecture.mdx lines
60-60 so both use the current theme names and assign terminal capability
detection to the correct component, replacing the conflicting “dark”/“light” and
ThemeManager detection wording in the MDX page.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: e03296b7-27ca-4d53-954d-73f91bec048e

📥 Commits

Reviewing files that changed from the base of the PR and between 0e1edd0 and ff1c564.

⛔ Files ignored due to path filters (4)
  • docs/architecture/architecture-dark.svg is excluded by !**/*.svg
  • docs/architecture/architecture.svg is excluded by !**/*.svg
  • docs/architecture/dataflow-tui-dark.svg is excluded by !**/*.svg
  • docs/architecture/dataflow-tui.svg is excluded by !**/*.svg
📒 Files selected for processing (30)
  • AGENTS.md
  • docs/architecture/README.md
  • docs/architecture/architecture.puml
  • docs/architecture/dataflow-tui.puml
  • docs/content/architecture.mdx
  • docs/content/configuration.mdx
  • docs/content/installation.mdx
  • docs/content/self-describing-answers.mdx
  • docs/content/widgets/pause.mdx
  • playground/01-quickstart.php
  • src/Answers/Answer.php
  • src/Answers/Answers.php
  • src/Builder/FieldBuilder.php
  • src/CancelException.php
  • src/Discovery/Scan.php
  • src/Engine/Engine.php
  • src/InterruptException.php
  • src/Model/Field.php
  • src/Render/PanelController.php
  • src/Schema/AgentHelp.php
  • src/Translation/Translator.php
  • src/Tui.php
  • tests/phpunit/Unit/Answers/AnswersTest.php
  • tests/phpunit/Unit/Builder/FormTest.php
  • tests/phpunit/Unit/Discovery/DiscoverSpecsTest.php
  • tests/phpunit/Unit/Engine/EngineConditionalTest.php
  • tests/phpunit/Unit/Render/PanelControllerTest.php
  • tests/phpunit/Unit/Schema/AgentHelpTest.php
  • tests/phpunit/Unit/Testing/TuiTesterTest.php
  • tests/phpunit/Unit/TuiTest.php
💤 Files with no reviewable changes (2)
  • src/Builder/FieldBuilder.php
  • src/Model/Field.php

Comment thread docs/architecture/README.md
@github-actions

Copy link
Copy Markdown
Code Coverage Report:
  2026-07-21 13:21:35

 Summary:
  Classes: 83.00% (83/100)
  Methods: 96.11% (765/796)
  Lines:   98.20% (3282/3342)

DrevOps\Tui\Answers\Answer
  Methods: 100.00% ( 1/ 1)   Lines: 100.00% (  1/  1)
DrevOps\Tui\Answers\Answers
  Methods: 100.00% ( 9/ 9)   Lines: 100.00% ( 20/ 20)
DrevOps\Tui\Answers\Provenance
  Methods: 100.00% ( 1/ 1)   Lines: 100.00% (  7/  7)
DrevOps\Tui\Answers\SummaryFormatter
  Methods: 100.00% ( 4/ 4)   Lines: 100.00% ( 20/ 20)
DrevOps\Tui\Answers\ValueFormatter
  Methods: 100.00% ( 2/ 2)   Lines: 100.00% (  6/  6)
DrevOps\Tui\Builder\FieldBuilder
  Methods: 100.00% (38/38)   Lines: 100.00% (138/138)
DrevOps\Tui\Builder\Form
  Methods:  92.31% (12/13)   Lines:  98.39% ( 61/ 62)
DrevOps\Tui\Builder\LayoutGuard
  Methods: 100.00% ( 1/ 1)   Lines: 100.00% (  7/  7)
DrevOps\Tui\Builder\PanelBuilder
  Methods: 100.00% (20/20)   Lines: 100.00% ( 37/ 37)
DrevOps\Tui\Condition\CompositeCondition
  Methods: 100.00% ( 4/ 4)   Lines: 100.00% ( 19/ 19)
DrevOps\Tui\Condition\Condition
  Methods: 100.00% (10/10)   Lines: 100.00% ( 38/ 38)
DrevOps\Tui\Derive\Derive
  Methods: 100.00% ( 4/ 4)   Lines: 100.00% ( 14/ 14)
DrevOps\Tui\Derive\Deriver
  Methods: 100.00% ( 1/ 1)   Lines: 100.00% ( 13/ 13)
DrevOps\Tui\Derive\Transform
  Methods: 100.00% ( 3/ 3)   Lines: 100.00% (  7/  7)
DrevOps\Tui\Discovery\AbstractDiscover
  Methods: 100.00% ( 1/ 1)   Lines: 100.00% (  1/  1)
DrevOps\Tui\Discovery\Dotenv
  Methods: 100.00% ( 3/ 3)   Lines: 100.00% ( 19/ 19)
DrevOps\Tui\Discovery\JsonValue
  Methods: 100.00% ( 4/ 4)   Lines: 100.00% ( 16/ 16)
DrevOps\Tui\Discovery\PathExists
  Methods: 100.00% ( 3/ 3)   Lines: 100.00% (  3/  3)
DrevOps\Tui\Discovery\Scan
  Methods: 100.00% ( 3/ 3)   Lines: 100.00% ( 20/ 20)
DrevOps\Tui\Engine\Engine
  Methods: 100.00% (18/18)   Lines: 100.00% (115/115)
DrevOps\Tui\Handler\HandlerRegistry
  Methods:  85.71% ( 6/ 7)   Lines:  95.45% ( 21/ 22)
DrevOps\Tui\Input\Binding
  Methods: 100.00% ( 1/ 1)   Lines: 100.00% (  1/  1)
DrevOps\Tui\Input\DefaultKeyMap
  Methods: 100.00% ( 1/ 1)   Lines: 100.00% ( 38/ 38)
DrevOps\Tui\Input\Hint
  Methods: 100.00% ( 1/ 1)   Lines: 100.00% (  2/  2)
DrevOps\Tui\Input\Key
  Methods:  87.50% ( 7/ 8)   Lines:  63.64% (  7/ 11)
DrevOps\Tui\Input\KeyMap
  Methods: 100.00% (11/11)   Lines: 100.00% ( 61/ 61)
DrevOps\Tui\Input\KeyMapManager
  Methods: 100.00% ( 2/ 2)   Lines: 100.00% (  8/  8)
DrevOps\Tui\Input\KeyParser
  Methods:  85.71% ( 6/ 7)   Lines:  98.95% ( 94/ 95)
DrevOps\Tui\Input\Scope
  Methods: 100.00% ( 7/ 7)   Lines: 100.00% ( 17/ 17)
DrevOps\Tui\Input\ScopedKeyMap
  Methods: 100.00% ( 4/ 4)   Lines: 100.00% (  4/  4)
DrevOps\Tui\Input\VimKeyMap
  Methods: 100.00% ( 1/ 1)   Lines: 100.00% ( 12/ 12)
DrevOps\Tui\Model\Buttons
  Methods: 100.00% ( 1/ 1)   Lines: 100.00% (  1/  1)
DrevOps\Tui\Model\DateBounds
  Methods: 100.00% ( 6/ 6)   Lines: 100.00% ( 28/ 28)
DrevOps\Tui\Model\Field
  Methods:  84.62% (11/13)   Lines:  89.33% ( 67/ 75)
DrevOps\Tui\Model\FieldType
  Methods:  66.67% ( 2/ 3)   Lines:  31.82% (  7/ 22)
DrevOps\Tui\Model\FormDefinition
  Methods: 100.00% ( 4/ 4)   Lines: 100.00% ( 12/ 12)
DrevOps\Tui\Model\Modal
  Methods: 100.00% ( 1/ 1)   Lines: 100.00% (  2/  2)
DrevOps\Tui\Model\NumberBounds
  Methods:  83.33% ( 5/ 6)   Lines:  95.24% ( 20/ 21)
DrevOps\Tui\Model\Option
  Methods: 100.00% ( 4/ 4)   Lines: 100.00% ( 14/ 14)
DrevOps\Tui\Model\Panel
  Methods: 100.00% ( 3/ 3)   Lines: 100.00% (  3/  3)
DrevOps\Tui\Model\Weekday
  Methods: 100.00% ( 4/ 4)   Lines: 100.00% ( 15/ 15)
DrevOps\Tui\Render\Ansi
  Methods:  83.33% ( 5/ 6)   Lines:  76.47% ( 13/ 17)
DrevOps\Tui\Render\Box
  Methods: 100.00% ( 3/ 3)   Lines: 100.00% ( 15/ 15)
DrevOps\Tui\Render\ExternalEditor
  Methods: 100.00% ( 6/ 6)   Lines: 100.00% ( 27/ 27)
DrevOps\Tui\Render\HelpSection
  Methods: 100.00% ( 1/ 1)   Lines: 100.00% (  1/  1)
DrevOps\Tui\Render\Navigator
  Methods: 100.00% ( 7/ 7)   Lines: 100.00% ( 16/ 16)
DrevOps\Tui\Render\Overlay
  Methods: 100.00% ( 4/ 4)   Lines: 100.00% ( 24/ 24)
DrevOps\Tui\Render\PanelController
  Methods: 100.00% (47/47)   Lines: 100.00% (309/309)
DrevOps\Tui\Render\Scroller
  Methods: 100.00% ( 4/ 4)   Lines: 100.00% ( 14/ 14)
DrevOps\Tui\Render\Terminal
  Methods:  95.24% (20/21)   Lines:  96.88% ( 62/ 64)
DrevOps\Tui\Render\TerminalControl
  Methods: 100.00% ( 9/ 9)   Lines: 100.00% (  9/  9)
DrevOps\Tui\Render\Viewport
  Methods: 100.00% ( 1/ 1)   Lines: 100.00% (  1/  1)
DrevOps\Tui\Resolver\InputResolver
  Methods: 100.00% ( 6/ 6)   Lines: 100.00% ( 29/ 29)
DrevOps\Tui\Schema\AgentHelp
  Methods: 100.00% ( 4/ 4)   Lines: 100.00% ( 47/ 47)
DrevOps\Tui\Schema\SchemaGenerator
  Methods: 100.00% ( 3/ 3)   Lines: 100.00% ( 33/ 33)
DrevOps\Tui\Schema\SchemaValidator
  Methods: 100.00% ( 7/ 7)   Lines: 100.00% ( 32/ 32)
DrevOps\Tui\Testing\ArrayKeyStream
  Methods: 100.00% ( 3/ 3)   Lines: 100.00% ( 12/ 12)
DrevOps\Tui\Testing\BufferedTerminal
  Methods: 100.00% ( 7/ 7)   Lines: 100.00% ( 12/ 12)
DrevOps\Tui\Testing\KeyEncoder
  Methods: 100.00% ( 1/ 1)   Lines: 100.00% ( 22/ 22)
DrevOps\Tui\Testing\TuiTester
  Methods: 100.00% (13/13)   Lines: 100.00% ( 34/ 34)
DrevOps\Tui\Testing\WidgetRunner
  Methods: 100.00% ( 1/ 1)   Lines: 100.00% (  5/  5)
DrevOps\Tui\Theme\DefaultTheme
  Methods:  95.79% (91/95)   Lines:  98.66% (441/447)
DrevOps\Tui\Theme\DosTheme
  Methods:  80.00% (12/15)   Lines:  82.35% ( 14/ 17)
DrevOps\Tui\Theme\EmberTheme
  Methods:  66.67% ( 6/ 9)   Lines:  66.67% (  6/  9)
DrevOps\Tui\Theme\FrostTheme
  Methods:  66.67% ( 6/ 9)   Lines:  66.67% (  6/  9)
DrevOps\Tui\Theme\MidnightTheme
  Methods:  66.67% ( 6/ 9)   Lines:  66.67% (  6/  9)
DrevOps\Tui\Theme\MonoTheme
  Methods:  66.67% ( 6/ 9)   Lines:  66.67% (  6/  9)
DrevOps\Tui\Theme\Sgr
  Methods: 100.00% ( 1/ 1)   Lines: 100.00% (  1/  1)
DrevOps\Tui\Theme\ThemeManager
  Methods: 100.00% ( 2/ 2)   Lines: 100.00% (  8/  8)
DrevOps\Tui\Translation\Translator
  Methods: 100.00% (15/15)   Lines: 100.00% ( 73/ 73)
DrevOps\Tui\Tui
  Methods: 100.00% (23/23)   Lines: 100.00% ( 70/ 70)
DrevOps\Tui\Utils\Strings
  Methods: 100.00% ( 6/ 6)   Lines: 100.00% (  9/  9)
DrevOps\Tui\Widget\AbstractWidget
  Methods: 100.00% (18/18)   Lines: 100.00% ( 49/ 49)
DrevOps\Tui\Widget\CalendarWidget
  Methods: 100.00% (13/13)   Lines: 100.00% ( 52/ 52)
DrevOps\Tui\Widget\Capability\CompletionCapableTrait
  Methods: 100.00% ( 3/ 3)   Lines: 100.00% ( 14/ 14)
DrevOps\Tui\Widget\Capability\FilterCapableTrait
  Methods: 100.00% ( 4/ 4)   Lines: 100.00% ( 15/ 15)
DrevOps\Tui\Widget\Capability\OptionsCapableTrait
  Methods: 100.00% ( 9/ 9)   Lines: 100.00% ( 34/ 34)
DrevOps\Tui\Widget\Capability\PagingCapableTrait
  Methods: 100.00% ( 4/ 4)   Lines: 100.00% ( 16/ 16)
DrevOps\Tui\Widget\Capability\SearchCapableTrait
  Methods: 100.00% ( 3/ 3)   Lines: 100.00% (  3/  3)
DrevOps\Tui\Widget\Capability\SelectionCapableTrait
  Methods: 100.00% (13/13)   Lines: 100.00% ( 85/ 85)
DrevOps\Tui\Widget\Capability\TextEditCapableTrait
  Methods: 100.00% ( 9/ 9)   Lines: 100.00% ( 34/ 34)
DrevOps\Tui\Widget\ConfirmWidget
  Methods: 100.00% ( 7/ 7)   Lines: 100.00% ( 22/ 22)
DrevOps\Tui\Widget\FilePickerWidget
  Methods: 100.00% (31/31)   Lines: 100.00% (180/180)
DrevOps\Tui\Widget\MatchResult
  Methods: 100.00% ( 1/ 1)   Lines: 100.00% (  1/  1)
DrevOps\Tui\Widget\MatchTier
  Methods: 100.00% ( 1/ 1)   Lines: 100.00% (  6/  6)
DrevOps\Tui\Widget\Matcher
  Methods: 100.00% ( 9/ 9)   Lines: 100.00% ( 73/ 73)
DrevOps\Tui\Widget\NumberWidget
  Methods: 100.00% ( 9/ 9)   Lines: 100.00% ( 36/ 36)
DrevOps\Tui\Widget\PasswordDisplay
  Methods: 100.00% ( 1/ 1)   Lines: 100.00% (  5/  5)
DrevOps\Tui\Widget\PasswordWidget
  Methods: 100.00% ( 9/ 9)   Lines: 100.00% ( 45/ 45)
DrevOps\Tui\Widget\PauseWidget
  Methods: 100.00% ( 5/ 5)   Lines: 100.00% ( 11/ 11)
DrevOps\Tui\Widget\ReorderWidget
  Methods: 100.00% (10/10)   Lines: 100.00% ( 54/ 54)
DrevOps\Tui\Widget\SearchWidget
  Methods: 100.00% ( 4/ 4)   Lines: 100.00% ( 11/ 11)
DrevOps\Tui\Widget\SelectWidget
  Methods: 100.00% ( 5/ 5)   Lines: 100.00% (  7/  7)
DrevOps\Tui\Widget\SuggestWidget
  Methods: 100.00% (12/12)   Lines: 100.00% ( 45/ 45)
DrevOps\Tui\Widget\TextWidget
  Methods: 100.00% ( 5/ 5)   Lines: 100.00% ( 16/ 16)
DrevOps\Tui\Widget\TextareaWidget
  Methods: 100.00% ( 8/ 8)   Lines: 100.00% ( 49/ 49)
DrevOps\Tui\Widget\ToggleWidget
  Methods: 100.00% ( 8/ 8)   Lines: 100.00% ( 30/ 30)
DrevOps\Tui\Widget\WidgetFactory
  Methods: 100.00% ( 8/ 8)   Lines: 100.00% ( 36/ 36)

@AlexSkrypnyk
AlexSkrypnyk merged commit de7270f into main Jul 21, 2026
12 checks passed
@AlexSkrypnyk
AlexSkrypnyk deleted the feature/arch-consistency branch July 21, 2026 23:57
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