@techierathore/techieflow 1.0.1 → 1.0.3

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.
Files changed (178) hide show
  1. package/.claude/commands/TechieFlow/agents/analyst.md +0 -5
  2. package/.claude/commands/TechieFlow/agents/architect.md +0 -6
  3. package/.claude/commands/TechieFlow/agents/flow-master.md +41 -215
  4. package/.claude/commands/TechieFlow/agents/verifier.md +23 -64
  5. package/.claude/commands/TechieFlow/tasks/_metrics-emit-gate.md +24 -117
  6. package/.claude/commands/TechieFlow/tasks/_smoke-test-policy.md +20 -84
  7. package/.claude/commands/TechieFlow/tasks/_status-update-gate.md +10 -74
  8. package/.claude/commands/TechieFlow/tasks/_yolo-mode.md +20 -58
  9. package/.claude/commands/TechieFlow/tasks/amend-docs.md +20 -143
  10. package/.claude/commands/TechieFlow/tasks/build-phase.md +14 -224
  11. package/.claude/commands/TechieFlow/tasks/day1-brownfield.md +31 -505
  12. package/.claude/commands/TechieFlow/tasks/day1-greenfield.md +28 -213
  13. package/.claude/commands/TechieFlow/tasks/deploy-checklist.md +19 -0
  14. package/.claude/commands/TechieFlow/tasks/devguide.md +10 -219
  15. package/.claude/commands/TechieFlow/tasks/fix-issues.md +10 -129
  16. package/.claude/commands/TechieFlow/tasks/log-miss.md +19 -158
  17. package/.claude/commands/TechieFlow/tasks/metrics-report.md +1 -1
  18. package/.claude/commands/TechieFlow/tasks/mockups.md +12 -117
  19. package/.claude/commands/TechieFlow/tasks/refresh-status.md +9 -130
  20. package/.claude/commands/TechieFlow/tasks/split-brd.md +10 -126
  21. package/.claude/commands/TechieFlow/tasks/triage-and-fix.md +14 -0
  22. package/.claude/commands/TechieFlow/tasks/triage-issues.md +11 -152
  23. package/.claude/commands/TechieFlow/tasks/verify-phase.md +36 -572
  24. package/.opencode/plugin/techieflow.js +39 -12
  25. package/.tfcore/agents/analyst.md +0 -5
  26. package/.tfcore/agents/architect.md +0 -6
  27. package/.tfcore/agents/flow-master.md +41 -215
  28. package/.tfcore/agents/verifier.md +23 -64
  29. package/.tfcore/core-config.yaml +10 -0
  30. package/.tfcore/hooks/block-git.sh +4 -4
  31. package/.tfcore/hooks/guard-artifacts.sh +2 -2
  32. package/.tfcore/hooks/guard-build.sh +76 -0
  33. package/.tfcore/hooks/guard-db.sh +90 -0
  34. package/.tfcore/hooks/guard-metrics.sh +56 -0
  35. package/.tfcore/hooks/guard-status-html.sh +116 -71
  36. package/.tfcore/hooks/guard-status.sh +43 -16
  37. package/.tfcore/hooks/guard-verify.sh +70 -48
  38. package/.tfcore/hooks/sweep-artifacts.sh +2 -2
  39. package/.tfcore/install-manifest.yaml +0 -18
  40. package/.tfcore/routing.yaml +25 -14
  41. package/.tfcore/standards/coding-standards-core.md +61 -0
  42. package/.tfcore/standards/coding-standards-dotnet.md +93 -0
  43. package/.tfcore/tasks/_metrics-emit-gate.md +24 -117
  44. package/.tfcore/tasks/_smoke-test-policy.md +20 -84
  45. package/.tfcore/tasks/_status-update-gate.md +10 -74
  46. package/.tfcore/tasks/_yolo-mode.md +20 -58
  47. package/.tfcore/tasks/amend-docs.md +20 -143
  48. package/.tfcore/tasks/build-phase.md +14 -224
  49. package/.tfcore/tasks/day1-brownfield.md +31 -505
  50. package/.tfcore/tasks/day1-greenfield.md +28 -213
  51. package/.tfcore/tasks/deploy-checklist.md +19 -0
  52. package/.tfcore/tasks/devguide.md +10 -219
  53. package/.tfcore/tasks/fix-issues.md +10 -129
  54. package/.tfcore/tasks/log-miss.md +19 -158
  55. package/.tfcore/tasks/metrics-report.md +1 -1
  56. package/.tfcore/tasks/mockups.md +12 -117
  57. package/.tfcore/tasks/refresh-status.md +9 -130
  58. package/.tfcore/tasks/split-brd.md +10 -126
  59. package/.tfcore/tasks/triage-and-fix.md +14 -0
  60. package/.tfcore/tasks/triage-issues.md +11 -152
  61. package/.tfcore/tasks/verify-phase.md +36 -572
  62. package/.tfcore/telemetry/SCHEMA.md +43 -7
  63. package/.tfcore/telemetry/tf-metrics.sh +152 -17
  64. package/.tfcore/templates/project-brief-tmpl.yaml +1 -1
  65. package/.tfcore/templates/stack-defaults/dotnet.md +35 -0
  66. package/.tfcore/templates/stack-questions.md +77 -0
  67. package/.tfcore/templates/v4custom/app-agents-md-tmpl.md +3 -4
  68. package/.tfcore/templates/v4custom/app-architecture-tmpl.md +107 -115
  69. package/.tfcore/templates/v4custom/app-brd-tmpl.md +108 -184
  70. package/.tfcore/templates/v4custom/app-checklist-tmpl.md +48 -73
  71. package/.tfcore/templates/v4custom/app-claude-md-tmpl.md +1 -1
  72. package/.tfcore/templates/v4custom/app-coding-standards-tmpl.md +52 -0
  73. package/.tfcore/templates/v4custom/app-deployment-checklist-tmpl.md +86 -0
  74. package/.tfcore/templates/v4custom/app-devguide-tmpl.md +69 -146
  75. package/.tfcore/templates/v4custom/app-phases-tmpl.md +35 -0
  76. package/.tfcore/templates/v4custom/app-productguide-tmpl.md +38 -35
  77. package/.tfcore/templates/v4custom/app-project-status-tmpl.md +63 -73
  78. package/.tfcore/templates/v4custom/app-uidesign-tmpl.md +62 -37
  79. package/.tfcore/templates/v4custom/app-usageguide-tmpl.md +69 -54
  80. package/.tfcore/templates/v4custom/build-invocation-ladder.md +17 -180
  81. package/.tfcore/templates/v4custom/build-subagent-prompt.md +17 -0
  82. package/.tfcore/templates/v4custom/metrics-report-template.md +2 -2
  83. package/.tfcore/user-guide.md +0 -23
  84. package/.tfcore/utils/__pycache__/tf-brd-status.cpython-312.pyc +0 -0
  85. package/.tfcore/utils/__pycache__/tf-checklist-edit.cpython-312.pyc +0 -0
  86. package/.tfcore/utils/__pycache__/tf-codex-bind.cpython-312.pyc +0 -0
  87. package/.tfcore/utils/__pycache__/tf-codex-telemetry.cpython-312.pyc +0 -0
  88. package/.tfcore/utils/__pycache__/tf-day1-files.cpython-312.pyc +0 -0
  89. package/.tfcore/utils/__pycache__/tf-devguide-list.cpython-312.pyc +0 -0
  90. package/.tfcore/utils/__pycache__/tf-doc-check.cpython-312.pyc +0 -0
  91. package/.tfcore/utils/__pycache__/tf-log-miss.cpython-312.pyc +0 -0
  92. package/.tfcore/utils/__pycache__/tf-misses-md.cpython-312.pyc +0 -0
  93. package/.tfcore/utils/__pycache__/tf-mockups-locate.cpython-312.pyc +0 -0
  94. package/.tfcore/utils/__pycache__/tf-opencode-audit.cpython-312.pyc +0 -0
  95. package/.tfcore/utils/__pycache__/tf-perf-grade.cpython-312.pyc +0 -0
  96. package/.tfcore/utils/__pycache__/tf-render-html.cpython-312.pyc +0 -0
  97. package/.tfcore/utils/__pycache__/tf-split-brd.cpython-312.pyc +0 -0
  98. package/.tfcore/utils/__pycache__/tf-status-facts.cpython-312.pyc +0 -0
  99. package/.tfcore/utils/__pycache__/tf-triage.cpython-312.pyc +0 -0
  100. package/.tfcore/utils/__pycache__/tf-verify-list.cpython-312.pyc +0 -0
  101. package/.tfcore/utils/__pycache__/tf-verify-verdict.cpython-312.pyc +0 -0
  102. package/.tfcore/utils/tf-brd-status.py +176 -0
  103. package/.tfcore/utils/tf-brd-status.sh +19 -0
  104. package/.tfcore/utils/tf-build-list.py +191 -0
  105. package/.tfcore/utils/tf-build-list.sh +20 -0
  106. package/.tfcore/utils/tf-build.sh +143 -0
  107. package/.tfcore/utils/tf-cdp-relay.ps1 +64 -0
  108. package/.tfcore/utils/tf-checklist-edit.py +133 -0
  109. package/.tfcore/utils/tf-day1-files.py +208 -0
  110. package/.tfcore/utils/tf-day1-files.sh +20 -0
  111. package/.tfcore/utils/tf-devguide-list.py +249 -0
  112. package/.tfcore/utils/tf-devguide-list.sh +18 -0
  113. package/.tfcore/utils/tf-doc-check.py +1267 -0
  114. package/.tfcore/utils/tf-doc-check.sh +29 -0
  115. package/.tfcore/utils/tf-emit.sh +203 -13
  116. package/.tfcore/utils/tf-fix-close.sh +83 -0
  117. package/.tfcore/utils/tf-goal.sh +193 -62
  118. package/.tfcore/utils/tf-harness.sh +4 -9
  119. package/.tfcore/utils/tf-log-miss.py +197 -0
  120. package/.tfcore/utils/tf-log-miss.sh +14 -0
  121. package/.tfcore/utils/tf-misses-md.py +211 -0
  122. package/.tfcore/utils/tf-misses-md.sh +13 -0
  123. package/.tfcore/utils/tf-mockups-locate.py +66 -0
  124. package/.tfcore/utils/tf-mockups-locate.sh +18 -0
  125. package/.tfcore/utils/tf-opencode-audit.py +23 -7
  126. package/.tfcore/utils/tf-perf-grade.py +97 -0
  127. package/.tfcore/utils/tf-perf-grade.sh +12 -0
  128. package/.tfcore/utils/tf-phase.sh +74 -0
  129. package/.tfcore/utils/tf-routing-bind.sh +10 -5
  130. package/.tfcore/utils/tf-routing.sh +6 -7
  131. package/.tfcore/utils/tf-split-brd.py +304 -0
  132. package/.tfcore/utils/tf-split-brd.sh +22 -0
  133. package/.tfcore/utils/tf-status-evidence.sh +68 -0
  134. package/.tfcore/utils/tf-status-facts.py +309 -0
  135. package/.tfcore/utils/tf-status-facts.sh +20 -0
  136. package/.tfcore/utils/tf-triage.py +243 -0
  137. package/.tfcore/utils/tf-triage.sh +16 -0
  138. package/.tfcore/utils/tf-verify-boot.sh +250 -0
  139. package/.tfcore/utils/tf-verify-emit.sh +110 -0
  140. package/.tfcore/utils/tf-verify-env.sh +88 -0
  141. package/.tfcore/utils/tf-verify-list.py +270 -0
  142. package/.tfcore/utils/tf-verify-list.sh +13 -0
  143. package/.tfcore/utils/tf-verify-screens.mjs +283 -0
  144. package/.tfcore/utils/tf-verify-screens.sh +22 -0
  145. package/.tfcore/utils/tf-verify-tests.sh +123 -0
  146. package/.tfcore/utils/tf-verify-verdict.py +283 -0
  147. package/.tfcore/utils/tf-verify-verdict.sh +15 -0
  148. package/.tfcore/utils/tf-yolo.sh +59 -0
  149. package/README.md +114 -1149
  150. package/docs/TechieFlow-Installation.md +27 -7
  151. package/opencode.jsonc +13 -33
  152. package/package.json +4 -7
  153. package/scripts/install.mjs +73 -46
  154. package/scripts/npm-cleanup.mjs +137 -0
  155. package/scripts/npm-postinstall.mjs +49 -0
  156. package/.claude/commands/TechieFlow/tasks/advanced-elicitation.md +0 -117
  157. package/.claude/commands/TechieFlow/tasks/author-brd.md +0 -79
  158. package/.claude/commands/TechieFlow/tasks/document-project.md +0 -343
  159. package/.claude/commands/TechieFlow/tasks/execute-checklist.md +0 -86
  160. package/.claude/commands/TechieFlow/tasks/index-docs.md +0 -173
  161. package/.claude/commands/TechieFlow/tasks/kb-mode-interaction.md +0 -75
  162. package/.claude/commands/TechieFlow/tasks/shard-doc.md +0 -185
  163. package/.codex/config.toml +0 -46
  164. package/.codex/hooks.json +0 -63
  165. package/.codex/rules/techieflow.rules +0 -8
  166. package/.tfcore/hooks/codex-adapter.py +0 -248
  167. package/.tfcore/tasks/advanced-elicitation.md +0 -117
  168. package/.tfcore/tasks/author-brd.md +0 -79
  169. package/.tfcore/tasks/document-project.md +0 -343
  170. package/.tfcore/tasks/execute-checklist.md +0 -86
  171. package/.tfcore/tasks/index-docs.md +0 -173
  172. package/.tfcore/tasks/kb-mode-interaction.md +0 -75
  173. package/.tfcore/tasks/shard-doc.md +0 -185
  174. package/.tfcore/utils/tf-codex-bind.py +0 -196
  175. package/.tfcore/utils/tf-codex-telemetry.py +0 -60
  176. package/WORKFLOW.html +0 -1986
  177. package/scripts/test-install.mjs +0 -505
  178. package/scripts/validate.mjs +0 -163
