nobrainer-tech-flow 0.0.0-stage → 2.4.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.
Files changed (149) hide show
  1. package/.agents/plugins/marketplace.json +20 -0
  2. package/.claude-plugin/marketplace.json +18 -0
  3. package/.claude-plugin/plugin.json +21 -0
  4. package/.codex-plugin/plugin.json +47 -0
  5. package/.opencode/INSTALL.md +37 -0
  6. package/.opencode/plugins/nobrainer-tech-skills.js +66 -0
  7. package/.pi/extensions/nobrainer-tech-skills.js +64 -0
  8. package/AGENTS.md +204 -0
  9. package/CLAUDE.md +204 -0
  10. package/CONTRIBUTING.md +70 -0
  11. package/GEMINI.md +1 -0
  12. package/LICENSE +21 -0
  13. package/README.md +658 -2
  14. package/SECURITY.md +33 -0
  15. package/adapters/bootstrap.md +27 -0
  16. package/assets/nobrainer-tech-logo.svg +1 -0
  17. package/assets/nobrainer-workflow.svg +155 -0
  18. package/assets/plugin-logo.png +0 -0
  19. package/bin/nobrainer-tech-flow.mjs +48 -0
  20. package/docs/BOUNDED_RUNNER.md +60 -0
  21. package/docs/CHAT_PLUGINS.md +29 -0
  22. package/docs/COMPATIBILITY.md +371 -0
  23. package/docs/INSTALL.md +626 -0
  24. package/docs/MIGRATION_TO_FLOW.md +117 -0
  25. package/docs/NAMING.md +39 -0
  26. package/docs/PRIVACY.md +9 -0
  27. package/docs/SESSION_RESTART.md +70 -0
  28. package/docs/SKILL_CURATION.md +124 -0
  29. package/docs/TESTING.md +232 -0
  30. package/docs/TRY_IT.md +109 -0
  31. package/docs/releases/v1.0.0.md +81 -0
  32. package/docs/releases/v1.1.0.md +85 -0
  33. package/docs/releases/v1.10.0.md +34 -0
  34. package/docs/releases/v1.11.0-publication-readback.md +25 -0
  35. package/docs/releases/v1.11.0.md +42 -0
  36. package/docs/releases/v1.12.0.md +30 -0
  37. package/docs/releases/v1.13.0.md +46 -0
  38. package/docs/releases/v1.14.0.md +43 -0
  39. package/docs/releases/v1.14.1.md +21 -0
  40. package/docs/releases/v1.2.0.md +87 -0
  41. package/docs/releases/v1.2.1.md +92 -0
  42. package/docs/releases/v1.3.0-publication-readback.md +69 -0
  43. package/docs/releases/v1.3.0.md +66 -0
  44. package/docs/releases/v1.3.1-publication-readback.md +76 -0
  45. package/docs/releases/v1.3.1.md +59 -0
  46. package/docs/releases/v1.4.0-publication-readback.md +81 -0
  47. package/docs/releases/v1.4.0.md +43 -0
  48. package/docs/releases/v1.5.0-publication-readback.md +76 -0
  49. package/docs/releases/v1.5.0.md +54 -0
  50. package/docs/releases/v1.6.0.md +64 -0
  51. package/docs/releases/v1.6.1-publication-readback.md +53 -0
  52. package/docs/releases/v1.6.1.md +82 -0
  53. package/docs/releases/v1.7.0.md +42 -0
  54. package/docs/releases/v1.7.1-publication-readback.md +64 -0
  55. package/docs/releases/v1.7.1.md +49 -0
  56. package/docs/releases/v1.8.0.md +63 -0
  57. package/docs/releases/v1.8.1.md +32 -0
  58. package/docs/releases/v1.9.0.md +33 -0
  59. package/docs/releases/v2.0.0-candidate.md +28 -0
  60. package/docs/releases/v2.0.0.md +53 -0
  61. package/docs/releases/v2.0.1.md +135 -0
  62. package/docs/releases/v2.0.2.md +189 -0
  63. package/docs/releases/v2.1.0.md +64 -0
  64. package/docs/releases/v2.1.1.md +43 -0
  65. package/docs/releases/v2.2.0.md +64 -0
  66. package/docs/releases/v2.2.1.md +11 -0
  67. package/docs/releases/v2.3.0.md +97 -0
  68. package/docs/releases/v2.3.1.md +71 -0
  69. package/docs/releases/v2.3.2.md +242 -0
  70. package/docs/releases/v2.4.0.md +126 -0
  71. package/gemini-extension.json +6 -0
  72. package/hooks/claude-hooks.json +17 -0
  73. package/hooks/hooks-cursor.json +10 -0
  74. package/hooks/run-hook.cmd +36 -0
  75. package/hooks/session-start +38 -0
  76. package/package.json +69 -4
  77. package/plugin.json +51 -0
  78. package/scripts/build_plugin.py +50 -0
  79. package/scripts/check_flow_update.py +18 -0
  80. package/scripts/check_public_commit.py +86 -0
  81. package/scripts/fetch_public_refs.py +69 -0
  82. package/scripts/install.py +600 -0
  83. package/scripts/install.sh +1392 -0
  84. package/scripts/install_guards.py +279 -0
  85. package/scripts/install_personalization.py +527 -0
  86. package/scripts/install_skills.py +951 -0
  87. package/scripts/npm_install.py +85 -0
  88. package/scripts/recommend_flow_setup.py +1522 -0
  89. package/scripts/validate_skills.py +465 -0
  90. package/skills/nobrainer-auto-fine-tune/SKILL.md +79 -0
  91. package/skills/nobrainer-auto-fine-tune/references/capacity-audit.md +49 -0
  92. package/skills/nobrainer-autoimprove/SKILL.md +212 -0
  93. package/skills/nobrainer-autoimprove/scripts/count_words.py +22 -0
  94. package/skills/nobrainer-browser/SKILL.md +234 -0
  95. package/skills/nobrainer-browser/references/cdp-profile-restart.md +93 -0
  96. package/skills/nobrainer-build/SKILL.md +173 -0
  97. package/skills/nobrainer-codex-context/SKILL.md +111 -0
  98. package/skills/nobrainer-codex-context/scripts/codex_context.py +175 -0
  99. package/skills/nobrainer-decide/SKILL.md +198 -0
  100. package/skills/nobrainer-dispatcher/SKILL.md +256 -0
  101. package/skills/nobrainer-dispatcher/agents/openai.yaml +4 -0
  102. package/skills/nobrainer-rca/SKILL.md +163 -0
  103. package/skills/nobrainer-research/SKILL.md +131 -0
  104. package/skills/nobrainer-review/SKILL.md +195 -0
  105. package/skills/nobrainer-security/SKILL.md +166 -0
  106. package/skills/nobrainer-sessions/SKILL.md +223 -0
  107. package/skills/nobrainer-sessions/references/evidence-receipt.md +55 -0
  108. package/skills/nobrainer-sessions/references/protocol.md +337 -0
  109. package/skills/nobrainer-sessions/references/session-restart.md +255 -0
  110. package/skills/nobrainer-sessions/scripts/evidence_receipt.py +373 -0
  111. package/skills/nobrainer-sessions/scripts/restart_gate.py +140 -0
  112. package/skills/nobrainer-sessions/scripts/run_bounded.py +390 -0
  113. package/skills/nobrainer-sessions/scripts/session_title.py +43 -0
  114. package/skills/nobrainer-skill-doctor/SKILL.md +149 -0
  115. package/skills/nobrainer-skill-doctor/references/astra.md +19 -0
  116. package/skills/nobrainer-skill-doctor/scripts/audit.py +100 -0
  117. package/skills/nobrainer-skill-doctor/scripts/context_candidates.py +133 -0
  118. package/skills/nobrainer-spec-driven-development/SKILL.md +132 -0
  119. package/skills/nobrainer-spec-driven-development/references/spec-template.md +114 -0
  120. package/skills/nobrainer-team/SKILL.md +165 -0
  121. package/skills/nobrainer-team/references/team-plan.md +64 -0
  122. package/skills/nobrainer-tech-flow/SKILL.md +239 -0
  123. package/skills/nobrainer-tech-flow/VERSION +1 -0
  124. package/skills/nobrainer-tech-flow/references/autopilot.md +72 -0
  125. package/skills/nobrainer-tech-flow/references/codex-routing.md +21 -0
  126. package/skills/nobrainer-tech-flow/references/communication.md +108 -0
  127. package/skills/nobrainer-tech-flow/references/correction-hooks.md +110 -0
  128. package/skills/nobrainer-tech-flow/references/daily-update.md +28 -0
  129. package/skills/nobrainer-tech-flow/references/delivery.md +243 -0
  130. package/skills/nobrainer-tech-flow/references/idea-to-delivery.md +82 -0
  131. package/skills/nobrainer-tech-flow/references/long-run-state.md +209 -0
  132. package/skills/nobrainer-tech-flow/references/model-routing.md +83 -0
  133. package/skills/nobrainer-tech-flow/references/optional-decisions.md +83 -0
  134. package/skills/nobrainer-tech-flow/references/project-start.md +22 -0
  135. package/skills/nobrainer-tech-flow/references/routing.md +125 -0
  136. package/skills/nobrainer-tech-flow/references/setup.md +180 -0
  137. package/skills/nobrainer-tech-flow/references/worktrees.md +138 -0
  138. package/skills/nobrainer-tech-flow/scripts/check_flow_update.py +298 -0
  139. package/skills/nobrainer-tech-flow/scripts/cleanup_worktree.py +327 -0
  140. package/skills/nobrainer-tech-flow/scripts/decision_config.py +107 -0
  141. package/skills/nobrainer-tech-flow/scripts/flow_guard.py +252 -0
  142. package/skills/nobrainer-tech-flow/scripts/typed_decisions.py +210 -0
  143. package/skills/nobrainer-wiki/SKILL.md +164 -0
  144. package/skills/nobrainer-wiki/references/setup.md +88 -0
  145. package/skills/nobrainer-writing/SKILL.md +272 -0
  146. package/skills/nobrainer-writing/agents/openai.yaml +4 -0
  147. package/skills/nobrainer-writing/references/brief-artifacts.md +357 -0
  148. package/skills/nobrainer-writing/references/plain-technical-english.md +76 -0
  149. package/skills/nobrainer-writing/references/research.md +86 -0
