Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
37 changes: 22 additions & 15 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -35,21 +35,22 @@ must carry XML documentation. Public API changes must also be nullable-correct
and covered by semantic surface tests. Runtime API changes must be reconciled
deliberately with `docs/1.0.0-PUBLIC-API-BASELINE.txt`; Source API changes must
be reconciled with `docs/1.1.0-SOURCE-PUBLIC-API-BASELINE.txt`. Do not regenerate
either baseline merely to silence a mismatch. Beginning with C01, Compiler API
changes must likewise be reconciled with
`docs/1.2.0-COMPILER-PUBLIC-API-BASELINE.txt`.
either baseline merely to silence a mismatch. Compiler API changes must likewise
be reconciled with `docs/1.2.0-COMPILER-PUBLIC-API-BASELINE.txt`, and Inspection
API changes with `docs/1.3.0-INSPECTION-PUBLIC-API-BASELINE.txt`.

## Version metadata

`Icod.TermInfo.csproj`, `Icod.TermInfo.Source/Icod.TermInfo.Source.csproj`, and
`Icod.TermInfo.Compiler/Icod.TermInfo.Compiler.csproj` contain `<Version />`,
`Icod.TermInfo.csproj`, `Icod.TermInfo.Source/Icod.TermInfo.Source.csproj`,
`Icod.TermInfo.Compiler/Icod.TermInfo.Compiler.csproj`, and
`Icod.TermInfo.Inspection/Icod.TermInfo.Inspection.csproj` contain `<Version />`,
`<PackageVersion />`, and the stable 1.x `<AssemblyVersion />`. Keep `Version`
and `PackageVersion` identical within each project, and keep all three package
and `PackageVersion` identical within each project, and keep all four package
versions synchronized.

Runtime, Source, and Compiler use the same `1.2.0-Alpha-X` package version for
each 1.2 development tranche. The 1.x assembly version remains `1.0.0.0` for
all three assemblies, and all three remain unsigned.
Beginning with 1.3, Runtime, Source, Compiler, and Inspection advance together.
The 1.x assembly version remains `1.0.0.0` for all four assemblies, and all four
remain unsigned.

Prerelease development should use the active version roadmap's alpha/beta/RC
sequence. A final release tag must be exactly `v<PackageVersion>`.
Expand Down Expand Up @@ -127,13 +128,14 @@ Package changes should preserve:
- unsigned assembly identity throughout 1.x;
- Source Link information supplied by the .NET SDK;
- portable PDBs and `.snupkg` generation for all three targets;
- synchronized `Icod.TermInfo` / `Icod.TermInfo.Source` package versions;
- synchronized `Icod.TermInfo.Compiler` package versions beginning with C01;
- runtime and Source fresh-package smoke consumers on all three targets;
- Compiler fresh-package smoke consumers on all three targets beginning with C01;
- synchronized Runtime, Source, Compiler, and Inspection package versions;
- Runtime, Source, Compiler, and Inspection fresh-package smoke consumers on all
three targets;
- each package README, icon metadata, and LGPL license expression;
- a one-way Source -> runtime package dependency;
- a one-way Compiler -> runtime/Source dependency;
- a one-way Source -> Runtime package dependency;
- a one-way Compiler -> Runtime/Source dependency;
- a one-way Inspection -> Runtime/Source dependency with no production Compiler
dependency;
- identical validated release artifacts for NuGet.org and GitHub Packages.

See `docs/RELEASING.md` before modifying publication workflows.
Expand All @@ -151,6 +153,11 @@ in the optional `Icod.TermInfo.Compiler` package. The low-level writer remains
pure; filesystem/database-layout output is layered separately, and no compiler
dependency enters `Icod.TermInfo` or `Icod.TermInfo.Source`.

