@techierathore/techieflow 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/commands/TechieFlow/agents/analyst.md +97 -0
- package/.claude/commands/TechieFlow/agents/architect.md +84 -0
- package/.claude/commands/TechieFlow/agents/flow-master.md +217 -0
- package/.claude/commands/TechieFlow/agents/verifier.md +72 -0
- package/.claude/commands/TechieFlow/tasks/_metrics-emit-gate.md +138 -0
- package/.claude/commands/TechieFlow/tasks/_smoke-test-policy.md +98 -0
- package/.claude/commands/TechieFlow/tasks/_status-update-gate.md +78 -0
- package/.claude/commands/TechieFlow/tasks/_yolo-mode.md +77 -0
- package/.claude/commands/TechieFlow/tasks/advanced-elicitation.md +117 -0
- package/.claude/commands/TechieFlow/tasks/amend-docs.md +149 -0
- package/.claude/commands/TechieFlow/tasks/author-brd.md +79 -0
- package/.claude/commands/TechieFlow/tasks/build-phase.md +231 -0
- package/.claude/commands/TechieFlow/tasks/create-deep-research-prompt.md +278 -0
- package/.claude/commands/TechieFlow/tasks/create-doc.md +101 -0
- package/.claude/commands/TechieFlow/tasks/day1-brownfield.md +507 -0
- package/.claude/commands/TechieFlow/tasks/day1-greenfield.md +224 -0
- package/.claude/commands/TechieFlow/tasks/devguide.md +224 -0
- package/.claude/commands/TechieFlow/tasks/document-project.md +343 -0
- package/.claude/commands/TechieFlow/tasks/execute-checklist.md +86 -0
- package/.claude/commands/TechieFlow/tasks/facilitate-brainstorming-session.md +136 -0
- package/.claude/commands/TechieFlow/tasks/fix-issues.md +134 -0
- package/.claude/commands/TechieFlow/tasks/generate-html.md +115 -0
- package/.claude/commands/TechieFlow/tasks/handoff-phase.md +126 -0
- package/.claude/commands/TechieFlow/tasks/index-docs.md +173 -0
- package/.claude/commands/TechieFlow/tasks/kb-mode-interaction.md +75 -0
- package/.claude/commands/TechieFlow/tasks/log-miss.md +160 -0
- package/.claude/commands/TechieFlow/tasks/metrics-report.md +143 -0
- package/.claude/commands/TechieFlow/tasks/mockups.md +122 -0
- package/.claude/commands/TechieFlow/tasks/productguide.md +105 -0
- package/.claude/commands/TechieFlow/tasks/refresh-status.md +135 -0
- package/.claude/commands/TechieFlow/tasks/render-workflow-docs.md +117 -0
- package/.claude/commands/TechieFlow/tasks/shard-doc.md +185 -0
- package/.claude/commands/TechieFlow/tasks/split-brd.md +131 -0
- package/.claude/commands/TechieFlow/tasks/triage-issues.md +157 -0
- package/.claude/commands/TechieFlow/tasks/verify-phase.md +579 -0
- package/.claude/commands/generate-html.md +124 -0
- package/.codex/config.toml +46 -0
- package/.codex/hooks.json +63 -0
- package/.codex/rules/techieflow.rules +8 -0
- package/.opencode/command/generate-html.md +129 -0
- package/.opencode/plugin/techieflow.js +350 -0
- package/.tfcore/TOKEN-GUIDE.md +59 -0
- package/.tfcore/agents/analyst.md +97 -0
- package/.tfcore/agents/architect.md +84 -0
- package/.tfcore/agents/flow-master.md +217 -0
- package/.tfcore/agents/verifier.md +72 -0
- package/.tfcore/checklists/architect-checklist.md +438 -0
- package/.tfcore/core-config.yaml +47 -0
- package/.tfcore/data/brainstorming-techniques.md +36 -0
- package/.tfcore/data/elicitation-methods.md +154 -0
- package/.tfcore/data/techieflow-kb.md +807 -0
- package/.tfcore/data/technical-preferences.md +3 -0
- package/.tfcore/enhanced-ide-development-workflow.md +248 -0
- package/.tfcore/hooks/block-git.sh +301 -0
- package/.tfcore/hooks/codex-adapter.py +248 -0
- package/.tfcore/hooks/guard-artifacts.sh +101 -0
- package/.tfcore/hooks/guard-status-html.sh +102 -0
- package/.tfcore/hooks/guard-status.sh +124 -0
- package/.tfcore/hooks/guard-verify.sh +108 -0
- package/.tfcore/hooks/metrics-session.sh +129 -0
- package/.tfcore/hooks/session-pointer.sh +52 -0
- package/.tfcore/hooks/sweep-artifacts.sh +198 -0
- package/.tfcore/install-manifest.yaml +231 -0
- package/.tfcore/routing.yaml +105 -0
- package/.tfcore/tasks/_metrics-emit-gate.md +138 -0
- package/.tfcore/tasks/_smoke-test-policy.md +98 -0
- package/.tfcore/tasks/_status-update-gate.md +78 -0
- package/.tfcore/tasks/_yolo-mode.md +77 -0
- package/.tfcore/tasks/advanced-elicitation.md +117 -0
- package/.tfcore/tasks/amend-docs.md +149 -0
- package/.tfcore/tasks/author-brd.md +79 -0
- package/.tfcore/tasks/build-phase.md +231 -0
- package/.tfcore/tasks/create-deep-research-prompt.md +278 -0
- package/.tfcore/tasks/create-doc.md +101 -0
- package/.tfcore/tasks/day1-brownfield.md +507 -0
- package/.tfcore/tasks/day1-greenfield.md +224 -0
- package/.tfcore/tasks/devguide.md +224 -0
- package/.tfcore/tasks/document-project.md +343 -0
- package/.tfcore/tasks/execute-checklist.md +86 -0
- package/.tfcore/tasks/facilitate-brainstorming-session.md +136 -0
- package/.tfcore/tasks/fix-issues.md +134 -0
- package/.tfcore/tasks/generate-html.md +115 -0
- package/.tfcore/tasks/handoff-phase.md +126 -0
- package/.tfcore/tasks/index-docs.md +173 -0
- package/.tfcore/tasks/kb-mode-interaction.md +75 -0
- package/.tfcore/tasks/log-miss.md +160 -0
- package/.tfcore/tasks/metrics-report.md +143 -0
- package/.tfcore/tasks/mockups.md +122 -0
- package/.tfcore/tasks/productguide.md +105 -0
- package/.tfcore/tasks/refresh-status.md +135 -0
- package/.tfcore/tasks/render-workflow-docs.md +117 -0
- package/.tfcore/tasks/shard-doc.md +185 -0
- package/.tfcore/tasks/split-brd.md +131 -0
- package/.tfcore/tasks/triage-issues.md +157 -0
- package/.tfcore/tasks/verify-phase.md +579 -0
- package/.tfcore/telemetry/SCHEMA.md +678 -0
- package/.tfcore/telemetry/install-metrics.sh +390 -0
- package/.tfcore/telemetry/pre-commit +94 -0
- package/.tfcore/telemetry/tf-metrics.sh +1415 -0
- package/.tfcore/templates/architecture-tmpl.yaml +650 -0
- package/.tfcore/templates/brainstorming-output-tmpl.yaml +156 -0
- package/.tfcore/templates/brownfield-architecture-tmpl.yaml +476 -0
- package/.tfcore/templates/competitor-analysis-tmpl.yaml +306 -0
- package/.tfcore/templates/front-end-architecture-tmpl.yaml +218 -0
- package/.tfcore/templates/fullstack-architecture-tmpl.yaml +823 -0
- package/.tfcore/templates/market-research-tmpl.yaml +252 -0
- package/.tfcore/templates/project-brief-tmpl.yaml +221 -0
- package/.tfcore/templates/v4custom/app-agents-md-tmpl.md +61 -0
- package/.tfcore/templates/v4custom/app-architecture-tmpl.md +127 -0
- package/.tfcore/templates/v4custom/app-brd-tmpl.md +204 -0
- package/.tfcore/templates/v4custom/app-checklist-tmpl.md +90 -0
- package/.tfcore/templates/v4custom/app-claude-md-tmpl.md +33 -0
- package/.tfcore/templates/v4custom/app-devguide-tmpl.md +167 -0
- package/.tfcore/templates/v4custom/app-editorconfig-tmpl.editorconfig +44 -0
- package/.tfcore/templates/v4custom/app-library-feedback-tmpl.md +31 -0
- package/.tfcore/templates/v4custom/app-productguide-tmpl.md +54 -0
- package/.tfcore/templates/v4custom/app-project-status-tmpl.md +98 -0
- package/.tfcore/templates/v4custom/app-uidesign-tmpl.md +48 -0
- package/.tfcore/templates/v4custom/app-usageguide-tmpl.md +67 -0
- package/.tfcore/templates/v4custom/build-invocation-ladder.md +190 -0
- package/.tfcore/templates/v4custom/html-render-shell.md +502 -0
- package/.tfcore/templates/v4custom/metrics-report-template.md +273 -0
- package/.tfcore/templates/v4custom/opencode-operating-contract.md +56 -0
- package/.tfcore/user-guide.md +633 -0
- package/.tfcore/utils/techieflow-doc-template.md +325 -0
- package/.tfcore/utils/tf-assets.sh +310 -0
- package/.tfcore/utils/tf-codex-bind.py +196 -0
- package/.tfcore/utils/tf-codex-telemetry.py +60 -0
- package/.tfcore/utils/tf-emit.sh +1075 -0
- package/.tfcore/utils/tf-gitignore-audit.sh +281 -0
- package/.tfcore/utils/tf-goal.sh +421 -0
- package/.tfcore/utils/tf-harness.sh +160 -0
- package/.tfcore/utils/tf-mockup-parity.mjs +555 -0
- package/.tfcore/utils/tf-mockup-parity.sh +65 -0
- package/.tfcore/utils/tf-opencode-audit.py +126 -0
- package/.tfcore/utils/tf-perf.sh +241 -0
- package/.tfcore/utils/tf-render-html.py +715 -0
- package/.tfcore/utils/tf-render-html.sh +28 -0
- package/.tfcore/utils/tf-routing-bind.sh +216 -0
- package/.tfcore/utils/tf-routing.sh +247 -0
- package/.tfcore/utils/tf-yolo.sh +119 -0
- package/.tfcore/working-in-the-brownfield.md +606 -0
- package/LICENSE +201 -0
- package/README.md +1212 -0
- package/WORKFLOW.html +1986 -0
- package/docs/TechieFlow-Installation.md +299 -0
- package/opencode.jsonc +929 -0
- package/package.json +60 -0
- package/scripts/install.mjs +992 -0
- package/scripts/test-install.mjs +505 -0
- package/scripts/validate.mjs +155 -0
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
---
|
|
2
|
+
project: {AppName}
|
|
3
|
+
stack: .NET 9 / Blazor [Server|WASM|Auto] / TrBlazeUI / TechieRag / [MAUI]
|
|
4
|
+
last_updated: {YYYY-MM-DD}
|
|
5
|
+
current_phase: Discovery | UI build | UI verify | Functional build | Functional verify | Handoff | Released
|
|
6
|
+
last_verified_build: PASS | FAIL | not-run
|
|
7
|
+
last_verified_date: {YYYY-MM-DD}
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# {AppName} — Status
|
|
11
|
+
|
|
12
|
+
<!--
|
|
13
|
+
============================================================================
|
|
14
|
+
THIS FILE IS A CRISP, FIXED-SHAPE SNAPSHOT — OVERWRITE IT, NEVER APPEND TO IT.
|
|
15
|
+
It has exactly the sections below and NO others. It should stay well under
|
|
16
|
+
~60 lines — a human reads it in ten seconds.
|
|
17
|
+
|
|
18
|
+
When you update status you REPLACE the content of these sections in place.
|
|
19
|
+
Do NOT add a new dated section per run. The following are BANNED (they are
|
|
20
|
+
what turns this file into an unreadable 280-line append-log):
|
|
21
|
+
- A per-run prose H2 like "## *verify all — formal coverage matrix (DATE)",
|
|
22
|
+
"## *fix-issues — …", "## *build-phase — …". A run records its outcome as
|
|
23
|
+
ONE row in "## Verification log" + updated Remarks IN THE CHECKLIST. Period.
|
|
24
|
+
- A paragraph crammed into `current_phase:` or "## Where I am". `current_phase`
|
|
25
|
+
is ONE short line. The blow-by-blow lives in the checklist Remarks + .verify/.
|
|
26
|
+
See .tfcore/tasks/_status-update-gate.md §"CRISP, FIXED-SHAPE snapshot".
|
|
27
|
+
ENFORCED MECHANICALLY: the .tfcore/hooks/guard-status.sh PreToolUse hook
|
|
28
|
+
BLOCKS any write that adds a non-template H2, a command-run heading, a
|
|
29
|
+
paragraph current_phase, or a file longer than ~120 lines.
|
|
30
|
+
============================================================================
|
|
31
|
+
-->
|
|
32
|
+
|
|
33
|
+
## Where I am
|
|
34
|
+
<one short paragraph — the current STATE only: which phase, what is built/verified, what is open.
|
|
35
|
+
This is a status snapshot, NOT a technical to-do list. Do not narrate the implementation work
|
|
36
|
+
still to be done (how to wire a service, fix a binding, etc.) — that lives in the checklist REQ rows.>
|
|
37
|
+
|
|
38
|
+
## Next command to run
|
|
39
|
+
<!--
|
|
40
|
+
Express the next step ONLY as a command pointed at a checklist/scope. NOT a prose description of
|
|
41
|
+
the technical work. The "what to do" already lives in the checklist's REQ rows — here we just say
|
|
42
|
+
WHICH COMMAND to run against WHICH checklist/REQs. At most one line naming the target checklist or
|
|
43
|
+
REQ IDs may accompany the command block.
|
|
44
|
+
|
|
45
|
+
GOOD:
|
|
46
|
+
```
|
|
47
|
+
/TechieFlow:agents:verifier *verify ui (OpenCode: /flow-verifier *verify ui)
|
|
48
|
+
```
|
|
49
|
+
Resumes FAILed REQ-UI-007, REQ-UI-012 in docs/{AppName}-Checklist.md.
|
|
50
|
+
|
|
51
|
+
BAD (do not do this — technical narrative belongs in the checklist, not here):
|
|
52
|
+
Next, wire the AstroData service into the dashboard, fix the empty ruling-planet
|
|
53
|
+
table binding, add validation to the onboarding form, then re-run verification...
|
|
54
|
+
-->
|
|
55
|
+
```
|
|
56
|
+
/<agent> <exact prompt> (OpenCode: <exact prompt>)
|
|
57
|
+
```
|
|
58
|
+
<one optional line naming the target checklist or REQ IDs>
|
|
59
|
+
|
|
60
|
+
## Open requirements
|
|
61
|
+
- [ ] REQ-UI-013 — <desc>
|
|
62
|
+
- [ ] REQ-FN-007 — <desc>
|
|
63
|
+
|
|
64
|
+
## Known blockers
|
|
65
|
+
- None / <list>
|
|
66
|
+
<!--
|
|
67
|
+
Known blockers are PROJECT-level issues — broken code, missing tests, real compile errors, hardcoded secrets, etc.
|
|
68
|
+
They are NOT environment / wrong-rung issues. Banned entries (these go in WORKFLOW.html §0 territory, not here):
|
|
69
|
+
- "MAUI build cannot run on WSL"
|
|
70
|
+
- "NETSDK1178 — iOS/Android/MacCatalyst workload missing"
|
|
71
|
+
- "Microsoft.iOS.Sdk / Microsoft.Android.Sdk / Microsoft.MacCatalyst.Sdk missing"
|
|
72
|
+
- "dotnet not in PATH"
|
|
73
|
+
- Anything that means "I used the wrong build invocation ladder rung"
|
|
74
|
+
If you wrote one of those, you skipped .tfcore/templates/v4custom/build-invocation-ladder.md.
|
|
75
|
+
Switch rungs and rebuild.
|
|
76
|
+
-->
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
## Verification log
|
|
80
|
+
<!-- Status detail lives in the checklist's "Requirements Status" table (the single
|
|
81
|
+
source of truth). This log is just a dated index of verification passes. -->
|
|
82
|
+
| Date | Phase | Result | Status table |
|
|
83
|
+
|------|-------|--------|--------------|
|
|
84
|
+
| {YYYY-MM-DD} | UI verify | 14/14 Verified | docs/{AppName}-Checklist.md#requirements-status |
|
|
85
|
+
|
|
86
|
+
## Library feedback summary
|
|
87
|
+
- TrBlazeUI: 0 major, 0 minor — docs/{AppName}-TrBlazeUI-Feedback.md
|
|
88
|
+
- TechieRag: 0 major, 0 minor — docs/{AppName}-TechieRag-Feedback.md
|
|
89
|
+
|
|
90
|
+
<!-- One feedback file PER library (separate teams). Files are created on first issue. -->
|
|
91
|
+
|
|
92
|
+
## Standards compliance (last verifier check)
|
|
93
|
+
- Underscore fields: not yet run
|
|
94
|
+
- Test method underscores: not yet run
|
|
95
|
+
- Mis-prefixed fields: not yet run
|
|
96
|
+
|
|
97
|
+
## Deferred / future
|
|
98
|
+
- <parked ideas>
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# {AppName} — UI Design Spec (Mockups)
|
|
2
|
+
|
|
3
|
+
> **What this is.** The approved visual design for {AppName}, produced at day-1 (greenfield) before any UI is built. Each screen has a **rendered mockup** (`docs/mockups/{screen}.html`, styled to look like TrBlazeUI) and a **component map** that ties every region to a real **TrBlazeUI control**, so the build (`/trblazeui`) reproduces it 1:1 and the verifier's visual-truth gate (`verify-phase.md §4b`) can diff the live screen against it. This is a HUMAN document → rendered to HTML. The owner APPROVES it (alongside the BRD + Architecture) before build.
|
|
4
|
+
|
|
5
|
+
## Table of Contents
|
|
6
|
+
|
|
7
|
+
<!-- Auto-maintained. Slug rule: .tfcore/templates/v4custom/html-render-shell.md §1. List each `### Screen: ...` under "Screens". -->
|
|
8
|
+
|
|
9
|
+
1. [How to use](#how-to-use)
|
|
10
|
+
2. [Design system (TrBlazeUI)](#design-system-trblazeui)
|
|
11
|
+
3. [Screens](#screens)
|
|
12
|
+
|
|
13
|
+
## How to use
|
|
14
|
+
|
|
15
|
+
- Every screen below links to its rendered mockup in `docs/mockups/`. Open those `.html` files in a browser to see the intended layout.
|
|
16
|
+
- The **Component map** is the build contract: `region → TrBlazeUI control`. Only controls that actually exist in the TrBlazeUI library are used (the analyst read the component catalog first). If a screen needs something the library lacks, it is flagged here and logged to `docs/{AppName}-TrBlazeUI-Feedback.md`.
|
|
17
|
+
- To change a screen after approval: run `*mockups {AppName} --update` (or `*amend-docs` for a requirement change that adds screens).
|
|
18
|
+
|
|
19
|
+
## Design system (TrBlazeUI)
|
|
20
|
+
|
|
21
|
+
- **Source:** TrBlazeUI component library (`.trblazeui/TrBlazeUI-AI-Reference.md`). Mockups use its components and design language (spacing, color tokens, typography) so they are replicable in Blazor.
|
|
22
|
+
- **Layout shell:** {top nav / sidebar / both — name the TrBlazeUI layout components}.
|
|
23
|
+
- **Theme:** light/dark per the shared shell; warm off-white light default.
|
|
24
|
+
- **Controls inventory used:** {list the TrBlazeUI controls this app's screens rely on — e.g. `TrNavMenu`, `TrCard`, `TrDataGrid`, `TrForm`, `TrButton`, `TrChart`, `TrDialog`}.
|
|
25
|
+
|
|
26
|
+
## Screens
|
|
27
|
+
|
|
28
|
+
<!-- One `### Screen: ...` per key screen from the BRD §9 feature catalog. Each has its mockup link,
|
|
29
|
+
a component map (region → TrBlazeUI control + the data it shows), and state notes. -->
|
|
30
|
+
|
|
31
|
+
### Screen: Dashboard (`/dashboard`)
|
|
32
|
+
|
|
33
|
+
**Mockup:** [docs/mockups/dashboard.html](./mockups/dashboard.html) · **Role(s):** {who reaches it} · **BRD:** BRD-X · **REQ:** REQ-UI-001
|
|
34
|
+
|
|
35
|
+
**Layout (one line):** top nav fixed; 3-card KPI row; full-width chart below; recent-activity table at the bottom.
|
|
36
|
+
|
|
37
|
+
**Component map:**
|
|
38
|
+
|
|
39
|
+
| Region | TrBlazeUI control | Shows / binds | States |
|
|
40
|
+
|--------|-------------------|---------------|--------|
|
|
41
|
+
| Top nav | `TrNavMenu` | logo, user menu, theme toggle | — |
|
|
42
|
+
| KPI row | 3× `TrCard` | {metric} each | loading skeleton; zero-state |
|
|
43
|
+
| Trend chart | `TrChart` (line) | {series} | empty: "no data yet" |
|
|
44
|
+
| Activity | `TrDataGrid` | {columns} | empty row message; paged |
|
|
45
|
+
|
|
46
|
+
**Notes / interactions:** {sort, filter, drill-through, responsive behavior — what collapses/stacks at mobile width}.
|
|
47
|
+
|
|
48
|
+
**Empty / loading / error:** {what each control shows when there's no data, while loading, on error — the verifier checks these aren't blank-but-broken}.
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
# {AppName} — Usage Guide (Test Users · Test Plan · Setup)
|
|
2
|
+
|
|
3
|
+
> The single source for **how to test and run** this app. Every agent (flow-master self-smoke, the verifier) **and** the human UAT use the SAME test users and the SAME walkthrough listed here — no one invents throwaway accounts (enforced by `.tfcore/tasks/_smoke-test-policy.md`). Keep the Test-users table current: when an account is actually created, flip its `Created?` to ✅.
|
|
4
|
+
|
|
5
|
+
## Test users (canonical — use THESE for all smoke / verify / UAT)
|
|
6
|
+
|
|
7
|
+
One row per account needed to exercise the app. Cover every distinct role/permission level. These are the ONLY accounts smoke/verify/UAT may use.
|
|
8
|
+
|
|
9
|
+
| # | Username / Email | Password | Role / Permission | Created? | Notes |
|
|
10
|
+
|---|------------------|----------|-------------------|----------|-------|
|
|
11
|
+
| 1 | {admin@app.test} | {Pass!23} | Admin | ⬜ | {seeded by … / create on first build} |
|
|
12
|
+
| 2 | {user1@app.test} | {Pass!23} | Standard user | ⬜ | {…} |
|
|
13
|
+
| 3 | {…} | {…} | {role} | ⬜ | {…} |
|
|
14
|
+
|
|
15
|
+
- **Created?** — ✅ = the account exists in the database now (verified). ⬜ = planned; create it on first build, but **only after confirming with the owner** (see `_smoke-test-policy.md`). Never auto-create silently.
|
|
16
|
+
- **To add or confirm an account:** edit this table — it is the registry the whole pipeline reads from.
|
|
17
|
+
- **Seeding:** if the project seeds users via a migration / `database/*-seed-*.sql` / a DbUp step, reference it here so the accounts above are reproducible from a clean DB.
|
|
18
|
+
|
|
19
|
+
## How to test — screen by screen / menu by menu
|
|
20
|
+
|
|
21
|
+
One subsection per screen or top-level menu, in navigation order, so a tester (human or agent) can walk the whole app and exercise **every feature**. Each subsection names which test user to log in as.
|
|
22
|
+
|
|
23
|
+
**Flowchart any complex flow.** When a flow is multi-step, multi-actor, or branches (approval queues, learning/feedback loops, ingestion→processing→review pipelines, auth/token handshakes, payment/consent gates), add a Mermaid `flowchart` (or `sequenceDiagram`) right above that flow's steps so the tester sees the path at a glance. Simple linear CRUD screens don't need one. **Every diagram MUST follow the authoring rules in `.tfcore/templates/v4custom/html-render-shell.md §5.5`** — quote every node/edge/subgraph label, never use `end` as a node id — or it will throw "Syntax error" in the rendered HTML. Example:
|
|
24
|
+
|
|
25
|
+
```mermaid
|
|
26
|
+
flowchart LR
|
|
27
|
+
A["User submits form"] --> B{"Valid?"}
|
|
28
|
+
B -->|"yes"| C["Save + confirm"]
|
|
29
|
+
B -->|"no"| D["Show error"]
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
### {Screen / Menu name}
|
|
33
|
+
- **Log in as:** {user # from the table above}
|
|
34
|
+
- **Steps:** 1) {action} → 2) {action} → 3) {action}
|
|
35
|
+
- **Expected:** {observable result — what proves the feature works}
|
|
36
|
+
- **Covers:** {BRD-N / REQ-* IDs this walkthrough exercises}
|
|
37
|
+
|
|
38
|
+
_(Repeat one block per screen/menu until every feature in the BRD feature catalog is covered. This is the human UAT script AND the map the verifier/smoke use to decide what to exercise.)_
|
|
39
|
+
|
|
40
|
+
## Prerequisites
|
|
41
|
+
- .NET {N} SDK
|
|
42
|
+
- {OtherRuntime — e.g. Node 20 for Playwright, PostgreSQL 16, etc. — one line each, only if actually required}
|
|
43
|
+
|
|
44
|
+
## Setup / Deployment steps (runbook — one command per line, in order)
|
|
45
|
+
|
|
46
|
+
Numbered, terse, copy-pasteable. No narrative. Omit any step that doesn't apply (no "N/A" placeholders).
|
|
47
|
+
|
|
48
|
+
1. `git clone <repo> && cd <repo>`
|
|
49
|
+
2. `dotnet restore`
|
|
50
|
+
3. {database setup — one line per SQL file in lexicographic order, or a single DbUp `dotnet run --project src/{AppName}.Db` step. Include the test-user seed step if one exists.}
|
|
51
|
+
4. `dotnet build`
|
|
52
|
+
5. {run the backend — one command, e.g. `dotnet run --project src/{AppName}.Api --urls http://localhost:5100`}
|
|
53
|
+
6. {run the frontend — one command, e.g. `dotnet run --project src/{AppName}.Web --urls http://localhost:5099`}
|
|
54
|
+
7. Open `http://localhost:5099` in a browser; log in as a Test user from the table above.
|
|
55
|
+
|
|
56
|
+
## Test (automated)
|
|
57
|
+
```bash
|
|
58
|
+
dotnet test
|
|
59
|
+
```
|
|
60
|
+
{Add `npx playwright test` ONLY if the repo has Playwright tests checked in.}
|
|
61
|
+
|
|
62
|
+
## Smoke checklist (quick capability pass)
|
|
63
|
+
- [ ] {one tight line per top-level BRD capability — 5-10 boxes max; each a user action using a Test user above, e.g. "Log in as Admin (user 1), open the dashboard"}
|
|
64
|
+
|
|
65
|
+
## Known limitations
|
|
66
|
+
- {TR-NNN — short title — see docs/{AppName}-TrBlazeUI-Feedback.md (or TR-RAG-NNN → docs/{AppName}-TechieRag-Feedback.md)}
|
|
67
|
+
- {`Blocked` (library-gap) REQ-* items from the checklist Status tables, one line each}
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
# Build invocation ladder
|
|
2
|
+
|
|
3
|
+
When any task says "run `dotnet build`" / "run `dotnet test`" / "run `dotnet run`", **never accept "command not found" or "workload missing" as a stopping condition**. The right way to invoke `dotnet` depends on the host platform. **Detect the platform FIRST, then use that platform's ladder.**
|
|
4
|
+
|
|
5
|
+
## 0. Platform detection — do this ONCE per session, then cache it
|
|
6
|
+
|
|
7
|
+
Run a single probe to classify the host:
|
|
8
|
+
|
|
9
|
+
| Probe result | Platform | Ladder to use |
|
|
10
|
+
|---|---|---|
|
|
11
|
+
| `uname` → `Darwin` | **macOS** (Claude Code / OpenCode native, or via Terminal) | §A — dotnet in PATH, MAUI/iOS native via Xcode |
|
|
12
|
+
| `uname` → `Linux` **and** `/proc/version` contains `microsoft` / `WSL` | **WSL-on-Windows** (the reference machine) | §B — the WSL↔Windows interop ladder |
|
|
13
|
+
| `TF_OPENCODE_DOCKER=1` (or `uname` → `Linux`, no `microsoft` in `/proc/version`, and `/usr/local/bin/winrun` exists with `TF_WINDOWS_APP_PATH` set) | **OpenCode Docker on Windows** | §E — .NET in container, Windows head through SSH bridge |
|
|
14
|
+
| `uname` → `Linux`, no `microsoft` in `/proc/version`, and no Docker bridge | **native Linux** | §A (Linux notes) — standard .NET only; Windows/Apple heads are unavailable |
|
|
15
|
+
| `uname` not found / shell is `cmd`/`PowerShell`; paths look like `C:\…` | **native Windows** (Claude Code / OpenCode on Windows, not WSL) | §C — dotnet in PATH, MAUI native |
|
|
16
|
+
|
|
17
|
+
One-liner to detect: `uname -a 2>/dev/null || echo windows` — `Darwin…` = macOS, `…microsoft…`/`…WSL…` = WSL, plain `Linux` = native Linux, `windows` (uname absent) = native Windows.
|
|
18
|
+
|
|
19
|
+
> The §B WSL ladder below was the framework's original default because the owner's primary machine is WSL-on-Windows (`WORKFLOW.html §0`). It is **one platform's** ladder, not the universal one. A plain native Linux process has no Windows interop, but OpenCode Docker is a deliberate exception: when `/usr/local/bin/winrun` and `TF_WINDOWS_APP_PATH` are present, use §E and probe the SSH bridge. Never report `cmd.exe` missing inside the container; it is expected not to exist there.
|
|
20
|
+
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
## A. macOS / native Linux — `dotnet` is in `PATH`
|
|
24
|
+
|
|
25
|
+
→ **Start (and stay) at rung #1: `dotnet build`.** The .NET SDK installer puts `dotnet` on the `PATH`; there is no interop layer.
|
|
26
|
+
|
|
27
|
+
- **Non-MAUI projects** (Web, API, library, console, test): `dotnet build` / `dotnet test` / `dotnet run` directly.
|
|
28
|
+
- **MAUI on macOS:** builds natively once the workload + toolchains are installed — `sudo dotnet workload install maui`. **`sudo` is REQUIRED on macOS**: the SDK lives in root-owned `/usr/local/share/dotnet`, so any `dotnet workload install/update` (and SDK updates) without it fails with `Inadequate permissions. Run the command with elevated privileges.` — that error is a sudo signal, NEVER a project blocker. iOS / Mac Catalyst targets require **Xcode** (and `xcode-select --install`); Android targets require the **Android SDK + a JDK** (`sudo dotnet workload install maui-android`). With those present, `dotnet build -t:Run -f net9.0-maccatalyst` (or `-f net9.0-ios`) just works — no `cmd.exe`.
|
|
29
|
+
- **MAUI on native Linux:** this framework's Docker image installs no MAUI workloads. Windows MAUI Blazor Desktop uses §E; mobile/iOS/Mac Catalyst work belongs on a native Mac. Do not install or report `maui-tizen` as a Docker prerequisite.
|
|
30
|
+
- If `dotnet build` fails with `NETSDK1178` / "workload not installed", the fix is `dotnet workload install <id>` — with `sudo` on macOS (root-owned SDK dir; see above) — a one-time setup step the user runs, not a rung change; there is no other rung on this platform. If the user reports `Inadequate permissions` from a workload/SDK command, give them the exact `sudo` form of the same command.
|
|
31
|
+
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
## B. WSL-on-Windows (the reference machine) — WSL ↔ Windows interop ladder
|
|
35
|
+
|
|
36
|
+
The owner's machine is set up per `WORKFLOW.html §0` and has BOTH:
|
|
37
|
+
|
|
38
|
+
- **WSL-side .NET** at `$HOME/.dotnet/dotnet` (rung #2) — *replace with your own WSL dotnet path if different*. Compiles non-MAUI projects green.
|
|
39
|
+
- **Windows-side .NET** with full workloads — including MAUI / iOS / Android — reachable via `cmd.exe /c "dotnet …"` (rung #4) or the `winrun` bridge (rung #3). Compiles MAUI/iOS/Android workloads green.
|
|
40
|
+
|
|
41
|
+
Both are PERMANENT setups — you are NEVER reporting "MAUI cannot build on WSL" or "MAUI workloads missing" as a project blocker. Those are environment-config misunderstandings, not project issues. If a build fails because the workload isn't where you tried, you are on the wrong rung — switch rungs.
|
|
42
|
+
|
|
43
|
+
### The WSL ladder — try until one works
|
|
44
|
+
|
|
45
|
+
| # | Command | Works when |
|
|
46
|
+
|---|---------|------------|
|
|
47
|
+
| 1 | `dotnet build` | dotnet is in WSL `$PATH` (rare on this machine) |
|
|
48
|
+
| 2 | `~/.dotnet/dotnet build` (or `$HOME/.dotnet/dotnet build`) | dotnet is WSL-installed but not in PATH (the user's default — confirmed present) |
|
|
49
|
+
| 3 | `winrun "dotnet build"` | user's WSL→Windows helper at `$HOME/bin/winrun` |
|
|
50
|
+
| 4 | `cmd.exe /c "dotnet build"` | Windows-side .NET 10 (full workloads — MAUI, iOS, Android, etc.) — works for any `/mnt/c/...` project |
|
|
51
|
+
| 5 | `powershell.exe -Command "dotnet build"` | same as #4 with PowerShell |
|
|
52
|
+
|
|
53
|
+
Each candidate is a SINGLE bash command — no `for`/`if`/loops — so each matches the project's `.claude/settings.json` allow patterns (`Bash(dotnet *)`, `Bash(cmd.exe *)`, `Bash(powershell.exe *)`, `Bash(winrun *)`).
|
|
54
|
+
|
|
55
|
+
## How to PICK the right rung (§B / WSL only — READ THIS, most failures come from skipping it)
|
|
56
|
+
|
|
57
|
+
> The rest of this document (rung selection, symptom escalation, probe order, banned-blocker list) is **§B WSL-specific detail**. On macOS / native Windows / native Linux there is a single rung (`dotnet build`), so skip ahead to §C if you're on native Windows; macOS/Linux is fully covered by §A above.
|
|
58
|
+
|
|
59
|
+
The right starting rung depends on **what you are building**:
|
|
60
|
+
|
|
61
|
+
### A. Single .csproj — non-MAUI (Web, API, library, console, test project)
|
|
62
|
+
→ **Start at rung #2.** If it works, stay there for the session.
|
|
63
|
+
|
|
64
|
+
### B. Single .csproj — MAUI / iOS / Android / .NET MAUI Hybrid
|
|
65
|
+
Detect: `<UseMaui>true</UseMaui>`, `<TargetFramework>` contains `-android` / `-ios` / `-maccatalyst` / `-windows10`, or the SDK is `Microsoft.NET.Sdk.Maui`.
|
|
66
|
+
→ **Skip rungs #1–#2 entirely.** Start at rung #4 (or #3 if you prefer the `winrun` wrapper). MAUI workloads ONLY live on the Windows side per the user's setup.
|
|
67
|
+
|
|
68
|
+
### C. Solution / multi-project build (`.sln` or `.slnx`) — MIXED projects
|
|
69
|
+
**Do this BEFORE picking a rung.** Scan the solution file's project entries:
|
|
70
|
+
|
|
71
|
+
1. Read the `.sln` / `.slnx` file (use the `Read` tool — single call).
|
|
72
|
+
2. For each `<Project Path="…" />` (slnx) or `Project("…") = "…", "…\X.csproj"` line (sln), look at the .csproj path. Then quickly grep each `.csproj` for `<UseMaui>` or MAUI SDK references.
|
|
73
|
+
3. **If ANY project in the solution is MAUI/iOS/Android → the SOLUTION-level build needs the Windows side. Start at rung #4.** Do NOT try rung #2 on the slnx — it will fail with `NETSDK1178` or `Microsoft.iOS.Sdk missing` or similar workload errors, and that failure is a wasted attempt, not a project blocker.
|
|
74
|
+
4. **If NO project is MAUI** → start at rung #2.
|
|
75
|
+
|
|
76
|
+
### D. Per-project build to isolate a failure
|
|
77
|
+
If a solution-level build fails on the right rung, fall back to building each project individually:
|
|
78
|
+
- Non-MAUI projects (Web/API/library) on rung #2 (faster).
|
|
79
|
+
- MAUI/iOS/Android projects on rung #4.
|
|
80
|
+
- Aggregate the results in your status report. This isolates which projects compile clean and which have real code-level issues.
|
|
81
|
+
|
|
82
|
+
## Symptom-based auto-escalation (catch the wrong-rung-by-error pattern)
|
|
83
|
+
|
|
84
|
+
If a build fails with ANY of these errors, you are on the WRONG RUNG — escalate immediately, do NOT log it as a project blocker:
|
|
85
|
+
|
|
86
|
+
| Error code / message | Meaning | Action |
|
|
87
|
+
|---|---|---|
|
|
88
|
+
| `NETSDK1178` ("workload missing") | MAUI/iOS/Android workload not installed at the dotnet you're calling | Switch to rung #4 (`cmd.exe /c "dotnet build ..."`) |
|
|
89
|
+
| `Microsoft.iOS.Sdk` / `Microsoft.Android.Sdk` / `Microsoft.MacCatalyst.Sdk` missing | Same as above | Rung #4 |
|
|
90
|
+
| `error : Workload ID '...' not recognized` | Workload definition missing at the dotnet you're calling | Rung #4 |
|
|
91
|
+
| `error : Microsoft.WindowsAppSDK ... not found` | WinUI / WinAppSDK workload missing on WSL side | Rung #4 |
|
|
92
|
+
| `command not found: dotnet` | Wrong rung (not the right thing) | Next rung |
|
|
93
|
+
| Real C# compile errors (CS####), missing references in source code | This IS a project issue | Log as Known blocker; stay on the rung |
|
|
94
|
+
|
|
95
|
+
**Rule of thumb:** Workload/SDK errors → rung change. Source-code errors → project blocker.
|
|
96
|
+
|
|
97
|
+
## Probe order (optional, single commands)
|
|
98
|
+
|
|
99
|
+
If you want to detect availability before building (do this once per session, cache the result):
|
|
100
|
+
|
|
101
|
+
1. `ls $HOME/.dotnet/dotnet 2>/dev/null` — fastest WSL probe
|
|
102
|
+
2. `cmd.exe /c "where dotnet"` — fastest Windows probe (confirms rung #4 is available)
|
|
103
|
+
3. `cmd.exe /c "dotnet workload list"` — see which workloads Windows-side has (one-time check)
|
|
104
|
+
|
|
105
|
+
## Recording the result
|
|
106
|
+
|
|
107
|
+
After a successful build (any rung):
|
|
108
|
+
- `last_verified_build: PASS`
|
|
109
|
+
- `last_verified_date: {today YYYY-MM-DD}`
|
|
110
|
+
- Note which rung was used in the PROJECT-STATUS verification-log row or Remarks (e.g. `built via rung #4`).
|
|
111
|
+
|
|
112
|
+
After a failed build that's NOT a workload/wrong-rung issue (real CS#### errors):
|
|
113
|
+
- `last_verified_build: FAIL`
|
|
114
|
+
- `last_verified_date: {today YYYY-MM-DD}`
|
|
115
|
+
- Add to "Known blockers" with one-line error summary AND which rung was used.
|
|
116
|
+
|
|
117
|
+
After all rungs genuinely failed (probed all 5, none could find dotnet at all):
|
|
118
|
+
- `last_verified_build: not-run`
|
|
119
|
+
- `last_verified_date: {today YYYY-MM-DD}`
|
|
120
|
+
- Add to "Known blockers": "Tried ladder rungs 1-5; no dotnet found in WSL PATH, ~/.dotnet/, winrun, cmd.exe, or powershell.exe. User needs to install .NET SDK or expose it to WSL PATH."
|
|
121
|
+
|
|
122
|
+
## What NEVER goes into Known blockers (banned escape-hatch entries)
|
|
123
|
+
|
|
124
|
+
These are NOT blockers — they are signals you used the wrong rung. If you find yourself writing one, you skipped this doc:
|
|
125
|
+
|
|
126
|
+
- ❌ "MAUI build cannot run on WSL"
|
|
127
|
+
- ❌ "Microsoft.iOS.Sdk workload missing"
|
|
128
|
+
- ❌ "Microsoft.Android.Sdk workload missing"
|
|
129
|
+
- ❌ "NETSDK1178 — workload not installed"
|
|
130
|
+
- ❌ "WSL doesn't have the MAUI workload"
|
|
131
|
+
- ❌ "dotnet not in PATH"
|
|
132
|
+
- ❌ Anything that boils down to "I tried the wrong rung and it failed"
|
|
133
|
+
|
|
134
|
+
The user has the bridge set up. Their projects build green on the right rung. Document what RUNG produced the working build, not what failed on the wrong one.
|
|
135
|
+
|
|
136
|
+
## What NOT to do
|
|
137
|
+
|
|
138
|
+
- Do NOT report `last_verified_build: not-run` because rung #1 failed. That is a lazy escape. Try rungs 2-5 first.
|
|
139
|
+
- Do NOT wrap the probe in `if [ -x ... ]; then ... else ... fi` — that triggers a permission prompt. Run probes as plain single commands.
|
|
140
|
+
- Do NOT log workload-missing / NETSDK1178 / wrong-rung errors as "Known blockers". They are wrong-rung errors. Switch and retry.
|
|
141
|
+
- Do NOT claim ".NET is unavailable on this system" unless ALL five rungs failed AND your probe commands also failed. Even then, report which rungs you tried verbatim.
|
|
142
|
+
- **Do NOT let a host limitation cancel a cross-OS deliverable.** A MAUI Mac Catalyst / iOS head genuinely cannot be built from Windows/WSL (`-r osx-arm64` only cross-compiles *plain* .NET — a Catalyst `.app` needs Xcode's toolchain, macOS only; `NETSDK1005`/`NETSDK1139`/a maccatalyst TFM guarded by `IsOSPlatform('OSX')` is that fact surfacing, not a failure). That is a **rung-selection fact, never a reason to drop the native head, declare it impossible, or quietly substitute another head** (e.g. a web-head publish) as "the" deliverable. The app's BuildAndRun guide documents the owner-run on-Mac path — prepare the source + the exact on-Mac commands, state plainly "the Catalyst `.app` is built on the Mac per the guide §<n> (one command, owner-run)", and treat any substitute you can build locally as a *complement*, offered alongside, never a silent replacement.
|
|
143
|
+
|
|
144
|
+
---
|
|
145
|
+
|
|
146
|
+
## C. Native Windows (Claude Code / OpenCode running on Windows, not inside WSL)
|
|
147
|
+
|
|
148
|
+
→ **Use rung #1: `dotnet build`.** You are already on the Windows side, so there is no interop bridge — `cmd.exe`/`winrun`/`/home/...` from §B do NOT apply.
|
|
149
|
+
|
|
150
|
+
- **Non-MAUI** projects: `dotnet build` / `dotnet test` / `dotnet run` directly.
|
|
151
|
+
- **MAUI**: builds natively here. Windows (`net9.0-windows10…`) and Android heads build directly once `dotnet workload install maui` has been run. **iOS / Mac Catalyst heads require a paired Mac** (Apple's toolchain only runs on macOS) — building those from Windows needs a Mac build host; absence of one is a genuine platform limitation, not a wrong-rung error.
|
|
152
|
+
- Paths in commands use the project's actual location (e.g. `C:\src\App\App.sln`). Single commands, no `if/for` wrappers (same permission-prompt reason as §B).
|
|
153
|
+
- `NETSDK1178` / "workload not installed" → run `dotnet workload install <id>` once; there is no alternate rung to switch to.
|
|
154
|
+
|
|
155
|
+
## D. Runtime-observe leg — reaching the RUNNING UI after a green build
|
|
156
|
+
|
|
157
|
+
Building is only half of "verify". Once a head builds green, the verifier / devguide OBSERVE / smoke gates must **drive the running UI** to apply the data-render (§4a) and visual-truth (§4b) gates. The driver depends on the head — this is the runtime counterpart to the build rungs above, and it does NOT change how anything builds:
|
|
158
|
+
|
|
159
|
+
| Head | Build (above) | **Runtime driver** | Where it runs |
|
|
160
|
+
|------|---------------|--------------------|---------------|
|
|
161
|
+
| Blazor | rung #1/#2 | headless **Playwright** (system Chromium) | WSL |
|
|
162
|
+
| MAUI **Windows** | §B rung #4 / §C native | **FlaUI / Appium-Windows** | Windows side |
|
|
163
|
+
| MAUI **Android** | §B rung #4 / §A/§C native | **Appium** (`uiautomator2`) → emulator/device | Windows host (SDK + emulator); WSL drives over HTTP |
|
|
164
|
+
| MAUI **iOS** | paired Mac (Xcode) | **Appium** (`xcuitest`) → iOS Simulator | LAN Mac; WSL drives over HTTP |
|
|
165
|
+
| MAUI **Mac Catalyst** | paired Mac (Xcode) | **Appium** (`mac2`) → the running .app | LAN Mac; WSL drives over HTTP |
|
|
166
|
+
|
|
167
|
+
**Appium is the native analogue of Playwright** — same WebDriver protocol, returns a `base64` screenshot (visual-truth) + an element tree with `rect`/text (data-render). So the gates' assertions are identical; only the driver differs.
|
|
168
|
+
|
|
169
|
+
- The endpoints live in `core-config.yaml → runtimeVerification.appium` (per app, opt-in). The WSL side needs only the **HTTP url** — no `adb`, emulator, or Xcode inside WSL.
|
|
170
|
+
- **Android** runs entirely on the Windows host; the verifier boots the emulator + Appium itself via the registry `launch` command (you may launch it through `winrun`), then drives it over `http://localhost:4723` (Win11 mirrored networking) — booting it yourself, never asking the owner, is the same rule as the build ladder.
|
|
171
|
+
- **iOS / Mac Catalyst** depend on the **LAN Mac being up**. `curl http://<mac>:4723/status` first; if unreachable, that head degrades to `⚠ STATIC-ONLY` (a session dependency, like "stack down"), never a faked `Verified`.
|
|
172
|
+
- One-time host setup (Android SDK + AVD + Appium on Windows; Xcode + Appium + xcuitest/mac2 on the Mac; the `.wslconfig` mirrored-networking switch) is **`WORKFLOW.html §0b`**.
|
|
173
|
+
- **Input discipline (all native heads, esp. MAUI Windows):** bind the driver to the app under test by identity — the **PID you launched → its top-level window handle** (Appium Windows `appium:appTopLevelWindow` / FlaUI `Application.Attach(pid)`) or the app **package/bundle id** on mobile — and interact **element-by-element via `AutomationId`** inside that bound window. NEVER global keyboard/mouse injection (FlaUI `Keyboard.Type`, coordinate clicks, `SendKeys`): it lands in whatever window has focus, not the app. Full rules: `verify-phase.md §3b`.
|
|
174
|
+
|
|
175
|
+
## E. OpenCode Docker on Windows — host bridge
|
|
176
|
+
|
|
177
|
+
> **FALLBACK ONLY (since 2026-08-20).** OpenCode's primary deployment is native WSL — the same distro as Claude Code, using the §B ladder like any other WSL process (`docs/OpenCode-Deployment-Guide.md`). This section applies only when the Docker container is deliberately in use (`TF_OPENCODE_DOCKER=1`); nothing here concerns a WSL OpenCode session.
|
|
178
|
+
|
|
179
|
+
An OpenCode Linux container is not WSL: `/proc/version` does not expose Windows interop, and `cmd.exe` cannot be installed into it. The framework Dockerfile uses the .NET 10 SDK and deliberately installs no MAUI workloads. Standard .NET projects build and test in the container. For a Windows MAUI Blazor Desktop target, use the image's `winrun` wrapper, which sends the command over SSH to the Windows host and starts it in `TF_WINDOWS_APP_PATH`. Mobile/iOS/Mac Catalyst builds and runtime tests belong on a native Mac.
|
|
180
|
+
|
|
181
|
+
- Probe: `test -x /usr/local/bin/winrun && test -n "$TF_WINDOWS_SSH_USER" && test -n "$TF_WINDOWS_APP_PATH"` followed by `winrun "dotnet --info"`. The first checks configuration; the second proves the SSH bridge actually works. The Docker launcher may mount `/root/.ssh` read-only; `winrun` copies the key to a writable `/tmp` file with mode `0600` and maintains host trust in `/tmp`, so do not attempt to `chmod` the mounted key.
|
|
182
|
+
- Build: `winrun "dotnet build -c Release"`.
|
|
183
|
+
- Do not report missing `cmd.exe` as a code blocker when the bridge probe succeeds.
|
|
184
|
+
- Do not check for or install `maui-tizen` in the container. The image intentionally contains no MAUI workloads.
|
|
185
|
+
- If the bridge is absent or SSH fails, report the exact setup failure and mark only the Windows head `STATIC-ONLY`; continue Linux-compatible builds and Appium HTTP verification.
|
|
186
|
+
- For private feeds, use the Docker-specific user config mounted at `/root/.nuget/NuGet/NuGet.Config`. A Windows `%AppData%\NuGet\NuGet.Config` may contain DPAPI-encrypted credentials that cannot be decrypted in Linux. Never put the Docker config in the repository.
|
|
187
|
+
|
|
188
|
+
## Recording the result (all platforms)
|
|
189
|
+
|
|
190
|
+
After a successful build, note **which platform + invocation** produced it (e.g. "built on macOS via `dotnet build` (rung #1)", "built on WSL via `cmd.exe /c` (rung #4)") in the PROJECT-STATUS verification-log row or Remarks — so a reader on a different machine knows what to expect. The §B "what NEVER goes into Known blockers" list applies to WSL specifically; on §A/§C the equivalent non-blocker is "workload not yet installed — run `dotnet workload install`", which is a one-time user setup step, not a project defect.
|