Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
26bcb7f
chore: add repo scaffolding required by ganda audit
StevenTCramer Jul 2, 2026
a36a9bd
chore(deps): update TimeWarp packages and analyzers
StevenTCramer Jul 2, 2026
472037c
fix: make strict analyzer build pass and standardize runfile shebangs
StevenTCramer Jul 2, 2026
9115a27
chore(kanban): close task 021 - DevCli shared endpoints integration
StevenTCramer Jul 2, 2026
db8f124
docs(kanban): file 1.0 release readiness code review findings as task…
StevenTCramer Jul 2, 2026
3bd1291
fix: remove ambiguous WritePanel(string, string?) overload
StevenTCramer Jul 3, 2026
bf23150
fix: resolve remaining 1.0 release blockers (task 022)
StevenTCramer Jul 3, 2026
bd611f2
fix: mechanical majors from 1.0 readiness review (task 022)
StevenTCramer Jul 3, 2026
41964e1
fix: direction-clear majors from 1.0 readiness review (task 022)
StevenTCramer Jul 3, 2026
62f3900
feat: Terminal.FormatProvider replaces hardcoded InvariantCulture
StevenTCramer Jul 3, 2026
ef749ca
feat: colored output respects SupportsColor
StevenTCramer Jul 3, 2026
6691560
feat: WriteLink honors SupportsHyperlinks; AsyncLocal test isolation
StevenTCramer Jul 3, 2026
e085b25
fix: deep rendering correctness for 1.0 (task 022)
StevenTCramer Jul 3, 2026
a234deb
feat!: move ReadKey to ITerminal and verify AOT compatibility claim
StevenTCramer Jul 3, 2026
d36c108
chore(deps): update Microsoft.CodeAnalysis.CSharp.CodeStyle 5.3.0 -> …
StevenTCramer Jul 3, 2026
e40c82a
fix: resolve all remaining 1.0 readiness minors (task 022)
StevenTCramer Jul 3, 2026
0de8327
chore(kanban): close task 022 - 1.0 release readiness review
StevenTCramer Jul 3, 2026
290212b
feat!: remove legacy conhost members from the terminal abstraction
StevenTCramer Jul 3, 2026
0ebc246
docs(skill): update terminal skill for 1.0 API changes
StevenTCramer Jul 3, 2026
858c864
feat(dev-cli): dispatch timewarp-software rebuild after release push
StevenTCramer Jul 3, 2026
fb4490e
feat(ci): mint rebuild dispatch token from org GitHub App
StevenTCramer Jul 3, 2026
c240042
chore: bump version to 1.0.0
StevenTCramer Jul 3, 2026
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
2 changes: 1 addition & 1 deletion .editorconfig
Original file line number Diff line number Diff line change
Expand Up @@ -138,7 +138,7 @@ csharp_style_prefer_readonly_struct = true
csharp_style_prefer_readonly_struct_member = true

# Code-block preferences
csharp_prefer_braces = when-multiline:suggestion
csharp_prefer_braces = when_multiline:warning
csharp_prefer_simple_using_statement = true:suggestion
csharp_style_namespace_declarations = file_scoped:error
csharp_style_prefer_method_group_conversion = true
Expand Down
1 change: 1 addition & 0 deletions .githooks/post-commit
18 changes: 18 additions & 0 deletions .githooks/post-commit.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
#!/usr/bin/env -S dotnet --
#:package TimeWarp.Amuru
#:property NoWarn=CA2007

using TimeWarp.Amuru;

string? root = Git.FindRoot();
if (root is null)
{
return 0;
}

await Shell.Builder("ganda")
.WithArguments("memsearch", "index-repo", "--background")
.WithWorkingDirectory(root)
.WithNoValidation()
.RunAsync();
return 0;
1 change: 1 addition & 0 deletions .githooks/post-merge
18 changes: 18 additions & 0 deletions .githooks/post-merge.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
#!/usr/bin/env -S dotnet --
#:package TimeWarp.Amuru
#:property NoWarn=CA2007