Version 1.3 adds canonical rendering, structured semantic comparison, and
provider-aware inspection in the optional `Icod.TermInfo.Inspection` package.
Inspection depends on Runtime and Source but not on Compiler, and it does not
enlarge the frozen Runtime, Source, or Compiler public contracts.

Live session ownership, input-event decoding, curses/UI behavior, PTY/ConPTY
lifecycle, terminal probing, command-line `tic`/`infocmp`/`toe` applications,
termcap interoperability, and terminal emulation remain outside the current
Expand Down
40 changes: 17 additions & 23 deletions Icod.TermInfo-1.3.0-Inspection-and-Comparison-Roadmap.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,10 @@
**Source API contract:** frozen at 1.1
**Compiler API contract:** frozen at 1.2
**New package:** `Icod.TermInfo.Inspection`
**Current development version:** `1.3.0-Alpha-5`
**Current development version:** `1.3.0`
**Development sequence:** `1.3.0-Alpha-1` through `1.3.0-Alpha-7`
**Status:** I05 implementation candidate — build/test/package validation required
**Current tranche:** I05 — Source-aware comparison
**Status:** Release closure — I01-I07 complete and candidate API/package contract frozen
**Current tranche:** Final 1.3.0 release closure
**Release objective:** reusable managed inspection, canonical rendering, and semantic-comparison APIs underlying future `infocmp`-style tooling without destabilizing the existing Runtime, Source, or Compiler contracts.

---
Expand Down Expand Up @@ -584,6 +584,8 @@ TermInfoDifference
TermInfoDifferenceKind

