diff --git a/CLAUDE.md b/CLAUDE.md index 5d2db17..23be95a 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -24,7 +24,7 @@ apps/ web-react/ # Trace Explorer — execution timeline debugger react-demo/ # Expedition React browser demo (adopted from Traverse) browser-consumer/ # Browser consumer façade - macos-demo/ # Expedition macOS demo + android-demo/ # Expedition Android demo youaskm3-starter-kit/ # Downstream browser starter kit fixtures/ # Shared UI demo fixtures .agents/skills/ diff --git a/README.md b/README.md index 14e177b..2b300a6 100644 --- a/README.md +++ b/README.md @@ -28,7 +28,6 @@ UI examples for [Traverse](https://github.com/traverse-framework/Traverse). | Demo | Path | |---|---| | React browser demo | [`apps/react-demo/`](apps/react-demo/) | -| macOS demo | [`apps/macos-demo/`](apps/macos-demo/) | | Browser consumer façade | [`apps/browser-consumer/`](apps/browser-consumer/) | | youaskm3 starter kit | [`apps/youaskm3-starter-kit/`](apps/youaskm3-starter-kit/) | @@ -37,6 +36,7 @@ UI examples for [Traverse](https://github.com/traverse-framework/Traverse). | Path | Retired | Notes | |---|---|---| | `apps/android-demo` | 2026-08-12 | Spec 004 retire ([#251](https://github.com/traverse-framework/reference-apps/pull/251)); use primary Android Compose shells | +| `apps/macos-demo` | 2026-08-12 | Spec 004 retire ([#252](https://github.com/traverse-framework/reference-apps/pull/252)); use primary SwiftUI shells | --- diff --git a/apps/macos-demo/Package.swift b/apps/macos-demo/Package.swift deleted file mode 100644 index 62193ec..0000000 --- a/apps/macos-demo/Package.swift +++ /dev/null @@ -1,18 +0,0 @@ -// swift-tools-version: 6.0 -import PackageDescription - -let package = Package( - name: "TraverseMacOSDemo", - platforms: [ - .macOS(.v14), - ], - products: [ - .executable(name: "TraverseMacOSDemoApp", targets: ["TraverseMacOSDemoApp"]), - ], - targets: [ - .executableTarget( - name: "TraverseMacOSDemoApp", - path: "Sources/TraverseMacOSDemoApp" - ), - ] -) diff --git a/apps/macos-demo/README.md b/apps/macos-demo/README.md deleted file mode 100644 index a37f9bb..0000000 --- a/apps/macos-demo/README.md +++ /dev/null @@ -1,27 +0,0 @@ -# Traverse macOS Demo - -Checked-in native SwiftUI demo for Traverse expedition planning. - -Canonical home: **`traverse-framework/reference-apps`** (`apps/macos-demo/`). - -What it does: - -- renders one approved expedition flow -- shows ordered runtime state updates -- shows the final trace summary and output panel -- keeps the runtime separate from the app process - -Fixture source: [`fixtures/expedition-runtime-session.json`](../../fixtures/expedition-runtime-session.json) (run the app from the repository root so the relative path resolves). - -## Run (full Xcode) - -```bash -open apps/macos-demo/Package.swift -# run TraverseMacOSDemoApp -``` - -## Validation - -```bash -bash scripts/ci/macos_demo_smoke.sh -``` diff --git a/apps/macos-demo/Sources/TraverseMacOSDemoApp/DemoContentView.swift b/apps/macos-demo/Sources/TraverseMacOSDemoApp/DemoContentView.swift deleted file mode 100644 index a885f3c..0000000 --- a/apps/macos-demo/Sources/TraverseMacOSDemoApp/DemoContentView.swift +++ /dev/null @@ -1,87 +0,0 @@ -import SwiftUI - -struct DemoSessionViewModel { - let session: DemoSession - - static func sample() -> DemoSessionViewModel { - DemoSessionViewModel(session: DemoSessionRepository.sample()) - } -} - -struct DemoContentView: View { - let viewModel: DemoSessionViewModel - - var body: some View { - NavigationSplitView { - List(viewModel.session.stateUpdates) { update in - VStack(alignment: .leading, spacing: 6) { - Text(update.title) - .font(.headline) - Text(update.detail) - .font(.subheadline) - .foregroundStyle(.secondary) - Text(update.timestamp) - .font(.caption.monospaced()) - .foregroundStyle(.tertiary) - } - .padding(.vertical, 6) - } - .navigationTitle(viewModel.session.title) - } detail: { - ScrollView { - VStack(alignment: .leading, spacing: 18) { - GroupBox("Runtime Summary") { - VStack(alignment: .leading, spacing: 10) { - labeledRow("Status", value: viewModel.session.status) - labeledRow("Request", value: viewModel.session.requestID) - labeledRow("Execution", value: viewModel.session.executionID) - labeledRow("Trace", value: viewModel.session.traceID) - labeledRow("Target", value: viewModel.session.trace.placement.selectedTarget) - Text(viewModel.session.summary) - .font(.body) - } - .frame(maxWidth: .infinity, alignment: .leading) - } - - GroupBox("Request Goal") { - Text(viewModel.session.request.goal) - .frame(maxWidth: .infinity, alignment: .leading) - } - - GroupBox("Emitted Events") { - VStack(alignment: .leading, spacing: 8) { - ForEach(viewModel.session.trace.emittedEvents, id: \.self) { eventID in - Text(eventID) - .font(.body.monospaced()) - } - } - .frame(maxWidth: .infinity, alignment: .leading) - } - - GroupBox("Final Output") { - VStack(alignment: .leading, spacing: 10) { - labeledRow("Plan ID", value: viewModel.session.trace.output.planID) - labeledRow("Route", value: viewModel.session.trace.output.route) - labeledRow("Weather", value: viewModel.session.trace.output.weatherSummary) - labeledRow("Team Status", value: viewModel.session.trace.output.teamStatus) - labeledRow("Next Action", value: viewModel.session.trace.output.nextAction) - } - .frame(maxWidth: .infinity, alignment: .leading) - } - } - .padding(24) - } - } - } - - @ViewBuilder - private func labeledRow(_ label: String, value: String) -> some View { - VStack(alignment: .leading, spacing: 4) { - Text(label) - .font(.caption) - .foregroundStyle(.secondary) - Text(value) - .font(.body) - } - } -} diff --git a/apps/macos-demo/Sources/TraverseMacOSDemoApp/DemoSession.swift b/apps/macos-demo/Sources/TraverseMacOSDemoApp/DemoSession.swift deleted file mode 100644 index 4e2ef21..0000000 --- a/apps/macos-demo/Sources/TraverseMacOSDemoApp/DemoSession.swift +++ /dev/null @@ -1,136 +0,0 @@ -import Foundation - -struct DemoSession: Decodable { - let demoID: String - let title: String - let requestID: String - let executionID: String - let traceID: String - let status: String - let summary: String - let request: DemoRequest - let stateUpdates: [DemoStateUpdate] - let trace: DemoTrace - - enum CodingKeys: String, CodingKey { - case demoID = "demo_id" - case title - case requestID = "request_id" - case executionID = "execution_id" - case traceID = "trace_id" - case status - case summary - case request - case stateUpdates = "state_updates" - case trace - } -} - -struct DemoRequest: Decodable { - let goal: String - let requestedTarget: String - let caller: String - - enum CodingKeys: String, CodingKey { - case goal - case requestedTarget = "requested_target" - case caller - } -} - -struct DemoStateUpdate: Decodable, Identifiable { - let state: String - let title: String - let timestamp: String - let detail: String - - var id: String { "\(timestamp)-\(state)" } -} - -struct DemoTrace: Decodable { - let selectedCapabilityID: String - let selectedCapabilityVersion: String - let placement: DemoPlacement - let emittedEvents: [String] - let output: DemoOutput - - enum CodingKeys: String, CodingKey { - case selectedCapabilityID = "selected_capability_id" - case selectedCapabilityVersion = "selected_capability_version" - case placement - case emittedEvents = "emitted_events" - case output - } -} - -struct DemoPlacement: Decodable { - let requestedTarget: String - let selectedTarget: String - let status: String - let reason: String - - enum CodingKeys: String, CodingKey { - case requestedTarget = "requested_target" - case selectedTarget = "selected_target" - case status - case reason - } -} - -struct DemoOutput: Decodable { - let planID: String - let route: String - let weatherSummary: String - let teamStatus: String - let nextAction: String - - enum CodingKeys: String, CodingKey { - case planID = "plan_id" - case route - case weatherSummary = "weather_summary" - case teamStatus = "team_status" - case nextAction = "next_action" - } -} - -enum DemoSessionRepository { - static func sample() -> DemoSession { - let url = URL(fileURLWithPath: "fixtures/expedition-runtime-session.json") - let data = (try? Data(contentsOf: url)) ?? Data() - let decoder = JSONDecoder() - - if let session = try? decoder.decode(DemoSession.self, from: data) { - return session - } - - return DemoSession( - demoID: "fallback", - title: "Traverse macOS Demo", - requestID: "req-fallback", - executionID: "exec-fallback", - traceID: "trace-fallback", - status: "error", - summary: "Fixture loading failed.", - request: DemoRequest(goal: "Unavailable", requestedTarget: "local", caller: "native_demo"), - stateUpdates: [], - trace: DemoTrace( - selectedCapabilityID: "unavailable", - selectedCapabilityVersion: "0.0.0", - placement: DemoPlacement( - requestedTarget: "local", - selectedTarget: "local", - status: "not_attempted", - reason: "fixture_unavailable" - ), - emittedEvents: [], - output: DemoOutput( - planID: "unavailable", - route: "Unavailable", - weatherSummary: "Unavailable", - teamStatus: "unavailable", - nextAction: "Restore the fixture file." - ) - ) - ) - } -} diff --git a/apps/macos-demo/Sources/TraverseMacOSDemoApp/TraverseMacOSDemoApp.swift b/apps/macos-demo/Sources/TraverseMacOSDemoApp/TraverseMacOSDemoApp.swift deleted file mode 100644 index ad45092..0000000 --- a/apps/macos-demo/Sources/TraverseMacOSDemoApp/TraverseMacOSDemoApp.swift +++ /dev/null @@ -1,12 +0,0 @@ -import SwiftUI - -@main -struct TraverseMacOSDemoApp: App { - var body: some Scene { - WindowGroup("Traverse macOS Demo") { - DemoContentView(viewModel: DemoSessionViewModel.sample()) - .frame(minWidth: 1080, minHeight: 720) - } - .windowStyle(.titleBar) - } -} diff --git a/docs/adopted-platform-clients.md b/docs/adopted-platform-clients.md index b55e475..35aa205 100644 --- a/docs/adopted-platform-clients.md +++ b/docs/adopted-platform-clients.md @@ -18,7 +18,7 @@ Ownership boundary (Traverse [#703](https://github.com/traverse-framework/Traver |---|---|---| | `apps/android-demo/` | Reference Apps | **Retired** 2026-08-12 (`retire-android-demo`) — use primary Android Compose shells | | `apps/browser-consumer/` | Reference Apps | [`apps/browser-consumer/`](../apps/browser-consumer/) | -| `apps/macos-demo/` | Reference Apps | [`apps/macos-demo/`](../apps/macos-demo/) | +| `apps/macos-demo/` | Reference Apps | **Retired** 2026-08-12 (`retire-macos-demo`) — use primary SwiftUI shells | | `apps/react-demo/` | Reference Apps | [`apps/react-demo/`](../apps/react-demo/) | | `apps/youaskm3-starter-kit/` | Reference Apps | [`apps/youaskm3-starter-kit/`](../apps/youaskm3-starter-kit/) | | `apps/llm-mcp-reference/` (new) | Reference Apps | [`apps/llm-mcp-reference/`](../apps/llm-mcp-reference/) — LLM MCP façades; [`llm-reference-apps-plan.md`](llm-reference-apps-plan.md) | @@ -30,7 +30,7 @@ Shared fixture for remaining native demos: [`fixtures/expedition-runtime-session | Artifact | Command | |---|---| -| macOS demo | `bash scripts/ci/macos_demo_smoke.sh` | +| Android demo | `bash scripts/ci/android_demo_smoke.sh` | | React demo | `bash scripts/ci/react_demo_smoke.sh` | | youaskm3 starter | `bash scripts/ci/youaskm3_starter_kit_smoke.sh` | | LLM MCP reference | `bash scripts/ci/llm_mcp_reference_smoke.sh` | diff --git a/docs/demo-inventory.md b/docs/demo-inventory.md index 00e783f..f8ef50d 100644 --- a/docs/demo-inventory.md +++ b/docs/demo-inventory.md @@ -12,7 +12,9 @@ Reconciled against `find apps -maxdepth 1 -type d` on 2026-08-11. Primaries are | `apps/trace-explorer` | already-primary | Debugger companion (web-only by design) | — | | `apps/react-demo` | retire | Expedition browser sample; Spec 004 non-goal as production pattern; primaries own Web UX | `retire-react-demo` | | `apps/android-demo` | retire (done) | Removed 2026-08-12; superseded by primary Android Compose shells | `retire-android-demo` | -| `apps/macos-demo` | retire | Expedition macOS sample; superseded by primary SwiftUI shells | `retire-macos-demo` | +| `apps/macos-demo` | retire (done) | Removed 2026-08-12; superseded by primary SwiftUI shells | `retire-macos-demo` | +| `apps/android-demo` | retire | Expedition Android sample; superseded by primary Android Compose shells | `retire-android-demo` | +| `apps/macos-demo` | retire (done) | Removed 2026-08-12; superseded by primary SwiftUI shells | `retire-macos-demo` | | `apps/browser-consumer` | upgrade | Keep as downstream browser façade; align to Specs 001/002 and stop depending on `react-demo` once that path retires | `upgrade-browser-consumer-events` | | `apps/youaskm3-starter-kit` | upgrade | Keep as downstream getting-started kit; point at embedded/public surfaces + Specs 001/002 vocabulary | `upgrade-youaskm3-starter-kit-events` | | `apps/llm-mcp-reference` | upgrade | Active secondary LLM MCP façades; keep and align workflow docs to event presentation contract | `upgrade-llm-mcp-reference-events` | diff --git a/docs/production-playbook.md b/docs/production-playbook.md index d2c5bbf..eadb95c 100644 --- a/docs/production-playbook.md +++ b/docs/production-playbook.md @@ -39,7 +39,8 @@ Rules: | App | Status | |---|---| | trace-explorer | **Debugger** — embedded Trace API (`embedded-trace-api/1.0.0`); not a secondary “product” kit | -| react-demo, macos-demo, youaskm3-starter-kit, browser-consumer | **Adopted / secondary** demos & kits — lighter maintenance; not merge-blocking `embedded_smoke` targets — see [`adopted-platform-clients.md`](adopted-platform-clients.md) (`android-demo` retired) | +| react-demo, youaskm3-starter-kit, browser-consumer | **Adopted / secondary** demos & kits — lighter maintenance; not merge-blocking `embedded_smoke` targets — see [`adopted-platform-clients.md`](adopted-platform-clients.md) (`android-demo`/`macos-demo` retired) (`android-demo` retired) | +| react-demo, youaskm3-starter-kit, browser-consumer | **Adopted / secondary** demos & kits — lighter maintenance; not merge-blocking `embedded_smoke` targets — see [`adopted-platform-clients.md`](adopted-platform-clients.md) (`android-demo`/`macos-demo` retired) | --- diff --git a/docs/production-reference-plan.md b/docs/production-reference-plan.md index 150db7f..dba7f95 100644 --- a/docs/production-reference-plan.md +++ b/docs/production-reference-plan.md @@ -44,7 +44,8 @@ Related: | Tier | Apps | Smoke / CI bar | |---|---|---| | **Primary product shells** | `traverse-starter`, `doc-approval`, `meeting-notes` | Production DoD; Linux-runnable `embedded_smoke` hard-fail | -| **Adopted / secondary** | `react-demo`, `macos-demo`, `browser-consumer`, `youaskm3-starter-kit`, `llm-mcp-reference` | Lighter demo smokes only — **not** merge-blocking `embedded_smoke` targets (`android-demo` retired) | +| **Adopted / secondary** | `react-demo`, `browser-consumer`, `youaskm3-starter-kit`, `llm-mcp-reference` | Lighter demo smokes only — **not** merge-blocking `embedded_smoke` targets (`android-demo`/`macos-demo` retired) | +| **Adopted / secondary** | `react-demo`, `browser-consumer`, `youaskm3-starter-kit`, `llm-mcp-reference` | Lighter demo smokes only — **not** merge-blocking `embedded_smoke` targets | | **Debugger** | `trace-explorer` | Embedded Trace API companion — not a product shell to copy | Canonical narrative: [`adopted-platform-clients.md`](adopted-platform-clients.md) · front door: root `README.md`. diff --git a/scripts/ci/macos_demo_smoke.sh b/scripts/ci/macos_demo_smoke.sh deleted file mode 100755 index aad59ec..0000000 --- a/scripts/ci/macos_demo_smoke.sh +++ /dev/null @@ -1,30 +0,0 @@ -#!/usr/bin/env bash -# Offline structure smoke for the adopted macOS expedition demo. -set -euo pipefail - -repo_root="$(cd "$(dirname "$0")/../.." && pwd)" - -required_files=( - "fixtures/expedition-runtime-session.json" - "apps/macos-demo/Package.swift" - "apps/macos-demo/README.md" - "apps/macos-demo/Sources/TraverseMacOSDemoApp/TraverseMacOSDemoApp.swift" - "apps/macos-demo/Sources/TraverseMacOSDemoApp/DemoSession.swift" - "apps/macos-demo/Sources/TraverseMacOSDemoApp/DemoContentView.swift" -) - -for file in "${required_files[@]}"; do - if [[ ! -f "${repo_root}/${file}" ]]; then - echo "missing macOS demo artifact: ${file}" >&2 - exit 1 - fi -done - -grep -q 'import SwiftUI' "${repo_root}/apps/macos-demo/Sources/TraverseMacOSDemoApp/TraverseMacOSDemoApp.swift" -grep -q 'WindowGroup' "${repo_root}/apps/macos-demo/Sources/TraverseMacOSDemoApp/TraverseMacOSDemoApp.swift" -grep -q 'fixtures/expedition-runtime-session.json' \ - "${repo_root}/apps/macos-demo/Sources/TraverseMacOSDemoApp/DemoSession.swift" -grep -q '"status": "completed"' "${repo_root}/fixtures/expedition-runtime-session.json" -grep -q '"state_updates"' "${repo_root}/fixtures/expedition-runtime-session.json" - -echo "macOS demo smoke passed" diff --git a/scripts/ci/repository_checks.sh b/scripts/ci/repository_checks.sh index 40ded38..3b37f4f 100644 --- a/scripts/ci/repository_checks.sh +++ b/scripts/ci/repository_checks.sh @@ -97,7 +97,6 @@ check "manifests/meeting-notes/components/process/component.manifest.json" "meet # Adopted Traverse platform demos / starter (issue #151) check "apps/browser-consumer/index.js" "browser-consumer package" -check "apps/macos-demo/Package.swift" "macos-demo Package.swift" check "apps/react-demo/src/main.js" "react-demo main" check "apps/youaskm3-starter-kit/README.md" "youaskm3 starter kit" check "apps/llm-mcp-reference/README.md" "LLM MCP reference façades" @@ -106,7 +105,6 @@ check "fixtures/expedition-runtime-session.json" "expedit check "docs/adopted-platform-clients.md" "adopted platform clients doc" check "docs/production-playbook.md" "production playbook" check "docs/youaskm3-starter-kit.md" "youaskm3 starter guide" -check "scripts/ci/macos_demo_smoke.sh" "macos demo smoke" check "scripts/ci/react_demo_smoke.sh" "react demo smoke" check "scripts/ci/youaskm3_starter_kit_smoke.sh" "youaskm3 starter smoke" check "scripts/ci/llm_mcp_reference_smoke.sh" "LLM MCP reference smoke"