using TimeWarp.Amuru;

string? root = Git.FindRoot();
if (root is null)
{
return 0;
}

await Shell.Builder("ganda")
.WithArguments("memsearch", "index-repo", "--background")
.WithWorkingDirectory(root)
.WithNoValidation()
.RunAsync();
return 0;
17 changes: 17 additions & 0 deletions .github/workflows/workflow.yml
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,24 @@ jobs:
with:
user: TimeWarp.Enterprises

# Cross-repo repository_dispatch (timewarp-software rebuild) cannot use the
# default GITHUB_TOKEN. A short-lived installation token is minted from the
# org's TimeWarp Rebuild Dispatcher GitHub App (org variable REBUILD_APP_ID +
# org secret REBUILD_APP_PRIVATE_KEY). If the app is not configured the step
# is skipped and the dispatch degrades to a warning (site rebuilds nightly).
- name: Mint rebuild dispatch token
if: github.event_name == 'release' && vars.REBUILD_APP_ID != ''
id: rebuild-token
uses: actions/create-github-app-token@v2
with:
app-id: ${{ vars.REBUILD_APP_ID }}
private-key: ${{ secrets.REBUILD_APP_PRIVATE_KEY }}
owner: TimeWarpEngineering
repositories: timewarp-software

- name: Run CI Pipeline
env:
GH_TOKEN: ${{ steps.rebuild-token.outputs.token }}
run: |
if [ "${{ github.event_name }}" == "release" ]; then
dotnet run tools/dev-cli/dev.cs -- workflow --api-key "${{ steps.nuget-login.outputs.NUGET_API_KEY }}"
Expand Down
50 changes: 50 additions & 0 deletions .memsearch.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
# MemSearch repo knowledge index — TimeWarp convention
#
# SPEC (proposed extension)
# -------------------------
# memsearch's stock CLI ignores [index]; this file is honored by:
# ganda memsearch index-repo
# ganda hooks install memsearch (post-commit / post-merge runfiles)
#
# Purpose: index markdown knowledge in THIS repo only. One Milvus collection
# per repo (auto-derived from repo path). Global DB file stays at
# ~/.memsearch/milvus.db unless [milvus].uri is overridden below.
#
# [index].paths
# Directory roots (relative to repo root). memsearch indexes all .md files
# under each path recursively. Missing paths are skipped.
#
# [index].exclude_paths
# Directory paths removed from the resolved path list before indexing.
# Does not prune subdirectories when a parent path (e.g. "kanban/") is listed.
#
# [index].exclude_globs
# Reserved — file-level globs (e.g. "**/task-template.md"). Not implemented in v1.
#
# [index].enabled
# false disables hook indexing (conversation plugins still work).
#
# [milvus].collection
# Empty = auto-derive ms_<repo-basename>_<8char_sha256> from repo root.
#
# Search this repo only:
# memsearch search "query" -c <collection> --source-prefix "$(pwd)/kanban/"

[index]
enabled = true
paths = [
"kanban",
"documentation",
"okf",
"adr",
".memsearch/memory",
]
exclude_paths = []
exclude_globs = [
"**/task-template.md",
"**/overview.md",
]

[milvus]
# uri = ".memsearch/milvus.db" # optional per-repo DB file
collection = ""
82 changes: 82 additions & 0 deletions .memsearch/memory/2026-07-02.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@

## Session 21:17

### 21:49
<!-- session:179c59aa-cc0e-4094-99f1-0692f501682b turn:9dcae3c4-13b7-4de0-9d0b-b405a21739ca transcript:/home/steve/worktrees/github.com/TimeWarpEngineering/timewarp-flow/master/claude/projects/-home-steve-worktrees-github-com-TimeWarpEngineering-timewarp-terminal-dev/179c59aa-cc0e-4094-99f1-0692f501682b.jsonl -->
- User shared a repository audit showing 8 failing checks and Claude Code identified the need to resolve them