TermInfoInspectionTarget
TermInfoInspectionResult
TermInfoInspectionComparison
TermInfoInspectionEngine
```

Expand Down Expand Up @@ -817,6 +819,8 @@ No console parsing/output policy belongs here.
inspection/comparison workflows without duplicating acquisition, rendering, or
comparison logic.

**Implementation record:** [`docs/1.3.0-I06-PROVIDER-AWARE-INSPECTION.md`](docs/1.3.0-I06-PROVIDER-AWARE-INSPECTION.md)

---

# I07 — Differential validation, robustness, and API/package freeze
Expand Down Expand Up @@ -880,6 +884,8 @@ made part of the Icod contract.
**Gate I07:** the Inspection API is deterministic, cross-platform, corpus-backed,
package-valid, and ready to freeze for 1.3.0.

**Implementation record:** [`docs/1.3.0-I07-DIFFERENTIAL-VALIDATION-AND-FREEZE.md`](docs/1.3.0-I07-DIFFERENTIAL-VALIDATION-AND-FREEZE.md)

---

# 8. 1.3.0 release closure
Expand All @@ -888,6 +894,8 @@ I01-I07 constitute the planned 1.3 implementation program.

Release closure is a separate finalization step.

**Release audit:** [`docs/1.3.0-RELEASE-AUDIT.md`](docs/1.3.0-RELEASE-AUDIT.md)

Release closure SHALL:

- set Runtime, Source, Compiler, and Inspection versions to exactly `1.3.0`;
Expand Down Expand Up @@ -981,28 +989,14 @@ embedded into it.

---

# 11. Recommended first implementation step

Create a `1.3.0` working branch from the current `main` release commit and begin
with I01 only.

I01 should deliberately avoid implementing the canonical renderer yet.

Its purpose is to freeze:

1. package ownership;
2. four-package coordinated versioning;
3. dependency direction;
4. public API baseline mechanics;
5. solution/test/package layout;
6. CI/release support for the fourth package;
7. effective-versus-source-aware inspection semantics;
8. the rule that Inspection has no production Compiler dependency.
# 11. Recommended next implementation step

Once I01 is green locally and in GitHub Actions, proceed to I02.
Complete the 1.3.0 release closure and publish the immutable `v1.3.0` tag before
beginning the 1.4 tool-suite line.

That keeps 1.3 development incremental and gives every later feature tranche a
stable package and release environment.
The first 1.4 work should sit above the frozen Runtime, Source, Compiler, and
Inspection engines. Command parsing, exit-code policy, and console formatting
belong in the tool layer rather than enlarging those package contracts.

---

Expand Down
37 changes: 19 additions & 18 deletions Icod.TermInfo-Post-1.0-Development-Roadmap.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,15 @@
**Stable runtime package:** `Icod.TermInfo`
**Optional source package:** `Icod.TermInfo.Source`
**Optional compiler package:** `Icod.TermInfo.Compiler`
**Optional inspection package:** `Icod.TermInfo.Inspection`
**Language:** C# 13
**Target frameworks:** `net8.0`; `net9.0`; `net10.0`
**Frozen runtime contract:** `1.0.0`
**Current release version:** `1.2.0`
**Current development version:** `1.2.0`
**Next development line:** `1.3.0`
**Status:** 1.2.0 release closure
**Current tranche:** Final 1.2.0 release closure
**Current release version:** `1.3.0`
**Current development version:** `1.3.0`
**Next development line:** `1.4.0`
**Status:** 1.3.0 release closure
**Current tranche:** Final 1.3.0 release closure
**Primary objective:** Extend the terminfo ecosystem beyond runtime capability acquisition without destabilizing the frozen 1.0 runtime contract.

---
Expand All @@ -36,21 +37,21 @@ Post-1.0 development SHALL build outward from that foundation rather than repeat
The principal new family is **terminfo source and tooling**:

```text
Icod.TermInfo.Tools
|
v
Icod.TermInfo.Compiler
/ \
v v
Icod.TermInfo.Source ---> Icod.TermInfo
stable runtime
Icod.TermInfo.Tools
/ \
v v
Icod.TermInfo.Compiler Icod.TermInfo.Inspection
| \ / |
| \ / |
v v v v
Icod.TermInfo.Source ---> Icod.TermInfo
stable runtime
```

The arrows are dependency arrows. `Icod.TermInfo` remains dependency-free.
`Icod.TermInfo.Source` depends on `Icod.TermInfo`. The compiler depends directly
on `Icod.TermInfo`; its Source dependency is introduced only when source
compilation enters the compiler in C05. No dependency may point from the runtime
package back toward Source, Compiler, or Tools.
`Icod.TermInfo.Source` depends on `Icod.TermInfo`. Compiler and Inspection each
depend on matching Runtime and Source packages. No dependency may point from the
runtime package back toward Source, Compiler, Inspection, or Tools.

Live-terminal state, terminal input, probing, PTYs, curses presentation, and terminal emulation remain outside this roadmap and belong to their respective packages.

Expand Down Expand Up @@ -1293,4 +1294,4 @@ TerminalDescription materialization + corpus
1.5 termcap interoperability
```

The first implementation target should therefore be **1.1 S01 — `Icod.TermInfo.Source` package foundation**, followed by the lexer/source-location layer. This gives the project a clean new development line while leaving the stable runtime and the ongoing Terminal/DCurses work untouched.
The 1.1 Source, 1.2 Compiler, and 1.3 Inspection lines are now complete. The next package-family development target is **1.4.0 — Tool Suite**, building the `tic`, `infocmp`, and `toe` command projects on the frozen managed engines without enlarging the Runtime contract.
6 changes: 3 additions & 3 deletions Icod.TermInfo.Compiler/Icod.TermInfo.Compiler.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -12,17 +12,17 @@
<AssemblyName>Icod.TermInfo.Compiler</AssemblyName>
<RootNamespace>Icod.TermInfo.Compiler</RootNamespace>
<Configurations>Debug;Release;Staging</Configurations>
<Version>1.3.0-Alpha-5</Version>
<Version>1.3.0</Version>
<AssemblyVersion>1.0.0.0</AssemblyVersion>
</PropertyGroup>

