@techierathore/techieflow 1.0.2 → 1.0.4
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 +5 -13
- package/.claude/commands/TechieFlow/agents/architect.md +1 -16
- package/.claude/commands/TechieFlow/agents/flow-master.md +42 -215
- package/.claude/commands/TechieFlow/agents/verifier.md +24 -64
- package/.claude/commands/TechieFlow/tasks/_metrics-emit-gate.md +24 -117
- package/.claude/commands/TechieFlow/tasks/_owner-language.md +26 -0
- package/.claude/commands/TechieFlow/tasks/_smoke-test-policy.md +20 -84
- package/.claude/commands/TechieFlow/tasks/_status-update-gate.md +10 -74
- package/.claude/commands/TechieFlow/tasks/_yolo-mode.md +20 -58
- package/.claude/commands/TechieFlow/tasks/amend-docs.md +21 -143
- package/.claude/commands/TechieFlow/tasks/build-phase.md +14 -224
- package/.claude/commands/TechieFlow/tasks/create-deep-research-prompt.md +4 -0
- package/.claude/commands/TechieFlow/tasks/create-doc.md +4 -0
- package/.claude/commands/TechieFlow/tasks/create-project-brief.md +22 -0
- package/.claude/commands/TechieFlow/tasks/day1-brownfield.md +31 -505
- package/.claude/commands/TechieFlow/tasks/day1-greenfield.md +28 -213
- package/.claude/commands/TechieFlow/tasks/deploy-checklist.md +19 -0
- package/.claude/commands/TechieFlow/tasks/devguide.md +10 -219
- package/.claude/commands/TechieFlow/tasks/facilitate-brainstorming-session.md +4 -0
- package/.claude/commands/TechieFlow/tasks/fix-issues.md +10 -129
- package/.claude/commands/TechieFlow/tasks/generate-html.md +5 -1
- package/.claude/commands/TechieFlow/tasks/handoff-phase.md +18 -16
- package/.claude/commands/TechieFlow/tasks/log-miss.md +19 -158
- package/.claude/commands/TechieFlow/tasks/metrics-report.md +3 -1
- package/.claude/commands/TechieFlow/tasks/mockups.md +12 -117
- package/.claude/commands/TechieFlow/tasks/refresh-status.md +9 -130
- package/.claude/commands/TechieFlow/tasks/split-brd.md +10 -126
- package/.claude/commands/TechieFlow/tasks/triage-and-fix.md +14 -0
- package/.claude/commands/TechieFlow/tasks/triage-issues.md +11 -152
- package/.claude/commands/TechieFlow/tasks/verify-phase.md +36 -572
- package/.opencode/plugin/techieflow.js +40 -13
- package/.tfcore/agents/analyst.md +5 -13
- package/.tfcore/agents/architect.md +1 -16
- package/.tfcore/agents/flow-master.md +42 -215
- package/.tfcore/agents/verifier.md +24 -64
- package/.tfcore/core-config.yaml +10 -0
- package/.tfcore/hooks/block-git.sh +4 -4
- package/.tfcore/hooks/guard-artifacts.sh +2 -2
- package/.tfcore/hooks/guard-build.sh +76 -0
- package/.tfcore/hooks/guard-db.sh +90 -0
- package/.tfcore/hooks/guard-metrics.sh +68 -0
- package/.tfcore/hooks/guard-status-html.sh +116 -71
- package/.tfcore/hooks/guard-status.sh +43 -16
- package/.tfcore/hooks/guard-verify-deps.sh +124 -0
- package/.tfcore/hooks/guard-verify.sh +70 -48
- package/.tfcore/hooks/sweep-artifacts.sh +2 -2
- package/.tfcore/install-manifest.yaml +0 -18
- package/.tfcore/routing.yaml +86 -14
- package/.tfcore/standards/coding-standards-core.md +61 -0
- package/.tfcore/standards/coding-standards-dotnet.md +93 -0
- package/.tfcore/tasks/_metrics-emit-gate.md +24 -117
- package/.tfcore/tasks/_owner-language.md +26 -0
- package/.tfcore/tasks/_smoke-test-policy.md +20 -84
- package/.tfcore/tasks/_status-update-gate.md +10 -74
- package/.tfcore/tasks/_yolo-mode.md +20 -58
- package/.tfcore/tasks/amend-docs.md +21 -143
- package/.tfcore/tasks/build-phase.md +14 -224
- package/.tfcore/tasks/create-deep-research-prompt.md +4 -0
- package/.tfcore/tasks/create-doc.md +4 -0
- package/.tfcore/tasks/create-project-brief.md +22 -0
- package/.tfcore/tasks/day1-brownfield.md +31 -505
- package/.tfcore/tasks/day1-greenfield.md +28 -213
- package/.tfcore/tasks/deploy-checklist.md +19 -0
- package/.tfcore/tasks/devguide.md +10 -219
- package/.tfcore/tasks/facilitate-brainstorming-session.md +4 -0
- package/.tfcore/tasks/fix-issues.md +10 -129
- package/.tfcore/tasks/generate-html.md +5 -1
- package/.tfcore/tasks/handoff-phase.md +18 -16
- package/.tfcore/tasks/log-miss.md +19 -158
- package/.tfcore/tasks/metrics-report.md +3 -1
- package/.tfcore/tasks/mockups.md +12 -117
- package/.tfcore/tasks/refresh-status.md +9 -130
- package/.tfcore/tasks/split-brd.md +10 -126
- package/.tfcore/tasks/triage-and-fix.md +14 -0
- package/.tfcore/tasks/triage-issues.md +11 -152
- package/.tfcore/tasks/verify-phase.md +36 -572
- package/.tfcore/telemetry/SCHEMA.md +100 -8
- package/.tfcore/telemetry/tf-metrics.sh +564 -32
- package/.tfcore/templates/stack-defaults/dotnet.md +35 -0
- package/.tfcore/templates/stack-questions.md +77 -0
- package/.tfcore/templates/v4custom/app-agents-md-tmpl.md +3 -4
- package/.tfcore/templates/v4custom/app-architecture-tmpl.md +107 -115
- package/.tfcore/templates/v4custom/app-brd-tmpl.md +108 -184
- package/.tfcore/templates/v4custom/app-brief-tmpl.md +65 -0
- package/.tfcore/templates/v4custom/app-checklist-tmpl.md +48 -73
- package/.tfcore/templates/v4custom/app-claude-md-tmpl.md +1 -1
- package/.tfcore/templates/v4custom/app-coding-standards-tmpl.md +52 -0
- package/.tfcore/templates/v4custom/app-decision-request-tmpl.md +85 -0
- package/.tfcore/templates/v4custom/app-deployment-checklist-tmpl.md +86 -0
- package/.tfcore/templates/v4custom/app-devguide-tmpl.md +69 -146
- package/.tfcore/templates/v4custom/app-library-feedback-tmpl.md +86 -31
- package/.tfcore/templates/v4custom/app-phases-tmpl.md +35 -0
- package/.tfcore/templates/v4custom/app-productguide-tmpl.md +38 -35
- package/.tfcore/templates/v4custom/app-project-status-tmpl.md +63 -73
- package/.tfcore/templates/v4custom/app-uidesign-tmpl.md +62 -37
- package/.tfcore/templates/v4custom/app-usageguide-tmpl.md +69 -54
- package/.tfcore/templates/v4custom/build-invocation-ladder.md +17 -180
- package/.tfcore/templates/v4custom/build-subagent-prompt.md +17 -0
- package/.tfcore/templates/v4custom/html-render-shell.md +1 -1
- package/.tfcore/templates/v4custom/metrics-report-template.md +2 -2
- package/.tfcore/user-guide.md +0 -23
- package/.tfcore/utils/__pycache__/tf-brd-status.cpython-312.pyc +0 -0
- package/.tfcore/utils/__pycache__/tf-checklist-edit.cpython-312.pyc +0 -0
- package/.tfcore/utils/__pycache__/tf-codex-bind.cpython-312.pyc +0 -0
- package/.tfcore/utils/__pycache__/tf-codex-telemetry.cpython-312.pyc +0 -0
- package/.tfcore/utils/__pycache__/tf-day1-files.cpython-312.pyc +0 -0
- package/.tfcore/utils/__pycache__/tf-devguide-list.cpython-312.pyc +0 -0
- package/.tfcore/utils/__pycache__/tf-doc-check.cpython-312.pyc +0 -0
- package/.tfcore/utils/__pycache__/tf-log-miss.cpython-312.pyc +0 -0
- package/.tfcore/utils/__pycache__/tf-misses-md.cpython-312.pyc +0 -0
- package/.tfcore/utils/__pycache__/tf-mockups-locate.cpython-312.pyc +0 -0
- package/.tfcore/utils/__pycache__/tf-opencode-audit.cpython-312.pyc +0 -0
- package/.tfcore/utils/__pycache__/tf-perf-grade.cpython-312.pyc +0 -0
- package/.tfcore/utils/__pycache__/tf-render-html.cpython-312.pyc +0 -0
- package/.tfcore/utils/__pycache__/tf-split-brd.cpython-312.pyc +0 -0
- package/.tfcore/utils/__pycache__/tf-status-facts.cpython-312.pyc +0 -0
- package/.tfcore/utils/__pycache__/tf-triage.cpython-312.pyc +0 -0
- package/.tfcore/utils/__pycache__/tf-verify-list.cpython-312.pyc +0 -0
- package/.tfcore/utils/__pycache__/tf-verify-verdict.cpython-312.pyc +0 -0
- package/.tfcore/utils/tf-brd-status.py +176 -0
- package/.tfcore/utils/tf-brd-status.sh +19 -0
- package/.tfcore/utils/tf-build-list.py +211 -0
- package/.tfcore/utils/tf-build-list.sh +21 -0
- package/.tfcore/utils/tf-build.sh +143 -0
- package/.tfcore/utils/tf-cdp-relay.ps1 +64 -0
- package/.tfcore/utils/tf-checklist-edit.py +133 -0
- package/.tfcore/utils/tf-day1-files.py +208 -0
- package/.tfcore/utils/tf-day1-files.sh +20 -0
- package/.tfcore/utils/tf-devguide-list.py +249 -0
- package/.tfcore/utils/tf-devguide-list.sh +18 -0
- package/.tfcore/utils/tf-doc-check.py +1369 -0
- package/.tfcore/utils/tf-doc-check.sh +29 -0
- package/.tfcore/utils/tf-emit.sh +545 -18
- package/.tfcore/utils/tf-fix-close.sh +115 -0
- package/.tfcore/utils/tf-gitignore-audit.sh +50 -3
- package/.tfcore/utils/tf-goal.sh +284 -66
- package/.tfcore/utils/tf-harness.sh +4 -9
- package/.tfcore/utils/tf-log-miss.py +197 -0
- package/.tfcore/utils/tf-log-miss.sh +14 -0
- package/.tfcore/utils/tf-misses-md.py +208 -0
- package/.tfcore/utils/tf-misses-md.sh +14 -0
- package/.tfcore/utils/tf-mockups-locate.py +66 -0
- package/.tfcore/utils/tf-mockups-locate.sh +18 -0
- package/.tfcore/utils/tf-model-pick.sh +475 -0
- package/.tfcore/utils/tf-opencode-audit.py +23 -7
- package/.tfcore/utils/tf-perf-grade.py +97 -0
- package/.tfcore/utils/tf-perf-grade.sh +12 -0
- package/.tfcore/utils/tf-phase.sh +92 -0
- package/.tfcore/utils/tf-render-html.py +20 -0
- package/.tfcore/utils/tf-routing-bind.sh +97 -6
- package/.tfcore/utils/tf-routing.sh +13 -7
- package/.tfcore/utils/tf-selfcheck.sh +323 -0
- package/.tfcore/utils/tf-split-brd.py +309 -0
- package/.tfcore/utils/tf-split-brd.sh +22 -0
- package/.tfcore/utils/tf-status-evidence.sh +68 -0
- package/.tfcore/utils/tf-status-facts.py +358 -0
- package/.tfcore/utils/tf-status-facts.sh +20 -0
- package/.tfcore/utils/tf-triage.py +243 -0
- package/.tfcore/utils/tf-triage.sh +16 -0
- package/.tfcore/utils/tf-verify-boot.sh +250 -0
- package/.tfcore/utils/tf-verify-emit.sh +110 -0
- package/.tfcore/utils/tf-verify-env.sh +88 -0
- package/.tfcore/utils/tf-verify-list.py +270 -0
- package/.tfcore/utils/tf-verify-list.sh +13 -0
- package/.tfcore/utils/tf-verify-screens.mjs +355 -0
- package/.tfcore/utils/tf-verify-screens.sh +31 -0
- package/.tfcore/utils/tf-verify-tests.sh +166 -0
- package/.tfcore/utils/tf-verify-verdict.py +292 -0
- package/.tfcore/utils/tf-verify-verdict.sh +15 -0
- package/.tfcore/utils/tf-yolo.sh +59 -0
- package/README.md +120 -1145
- package/docs/TechieFlow-Installation.md +1 -5
- package/opencode.jsonc +37 -33
- package/package.json +1 -5
- package/scripts/install.mjs +56 -46
- package/.claude/commands/TechieFlow/tasks/advanced-elicitation.md +0 -117
- package/.claude/commands/TechieFlow/tasks/author-brd.md +0 -79
- package/.claude/commands/TechieFlow/tasks/document-project.md +0 -343
- package/.claude/commands/TechieFlow/tasks/execute-checklist.md +0 -86
- package/.claude/commands/TechieFlow/tasks/index-docs.md +0 -173
- package/.claude/commands/TechieFlow/tasks/kb-mode-interaction.md +0 -75
- package/.claude/commands/TechieFlow/tasks/shard-doc.md +0 -185
- package/.codex/config.toml +0 -46
- package/.codex/hooks.json +0 -63
- package/.codex/rules/techieflow.rules +0 -8
- package/.tfcore/hooks/codex-adapter.py +0 -248
- package/.tfcore/tasks/advanced-elicitation.md +0 -117
- package/.tfcore/tasks/author-brd.md +0 -79
- package/.tfcore/tasks/document-project.md +0 -343
- package/.tfcore/tasks/execute-checklist.md +0 -86
- package/.tfcore/tasks/index-docs.md +0 -173
- package/.tfcore/tasks/kb-mode-interaction.md +0 -75
- package/.tfcore/tasks/shard-doc.md +0 -185
- package/.tfcore/templates/architecture-tmpl.yaml +0 -650
- package/.tfcore/templates/brownfield-architecture-tmpl.yaml +0 -476
- package/.tfcore/templates/competitor-analysis-tmpl.yaml +0 -306
- package/.tfcore/templates/front-end-architecture-tmpl.yaml +0 -218
- package/.tfcore/templates/fullstack-architecture-tmpl.yaml +0 -823
- package/.tfcore/templates/market-research-tmpl.yaml +0 -252
- package/.tfcore/templates/project-brief-tmpl.yaml +0 -221
- package/.tfcore/utils/techieflow-doc-template.md +0 -325
- package/.tfcore/utils/tf-codex-bind.py +0 -196
- package/.tfcore/utils/tf-codex-telemetry.py +0 -60
- package/WORKFLOW.html +0 -1986
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# TechieFlow — Stack Defaults: .NET
|
|
2
|
+
|
|
3
|
+
| | |
|
|
4
|
+
|---|---|
|
|
5
|
+
| Purpose | An answer set for `TechieFlow-Stack-Questions.md`. These are the defaults the framework's author uses for their own .NET / Blazor / MAUI projects. Naming this answer set at day-1 fills in the questions it covers; the agent asks the rest. |
|
|
6
|
+
| Audience | Owners of .NET projects using TechieFlow. Owners in other stacks write their own answer set with the same structure. |
|
|
7
|
+
| Status | Drafted in Session 2 of the reset (2026-09-04) from the author's answers. Becomes a file under `.tfcore/templates/stack-defaults/` in Session 3. Configuration document read by agents; not rendered to HTML. |
|
|
8
|
+
| Applies to | Projects that declare `stack: dotnet` and name this answer set. Change any row for a project by overriding it in that project's Architecture Stack Decisions section; the override wins. |
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## Answers
|
|
13
|
+
|
|
14
|
+
| Q | Topic | Default | Still asked at day-1? |
|
|
15
|
+
|---|---|---|---|
|
|
16
|
+
| Q1 | Configuration | Non-secret configuration lives in `appsettings.json`, layered by `appsettings.{Environment}.json`. No other configuration mechanism is created. | No |
|
|
17
|
+
| Q2 | Secrets in development | Project user secrets (`dotnet user-secrets`), visible to the developer, never committed. `appsettings.Development.json` is committed and therefore never holds a real secret. A `secrets.example.json` in the project lists every key the application reads. | No |
|
|
18
|
+
| Q3 | Database | PostgreSQL, running in Docker, for development and production. Docker is always running on the development machine because WSL, where the harness runs, depends on it. If PostgreSQL is unreachable the container is stopped: the agent starts it and continues. Only if no PostgreSQL container exists at all does the agent stop and ask the owner for connection details. It never substitutes another engine and never creates its own database container. | No, unless no container exists |
|
|
19
|
+
| Q4 | Authentication | Two choices only: **AppManager**, the author's shared platform for identity, roles, licences and subscriptions, which counts as part of the application and not as an external integration; or a different mechanism named by the owner. | **Yes**: "AppManager, or something else?" |
|
|
20
|
+
| Q5 | Logging | Serilog, always, with file logging wired at startup before anything else can fail. | No |
|
|
21
|
+
| Q6 | Tests | xUnit, always. A test project exists from day-1. | No |
|
|
22
|
+
| Q7 | Layout and naming | `src/` and `tests/` at the root. The primary executable project is named exactly `<App>`; `<App>.App` is banned. Secondary heads take a descriptive suffix (`<App>.Api`, `<App>.Desktop`). | No |
|
|
23
|
+
| Q8 | User interface | TrBlazeUI for every Blazor head and every MAUI Blazor Hybrid head. Native controls for WinForms, WPF and non-Blazor MAUI heads. Rendering mode is chosen per project and recorded. | Rendering mode only |
|
|
24
|
+
| Q9 | Hosting | Web applications run containerised on a Bluehost VPS. The owner supplies a pipeline guidance document at UAT go-ahead, and a deployment checklist is produced from it. | Asked at UAT go-ahead, as the questionnaire specifies |
|
|
25
|
+
| Q10 | Production secrets | Decided when the owner asks for the production pipeline, after UAT. Until then no document states where production secrets live. | Asked after UAT |
|
|
26
|
+
| Q11 | Standing rules and prohibitions | 1. Never add a NuGet package without a line in the Architecture document saying why. 2. Never create a second configuration mechanism. 3. When TechieFlow, TrBlazeUI, TechieRag or any other internal library lacks something, record it in that library's feedback file and hold the feature until the library is fixed. Never implement a workaround. 4. Data access is always Dapper. 5. Database migrations live in a dedicated project named `<App>Db` (console or library) using the DbUp package. The web application runs the migration at startup, or the pipeline runs it after deployment. Never a `database` folder of loose scripts at the repository root. 6. Log files are written under the build output folder (`bin/`), which is git-ignored. Never at the repository root. 7. No unnecessary folders at the repository root (`data`, `database`, `scripts` and the like). Everything sits under `src/` or `tests/` according to what it belongs to. | No |
|
|
27
|
+
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
## Notes
|
|
31
|
+
|
|
32
|
+
- Q4 is asked on purpose even with this answer set, because the choice differs per product.
|
|
33
|
+
- Q3's "start the container, never create one" replaces the behaviour that produced TfLens's own database container: an agent that cannot reach the expected database restarts it or asks, and never builds an alternative.
|
|
34
|
+
- Q11.5 replaces the `database` folder of loose migration scripts that TfLens accumulated.
|
|
35
|
+
- Q11.3 is a standing framework convention restated as a stack rule so that it is recorded per project and its violations can be counted.
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
# TechieFlow — Stack Questions
|
|
2
|
+
|
|
3
|
+
| | |
|
|
4
|
+
|---|---|
|
|
5
|
+
| Purpose | The questions the framework asks the owner about a project's technology and conventions, when it asks them, and where the answers are recorded. The framework itself is technology-neutral; these answers are what make a project's documents and code specific. |
|
|
6
|
+
| Audience | Framework agents (the questionnaire is asked verbatim), project owners, contributors. |
|
|
7
|
+
| Status | Drafted in Session 2 of the reset (2026-09-04). Becomes a template under `.tfcore/templates/` in Session 3. Configuration document read by agents; not rendered to HTML. |
|
|
8
|
+
| Related | `TechieFlow-Stack-Defaults-DotNet.md` (an answer set), `TechieFlow-Requirements.md` (FR-01, FR-02) |
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## 1. Principle
|
|
13
|
+
|
|
14
|
+
The framework never assumes a language, a UI library, a database, an authentication scheme, a test framework or a hosting target. Before any project document is written, the agent asks the questions below and records the answers in one place: the **Stack Decisions** section of the project's Architecture document. Every later command reads its stack facts from there and nowhere else.
|
|
15
|
+
|
|
16
|
+
An owner who always works in one stack answers once by naming an **answer set**, a file that holds their standard answers. The framework ships one answer set, `TechieFlow-Stack-Defaults-DotNet.md`, described as the defaults its author uses for their own .NET projects. Any owner may copy it, change it, or write a different one. Naming an answer set fills in every question it covers; the agent then asks only the questions the set leaves open.
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## 2. When the questions are asked
|
|
21
|
+
|
|
22
|
+
| Moment | Questions | Why then |
|
|
23
|
+
|---|---|---|
|
|
24
|
+
| Day-1, before any document is written | Q1 to Q8 | Every document depends on the answers. |
|
|
25
|
+
| When the owner gives the go-ahead for user acceptance testing (UAT) | Q9 | Hosting decisions made earlier are guesses; by UAT the application is real. |
|
|
26
|
+
| When the owner asks for a production deployment pipeline, after UAT | Q10 | Production secrets and infrastructure are decided by the people who run production. |
|
|
27
|
+
|
|
28
|
+
In YOLO mode the agent does not skip the day-1 questions; it takes the answer set's value where one exists and stops with a clear message where none does. A document written without a recorded answer is a defect.
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
## 3. The questions
|
|
33
|
+
|
|
34
|
+
**Q1. Configuration.** Where does non-secret configuration live, and how is it layered per environment?
|
|
35
|
+
|
|
36
|
+
**Q2. Secrets in development.** Where do secrets live on a developer machine, and what must never be committed?
|
|
37
|
+
|
|
38
|
+
**Q3. Database.** Which database engine in development and which in production? Is a container for the database acceptable, and under what condition? What does the agent do if the database is not reachable?
|
|
39
|
+
|
|
40
|
+
**Q4. Authentication and authorisation.** Which identity mechanism: a shared platform, the framework's built-in identity, an external provider, or none? Who owns roles, licences and subscriptions?
|
|
41
|
+
|
|
42
|
+
**Q5. Logging.** Which logging library, which sinks, and is file logging mandatory?
|
|
43
|
+
|
|
44
|
+
**Q6. Tests.** Which test framework? Is a test project mandatory from day one? Which categories of test are expected (unit, integration, browser)?
|
|
45
|
+
|
|
46
|
+
**Q7. Solution layout and naming.** Folder layout for source and tests; naming rule for the primary executable project and for secondary heads.
|
|
47
|
+
|
|
48
|
+
**Q8. User interface.** Which UI framework or component library for each kind of head (web, mobile, desktop)? Which rendering mode by default?
|
|
49
|
+
|
|
50
|
+
**Q9. Hosting and deployment.** Where does the application run, in what form (container, service, static files), and is there a deployment guidance document to follow? Is a deployment checklist required?
|
|
51
|
+
|
|
52
|
+
**Q10. Production secrets and pipeline.** Where do production secrets live, and how does the pipeline inject them?
|
|
53
|
+
|
|
54
|
+
**Q11. Standing rules and prohibitions.** Anything an agent must always or never do in this repository that is not already enforced by a hook. Recorded as a list; the framework treats each item as a rule and tracks whether it is honoured. Two rules are present by default in every project, whatever the stack, and an owner may remove them only by saying so:
|
|
55
|
+
|
|
56
|
+
1. Log files are written under the build output folder, which is git-ignored. Never at the repository root.
|
|
57
|
+
2. No unnecessary folders at the repository root (`data`, `database`, `scripts` and the like). Everything sits under the source folder or the tests folder according to what it belongs to.
|
|
58
|
+
|
|
59
|
+
---
|
|
60
|
+
|
|
61
|
+
## 4. Where the answers go
|
|
62
|
+
|
|
63
|
+
The Architecture document gains a section, **Stack Decisions**, placed first, one row per question:
|
|
64
|
+
|
|
65
|
+
| Q | Decision | Source | Date |
|
|
66
|
+
|---|---|---|---|
|
|
67
|
+
| Q1 | `appsettings.json` plus `appsettings.{Environment}.json` | answer set: DotNet | 2026-09-04 |
|
|
68
|
+
| Q3 | PostgreSQL in a container for development and production | owner, day-1 | 2026-09-04 |
|
|
69
|
+
| … | | | |
|
|
70
|
+
|
|
71
|
+
"Source" is either the answer set name or "owner" with the moment it was asked. Q9 and Q10 rows are added when they are answered; until then they read "not yet asked (UAT)" and "not yet asked (production)". The Coding Standards document references this section instead of restating it.
|
|
72
|
+
|
|
73
|
+
---
|
|
74
|
+
|
|
75
|
+
## 5. What this replaces
|
|
76
|
+
|
|
77
|
+
Before this document, the framework had one standing technology decision (Serilog file logging) written into the day-1 tasks, the BRD template and the Architecture template, and no place for any other. Projects therefore invented their own arrangements at build time; TfLens ended with settings in three places. This questionnaire moves every such decision to day-1 and to one recorded location.
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# {AppName} — project session memory (all harnesses)
|
|
2
2
|
|
|
3
3
|
<!-- This file is COMMITTED (unlike CLAUDE.md, which is gitignored and imports it).
|
|
4
|
-
OpenCode
|
|
4
|
+
OpenCode auto-loads AGENTS.md; Claude Code loads it through CLAUDE.md's
|
|
5
5
|
@AGENTS.md import. Keep everything in here harness-neutral — Claude-only
|
|
6
6
|
material (permissions, tool preference) lives in app-claude-md-tmpl.md. -->
|
|
7
7
|
|
|
@@ -13,9 +13,9 @@ ALWAYS read and follow:
|
|
|
13
13
|
|
|
14
14
|
## Hard rules (non-negotiable — the harness enforces #1)
|
|
15
15
|
|
|
16
|
-
1. **Git is manual — agents NEVER run `git` or `gh`.** Not to commit, and not to read (`status`/`log`/`diff`/`grep`/`blame`). All harnesses enforce this mechanically: Claude Code via `.claude/settings.json` and `block-git.sh`; OpenCode via `opencode.jsonc` plus its plugin bridge
|
|
16
|
+
1. **Git is manual — agents NEVER run `git` or `gh`.** Not to commit, and not to read (`status`/`log`/`diff`/`grep`/`blame`). All harnesses enforce this mechanically: Claude Code via `.claude/settings.json` and `block-git.sh`; OpenCode via `opencode.jsonc` plus its plugin bridge. A blocked git call is the policy working, not an obstacle to route around. Evidence for status updates / "what changed" = the checklist Requirements Status table + the working-tree files (+ mtimes) + a fresh `dotnet build` (`.tfcore/tasks/_status-update-gate.md`). The OWNER commits, in a separate terminal.
|
|
17
17
|
2. **Run the app yourself — the test harness is fully set up.** Headless Playwright + Chromium live in WSL; the Windows/MAUI dotnet bridge is rung #4 of the build ladder; MAUI Android/iOS/Mac Catalyst are driven over the Appium bridge (`core-config.yaml → runtimeVerification.appium`). NEVER ask the owner to boot the app, run a build, or execute a command — "can't run on Linux/WSL", "it targets Windows", "it's MAUI", "Playwright needs a GUI", "the dependent service is down" are BANNED excuses (`.tfcore/tasks/_smoke-test-policy.md`). Asking the owner is the LAST resort, only after the build ladder + `verify-phase §3a` escalation genuinely fail — and even then you still run the test yourself once they reply.
|
|
18
|
-
3. **The framework tree is invisible to search — a search that finds nothing is NOT proof a file is missing.** `.tfcore/`, `.claude/`, `.
|
|
18
|
+
3. **The framework tree is invisible to search — a search that finds nothing is NOT proof a file is missing.** `.tfcore/`, `.claude/`, `.opencode/` and `.agents/skills/` are hidden dot-directories AND gitignored here (deliberate — deployed framework copies are never committed). File search skips hidden paths *and* honours `.gitignore`, so it takes **both** (`rg -uu`; `--hidden` alone is not enough), and `git grep`/`git ls-files` see nothing at all. Confirm a framework file by **reading its literal path** — every one has a single canonical location, and whatever needs it names that path. Never write "not present in this tree" into a verdict, a checklist Remarks cell, a BRD row, or a blocker without having tried the path and failed: that false negative propagates into the docs and the next agent treats it as fact. If a framework file really is absent, the repo needs `update-framework.sh <repo>` run once on this machine — report that instead of reimplementing what it does. (`.tfcore/tasks/_status-update-gate.md` §"The framework tree is INVISIBLE to search".)
|
|
19
19
|
4. **Native-head automation binds to the app's own window.** Drive a MAUI head only through a session attached to the app under test (Windows: launched PID → its top-level window handle; Android/iOS/Catalyst: the app's package/bundle id), interact element-by-element via `AutomationId`, and NEVER inject global keyboard/mouse input — it lands in whatever window happens to have focus, not the app (`verify-phase.md §3b`).
|
|
20
20
|
|
|
21
21
|
## Project basics
|
|
@@ -41,7 +41,6 @@ never silently worked around.
|
|
|
41
41
|
|
|
42
42
|
## Slash-command syntax (READ ME if a `/agent *command` invocation fails)
|
|
43
43
|
|
|
44
|
-
**Codex:** use repository skills such as `$techieflow-build`, `$techieflow-verify`, and `$techieflow-refresh-status`, or ask for the skill by name in plain language. Skills load the canonical `.tfcore/tasks/*.md` workflow. When a task calls for fan-out, delegate to the registered `tf_builder`, `tf_test_writer`, `tf_explorer`, `trblazeui`, or `techierag` Codex role and wait for its result. Defining a role alone does not authorize delegation; the user request or applicable skill must call for it. Project config and hooks require repository trust; review changed hooks with `/hooks`.
|
|
45
44
|
|
|
46
45
|
**Claude Code** registers TechieFlow-native agents under the path-derived namespace `TechieFlow:agents:<name>`. The short `/<agent>` form does NOT always resolve. When in doubt use the full form:
|
|
47
46
|
|
|
@@ -1,127 +1,119 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
Unquoted special characters ( ( ) / & : , … ) in flowchart labels are the #1 cause of
|
|
22
|
-
"Syntax error" diagrams in the rendered HTML.
|
|
1
|
+
<!-- tf-schema
|
|
2
|
+
doc: architecture
|
|
3
|
+
file: docs/{App}-Architecture.md
|
|
4
|
+
header: App, Kind, Size, Stack answer set, Date
|
|
5
|
+
section: Stack decisions | required
|
|
6
|
+
section: Solution structure | required
|
|
7
|
+
section: Component map | required
|
|
8
|
+
section: Data model | required
|
|
9
|
+
section: Cross-cutting | required
|
|
10
|
+
section: Decisions log | required
|
|
11
|
+
section: Module responsibilities | optional-small
|
|
12
|
+
section: Open questions | optional
|
|
13
|
+
rule: stack-rows
|
|
14
|
+
rule: head-project
|
|
15
|
+
budget: S 2500 3500 | M 4000 6000 | L 4000 6000
|
|
16
|
+
rule: stack-table
|
|
17
|
+
rule: solution-table
|
|
18
|
+
rule: request-flow
|
|
19
|
+
rule: er-diagram
|
|
20
|
+
rule: decisions-log
|
|
23
21
|
-->
|
|
22
|
+
<!-- Authoring notes (agent only; never visible text).
|
|
23
|
+
Sections and order are fixed by the schema above. The Stack decisions table answers the stack
|
|
24
|
+
questions (.tfcore/templates/stack-questions.md); answers taken from an answer set cite it.
|
|
25
|
+
No Deployment section: hosting is decided after UAT and lives in the Deployment Checklist; how a
|
|
26
|
+
developer runs the app lives in the UsageGuide. Detailed per-screen flows live in the DevGuide.
|
|
27
|
+
A brownfield project describes the code as it is; a planned change is a Decisions log row with
|
|
28
|
+
Status "planned" naming the BRD item that drives it.
|
|
29
|
+
Mermaid: quote every label; never use `end` as a node id. -->
|
|
30
|
+
|
|
31
|
+
# {App} — Architecture
|
|
32
|
+
|
|
33
|
+
| | |
|
|
34
|
+
|---|---|
|
|
35
|
+
| App | {App} |
|
|
36
|
+
| Kind | app or library |
|
|
37
|
+
| Size | Small, Medium or Large |
|
|
38
|
+
| Stack answer set | {name, or "none"} |
|
|
39
|
+
| Date | {YYYY-MM-DD} |
|
|
40
|
+
|
|
41
|
+
## 1. Stack decisions
|
|
42
|
+
|
|
43
|
+
One row per stack question. "Source" says where the answer came from: the answer set, the owner, or the existing code.
|
|
44
|
+
|
|
45
|
+
| Q | Topic | Decision | Source |
|
|
46
|
+
|---|---|---|---|
|
|
47
|
+
| Q1 | Configuration | {…} | {answer set / owner / code} |
|
|
48
|
+
| Q2 | Secrets in development | {…} | {…} |
|
|
49
|
+
| Q3 | Database | {…} | {…} |
|
|
50
|
+
| Q4 | Authentication | {…} | {…} |
|
|
51
|
+
| Q5 | Logging | {…} | {…} |
|
|
52
|
+
| Q6 | Tests | {…} | {…} |
|
|
53
|
+
| Q7 | Layout and naming | {…} | {…} |
|
|
54
|
+
| Q8 | User interface | {…} | {…} |
|
|
55
|
+
| Q11 | Standing rules | {…} | {…} |
|
|
56
|
+
|
|
57
|
+
## 2. Solution structure
|
|
58
|
+
|
|
59
|
+
| Project | Kind | Purpose |
|
|
60
|
+
|---|---|---|
|
|
61
|
+
| `{App}` | {web app, desktop app, API, …} | {the primary head} |
|
|
62
|
+
| `{App}.Core` | class library | {…} |
|
|
63
|
+
| `{App}Db` | migrations project | {…} |
|
|
64
|
+
| `{App}.Tests` | test project | {…} |
|
|
65
|
+
|
|
66
|
+
## 3. Component map
|
|
24
67
|
|
|
25
|
-
## Table of Contents
|
|
26
|
-
|
|
27
|
-
<!-- Auto-maintained by the analyst/day-1 tasks. Use the slug rule from .tfcore/templates/v4custom/html-render-shell.md §1 so links work in both MD and rendered HTML. Update this list whenever you add/rename a section. -->
|
|
28
|
-
|
|
29
|
-
1. [Tech stack](#tech-stack)
|
|
30
|
-
2. [Component map](#component-map)
|
|
31
|
-
3. [Data flow — primary path](#data-flow-primary-path)
|
|
32
|
-
4. [Module responsibilities](#module-responsibilities)
|
|
33
|
-
5. [Cross-cutting concerns](#cross-cutting-concerns)
|
|
34
|
-
6. [Deployment architecture](#deployment-architecture)
|
|
35
|
-
7. [Architectural decisions (ADR-style log)](#architectural-decisions-adr-style-log)
|
|
36
|
-
8. [Target architecture (brownfield only — if enhancement changes structure)](#target-architecture-brownfield-only-if-enhancement-changes-structure)
|
|
37
|
-
9. [Open questions / risks](#open-questions-risks)
|
|
38
|
-
|
|
39
|
-
## 1. Tech stack
|
|
40
|
-
| Layer | Choice | Version | Notes |
|
|
41
|
-
|-------|--------|---------|-------|
|
|
42
|
-
| Runtime | .NET 9 | … | … |
|
|
43
|
-
| UI | Blazor [Server/WASM/Auto] + TrBlazeUI | … | … |
|
|
44
|
-
| AI/RAG | TechieRag | … | If applicable |
|
|
45
|
-
| DB | SQL Server / SQLite / Postgres | … | … |
|
|
46
|
-
| Vector store | SqliteVec / PgVector / Qdrant | … | If RAG |
|
|
47
|
-
| Auth | … | … | … |
|
|
48
|
-
|
|
49
|
-
## 2. Component map
|
|
50
68
|
```mermaid
|
|
51
69
|
flowchart TB
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
end
|
|
56
|
-
subgraph BE["Backend"]
|
|
57
|
-
API["API"]
|
|
58
|
-
Auth["Auth"]
|
|
59
|
-
Rag["RAG service"]
|
|
60
|
-
end
|
|
61
|
-
subgraph Data["Data"]
|
|
62
|
-
SQL[("SQL")]
|
|
63
|
-
Vec[("Vector")]
|
|
64
|
-
end
|
|
65
|
-
UI --> API
|
|
66
|
-
API --> Auth
|
|
67
|
-
API --> Rag
|
|
68
|
-
Rag --> Vec
|
|
69
|
-
API --> SQL
|
|
70
|
+
UI["UI"] --> Svc["Services"]
|
|
71
|
+
Svc --> Data["Data access"]
|
|
72
|
+
Data --> DB[("Database")]
|
|
70
73
|
```
|
|
71
74
|
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
participant DB
|
|
80
|
-
U->>UI: action
|
|
81
|
-
UI->>API: HTTPS
|
|
82
|
-
API->>Svc: call
|
|
83
|
-
Svc->>DB: query
|
|
84
|
-
DB-->>Svc: rows
|
|
85
|
-
Svc-->>API: dto
|
|
86
|
-
API-->>UI: json
|
|
87
|
-
UI-->>U: render
|
|
88
|
-
```
|
|
75
|
+
**How a request travels** (one typical request, in words; per-screen detail is in the DevGuide):
|
|
76
|
+
1. {The page calls …}
|
|
77
|
+
2. {The service …}
|
|
78
|
+
3. {The data access …}
|
|
79
|
+
4. {The result is shown …}
|
|
80
|
+
|
|
81
|
+
## 4. Data model
|
|
89
82
|
|
|
90
|
-
## 4. Module responsibilities
|
|
91
|
-
| Module | Responsibility | Depends on |
|
|
92
|
-
|--------|----------------|------------|
|
|
93
|
-
| `src/{AppName}.Web` | UI host | Domain, Infra |
|
|
94
|
-
| `src/{AppName}.Domain` | Entities, business rules | (none) |
|
|
95
|
-
| `src/{AppName}.Infrastructure` | EF, external services | Domain |
|
|
96
|
-
| `src/{AppName}.Rag` | TechieRag wiring (if applicable) | Domain |
|
|
97
|
-
|
|
98
|
-
## 5. Cross-cutting concerns
|
|
99
|
-
- Logging — Serilog file-based logging (rolling file sink under `logs/`, wired at startup in EVERY executable head — web, API, MAUI, desktop, console; app code logs via `ILogger<T>`). This is a TechieFlow standing requirement, not a per-app choice — see Coding Standards §Logging.
|
|
100
|
-
- Error handling — global middleware; ProblemDetails responses
|
|
101
|
-
- Auth — JWT / cookie / Azure AD
|
|
102
|
-
- Caching — IMemoryCache / Redis
|
|
103
|
-
- Telemetry — OpenTelemetry / Application Insights
|
|
104
|
-
|
|
105
|
-
## 6. Deployment architecture
|
|
106
83
|
```mermaid
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
84
|
+
erDiagram
|
|
85
|
+
USER ||--o{ ENTRY : writes
|
|
86
|
+
ENTRY {
|
|
87
|
+
int EntryId PK
|
|
88
|
+
string Title
|
|
89
|
+
}
|
|
112
90
|
```
|
|
113
91
|
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
92
|
+
| Entity | Key fields | Notes |
|
|
93
|
+
|---|---|---|
|
|
94
|
+
| {Entity} | {…} | {…} |
|
|
117
95
|
|
|
118
|
-
##
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
96
|
+
## 5. Cross-cutting
|
|
97
|
+
|
|
98
|
+
- **Identity:** {AppManager API, or the mechanism chosen at Q4}.
|
|
99
|
+
- **Configuration:** {…}
|
|
100
|
+
- **Logging:** {…}
|
|
101
|
+
- **Errors:** {…}
|
|
102
|
+
|
|
103
|
+
## 6. Decisions log
|
|
104
|
+
|
|
105
|
+
One row per decision. Every package added to the project has a row saying why.
|
|
106
|
+
|
|
107
|
+
| Date | Decision | Why | Status |
|
|
108
|
+
|---|---|---|---|
|
|
109
|
+
| {YYYY-MM-DD} | {…} | {…} | decided, planned, done |
|
|
110
|
+
|
|
111
|
+
## 7. Module responsibilities
|
|
112
|
+
|
|
113
|
+
| Module | Responsibility | Depends on |
|
|
114
|
+
|---|---|---|
|
|
115
|
+
| {…} | {…} | {…} |
|
|
116
|
+
|
|
117
|
+
## 8. Open questions
|
|
125
118
|
|
|
126
|
-
|
|
127
|
-
- …
|
|
119
|
+
- {…}
|