- Claude Code ran `ganda repo audit --fix` to automatically fix the issues; the fix applied most changes but encountered a build failure due to ~250 pre-existing analyzer style violations in the library source

- Claude Code fixed the library style errors across 13 source files using parallel agents and `dotnet format`, primarily adding braces (IDE0011), populating switch statements (IDE0072), and fixing doc-comment configuration and XML documentation issues

- Claude Code built and installed the dev CLI to bin/dev via AOT compilation, then re-ran the audit which confirmed all 19 checks now pass

- Claude Code ran the full test suite and found 33 failing tests; root cause analysis revealed NU1902/NU1903 NuGet vulnerability errors from MessagePack pulled transitively via TimeWarp.Jaribu 1.0.0-beta.12, resolved by bumping Jaribu to beta.13 and Amuru to beta.34

- Claude Code fixed formatting violations across all 39 test and sample runfiles using `dotnet format whitespace` and manual corrections, and created `samples/Directory.Build.props` to suppress IDE0211 for runfile top-level statements

- All 33 tests now pass, all 5 samples verify successfully, the entire solution builds with zero warnings or errors, and all changes remain uncommitted in the working tree for user review

### 21:56
<!-- session:179c59aa-cc0e-4094-99f1-0692f501682b turn:29284c7b-8257-4fbf-97f1-8321d1247b5b transcript:/home/steve/worktrees/github.com/TimeWarpEngineering/timewarp-flow/master/claude/projects/-home-steve-worktrees-github-com-TimeWarpEngineering-timewarp-terminal-dev/179c59aa-cc0e-4094-99f1-0692f501682b.jsonl -->
- User questioned Claude Code's claim about an analyzer flagging single-line if throw statements, asking which analyzer and for clarification.
- Claude Code identified IDE0011 ("Add braces") from Microsoft.CodeAnalysis.CSharp.CodeStyle as the analyzer, enabled to flag braces violations as build errors via EnforceCodeStyleInBuild.
- Claude Code found the root cause: .editorconfig line 141 uses hyphenated `when-multiline` instead of the documented underscore-separated `when_multiline`.
- Claude Code created an A/B experimental test with a minimal project, confirming the hyphenated variant causes IDE0011 to fire on single-line statements while the underscore variant does not.
- Claude Code explained the analyzer silently ignores the unrecognized hyphenated spelling and falls back to always requiring braces.
- Claude Code noted the same configuration error exists in a shared .editorconfig template at line 141 affecting timewarp-nuru, timewarp-amuru, and timewarp-ganda, though undetected due to existing brace conventions.
- Claude Code confirmed braces were already added to all flagged sites in the current repository (tools/dev-cli/endpoints/workflow.cs), bringing it into compliance.
- Claude Code offered two options: change config to explicit `csharp_prefer_braces = true` to clarify intent, or fix to `when_multiline` (underscore) and propagate to the shared template.

### 22:00
<!-- session:179c59aa-cc0e-4094-99f1-0692f501682b turn:442518a3-fe06-4247-b59c-959a32c772db transcript:/home/steve/worktrees/github.com/TimeWarpEngineering/timewarp-flow/master/claude/projects/-home-steve-worktrees-github-com-TimeWarpEngineering-timewarp-terminal-dev/179c59aa-cc0e-4094-99f1-0692f501682b.jsonl -->
- User requested Claude Code retry a task after updating Microsoft.CodeAnalysis.NetAnalyzers to version 10.0.301
- Claude Code ran experiments to verify whether the analyzer bump affected the `csharp_prefer_braces` configuration behavior
- The experiment showed IDE0011 still flagged single-line `if` statements with hyphen syntax (`when-multiline`) but not with underscore syntax (`when_multiline`)
- Claude Code determined IDE0011 is implemented in `Microsoft.CodeAnalysis.CSharp.CodeStyle` (5.3.0), not in NetAnalyzers, so the bump would not affect brace behavior
- Claude Code applied NetAnalyzers 10.0.301 to `Directory.Packages.props` and verified `project.assets.json` resolved the correct version
- A full solution build completed with 0 warnings and 0 errors; all 33 test runfiles and 19 audit checks passed
- Claude Code identified the root cause of the brace configuration issue: a hyphen typo in `.editorconfig` where `when-multiline` should be `when_multiline`
- Claude Code noted the same hyphenated configuration exists in the shared `.editorconfig` template used by other projects (timewarp-nuru, timewarp-amuru, timewarp-ganda)
- Claude Code recommended a one-character fix to change the hyphen to underscore in `.editorconfig`

