Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 5 additions & 3 deletions .claude/rules/architecture-map.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -70,8 +70,10 @@ shell (or, in parallel, in per-test `.result` files aggregated at the end).
| `state/context.sh` | per-test output buffer, exit code, title, hook failure, and the per-test reset |
| `state/payload.sh` | the encoded per-test result payload and the base64 capability probe |
| `state/parallel.sh` | aggregating per-test result files after a `--parallel` run |
| `env.sh` | all `BASHUNIT_*` defaults/config files, scratch dirs (`_BASHUNIT_RUN_OUTPUT_DIR` + EXIT-trap cleanup) |
| `parallel.sh` | worker temp tree, aggregation, stop-on-failure flag file |
| `config/index.sh` | aggregator only β€” sources the `src/config/` module below |
| `config/env.sh` | all `BASHUNIT_*` defaults/config files, scratch dirs (`_BASHUNIT_RUN_OUTPUT_DIR` + EXIT-trap cleanup); executes at source time |
| `config/rerun.sh` | the `.bashunit/last-failed` cache for `--rerun-failed` |
| `config/parallel.sh` | is this run parallel; worker temp tree and stop-on-failure flag file (not `runner/parallel.sh`, which waits on job slots) |
| `console/index.sh` | aggregator only β€” sources the `src/console/` module below |
| `console/colors.sh` | the `_BASHUNIT_COLOR_*` palette and `bashunit::sgr` |
| `console/header.sh` | the "Running N tests" header |
Expand DownExpand Up@@ -104,7 +106,7 @@ shell (or, in parallel, in per-test `.result` files aggregated at the end).
| `coverage/branches.sh` | branch extraction + hit computation; **one file on purpose** β€” the `_branch_*` helpers mutate `extract_branches`'s locals via dynamic scoping |
| `coverage/report_text.sh` / `report_lcov.sh` / `report_html.sh` | the three renderers |
| `coverage/html_index.sh` / `html_file.sh` | HTML page emitters; the only two files exempt from `max_line_length` |
| `rerun.sh` | `.bashunit/last-failed` cache for `--rerun-failed` |