<PropertyGroup>
<PackageVersion>1.3.0-Alpha-5</PackageVersion>
<PackageVersion>1.3.0</PackageVersion>
<PackageId>Icod.TermInfo.Compiler</PackageId>
<Title>Icod.TermInfo.Compiler</Title>
<Authors>Timothy J. Bruce</Authors>
<Description>Managed deterministic terminfo compiler for Icod.TermInfo. The 1.2 line compiles .ti source or immutable TerminalDescription values and can publish explicit conventional terminfo directory layouts without native ncurses dependencies.</Description>
<PackageReleaseNotes>1.3.0-Alpha-5 coordinates Compiler with the I05 source-aware comparison engine while preserving the frozen 1.2 compiler public API and completed C01-C07 behavior.</PackageReleaseNotes>
<PackageReleaseNotes>1.3.0 coordinates Compiler with the Inspection release and its managed differential round-trip validation while preserving the frozen 1.2 compiler public API and production dependency graph.</PackageReleaseNotes>
<PackageReadmeFile>README.md</PackageReadmeFile>
<PackageIcon>icon.png</PackageIcon>
<PackageProjectUrl>https://github.com/uniblab/Icod.TermInfo</PackageProjectUrl>
Expand Down
10 changes: 6 additions & 4 deletions Icod.TermInfo.Compiler/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,15 +13,17 @@ ncurses/`tic` differential validation.

## Install

For the 1.2.0 release:
For the 1.3.0 release:

```text
dotnet add package Icod.TermInfo.Compiler --version 1.2.0
dotnet add package Icod.TermInfo.Compiler --version 1.3.0
```

The package targets `net8.0`, `net9.0`, and `net10.0` and depends on the matching
`Icod.TermInfo` and `Icod.TermInfo.Source` packages. The dependency remains
one-way; neither Source nor Runtime depends on Compiler.
`Icod.TermInfo` and `Icod.TermInfo.Source` packages. Version 1.3.0 coordinates
Compiler with the Inspection release without changing the frozen 1.2 Compiler
public API. The dependency remains one-way; neither Source nor Runtime depends
on Compiler.

C06 adds `CompiledTermInfoDatabaseWriter`. It never discovers a system database
or installs globally: callers must supply the output root explicitly. It can
Expand Down
6 changes: 3 additions & 3 deletions Icod.TermInfo.Inspection/Icod.TermInfo.Inspection.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -12,17 +12,17 @@
<AssemblyName>Icod.TermInfo.Inspection</AssemblyName>
<RootNamespace>Icod.TermInfo.Inspection</RootNamespace>
<Configurations>Debug;Release;Staging</Configurations>
<Version>1.3.0-Alpha-5</Version>
<Version>1.3.0</Version>
<AssemblyVersion>1.0.0.0</AssemblyVersion>
</PropertyGroup>

<PropertyGroup>
<PackageVersion>1.3.0-Alpha-5</PackageVersion>
<PackageVersion>1.3.0</PackageVersion>
<PackageId>Icod.TermInfo.Inspection</PackageId>
<Title>Icod.TermInfo.Inspection</Title>
<Authors>Timothy J. Bruce</Authors>
<Description>Managed inspection and semantic-comparison foundation for Icod.TermInfo. The 1.3 line provides canonical terminfo rendering and reusable infocmp-style comparison engines without enlarging the frozen Runtime, Source, or Compiler public contracts.</Description>
<PackageReleaseNotes>1.3.0-Alpha-5 implements I05: deterministic machine-readable comparison of unresolved Source entries/documents, including ordered fields, use= references, cancellation/disabled states, duplicates, source spans, and source-versus-effective semantic distinction.</PackageReleaseNotes>
<PackageReleaseNotes>1.3.0 introduces the optional Inspection layer with canonical effective and unresolved-source rendering, structured semantic comparison, provider-aware inspection, deterministic cross-platform behavior, and no production Compiler dependency.</PackageReleaseNotes>
<PackageReadmeFile>README.md</PackageReadmeFile>
<PackageIcon>icon.png</PackageIcon>
<PackageProjectUrl>https://github.com/uniblab/Icod.TermInfo</PackageProjectUrl>
Expand Down
86 changes: 83 additions & 3 deletions Icod.TermInfo.Inspection/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,87 @@ comparison layer for the `Icod.TermInfo` package family.

