Skip to content

feat: enable Aspire dashboard and add seed data support#118

Merged
Aaronontheweb merged 5 commits into
devfrom
feature/aspire-dashboard-seeding
Jul 6, 2026
Merged

feat: enable Aspire dashboard and add seed data support#118
Aaronontheweb merged 5 commits into
devfrom
feature/aspire-dashboard-seeding

Conversation

@Aaronontheweb

Copy link
Copy Markdown
Contributor

Changes

Dashboard

  • Enable the .NET Aspire dashboard (removed DisableDashboard = true)
  • Dashboard auto-launches at http://localhost:15888 with SkillServer resource visible

Seed Data

  • Add SeedDataService that scans a configurable seed directory on startup and uploads skills/sub-agents via existing upload services
  • Controlled by SkillServer:SeedData config flag (default false — off in production)
  • AppHost sets SeedData=true in development via appsettings.Development.json
  • Seed path configurable via SkillServer:SeedPath (defaults to ./seed)
  • Idempotent — skips existing versions, graceful degradation on missing directories

Sample Seed Data

  • Skills: dockerfile-hardening (security), code-review-checklist (code-quality)
  • Sub-agents: static-analysis-auditor (Compaction), dependency-impact-analyzer (Main)
  • All PII-reviewed — no internal references or sensitive content

Config

  • SkillServer:SeedData — bool to enable/disable seeding (default: false)
  • SkillServer:SeedPath — path to seed directory (default: ./seed)
  • SkillServer:DataPath — persisted in data/ (already existed, now explicit in AppHost)

Operational Modes

Mode Config Use Case
Naked SeedData: false (default) Production, CI, clean slate
Seeded SeedData: true + seed files Local dev, smoke testing

Verification

  • All 215 tests pass
  • Builds with 0 warnings
  • Seed files copied to output via csproj Content items

- Enable the .NET Aspire dashboard (removed DisableDashboard)
- Add SeedDataService that uploads skills/sub-agents from seed/ directory
- Seed data controlled by SkillServer:SeedData config flag (default false)
- AppHost sets SeedData=true in development with sample skills and sub-agents
- Seed files: dockerfile-hardening, code-review-checklist skills + static-analysis-auditor, dependency-impact-analyzer sub-agents
- Idempotent seeding - skips existing versions gracefully
The AppHost had no launch profile, so `dotnet run` failed at startup:
the dashboard resource requires ASPNETCORE_URLS and an OTLP endpoint URL,
both normally supplied by a launch profile's environment variables.

Add https/http profiles defining applicationUrl plus the
ASPIRE_DASHBOARD_OTLP_ENDPOINT_URL and ASPIRE_RESOURCE_SERVICE_ENDPOINT_URL
variables. Verified the https profile starts the distributed application
and serves the dashboard.
The two seed skills declared `metadata.tags` as a YAML list. The parser
deserializes frontmatter `metadata` into Dictionary<string,string>, so a
sequence value threw during deserialization and ParseFrontmatter returned
null — the whole skill was rejected with "missing or invalid YAML
frontmatter." Sub-agents seeded fine because they carry no metadata block.

Convert `tags` to a comma-separated string to match the string-valued
metadata contract (same shape the tests and metadata[...] lookups assume).
Verified against a fresh DB: both skills and both sub-agents now seed and
are returned by /api/v1/skills and /api/v1/subagents.
Frontmatter `metadata` deserializes into Dictionary<string,string>, so any
value that wasn't a plain scalar (e.g. `tags: [a, b, c]`) threw during
parsing and silently discarded the entire skill. Add a YamlDotNet type
converter that coerces every metadata value to a string regardless of node
shape: sequences join with ", ", nested mappings flatten to "key: value",
and unknown nodes are skipped rather than fatal. Consumers still read
Dictionary<string,string>, so nothing downstream changes.

Restore the seed skills' `tags` to natural YAML list form (now that it
parses) and drop their `metadata.subagent` references, which pointed at
sub-agents that don't exist.

Add an integration test asserting a skill with list-valued metadata uploads
successfully and its sibling scalar metadata (category) still parses.
BuildZip pins every entry to a fixed 1980-01-01 timestamp for deterministic
output. The ZIP format stores DOS date/time with no timezone, so on read-back
System.IO.Compression returns a DateTimeOffset in the machine's local offset.
The test compared the full DateTimeOffset, so it passed only on UTC machines
and failed everywhere else (e.g. -06:00) even though the archive bytes are
identical and correct.

Assert on the wall-clock DateTime component instead, which is what the format
round-trips deterministically regardless of the runner's timezone.
@Aaronontheweb Aaronontheweb enabled auto-merge (squash) July 6, 2026 22:11
@Aaronontheweb Aaronontheweb merged commit 95b4a5b into dev Jul 6, 2026
7 checks passed
@Aaronontheweb Aaronontheweb deleted the feature/aspire-dashboard-seeding branch July 6, 2026 22:15
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