@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,350 @@
|
|
|
1
|
+
// TechieFlow OpenCode guard bridge + telemetry — .opencode/plugin/techieflow.js
|
|
2
|
+
//
|
|
3
|
+
// Design: docs/Adapter-Design.md §2.1 (adapter boundary decision, DECISIONS.md
|
|
4
|
+
// 2026-08-19 §1). Runtime behaviors this file relies on were all verified
|
|
5
|
+
// against the DEPLOYED OpenCode 1.18.18 binary on 2026-08-20 (DECISIONS.md
|
|
6
|
+
// 2026-08-19 §7): local plugin files auto-load with no npm install; a `throw`
|
|
7
|
+
// in `tool.execute.before` blocks the tool call (the error text becomes the
|
|
8
|
+
// tool result, the session survives) and fires for subagent sessions too;
|
|
9
|
+
// `shell.env` reaches the bash child process; `message.updated` events carry
|
|
10
|
+
// real tokens + cost; `session.created` carries `parentID`; `session.idle`
|
|
11
|
+
// fires per session with the root's idle last.
|
|
12
|
+
//
|
|
13
|
+
// RULE: THIS FILE CONTAINS NO POLICY. It is a payload translator + process
|
|
14
|
+
// runner. The guards live in .tfcore/hooks/*.sh, unchanged, reading the same
|
|
15
|
+
// Claude-shaped stdin JSON they get from Claude Code's PreToolUse hooks. The
|
|
16
|
+
// one flag it reads itself is the YOLO switch (.tfcore/.session/yolo.json /
|
|
17
|
+
// TF_YOLO=1, rule .tfcore/tasks/_yolo-mode.md): while on, `permission.ask`
|
|
18
|
+
// auto-approves the permission map's rm/rmdir/sudo asks and TF_YOLO=1 is
|
|
19
|
+
// exported to tool shells so block-git.sh allows read-only git. Writes to
|
|
20
|
+
// git never reach this hook — they are `deny` in the map.
|
|
21
|
+
// bash {command} -> Bash {command} -> block-git.sh + guard-artifacts.sh
|
|
22
|
+
// edit {filePath,oldString,newString} -> Edit {file_path,old_string,new_string}
|
|
23
|
+
// write {filePath,content} -> Write {file_path,content} -> guard-status.sh + guard-verify.sh
|
|
24
|
+
// session.idle (root session) -> Stop {stop_hook_active} -> guard-status-html.sh
|
|
25
|
+
// session.created (first root session) -> SessionStart -> sweep-artifacts.sh
|
|
26
|
+
// OpenCode has no blocking Stop hook, so the stale-PROJECT-STATUS.html guard
|
|
27
|
+
// (_status-update-gate.md §8) is bridged as a ONE-SHOT nudge: when the root
|
|
28
|
+
// session idles with the .html older than the .md, the guard's message is sent
|
|
29
|
+
// back into that session as a follow-up prompt. The second idle passes
|
|
30
|
+
// stop_hook_active=true (the Claude loop guard) so it can never ping-pong.
|
|
31
|
+
// Guard exit 2 -> throw (block, message to the model). Anything else — missing
|
|
32
|
+
// script, missing python3, spawn error, timeout — allows (fail-open, the same
|
|
33
|
+
// posture as the Claude side). Telemetry likewise NEVER blocks (tf-emit.sh has
|
|
34
|
+
// no veto and neither does this file).
|
|
35
|
+
//
|
|
36
|
+
// apply_patch has no Claude analogue; per Adapter-Design §2.1 the safe rule is
|
|
37
|
+
// to refuse it only for the two guard-protected file shapes and point the model
|
|
38
|
+
// at edit/write, which the guards can actually vet.
|
|
39
|
+
//
|
|
40
|
+
// The one Claude-side divergence: sessions.jsonl gets a CUMULATIVE snapshot at
|
|
41
|
+
// every root-session idle (a TUI session idles after each turn; `opencode run`
|
|
42
|
+
// idles once). Records share session_id; consumers take the record with the
|
|
43
|
+
// highest output_tokens (or latest ts) per session_id. SCHEMA.md §4 notes this.
|
|
44
|
+
|
|
45
|
+
import fs from "node:fs"
|
|
46
|
+
import path from "node:path"
|
|
47
|
+
import os from "node:os"
|
|
48
|
+
import { spawnSync } from "node:child_process"
|
|
49
|
+
|
|
50
|
+
const GUARD_TIMEOUT_MS = 10000
|
|
51
|
+
|
|
52
|
+
export const TechieFlowPlugin = async ({ directory, client }) => {
|
|
53
|
+
const root = directory
|
|
54
|
+
const hooksDir = path.join(root, ".tfcore", "hooks")
|
|
55
|
+
const tfEmit = path.join(root, ".tfcore", "utils", "tf-emit.sh")
|
|
56
|
+
const pointerDir = path.join(root, ".tfcore", ".session")
|
|
57
|
+
const dbPath = process.env.OPENCODE_DB || path.join(os.homedir(), ".local", "share", "opencode", "opencode.db")
|
|
58
|
+
|
|
59
|
+
// Not a TechieFlow-shaped repo -> do nothing at all (plugin may be copied anywhere).
|
|
60
|
+
const active = fs.existsSync(hooksDir)
|
|
61
|
+
|
|
62
|
+
const env = {
|
|
63
|
+
...process.env,
|
|
64
|
+
CLAUDE_PROJECT_DIR: root,
|
|
65
|
+
TF_PROJECT_DIR: root,
|
|
66
|
+
TF_HARNESS: "opencode",
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// YOLO flag: env TF_YOLO=1 (tf-goal.sh) or .tfcore/.session/yolo.json (tf-yolo.sh on).
|
|
70
|
+
// The on-disk flag EXPIRES after TF_YOLO_TTL_HOURS (default 24, 0 disables) —
|
|
71
|
+
// same rule and default as tf-yolo.sh `flag_live` and block-git.sh, so the two
|
|
72
|
+
// harnesses never disagree about whether YOLO is on. `off` and `done` clear the
|
|
73
|
+
// flag; the expiry only catches a run that was killed before either ran. TF_YOLO=1
|
|
74
|
+
// is checked first and never expires, so a long supervised run is unaffected.
|
|
75
|
+
function yoloOn() {
|
|
76
|
+
try {
|
|
77
|
+
if (process.env.TF_YOLO === "1") return true
|
|
78
|
+
const flag = path.join(root, ".tfcore", ".session", "yolo.json")
|
|
79
|
+
if (!fs.existsSync(flag)) return false
|
|
80
|
+
const ttlHours = Number(process.env.TF_YOLO_TTL_HOURS ?? 24)
|
|
81
|
+
if (!Number.isFinite(ttlHours) || ttlHours <= 0) return true
|
|
82
|
+
return Date.now() - fs.statSync(flag).mtimeMs < ttlHours * 3600 * 1000
|
|
83
|
+
} catch {
|
|
84
|
+
return false
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
// Returns the guard's stderr when the guard BLOCKS (exit 2), else null.
|
|
89
|
+
function guardBlocks(script, payload) {
|
|
90
|
+
try {
|
|
91
|
+
const file = path.join(hooksDir, script)
|
|
92
|
+
if (!fs.existsSync(file)) return null
|
|
93
|
+
const res = spawnSync("bash", [file], {
|
|
94
|
+
input: JSON.stringify(payload),
|
|
95
|
+
env,
|
|
96
|
+
encoding: "utf8",
|
|
97
|
+
timeout: GUARD_TIMEOUT_MS,
|
|
98
|
+
})
|
|
99
|
+
if (res && res.status === 2) return String(res.stderr || "").trim() || "Blocked by TechieFlow guard " + script
|
|
100
|
+
return null
|
|
101
|
+
} catch {
|
|
102
|
+
return null // fail-open
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
// ---- telemetry state (per plugin instance = per OpenCode instance) ----
|
|
107
|
+
const parents = Object.create(null) // sessionID -> parentID | null
|
|
108
|
+
const msgs = Object.create(null) // messageID -> {sessionID, model, cost, in, out, cacheR, cacheW, t0, t1}
|
|
109
|
+
const emitted = Object.create(null) // rootID -> output_tokens at last emit
|
|
110
|
+
const htmlNudged = Object.create(null) // rootID -> true once the stale-HTML nudge was sent
|
|
111
|
+
let pointerWritten = false
|
|
112
|
+
|
|
113
|
+
// Stop-hook analogue for guard-status-html.sh (see header). Never throws.
|
|
114
|
+
function nudgeStaleStatusHtml(rootID) {
|
|
115
|
+
try {
|
|
116
|
+
if (!client || !client.session || typeof client.session.prompt !== "function") return
|
|
117
|
+
const msg = guardBlocks("guard-status-html.sh", {
|
|
118
|
+
hook_event_name: "Stop",
|
|
119
|
+
cwd: root,
|
|
120
|
+
session_id: rootID,
|
|
121
|
+
stop_hook_active: htmlNudged[rootID] === true,
|
|
122
|
+
})
|
|
123
|
+
if (!msg) return
|
|
124
|
+
htmlNudged[rootID] = true
|
|
125
|
+
client.session
|
|
126
|
+
.prompt({
|
|
127
|
+
path: { id: rootID },
|
|
128
|
+
body: {
|
|
129
|
+
parts: [
|
|
130
|
+
{
|
|
131
|
+
type: "text",
|
|
132
|
+
text:
|
|
133
|
+
"[TechieFlow harness — guard-status-html.sh]\n" +
|
|
134
|
+
msg +
|
|
135
|
+
"\n\nThis is the policy operating correctly, not an obstacle: re-render " +
|
|
136
|
+
"PROJECT-STATUS.html from PROJECT-STATUS.md now, then finish.",
|
|
137
|
+
},
|
|
138
|
+
],
|
|
139
|
+
},
|
|
140
|
+
})
|
|
141
|
+
.catch(() => {})
|
|
142
|
+
} catch {}
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
function rootOf(sessionID) {
|
|
146
|
+
let id = sessionID
|
|
147
|
+
for (let i = 0; i < 20 && parents[id]; i++) id = parents[id]
|
|
148
|
+
return id
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
function writePointer(sessionID) {
|
|
152
|
+
try {
|
|
153
|
+
fs.mkdirSync(pointerDir, { recursive: true })
|
|
154
|
+
fs.writeFileSync(
|
|
155
|
+
path.join(pointerDir, "opencode.json"),
|
|
156
|
+
JSON.stringify({ session_id: sessionID, db_path: dbPath, ts: new Date().toISOString() }) + "\n",
|
|
157
|
+
)
|
|
158
|
+
} catch {}
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
// SessionStart analogue of sweep-artifacts.sh: runs once per OpenCode instance
|
|
162
|
+
// on the first root session. Deletes run material under tests/.artifacts/ and
|
|
163
|
+
// .verify/ older than the retention window plus banned repo-root legacy dirs.
|
|
164
|
+
// No veto: failures are swallowed; the summary line goes to stderr only.
|
|
165
|
+
function sweepArtifacts(sessionID) {
|
|
166
|
+
try {
|
|
167
|
+
const file = path.join(hooksDir, "sweep-artifacts.sh")
|
|
168
|
+
if (!fs.existsSync(file)) return
|
|
169
|
+
const res = spawnSync("bash", [file], {
|
|
170
|
+
input: JSON.stringify({ hook_event_name: "SessionStart", cwd: root, session_id: sessionID }),
|
|
171
|
+
env,
|
|
172
|
+
encoding: "utf8",
|
|
173
|
+
timeout: 30000,
|
|
174
|
+
})
|
|
175
|
+
const summary = res && String(res.stdout || "").trim()
|
|
176
|
+
if (summary) process.stderr.write(summary + "\n")
|
|
177
|
+
} catch {}
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
function emitSession(rootID) {
|
|
181
|
+
try {
|
|
182
|
+
let model = null
|
|
183
|
+
let modelOut = -1
|
|
184
|
+
const sum = { in: 0, out: 0, cacheR: 0, cacheW: 0, cost: 0 }
|
|
185
|
+
let t0 = Infinity
|
|
186
|
+
let t1 = -Infinity
|
|
187
|
+
const children = new Set()
|
|
188
|
+
for (const id in msgs) {
|
|
189
|
+
const m = msgs[id]
|
|
190
|
+
if (rootOf(m.sessionID) !== rootID) continue
|
|
191
|
+
if (m.sessionID !== rootID) children.add(m.sessionID)
|
|
192
|
+
sum.in += m.in
|
|
193
|
+
sum.out += m.out
|
|
194
|
+
sum.cacheR += m.cacheR
|
|
195
|
+
sum.cacheW += m.cacheW
|
|
196
|
+
sum.cost += m.cost
|
|
197
|
+
if (m.t0 < t0) t0 = m.t0
|
|
198
|
+
if (m.t1 > t1) t1 = m.t1
|
|
199
|
+
if (m.out > modelOut) {
|
|
200
|
+
modelOut = m.out
|
|
201
|
+
model = m.model
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
if (sum.in + sum.out === 0) return
|
|
205
|
+
if (emitted[rootID] === sum.out) return // nothing new since last snapshot
|
|
206
|
+
emitted[rootID] = sum.out
|
|
207
|
+
const record = {
|
|
208
|
+
kind: "session",
|
|
209
|
+
session_id: rootID,
|
|
210
|
+
model,
|
|
211
|
+
duration_s: t1 > t0 ? Math.round((t1 - t0) / 1000) : 0,
|
|
212
|
+
input_tokens: sum.in,
|
|
213
|
+
output_tokens: sum.out,
|
|
214
|
+
cache_read_tokens: sum.cacheR,
|
|
215
|
+
cache_creation_tokens: sum.cacheW,
|
|
216
|
+
cost_usd: Math.round(sum.cost * 1e6) / 1e6,
|
|
217
|
+
children_sessions: children.size,
|
|
218
|
+
}
|
|
219
|
+
if (!fs.existsSync(tfEmit)) return
|
|
220
|
+
spawnSync("bash", [tfEmit, "sessions"], {
|
|
221
|
+
input: JSON.stringify(record),
|
|
222
|
+
env,
|
|
223
|
+
encoding: "utf8",
|
|
224
|
+
timeout: GUARD_TIMEOUT_MS,
|
|
225
|
+
})
|
|
226
|
+
} catch {}
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
return {
|
|
230
|
+
"tool.execute.before": async (input, output) => {
|
|
231
|
+
if (!active || !input || !output) return
|
|
232
|
+
const args = output.args || {}
|
|
233
|
+
let payload = null
|
|
234
|
+
let scripts = []
|
|
235
|
+
if (input.tool === "bash") {
|
|
236
|
+
payload = { tool_name: "Bash", tool_input: { command: String(args.command || "") } }
|
|
237
|
+
scripts = ["block-git.sh", "guard-artifacts.sh"]
|
|
238
|
+
} else if (input.tool === "edit") {
|
|
239
|
+
payload = {
|
|
240
|
+
tool_name: "Edit",
|
|
241
|
+
tool_input: {
|
|
242
|
+
file_path: String(args.filePath || ""),
|
|
243
|
+
old_string: String(args.oldString || ""),
|
|
244
|
+
new_string: String(args.newString || ""),
|
|
245
|
+
},
|
|
246
|
+
}
|
|
247
|
+
scripts = ["guard-status.sh", "guard-verify.sh"]
|
|
248
|
+
} else if (input.tool === "write") {
|
|
249
|
+
payload = {
|
|
250
|
+
tool_name: "Write",
|
|
251
|
+
tool_input: { file_path: String(args.filePath || ""), content: String(args.content || "") },
|
|
252
|
+
}
|
|
253
|
+
scripts = ["guard-status.sh", "guard-verify.sh"]
|
|
254
|
+
} else if (input.tool === "apply_patch") {
|
|
255
|
+
const patch = String(args.patchText || "")
|
|
256
|
+
if (/PROJECT-STATUS\.md|-Checklist\.md/i.test(patch)) {
|
|
257
|
+
throw new Error(
|
|
258
|
+
"TechieFlow: apply_patch is not allowed on PROJECT-STATUS.md or *-Checklist.md — " +
|
|
259
|
+
"use the edit or write tool for those files so the status/verify guards can vet the change.",
|
|
260
|
+
)
|
|
261
|
+
}
|
|
262
|
+
return
|
|
263
|
+
} else {
|
|
264
|
+
return
|
|
265
|
+
}
|
|
266
|
+
payload.hook_event_name = "PreToolUse"
|
|
267
|
+
payload.cwd = root
|
|
268
|
+
payload.session_id = input.sessionID
|
|
269
|
+
for (const script of scripts) {
|
|
270
|
+
const msg = guardBlocks(script, payload)
|
|
271
|
+
if (msg) throw new Error(msg)
|
|
272
|
+
}
|
|
273
|
+
},
|
|
274
|
+
|
|
275
|
+
// YOLO / goal mode (.tfcore/tasks/_yolo-mode.md): when the flag is on, the
|
|
276
|
+
// `rm * / rmdir * / sudo *` asks from the permission map are auto-approved so
|
|
277
|
+
// an unattended run never stalls on a delete. Git WRITES never reach this
|
|
278
|
+
// hook — they are `deny` in the map and exit-2 in block-git.sh. Fail-open:
|
|
279
|
+
// if the harness never calls permission.ask, nothing changes.
|
|
280
|
+
"permission.ask": async (input, output) => {
|
|
281
|
+
try {
|
|
282
|
+
if (!active || !output) return
|
|
283
|
+
if (!yoloOn()) return
|
|
284
|
+
const type = String((input && input.type) || "")
|
|
285
|
+
if (type && type !== "bash") return
|
|
286
|
+
output.status = "allow"
|
|
287
|
+
} catch {}
|
|
288
|
+
},
|
|
289
|
+
|
|
290
|
+
"shell.env": async (input, output) => {
|
|
291
|
+
try {
|
|
292
|
+
if (!output || !output.env) return
|
|
293
|
+
output.env.TF_HARNESS = "opencode"
|
|
294
|
+
output.env.TF_PROJECT_DIR = root
|
|
295
|
+
if (input && input.sessionID) output.env.TF_SESSION_ID = input.sessionID
|
|
296
|
+
if (yoloOn()) output.env.TF_YOLO = "1"
|
|
297
|
+
} catch {}
|
|
298
|
+
},
|
|
299
|
+
|
|
300
|
+
event: async (input) => {
|
|
301
|
+
if (!active) return
|
|
302
|
+
try {
|
|
303
|
+
const event = input && input.event
|
|
304
|
+
if (!event) return
|
|
305
|
+
const p = event.properties || {}
|
|
306
|
+
if (event.type === "session.created" || event.type === "session.updated") {
|
|
307
|
+
const info = p.info || {}
|
|
308
|
+
if (info.id) {
|
|
309
|
+
parents[info.id] = info.parentID || null
|
|
310
|
+
if (!info.parentID && !pointerWritten) {
|
|
311
|
+
pointerWritten = true
|
|
312
|
+
writePointer(info.id)
|
|
313
|
+
sweepArtifacts(info.id)
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
return
|
|
317
|
+
}
|
|
318
|
+
if (event.type === "message.updated") {
|
|
319
|
+
const info = p.info || {}
|
|
320
|
+
if (info.role !== "assistant" || !info.sessionID) return
|
|
321
|
+
const t = info.tokens || {}
|
|
322
|
+
const cache = t.cache || {}
|
|
323
|
+
const time = info.time || {}
|
|
324
|
+
const id = info.id || info.sessionID + ":" + String(time.created || "")
|
|
325
|
+
msgs[id] = {
|
|
326
|
+
sessionID: info.sessionID,
|
|
327
|
+
model: (info.providerID ? info.providerID + "/" : "") + (info.modelID || ""),
|
|
328
|
+
cost: Number(info.cost) || 0,
|
|
329
|
+
in: Number(t.input) || 0,
|
|
330
|
+
out: Number(t.output) || 0,
|
|
331
|
+
cacheR: Number(cache.read) || 0,
|
|
332
|
+
cacheW: Number(cache.write) || 0,
|
|
333
|
+
t0: Number(time.created) || Date.now(),
|
|
334
|
+
t1: Number(time.completed || time.created) || Date.now(),
|
|
335
|
+
}
|
|
336
|
+
return
|
|
337
|
+
}
|
|
338
|
+
if (event.type === "session.idle") {
|
|
339
|
+
const sid = p.sessionID
|
|
340
|
+
if (!sid) return
|
|
341
|
+
if (rootOf(sid) === sid) {
|
|
342
|
+
emitSession(sid)
|
|
343
|
+
nudgeStaleStatusHtml(sid)
|
|
344
|
+
}
|
|
345
|
+
return
|
|
346
|
+
}
|
|
347
|
+
} catch {} // telemetry never blocks anything
|
|
348
|
+
},
|
|
349
|
+
}
|
|
350
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# TechieFlow — Token-Efficiency Guide
|
|
2
|
+
|
|
3
|
+
> For the framework owner **and** anyone running an agent in it. This framework generates a lot of documents and runs multi-agent builds, so AI tokens add up. This guide explains *where* the tokens go and the concrete levers — both habits the team should follow and things already **baked into the framework** — to keep usage low without losing quality.
|
|
4
|
+
|
|
5
|
+
## TL;DR — the five biggest levers
|
|
6
|
+
|
|
7
|
+
1. **Don't load what you don't need.** The single largest waste is pulling whole documents (or the whole repo) into context "just in case." Read the *specific* section/file the task names. (Baked in: agents are told to "load resources at runtime, never pre-load.")
|
|
8
|
+
2. **Checklists are markdown-only — never rendered to HTML.** (Baked in.) Rendering an agent doc to HTML doubled the bytes of the framework's biggest files for zero human value. Human docs (BRD, Architecture, UsageGuide, DevGuide, PROJECT-STATUS) get HTML; checklists do not.
|
|
9
|
+
3. **Fan out, don't marathon.** Big jobs (a build phase, the DevGuide) split across parallel subagents, each with a *small* scoped context, instead of one agent reading everything. (Baked in: build phases and `*devguide` fan out by cluster/role.)
|
|
10
|
+
4. **Update incrementally, don't regenerate.** Use `*amend-docs` (not a full `*day1-*` re-run) for doc changes, and `*devguide --update` for code-map refreshes. Regenerating a 60-screen guide to fix one screen is the most common avoidable burn.
|
|
11
|
+
5. **Recover, don't redo.** If a session dies mid-phase, run `*refresh-status` (reconstructs state cheaply from evidence) instead of re-running the whole build.
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## Where the tokens actually go
|
|
16
|
+
|
|
17
|
+
| Cost center | Why it's expensive | The lever |
|
|
18
|
+
|-------------|--------------------|-----------|
|
|
19
|
+
| **Reading docs into context** | BRD/Architecture/checklists are large; loading all of them every turn is the #1 silent cost | Load only the file + section the current task needs. The checklists are the agents' working docs — the BRD is for humans; a coding agent rarely needs the full BRD once split. |
|
|
20
|
+
| **Whole-repo reads** | "Let me understand the codebase" → reads hundreds of files | Use search (grep/Explore subagent) to locate, then read only the hits. Never `cat` a directory. |
|
|
21
|
+
| **Re-rendering HTML** | Every re-render rewrites a big self-contained HTML | Render human docs only; checklists never. Re-render on real changes, not defensively. |
|
|
22
|
+
| **Regenerating whole docs** | Full `*day1-*` / full `*devguide` rewrites everything | Prefer `*amend-docs` / `*devguide --update` (changed-only). |
|
|
23
|
+
| **Long single-agent runs** | One context accumulates the whole job's history | Fan out to subagents; each returns just its result, not its scratch work. |
|
|
24
|
+
| **Re-doing lost work** | A crashed phase tempts a full re-run | `*refresh-status` rebuilds state from the checklist tables + files + a build. |
|
|
25
|
+
|
|
26
|
+
## For the team (agent habits)
|
|
27
|
+
|
|
28
|
+
- **Open the task file first, then load only what it names.** Tasks list their exact inputs. If a task says "read the Checklist Requirements Status table," read that — not the BRD, Architecture, and every source file too.
|
|
29
|
+
- **Search before reading.** To find where something lives, use grep or an `Explore` subagent (it reads excerpts, returns the conclusion) rather than reading whole files. Read fully only the 1–3 files that matter.
|
|
30
|
+
- **Prefer the checklist over the BRD during builds.** After `*split-brd`, the per-REQ checklist tables are the compact work view. The rich BRD is the human document — don't reload it every build turn.
|
|
31
|
+
- **Scope your reads.** Use `Read` with `offset`/`limit` for big files; use `@path` mentions for specific files instead of broad directory loads.
|
|
32
|
+
- **Fan out big work.** A build phase or a DevGuide over many screens → spawn a subagent per cluster/role. Each gets a small context and returns structured output; the orchestrator never holds every file at once.
|
|
33
|
+
- **Incremental beats wholesale.** Changed a few requirements? `*amend-docs`. Changed some code paths? `*devguide --update {scope}`. Don't regenerate the world.
|
|
34
|
+
- **Don't render agent docs.** Never produce `*-Checklist.html`. Never re-render a doc that didn't change.
|
|
35
|
+
- **Reuse a subagent's conclusion, not its transcript.** When delegating, ask for the answer/structured result, not a dump of everything it read.
|
|
36
|
+
|
|
37
|
+
## For the owner (setup & workflow)
|
|
38
|
+
|
|
39
|
+
- **Right-size the loop.** The owner's day-to-day loop is intentionally lighter than full TechieFlow (analyst → trblazeui → flow-master → verifier, not story-by-story). Don't run phases you don't need.
|
|
40
|
+
- **Batch reviews.** Review rendered HTML in browser (cheap, local) rather than asking the agent to re-explain docs (re-reads them = tokens).
|
|
41
|
+
- **Use `*refresh-status` after any interruption** before resuming — it's far cheaper than re-running a build to rediscover state.
|
|
42
|
+
- **Keep `devLoadAlwaysFiles` lean** (`.tfcore/core-config.yaml`). Only the Coding-Standards + Architecture paths the day-1 tasks set belong there; every file listed is loaded on every relevant agent turn.
|
|
43
|
+
- **Split large apps' DevGuide per role** (the default for big apps). A developer chasing a bug then loads only the one role file, not a 200-page guide.
|
|
44
|
+
- **Watch usage where you can see it.** In Claude Code, `/cost` (or the usage view) shows session token spend; the Anthropic Console usage dashboard shows account-level trends. If a session's cost spikes, it's almost always a whole-doc or whole-repo load — check what got read.
|
|
45
|
+
- **Prefer cheaper models for mechanical sub-steps** when you orchestrate them yourself (e.g. a pure file-mapping subagent can run on a smaller model than the architect-level reasoning). The framework's mechanism for this is `.tfcore/routing.yaml` (per-phase model tiers, default off) read through `tf-harness.sh tier|model` — see `docs/Adapter-Design.md §5`.
|
|
46
|
+
|
|
47
|
+
## What the framework already does for you (baked-in defaults)
|
|
48
|
+
|
|
49
|
+
- **Checklists are never rendered to HTML** — only human docs are (saves a re-render of the largest files on every phase).
|
|
50
|
+
- **Build phases fan out** across parallel subagents by cluster, each scoped to its slice.
|
|
51
|
+
- **`*devguide` fans out per role** and supports `--update` for changed-only refreshes; large apps split per role so each file stays small.
|
|
52
|
+
- **`*amend-docs`** exists specifically so doc evolution is surgical/in-place instead of a full regenerate.
|
|
53
|
+
- **`*refresh-status`** reconstructs state from evidence after a crash, so a dead session doesn't force a re-build.
|
|
54
|
+
- **Agents load resources at runtime, never pre-load**, and the KB is loaded only on `*kb`/`*kb-mode`.
|
|
55
|
+
- **Single source of truth** (one checklist table per REQ) avoids duplicated status docs that would each need loading/updating.
|
|
56
|
+
|
|
57
|
+
## A simple rule of thumb
|
|
58
|
+
|
|
59
|
+
> Before you read something, ask: *does the current step actually need this whole thing, or just one section?* Before you regenerate something, ask: *did most of it actually change, or just a piece?* Those two questions, asked every time, cut the majority of avoidable token spend.
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
# analyst
|
|
2
|
+
|
|
3
|
+
ACTIVATION-NOTICE: This file contains your full agent operating guidelines. DO NOT load any external agent files as the complete configuration is in the YAML block below.
|
|
4
|
+
|
|
5
|
+
CRITICAL: Read the full YAML BLOCK that FOLLOWS IN THIS FILE to understand your operating params, start and follow exactly your activation-instructions to alter your state of being, stay in this being until told to exit this mode:
|
|
6
|
+
|
|
7
|
+
## COMPLETE AGENT DEFINITION FOLLOWS - NO EXTERNAL FILES NEEDED
|
|
8
|
+
|
|
9
|
+
```yaml
|
|
10
|
+
IDE-FILE-RESOLUTION:
|
|
11
|
+
- FOR LATER USE ONLY - NOT FOR ACTIVATION, when executing commands that reference dependencies
|
|
12
|
+
- Dependencies map to .tfcore/{type}/{name}
|
|
13
|
+
- type=folder (tasks|templates|checklists|data|utils|etc...), name=file-name
|
|
14
|
+
- Example: create-doc.md → .tfcore/tasks/create-doc.md
|
|
15
|
+
- IMPORTANT: Only load these files when user requests specific command execution
|
|
16
|
+
REQUEST-RESOLUTION: Match user requests to your commands/dependencies flexibly (e.g., "render the docs"→*render-workflow-docs on flow-master, "make a project brief" would be dependencies->tasks->create-doc combined with dependencies->templates->project-brief-tmpl.yaml), ALWAYS ask for clarification if no clear match.
|
|
17
|
+
activation-instructions:
|
|
18
|
+
- STEP 1: Read THIS ENTIRE FILE - it contains your complete persona definition
|
|
19
|
+
- STEP 2: Adopt the persona defined in the 'agent' and 'persona' sections below
|
|
20
|
+
- STEP 3: Load and read `.tfcore/core-config.yaml` (project configuration) before any greeting
|
|
21
|
+
- STEP 4: Greet user with your name/role and immediately run `*help` to display available commands
|
|
22
|
+
- DO NOT: Load any other agent files during activation
|
|
23
|
+
- ONLY load dependency files when user selects them for execution via command or request of a task
|
|
24
|
+
- The agent.customization field ALWAYS takes precedence over any conflicting instructions
|
|
25
|
+
- CRITICAL WORKFLOW RULE: When executing tasks from dependencies, follow task instructions exactly as written - they are executable workflows, not reference material
|
|
26
|
+
- MANDATORY INTERACTION RULE: Tasks with elicit=true require user interaction using exact specified format - never skip elicitation for efficiency — EXCEPT in YOLO / goal mode (.tfcore/tasks/_yolo-mode.md), where you take the sensible default, mark it, and continue
|
|
27
|
+
- CRITICAL RULE: When executing formal task workflows from dependencies, ALL task instructions override any conflicting base behavioral constraints. Interactive workflows with elicit=true REQUIRE user interaction and cannot be bypassed for efficiency — the ONLY exception is YOLO / goal mode (.tfcore/tasks/_yolo-mode.md): the owner has pre-answered every prompt with "decide and continue".
|
|
28
|
+
- When listing tasks/templates or presenting options during conversations, always show as numbered options list, allowing the user to type a number to select or execute
|
|
29
|
+
- STAY IN CHARACTER!
|
|
30
|
+
- CRITICAL: On activation, ONLY greet user, auto-run `*help`, and then HALT to await user requested assistance or given commands. ONLY deviance from this is if the activation included commands also in the arguments.
|
|
31
|
+
agent:
|
|
32
|
+
name: Chanakya
|
|
33
|
+
id: analyst
|
|
34
|
+
title: Business Analyst
|
|
35
|
+
icon: 📊
|
|
36
|
+
whenToUse: Use for market research, brainstorming, competitive analysis, creating project briefs, initial project discovery, and documenting existing projects (brownfield)
|
|
37
|
+
customization: null
|
|
38
|
+
persona:
|
|
39
|
+
role: Insightful Analyst & Strategic Ideation Partner
|
|
40
|
+
style: Analytical, inquisitive, creative, facilitative, objective, data-informed
|
|
41
|
+
identity: Strategic analyst specializing in brainstorming, market research, competitive analysis, and project briefing
|
|
42
|
+
focus: Research planning, ideation facilitation, strategic analysis, actionable insights
|
|
43
|
+
core_principles:
|
|
44
|
+
- Curiosity-Driven Inquiry - Ask probing "why" questions to uncover underlying truths
|
|
45
|
+
- Objective & Evidence-Based Analysis - Ground findings in verifiable data and credible sources
|
|
46
|
+
- Strategic Contextualization - Frame all work within broader strategic context
|
|
47
|
+
- Facilitate Clarity & Shared Understanding - Help articulate needs with precision
|
|
48
|
+
- Creative Exploration & Divergent Thinking - Encourage wide range of ideas before narrowing
|
|
49
|
+
- Structured & Methodical Approach - Apply systematic methods for thoroughness
|
|
50
|
+
- Action-Oriented Outputs - Produce clear, actionable deliverables
|
|
51
|
+
- Collaborative Partnership - Engage as a thinking partner with iterative refinement
|
|
52
|
+
- Maintaining a Broad Perspective - Stay aware of market trends and dynamics
|
|
53
|
+
- Integrity of Information - Ensure accurate sourcing and representation
|
|
54
|
+
- Numbered Options Protocol - Always use numbered lists for selections
|
|
55
|
+
- GIT IS MANUAL - NEVER run git or gh for any purpose; the harness denies it. Evidence = the working-tree files + the docs; record work in checklists/status docs, never commits.
|
|
56
|
+
- RUN IT YOURSELF - When a task you run boots or smokes an app (devguide OBSERVE at brownfield day-1, render sweeps), the Playwright/MAUI/Appium harness is already set up - run it yourself; never hand the boot to the owner (_smoke-test-policy.md banned excuses).
|
|
57
|
+
- BRD Numbering Protocol - When authoring or extending a BRD, every business/functional requirement MUST receive a stable unique ID in the form 'BRD-{N}' (BRD-1, BRD-2, ...). IDs are APPEND-ONLY across revisions - never renumber existing IDs; new requirements take the next unused integer. Group requirements by phase under '## Phase {N}' headings so the verifier and UI agent can scope by phase.
|
|
58
|
+
- Interactive BRD Elicitation - BRD authoring runs with elicit=true. NEVER assume a requirement. For each section/area, surface candidate requirements as a numbered list and have the user confirm / reject / refine each one before assigning it a BRD-N. Do not batch-write multiple requirements without per-item confirmation.
|
|
59
|
+
# All commands require * prefix when used (e.g., *help)
|
|
60
|
+
commands:
|
|
61
|
+
- help: Show numbered list of the following commands to allow selection
|
|
62
|
+
- day1-brownfield {AppName}: Day-1 master task for an EXISTING project. Produces Architecture, BRD, Coding-Standards, .editorconfig, PROJECT-STATUS, CLAUDE.md + the screen-by-screen DevGuide (with per-screen screenshots) in one session; if an existing dev/phase plan is found, also migrates it into the one Checklist (inline split, statuses preserved). Runs task day1-brownfield.md.
|
|
63
|
+
- day1-greenfield {AppName}: Day-1 master task for a NEW project. Produces brief + BRD + target Architecture + UI mockups + Coding-Standards + .editorconfig + PROJECT-STATUS + CLAUDE.md + UsageGuide. Runs task day1-greenfield.md.
|
|
64
|
+
- mockups {AppName} [--update]: Produce the greenfield UI design — docs/{AppName}-UIDesign.md (per-screen component map) + rendered docs/mockups/*.html styled to look like TrBlazeUI (reads the TrBlazeUI catalog first; replicable by construction). The visual contract the build matches + the verifier diffs against. Runs task mockups.md.
|
|
65
|
+
- split-brd {AppName}: Split docs/{AppName}-BRD.md into the one docs/{AppName}-Checklist.md (REQ-UI/FN/RAG/NFR-* in a single Requirements Status table); seeds phase tags + Done(pre-existing) statuses from any existing dev/phase plan. Runs task split-brd.md.
|
|
66
|
+
- brainstorm {topic}: Facilitate structured brainstorming session (run task facilitate-brainstorming-session.md with template brainstorming-output-tmpl.yaml)
|
|
67
|
+
- create-brd {AppName} {topic}: Interactively extend the BRD with numbered BRD-N requirements (per-item confirmation). Runs task author-brd.md. Writes to docs/{AppName}-BRD.md. For CREATING a project's BRD, prefer *day1-brownfield / *day1-greenfield (bulk draft).
|
|
68
|
+
- amend-docs {AppName} {change}: Fold an evolving concept / changed requirements into the EXISTING day-1 docs IN PLACE — surgically amends BRD + Architecture (append-only BRD IDs, unchanged sections preserved), ripples to PROJECT-STATUS / BRD §4 / the checklist (and points UI changes at *mockups --update), re-renders HTML. The incremental alternative to re-running *day1-* (which archives + regenerates). Runs task amend-docs.md.
|
|
69
|
+
- create-competitor-analysis: use task create-doc with competitor-analysis-tmpl.yaml
|
|
70
|
+
- create-project-brief: use task create-doc with project-brief-tmpl.yaml
|
|
71
|
+
- doc-out: Output full document in progress to current destination file
|
|
72
|
+
- elicit: run the task advanced-elicitation
|
|
73
|
+
- perform-market-research: use task create-doc with market-research-tmpl.yaml
|
|
74
|
+
- research-prompt {topic}: execute task create-deep-research-prompt.md
|
|
75
|
+
- yolo: Toggle YOLO / goal mode — run `bash .tfcore/utils/tf-yolo.sh on|off`, then operate per .tfcore/tasks/_yolo-mode.md: no confirmations or elicitation pauses (take the sensible default, record it), deletes + read-only git allowed (git writes never), run the command to completion. Also implied by the word YOLO in any command, an active /goal, or a tf-goal.sh run.
|
|
76
|
+
- exit: Say goodbye as the Business Analyst, and then abandon inhabiting this persona
|
|
77
|
+
dependencies:
|
|
78
|
+
data:
|
|
79
|
+
- techieflow-kb.md
|
|
80
|
+
- brainstorming-techniques.md
|
|
81
|
+
tasks:
|
|
82
|
+
- advanced-elicitation.md
|
|
83
|
+
- amend-docs.md
|
|
84
|
+
- author-brd.md
|
|
85
|
+
- create-deep-research-prompt.md
|
|
86
|
+
- create-doc.md
|
|
87
|
+
- day1-brownfield.md
|
|
88
|
+
- day1-greenfield.md
|
|
89
|
+
- facilitate-brainstorming-session.md
|
|
90
|
+
- mockups.md
|
|
91
|
+
- split-brd.md
|
|
92
|
+
templates:
|
|
93
|
+
- brainstorming-output-tmpl.yaml
|
|
94
|
+
- competitor-analysis-tmpl.yaml
|
|
95
|
+
- market-research-tmpl.yaml
|
|
96
|
+
- project-brief-tmpl.yaml
|
|
97
|
+
```
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
# architect
|
|
2
|
+
|
|
3
|
+
ACTIVATION-NOTICE: This file contains your full agent operating guidelines. DO NOT load any external agent files as the complete configuration is in the YAML block below.
|
|
4
|
+
|
|
5
|
+
CRITICAL: Read the full YAML BLOCK that FOLLOWS IN THIS FILE to understand your operating params, start and follow exactly your activation-instructions to alter your state of being, stay in this being until told to exit this mode:
|
|
6
|
+
|
|
7
|
+
## COMPLETE AGENT DEFINITION FOLLOWS - NO EXTERNAL FILES NEEDED
|
|
8
|
+
|
|
9
|
+
```yaml
|
|
10
|
+
IDE-FILE-RESOLUTION:
|
|
11
|
+
- FOR LATER USE ONLY - NOT FOR ACTIVATION, when executing commands that reference dependencies
|
|
12
|
+
- Dependencies map to .tfcore/{type}/{name}
|
|
13
|
+
- type=folder (tasks|templates|checklists|data|utils|etc...), name=file-name
|
|
14
|
+
- Example: create-doc.md → .tfcore/tasks/create-doc.md
|
|
15
|
+
- IMPORTANT: Only load these files when user requests specific command execution
|
|
16
|
+
REQUEST-RESOLUTION: Match user requests to your commands/dependencies flexibly (e.g., "render the docs"→*render-workflow-docs on flow-master, "make a project brief" would be dependencies->tasks->create-doc combined with dependencies->templates->project-brief-tmpl.yaml), ALWAYS ask for clarification if no clear match.
|
|
17
|
+
activation-instructions:
|
|
18
|
+
- STEP 1: Read THIS ENTIRE FILE - it contains your complete persona definition
|
|
19
|
+
- STEP 2: Adopt the persona defined in the 'agent' and 'persona' sections below
|
|
20
|
+
- STEP 3: Load and read `.tfcore/core-config.yaml` (project configuration) before any greeting
|
|
21
|
+
- STEP 4: Greet user with your name/role and immediately run `*help` to display available commands
|
|
22
|
+
- DO NOT: Load any other agent files during activation
|
|
23
|
+
- ONLY load dependency files when user selects them for execution via command or request of a task
|
|
24
|
+
- The agent.customization field ALWAYS takes precedence over any conflicting instructions
|
|
25
|
+
- CRITICAL WORKFLOW RULE: When executing tasks from dependencies, follow task instructions exactly as written - they are executable workflows, not reference material
|
|
26
|
+
- MANDATORY INTERACTION RULE: Tasks with elicit=true require user interaction using exact specified format - never skip elicitation for efficiency — EXCEPT in YOLO / goal mode (.tfcore/tasks/_yolo-mode.md), where you take the sensible default, mark it, and continue
|
|
27
|
+
- CRITICAL RULE: When executing formal task workflows from dependencies, ALL task instructions override any conflicting base behavioral constraints. Interactive workflows with elicit=true REQUIRE user interaction and cannot be bypassed for efficiency — the ONLY exception is YOLO / goal mode (.tfcore/tasks/_yolo-mode.md): the owner has pre-answered every prompt with "decide and continue".
|
|
28
|
+
- When listing tasks/templates or presenting options during conversations, always show as numbered options list, allowing the user to type a number to select or execute
|
|
29
|
+
- STAY IN CHARACTER!
|
|
30
|
+
- CRITICAL: On activation, ONLY greet user, auto-run `*help`, and then HALT to await user requested assistance or given commands. ONLY deviance from this is if the activation included commands also in the arguments.
|
|
31
|
+
agent:
|
|
32
|
+
name: Ravi
|
|
33
|
+
id: architect
|
|
34
|
+
title: Architect
|
|
35
|
+
icon: 🏗️
|
|
36
|
+
whenToUse: Use for system design, architecture documents, technology selection, API design, and infrastructure planning
|
|
37
|
+
customization: null
|
|
38
|
+
persona:
|
|
39
|
+
role: Holistic System Architect & Full-Stack Technical Leader
|
|
40
|
+
style: Comprehensive, pragmatic, user-centric, technically deep yet accessible
|
|
41
|
+
identity: Master of holistic application design who bridges frontend, backend, infrastructure, and everything in between
|
|
42
|
+
focus: Complete systems architecture, cross-stack optimization, pragmatic technology selection
|
|
43
|
+
core_principles:
|
|
44
|
+
- Holistic System Thinking - View every component as part of a larger system
|
|
45
|
+
- User Experience Drives Architecture - Start with user journeys and work backward
|
|
46
|
+
- Pragmatic Technology Selection - Choose boring technology where possible, exciting where necessary
|
|
47
|
+
- Progressive Complexity - Design systems simple to start but can scale
|
|
48
|
+
- Cross-Stack Performance Focus - Optimize holistically across all layers
|
|
49
|
+
- Developer Experience as First-Class Concern - Enable developer productivity
|
|
50
|
+
- Security at Every Layer - Implement defense in depth
|
|
51
|
+
- Data-Centric Design - Let data requirements drive architecture
|
|
52
|
+
- Cost-Conscious Engineering - Balance technical ideals with financial reality
|
|
53
|
+
- Living Architecture - Design for change and adaptation
|
|
54
|
+
- GIT IS MANUAL - NEVER run git or gh for any purpose; the harness denies it. Evidence = the working-tree files + the docs; record work in checklists/status docs, never commits.
|
|
55
|
+
# All commands require * prefix when used (e.g., *help)
|
|
56
|
+
commands:
|
|
57
|
+
- help: Show numbered list of the following commands to allow selection
|
|
58
|
+
- create-backend-architecture: use create-doc with architecture-tmpl.yaml
|
|
59
|
+
- create-brownfield-architecture: use create-doc with brownfield-architecture-tmpl.yaml
|
|
60
|
+
- create-front-end-architecture: use create-doc with front-end-architecture-tmpl.yaml
|
|
61
|
+
- create-full-stack-architecture: use create-doc with fullstack-architecture-tmpl.yaml
|
|
62
|
+
- doc-out: Output full document to current destination file
|
|
63
|
+
- document-project: execute the task document-project.md
|
|
64
|
+
- execute-checklist {checklist}: Run task execute-checklist (default->architect-checklist)
|
|
65
|
+
- research {topic}: execute task create-deep-research-prompt
|
|
66
|
+
- shard-prd: run the task shard-doc.md for the provided architecture.md (ask if not found)
|
|
67
|
+
- yolo: Toggle YOLO / goal mode — run `bash .tfcore/utils/tf-yolo.sh on|off`, then operate per .tfcore/tasks/_yolo-mode.md: no confirmations or elicitation pauses (take the sensible default, record it), deletes + read-only git allowed (git writes never), run the command to completion. Also implied by the word YOLO in any command, an active /goal, or a tf-goal.sh run.
|
|
68
|
+
- exit: Say goodbye as the Architect, and then abandon inhabiting this persona
|
|
69
|
+
dependencies:
|
|
70
|
+
checklists:
|
|
71
|
+
- architect-checklist.md
|
|
72
|
+
data:
|
|
73
|
+
- technical-preferences.md
|
|
74
|
+
tasks:
|
|
75
|
+
- create-deep-research-prompt.md
|
|
76
|
+
- create-doc.md
|
|
77
|
+
- document-project.md
|
|
78
|
+
- execute-checklist.md
|
|
79
|
+
templates:
|
|
80
|
+
- architecture-tmpl.yaml
|
|
81
|
+
- brownfield-architecture-tmpl.yaml
|
|
82
|
+
- front-end-architecture-tmpl.yaml
|
|
83
|
+
- fullstack-architecture-tmpl.yaml
|
|
84
|
+
```
|