| `reports.sh` | JUnit/HTML/TAP/JSON writers |
| `system/index.sh` | aggregator only β€” sources the `src/system/` module below |
| `system/check_os.sh` / `system/dependencies.sh` | one-fork OS detect; `command -v` probes (builtins, not forks) |
Expand Down
4 changes: 1 addition & 3 deletions bashunit
Original file line numberDiff line numberDiff line change
Expand Up@@ -68,16 +68,14 @@ source "$BASHUNIT_ROOT_DIR/src/dev/debug.sh"
source "$BASHUNIT_ROOT_DIR/src/system/index.sh"
source "$BASHUNIT_ROOT_DIR/src/util/index.sh"
source "$BASHUNIT_ROOT_DIR/src/api/index.sh"
source "$BASHUNIT_ROOT_DIR/src/parallel.sh"
source "$BASHUNIT_ROOT_DIR/src/env.sh"
source "$BASHUNIT_ROOT_DIR/src/config/index.sh"
source "$BASHUNIT_ROOT_DIR/src/coverage/index.sh"
source "$BASHUNIT_ROOT_DIR/src/state/index.sh"
source "$BASHUNIT_ROOT_DIR/src/console/index.sh"
source "$BASHUNIT_ROOT_DIR/src/helper/index.sh"
source "$BASHUNIT_ROOT_DIR/src/cli/index.sh"
source "$BASHUNIT_ROOT_DIR/src/assert/index.sh"
source "$BASHUNIT_ROOT_DIR/src/reports/index.sh"
source "$BASHUNIT_ROOT_DIR/src/rerun.sh"
source "$BASHUNIT_ROOT_DIR/src/runner/index.sh"
source "$BASHUNIT_ROOT_DIR/src/benchmark.sh"
source "$BASHUNIT_ROOT_DIR/src/learn/index.sh"
Expand Down
2 changes: 1 addition & 1 deletion build.sh
Original file line numberDiff line numberDiff line change
Expand Up@@ -72,7 +72,7 @@ function build::process_file() {

# Key the dedupe and the marker on a repo-relative path, never a basename: the
# top-level loop passes `src/x.sh` while the recursion passes an absolute path,
# and two modules can hold the same basename (src/parallel.sh vs
# and two modules can hold the same basename (src/config/parallel.sh vs
# src/runner/parallel.sh). `$file` itself stays untouched so the `tail` and
# `dirname` below work on whichever form the caller passed.
local marker="${file#"$BASHUNIT_ROOT_DIR"/}"
Expand Down
File renamed without changes.
23 changes: 23 additions & 0 deletions src/config/index.sh
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
#!/usr/bin/env bash

# Entry point for the src/config/ module: only `source` lines and comments belong
# here. build.sh emits a file's body before recursing into its `source` lines, so
# any statement here would run before its dependencies in the built binary
# (adrs/adr-010-src-module-directories.md).
#
# Run-scoped configuration and the state a run persists: every BASHUNIT_* default
# and its scratch dirs (env), whether this run is parallel and its stop flag
# (parallel), and the last-failed cache the next run reads (rerun). They cluster
# for real -- env reads rerun's setting, parallel reads env's.
#
# env.sh is the one file here that executes at source time: it loads .bashunitrc
# and .env and creates the scratch dirs. Its file-scope block calls only
# bashunit::env:: functions defined above it in the same file, so the order below
# is free -- but this module must stay where parallel.sh and env.sh sat, ahead of
# console/, whose palette is built at file scope from these values.
#
# Note src/config/parallel.sh is a different concern from src/runner/parallel.sh:
# this one answers "is this run parallel", that one waits on job slots.
source "$BASHUNIT_ROOT_DIR/src/config/parallel.sh"
source "$BASHUNIT_ROOT_DIR/src/config/env.sh"
source "$BASHUNIT_ROOT_DIR/src/config/rerun.sh"
File renamed without changes.
File renamed without changes.
2 changes: 1 addition & 1 deletion tests/unit/build_test.sh
Original file line numberDiff line numberDiff line change
Expand Up@@ -238,7 +238,7 @@ function test_build_process_file_emits_a_file_before_the_files_it_sources() {

# The embed dedupe keys on the repo-relative path (#923). Two modules holding the
# same basename must both survive -- the situation every further module split
# creates (src/parallel.sh vs src/runner/parallel.sh today).
# creates (src/config/parallel.sh vs src/runner/parallel.sh today).
function test_build_process_file_embeds_same_basename_from_two_module_dirs() {
local dir
dir=$(bashunit::temp_dir)
Expand Down
2 changes: 1 addition & 1 deletion tests/unit/env_deprecated_aliases_test.sh
Original file line numberDiff line numberDiff line change
Expand Up@@ -9,7 +9,7 @@
# Every `: "${BASHUNIT_X:=${X:=...}}"` line in env.sh declares an unprefixed
# alias for X. That is the source of truth.
function bashunit::test::aliases_declared_in_env_sh() {
grep -oE '^: "\$\{BASHUNIT_[A-Z0-9_]+:=\$\{[A-Z0-9_]+:=' src/env.sh |
grep -oE '^: "\$\{BASHUNIT_[A-Z0-9_]+:=\$\{[A-Z0-9_]+:=' src/config/env.sh |
sed -E 's/^: "\$\{BASHUNIT_[A-Z0-9_]+:=\$\{([A-Z0-9_]+):=$/\1/' |
sort
}
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 5 additions & 3 deletions .claude/rules/architecture-map.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -70,8 +70,10 @@ shell (or, in parallel, in per-test `.result` files aggregated at the end).
| `state/context.sh` | per-test output buffer, exit code, title, hook failure, and the per-test reset |
| `state/payload.sh` | the encoded per-test result payload and the base64 capability probe |
| `state/parallel.sh` | aggregating per-test result files after a `--parallel` run |
| `env.sh` | all `BASHUNIT_*` defaults/config files, scratch dirs (`_BASHUNIT_RUN_OUTPUT_DIR` + EXIT-trap cleanup) |
| `parallel.sh` | worker temp tree, aggregation, stop-on-failure flag file |
| `config/index.sh` | aggregator only β€” sources the `src/config/` module below |
| `config/env.sh` | all `BASHUNIT_*` defaults/config files, scratch dirs (`_BASHUNIT_RUN_OUTPUT_DIR` + EXIT-trap cleanup); executes at source time |
| `config/rerun.sh` | the `.bashunit/last-failed` cache for `--rerun-failed` |
| `config/parallel.sh` | is this run parallel; worker temp tree and stop-on-failure flag file (not `runner/parallel.sh`, which waits on job slots) |
| `console/index.sh` | aggregator only β€” sources the `src/console/` module below |
| `console/colors.sh` | the `_BASHUNIT_COLOR_*` palette and `bashunit::sgr` |
| `console/header.sh` | the "Running N tests" header |
Expand DownExpand Up@@ -104,7 +106,7 @@ shell (or, in parallel, in per-test `.result` files aggregated at the end).
| `coverage/branches.sh` | branch extraction + hit computation; **one file on purpose** β€” the `_branch_*` helpers mutate `extract_branches`'s locals via dynamic scoping |
| `coverage/report_text.sh` / `report_lcov.sh` / `report_html.sh` | the three renderers |
| `coverage/html_index.sh` / `html_file.sh` | HTML page emitters; the only two files exempt from `max_line_length` |
| `rerun.sh` | `.bashunit/last-failed` cache for `--rerun-failed` |

| `reports.sh` | JUnit/HTML/TAP/JSON writers |
| `system/index.sh` | aggregator only β€” sources the `src/system/` module below |
| `system/check_os.sh` / `system/dependencies.sh` | one-fork OS detect; `command -v` probes (builtins, not forks) |
Expand Down
4 changes: 1 addition & 3 deletions bashunit
Original file line numberDiff line numberDiff line change
Expand Up@@ -68,16 +68,14 @@ source "$BASHUNIT_ROOT_DIR/src/dev/debug.sh"
source "$BASHUNIT_ROOT_DIR/src/system/index.sh"
source "$BASHUNIT_ROOT_DIR/src/util/index.sh"
source "$BASHUNIT_ROOT_DIR/src/api/index.sh"
source "$BASHUNIT_ROOT_DIR/src/parallel.sh"
source "$BASHUNIT_ROOT_DIR/src/env.sh"
source "$BASHUNIT_ROOT_DIR/src/config/index.sh"
source "$BASHUNIT_ROOT_DIR/src/coverage/index.sh"
source "$BASHUNIT_ROOT_DIR/src/state/index.sh"
source "$BASHUNIT_ROOT_DIR/src/console/index.sh"
source "$BASHUNIT_ROOT_DIR/src/helper/index.sh"
source "$BASHUNIT_ROOT_DIR/src/cli/index.sh"
source "$BASHUNIT_ROOT_DIR/src/assert/index.sh"
source "$BASHUNIT_ROOT_DIR/src/reports/index.sh"
source "$BASHUNIT_ROOT_DIR/src/rerun.sh"
source "$BASHUNIT_ROOT_DIR/src/runner/index.sh"
source "$BASHUNIT_ROOT_DIR/src/benchmark.sh"
source "$BASHUNIT_ROOT_DIR/src/learn/index.sh"
Expand Down
2 changes: 1 addition & 1 deletion build.sh
Original file line numberDiff line numberDiff line change
Expand Up@@ -72,7 +72,7 @@ function build::process_file() {

# Key the dedupe and the marker on a repo-relative path, never a basename: the
# top-level loop passes `src/x.sh` while the recursion passes an absolute path,
# and two modules can hold the same basename (src/parallel.sh vs
# and two modules can hold the same basename (src/config/parallel.sh vs
# src/runner/parallel.sh). `$file` itself stays untouched so the `tail` and
# `dirname` below work on whichever form the caller passed.
local marker="${file#"$BASHUNIT_ROOT_DIR"/}"
Expand Down
File renamed without changes.
23 changes: 23 additions & 0 deletions src/config/index.sh
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
#!/usr/bin/env bash

# Entry point for the src/config/ module: only `source` lines and comments belong
# here. build.sh emits a file's body before recursing into its `source` lines, so
# any statement here would run before its dependencies in the built binary
# (adrs/adr-010-src-module-directories.md).
#
# Run-scoped configuration and the state a run persists: every BASHUNIT_* default
# and its scratch dirs (env), whether this run is parallel and its stop flag
# (parallel), and the last-failed cache the next run reads (rerun). They cluster
# for real -- env reads rerun's setting, parallel reads env's.
#
# env.sh is the one file here that executes at source time: it loads .bashunitrc
# and .env and creates the scratch dirs. Its file-scope block calls only
# bashunit::env:: functions defined above it in the same file, so the order below
# is free -- but this module must stay where parallel.sh and env.sh sat, ahead of
# console/, whose palette is built at file scope from these values.
#
# Note src/config/parallel.sh is a different concern from src/runner/parallel.sh:
# this one answers "is this run parallel", that one waits on job slots.
source "$BASHUNIT_ROOT_DIR/src/config/parallel.sh"
source "$BASHUNIT_ROOT_DIR/src/config/env.sh"
source "$BASHUNIT_ROOT_DIR/src/config/rerun.sh"
File renamed without changes.
File renamed without changes.
2 changes: 1 addition & 1 deletion tests/unit/build_test.sh
Original file line numberDiff line numberDiff line change
Expand Up@@ -238,7 +238,7 @@ function test_build_process_file_emits_a_file_before_the_files_it_sources() {

# The embed dedupe keys on the repo-relative path (#923). Two modules holding the
# same basename must both survive -- the situation every further module split
# creates (src/parallel.sh vs src/runner/parallel.sh today).
# creates (src/config/parallel.sh vs src/runner/parallel.sh today).
function test_build_process_file_embeds_same_basename_from_two_module_dirs() {
local dir
dir=$(bashunit::temp_dir)
Expand Down
2 changes: 1 addition & 1 deletion tests/unit/env_deprecated_aliases_test.sh
Original file line numberDiff line numberDiff line change
Expand Up@@ -9,7 +9,7 @@
# Every `: "${BASHUNIT_X:=${X:=...}}"` line in env.sh declares an unprefixed
# alias for X. That is the source of truth.
function bashunit::test::aliases_declared_in_env_sh() {
grep -oE '^: "\$\{BASHUNIT_[A-Z0-9_]+:=\$\{[A-Z0-9_]+:=' src/env.sh |
grep -oE '^: "\$\{BASHUNIT_[A-Z0-9_]+:=\$\{[A-Z0-9_]+:=' src/config/env.sh |
sed -E 's/^: "\$\{BASHUNIT_[A-Z0-9_]+:=\$\{([A-Z0-9_]+):=$/\1/' |
sort
}
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 5 additions & 3 deletions .claude/rules/architecture-map.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -70,8 +70,10 @@ shell (or, in parallel, in per-test `.result` files aggregated at the end).
| `state/context.sh` | per-test output buffer, exit code, title, hook failure, and the per-test reset |
| `state/payload.sh` | the encoded per-test result payload and the base64 capability probe |
| `state/parallel.sh` | aggregating per-test result files after a `--parallel` run |
| `env.sh` | all `BASHUNIT_*` defaults/config files, scratch dirs (`_BASHUNIT_RUN_OUTPUT_DIR` + EXIT-trap cleanup) |
| `parallel.sh` | worker temp tree, aggregation, stop-on-failure flag file |
| `config/index.sh` | aggregator only β€” sources the `src/config/` module below |
| `config/env.sh` | all `BASHUNIT_*` defaults/config files, scratch dirs (`_BASHUNIT_RUN_OUTPUT_DIR` + EXIT-trap cleanup); executes at source time |
| `config/rerun.sh` | the `.bashunit/last-failed` cache for `--rerun-failed` |
| `config/parallel.sh` | is this run parallel; worker temp tree and stop-on-failure flag file (not `runner/parallel.sh`, which waits on job slots) |
| `console/index.sh` | aggregator only β€” sources the `src/console/` module below |
| `console/colors.sh` | the `_BASHUNIT_COLOR_*` palette and `bashunit::sgr` |
| `console/header.sh` | the "Running N tests" header |
Expand DownExpand Up@@ -104,7 +106,7 @@ shell (or, in parallel, in per-test `.result` files aggregated at the end).
| `coverage/branches.sh` | branch extraction + hit computation; **one file on purpose** β€” the `_branch_*` helpers mutate `extract_branches`'s locals via dynamic scoping |
| `coverage/report_text.sh` / `report_lcov.sh` / `report_html.sh` | the three renderers |
| `coverage/html_index.sh` / `html_file.sh` | HTML page emitters; the only two files exempt from `max_line_length` |
| `rerun.sh` | `.bashunit/last-failed` cache for `--rerun-failed` |

| `reports.sh` | JUnit/HTML/TAP/JSON writers |
| `system/index.sh` | aggregator only β€” sources the `src/system/` module below |
| `system/check_os.sh` / `system/dependencies.sh` | one-fork OS detect; `command -v` probes (builtins, not forks) |
Expand Down
4 changes: 1 addition & 3 deletions bashunit
Original file line numberDiff line numberDiff line change
Expand Up@@ -68,16 +68,14 @@ source "$BASHUNIT_ROOT_DIR/src/dev/debug.sh"
source "$BASHUNIT_ROOT_DIR/src/system/index.sh"
source "$BASHUNIT_ROOT_DIR/src/util/index.sh"
source "$BASHUNIT_ROOT_DIR/src/api/index.sh"
source "$BASHUNIT_ROOT_DIR/src/parallel.sh"
source "$BASHUNIT_ROOT_DIR/src/env.sh"
source "$BASHUNIT_ROOT_DIR/src/config/index.sh"
source "$BASHUNIT_ROOT_DIR/src/coverage/index.sh"
source "$BASHUNIT_ROOT_DIR/src/state/index.sh"
source "$BASHUNIT_ROOT_DIR/src/console/index.sh"
source "$BASHUNIT_ROOT_DIR/src/helper/index.sh"
source "$BASHUNIT_ROOT_DIR/src/cli/index.sh"
source "$BASHUNIT_ROOT_DIR/src/assert/index.sh"
source "$BASHUNIT_ROOT_DIR/src/reports/index.sh"
source "$BASHUNIT_ROOT_DIR/src/rerun.sh"
source "$BASHUNIT_ROOT_DIR/src/runner/index.sh"
source "$BASHUNIT_ROOT_DIR/src/benchmark.sh"
source "$BASHUNIT_ROOT_DIR/src/learn/index.sh"
Expand Down
2 changes: 1 addition & 1 deletion build.sh
Original file line numberDiff line numberDiff line change
Expand Up@@ -72,7 +72,7 @@ function build::process_file() {

# Key the dedupe and the marker on a repo-relative path, never a basename: the
# top-level loop passes `src/x.sh` while the recursion passes an absolute path,
# and two modules can hold the same basename (src/parallel.sh vs
# and two modules can hold the same basename (src/config/parallel.sh vs
# src/runner/parallel.sh). `$file` itself stays untouched so the `tail` and
# `dirname` below work on whichever form the caller passed.
local marker="${file#"$BASHUNIT_ROOT_DIR"/}"
Expand Down
File renamed without changes.
23 changes: 23 additions & 0 deletions src/config/index.sh
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
#!/usr/bin/env bash

# Entry point for the src/config/ module: only `source` lines and comments belong
# here. build.sh emits a file's body before recursing into its `source` lines, so
# any statement here would run before its dependencies in the built binary
# (adrs/adr-010-src-module-directories.md).
#
# Run-scoped configuration and the state a run persists: every BASHUNIT_* default
# and its scratch dirs (env), whether this run is parallel and its stop flag
# (parallel), and the last-failed cache the next run reads (rerun). They cluster
# for real -- env reads rerun's setting, parallel reads env's.
#
# env.sh is the one file here that executes at source time: it loads .bashunitrc
# and .env and creates the scratch dirs. Its file-scope block calls only
# bashunit::env:: functions defined above it in the same file, so the order below
# is free -- but this module must stay where parallel.sh and env.sh sat, ahead of
# console/, whose palette is built at file scope from these values.
#
# Note src/config/parallel.sh is a different concern from src/runner/parallel.sh:
# this one answers "is this run parallel", that one waits on job slots.
source "$BASHUNIT_ROOT_DIR/src/config/parallel.sh"
source "$BASHUNIT_ROOT_DIR/src/config/env.sh"
source "$BASHUNIT_ROOT_DIR/src/config/rerun.sh"
File renamed without changes.
File renamed without changes.
2 changes: 1 addition & 1 deletion tests/unit/build_test.sh
Original file line numberDiff line numberDiff line change
Expand Up@@ -238,7 +238,7 @@ function test_build_process_file_emits_a_file_before_the_files_it_sources() {

# The embed dedupe keys on the repo-relative path (#923). Two modules holding the
# same basename must both survive -- the situation every further module split
# creates (src/parallel.sh vs src/runner/parallel.sh today).
# creates (src/config/parallel.sh vs src/runner/parallel.sh today).
function test_build_process_file_embeds_same_basename_from_two_module_dirs() {
local dir
dir=$(bashunit::temp_dir)
Expand Down
2 changes: 1 addition & 1 deletion tests/unit/env_deprecated_aliases_test.sh
Original file line numberDiff line numberDiff line change
Expand Up@@ -9,7 +9,7 @@
# Every `: "${BASHUNIT_X:=${X:=...}}"` line in env.sh declares an unprefixed
# alias for X. That is the source of truth.
function bashunit::test::aliases_declared_in_env_sh() {
grep -oE '^: "\$\{BASHUNIT_[A-Z0-9_]+:=\$\{[A-Z0-9_]+:=' src/env.sh |
grep -oE '^: "\$\{BASHUNIT_[A-Z0-9_]+:=\$\{[A-Z0-9_]+:=' src/config/env.sh |
sed -E 's/^: "\$\{BASHUNIT_[A-Z0-9_]+:=\$\{([A-Z0-9_]+):=$/\1/' |
sort
}
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 5 additions & 3 deletions .claude/rules/architecture-map.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -70,8 +70,10 @@ shell (or, in parallel, in per-test `.result` files aggregated at the end).
| `state/context.sh` | per-test output buffer, exit code, title, hook failure, and the per-test reset |
| `state/payload.sh` | the encoded per-test result payload and the base64 capability probe |
| `state/parallel.sh` | aggregating per-test result files after a `--parallel` run |
| `env.sh` | all `BASHUNIT_*` defaults/config files, scratch dirs (`_BASHUNIT_RUN_OUTPUT_DIR` + EXIT-trap cleanup) |
| `parallel.sh` | worker temp tree, aggregation, stop-on-failure flag file |
| `config/index.sh` | aggregator only β€” sources the `src/config/` module below |
| `config/env.sh` | all `BASHUNIT_*` defaults/config files, scratch dirs (`_BASHUNIT_RUN_OUTPUT_DIR` + EXIT-trap cleanup); executes at source time |
| `config/rerun.sh` | the `.bashunit/last-failed` cache for `--rerun-failed` |
| `config/parallel.sh` | is this run parallel; worker temp tree and stop-on-failure flag file (not `runner/parallel.sh`, which waits on job slots) |
| `console/index.sh` | aggregator only β€” sources the `src/console/` module below |
| `console/colors.sh` | the `_BASHUNIT_COLOR_*` palette and `bashunit::sgr` |
| `console/header.sh` | the "Running N tests" header |
Expand DownExpand Up@@ -104,7 +106,7 @@ shell (or, in parallel, in per-test `.result` files aggregated at the end).
| `coverage/branches.sh` | branch extraction + hit computation; **one file on purpose** β€” the `_branch_*` helpers mutate `extract_branches`'s locals via dynamic scoping |
| `coverage/report_text.sh` / `report_lcov.sh` / `report_html.sh` | the three renderers |
| `coverage/html_index.sh` / `html_file.sh` | HTML page emitters; the only two files exempt from `max_line_length` |
| `rerun.sh` | `.bashunit/last-failed` cache for `--rerun-failed` |

| `reports.sh` | JUnit/HTML/TAP/JSON writers |
| `system/index.sh` | aggregator only β€” sources the `src/system/` module below |
| `system/check_os.sh` / `system/dependencies.sh` | one-fork OS detect; `command -v` probes (builtins, not forks) |
Expand Down
4 changes: 1 addition & 3 deletions bashunit
Original file line numberDiff line numberDiff line change
Expand Up@@ -68,16 +68,14 @@ source "$BASHUNIT_ROOT_DIR/src/dev/debug.sh"
source "$BASHUNIT_ROOT_DIR/src/system/index.sh"
source "$BASHUNIT_ROOT_DIR/src/util/index.sh"
source "$BASHUNIT_ROOT_DIR/src/api/index.sh"
source "$BASHUNIT_ROOT_DIR/src/parallel.sh"
source "$BASHUNIT_ROOT_DIR/src/env.sh"
source "$BASHUNIT_ROOT_DIR/src/config/index.sh"
source "$BASHUNIT_ROOT_DIR/src/coverage/index.sh"
source "$BASHUNIT_ROOT_DIR/src/state/index.sh"
source "$BASHUNIT_ROOT_DIR/src/console/index.sh"
source "$BASHUNIT_ROOT_DIR/src/helper/index.sh"
source "$BASHUNIT_ROOT_DIR/src/cli/index.sh"
source "$BASHUNIT_ROOT_DIR/src/assert/index.sh"
source "$BASHUNIT_ROOT_DIR/src/reports/index.sh"
source "$BASHUNIT_ROOT_DIR/src/rerun.sh"
source "$BASHUNIT_ROOT_DIR/src/runner/index.sh"
source "$BASHUNIT_ROOT_DIR/src/benchmark.sh"
source "$BASHUNIT_ROOT_DIR/src/learn/index.sh"
Expand Down
2 changes: 1 addition & 1 deletion build.sh
Original file line numberDiff line numberDiff line change
Expand Up@@ -72,7 +72,7 @@ function build::process_file() {

# Key the dedupe and the marker on a repo-relative path, never a basename: the
# top-level loop passes `src/x.sh` while the recursion passes an absolute path,
# and two modules can hold the same basename (src/parallel.sh vs
# and two modules can hold the same basename (src/config/parallel.sh vs
# src/runner/parallel.sh). `$file` itself stays untouched so the `tail` and
# `dirname` below work on whichever form the caller passed.
local marker="${file#"$BASHUNIT_ROOT_DIR"/}"
Expand Down
File renamed without changes.
23 changes: 23 additions & 0 deletions src/config/index.sh
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
#!/usr/bin/env bash

# Entry point for the src/config/ module: only `source` lines and comments belong
# here. build.sh emits a file's body before recursing into its `source` lines, so
# any statement here would run before its dependencies in the built binary
# (adrs/adr-010-src-module-directories.md).
#
# Run-scoped configuration and the state a run persists: every BASHUNIT_* default
# and its scratch dirs (env), whether this run is parallel and its stop flag
# (parallel), and the last-failed cache the next run reads (rerun). They cluster
# for real -- env reads rerun's setting, parallel reads env's.
#
# env.sh is the one file here that executes at source time: it loads .bashunitrc
# and .env and creates the scratch dirs. Its file-scope block calls only
# bashunit::env:: functions defined above it in the same file, so the order below
# is free -- but this module must stay where parallel.sh and env.sh sat, ahead of
# console/, whose palette is built at file scope from these values.
#
# Note src/config/parallel.sh is a different concern from src/runner/parallel.sh:
# this one answers "is this run parallel", that one waits on job slots.
source "$BASHUNIT_ROOT_DIR/src/config/parallel.sh"
source "$BASHUNIT_ROOT_DIR/src/config/env.sh"
source "$BASHUNIT_ROOT_DIR/src/config/rerun.sh"
File renamed without changes.
File renamed without changes.
2 changes: 1 addition & 1 deletion tests/unit/build_test.sh
Original file line numberDiff line numberDiff line change
Expand Up@@ -238,7 +238,7 @@ function test_build_process_file_emits_a_file_before_the_files_it_sources() {

# The embed dedupe keys on the repo-relative path (#923). Two modules holding the
# same basename must both survive -- the situation every further module split
# creates (src/parallel.sh vs src/runner/parallel.sh today).
# creates (src/config/parallel.sh vs src/runner/parallel.sh today).
function test_build_process_file_embeds_same_basename_from_two_module_dirs() {
local dir
dir=$(bashunit::temp_dir)
Expand Down
2 changes: 1 addition & 1 deletion tests/unit/env_deprecated_aliases_test.sh
Original file line numberDiff line numberDiff line change
Expand Up@@ -9,7 +9,7 @@
# Every `: "${BASHUNIT_X:=${X:=...}}"` line in env.sh declares an unprefixed
# alias for X. That is the source of truth.
function bashunit::test::aliases_declared_in_env_sh() {
grep -oE '^: "\$\{BASHUNIT_[A-Z0-9_]+:=\$\{[A-Z0-9_]+:=' src/env.sh |
grep -oE '^: "\$\{BASHUNIT_[A-Z0-9_]+:=\$\{[A-Z0-9_]+:=' src/config/env.sh |
sed -E 's/^: "\$\{BASHUNIT_[A-Z0-9_]+:=\$\{([A-Z0-9_]+):=$/\1/' |
sort
}
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 5 additions & 3 deletions .claude/rules/architecture-map.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -70,8 +70,10 @@ shell (or, in parallel, in per-test `.result` files aggregated at the end).
| `state/context.sh` | per-test output buffer, exit code, title, hook failure, and the per-test reset |
| `state/payload.sh` | the encoded per-test result payload and the base64 capability probe |
| `state/parallel.sh` | aggregating per-test result files after a `--parallel` run |
| `env.sh` | all `BASHUNIT_*` defaults/config files, scratch dirs (`_BASHUNIT_RUN_OUTPUT_DIR` + EXIT-trap cleanup) |
| `parallel.sh` | worker temp tree, aggregation, stop-on-failure flag file |
| `config/index.sh` | aggregator only β€” sources the `src/config/` module below |
| `config/env.sh` | all `BASHUNIT_*` defaults/config files, scratch dirs (`_BASHUNIT_RUN_OUTPUT_DIR` + EXIT-trap cleanup); executes at source time |
| `config/rerun.sh` | the `.bashunit/last-failed` cache for `--rerun-failed` |
| `config/parallel.sh` | is this run parallel; worker temp tree and stop-on-failure flag file (not `runner/parallel.sh`, which waits on job slots) |
| `console/index.sh` | aggregator only β€” sources the `src/console/` module below |
| `console/colors.sh` | the `_BASHUNIT_COLOR_*` palette and `bashunit::sgr` |
| `console/header.sh` | the "Running N tests" header |
Expand DownExpand Up@@ -104,7 +106,7 @@ shell (or, in parallel, in per-test `.result` files aggregated at the end).
| `coverage/branches.sh` | branch extraction + hit computation; **one file on purpose** β€” the `_branch_*` helpers mutate `extract_branches`'s locals via dynamic scoping |
| `coverage/report_text.sh` / `report_lcov.sh` / `report_html.sh` | the three renderers |
| `coverage/html_index.sh` / `html_file.sh` | HTML page emitters; the only two files exempt from `max_line_length` |
| `rerun.sh` | `.bashunit/last-failed` cache for `--rerun-failed` |

| `reports.sh` | JUnit/HTML/TAP/JSON writers |
| `system/index.sh` | aggregator only β€” sources the `src/system/` module below |
| `system/check_os.sh` / `system/dependencies.sh` | one-fork OS detect; `command -v` probes (builtins, not forks) |
Expand Down
4 changes: 1 addition & 3 deletions bashunit
Original file line numberDiff line numberDiff line change
Expand Up@@ -68,16 +68,14 @@ source "$BASHUNIT_ROOT_DIR/src/dev/debug.sh"
source "$BASHUNIT_ROOT_DIR/src/system/index.sh"
source "$BASHUNIT_ROOT_DIR/src/util/index.sh"
source "$BASHUNIT_ROOT_DIR/src/api/index.sh"
source "$BASHUNIT_ROOT_DIR/src/parallel.sh"
source "$BASHUNIT_ROOT_DIR/src/env.sh"
source "$BASHUNIT_ROOT_DIR/src/config/index.sh"
source "$BASHUNIT_ROOT_DIR/src/coverage/index.sh"
source "$BASHUNIT_ROOT_DIR/src/state/index.sh"
source "$BASHUNIT_ROOT_DIR/src/console/index.sh"
source "$BASHUNIT_ROOT_DIR/src/helper/index.sh"
source "$BASHUNIT_ROOT_DIR/src/cli/index.sh"
source "$BASHUNIT_ROOT_DIR/src/assert/index.sh"
source "$BASHUNIT_ROOT_DIR/src/reports/index.sh"
source "$BASHUNIT_ROOT_DIR/src/rerun.sh"
source "$BASHUNIT_ROOT_DIR/src/runner/index.sh"
source "$BASHUNIT_ROOT_DIR/src/benchmark.sh"
source "$BASHUNIT_ROOT_DIR/src/learn/index.sh"
Expand Down
2 changes: 1 addition & 1 deletion build.sh
Original file line numberDiff line numberDiff line change
Expand Up@@ -72,7 +72,7 @@ function build::process_file() {

# Key the dedupe and the marker on a repo-relative path, never a basename: the
# top-level loop passes `src/x.sh` while the recursion passes an absolute path,
# and two modules can hold the same basename (src/parallel.sh vs
# and two modules can hold the same basename (src/config/parallel.sh vs
# src/runner/parallel.sh). `$file` itself stays untouched so the `tail` and
# `dirname` below work on whichever form the caller passed.
local marker="${file#"$BASHUNIT_ROOT_DIR"/}"
Expand Down
File renamed without changes.
23 changes: 23 additions & 0 deletions src/config/index.sh
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
#!/usr/bin/env bash

# Entry point for the src/config/ module: only `source` lines and comments belong
# here. build.sh emits a file's body before recursing into its `source` lines, so
# any statement here would run before its dependencies in the built binary
# (adrs/adr-010-src-module-directories.md).
#
# Run-scoped configuration and the state a run persists: every BASHUNIT_* default
# and its scratch dirs (env), whether this run is parallel and its stop flag
# (parallel), and the last-failed cache the next run reads (rerun). They cluster
# for real -- env reads rerun's setting, parallel reads env's.
#
# env.sh is the one file here that executes at source time: it loads .bashunitrc
# and .env and creates the scratch dirs. Its file-scope block calls only
# bashunit::env:: functions defined above it in the same file, so the order below
# is free -- but this module must stay where parallel.sh and env.sh sat, ahead of
# console/, whose palette is built at file scope from these values.
#
# Note src/config/parallel.sh is a different concern from src/runner/parallel.sh:
# this one answers "is this run parallel", that one waits on job slots.
source "$BASHUNIT_ROOT_DIR/src/config/parallel.sh"
source "$BASHUNIT_ROOT_DIR/src/config/env.sh"
source "$BASHUNIT_ROOT_DIR/src/config/rerun.sh"
File renamed without changes.
File renamed without changes.
2 changes: 1 addition & 1 deletion tests/unit/build_test.sh
Original file line numberDiff line numberDiff line change
Expand Up@@ -238,7 +238,7 @@ function test_build_process_file_emits_a_file_before_the_files_it_sources() {

# The embed dedupe keys on the repo-relative path (#923). Two modules holding the
# same basename must both survive -- the situation every further module split
# creates (src/parallel.sh vs src/runner/parallel.sh today).
# creates (src/config/parallel.sh vs src/runner/parallel.sh today).
function test_build_process_file_embeds_same_basename_from_two_module_dirs() {
local dir
dir=$(bashunit::temp_dir)
Expand Down
2 changes: 1 addition & 1 deletion tests/unit/env_deprecated_aliases_test.sh
Original file line numberDiff line numberDiff line change
Expand Up@@ -9,7 +9,7 @@
# Every `: "${BASHUNIT_X:=${X:=...}}"` line in env.sh declares an unprefixed
# alias for X. That is the source of truth.
function bashunit::test::aliases_declared_in_env_sh() {
grep -oE '^: "\$\{BASHUNIT_[A-Z0-9_]+:=\$\{[A-Z0-9_]+:=' src/env.sh |
grep -oE '^: "\$\{BASHUNIT_[A-Z0-9_]+:=\$\{[A-Z0-9_]+:=' src/config/env.sh |
sed -E 's/^: "\$\{BASHUNIT_[A-Z0-9_]+:=\$\{([A-Z0-9_]+):=$/\1/' |
sort
}
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 5 additions & 3 deletions .claude/rules/architecture-map.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -70,8 +70,10 @@ shell (or, in parallel, in per-test `.result` files aggregated at the end).
| `state/context.sh` | per-test output buffer, exit code, title, hook failure, and the per-test reset |
| `state/payload.sh` | the encoded per-test result payload and the base64 capability probe |
| `state/parallel.sh` | aggregating per-test result files after a `--parallel` run |
| `env.sh` | all `BASHUNIT_*` defaults/config files, scratch dirs (`_BASHUNIT_RUN_OUTPUT_DIR` + EXIT-trap cleanup) |
| `parallel.sh` | worker temp tree, aggregation, stop-on-failure flag file |
| `config/index.sh` | aggregator only β€” sources the `src/config/` module below |
| `config/env.sh` | all `BASHUNIT_*` defaults/config files, scratch dirs (`_BASHUNIT_RUN_OUTPUT_DIR` + EXIT-trap cleanup); executes at source time |
| `config/rerun.sh` | the `.bashunit/last-failed` cache for `--rerun-failed` |
| `config/parallel.sh` | is this run parallel; worker temp tree and stop-on-failure flag file (not `runner/parallel.sh`, which waits on job slots) |
| `console/index.sh` | aggregator only β€” sources the `src/console/` module below |
| `console/colors.sh` | the `_BASHUNIT_COLOR_*` palette and `bashunit::sgr` |
| `console/header.sh` | the "Running N tests" header |
Expand DownExpand Up@@ -104,7 +106,7 @@ shell (or, in parallel, in per-test `.result` files aggregated at the end).
| `coverage/branches.sh` | branch extraction + hit computation; **one file on purpose** β€” the `_branch_*` helpers mutate `extract_branches`'s locals via dynamic scoping |
| `coverage/report_text.sh` / `report_lcov.sh` / `report_html.sh` | the three renderers |
| `coverage/html_index.sh` / `html_file.sh` | HTML page emitters; the only two files exempt from `max_line_length` |
| `rerun.sh` | `.bashunit/last-failed` cache for `--rerun-failed` |

| `reports.sh` | JUnit/HTML/TAP/JSON writers |
| `system/index.sh` | aggregator only β€” sources the `src/system/` module below |
| `system/check_os.sh` / `system/dependencies.sh` | one-fork OS detect; `command -v` probes (builtins, not forks) |
Expand Down
4 changes: 1 addition & 3 deletions bashunit
Original file line numberDiff line numberDiff line change
Expand Up@@ -68,16 +68,14 @@ source "$BASHUNIT_ROOT_DIR/src/dev/debug.sh"
source "$BASHUNIT_ROOT_DIR/src/system/index.sh"
source "$BASHUNIT_ROOT_DIR/src/util/index.sh"
source "$BASHUNIT_ROOT_DIR/src/api/index.sh"
source "$BASHUNIT_ROOT_DIR/src/parallel.sh"
source "$BASHUNIT_ROOT_DIR/src/env.sh"
source "$BASHUNIT_ROOT_DIR/src/config/index.sh"
source "$BASHUNIT_ROOT_DIR/src/coverage/index.sh"
source "$BASHUNIT_ROOT_DIR/src/state/index.sh"
source "$BASHUNIT_ROOT_DIR/src/console/index.sh"
source "$BASHUNIT_ROOT_DIR/src/helper/index.sh"
source "$BASHUNIT_ROOT_DIR/src/cli/index.sh"
source "$BASHUNIT_ROOT_DIR/src/assert/index.sh"
source "$BASHUNIT_ROOT_DIR/src/reports/index.sh"
source "$BASHUNIT_ROOT_DIR/src/rerun.sh"
source "$BASHUNIT_ROOT_DIR/src/runner/index.sh"
source "$BASHUNIT_ROOT_DIR/src/benchmark.sh"
source "$BASHUNIT_ROOT_DIR/src/learn/index.sh"
Expand Down
2 changes: 1 addition & 1 deletion build.sh
Original file line numberDiff line numberDiff line change
Expand Up@@ -72,7 +72,7 @@ function build::process_file() {

# Key the dedupe and the marker on a repo-relative path, never a basename: the
# top-level loop passes `src/x.sh` while the recursion passes an absolute path,
# and two modules can hold the same basename (src/parallel.sh vs
# and two modules can hold the same basename (src/config/parallel.sh vs
# src/runner/parallel.sh). `$file` itself stays untouched so the `tail` and
# `dirname` below work on whichever form the caller passed.
local marker="${file#"$BASHUNIT_ROOT_DIR"/}"
Expand Down
File renamed without changes.
23 changes: 23 additions & 0 deletions src/config/index.sh
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
#!/usr/bin/env bash

# Entry point for the src/config/ module: only `source` lines and comments belong
# here. build.sh emits a file's body before recursing into its `source` lines, so
# any statement here would run before its dependencies in the built binary
# (adrs/adr-010-src-module-directories.md).
#
# Run-scoped configuration and the state a run persists: every BASHUNIT_* default
# and its scratch dirs (env), whether this run is parallel and its stop flag
# (parallel), and the last-failed cache the next run reads (rerun). They cluster
# for real -- env reads rerun's setting, parallel reads env's.
#
# env.sh is the one file here that executes at source time: it loads .bashunitrc
# and .env and creates the scratch dirs. Its file-scope block calls only
# bashunit::env:: functions defined above it in the same file, so the order below
# is free -- but this module must stay where parallel.sh and env.sh sat, ahead of
# console/, whose palette is built at file scope from these values.
#
# Note src/config/parallel.sh is a different concern from src/runner/parallel.sh:
# this one answers "is this run parallel", that one waits on job slots.
source "$BASHUNIT_ROOT_DIR/src/config/parallel.sh"
source "$BASHUNIT_ROOT_DIR/src/config/env.sh"
source "$BASHUNIT_ROOT_DIR/src/config/rerun.sh"
File renamed without changes.
File renamed without changes.
2 changes: 1 addition & 1 deletion tests/unit/build_test.sh
Original file line numberDiff line numberDiff line change
Expand Up@@ -238,7 +238,7 @@ function test_build_process_file_emits_a_file_before_the_files_it_sources() {

# The embed dedupe keys on the repo-relative path (#923). Two modules holding the
# same basename must both survive -- the situation every further module split
# creates (src/parallel.sh vs src/runner/parallel.sh today).
# creates (src/config/parallel.sh vs src/runner/parallel.sh today).
function test_build_process_file_embeds_same_basename_from_two_module_dirs() {
local dir
dir=$(bashunit::temp_dir)
Expand Down
2 changes: 1 addition & 1 deletion tests/unit/env_deprecated_aliases_test.sh
Original file line numberDiff line numberDiff line change
Expand Up@@ -9,7 +9,7 @@
# Every `: "${BASHUNIT_X:=${X:=...}}"` line in env.sh declares an unprefixed
# alias for X. That is the source of truth.
function bashunit::test::aliases_declared_in_env_sh() {
grep -oE '^: "\$\{BASHUNIT_[A-Z0-9_]+:=\$\{[A-Z0-9_]+:=' src/env.sh |
grep -oE '^: "\$\{BASHUNIT_[A-Z0-9_]+:=\$\{[A-Z0-9_]+:=' src/config/env.sh |
sed -E 's/^: "\$\{BASHUNIT_[A-Z0-9_]+:=\$\{([A-Z0-9_]+):=$/\1/' |
sort
}
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 5 additions & 3 deletions .claude/rules/architecture-map.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -70,8 +70,10 @@ shell (or, in parallel, in per-test `.result` files aggregated at the end).
| `state/context.sh` | per-test output buffer, exit code, title, hook failure, and the per-test reset |
| `state/payload.sh` | the encoded per-test result payload and the base64 capability probe |
| `state/parallel.sh` | aggregating per-test result files after a `--parallel` run |
| `env.sh` | all `BASHUNIT_*` defaults/config files, scratch dirs (`_BASHUNIT_RUN_OUTPUT_DIR` + EXIT-trap cleanup) |
| `parallel.sh` | worker temp tree, aggregation, stop-on-failure flag file |
| `config/index.sh` | aggregator only β€” sources the `src/config/` module below |
| `config/env.sh` | all `BASHUNIT_*` defaults/config files, scratch dirs (`_BASHUNIT_RUN_OUTPUT_DIR` + EXIT-trap cleanup); executes at source time |
| `config/rerun.sh` | the `.bashunit/last-failed` cache for `--rerun-failed` |
| `config/parallel.sh` | is this run parallel; worker temp tree and stop-on-failure flag file (not `runner/parallel.sh`, which waits on job slots) |
| `console/index.sh` | aggregator only β€” sources the `src/console/` module below |
| `console/colors.sh` | the `_BASHUNIT_COLOR_*` palette and `bashunit::sgr` |
| `console/header.sh` | the "Running N tests" header |
Expand DownExpand Up@@ -104,7 +106,7 @@ shell (or, in parallel, in per-test `.result` files aggregated at the end).
| `coverage/branches.sh` | branch extraction + hit computation; **one file on purpose** β€” the `_branch_*` helpers mutate `extract_branches`'s locals via dynamic scoping |
| `coverage/report_text.sh` / `report_lcov.sh` / `report_html.sh` | the three renderers |
| `coverage/html_index.sh` / `html_file.sh` | HTML page emitters; the only two files exempt from `max_line_length` |
| `rerun.sh` | `.bashunit/last-failed` cache for `--rerun-failed` |

| `reports.sh` | JUnit/HTML/TAP/JSON writers |
| `system/index.sh` | aggregator only β€” sources the `src/system/` module below |
| `system/check_os.sh` / `system/dependencies.sh` | one-fork OS detect; `command -v` probes (builtins, not forks) |
Expand Down
4 changes: 1 addition & 3 deletions bashunit
Original file line numberDiff line numberDiff line change
Expand Up@@ -68,16 +68,14 @@ source "$BASHUNIT_ROOT_DIR/src/dev/debug.sh"
source "$BASHUNIT_ROOT_DIR/src/system/index.sh"
source "$BASHUNIT_ROOT_DIR/src/util/index.sh"
source "$BASHUNIT_ROOT_DIR/src/api/index.sh"
source "$BASHUNIT_ROOT_DIR/src/parallel.sh"
source "$BASHUNIT_ROOT_DIR/src/env.sh"
source "$BASHUNIT_ROOT_DIR/src/config/index.sh"
source "$BASHUNIT_ROOT_DIR/src/coverage/index.sh"
source "$BASHUNIT_ROOT_DIR/src/state/index.sh"
source "$BASHUNIT_ROOT_DIR/src/console/index.sh"
source "$BASHUNIT_ROOT_DIR/src/helper/index.sh"
source "$BASHUNIT_ROOT_DIR/src/cli/index.sh"
source "$BASHUNIT_ROOT_DIR/src/assert/index.sh"
source "$BASHUNIT_ROOT_DIR/src/reports/index.sh"
source "$BASHUNIT_ROOT_DIR/src/rerun.sh"
source "$BASHUNIT_ROOT_DIR/src/runner/index.sh"
source "$BASHUNIT_ROOT_DIR/src/benchmark.sh"
source "$BASHUNIT_ROOT_DIR/src/learn/index.sh"
Expand Down
2 changes: 1 addition & 1 deletion build.sh
Original file line numberDiff line numberDiff line change
Expand Up@@ -72,7 +72,7 @@ function build::process_file() {

# Key the dedupe and the marker on a repo-relative path, never a basename: the
# top-level loop passes `src/x.sh` while the recursion passes an absolute path,
# and two modules can hold the same basename (src/parallel.sh vs
# and two modules can hold the same basename (src/config/parallel.sh vs
# src/runner/parallel.sh). `$file` itself stays untouched so the `tail` and
# `dirname` below work on whichever form the caller passed.
local marker="${file#"$BASHUNIT_ROOT_DIR"/}"
Expand Down
File renamed without changes.
23 changes: 23 additions & 0 deletions src/config/index.sh
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
#!/usr/bin/env bash

# Entry point for the src/config/ module: only `source` lines and comments belong
# here. build.sh emits a file's body before recursing into its `source` lines, so
# any statement here would run before its dependencies in the built binary
# (adrs/adr-010-src-module-directories.md).
#
# Run-scoped configuration and the state a run persists: every BASHUNIT_* default
# and its scratch dirs (env), whether this run is parallel and its stop flag
# (parallel), and the last-failed cache the next run reads (rerun). They cluster
# for real -- env reads rerun's setting, parallel reads env's.
#
# env.sh is the one file here that executes at source time: it loads .bashunitrc
# and .env and creates the scratch dirs. Its file-scope block calls only
# bashunit::env:: functions defined above it in the same file, so the order below
# is free -- but this module must stay where parallel.sh and env.sh sat, ahead of
# console/, whose palette is built at file scope from these values.
#
# Note src/config/parallel.sh is a different concern from src/runner/parallel.sh:
# this one answers "is this run parallel", that one waits on job slots.
source "$BASHUNIT_ROOT_DIR/src/config/parallel.sh"
source "$BASHUNIT_ROOT_DIR/src/config/env.sh"
source "$BASHUNIT_ROOT_DIR/src/config/rerun.sh"
File renamed without changes.
File renamed without changes.
2 changes: 1 addition & 1 deletion tests/unit/build_test.sh
Original file line numberDiff line numberDiff line change
Expand Up@@ -238,7 +238,7 @@ function test_build_process_file_emits_a_file_before_the_files_it_sources() {

# The embed dedupe keys on the repo-relative path (#923). Two modules holding the
# same basename must both survive -- the situation every further module split
# creates (src/parallel.sh vs src/runner/parallel.sh today).
# creates (src/config/parallel.sh vs src/runner/parallel.sh today).
function test_build_process_file_embeds_same_basename_from_two_module_dirs() {
local dir
dir=$(bashunit::temp_dir)
Expand Down
2 changes: 1 addition & 1 deletion tests/unit/env_deprecated_aliases_test.sh
Original file line numberDiff line numberDiff line change
Expand Up@@ -9,7 +9,7 @@
# Every `: "${BASHUNIT_X:=${X:=...}}"` line in env.sh declares an unprefixed
# alias for X. That is the source of truth.
function bashunit::test::aliases_declared_in_env_sh() {
grep -oE '^: "\$\{BASHUNIT_[A-Z0-9_]+:=\$\{[A-Z0-9_]+:=' src/env.sh |
grep -oE '^: "\$\{BASHUNIT_[A-Z0-9_]+:=\$\{[A-Z0-9_]+:=' src/config/env.sh |
sed -E 's/^: "\$\{BASHUNIT_[A-Z0-9_]+:=\$\{([A-Z0-9_]+):=$/\1/' |
sort
}
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 5 additions & 3 deletions .claude/rules/architecture-map.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -70,8 +70,10 @@ shell (or, in parallel, in per-test `.result` files aggregated at the end).
| `state/context.sh` | per-test output buffer, exit code, title, hook failure, and the per-test reset |
| `state/payload.sh` | the encoded per-test result payload and the base64 capability probe |
| `state/parallel.sh` | aggregating per-test result files after a `--parallel` run |
| `env.sh` | all `BASHUNIT_*` defaults/config files, scratch dirs (`_BASHUNIT_RUN_OUTPUT_DIR` + EXIT-trap cleanup) |
| `parallel.sh` | worker temp tree, aggregation, stop-on-failure flag file |
| `config/index.sh` | aggregator only β€” sources the `src/config/` module below |
| `config/env.sh` | all `BASHUNIT_*` defaults/config files, scratch dirs (`_BASHUNIT_RUN_OUTPUT_DIR` + EXIT-trap cleanup); executes at source time |
| `config/rerun.sh` | the `.bashunit/last-failed` cache for `--rerun-failed` |
| `config/parallel.sh` | is this run parallel; worker temp tree and stop-on-failure flag file (not `runner/parallel.sh`, which waits on job slots) |
| `console/index.sh` | aggregator only β€” sources the `src/console/` module below |
| `console/colors.sh` | the `_BASHUNIT_COLOR_*` palette and `bashunit::sgr` |
| `console/header.sh` | the "Running N tests" header |
Expand DownExpand Up@@ -104,7 +106,7 @@ shell (or, in parallel, in per-test `.result` files aggregated at the end).
| `coverage/branches.sh` | branch extraction + hit computation; **one file on purpose** β€” the `_branch_*` helpers mutate `extract_branches`'s locals via dynamic scoping |
| `coverage/report_text.sh` / `report_lcov.sh` / `report_html.sh` | the three renderers |
| `coverage/html_index.sh` / `html_file.sh` | HTML page emitters; the only two files exempt from `max_line_length` |
| `rerun.sh` | `.bashunit/last-failed` cache for `--rerun-failed` |

| `reports.sh` | JUnit/HTML/TAP/JSON writers |
| `system/index.sh` | aggregator only β€” sources the `src/system/` module below |
| `system/check_os.sh` / `system/dependencies.sh` | one-fork OS detect; `command -v` probes (builtins, not forks) |
Expand Down
4 changes: 1 addition & 3 deletions bashunit
Original file line numberDiff line numberDiff line change
Expand Up@@ -68,16 +68,14 @@ source "$BASHUNIT_ROOT_DIR/src/dev/debug.sh"
source "$BASHUNIT_ROOT_DIR/src/system/index.sh"
source "$BASHUNIT_ROOT_DIR/src/util/index.sh"
source "$BASHUNIT_ROOT_DIR/src/api/index.sh"
source "$BASHUNIT_ROOT_DIR/src/parallel.sh"
source "$BASHUNIT_ROOT_DIR/src/env.sh"
source "$BASHUNIT_ROOT_DIR/src/config/index.sh"
source "$BASHUNIT_ROOT_DIR/src/coverage/index.sh"
source "$BASHUNIT_ROOT_DIR/src/state/index.sh"
source "$BASHUNIT_ROOT_DIR/src/console/index.sh"
source "$BASHUNIT_ROOT_DIR/src/helper/index.sh"
source "$BASHUNIT_ROOT_DIR/src/cli/index.sh"
source "$BASHUNIT_ROOT_DIR/src/assert/index.sh"
source "$BASHUNIT_ROOT_DIR/src/reports/index.sh"
source "$BASHUNIT_ROOT_DIR/src/rerun.sh"
source "$BASHUNIT_ROOT_DIR/src/runner/index.sh"
source "$BASHUNIT_ROOT_DIR/src/benchmark.sh"
source "$BASHUNIT_ROOT_DIR/src/learn/index.sh"
Expand Down
2 changes: 1 addition & 1 deletion build.sh
Original file line numberDiff line numberDiff line change
Expand Up@@ -72,7 +72,7 @@ function build::process_file() {

# Key the dedupe and the marker on a repo-relative path, never a basename: the
# top-level loop passes `src/x.sh` while the recursion passes an absolute path,
# and two modules can hold the same basename (src/parallel.sh vs
# and two modules can hold the same basename (src/config/parallel.sh vs
# src/runner/parallel.sh). `$file` itself stays untouched so the `tail` and
# `dirname` below work on whichever form the caller passed.
local marker="${file#"$BASHUNIT_ROOT_DIR"/}"
Expand Down
File renamed without changes.
23 changes: 23 additions & 0 deletions src/config/index.sh
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
#!/usr/bin/env bash

# Entry point for the src/config/ module: only `source` lines and comments belong
# here. build.sh emits a file's body before recursing into its `source` lines, so
# any statement here would run before its dependencies in the built binary
# (adrs/adr-010-src-module-directories.md).
#
# Run-scoped configuration and the state a run persists: every BASHUNIT_* default
# and its scratch dirs (env), whether this run is parallel and its stop flag
# (parallel), and the last-failed cache the next run reads (rerun). They cluster
# for real -- env reads rerun's setting, parallel reads env's.
#
# env.sh is the one file here that executes at source time: it loads .bashunitrc
# and .env and creates the scratch dirs. Its file-scope block calls only
# bashunit::env:: functions defined above it in the same file, so the order below
# is free -- but this module must stay where parallel.sh and env.sh sat, ahead of
# console/, whose palette is built at file scope from these values.
#
# Note src/config/parallel.sh is a different concern from src/runner/parallel.sh:
# this one answers "is this run parallel", that one waits on job slots.
source "$BASHUNIT_ROOT_DIR/src/config/parallel.sh"
source "$BASHUNIT_ROOT_DIR/src/config/env.sh"
source "$BASHUNIT_ROOT_DIR/src/config/rerun.sh"
File renamed without changes.
File renamed without changes.
2 changes: 1 addition & 1 deletion tests/unit/build_test.sh
Original file line numberDiff line numberDiff line change
Expand Up@@ -238,7 +238,7 @@ function test_build_process_file_emits_a_file_before_the_files_it_sources() {

# The embed dedupe keys on the repo-relative path (#923). Two modules holding the
# same basename must both survive -- the situation every further module split
# creates (src/parallel.sh vs src/runner/parallel.sh today).
# creates (src/config/parallel.sh vs src/runner/parallel.sh today).
function test_build_process_file_embeds_same_basename_from_two_module_dirs() {
local dir
dir=$(bashunit::temp_dir)
Expand Down
2 changes: 1 addition & 1 deletion tests/unit/env_deprecated_aliases_test.sh
Original file line numberDiff line numberDiff line change
Expand Up@@ -9,7 +9,7 @@
# Every `: "${BASHUNIT_X:=${X:=...}}"` line in env.sh declares an unprefixed
# alias for X. That is the source of truth.
function bashunit::test::aliases_declared_in_env_sh() {
grep -oE '^: "\$\{BASHUNIT_[A-Z0-9_]+:=\$\{[A-Z0-9_]+:=' src/env.sh |
grep -oE '^: "\$\{BASHUNIT_[A-Z0-9_]+:=\$\{[A-Z0-9_]+:=' src/config/env.sh |
sed -E 's/^: "\$\{BASHUNIT_[A-Z0-9_]+:=\$\{([A-Z0-9_]+):=$/\1/' |
sort
}
Expand Down
Loading