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.
- package/.agents/plugins/marketplace.json +20 -0
- package/.claude-plugin/marketplace.json +18 -0
- package/.claude-plugin/plugin.json +21 -0
- package/.codex-plugin/plugin.json +47 -0
- package/.opencode/INSTALL.md +37 -0
- package/.opencode/plugins/nobrainer-tech-skills.js +66 -0
- package/.pi/extensions/nobrainer-tech-skills.js +64 -0
- package/AGENTS.md +204 -0
- package/CLAUDE.md +204 -0
- package/CONTRIBUTING.md +70 -0
- package/GEMINI.md +1 -0
- package/LICENSE +21 -0
- package/README.md +658 -2
- package/SECURITY.md +33 -0
- package/adapters/bootstrap.md +27 -0
- package/assets/nobrainer-tech-logo.svg +1 -0
- package/assets/nobrainer-workflow.svg +155 -0
- package/assets/plugin-logo.png +0 -0
- package/bin/nobrainer-tech-flow.mjs +48 -0
- package/docs/BOUNDED_RUNNER.md +60 -0
- package/docs/CHAT_PLUGINS.md +29 -0
- package/docs/COMPATIBILITY.md +371 -0
- package/docs/INSTALL.md +626 -0
- package/docs/MIGRATION_TO_FLOW.md +117 -0
- package/docs/NAMING.md +39 -0
- package/docs/PRIVACY.md +9 -0
- package/docs/SESSION_RESTART.md +70 -0
- package/docs/SKILL_CURATION.md +124 -0
- package/docs/TESTING.md +232 -0
- package/docs/TRY_IT.md +109 -0
- package/docs/releases/v1.0.0.md +81 -0
- package/docs/releases/v1.1.0.md +85 -0
- package/docs/releases/v1.10.0.md +34 -0
- package/docs/releases/v1.11.0-publication-readback.md +25 -0
- package/docs/releases/v1.11.0.md +42 -0
- package/docs/releases/v1.12.0.md +30 -0
- package/docs/releases/v1.13.0.md +46 -0
- package/docs/releases/v1.14.0.md +43 -0
- package/docs/releases/v1.14.1.md +21 -0
- package/docs/releases/v1.2.0.md +87 -0
- package/docs/releases/v1.2.1.md +92 -0
- package/docs/releases/v1.3.0-publication-readback.md +69 -0
- package/docs/releases/v1.3.0.md +66 -0
- package/docs/releases/v1.3.1-publication-readback.md +76 -0
- package/docs/releases/v1.3.1.md +59 -0
- package/docs/releases/v1.4.0-publication-readback.md +81 -0
- package/docs/releases/v1.4.0.md +43 -0
- package/docs/releases/v1.5.0-publication-readback.md +76 -0
- package/docs/releases/v1.5.0.md +54 -0
- package/docs/releases/v1.6.0.md +64 -0
- package/docs/releases/v1.6.1-publication-readback.md +53 -0
- package/docs/releases/v1.6.1.md +82 -0
- package/docs/releases/v1.7.0.md +42 -0
- package/docs/releases/v1.7.1-publication-readback.md +64 -0
- package/docs/releases/v1.7.1.md +49 -0
- package/docs/releases/v1.8.0.md +63 -0
- package/docs/releases/v1.8.1.md +32 -0
- package/docs/releases/v1.9.0.md +33 -0
- package/docs/releases/v2.0.0-candidate.md +28 -0
- package/docs/releases/v2.0.0.md +53 -0
- package/docs/releases/v2.0.1.md +135 -0
- package/docs/releases/v2.0.2.md +189 -0
- package/docs/releases/v2.1.0.md +64 -0
- package/docs/releases/v2.1.1.md +43 -0
- package/docs/releases/v2.2.0.md +64 -0
- package/docs/releases/v2.2.1.md +11 -0
- package/docs/releases/v2.3.0.md +97 -0
- package/docs/releases/v2.3.1.md +71 -0
- package/docs/releases/v2.3.2.md +242 -0
- package/docs/releases/v2.4.0.md +126 -0
- package/gemini-extension.json +6 -0
- package/hooks/claude-hooks.json +17 -0
- package/hooks/hooks-cursor.json +10 -0
- package/hooks/run-hook.cmd +36 -0
- package/hooks/session-start +38 -0
- package/package.json +69 -4
- package/plugin.json +51 -0
- package/scripts/build_plugin.py +50 -0
- package/scripts/check_flow_update.py +18 -0
- package/scripts/check_public_commit.py +86 -0
- package/scripts/fetch_public_refs.py +69 -0
- package/scripts/install.py +600 -0
- package/scripts/install.sh +1392 -0
- package/scripts/install_guards.py +279 -0
- package/scripts/install_personalization.py +527 -0
- package/scripts/install_skills.py +951 -0
- package/scripts/npm_install.py +85 -0
- package/scripts/recommend_flow_setup.py +1522 -0
- package/scripts/validate_skills.py +465 -0
- package/skills/nobrainer-auto-fine-tune/SKILL.md +79 -0
- package/skills/nobrainer-auto-fine-tune/references/capacity-audit.md +49 -0
- package/skills/nobrainer-autoimprove/SKILL.md +212 -0
- package/skills/nobrainer-autoimprove/scripts/count_words.py +22 -0
- package/skills/nobrainer-browser/SKILL.md +234 -0
- package/skills/nobrainer-browser/references/cdp-profile-restart.md +93 -0
- package/skills/nobrainer-build/SKILL.md +173 -0
- package/skills/nobrainer-codex-context/SKILL.md +111 -0
- package/skills/nobrainer-codex-context/scripts/codex_context.py +175 -0
- package/skills/nobrainer-decide/SKILL.md +198 -0
- package/skills/nobrainer-dispatcher/SKILL.md +256 -0
- package/skills/nobrainer-dispatcher/agents/openai.yaml +4 -0
- package/skills/nobrainer-rca/SKILL.md +163 -0
- package/skills/nobrainer-research/SKILL.md +131 -0
- package/skills/nobrainer-review/SKILL.md +195 -0
- package/skills/nobrainer-security/SKILL.md +166 -0
- package/skills/nobrainer-sessions/SKILL.md +223 -0
- package/skills/nobrainer-sessions/references/evidence-receipt.md +55 -0
- package/skills/nobrainer-sessions/references/protocol.md +337 -0
- package/skills/nobrainer-sessions/references/session-restart.md +255 -0
- package/skills/nobrainer-sessions/scripts/evidence_receipt.py +373 -0
- package/skills/nobrainer-sessions/scripts/restart_gate.py +140 -0
- package/skills/nobrainer-sessions/scripts/run_bounded.py +390 -0
- package/skills/nobrainer-sessions/scripts/session_title.py +43 -0
- package/skills/nobrainer-skill-doctor/SKILL.md +149 -0
- package/skills/nobrainer-skill-doctor/references/astra.md +19 -0
- package/skills/nobrainer-skill-doctor/scripts/audit.py +100 -0
- package/skills/nobrainer-skill-doctor/scripts/context_candidates.py +133 -0
- package/skills/nobrainer-spec-driven-development/SKILL.md +132 -0
- package/skills/nobrainer-spec-driven-development/references/spec-template.md +114 -0
- package/skills/nobrainer-team/SKILL.md +165 -0
- package/skills/nobrainer-team/references/team-plan.md +64 -0
- package/skills/nobrainer-tech-flow/SKILL.md +239 -0
- package/skills/nobrainer-tech-flow/VERSION +1 -0
- package/skills/nobrainer-tech-flow/references/autopilot.md +72 -0
- package/skills/nobrainer-tech-flow/references/codex-routing.md +21 -0
- package/skills/nobrainer-tech-flow/references/communication.md +108 -0
- package/skills/nobrainer-tech-flow/references/correction-hooks.md +110 -0
- package/skills/nobrainer-tech-flow/references/daily-update.md +28 -0
- package/skills/nobrainer-tech-flow/references/delivery.md +243 -0
- package/skills/nobrainer-tech-flow/references/idea-to-delivery.md +82 -0
- package/skills/nobrainer-tech-flow/references/long-run-state.md +209 -0
- package/skills/nobrainer-tech-flow/references/model-routing.md +83 -0
- package/skills/nobrainer-tech-flow/references/optional-decisions.md +83 -0
- package/skills/nobrainer-tech-flow/references/project-start.md +22 -0
- package/skills/nobrainer-tech-flow/references/routing.md +125 -0
- package/skills/nobrainer-tech-flow/references/setup.md +180 -0
- package/skills/nobrainer-tech-flow/references/worktrees.md +138 -0
- package/skills/nobrainer-tech-flow/scripts/check_flow_update.py +298 -0
- package/skills/nobrainer-tech-flow/scripts/cleanup_worktree.py +327 -0
- package/skills/nobrainer-tech-flow/scripts/decision_config.py +107 -0
- package/skills/nobrainer-tech-flow/scripts/flow_guard.py +252 -0
- package/skills/nobrainer-tech-flow/scripts/typed_decisions.py +210 -0
- package/skills/nobrainer-wiki/SKILL.md +164 -0
- package/skills/nobrainer-wiki/references/setup.md +88 -0
- package/skills/nobrainer-writing/SKILL.md +272 -0
- package/skills/nobrainer-writing/agents/openai.yaml +4 -0
- package/skills/nobrainer-writing/references/brief-artifacts.md +357 -0
- package/skills/nobrainer-writing/references/plain-technical-english.md +76 -0
- 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,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": "
|
|
4
|
-
"
|
|
5
|
-
"
|
|
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
|
+
}
|