### 22:03
<!-- session:179c59aa-cc0e-4094-99f1-0692f501682b turn:e94afd58-4d0f-46d2-940b-c3ca9ae20304 transcript:/home/steve/worktrees/github.com/TimeWarpEngineering/timewarp-flow/master/claude/projects/-home-steve-worktrees-github-com-TimeWarpEngineering-timewarp-terminal-dev/179c59aa-cc0e-4094-99f1-0692f501682b.jsonl -->
- User asked Claude Code to fix one character and test.
- Claude Code modified `.editorconfig` line 141, changing `csharp_prefer_braces = when_multiline:warning` to `csharp_prefer_braces = when_multiline:suggestion`.
- Full non-incremental rebuild completed with 0 warnings and 0 errors.
- All 33 test runfiles passed.
- All 5 samples verified successfully.
- All 19 audit checks passed.
- Claude Code explained that the braces option only governs when braces are required, not forbidden, so previously added braces remain valid.
- Claude Code identified that timewarp-nuru, timewarp-amuru, and timewarp-ganda contain the same hyphenated line in their `.editorconfig` files at line 141.
- Claude Code recommended fixing the shared template source to prevent regression on the next sync and offered to patch the other worktrees if needed.

### 22:07
<!-- session:179c59aa-cc0e-4094-99f1-0692f501682b turn:93c5f79f-8b28-40d4-87bb-1ddff1171c29 transcript:/home/steve/worktrees/github.com/TimeWarpEngineering/timewarp-flow/master/claude/projects/-home-steve-worktrees-github-com-TimeWarpEngineering-timewarp-terminal-dev/179c59aa-cc0e-4094-99f1-0692f501682b.jsonl -->
- User indicated that a configuration setting should be "warning" rather than "suggestion"
- Claude Code explained that IDE0011 was not firing because a one-line body doesn't violate the `when_multiline` rule, requiring a multi-line body to test the severity properly
- Claude Code refined the experiment and silenced unrelated indent noise in the testing output
- Claude Code modified `.editorconfig:141` to set `csharp_prefer_braces = when_multiline:warning` and verified the change
- Claude Code ran a full build, all 33 tests, all 5 samples, and all 19 audit checks, with all checks passing (green)
- Claude Code saved a note about a template typo to preserve context for future sessions
- Claude Code offered to propagate the same fix to timewarp-nuru, timewarp-amuru, timewarp-ganda repositories and the template they sync from, pending User preference

### 22:17
<!-- session:179c59aa-cc0e-4094-99f1-0692f501682b turn:f2909590-6375-4ebe-92fb-60640eeed568 transcript:/home/steve/worktrees/github.com/TimeWarpEngineering/timewarp-flow/master/claude/projects/-home-steve-worktrees-github-com-TimeWarpEngineering-timewarp-terminal-dev/179c59aa-cc0e-4094-99f1-0692f501682b.jsonl -->
- User requested that Claude Code fix a typo across multiple repository worktrees using the dev branch instead of master.
- Claude Code identified and applied fixes for the typo to five repositories: terminal, nuru, amuru, ganda, and architecture.
- During the fix process, Claude Code discovered compilation errors in five locations, which were determined to be multiline conditions with unbraced single-statement bodies that violated `when_multiline` requirements.
- Claude Code added braces to all five affected conditions to resolve the analyzer errors.
- Claude Code updated session memory with the full propagation state of changes across the affected repositories.
- Claude Code identified two pending decisions for User: whether to extend the typo fix to the remaining seven repositories, and whether to undertake a repair of amuru's dev-build which contains 336 pre-existing analyzer errors and a missing `dev-cli.csproj` slnx reference.
- Claude Code noted that User needs to review and commit the uncommitted changes on the dev branches of all five affected repositories.