The 1.3 line provides the reusable API engine underneath future
`infocmp`-style tooling while preserving the already-frozen Runtime 1.0, Source
1.1, and Compiler 1.2 public contracts.
1.1, and Compiler 1.2 public contracts. Version 1.3.0 is the first stable
release of this optional package.

## I07 differential validation, robustness, and API/package freeze

`1.3.0-Alpha-7` closes the 1.3 implementation program without adding another
production API surface. The reviewed I02-I06 Inspection API is now the candidate
1.3 contract, and the existing public API baseline is treated as frozen for
release closure.

I07 adds cross-layer validation which deliberately uses
`Icod.TermInfo.Compiler` only from the Inspection test project. Effective terminal
descriptions are rendered through Inspection, compiled from the resulting Source,
parsed back through Runtime, and compared semantically. The production package
continues to depend only on Source and Runtime:

```text
Inspection -> Source -> Runtime
Inspection ----------> Runtime
```

The validation corpus covers every built-in profile, the pinned T29 compiled
fixtures, and the checked-in Source corpus. It also locks exact wrapping
boundaries, culture-independent and insertion-order-independent comparison
ordering, source cancellation/disabled/`use=`/duplicate sequencing, and the
four-package release boundary.

Ordinary CI remains independent of a host ncurses installation. Differential
evidence is semantic: I07 does not claim byte-for-byte formatting identity with
`infocmp`, and it does not change the existing Runtime, Source, or Compiler public
contracts.

## I06 provider-aware inspection and reusable `infocmp` engine

`1.3.0-Alpha-6` composes the existing Runtime acquisition contract with the I02
canonical renderer and I04 effective comparer. An inspection target contains an
explicit `ITerminalDescriptionProvider`, the exact requested terminal name, and
an optional caller-owned display label:

```csharp
TermInfoInspectionTarget target =
new(
provider,
"xterm",
"system xterm"
);

TermInfoInspectionResult inspected =
TermInfoInspectionEngine.Inspect(
target
);
```

`TryInspect` preserves the Runtime provider contract's clean-miss semantics;
provider exceptions continue to propagate. Successful results retain both the
requested target identity and the provider-returned canonical
`TerminalDescription`, so aliases do not erase what the caller actually asked
for.

The engine can render a target or an already acquired result and can compare two
targets or two acquired results:

```csharp
TermInfoInspectionComparison comparison =
TermInfoInspectionEngine.Compare(
leftTarget,
rightTarget
);
```

The comparison retains both target/result identities together with the I04
`TermInfoComparisonResult`. Already acquired results are never reacquired when
rendered or compared.

The optional display label is caller-owned diagnostic context only. I06 does not
enumerate providers, expose private system-discovery internals, infer the exact
compiled database path used by a provider, or add command-line/console-output
policy. `SystemTerminalDescriptionProvider`, separate
`DirectoryTerminalDescriptionProvider` roots, `TerminalDatabase.BuiltIn`, and
caller-defined providers all participate through the same frozen Runtime
interface.

## I05 source-aware comparison

Expand Down Expand Up @@ -146,10 +226,10 @@ There is no production dependency between Inspection and Compiler.

## Install

During I05 development:
For the 1.3.0 release:

```text
dotnet add package Icod.TermInfo.Inspection --version 1.3.0-Alpha-5
dotnet add package Icod.TermInfo.Inspection --version 1.3.0
```

The package targets `net8.0`, `net9.0`, and `net10.0`, uses C# 13, remains
Expand Down
Loading
Loading