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
e945d99
docs(03): capture phase context
guy-lud Jul 14, 2026
6cbf370
docs(state): record phase 3 context session
guy-lud Jul 14, 2026
d8e7a89
docs(03): research public-surface/packaging/binder cleanup phase
guy-lud Jul 14, 2026
467fbcc
docs: refresh session handoff (Phase 3 — discuss+research done, plann…
guy-lud Jul 14, 2026
f4053e3
docs(phase-3): add validation strategy
guy-lud Jul 14, 2026
6d4dc50
docs(03): create phase plan (public surface, packaging & binder cleanup)
guy-lud Jul 14, 2026
3ba5a8c
docs(03): refine D-05 (split exe-skip by entry point) + resolve open …
guy-lud Jul 14, 2026
ab4a092
docs(03): finalize phase 3 plan (2 plans) after plan-check + architec…
guy-lud Jul 14, 2026
1d2349e
refactor(03-01): make SettingsHolder internal sealed (API-01/D-01)
guy-lud Jul 14, 2026
774bc0e
chore(03-01): remove dead Core.AspNet package (PKG-01/D-02)
guy-lud Jul 14, 2026
2db3bdf
chore(03-01): float Microsoft.Extensions.* floor per-TFM (PKG-02/D-03)
guy-lud Jul 14, 2026
d27602d
docs(03-01): complete public-surface/packaging/binder-cleanup plan
guy-lud Jul 14, 2026
a9558fb
test(03-02): add failing CLI binder cases for lookahead + SkipFirstAr…
guy-lud Jul 14, 2026
29f5469
feat(03-02): add SkipFirstArgument option + lookahead CLI parse (SRC-…
guy-lud Jul 14, 2026
ac537cf
feat(03-02): AddCommandLine sources GetCommandLineArgs + owns exe ski…
guy-lud Jul 14, 2026
d5f9b15
docs(03-02): complete command-line binder cleanup plan
guy-lud Jul 14, 2026
4a8c8de
fix(03-02): null-guard CLI lookahead value token (post-review hardening)
guy-lud Jul 14, 2026
9a1f791
docs(phase-03): complete phase execution (verified 4/4, review clean)
guy-lud Jul 14, 2026
cf69197
docs(backlog): capture client pre-beta engine requirements (COLL/VAL/…
guy-lud Jul 14, 2026
4c9a51e
docs: refresh handoff + record approved pre-beta engine phase (client…
guy-lud Jul 14, 2026
2dc48e6
some cleanups and chanes
guy-lud Jul 14, 2026
99331a8
Merge master into gsd/phase-4-collection-validation-binding (reconcil…
guy-lud Jul 14, 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
12 changes: 8 additions & 4 deletions .planning/backlog/client-requirements-pre-beta.md
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,11 @@

---

## Recommended integration (after Phase 3)
1. `/gsd-new-milestone` OR extend the current milestone: add these as REQUIREMENTS.md entries (finalize IDs).
2. Insert a **new engine phase** (collections + validation) before the beta; renumber: current Phase 4 (AOT/docs) and Phase 5 (beta) shift out so the beta stays last.
3. Discuss-phase for the new phase (COLL-02/03 sequencing, VAL-01 pipeline hook point, the S1 re-verification gate for COLL-03).
## Integration decision — APPROVED 2026-07-14 (owner)
**Chosen: new engine phase before the beta** (renumber, beta stays last). Phase 3 shipped separately as PR #31.

1. Add these as `REQUIREMENTS.md` entries (finalize IDs COLL-02/COLL-03/VAL-01/VAL-02/API-02).
2. Insert as **new Phase 4 "Collection & Validation Binding"** via `/gsd-phase`; renumber current Phase 4 (AOT/docs) → **Phase 5**, current Phase 5 (beta) → **Phase 6**.
3. `/gsd-discuss-phase 4` → plan → execute. Discussion must cover: COLL-02/03 sequencing, VAL-01 pipeline hook point, the **S1 secret-redaction re-verification gate for COLL-03** (it edits `BindPropertySettings`), and the load-bearing comma-scalar compatibility.

Staged on branch `gsd/phase-4-collection-validation-binding` (forked off the Phase 3 tip; rebase onto `master` after PR #31 merges).
92 changes: 40 additions & 52 deletions SESSION-HANDOFF.md

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
@@ -1,9 +1,3 @@
using System;
using System.Collections.Generic;
using System.Linq;
using ExistForAll.SimpleSettings;
using ExistForAll.SimpleSettings.Binders;

namespace ExistForAll.SimpleSettings.Binders
{
public class CommandLineSettingsBinder : ISectionBinder
Expand All @@ -26,6 +20,7 @@ public CommandLineSettingsBinder(string[] args, CommandLineSettingsBinderOptions

public void BindPropertySettings(BindingContext context)
{

var key = _options.NameFormatter != null ? _options.NameFormatter(context.Section, context.Key) : context.Key;

if(_argumentStore.TryGetValue(key, out var value))
Expand All @@ -34,7 +29,7 @@ public void BindPropertySettings(BindingContext context)
}
}

private void Parse(string[] args)
private void Parse(string[]? args)
{
_argumentStore.Clear();

Expand All @@ -61,47 +56,39 @@ private void Parse(string[] args)
if (!tokenWasPrefixed || index + 1 >= args.Length) continue;

var next = args[index + 1];
if (next is null) continue;
if (next.Length > 0 && Array.IndexOf(prefixes, next[0]) >= 0) continue;

_argumentStore[name] = next;
index++;
}
}

private static Tuple<string, string?>? SplitByDelimiter(string str, CommandLineSettingsBinderOptions options)
private static Tuple<string, string?>? SplitByDelimiter(string? str, CommandLineSettingsBinderOptions options)
{
if (str == null)
return null;

string key;
string? value;

if (!options.Delimiters.Any())
if (!options.Delimiters.Any())
return new Tuple<string, string?>(str.Trim(), null);

var indices = options.Delimiters
.Select(d => str.IndexOf(d, StringComparison.Ordinal))
.Where(d => d != -1).ToList();

if (indices.Count == 0)
{
key = str.Trim();
value = null;
}
else
{

var indices = options.Delimiters.Where(delimiter => delimiter != null)
.Select(d => str.IndexOf(d))
.Where(d => d != -1).ToList();

if (indices.Count == 0)
{
key = str.Trim();
value = null;
}
else
{
var idx = indices.OrderBy(i => i).First();
key = str.Substring(0, idx);
value = str.Substring(idx + 1);
}
var idx = indices.OrderBy(i => i).First();
key = str[..idx];
value = str[(idx + 1)..];
}

return new Tuple<string, string?>(key, value);
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
using System;
using System.Collections.Generic;
using ExistForAll.SimpleSettings.Binder;

namespace ExistForAll.SimpleSettings.Binders
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
using System;
using System.Collections;

namespace ExistForAll.SimpleSettings.Binders
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
using System;

namespace ExistForAll.SimpleSettings.Binders
{
public class EnvironmentVariableBinderOptions
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
using System;
using Microsoft.Extensions.Configuration;

namespace ExistForAll.SimpleSettings.Binders
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
using System.Collections.Generic;
using System.Reflection;

namespace ExistForAll.SimpleSettings.Extensions.GenericHost
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,4 @@
using System;

namespace ExistForAll.SimpleSettings.Extensions.GenericHost
namespace ExistForAll.SimpleSettings.Extensions.GenericHost
{
public interface ISettingsProvider
{
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
using System;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection;

namespace ExistForAll.SimpleSettings.Extensions.GenericHost
{
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,4 @@
using System;
using System.Collections.Generic;
using System.Reflection;
using System.Reflection;

namespace ExistForAll.SimpleSettings.Extensions.GenericHost
{
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
using System.Linq;
using System.Reflection;
using System.Reflection;

namespace ExistForAll.SimpleSettings.Extensions.GenericHost
{
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
using System;

namespace ExistForAll.SimpleSettings.Extensions.GenericHost
{
internal class SettingsProvider : ISettingsProvider
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,4 @@
using System;
using System.Collections.Generic;

namespace ExistForAll.SimpleSettings.Binder
namespace ExistForAll.SimpleSettings.Binder
{
public class InMemoryCollection : IInMemoryCollection
{
Expand Down
1 change: 0 additions & 1 deletion src/Core/ExistForAll.SimpleSettings/BindingContext.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
using System;
using System.Reflection;

namespace ExistForAll.SimpleSettings
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,4 @@
using System;

namespace ExistForAll.SimpleSettings.Conversion
namespace ExistForAll.SimpleSettings.Conversion
{
internal class ArrayTypeConverter : CollectionTypeConverter
{
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
using System;

namespace ExistForAll.SimpleSettings.Conversion
{
// Shared conversion for the two collection shapes — arrays and IEnumerable<T> properties. Both split a
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
using System;
using System.Globalization;
using System.Globalization;

namespace ExistForAll.SimpleSettings.Conversion
{
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
using System;
using System.Globalization;
using System.Globalization;

namespace ExistForAll.SimpleSettings.Conversion
{
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
using System;
using System.Reflection;
using System.Reflection;

namespace ExistForAll.SimpleSettings.Conversion
{
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
using System;
using System.Reflection;
using System.Reflection;
using ExistForAll.SimpleSettings.Core.Reflection;

namespace ExistForAll.SimpleSettings.Conversion
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,4 @@
using System;

namespace ExistForAll.SimpleSettings.Conversion
namespace ExistForAll.SimpleSettings.Conversion
{
/// <summary>
/// Converts a bound settings value to a property's target type.
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
using System;

namespace ExistForAll.SimpleSettings.Conversion
{
// A per-property conversion resolved once (at plan build) instead of on every populate: the chosen
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,4 @@
using System.Collections.Generic;

namespace ExistForAll.SimpleSettings.Conversion
namespace ExistForAll.SimpleSettings.Conversion
{
internal class TypeConvertersCollections : LinkedList<ISettingsTypeConverter>
{
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,4 @@
using System;

namespace ExistForAll.SimpleSettings.Conversion
namespace ExistForAll.SimpleSettings.Conversion
{
internal class UriTypeConvertor : ISettingsTypeConverter
{
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,4 @@
using System;
using System.Collections.Generic;
using System.Reflection;
using System.Reflection;

namespace ExistForAll.SimpleSettings.Core
{
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
using System;
using System.Collections.Generic;
using System.Reflection;
using System.Reflection.Emit;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
using System.Collections.Generic;
using System.Reflection;
using System.Reflection;
using System.Reflection.Emit;

namespace ExistForAll.SimpleSettings.Core.Reflection
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
using System.Collections.Generic;
using System.Reflection;
using System.Reflection.Emit;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,4 @@
using System;

namespace ExistForAll.SimpleSettings.Core.Reflection
namespace ExistForAll.SimpleSettings.Core.Reflection
{
internal interface ISettingsClassGenerator
{
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
using System;
using System.Collections.Generic;
using System.Reflection;

namespace ExistForAll.SimpleSettings.Core.Reflection
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,4 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Reflection;
using System.Reflection.Emit;

namespace ExistForAll.SimpleSettings.Core.Reflection
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,4 @@
using System;
using System.Collections.Concurrent;
using System.Linq;
using System.Collections.Concurrent;
using System.Reflection;
using System.Reflection.Emit;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
using System;
using System.Reflection;
using ExistForAll.SimpleSettings.Conversion;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,4 @@
using System;
using System.Collections.Generic;
using System.Reflection;
using System.Reflection;

namespace ExistForAll.SimpleSettings.Core.Reflection
{
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,4 @@
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Linq;
using System.Collections.Concurrent;
using System.Reflection;

namespace ExistForAll.SimpleSettings.Core.Reflection
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
using System;
using System.Reflection;

namespace ExistForAll.SimpleSettings.Core
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,3 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;

namespace ExistForAll.SimpleSettings.Core
Expand Down
5 changes: 1 addition & 4 deletions src/Core/ExistForAll.SimpleSettings/ISettingsCollection.cs
Original file line number Diff line number Diff line change
@@ -1,7 +1,4 @@
using System;
using System.Collections.Generic;

namespace ExistForAll.SimpleSettings
namespace ExistForAll.SimpleSettings
{
public interface ISettingsCollection : IEnumerable<KeyValuePair<Type, object>>
{
Expand Down
4 changes: 1 addition & 3 deletions src/Core/ExistForAll.SimpleSettings/ISettingsHolder.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,4 @@
using System;

namespace ExistForAll.SimpleSettings
namespace ExistForAll.SimpleSettings
{
internal interface ISettingsHolder
{
Expand Down
3 changes: 0 additions & 3 deletions src/Core/ExistForAll.SimpleSettings/IValuesPopulator.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,3 @@
using System;
using System.Collections.Generic;

namespace ExistForAll.SimpleSettings
{
internal interface IValuesPopulator
Expand Down
1 change: 0 additions & 1 deletion src/Core/ExistForAll.SimpleSettings/Resources.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
using System;
using System.Reflection;

namespace ExistForAll.SimpleSettings
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,4 @@
using System;

namespace ExistForAll.SimpleSettings
namespace ExistForAll.SimpleSettings
{
// Raised when an ISectionBinder throws while binding a property. It carries the binder type, section, and
// key as primitives and deliberately does NOT retain the BindingContext — the context holds the bound value
Expand Down
3 changes: 0 additions & 3 deletions src/Core/ExistForAll.SimpleSettings/SettingsBuilder.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,3 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using ExistForAll.SimpleSettings.Core;
using ExistForAll.SimpleSettings.Core.Reflection;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
using System;
using System.Linq;
using System.Reflection;

namespace ExistForAll.SimpleSettings
Expand Down
3 changes: 0 additions & 3 deletions src/Core/ExistForAll.SimpleSettings/SettingsBuilderFactory.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,3 @@
using System;
using System.Collections.Generic;

namespace ExistForAll.SimpleSettings
{
internal class SettingsBuilderFactory : ISettingsBuilderFactory
Expand Down
Loading
Loading