### 23:53
<!-- session:179c59aa-cc0e-4094-99f1-0692f501682b turn:720ae955-d3b1-4462-abd8-9c4802888822 transcript:/home/steve/worktrees/github.com/TimeWarpEngineering/timewarp-flow/master/claude/projects/-home-steve-worktrees-github-com-TimeWarpEngineering-timewarp-terminal-dev/179c59aa-cc0e-4094-99f1-0692f501682b.jsonl -->
- User displayed the output of a repository audit showing 19 passed checks with 0 failures and 0 skipped tests.
- Claude Code confirmed the repository now passes all audit checks, noting improvement from 8 previous blocking failures to full compliance.
- The audit validated infrastructure components including assembly manifests, build properties, directory structure, NuGet metadata, runfile directives, VS Code configuration, and GitHub workflows.
- Claude Code noted that uncommitted changes remain across five worktrees: terminal, nuru, amuru, ganda, and architecture.
- Two open offers were mentioned: applying an editorconfig typo fix across seven remaining repositories, and repairing the amuru repository's pre-existing broken dev build.

5 changes: 3 additions & 2 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -19,5 +19,6 @@
"titleBar.activeForeground": "#e7e7e7",
"titleBar.inactiveBackground": "#07be5399",
"titleBar.inactiveForeground": "#e7e7e799"
}
}
},
"window.title": "timewarp-terminal · ${rootName}${separator}${activeEditorShort}"
}
18 changes: 18 additions & 0 deletions .vscode/tasks.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
{
"version": "2.0.0",
"tasks": [
{
"label": "ganda: window icon",
"type": "shell",
"command": "ganda repo avatar window",
"runOptions": {
"runOn": "folderOpen"
},
"presentation": {
"reveal": "silent",
"echo": false
},
"problemMatcher": []
}
]
}
9 changes: 7 additions & 2 deletions Directory.Build.props
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<Project>
<!-- Import repository path definitions -->
<Import Project="$(MSBuildThisFileDirectory)msbuild/repository.props" />
Expand Down Expand Up @@ -52,13 +53,16 @@
<ReportAnalyzer>true</ReportAnalyzer>
<CodeAnalysisTreatWarningsAsErrors>true</CodeAnalysisTreatWarningsAsErrors>

<!-- Required for IDE0005 (remove unnecessary usings) to run on build -->
<GenerateDocumentationFile>true</GenerateDocumentationFile>

<!-- Suppress specific warnings -->
<!-- CA1014: CLS compliance not required for this library -->
<!-- CA1716: Reserved keywords (matching System.Console API: In, Error) -->
<!-- CA1724: Type name conflicts (acceptable in this context) -->
<!-- CA1812: False positives for DI-instantiated classes -->
<!-- IL2026, IL2067, IL2070, IL2075, IL3050, IL2104, IL3053: AOT warnings (not yet implemented) -->
<NoWarn>$(NoWarn);CA1014;CA1716;CA1724;CA1812;IL2026;IL2067;IL2070;IL2075;IL3050;IL2104;IL3053</NoWarn>
<!-- CS1591: XML doc comments not required on all public members -->
<NoWarn>$(NoWarn);CA1014;CA1716;CA1724;CA1812;CS1591</NoWarn>
</PropertyGroup>

<!-- Code analyzers applied to all projects -->
Expand All @@ -68,6 +72,7 @@
<PackageReference Include="Roslynator.Formatting.Analyzers" PrivateAssets="all" />
<PackageReference Include="Microsoft.CodeAnalysis.NetAnalyzers" PrivateAssets="all" />
<PackageReference Include="Microsoft.CodeAnalysis.CSharp.CodeStyle" PrivateAssets="all" />
<PackageReference Include="TimeWarp.Build.Tasks" PrivateAssets="all" />
</ItemGroup>