@@ -0,0 +1,71 @@
1
+ # nobrainer-tech-flow 2.3.1: keep your skills under retired names
2
+
3
+ Release date: 2026-10-13.
4
+
5
+ Keep your own skill under a name Flow retired and still install or update Flow.
6
+ For example, a private `nobrainer-reddit` no longer stops the Python or shell
7
+ installer. Both leave the existing file, directory or symlink unchanged through
8
+ apply, repeat and undo. `install_skills.py` and `install.sh` report it as
9
+ `PRESERVED_FOREIGN`; the guided `install.py` and npm setups continue without a
10
+ separate line.
11
+
12
+ ## What changes
13
+
14
+ - `nobrainer-reddit` is explicitly classified as retired. Flow removed the old
15
+ Reddit CLI rather than absorbing its functionality or trigger into an active
16
+ skill. Another source can legitimately use that name.
17
+ - Foreign targets at renamed or absorbed aliases such as `nb-flow` still stop
18
+ installation, so an existing skill cannot silently shadow a Flow trigger.
19
+ Unresolved legacy names such as `nobrainer-fast-audit` also remain conflicts.
20
+ - Exact old links owned by the same checkout still require `--migrate-legacy`.
21
+ Migration continues to preserve their recovery backups.
22
+
23
+ This behavior applies to `install_skills.py`, the Python/npm setups that call
24
+ it and the no-Python `install.sh`. Both installers compare an old link against
25
+ the exact predecessor paths owned by the same checkout. See
26
+ [conflict and migration behavior](../INSTALL.md#conflict-and-migration-behavior).
27
+
28
+ ## Verification record
29
+
30
+ Local checks on the installer and 2.3.1 metadata (macOS, Python 3.14.5):
31
+
32
+ - `python3 scripts/validate_skills.py` and
33
+ `python3 scripts/validate_skills.py --suite`: both passed.
34
+ - `python3 -m unittest tests.test_installer -v`: 55 tests passed. The new cases
35
+ preserve foreign symlinks, directories and files at the retired name, retain
36
+ exact owned-link migration and reject foreign `nb-flow` targets.
37
+ - `python3 -m unittest tests.test_shell_installer -v`: 40 tests passed with
38
+ `/bin/sh`, dash, bash in POSIX mode and zsh emulating sh.
39
+ - `python3 -m unittest discover -s tests -v`: 412 tests ran; all passed except
40
+ 2 platform-specific skips. This includes the exported-source acceptance check
41
+ without Git metadata.
42
+ - Shell checks run in every available POSIX shell and compare exact-link
43
+ classification with Python for absolute, relative and chained old links,
44
+ links to other current skills, loops and targets with trailing newlines. The
45
+ no-Python check also exercises retired-name preservation.
46
+ - An isolated Python setup preview, apply and undo preserved a foreign retired
47
+ file's bytes and inode. A mixed retired-name/renamed-alias check still refused
48
+ installation before any canonical write.
49
+ - The changed Python files compiled, and the npm command read back `2.3.1`.
50
+ - A current-tree secret scan with the repository's gitleaks configuration found
51
+ no leaks.
52
+
53
+ These checks prove local installer behavior and package metadata. They do not
54
+ prove publication, a fresh target-client import or a performance gain.
55
+
56
+ ## Scope and distribution
57
+
58
+ This is an installer-only fix. The eighteen skill contents are unchanged from
59
+ v2.3.0 except for the entry skill's `VERSION` file. No workflow, model-routing or
60
+ performance change is claimed.
61
+
62
+ The native plugin 2.3.1 will carry the same installer. Plugin export, publication
63
+ and target-client import each require their own readback. npm registry
64
+ publication is still pending; source release files and a locally packed tarball
65
+ do not establish registry availability.
66
+
67
+ ## Rollback
68
+
69
+ Return to the reviewed v2.3.0 source through the documented preview and undo
70
+ flow. Keep retained source files while any client links refer to them. A foreign
71
+ retired target needs no restoration because this patch leaves it unchanged.
@@ -0,0 +1,242 @@
1
+ # nobrainer-tech-flow 2.3.2: install, update and undo without false alarms or leftovers
2
+
3
+ Release date: 2026-10-18.
4
+
5
+ Run undo twice and the second run no longer fails. Undo leaves your profile as it was
6
+ before the setup, including the empty folders the installer had to create. An update
7
+ through `install.sh` delivers the new instruction block. A repeat apply says that
8
+ nothing changed instead of asking you to restart your client. These six fixes came
9
+ from a test of a fresh install that followed the README commands on 2.3.1. A review of
10
+ them and a Windows test run found the further fixes listed after them: undo now also
11
+ works after you edit the instruction file, the default block no longer names a private
12
+ skill, the npm release copy moves out of the folder a Git clone may use, and the
13
+ Windows hook wrapper no longer runs a `bash.exe` from the current folder.
14
+
15
+ ## What changes
16
+
17
+ - **A second undo is a clear no-op.** `--undo` and `--undo --apply` with no setup
18
+ record print `NOTHING TO UNDO`, name the client and the record they looked for,
19
+ write nothing and exit 0, in `install.sh`, `install.py` and the npm command. In
20
+ 2.3.1 they exited 3 with `rollback state not found`. A damaged or unreadable
21
+ record, a folder or link where the record should be, and a record that only the
22
+ Python undo can read still stop with an error. So does a record in a folder this
23
+ account cannot search, such as a home without search permission while
24
+ `CLAUDE_CONFIG_DIR` points elsewhere: undo exits 3 instead of `NOTHING TO UNDO`.
25
+ - **Undo removes the folders the setup created.** The setup record gains
26
+ `created_dirs`, the folders the setup had to create (links resolved, an empty list
27
+ included). Undo removes each one that is still empty, deepest first. A folder that
28
+ existed before the setup, or holds anything else, stays. A record from 2.3.1 or
29
+ earlier has no list and keeps the earlier rule, so its undo removes only an empty
30
+ skills folder. A list that names a folder the setup cannot have made (a relative
31
+ path, `..`, the root, a folder beside the setup's own, a duplicate, an entry that
32
+ is not text) is refused with exit 3 and nothing is changed. The `.bak` copy the
33
+ setup made of an instruction file you already had is kept, as before.
34
+ - **`install.sh` replaces a block of an earlier version.** When the managed block
35
+ differs from this version's text, `install.sh` replaces it from the start marker to
36
+ the end marker and keeps every byte outside them (line endings, a byte order mark,
37
+ a missing final line break). The file as it was is saved as a `.bak` copy first,
38
+ the preview shows the lines that change, and undo still removes the block or puts
39
+ back the file from before the setup. A block that carries an option (a standing
40
+ authorization, a saved wiki root or a preference), or whose markers do not stand on
41
+ lines of their own, is still left as it is with a note that points to
42
+ `install_personalization.py --keep-options`; `install.py` keeps rewriting such
43
+ blocks and keeping their options.
44
+ - **The block names the module the way the client lists it.** Codex 0.157.1 lists the
45
+ module as `nobrainer-tech-flow:nobrainer-tech-flow` when a plugin manifest sits
46
+ above the folder a link resolves to, which is the case for a git checkout and for the
47
+ npm package, and as `nobrainer-tech-flow` for a copy. It adds the module text to the
48
+ request only for the name it lists. The entrypoint line of the block and the install,
49
+ naming, testing and compatibility docs now say to use the listed name and give both
50
+ Codex forms. The README and the repository instruction files (`AGENTS.md` and
51
+ `CLAUDE.md`) give the same rule. Existing blocks differ from the new text, so the
52
+ next apply updates them (`install.sh` through the replacement above, `install.py`
53
+ as before).
54
+ - **A repeat apply says nothing changed.** When no link and no instruction file was
55
+ written, apply prints `UP TO DATE` and no restart hint. `INSTALLED` and the restart
56
+ hint stay for a run that changed something.
57
+ - **The setup record and file modes are documented.** The installer writes
58
+ `.nobrainer-flow-onboarding-<client>.json` in the chosen home with mode 0600. A new
59
+ instruction file is created with mode 0600 as well; an existing file keeps its mode
60
+ and so does its `.bak` copy. `install.sh` now also updates a read-only file (mode
61
+ 0444) and leaves it read-only, as the Python installer already did; it used to stop
62
+ with exit 4. When the setup record cannot be saved, the run puts such a file back as it was
63
+ instead of leaving the new block behind. Its undo takes the block out of such a file the same way and leaves it
64
+ read-only; it used to stop with exit 4 after removing the links. Undo deletes the record. [Installation](../INSTALL.md)
65
+ describes the file and its fields.
66
+
67
+ - **Undo removes the skill links even after you edited the instruction file.** In
68
+ 2.3.1 an edit to the instruction file after the setup made undo stop with exit 3
69
+ before it unlinked anything. Now `install.sh`, `install.py`, the npm command and the
70
+ guided `--rollback` remove the links the setup made, print `PARTLY UNDONE`, leave the
71
+ edited file exactly as it is (managed block included) and still exit 3. The record
72
+ stays, with no links in it, and a hint says how to take the block out as well: apply
73
+ again, which records the file as it is now, then undo again; your edits outside the
74
+ block stay. Deleting the lines between the markers by hand works too: when the file
75
+ holds neither marker any more, the next undo finishes, deletes the record and the
76
+ empty folders the setup made, and leaves the file as it is. A missing `.bak` copy no
77
+ longer stops the undo of an edited file, since that file does not get the block back;
78
+ `install.sh` and the guided undo used to stop on it before unlinking anything. With
79
+ that copy gone or unreadable, the hint offers only the removal by hand, because
80
+ applying again keeps that copy in the record and the undo after it would stop on it. A link
81
+ that changed since the setup still stops the undo before anything changes. So does
82
+ an instruction file or `.bak` copy the undo cannot read: both undos stop with exit 3
83
+ and an `ERROR: cannot read` line before removing a link or the record. `install.sh`
84
+ used to take an unreadable file for one without the block, remove every link and
85
+ delete the record while the block stayed.
86
+ - **The default block no longer names a private skill.** The last line of the block
87
+ told every user to load `nobrainer-ak` (`nbak`), which is not one of the eighteen
88
+ modules. It now reads: use `nobrainer-writing` for material writing when available,
89
+ with the same guidance on technical documentation, facts, language and verification.
90
+ A block written by 2.3.1 is still recognised as a Flow-managed block of an earlier
91
+ version: the next apply replaces it (through `install.sh` only when the block holds
92
+ no option; `install.py` always, keeping its options), and undo gives back the file
93
+ from before.
94
+ - **npm keeps its release copy beside `~/.nobrainer-tech-flow`, not inside it.** The
95
+ npm command now copies the release to `~/.nobrainer-tech-flow-npm/<version>` (under
96
+ `--home` when given). The README suggests a Git clone in `~/.nobrainer-tech-flow`,
97
+ and a `git clean -fdx` there deleted the copy that the skill links point to. No
98
+ published release wrote the new folder before; an undo that finds only an earlier
99
+ release's copy in `.nobrainer-tech-flow/npm` says so and asks you to undo with the
100
+ release that made the setup.
101
+ - **The Windows hook wrapper finds Git Bash safely.** `hooks/run-hook.cmd` looks for
102
+ Git Bash in its install folders (`%ProgramFiles%`, `%ProgramFiles(x86)%`,
103
+ `%LOCALAPPDATA%\Programs`), then beside the `git.exe` on PATH, then for `bash.exe`
104
+ in the PATH folders only. It no longer runs a `bash.exe` from the current folder. It
105
+ returns the hook's own exit code; it used to report the code from before bash ran.
106
+ Without bash it prints a message on stderr and exits 1, as `session-start` does when
107
+ it cannot add the bootstrap, so the client reports a hook error that blocks nothing
108
+ and the session continues.
109
+ - **Undo handles damaged or rearranged profiles more safely.** A folder in the record
110
+ that now lies under a link (for example `~/.config` replaced by a link after the
111
+ setup) is left where the link points, with a `PRESERVED` line; both undos used to
112
+ remove empty folders of the same name in the other tree. A home that did not exist
113
+ and was made only to hold the record, because `CLAUDE_CONFIG_DIR` or
114
+ `XDG_CONFIG_HOME` put the skills elsewhere, is now listed and removed by undo.
115
+ That home is made before anything else is written, so when it cannot be made the setup
116
+ stops without leaving links or a block that no record describes. A repeat apply keeps the folders an earlier run recorded as they were
117
+ recorded; it used to resolve them again, so a folder swapped for a link to another
118
+ tree passed that tree's folders to the undo, which removed them. A client variable
119
+ that reaches an existing folder through one that does not exist yet (for example
120
+ `CLAUDE_CONFIG_DIR=profile/missing/../config`) no longer gets that existing folder
121
+ recorded as made by the setup, so the undo removes `missing` and `config` and keeps
122
+ `profile`.
123
+ `install.sh` treats a dangling link in place of the older
124
+ `.nobrainer-flow-onboarding.json` as a damaged record and stops with exit 3 instead
125
+ of `NOTHING TO UNDO`, and a record that names a path without a leading slash is
126
+ refused as damaged with exit 3; `install.sh` used to hang on it. On Windows the guided
127
+ undo treats a directory junction like a link and leaves it, with the folder it points
128
+ to; it used to remove the junction. The npm undo looks for a record before it inspects the retained
129
+ copy, so a partial or changed copy no longer blocks the `NOTHING TO UNDO` no-op. In
130
+ Git Bash a recorded folder with `..` is refused as in the other installers; `cygpath`
131
+ used to remove the `..` before the check. The Windows smoke tests also compare the
132
+ paths Git Bash prints by their end, since it spells them its own way.
133
+
134
+ Both installers behave the same. The scripts, the npm command that calls
135
+ `install.py` and the guided `--rollback` read and write one record.
136
+
137
+ ### Instruction fixes
138
+
139
+ Five instruction fixes from a review of 2.3.1 also ship. The README leads with the
140
+ Git install while the npm package is unpublished. Flow owns one corrective-attempt
141
+ budget (two attempts per observed failure), and Build and RCA link to it instead of
142
+ saying three. Dispatcher accepts the worker ID a host returns for a hidden native
143
+ worker as the send receipt, so default delegation can be dispatched; visible sessions
144
+ still go through Sessions. Saying "Use NBFlow" turns on session health observation
145
+ only: a restart or archive needs separate owner consent, and the quick path skips
146
+ startup care. Stale status lines, an undefined "team cap" and two lifecycle names are
147
+ corrected, and every approval-gate list includes contacting people.
148
+
149
+ ## Verification record
150
+
151
+ Local checks on the installer and 2.3.2 metadata (macOS, Python 3.14.5):
152
+
153
+ - `python3 scripts/validate_skills.py` and
154
+ `python3 scripts/validate_skills.py --suite`: both passed.
155
+ - `python3 -m unittest tests.test_shell_installer -v`: 55 tests passed with
156
+ `/bin/sh`, dash, bash in POSIX mode and zsh emulating sh. The new cases cover the
157
+ second undo, the folder list, the block replacement (CRLF line endings, a byte
158
+ order mark and a missing final line break included), the `UP TO DATE` message
159
+ and the file modes, and check that undo gives back the profile as it was.
160
+ - `tests.test_installer` (55 tests), `tests.test_one_command_installer` (29),
161
+ `tests.test_personalization` (36), `tests.test_guided_onboarding` (30, 1 skipped) and
162
+ `tests.test_npm_distribution` (7) passed.
163
+ - `python3 -m unittest discover -s tests -v`: 434 tests ran in 1261 seconds; all
164
+ passed except 2 platform-specific skips. This includes the exported-source
165
+ acceptance check without Git metadata.
166
+ - An end-to-end run of the 2.3.1 and the 2.3.2 scripts in disposable homes, under
167
+ a macOS sandbox that allowed writes only to a scratch folder and no network: 44
168
+ scenarios and 186 installer runs for Codex and OpenCode, with `install.sh`,
169
+ `install.py` and the npm command, on an empty profile and on one that already had
170
+ a mode 0640 instruction file. With 2.3.2, apply, apply again (`UP TO DATE`, no
171
+ restart hint), undo (the profile equal to the starting one apart from the kept
172
+ `.bak` copy, and no `~/.agents` or `~/.config/opencode` left) and a second undo
173
+ (`NOTHING TO UNDO`, exit 0, writes to the home denied by the sandbox) behaved as
174
+ described in all 8 combinations. The same scenarios on 2.3.1 ended the second
175
+ undo with exit 3, and undo left the empty folders in the 6 combinations where
176
+ the setup had created them. Updating a 2.3.1 setup in place with 2.3.2 replaced
177
+ the block in all 4 runs with every other byte unchanged, and undo gave back the
178
+ file from before the setup. A non-empty `~/.agents` stayed after undo.
179
+ - Syntax checks of `scripts/install.sh` in the four shells and `shellcheck -S error`
180
+ passed. The changed Python files compiled, and the npm command read back
181
+ `2.3.2`.
182
+ - A readback of how Codex 0.157.1 names and loads the module, with no model
183
+ involved, as described in the compatibility record below.
184
+ - A current-tree secret scan with the repository's gitleaks configuration found
185
+ no leaks.
186
+
187
+ After the review fixes (macOS, Python 3.14.5):
188
+
189
+ - `python3 scripts/validate_skills.py` and `--suite`: both passed.
190
+ - `python3 -m unittest discover -s tests`: 443 tests ran; all passed except 4
191
+ platform-specific skips. The new regression tests that run on macOS failed on the
192
+ code before their fixes, except the check of the hook wrapper's shell half, which was
193
+ already correct.
194
+ - `bash -n`, `sh -n` and `dash -n` on `scripts/install.sh` and `hooks/run-hook.cmd`, and
195
+ `shellcheck -S error` on `scripts/install.sh`, passed.
196
+ - The batch half of `hooks/run-hook.cmd` and the Git Bash path checks run only on
197
+ Windows; the Windows smoke job in CI is their proof, not this local run.
198
+
199
+ After the undo review fixes (macOS, Python 3.14.5):
200
+
201
+ - `python3 -m unittest tests.test_shell_installer tests.test_installer
202
+ tests.test_one_command_installer`: 150 tests passed. `tests.test_guided_onboarding`
203
+ and `tests.test_personalization`: 67 tests passed, 1 skipped. The three new checks
204
+ (a folder reached through `..`, an unreadable instruction file or backup, and the
205
+ undo of a read-only file) failed on the code before their fixes in 9 subtests.
206
+ - `python3 scripts/validate_skills.py` and `--suite`, `bash -n`, `sh -n` and `dash -n`
207
+ on `scripts/install.sh`, `shellcheck -S error` and `git diff --check`: all passed.
208
+
209
+ These checks prove local installer behavior and package metadata. They do not
210
+ prove publication, a fresh target-client import or a performance gain.
211
+
212
+ ## Scope and distribution
213
+
214
+ This is an installer, documentation and instruction-consistency fix. The module set
215
+ stays at eighteen; module text changes only where the instruction fixes above resolve
216
+ a contradiction. No model-routing or performance change is claimed.
217
+
218
+ Two limits remain. The guided `recommend_flow_setup.py --rollback` with no record
219
+ still exits 3 with `rollback state not found`, and an npm undo that finds a record but
220
+ no retained release files still exits 3. Neither is part of the second-undo case.
221
+
222
+ The Codex naming check covers Codex 0.157.1 on macOS, with a typed name and a linked
223
+ mention sent through `codex exec` to a local stand-in server. It does not show what a
224
+ model does when it sees the plain form in a listing that names the module under the
225
+ plugin, and it did not drive the terminal or desktop mention pickers, other Codex
226
+ versions or operating systems, or a plugin-channel install. The
227
+ [compatibility record](../COMPATIBILITY.md) has the readback.
228
+
229
+ The native plugin 2.3.2 will carry the same installer. Plugin export, publication and
230
+ target-client import each require their own readback. npm registry publication is
231
+ still pending; source release files and a locally packed tarball do not establish
232
+ registry availability.
233
+
234
+ ## Rollback
235
+
236
+ Return to the reviewed v2.3.1 source through the documented preview and undo flow.
237
+ Undo a 2.3.2 setup with 2.3.2 scripts when you can. The 2.3.1 `install.sh` cannot read
238
+ a 2.3.2 record and points you to the Python undo. That undo reads the record and
239
+ removes the links, the block and the record, but it does not know the folder list, so
240
+ the empty folders the setup created stay. A setup recorded by 2.3.1 and undone by
241
+ 2.3.2 leaves them too, because its record has no folder list. Keep retained source
242
+ files while any client links refer to them.
@@ -0,0 +1,126 @@
1
+ # nobrainer-tech-flow 2.4.0: ask before risky commands, and see whether the proof still matches
2
+
3
+ Release date: 2026-10-19.
4
+
5
+ nobrainer-tech-flow can ask before risky commands and shows whether its proof still
6
+ matches your files. The guards are optional and Claude Code only. The rest is
7
+ instruction and helper changes for every client.
8
+
9
+ ## What changes
10
+
11
+ ### Optional Claude Code guards
12
+
13
+ `scripts/install.py --client claude --guards` previews, then with `--apply` adds hooks to
14
+ the Claude Code user settings. The preview names only the hooks it would add or remove
15
+ and the settings path, never other settings. `--undo --apply` removes only hooks whose
16
+ command is exactly one the installer generates. Each change keeps a new backup file, readable
17
+ only by you, and never overwrites an existing one. The hooks run
18
+ `skills/nobrainer-tech-flow/scripts/flow_guard.py` through the skill link.
19
+
20
+ - PreToolUse asks before `rm -r` (also `/bin/rm`) outside temporary folders,
21
+ `git push --force`, `-f`, `--force-with-lease` or a `+branch` refspec,
22
+ `git reset --hard`, `git clean -f`, `vercel --prod`, `npm publish`,
23
+ `terraform apply` or `destroy`, `kubectl delete` and `gh release create`, also with
24
+ global options before the subcommand (`git -C dir push -f`, `npm -w pkg publish`,
25
+ `terraform -chdir=infra apply`, `kubectl -n prod delete`, `gh -R owner/repo release
26
+ create`). A relative `rm` target counts as temporary only when the session's working
27
+ folder is temporary and the command does not change folder first, and a path counts
28
+ by where its links lead, so a temporary folder that links to a project is the project.
29
+ An `rm -r` whose arguments it cannot read, and a single command line too long to check
30
+ (over 2,000 characters) that names one of these tools, are asked about as well. It
31
+ asks; it never denies.
32
+ - Stop and SubagentStop block once when a turn that changed files or ran commands ends
33
+ with no `Proof:` or `Checked:` line and no `UNVERIFIED`.
34
+ - Both fail open on input they cannot read. They are off by default, POSIX only in this
35
+ version, and the plugin hooks stay SessionStart only.
36
+ - Limits: the guard reads command text. A command behind `sh -c`, a variable or an alias
37
+ can pass, other tools such as `pnpm publish` are not matched, and a risky phrase inside
38
+ a quoted string can ask without need. It is a seatbelt, not a security boundary.
39
+
40
+ ### Evidence receipts
41
+
42
+ `skills/nobrainer-sessions/scripts/evidence_receipt.py` runs one command through the
43
+ bounded runner and records a declared input scope before and after. `check` reports
44
+ `CURRENT`, `STALE`, `CHANGED_DURING_RUN` or `UNAVAILABLE` without re-running anything.
45
+ Python 3.11+ and POSIX only; receipts are unsigned and output is stored unredacted. See
46
+ [the reference](../../skills/nobrainer-sessions/references/evidence-receipt.md).
47
+
48
+ The closeout now carries `current for <input snapshot/time or UNKNOWN>`, and a worker's
49
+ `RETURN` line starts with the outcome as the worker understood it.
50
+
51
+ ### Proof contract
52
+
53
+ - Build reports `TEST_SENSITIVITY: PROVEN | PARTLY_PROVEN | NOT_PROVEN | NOT_APPLICABLE`
54
+ for a behavior-preserving rewrite, after seeding one deliberate fault per changed
55
+ behavior class. `NOT_PROVEN` leaves the preservation claim `UNVERIFIED`.
56
+ - Review keeps a "no behavior change" claim open when `TEST_SENSITIVITY` is missing or
57
+ `NOT_PROVEN`, and does not accept `STALE` or `CHANGED_DURING_RUN` evidence as proof of
58
+ the current artifact.
59
+ - Model routing: routine units get the lowest effort that still meets acceptance, workers
60
+ share an assignment prefix with the unit-specific part last (cache reuse is plausible
61
+ but unmeasured), and a unit that reaches its `BUDGET` stops and reports partial results.
62
+ - Security: a plaintext `.env` or credential file in a workspace an agent can read counts
63
+ as secret exposure.
64
+ - Correction hooks: a deterministic failure that a native check can catch gets that check
65
+ as the prevention; a prose rule only when no mechanism fits.
66
+
67
+ ### Instruction debt and one session rule
68
+
69
+ Skill doctor gains a `REPORT_ONLY` instruction-debt audit. `context_candidates.py` reads
70
+ an owner-supplied, redacted history JSON and proposes repeated instructions with the
71
+ history rows they came from; the audit maps accepted candidates to exact `file:line`,
72
+ and the owner approves each change. The visible-session rule now has
73
+ one canonical home in the entry module, and the Dispatcher and Team modules link to it
74
+ instead of restating it.
75
+
76
+ ### Distribution
77
+
78
+ - The README first screen leads with the Claude Code and Codex plugin installs, then the
79
+ Git install for any client.
80
+ - The Codex marketplace is renamed `nobrainer-tech-skills-dev` -> `nobrainer-tech`, like
81
+ the Claude one. If you added it under the old name, follow the
82
+ [migration guide](../MIGRATION_TO_FLOW.md) to remove it and add it again; otherwise the
83
+ old and new plugin stay enabled side by side.
84
+ - Manifests describe one workflow of 18 modules that ends with an evidence handoff.
85
+ - The npm package is still not published on npm. The `npx` commands in
86
+ [INSTALL.md](../INSTALL.md#npm-command) work only after publication.
87
+
88
+ ## Verification record
89
+
90
+ Live client run on 2026-10-18: the guards on Claude Code 2.1.302 with temporary
91
+ `--settings` in a throwaway sandbox. The Stop hook blocked once and the agent added a
92
+ `Proof:` line. The PreToolUse "ask" fired for `git push --force` in default and
93
+ `bypassPermissions` modes; in `-p` mode, where nobody can answer, it became a denial.
94
+
95
+ Local checks on this checkout (macOS, Python 3.14.5):
96
+
97
+ - `python3 scripts/validate_skills.py` and `python3 scripts/validate_skills.py --suite`:
98
+ both passed.
99
+ - `tests.test_adapters`, `tests.test_suite`, `tests.test_npm_distribution` and
100
+ `tests.test_update_check`: 101 tests passed, run without the one test that starts a
101
+ nested full discovery.
102
+ - `python3 -m unittest discover -s tests` on the final commit: 514 tests passed with 5
103
+ platform-specific skips.
104
+ - Two independent review rounds on the whole change, then repeated reviews of the guard,
105
+ the settings backup and the receipts; every finding is fixed with a test that failed
106
+ before the fix.
107
+ - `git diff --check` and a staged-change secret scan with the repository's gitleaks
108
+ configuration found nothing.
109
+
110
+ These checks prove local behavior and package metadata. They do not prove publication,
111
+ a fresh target-client import or a performance gain.
112
+
113
+ ## Scope and distribution
114
+
115
+ No benchmark was run and no model is imposed. The module set stays at eighteen. The
116
+ native plugin 2.4.0 will carry the same files; plugin export, publication and
117
+ target-client import each need their own readback. npm registry publication is still
118
+ pending; source release files and a locally packed tarball do not establish registry
119
+ availability.
120
+
121
+ ## Rollback
122
+
123
+ Return to the reviewed v2.3.2 source through the documented preview and undo flow. Remove
124
+ the guards first with `scripts/install.py --client claude --guards --undo --apply`; they
125
+ point at the skill link, so an old checkout leaves them doing nothing. A Codex user who
126
+ moved to the new marketplace name keeps it, or removes it and re-adds the old name.
@@ -0,0 +1,6 @@
1
+ {
2
+ "name": "nobrainer-tech-flow",
3
+ "description": "From task to done. nobrainer-tech-flow is one workflow of 18 modules for AI coding agents: it scopes the task, delegates ready work, checks the result and hands over the evidence, including what was not checked.",
4
+ "version": "2.4.0",
5
+ "contextFileName": "GEMINI.md"
6
+ }
@@ -0,0 +1,17 @@
1
+ {
2
+ "hooks": {
3
+ "SessionStart": [
4
+ {
5
+ "matcher": "startup|resume|clear|compact|fork",
6
+ "hooks": [
7
+ {
8
+ "type": "command",
9
+ "command": "\"${CLAUDE_PLUGIN_ROOT}/hooks/run-hook.cmd\" session-start",
10
+ "shell": "bash",
11
+ "async": false
12
+ }
13
+ ]
14
+ }
15
+ ]
16
+ }
17
+ }
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 1,
3
+ "hooks": {
4
+ "sessionStart": [
5
+ {
6
+ "command": "\"${CURSOR_PLUGIN_ROOT}/hooks/run-hook.cmd\" session-start"
7
+ }
8
+ ]
9
+ }
10
+ }
@@ -0,0 +1,36 @@
1
+ : << 'CMDBLOCK'
2
+ @echo off
3
+ setlocal
4
+ if "%~1"=="" (
5
+ 1>&2 echo run-hook.cmd: missing hook script name
6
+ exit /b 1
7
+ )
8
+ set "HOOK_DIR=%~dp0"
9
+ set "HOOK_BASH="
10
+ set "HOOK_GIT="
11
+ rem Git Bash from its install folders, or beside the git.exe on PATH. Never a bare "bash",
12
+ rem nor the PATH modifier of a for variable: both try the current folder first, where anyone
13
+ rem could have put a bash.exe. Each PATH folder is checked by name instead. No labels: goto
14
+ rem can miss a label in a file with LF line breaks.
15
+ if defined ProgramFiles if exist "%ProgramFiles%\Git\bin\bash.exe" set "HOOK_BASH=%ProgramFiles%\Git\bin\bash.exe"
16
+ if not defined HOOK_BASH if defined ProgramFiles(x86) if exist "%ProgramFiles(x86)%\Git\bin\bash.exe" set "HOOK_BASH=%ProgramFiles(x86)%\Git\bin\bash.exe"
17
+ if not defined HOOK_BASH if defined LOCALAPPDATA if exist "%LOCALAPPDATA%\Programs\Git\bin\bash.exe" set "HOOK_BASH=%LOCALAPPDATA%\Programs\Git\bin\bash.exe"
18
+ if not defined HOOK_BASH if defined PATH for %%P in ("%PATH:;=" "%") do if not defined HOOK_GIT if not "%%~P"=="" if exist "%%~P\git.exe" set "HOOK_GIT=%%~P\git.exe"
19
+ if defined HOOK_GIT for %%D in ("%HOOK_GIT%\..\..") do if exist "%%~fD\bin\bash.exe" set "HOOK_BASH=%%~fD\bin\bash.exe"
20
+ if not defined HOOK_BASH if defined PATH for %%P in ("%PATH:;=" "%") do if not defined HOOK_BASH if not "%%~P"=="" if exist "%%~P\bash.exe" set "HOOK_BASH=%%~P\bash.exe"
21
+ rem Without bash, exit 1 as session-start does when it cannot add the bootstrap: the client
22
+ rem reports a hook error that blocks nothing, and the session goes on.
23
+ if not defined HOOK_BASH (
24
+ 1>&2 echo nobrainer-tech-flow: the session hook needs Git Bash, which was not found. Install Git for Windows from https://git-scm.com/download/win. This session continues without the Flow bootstrap.
25
+ exit /b 1
26
+ )
27
+ "%HOOK_BASH%" "%HOOK_DIR%%~1" %2 %3 %4 %5 %6 %7 %8 %9
28
+ rem On a line of its own: inside a parenthesised block ERRORLEVEL is read before bash runs.
29
+ exit /b %ERRORLEVEL%
30
+ CMDBLOCK
31
+
32
+ set -e
33
+ script_dir="$(cd "$(dirname "$0")" && pwd)"
34
+ script_name="${1:?missing hook script name}"
35
+ shift
36
+ exec bash "${script_dir}/${script_name}" "$@"
@@ -0,0 +1,38 @@
1
+ #!/usr/bin/env bash
2
+
3
+ set -euo pipefail
4
+
5
+ script_path="${BASH_SOURCE[0]:-$0}"
6
+ case "${OSTYPE:-}" in
7
+ # Windows hosts may pass a backslash path; dirname only splits on slashes.
8
+ msys* | cygwin* | win32*) script_path="${script_path//\\//}" ;;
9
+ esac
10
+ script_dir="$(cd "$(dirname "${script_path}")" && pwd)"
11
+ plugin_root="$(cd "${script_dir}/.." && pwd)"
12
+ bootstrap_path="${plugin_root}/adapters/bootstrap.md"
13
+
14
+ if [ ! -f "$bootstrap_path" ]; then
15
+ printf 'NoBrainer hook: missing adapters/bootstrap.md\n' >&2
16
+ exit 1
17
+ fi
18
+
19
+ escape_for_json() {
20
+ local value="$1"
21
+ value="${value//\\/\\\\}"
22
+ value="${value//\"/\\\"}"
23
+ value="${value//$'\n'/\\n}"
24
+ value="${value//$'\r'/\\r}"
25
+ value="${value//$'\t'/\\t}"
26
+ printf '%s' "$value"
27
+ }
28
+
29
+ session_context="$(escape_for_json "$(<"$bootstrap_path")")"
30
+
31
+ if [ -n "${CURSOR_PLUGIN_ROOT:-}" ]; then
32
+ printf '{"additional_context":"%s"}\n' "$session_context"
33
+ elif [ -n "${CLAUDE_PLUGIN_ROOT:-}" ]; then
34
+ printf '{"hookSpecificOutput":{"hookEventName":"SessionStart","additionalContext":"%s"}}\n' "$session_context"
35
+ else
36
+ printf 'NoBrainer hook: unsupported SessionStart host\n' >&2
37
+ exit 1
38
+ fi
package/package.json CHANGED
@@ -1,6 +1,71 @@
1
1
  {
2
2
  "name": "nobrainer-tech-flow",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "2.4.0",
4
+ "description": "From task to done. nobrainer-tech-flow is one workflow of 18 modules for AI coding agents: it scopes the task, delegates ready work, checks the result and hands over the evidence, including what was not checked.",
5
+ "type": "module",
6
+ "main": ".opencode/plugins/nobrainer-tech-skills.js",
7
+ "keywords": [
8
+ "agent-skills",
9
+ "agentic-workflows",
10
+ "claude-code",
11
+ "codex",
12
+ "verification",
13
+ "spec-driven-development",
14
+ "multi-agent",
15
+ "cursor",
16
+ "gemini-cli",
17
+ "opencode",
18
+ "pi-package"
19
+ ],
20
+ "pi": {
21
+ "extensions": [
22
+ "./.pi/extensions/nobrainer-tech-skills.js"
23
+ ],
24
+ "skills": [
25
+ "./skills"
26
+ ]
27
+ },
28
+ "license": "MIT",
29
+ "bin": {
30
+ "nobrainer-tech-flow": "bin/nobrainer-tech-flow.mjs"
31
+ },
32
+ "repository": {
33
+ "type": "git",
34
+ "url": "git+https://github.com/nobrainer-tech/nobrainer-tech-flow.git"
35
+ },
36
+ "homepage": "https://nobrainer.tech/flow/",
37
+ "bugs": {
38
+ "url": "https://github.com/nobrainer-tech/nobrainer-tech-flow/issues"
39
+ },
40
+ "engines": {
41
+ "node": ">=18"
42
+ },
43
+ "files": [
44
+ "bin/",
45
+ "skills/",
46
+ "scripts/",
47
+ "adapters/",
48
+ ".opencode/",
49
+ ".pi/",
50
+ ".codex-plugin/",
51
+ ".claude-plugin/",
52
+ ".agents/plugins/",
53
+ "plugin.json",
54
+ "gemini-extension.json",
55
+ "README.md",
56
+ "LICENSE",
57
+ "SECURITY.md",
58
+ "AGENTS.md",
59
+ "CLAUDE.md",
60
+ "CONTRIBUTING.md",
61
+ "GEMINI.md",
62
+ "docs/*.md",
63
+ "docs/releases/*.md",
64
+ "hooks/",
65
+ "assets/*.svg",
66
+ "assets/*.png"
67
+ ],
68
+ "publishConfig": {
69
+ "access": "public"
70
+ }
71
+ }