@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,85 @@
|
|
|
1
|
+
<!-- tf-schema
|
|
2
|
+
doc: decision-request
|
|
3
|
+
file: docs/{App}-Decision-Request.md
|
|
4
|
+
header: App, Written, Waiting on
|
|
5
|
+
section: What happened | required | max 250
|
|
6
|
+
section: What I need you to decide | required
|
|
7
|
+
section: What I do when you answer | required | max 200
|
|
8
|
+
section: Copy this back to me | required | max 250
|
|
9
|
+
entries: What I need you to decide |
|
|
10
|
+
per-entry: 150 300
|
|
11
|
+
rule: entry-decision-options
|
|
12
|
+
rule: entry-recommendation
|
|
13
|
+
rule: paste-back-block
|
|
14
|
+
rule: no-glossary
|
|
15
|
+
target-lines: 120
|
|
16
|
+
max-lines: 260
|
|
17
|
+
-->
|
|
18
|
+
<!-- Authoring notes (agent only; never visible text).
|
|
19
|
+
|
|
20
|
+
WHEN TO WRITE ONE. A command has hit a choice only the owner can make and the
|
|
21
|
+
answer changes what gets built. Write this file, render it to HTML, and say one
|
|
22
|
+
line in the terminal: which file to open, and that it holds N decisions. Never
|
|
23
|
+
argue the decision out in the terminal — that fills the context and buries the
|
|
24
|
+
question. Everything the owner needs is in the file.
|
|
25
|
+
|
|
26
|
+
WHO READS IT. The owner, and nobody else. No task ever loads a Decision Request
|
|
27
|
+
as input, and it is never named in core-config.yaml. The way the answer comes
|
|
28
|
+
back is the owner pasting the block from §"Copy this back to me" — that pasted
|
|
29
|
+
prompt is the input, and the file's job is done the moment it is answered.
|
|
30
|
+
|
|
31
|
+
HOW IT IS WRITTEN. Plain, simple English, the way you would explain it to
|
|
32
|
+
someone who has not read a line of the framework. No coined terms. No framework
|
|
33
|
+
shorthand. No requirement ids in the question itself — name the thing, not its
|
|
34
|
+
number. If a word needs defining, it is the wrong word: change it. A glossary
|
|
35
|
+
section is refused by `rule: no-glossary`, because a document that has to teach
|
|
36
|
+
its own vocabulary before it can ask its question was written for the wrong
|
|
37
|
+
reader.
|
|
38
|
+
|
|
39
|
+
WHAT IT IS NOT. Not a defect report — that is the feedback file. Not an
|
|
40
|
+
architecture decision record — that is DECISIONS.md, written after the fact.
|
|
41
|
+
This file asks a question and then stops existing: when it is answered, it moves
|
|
42
|
+
unchanged to docs/OldDocs/ and the live name is free for the next one.
|
|
43
|
+
|
|
44
|
+
ONE LIVE FILE. All open decisions go in this one file as separate entries. Never
|
|
45
|
+
a dated copy, never a -v2. -->
|
|
46
|
+
|
|
47
|
+
# {App} — decisions I need from you
|
|
48
|
+
|
|
49
|
+
| | |
|
|
50
|
+
|---|---|
|
|
51
|
+
| App | {App} |
|
|
52
|
+
| Written | {YYYY-MM-DD} |
|
|
53
|
+
| Waiting on | {N} decisions. Nothing has been changed yet. |
|
|
54
|
+
|
|
55
|
+
## What happened
|
|
56
|
+
|
|
57
|
+
{Two short paragraphs, at most 250 words. What was being done, what stopped it, and
|
|
58
|
+
why the choice is yours rather than something to be worked out. Plain words.}
|
|
59
|
+
|
|
60
|
+
## What I need you to decide
|
|
61
|
+
|
|
62
|
+
### {1. The short name of the choice}
|
|
63
|
+
|
|
64
|
+
{One paragraph: what the choice actually is, in plain words.}
|
|
65
|
+
|
|
66
|
+
| Option | What happens | What it costs |
|
|
67
|
+
|---|---|---|
|
|
68
|
+
| **A — {name}** | {what the project looks like afterwards} | {work, and what is given up} |
|
|
69
|
+
| **B — {name}** | {what the project looks like afterwards} | {work, and what is given up} |
|
|
70
|
+
|
|
71
|
+
**My recommendation: {A}** — {one sentence saying why.}
|
|
72
|
+
|
|
73
|
+
## What I do when you answer
|
|
74
|
+
|
|
75
|
+
{The steps, in order, one line each. What gets edited, what gets re-checked, roughly
|
|
76
|
+
how long. So the answer is given with the consequences in view.}
|
|
77
|
+
|
|
78
|
+
## Copy this back to me
|
|
79
|
+
|
|
80
|
+
{One fenced block per decision. Each block is a complete instruction that stands on
|
|
81
|
+
its own — the owner pastes it and nothing else needs saying.}
|
|
82
|
+
|
|
83
|
+
```
|
|
84
|
+
{App}: decision 1 — go with option A. {The one thing that changes.}
|
|
85
|
+
```
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
<!-- tf-schema
|
|
2
|
+
doc: deployment-checklist
|
|
3
|
+
file: docs/{App}-Deployment-Checklist.md
|
|
4
|
+
header: App, Hosting target, Pipeline document, Date, Proven
|
|
5
|
+
section: Who does what | required
|
|
6
|
+
section: Secrets and settings | required
|
|
7
|
+
section: Before the first deploy | required
|
|
8
|
+
section: Deploy | required
|
|
9
|
+
section: After the deploy | required
|
|
10
|
+
section: Rollback | required
|
|
11
|
+
section: Routine operations | required
|
|
12
|
+
section: Troubleshooting | required
|
|
13
|
+
section: Proven | required
|
|
14
|
+
budget: S 2500 4000 | M 2500 4000 | L 2500 4000
|
|
15
|
+
rule: deploy-who-table
|
|
16
|
+
rule: deploy-secrets-once
|
|
17
|
+
rule: deploy-checkboxes
|
|
18
|
+
rule: deploy-proven
|
|
19
|
+
-->
|
|
20
|
+
<!-- Authoring notes (agent only; never visible text).
|
|
21
|
+
One document per hosting target, produced after UAT from the owner's pipeline guidance document
|
|
22
|
+
and the Stack answers Q9 (hosting) and Q10 (production secrets and pipeline). Running the
|
|
23
|
+
application locally is NOT in it; that is the UsageGuide's Execution guide.
|
|
24
|
+
Every item in sections 3 to 6 is a checkbox ("- [ ]") with one action and one observable result;
|
|
25
|
+
no narrative paragraphs anywhere. Each secret or setting name appears in exactly one row of the
|
|
26
|
+
Secrets and settings table and is never re-described elsewhere. Proven says "never" until a real
|
|
27
|
+
deploy has been executed, then the date. Schema: docs/TechieFlow-Document-Schemas.md §3.10. -->
|
|
28
|
+
|
|
29
|
+
# {App} — Deployment Checklist
|
|
30
|
+
|
|
31
|
+
| | |
|
|
32
|
+
|---|---|
|
|
33
|
+
| App | {App} |
|
|
34
|
+
| Hosting target | {one target: VPS, Docker host, IIS, Azure App Service, …} |
|
|
35
|
+
| Pipeline document | {path of the owner's pipeline guidance document} |
|
|
36
|
+
| Date | {YYYY-MM-DD} |
|
|
37
|
+
| Proven | never |
|
|
38
|
+
|
|
39
|
+
## 1. Who does what
|
|
40
|
+
|
|
41
|
+
| Step | Done by |
|
|
42
|
+
|---|---|
|
|
43
|
+
| {Build and publish the artefact} | pipeline |
|
|
44
|
+
| {Approve the release} | owner |
|
|
45
|
+
|
|
46
|
+
## 2. Secrets and settings
|
|
47
|
+
|
|
48
|
+
| Name | Where it is set | What breaks without it |
|
|
49
|
+
|---|---|---|
|
|
50
|
+
| {CONNECTION_STRING} | {host environment variable} | {the application cannot start} |
|
|
51
|
+
|
|
52
|
+
## 3. Before the first deploy
|
|
53
|
+
|
|
54
|
+
- [ ] {One action} — {the result that shows it worked}
|
|
55
|
+
|
|
56
|
+
## 4. Deploy
|
|
57
|
+
|
|
58
|
+
- [ ] {One action} — {the result that shows it worked}
|
|
59
|
+
|
|
60
|
+
## 5. After the deploy
|
|
61
|
+
|
|
62
|
+
- [ ] {The command to run} — {the output that proves it worked}
|
|
63
|
+
|
|
64
|
+
## 6. Rollback
|
|
65
|
+
|
|
66
|
+
- [ ] {One action} — {the result that shows it worked}
|
|
67
|
+
|
|
68
|
+
A rollback does not undo: {database migrations; …}.
|
|
69
|
+
|
|
70
|
+
## 7. Routine operations
|
|
71
|
+
|
|
72
|
+
| Task | Command |
|
|
73
|
+
|---|---|
|
|
74
|
+
| {Restart the service} | `{command}` |
|
|
75
|
+
|
|
76
|
+
## 8. Troubleshooting
|
|
77
|
+
|
|
78
|
+
| Symptom | Cause | Fix |
|
|
79
|
+
|---|---|---|
|
|
80
|
+
| {…} | {…} | {…} |
|
|
81
|
+
|
|
82
|
+
## 9. Proven
|
|
83
|
+
|
|
84
|
+
| What | Executed for real | When |
|
|
85
|
+
|---|---|---|
|
|
86
|
+
| {Deploy to the target} | no | — |
|
|
@@ -1,167 +1,90 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
Purpose) ARE reader-facing and stay visible.
|
|
17
|
-
|
|
18
|
-
DEPTH MANDATE (read before drafting): every screen entry must connect the visible UI to the
|
|
19
|
-
code that produces it: the Razor page/component (with file path), each meaningful CONTROL on
|
|
20
|
-
it, and the full DATA LINEAGE for each control/action — Razor component → service method →
|
|
21
|
-
data-access method → stored procedure name / SQL query. If a value is calculated, say where
|
|
22
|
-
and how. "It's handled in the service" is NOT acceptable — name the method and the file.
|
|
23
|
-
A developer who has never seen the code must be able to open this guide, find the screen,
|
|
24
|
-
and know exactly which files to open to fix a bug.
|
|
25
|
-
|
|
26
|
-
TWO RULES THAT KEEP THIS GUIDE TRUE (not hallucinated):
|
|
27
|
-
• Landing-truth — a screen's "Reached via" / where a role lands after login MUST be read from
|
|
28
|
-
the routing/redirect code (the NavigateTo(...) after login, the default @page "/", the auth
|
|
29
|
-
redirect) and cite file:line. NEVER infer it from the folder a page lives in or its name
|
|
30
|
-
(e.g. don't assume an Admin lands on an Admin Dashboard just because the page is under Admin/).
|
|
31
|
-
• Render-truth — confirm the data actually REACHES AND RENDERS in each control, not merely
|
|
32
|
-
that a method/proc exists. Check the @if guards, whether the query's columns map to the
|
|
33
|
-
model (case/underscore), computed getters that can throw/blank, and required component
|
|
34
|
-
parameters that must be declared (e.g. a grid's Pagination). Tag each control renders /
|
|
35
|
-
renders-empty (suspected defect — why) / {unresolved — TODO}; a suspected defect is also
|
|
36
|
-
logged to the checklist.
|
|
1
|
+
<!-- tf-schema
|
|
2
|
+
doc: devguide
|
|
3
|
+
file: docs/{App}-DevGuide.md
|
|
4
|
+
header: App, Kind, Size, Verified on, Date
|
|
5
|
+
section: Architecture cheat-sheet | required | max 300
|
|
6
|
+
section: Roles and menu map | app
|
|
7
|
+
section: Screen-by-screen code map | required
|
|
8
|
+
section: Cross-cutting flows | required
|
|
9
|
+
section: Known issues | required
|
|
10
|
+
entries: Screen-by-screen code map |
|
|
11
|
+
per-entry: 300 450
|
|
12
|
+
budget: S 4000 6000 | M 7000 10000 | L 7000 10000
|
|
13
|
+
rule: entry-screenshot
|
|
14
|
+
rule: entry-call-chain
|
|
15
|
+
rule: entry-break-table
|
|
37
16
|
-->
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
17
|
+
<!-- Authoring notes (agent only; never visible text).
|
|
18
|
+
A developer's map from each screen to the code that serves it, written so they can set breakpoints
|
|
19
|
+
and debug it. Documents the code AS BUILT, read at file:line; never inferred from folder names.
|
|
20
|
+
One `###` per screen (per component for a UI library, linked to the sample-app screen that shows it;
|
|
21
|
+
per public service for a service library: registration, call chain, where to break; owner 2026-09-06).
|
|
22
|
+
Each entry: the screenshot captured from the running app; one "Call chain:" line, page method to
|
|
23
|
+
service class and method to data-access class and method; a where-to-break table, one row per step:
|
|
24
|
+
file and line, function, the variable to watch, the value it should hold. Line numbers are as of
|
|
25
|
+
"Verified on"; the function name is what to search for when a line has moved.
|
|
26
|
+
Produced when the build completes the checklist; refreshed at handoff.
|
|
27
|
+
Large project: one DevGuide per phase (docs/{App}-DevGuide.md, docs/{App}-P2-DevGuide.md, …) with a
|
|
28
|
+
header row "| Phase | n of m |". Cross-cutting flows are written once, in phase 1; a later phase
|
|
29
|
+
repeats them only if it changed them, otherwise one line points at phase 1's section. -->
|
|
30
|
+
|
|
31
|
+
# {App} — Developer Guide
|
|
32
|
+
|
|
33
|
+
| | |
|
|
34
|
+
|---|---|
|
|
35
|
+
| App | {App} |
|
|
36
|
+
| Kind | app or library |
|
|
37
|
+
| Size | Small, Medium or Large |
|
|
38
|
+
| Verified on | {YYYY-MM-DD, the run the screenshots and line numbers come from} |
|
|
39
|
+
| Date | {YYYY-MM-DD} |
|
|
61
40
|
|
|
62
41
|
## Architecture cheat-sheet
|
|
63
42
|
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
| UI (Blazor) | `src/{AppName}.Web` | Razor pages/components, layouts, nav menu | `Pages/`, `Components/`, `Shared/NavMenu.razor` |
|
|
69
|
-
| App services | `src/{AppName}.Application` (or `.Services`) | Business logic, orchestration | `DashboardService`, `KundliService` |
|
|
70
|
-
| Data access | `src/{AppName}.Infrastructure` (or `.Data`) | Repositories, DbContext, Dapper queries | `KundliRepository`, `AppDbContext` |
|
|
71
|
-
| Database | `database/` / `src/{AppName}.Db` | Tables, stored procs, seed scripts | `usp_*.sql`, migrations |
|
|
43
|
+
```mermaid
|
|
44
|
+
flowchart LR
|
|
45
|
+
UI["Pages"] --> Svc["Services"] --> Data["Data access"] --> DB[("Database")]
|
|
46
|
+
```
|
|
72
47
|
|
|
73
|
-
|
|
74
|
-
|
|
48
|
+
| Layer | Project or folder | What lives here |
|
|
49
|
+
|---|---|---|
|
|
50
|
+
| UI | `src/{App}/Pages` | {…} |
|
|
51
|
+
| Services | `src/{App}.Core/Services` | {…} |
|
|
52
|
+
| Data access | `src/{App}.Core/Data` | {…} |
|
|
75
53
|
|
|
76
54
|
## Roles and menu map
|
|
77
55
|
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
| Role |
|
|
81
|
-
|------|----------------------------|----------------------------------------------|----------------------|-------------|
|
|
82
|
-
| {App Admin} | {admin@…} | {`[Authorize(Roles="Admin")]` / policy name} | {Dashboard, Users, Settings, …} | [{App}-DevGuide-AppAdmin.md](./{AppName}-DevGuide-AppAdmin.md) |
|
|
83
|
-
| {App Manager} | {manager@…} | {…} | {Dashboard, Reports, …} | [{App}-DevGuide-AppManager.md](./{AppName}-DevGuide-AppManager.md) |
|
|
84
|
-
| {End user} | {user1@…} | {…} | {Home, Profile, …} | [{App}-DevGuide-EndUser.md](./{AppName}-DevGuide-EndUser.md) |
|
|
85
|
-
|
|
86
|
-
For each role, list the **menu → menu-item → screen** mapping so a developer knows, for a given role, what appears and what each item opens:
|
|
87
|
-
|
|
88
|
-
### {Role} — menu structure
|
|
89
|
-
- **{Menu group}** → **{Menu item}** → opens `{Route}` (`{RazorFile}`) — see [§4 {Role} · {Screen}](#role--screen)
|
|
90
|
-
- ...
|
|
56
|
+
| Role | Test user | Menu items and the screen each opens |
|
|
57
|
+
|---|---|---|
|
|
58
|
+
| {Role} | {user #} | {Menu → screen (`/route`)} |
|
|
91
59
|
|
|
92
60
|
## Screen-by-screen code map
|
|
93
61
|
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
---
|
|
97
|
-
|
|
98
|
-
### {Role} · {Screen / Page name}
|
|
62
|
+
### {Screen name} (`/route`)
|
|
99
63
|
|
|
100
|
-
|
|
101
|
-
- **Razor file:** `src/{AppName}.Web/Pages/Dashboard.razor` (+ code-behind `Dashboard.razor.cs` if present)
|
|
102
|
-
- **Reached via:** {Menu group → menu item}; **Log in as:** {test user from UsageGuide}
|
|
103
|
-
- **What this screen does:** {one or two lines}
|
|
104
|
-
- **Visual status:** {✅ looks-right (runtime-confirmed {date}) | ⚠ visual-broken (DEFECT — {what} @ {width}, {date}) | static-only (unconfirmed)}
|
|
64
|
+

|
|
105
65
|
|
|
106
|
-
**
|
|
66
|
+
**Call chain:** `{Page}.razor.cs:{HandleX}` → `{Service}.{Method}` → `{DataAccess}.{Method}` → `{table or procedure}`
|
|
107
67
|
|
|
108
|
-
|
|
68
|
+
| File and line | Function | Watch | Expected value |
|
|
69
|
+
|---|---|---|---|
|
|
70
|
+
| `src/{App}/Pages/{Page}.razor.cs:127` | `HandleX` | `aModel.Email` | the email typed in the box |
|
|
71
|
+
| `src/{App}.Core/Services/{Service}.cs:54` | `{Method}` | `vResult` | {…} |
|
|
72
|
+
| `src/{App}.Core/Data/{DataAccess}.cs:31` | `{Method}` | `vRows.Count` | {…} |
|
|
109
73
|
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
**Screen flowchart** — show every meaningful control on the screen and where its data comes from. (Follow the Mermaid authoring rules in `.tfcore/templates/v4custom/html-render-shell.md §5.5` — quote every label, never use `end` as a node id.)
|
|
114
|
-
|
|
115
|
-
```mermaid
|
|
116
|
-
flowchart TD
|
|
117
|
-
P["Dashboard.razor"] --> C1["Kundli list (grid)"]
|
|
118
|
-
P --> C2["Ruling-Planet chart"]
|
|
119
|
-
P --> C3["Ruling-Planet table"]
|
|
120
|
-
C1 --> S1["DashboardService.GetKundliList()"]
|
|
121
|
-
C2 --> S2["DashboardService.GetRulingPlanets()"]
|
|
122
|
-
C3 --> S2
|
|
123
|
-
S1 --> R1["KundliRepository.QueryList()"]
|
|
124
|
-
S2 --> R2["KundliRepository.QueryRulingPlanets()"]
|
|
125
|
-
R1 --> DB1[("usp_GetKundliList")]
|
|
126
|
-
R2 --> DB2[("usp_RulingPlanets")]
|
|
127
|
-
```
|
|
128
|
-
|
|
129
|
-
**Controls on this screen**
|
|
130
|
-
|
|
131
|
-
| Control | Type | Purpose | Populated / calculated by |
|
|
132
|
-
|---------|------|---------|---------------------------|
|
|
133
|
-
| {Kundli list} | {grid} | {lists kundlis for the tenant} | {`DashboardService.GetKundliList()`} |
|
|
134
|
-
| {Ruling-Planet chart} | {chart} | {shows current ruling planets} | {`DashboardService.GetRulingPlanets()` — values computed in `RulingPlanetCalculator`} |
|
|
135
|
-
|
|
136
|
-
**Data lineage** — the full path for each control/action. This is the heart of the guide.
|
|
137
|
-
|
|
138
|
-
| Control / Action | Razor component (file) | Service method (file) | Data-access method (file) | Stored proc / Query | Notes / calculation |
|
|
139
|
-
|------------------|------------------------|-----------------------|---------------------------|---------------------|---------------------|
|
|
140
|
-
| {Load Kundli list} | {`Dashboard.razor` line ~40} | {`DashboardService.GetKundliList()`} | {`KundliRepository.QueryList()`} | {`usp_GetKundliList`} | {paged; tenant-filtered} |
|
|
141
|
-
| {Ruling-Planet chart} | {`Dashboard.razor` `<RulingPlanetChart>`} | {`DashboardService.GetRulingPlanets()`} | {`KundliRepository.QueryRulingPlanets()`} | {`usp_RulingPlanets`} | {planet strengths computed in `RulingPlanetCalculator.Compute()` from the proc rows} |
|
|
142
|
-
| {Save / submit action} | {…} | {…} | {…} | {…} | {…} |
|
|
143
|
-
|
|
144
|
-
**Business rules / calculations on this screen**
|
|
145
|
-
- {Any non-trivial computation, validation, or derived value — name the method that does it.}
|
|
146
|
-
|
|
147
|
-
**Known issues / gotchas**
|
|
148
|
-
- {Anything fragile, any TR-NNN library gap, any `Blocked` REQ touching this screen.}
|
|
149
|
-
|
|
150
|
-
_(Repeat the `### {Role} · {Screen}` block for every screen the role can reach.)_
|
|
151
|
-
|
|
152
|
-
---
|
|
74
|
+
**Calculations on this screen:** {method name and what it computes, or "none"}
|
|
153
75
|
|
|
154
76
|
## Cross-cutting flows
|
|
155
77
|
|
|
156
|
-
|
|
78
|
+
### Sign-in
|
|
79
|
+
**Call chain:** {…}
|
|
80
|
+
|
|
81
|
+
| File and line | Function | Watch | Expected value |
|
|
82
|
+
|---|---|---|---|
|
|
83
|
+
| {…} | {…} | {…} | {…} |
|
|
157
84
|
|
|
158
|
-
|
|
85
|
+
### Configuration, logging, errors
|
|
86
|
+
{One line each: where it is wired, file and line.}
|
|
159
87
|
|
|
160
|
-
|
|
161
|
-
2. Open §4, find that role + screen, find the control in the **Data lineage** table.
|
|
162
|
-
3. Walk the lineage **top-down**: Razor component → service method → data-access method → stored proc/query. The bug is in one of those four.
|
|
163
|
-
4. If the visible value is *calculated*, the lineage row names the calculator method — check it.
|
|
164
|
-
5. After fixing, re-run the screen's walkthrough in `docs/{AppName}-UsageGuide.md`, then re-generate this guide (`*devguide {AppName}`) if the code path changed.
|
|
88
|
+
## Known issues
|
|
165
89
|
|
|
166
|
-
|
|
167
|
-
_Generated/refreshed by `*devguide {AppName}`. Reflects the code as built at the time shown in the subtitle — regenerate after code changes._
|
|
90
|
+
- {one line each, with the REQ or feedback id}
|
|
@@ -1,31 +1,86 @@
|
|
|
1
|
-
<!--
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
1
|
+
<!-- tf-schema
|
|
2
|
+
doc: feedback
|
|
3
|
+
file: docs/{App}-{Upstream}-Feedback.md
|
|
4
|
+
header: App, Upstream, Updated
|
|
5
|
+
section: Summary | required | max 200
|
|
6
|
+
section: Entries | required
|
|
7
|
+
section: Replies from* | optional
|
|
8
|
+
section: Resolution status* | optional
|
|
9
|
+
entries: Entries |
|
|
10
|
+
per-entry: 120 250
|
|
11
|
+
rule: entry-feedback-fields
|
|
12
|
+
rule: entry-blocks-line
|
|
13
|
+
rule: feedback-blocking-count
|
|
14
|
+
rule: no-glossary
|
|
15
|
+
-->
|
|
16
|
+
<!-- Authoring notes (agent only; never visible text).
|
|
17
|
+
|
|
18
|
+
ONE FEEDBACK FILE PER UPSTREAM — never a combined file. Each upstream owns a
|
|
19
|
+
separate codebase and receives only its own file:
|
|
20
|
+
|
|
21
|
+
docs/{App}-TrBlazeUI-Feedback.md ids TR-NNN (the UI library)
|
|
22
|
+
docs/{App}-TechieRag-Feedback.md ids TR-RAG-NNN (the RAG library)
|
|
23
|
+
docs/{App}-TechieFlow-Feedback.md ids TF-NNN (the framework itself)
|
|
24
|
+
|
|
25
|
+
A future library {LibName} gets docs/{App}-{LibName}-Feedback.md with its own
|
|
26
|
+
prefix. Create the file on the FIRST entry for that upstream.
|
|
27
|
+
|
|
28
|
+
REPORTING IS NEVER REFUSED. If something upstream is wrong, file it — whatever
|
|
29
|
+
the severity, whatever the day. What this schema constrains is the SHAPE, not
|
|
30
|
+
the right to report:
|
|
31
|
+
|
|
32
|
+
1. Every entry says whether it BLOCKS the work, in one word. That is the field
|
|
33
|
+
the owner reads first, and it decides whether the run stops.
|
|
34
|
+
2. A non-blocking entry is filed and the work CONTINUES. Never stop, never ask,
|
|
35
|
+
never write a page of analysis about it mid-run. One entry, then carry on.
|
|
36
|
+
3. 250 words for the REPORT, hard: the eight fields, and nothing else. An entry is
|
|
37
|
+
a bug report, not an essay. Evidence goes in a code block, not in prose.
|
|
38
|
+
Working-out that is genuinely worth keeping goes under a `#### Detail` heading
|
|
39
|
+
inside the entry, and is not counted — so a thorough analysis costs nothing and
|
|
40
|
+
an unreadable entry is still refused.
|
|
41
|
+
4. Plain English. No coined terms, no framework shorthand, no word the reader
|
|
42
|
+
would have to look up. If you find yourself writing a glossary, the words
|
|
43
|
+
are wrong — change the words. `rule: no-glossary` refuses the section.
|
|
44
|
+
5. A decision for the owner does NOT go in this file. It goes in a Decision
|
|
45
|
+
Request (`app-decision-request-tmpl.md`), which is written for the owner and
|
|
46
|
+
carries the prompt to paste back.
|
|
47
|
+
|
|
48
|
+
"Replies from {Upstream}" holds the upstream team's answers, newest block first.
|
|
49
|
+
Ids are append-only and never renumbered. A fixed entry keeps its body and gains
|
|
50
|
+
a resolution line; the record of what was wrong is the point. -->
|
|
51
|
+
|
|
52
|
+
# {Upstream} feedback — found while building {App}
|
|
53
|
+
|
|
54
|
+
| | |
|
|
55
|
+
|---|---|
|
|
56
|
+
| App | {App} |
|
|
57
|
+
| Upstream | {Upstream} |
|
|
58
|
+
| Updated | {YYYY-MM-DD} |
|
|
59
|
+
|
|
60
|
+
## Summary
|
|
61
|
+
|
|
62
|
+
{N} entries: {n} blocking now, {n} filed and not blocking, {n} fixed upstream.
|
|
63
|
+
|
|
64
|
+
{One sentence naming what is blocked right now, or the sentence "Nothing is blocked."}
|
|
65
|
+
|
|
66
|
+
## Entries
|
|
67
|
+
|
|
68
|
+
### {TF-001} — {one line saying what is wrong}
|
|
69
|
+
|
|
70
|
+
- **Severity:** blocker | major | minor
|
|
71
|
+
- **Blocks:** yes — {the row or command that cannot proceed} | no — {what was done instead, and the work carried on}
|
|
72
|
+
- **Repro:** {the shortest command or snippet that shows it}
|
|
73
|
+
- **Expected:** {what should have happened}
|
|
74
|
+
- **Actual:** {what happened}
|
|
75
|
+
- **Encountered in:** {REQ-UI-013, or the command that was running}
|
|
76
|
+
- **Workaround:** {what was done in this project, or "none"}
|
|
77
|
+
- **Suggested fix:** {one concrete change for the upstream team}
|
|
78
|
+
|
|
79
|
+
#### Detail
|
|
80
|
+
|
|
81
|
+
{Optional, and not counted against the 250 words: the root cause, the reasoning, the
|
|
82
|
+
longer version of the fix. Everything above must stand on its own without it.}
|
|
83
|
+
|
|
84
|
+
## Replies from {Upstream}
|
|
85
|
+
|
|
86
|
+
<!-- The upstream team's answers, newest block first. Left in full: this is the record. -->
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
<!-- tf-schema
|
|
2
|
+
doc: phases
|
|
3
|
+
file: docs/{App}-Phases.md
|
|
4
|
+
header: App, Kind, Size, Date
|
|
5
|
+
section: Phases | required
|
|
6
|
+
budget: S 300 600 | M 300 600 | L 300 600
|
|
7
|
+
rule: phases-table
|
|
8
|
+
-->
|
|
9
|
+
<!-- Authoring notes (agent only; never visible text).
|
|
10
|
+
Large projects only. One row per phase; each phase fits Medium on its own (at most 20 screens,
|
|
11
|
+
100 requirements). Phase 1 keeps the plain file names (docs/{App}-BRD.md, -Checklist, -UIDesign,
|
|
12
|
+
-DevGuide); phase 2 onward are docs/{App}-P2-BRD.md and so on. BRD-N and REQ- ids run on across
|
|
13
|
+
phases and are never reused, so the ranges never overlap. An item added to an earlier phase after a
|
|
14
|
+
later phase exists takes the next free id and the row gets a second range: "BRD-1 to BRD-73, BRD-111 to BRD-118". Every screen sits in exactly one phase;
|
|
15
|
+
the screens of a phase are exactly the "### Screen:" entries of that phase's UIDesign.
|
|
16
|
+
Status is planned, building or done. The phase being worked is appPhase in core-config.yaml
|
|
17
|
+
(bash .tfcore/utils/tf-day1-files.sh {App} --phase N); handoff moves it on.
|
|
18
|
+
tf-doc-check.sh --app {App} refuses a screen in two phases, an id in two phases, a BRD id outside
|
|
19
|
+
its phase's range, and a phase row without its BRD file. -->
|
|
20
|
+
|
|
21
|
+
# {App} — Phases
|
|
22
|
+
|
|
23
|
+
| | |
|
|
24
|
+
|---|---|
|
|
25
|
+
| App | {App} |
|
|
26
|
+
| Kind | app |
|
|
27
|
+
| Size | Large |
|
|
28
|
+
| Date | {YYYY-MM-DD} |
|
|
29
|
+
|
|
30
|
+
## Phases
|
|
31
|
+
|
|
32
|
+
| Phase | Name | Screens | BRD range | Status |
|
|
33
|
+
|---|---|---|---|---|
|
|
34
|
+
| 1 | {Name} | {Screen, Screen, Screen} | BRD-1 to BRD-{N} | planned |
|
|
35
|
+
| 2 | {Name} | {Screen, Screen} | BRD-{N+1} to BRD-{M} | planned |
|