</Project>
17 changes: 10 additions & 7 deletions Directory.Packages.props
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,14 @@
<ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>
</PropertyGroup>
<ItemGroup Label="TimeWarp Packages">
<PackageVersion Include="TimeWarp.Amuru" Version="1.0.0-beta.33" />
<PackageVersion Include="TimeWarp.Builder" Version="1.0.0-beta.2" />
<PackageVersion Include="TimeWarp.Jaribu" Version="1.0.0-beta.12" />
<PackageVersion Include="TimeWarp.Nuru" Version="3.0.0-beta.70" />
<PackageVersion Include="TimeWarp.Nuru.DevCli" Version="3.0.0-beta.70" />
<PackageVersion Include="TimeWarp.Amuru" Version="1.0.0-beta.34" />
<PackageVersion Include="TimeWarp.Builder" Version="1.0.0" />
<!-- Jaribu beta.12 pulls Amuru beta.21 -> StreamJsonRpc -> MessagePack 2.5.198,
which trips NU1902/NU1903 under our TreatWarningsAsErrors policy -->
<PackageVersion Include="TimeWarp.Jaribu" Version="1.0.0-beta.13" />
<PackageVersion Include="TimeWarp.Nuru" Version="3.0.0-beta.71" />
<PackageVersion Include="TimeWarp.Nuru.DevCli" Version="3.0.0-beta.71" />
<PackageVersion Include="TimeWarp.Build.Tasks" Version="1.0.0" />
</ItemGroup>
<ItemGroup Label="Testing">
<PackageVersion Include="Shouldly" Version="4.3.0" />
Expand All @@ -18,7 +21,7 @@
<PackageVersion Include="Roslynator.Analyzers" Version="4.15.0" />
<PackageVersion Include="Roslynator.CodeAnalysis.Analyzers" Version="4.15.0" />
<PackageVersion Include="Roslynator.Formatting.Analyzers" Version="4.15.0" />
<PackageVersion Include="Microsoft.CodeAnalysis.NetAnalyzers" Version="10.0.300" />
<PackageVersion Include="Microsoft.CodeAnalysis.CSharp.CodeStyle" Version="5.3.0" />
<PackageVersion Include="Microsoft.CodeAnalysis.NetAnalyzers" Version="10.0.301" />
<PackageVersion Include="Microsoft.CodeAnalysis.CSharp.CodeStyle" Version="5.6.0" />
</ItemGroup>
</Project>
19 changes: 15 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -54,13 +54,25 @@ var (left, top) = GetCursorPosition();

### Testing with Static Terminal

Use `TestTerminalContext` to redirect the static `Terminal` class in tests:

```csharp
using TestTerminal terminal = new();
using IDisposable scope = TestTerminalContext.Use(terminal);

Terminal.WriteLine("Hello");
terminal.OutputContains("Hello").ShouldBeTrue();
```

The scope is async-context isolated - each test flow sees only its own `TestTerminal`, so parallel tests never interfere with each other, and the global terminal is never mutated. Disposing the scope restores the previous context automatically.

For serial tests you can also swap `Terminal.Instance` directly, but remember to restore it:

```csharp
// Replace Instance for testing
using TestTerminal testTerminal = new();
Terminal.Instance = testTerminal;

Terminal.WriteLine("test output");

Assert.Contains("test output", testTerminal.Output);

// Restore after test
Expand Down Expand Up @@ -189,8 +201,7 @@ terminal.WriteTable(t => t
.AddRow("GuardClauses", "12M", "/home/user/packages/guard")
.Border(BorderStyle.Rounded)
.BorderColor(AnsiColors.Cyan)
.Expand()
.Shrink());
.Expand()); // tables shrink to fit the terminal automatically

terminal.WriteTable(table);
```
Expand Down
Empty file added kanban/backlog/.gitkeep
Empty file.
Loading
Loading