@@ -1,163 +0,0 @@
1
- #!/usr/bin/env node
2
- // scripts/validate.mjs — the checks that run before every publish and on every push.
3
- //
4
- // 1. Mirror parity: every file under .claude/commands/TechieFlow/<sub>/ is byte-identical
5
- // to .tfcore/<sub>/. Claude Code only reads the mirror, so drift means Claude Code and
6
- // OpenCode run different instructions.
7
- // 2. OpenCode references: every {file:...} in opencode.jsonc points at a file that exists.
8
- // One dead reference makes OpenCode reject the whole config.
9
- // 3. Shell syntax: `bash -n` on every .sh file in the repository.
10
- // 4. Package contents: `npm pack --dry-run` succeeds, ships every file the shell scripts
11
- // deploy, and ships none of the local-only or per-machine files.
12
- //
13
- // Exit code 0 means every check passed. Any failure exits 1 and names the problem.
14
-
15
- import { spawnSync } from "node:child_process";
16
- import { existsSync, readFileSync, readdirSync, statSync } from "node:fs";
17
- import { dirname, join, relative, resolve } from "node:path";
18
- import { fileURLToPath } from "node:url";
19
-
20
- const root = resolve(dirname(fileURLToPath(import.meta.url)), "..");
21
- const problems = [];
22
- let passed = 0;
23
-
24
- function check(name, fn) {
25
- try {
26
- fn();
27
- passed++;
28
- console.log(`ok ${name}`);
29
- } catch (error) {
30
- problems.push(`${name}: ${error.message}`);
31
- console.log(`FAIL ${name}\n ${error.message.split("\n").join("\n ")}`);
32
- }
33
- }
34
-
35
- function assert(condition, message) {
36
- if (!condition) throw new Error(message);
37
- }
38
-
39
- const skipDirectories = new Set([".git", "node_modules"]);
40
-
41
- function filesUnder(directory) {
42
- const out = [];
43
- const walk = (current) => {
44
- for (const entry of readdirSync(current, { withFileTypes: true })) {
45
- if (entry.isDirectory()) { if (!skipDirectories.has(entry.name)) walk(join(current, entry.name)); }
46
- else if (entry.isFile()) out.push(join(current, entry.name));
47
- }
48
- };
49
- if (existsSync(directory)) walk(directory);
50
- return out;
51
- }
52
-
53
- const rel = (path) => relative(root, path).split("\\").join("/");
54
-
55
- // ---- 1. mirror parity
56
- check("Claude mirror is byte-identical to .tfcore/", () => {
57
- const mirror = join(root, ".claude", "commands", "TechieFlow");
58
- const differences = [];
59
- for (const sub of readdirSync(mirror)) {
60
- const coreFiles = new Map(filesUnder(join(root, ".tfcore", sub)).map((f) => [relative(join(root, ".tfcore", sub), f), f]));
61
- const mirrorFiles = new Map(filesUnder(join(mirror, sub)).map((f) => [relative(join(mirror, sub), f), f]));
62
- for (const [name, corePath] of coreFiles) {
63
- if (!mirrorFiles.has(name)) differences.push(`missing from mirror: ${sub}/${name}`);
64
- else if (!readFileSync(corePath).equals(readFileSync(mirrorFiles.get(name)))) differences.push(`content differs: ${sub}/${name}`);
65
- }
66
- for (const name of mirrorFiles.keys()) if (!coreFiles.has(name)) differences.push(`only in mirror: ${sub}/${name}`);
67
- }
68
- assert(differences.length === 0, `${differences.length} difference(s) between .tfcore/ and .claude/commands/TechieFlow/:\n${differences.join("\n")}\nFix: copy the changed files from .tfcore/ over the mirror, or re-run the scaffold's agent sync for every folder.`);
69
- });
70
-
71
- // ---- 2. OpenCode references
72
- check("every {file:} reference in opencode.jsonc resolves", () => {
73
- const text = readFileSync(join(root, "opencode.jsonc"), "utf8");
74
- const refs = [...new Set([...text.matchAll(/\{file:([^}]*)\}/g)].map((m) => m[1]))];
75
- assert(refs.length > 0, "opencode.jsonc contains no {file:} references at all");
76
- const dead = refs.filter((ref) => !existsSync(join(root, ref)));
77
- assert(dead.length === 0, `dead references:\n${dead.join("\n")}`);
78
- });
79
-
80
- // ---- 3. shell syntax
81
- check("bash -n passes on every .sh file", () => {
82
- const scripts = filesUnder(root).filter((f) => f.endsWith(".sh"));
83
- assert(scripts.length > 0, "no .sh files found");
84
- const version = spawnSync("bash", ["-c", "echo $BASH_VERSION"], { encoding: "utf8" });
85
- if (version.error) throw new Error(`bash could not be started: ${version.error.message}`);
86
- const bashVersion = version.stdout.trim();
87
- const broken = [];
88
- for (const script of scripts) {
89
- const result = spawnSync("bash", ["-n", script], { encoding: "utf8" });
90
- if (result.error) throw new Error(`bash could not be started: ${result.error.message}`);
91
- if (result.status !== 0) broken.push(`${rel(script)}: ${result.stderr.trim()}`);
92
- }
93
- if (broken.length && /^[123]\./.test(bashVersion)) {
94
- broken.push(`This terminal's bash is ${bashVersion}, Apple's old copy. The framework needs bash 4 or newer.`,
95
- "On a Mac: install it with `brew install bash`, put /opt/homebrew/bin first on the PATH in ~/.zshrc,",
96
- "then open a NEW terminal window and run the command again. Check with: which -a bash");
97
- }
98
- assert(broken.length === 0, broken.join("\n"));
99
- console.log(` ${scripts.length} script(s) checked with bash ${bashVersion}`);
100
- });
101
-
102
- // ---- 4. package contents
103
- const libraryPersonas = new Set(["trblazeui.md", "techierag.md"]);
104
-
105
- // What the three shell scripts copy out of this repository into a project.
106
- function deployedFiles() {
107
- const out = [];
108
- for (const f of filesUnder(join(root, ".tfcore"))) {
109
- const r = rel(f);
110
- if (!r.startsWith(".tfcore/.session/")) out.push(r);
111
- }
112
- for (const f of filesUnder(join(root, ".claude", "commands"))) {
113
- if (!libraryPersonas.has(f.split("/").pop())) out.push(rel(f));
114
- }
115
- for (const f of filesUnder(join(root, ".opencode", "plugin"))) if (f.endsWith(".js")) out.push(rel(f));
116
- for (const f of filesUnder(join(root, ".opencode", "command"))) {
117
- if (f.endsWith(".md") && !libraryPersonas.has(f.split("/").pop())) out.push(rel(f));
118
- }
119
- out.push(".codex/config.toml", ".codex/hooks.json");
120
- for (const f of filesUnder(join(root, ".codex", "rules"))) out.push(rel(f));
121
- out.push("opencode.jsonc", "WORKFLOW.html");
122
- return out.filter((r) => !/(^|\/)(\.DS_Store|Thumbs\.db|desktop\.ini)$/.test(r) && !r.endsWith(".bak"));
123
- }
124
-
125
- const mustNotShip = [
126
- ".tfcore/.session", ".claude/settings.json", ".claude/settings.local.json",
127
- ".claude/trblazeui.md", ".claude/techierag.md",
128
- ".claude/commands/trblazeui.md", ".claude/commands/techierag.md",
129
- ".opencode/command/trblazeui.md", ".opencode/command/techierag.md",
130
- ".opencode/node_modules", ".opencode/package.json", ".opencode/package-lock.json", ".opencode/.gitignore",
131
- ".codex/agents", ".agents", ".techierag", ".trblazeui", ".github",
132
- "scaffold-brownfield.sh", "scaffold-greenfield.sh", "update-framework.sh",
133
- "docs/TechieFlow-Requirements.md", "docs/TechieFlow-How-It-Works.md", "docs/metrics",
134
- "DECISIONS.md", "WorkFlow-Context.md", "CodexChanges.md",
135
- ];
136
- const mustShip = [
137
- "package.json", "LICENSE", "README.md", "docs/TechieFlow-Installation.md",
138
- "scripts/install.mjs", "scripts/test-install.mjs", "scripts/validate.mjs",
139
- ];
140
-
141
- check("npm pack --dry-run succeeds and ships the right files", () => {
142
- const onWindows = process.platform === "win32";
143
- const result = process.env.npm_execpath
144
- ? spawnSync(process.execPath, [process.env.npm_execpath, "pack", "--dry-run", "--json"], { cwd: root, encoding: "utf8" })
145
- : spawnSync(onWindows ? "npm.cmd" : "npm", ["pack", "--dry-run", "--json"], { cwd: root, encoding: "utf8", shell: onWindows });
146
- if (result.error) throw new Error(`npm could not be started: ${result.error.message}`);
147
- assert(result.status === 0, `npm pack --dry-run failed:\n${result.stdout}${result.stderr}`);
148
- const packed = new Set(JSON.parse(result.stdout)[0].files.map((f) => f.path));
149
- const missing = [...deployedFiles(), ...mustShip].filter((f) => !packed.has(f));
150
- const leaked = [...packed].filter((p) => mustNotShip.some((bad) => p === bad || p.startsWith(`${bad}/`)));
151
- const report = [];
152
- if (missing.length) report.push(`files the shell scripts deploy but the package does not ship:\n${missing.join("\n")}`);
153
- if (leaked.length) report.push(`files that must not ship:\n${leaked.join("\n")}`);
154
- assert(report.length === 0, report.join("\n"));
155
- console.log(` ${packed.size} file(s) in the package`);
156
- });
157
-
158
- console.log("");
159
- if (problems.length) {
160
- console.log(`${passed} check(s) passed, ${problems.length} failed`);
161
- process.exit(1);
162
- }
163
- console.log(`validation passed (${passed} checks)`);