Skip to content

Commit 30622d6

Browse files
author
jgstern
committed
Merge pull request 'release: hypergumbo 2.0.0' (#751) from dev into main
Reviewed-on: https://codeberg.org/iterabloom/hypergumbo/pulls/751
2 parents ebf6515 + 3718746 commit 30622d6

453 files changed

Lines changed: 20543 additions & 3088 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
File renamed without changes.

.agent/hooks/claude-code/stop.sh

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,10 @@ set -euo pipefail
88
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
99
REPO_ROOT="$(cd "$SCRIPT_DIR/../../.." && pwd)"
1010

11-
# Check autonomous mode
12-
if [[ "$(cat "$REPO_ROOT/AUTONOMOUS_MODE.txt" 2>/dev/null)" != "TRUE" ]]; then
11+
# Check autonomous mode (TRUE, BROAD, or DEEP all enable autonomous behavior)
12+
# OFF and FALSE both mean disabled (see scripts/loop-toggle)
13+
MODE=$(cat "$REPO_ROOT/AUTONOMOUS_MODE.txt" 2>/dev/null | tr -d '[:space:]' | tr '[:lower:]' '[:upper:]')
14+
if [[ -z "$MODE" || "$MODE" == "OFF" || "$MODE" == "FALSE" ]]; then
1315
echo '{"decision": "approve", "reason": "Autonomous mode disabled"}'
1416
exit 0
1517
fi

.agent/hooks/codex-cli/notify.sh

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,10 @@ if [[ "$EVENT_TYPE" != "agent-turn-complete" ]]; then
3030
fi
3131

3232
# Check autonomous mode and loop sentinel
33-
if [[ "$(cat "$REPO_ROOT/AUTONOMOUS_MODE.txt" 2>/dev/null)" == "TRUE" ]]; then
33+
# TRUE, BROAD, and DEEP all enable autonomous behavior
34+
# OFF and FALSE both mean disabled (see scripts/loop-toggle)
35+
MODE=$(cat "$REPO_ROOT/AUTONOMOUS_MODE.txt" 2>/dev/null | tr -d '[:space:]' | tr '[:lower:]' '[:upper:]')
36+
if [[ -n "$MODE" && "$MODE" != "OFF" && "$MODE" != "FALSE" ]]; then
3437
if [[ -f "$REPO_ROOT/.agent/LOOP" ]]; then
3538
# Output the full reflection prompt to stderr
3639
# Even though Codex can't auto-continue, this gets the words into context

.agent/hooks/cursor/stop.sh

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,10 @@ REPO_ROOT="$(cd "$SCRIPT_DIR/../../.." && pwd)"
1616
INPUT=$(cat)
1717

1818
# Check autonomous mode - if disabled, allow stop (empty output = no followup)
19-
if [[ "$(cat "$REPO_ROOT/AUTONOMOUS_MODE.txt" 2>/dev/null)" != "TRUE" ]]; then
19+
# TRUE, BROAD, and DEEP all enable autonomous behavior
20+
# OFF and FALSE both mean disabled (see scripts/loop-toggle)
21+
MODE=$(cat "$REPO_ROOT/AUTONOMOUS_MODE.txt" 2>/dev/null | tr -d '[:space:]' | tr '[:lower:]' '[:upper:]')
22+
if [[ -z "$MODE" || "$MODE" == "OFF" || "$MODE" == "FALSE" ]]; then
2023
echo '{}'
2124
exit 0
2225
fi

.agent/hooks/gemini-cli/after-agent.sh

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,10 @@ REPO_ROOT="$(cd "$SCRIPT_DIR/../../.." && pwd)"
1717
INPUT=$(cat)
1818

1919
# Check autonomous mode - if disabled, allow completion
20-
if [[ "$(cat "$REPO_ROOT/AUTONOMOUS_MODE.txt" 2>/dev/null)" != "TRUE" ]]; then
20+
# TRUE, BROAD, and DEEP all enable autonomous behavior
21+
# OFF and FALSE both mean disabled (see scripts/loop-toggle)
22+
MODE=$(cat "$REPO_ROOT/AUTONOMOUS_MODE.txt" 2>/dev/null | tr -d '[:space:]' | tr '[:lower:]' '[:upper:]')
23+
if [[ -z "$MODE" || "$MODE" == "OFF" || "$MODE" == "FALSE" ]]; then
2124
echo '{"decision": "allow"}'
2225
exit 0
2326
fi

.agent/invariant-ledger.md

Lines changed: 51 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -132,15 +132,18 @@ high-level, their status is expressed as a percentage indicating confidence they
132132
### META-001: Metadata Must Become Graph Structure
133133
> "Semantic relationships expressed in metadata must become traversable graph structure."
134134
135-
- **Status:** 90%
136-
- **Notes:** Core cases (INV-002, INV-004, INV-006) are fixed. Some metadata fields
137-
(e.g., `base_classes` in Python/JS/TS) don't yet create edges. Type hierarchy linker
138-
added for extends/implements, but not all languages create these edges.
135+
- **Status:** 100%
136+
- **Notes:**
137+
- **DONE (create edges from base_classes):** Java, JS/TS, Python, Ruby, Kotlin, C#, Scala, PHP, Groovy, Swift, C++, Objective-C, Apex
138+
- All 13 languages with class inheritance now extract `base_classes` metadata
139+
- The centralized inheritance linker (`linkers/inheritance.py`) creates extends/implements edges for all languages
139140

140141
**Unified by:**
141142
- INV-002 (usage patterns → concepts on nodes)
142143
- INV-004 (route metadata → handler edges)
143144
- INV-006 (resources macro → route symbols with controller_action)
145+
- INV-008 (base_classes → extends/implements edges for Python/JS/TS)
146+
- INV-009 (base_classes → extends/implements edges for Ruby/Kotlin)
144147

145148
**Implication:** When an analyzer stores relationship information in metadata (view_name,
146149
controller_action, etc.), there should be a corresponding linker or enrichment phase that
@@ -149,10 +152,18 @@ converts that metadata into edges or concepts. Metadata alone is not traversable
149152
### META-002: Extraction Completeness
150153
> "Symbols that exist in source code must be extracted for analysis."
151154
152-
- **Status:** 95%
153-
- **Notes:** Known cases (INV-001, INV-003) are fixed. Edge cases may remain for exotic
154-
constructs (e.g., heavily metaprogrammed code, eval-generated functions). Need to
155-
audit more languages for extraction gaps.
155+
- **Status:** 100%
156+
- **Notes:** Based on EXTENSIVE checking across 25+ repos in 5 bakeoff cohorts:
157+
- Known cases (INV-001, INV-003) are fixed
158+
- Lambda/closure call attribution audited for Go, Java, Rust, C#, Kotlin, Scala - all
159+
use implicit walk-up that correctly attributes calls to enclosing methods
160+
- C++ test patterns (Google Test, Catch2): Added to test-frameworks.yaml
161+
- C header declarations: Verified as correct (declarations don't have call edges)
162+
- Spec repos (NO_CALL_EDGES): Verified as correct (declarative code, no callable functions)
163+
- Go repos with external deps (LOW_RESOLUTION): Verified as correct (external calls unresolvable)
164+
- Language metrics (Python, Ruby, Rust, TypeScript, C, C++, Go): All healthy
165+
- Theoretical exotic constructs (metaprogrammed code, eval-generated functions) not
166+
found in any analyzed repos; would require specific failing repos to investigate further
156167

157168
**Unified by:**
158169
- INV-001 (call edges must have caller symbols - implies callers are extracted)
@@ -190,6 +201,38 @@ type, AND location).
190201
- **Regression tests:**
191202
- `tests/test_go.py::TestGoImportPathResolution::test_resolves_call_to_correct_file_by_import_path`
192203

204+
## INV-008: Base Classes Metadata to Extends Edges
205+
- **Statement:** Class symbols with `base_classes` metadata must create `extends` or `implements`
206+
edges to base classes/interfaces that exist in the analyzed codebase
207+
- **Status:** ✅ FIXED
208+
- **Root cause:** Python and JS/TS analyzers extracted `base_classes` into metadata but did not
209+
create edges. The type hierarchy linker requires `extends`/`implements` edges to build
210+
inheritance maps for polymorphic dispatch. Java was already creating these edges.
211+
- **Fix:** Added `_extract_inheritance_edges()` function to both Python and JS/TS analyzers:
212+
- `analyze/py.py`: Creates `extends` edges after symbol collection in Pass 2
213+
- `analyze/js_ts.py`: Creates `extends`/`implements` edges, distinguishing classes from interfaces
214+
- Edges only created for base classes that exist in the analyzed codebase (not external packages)
215+
- Generic type parameters stripped (e.g., `Repository<User>``Repository`)
216+
- **Regression tests:**
217+
- `tests/test_python_ast_analysis.py::TestPythonInheritanceEdges` (4 tests)
218+
- `tests/test_js_ts.py::TestJsTsInheritanceEdges` (4 tests)
219+
220+
## INV-009: Ruby/Kotlin Base Classes Metadata to Extends Edges
221+
- **Statement:** Ruby and Kotlin class symbols with inheritance must create `extends` or `implements`
222+
edges to base classes/interfaces that exist in the analyzed codebase
223+
- **Status:** ✅ FIXED
224+
- **Root cause:** Ruby and Kotlin analyzers did not extract `base_classes` metadata or create edges.
225+
This gap was identified as part of META-001 scope expansion after INV-008.
226+
- **Fix:** Added inheritance extraction to both Ruby and Kotlin analyzers:
227+
- `analyze/ruby.py`: Extracts superclass from `superclass` AST node, creates `extends` edges
228+
- `analyze/kotlin.py`: Extracts from `delegation_specifiers`, creates `extends` for classes and
229+
`implements` for interfaces
230+
- Ruby handles qualified names like `ActiveRecord::Base` → matches `Base` class
231+
- Kotlin handles multiple inheritance (class + multiple interfaces)
232+
- **Regression tests:**
233+
- `tests/test_ruby.py::TestRubyInheritanceEdges` (5 tests)
234+
- `tests/test_kotlin.py::TestKotlinInheritanceEdges` (6 tests)
235+
193236
## INV-XXX: Template for New Invariants
194237
- **Statement:** [What must always be true]
195238
- **Status:** [UNFIXED | PARTIALLY ADDRESSED | FIXED | TBD]

.ci/.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
# CI artifacts - logs are ignored, manifests are committed
2+
full-suite.log

.ci/affected-tests.txt

Lines changed: 171 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,171 @@
1+
# Full test suite required: no stable hypergumbo found (install with: pipx install hypergumbo)
2+
# Generated by smart-test at 2026-01-31T00:41:04-05:00
3+
packages/hypergumbo-core/tests/test_base.py
4+
packages/hypergumbo-core/tests/test_behavior_map_schema.py
5+
packages/hypergumbo-core/tests/test_build_grammars.py
6+
packages/hypergumbo-core/tests/test_catalog.py
7+
packages/hypergumbo-core/tests/test_cli_basic.py
8+
packages/hypergumbo-core/tests/test_cli_commands.py
9+
packages/hypergumbo-core/tests/test_cli_explain.py
10+
packages/hypergumbo-core/tests/test_cli_routes.py
11+
packages/hypergumbo-core/tests/test_cli_run_behavior_map.py
12+
packages/hypergumbo-core/tests/test_cli_search.py
13+
packages/hypergumbo-core/tests/test_cli_symbols.py
14+
packages/hypergumbo-core/tests/test_cli_test_coverage.py
15+
packages/hypergumbo-core/tests/test_compact.py
16+
packages/hypergumbo-core/tests/test_database_query_linker.py
17+
packages/hypergumbo-core/tests/test_datamodels.py
18+
packages/hypergumbo-core/tests/test_dependency_linker.py
19+
packages/hypergumbo-core/tests/test_discovery.py
20+
packages/hypergumbo-core/tests/test_entrypoints.py
21+
packages/hypergumbo-core/tests/test_event_sourcing_linker.py
22+
packages/hypergumbo-core/tests/test_fastapi_patterns.py
23+
packages/hypergumbo-core/tests/test_file_excludes.py
24+
packages/hypergumbo-core/tests/test_framework_patterns.py
25+
packages/hypergumbo-core/tests/test_frameworks_flag.py
26+
packages/hypergumbo-core/tests/test_graphql_linker.py
27+
packages/hypergumbo-core/tests/test_graphql_resolver_linker.py
28+
packages/hypergumbo-core/tests/test_grpc_linker.py
29+
packages/hypergumbo-core/tests/test_http_linker.py
30+
packages/hypergumbo-core/tests/test_inheritance_linker.py
31+
packages/hypergumbo-core/tests/test_ipc_linker.py
32+
packages/hypergumbo-core/tests/test_ir.py
33+
packages/hypergumbo-core/tests/test_limits.py
34+
packages/hypergumbo-core/tests/test_linker_activation.py
35+
packages/hypergumbo-core/tests/test_linker_filtering.py
36+
packages/hypergumbo-core/tests/test_linker_registry.py
37+
packages/hypergumbo-core/tests/test_main_module.py
38+
packages/hypergumbo-core/tests/test_max_tier.py
39+
packages/hypergumbo-core/tests/test_message_queue_linker.py
40+
packages/hypergumbo-core/tests/test_metrics.py
41+
packages/hypergumbo-core/tests/test_no_first_party_priority.py
42+
packages/hypergumbo-core/tests/test_openapi_linker.py
43+
packages/hypergumbo-core/tests/test_paths.py
44+
packages/hypergumbo-core/tests/test_phoenix_ipc_linker.py
45+
packages/hypergumbo-core/tests/test_profile.py
46+
packages/hypergumbo-core/tests/test_ranking.py
47+
packages/hypergumbo-core/tests/test_route_handler_linker.py
48+
packages/hypergumbo-core/tests/test_run_behavior_map.py
49+
packages/hypergumbo-core/tests/test_schema_compliance.py
50+
packages/hypergumbo-core/tests/test_schema.py
51+
packages/hypergumbo-core/tests/test_selection_filters.py
52+
packages/hypergumbo-core/tests/test_selection_language_proportional.py
53+
packages/hypergumbo-core/tests/test_selection_token_budget.py
54+
packages/hypergumbo-core/tests/test_sketch.py
55+
packages/hypergumbo-core/tests/test_sketch_sanity.py
56+
packages/hypergumbo-core/tests/test_slice.py
57+
packages/hypergumbo-core/tests/test_slice_tier_filter.py
58+
packages/hypergumbo-core/tests/test_stable_shape_ids.py
59+
packages/hypergumbo-core/tests/test_subprocess_linker.py
60+
packages/hypergumbo-core/tests/test_supply_chain.py
61+
packages/hypergumbo-core/tests/test_symbol_resolution.py
62+
packages/hypergumbo-core/tests/test_taxonomy.py
63+
packages/hypergumbo-core/tests/test_type_hierarchy_linker.py
64+
packages/hypergumbo-core/tests/test_user_config.py
65+
packages/hypergumbo-core/tests/test_websocket.py
66+
packages/hypergumbo-lang-common/tests/test_astro.py
67+
packages/hypergumbo-lang-common/tests/test_clojure.py
68+
packages/hypergumbo-lang-common/tests/test_commonlisp.py
69+
packages/hypergumbo-lang-common/tests/test_cuda_analyzer.py
70+
packages/hypergumbo-lang-common/tests/test_dart.py
71+
packages/hypergumbo-lang-common/tests/test_elixir.py
72+
packages/hypergumbo-lang-common/tests/test_elm.py
73+
packages/hypergumbo-lang-common/tests/test_erlang.py
74+
packages/hypergumbo-lang-common/tests/test_fortran_analyzer.py
75+
packages/hypergumbo-lang-common/tests/test_fsharp.py
76+
packages/hypergumbo-lang-common/tests/test_glsl_analyzer.py
77+
packages/hypergumbo-lang-common/tests/test_graphql_analyzer.py
78+
packages/hypergumbo-lang-common/tests/test_haskell.py
79+
packages/hypergumbo-lang-common/tests/test_hcl.py
80+
packages/hypergumbo-lang-common/tests/test_hlsl.py
81+
packages/hypergumbo-lang-common/tests/test_julia.py
82+
packages/hypergumbo-lang-common/tests/test_latex.py
83+
packages/hypergumbo-lang-common/tests/test_matlab.py
84+
packages/hypergumbo-lang-common/tests/test_meson.py
85+
packages/hypergumbo-lang-common/tests/test_nix_analyzer.py
86+
packages/hypergumbo-lang-common/tests/test_ocaml.py
87+
packages/hypergumbo-lang-common/tests/test_proto.py
88+
packages/hypergumbo-lang-common/tests/test_puppet.py
89+
packages/hypergumbo-lang-common/tests/test_purescript.py
90+
packages/hypergumbo-lang-common/tests/test_racket.py
91+
packages/hypergumbo-lang-common/tests/test_r_analyzer.py
92+
packages/hypergumbo-lang-common/tests/test_robot.py
93+
packages/hypergumbo-lang-common/tests/test_rst.py
94+
packages/hypergumbo-lang-common/tests/test_scheme.py
95+
packages/hypergumbo-lang-common/tests/test_scss.py
96+
packages/hypergumbo-lang-common/tests/test_starlark.py
97+
packages/hypergumbo-lang-common/tests/test_svelte.py
98+
packages/hypergumbo-lang-common/tests/test_thrift.py
99+
packages/hypergumbo-lang-common/tests/test_vue.py
100+
packages/hypergumbo-lang-common/tests/test_wgsl_analyzer.py
101+
packages/hypergumbo-lang-extended1/tests/test_ada.py
102+
packages/hypergumbo-lang-extended1/tests/test_agda.py
103+
packages/hypergumbo-lang-extended1/tests/test_apex.py
104+
packages/hypergumbo-lang-extended1/tests/test_bibtex.py
105+
packages/hypergumbo-lang-extended1/tests/test_bitbake.py
106+
packages/hypergumbo-lang-extended1/tests/test_capnp.py
107+
packages/hypergumbo-lang-extended1/tests/test_cobol.py
108+
packages/hypergumbo-lang-extended1/tests/test_d.py
109+
packages/hypergumbo-lang-extended1/tests/test_fennel.py
110+
packages/hypergumbo-lang-extended1/tests/test_fish.py
111+
packages/hypergumbo-lang-extended1/tests/test_gdscript.py
112+
packages/hypergumbo-lang-extended1/tests/test_gleam.py
113+
packages/hypergumbo-lang-extended1/tests/test_hack.py
114+
packages/hypergumbo-lang-extended1/tests/test_haxe.py
115+
packages/hypergumbo-lang-extended1/tests/test_janet.py
116+
packages/hypergumbo-lang-extended1/tests/test_jsonnet.py
117+
packages/hypergumbo-lang-extended1/tests/test_kdl.py
118+
packages/hypergumbo-lang-extended1/tests/test_lean.py
119+
packages/hypergumbo-lang-extended1/tests/test_llvm_ir.py
120+
packages/hypergumbo-lang-extended1/tests/test_luau.py
121+
packages/hypergumbo-lang-extended1/tests/test_nim.py
122+
packages/hypergumbo-lang-extended1/tests/test_odin.py
123+
packages/hypergumbo-lang-extended1/tests/test_pascal.py
124+
packages/hypergumbo-lang-extended1/tests/test_pony.py
125+
packages/hypergumbo-lang-extended1/tests/test_prisma.py
126+
packages/hypergumbo-lang-extended1/tests/test_smithy.py
127+
packages/hypergumbo-lang-extended1/tests/test_solidity.py
128+
packages/hypergumbo-lang-extended1/tests/test_sparql.py
129+
packages/hypergumbo-lang-extended1/tests/test_tcl.py
130+
packages/hypergumbo-lang-extended1/tests/test_twig.py
131+
packages/hypergumbo-lang-extended1/tests/test_verilog_analyzer.py
132+
packages/hypergumbo-lang-extended1/tests/test_vhdl_analyzer.py
133+
packages/hypergumbo-lang-extended1/tests/test_v_lang.py
134+
packages/hypergumbo-lang-extended1/tests/test_wolfram.py
135+
packages/hypergumbo-lang-extended1/tests/test_zig.py
136+
packages/hypergumbo-lang-mainstream/tests/test_bash.py
137+
packages/hypergumbo-lang-mainstream/tests/test_cmake_analyzer.py
138+
packages/hypergumbo-lang-mainstream/tests/test_cpp.py
139+
packages/hypergumbo-lang-mainstream/tests/test_c.py
140+
packages/hypergumbo-lang-mainstream/tests/test_csharp.py
141+
packages/hypergumbo-lang-mainstream/tests/test_css_analyzer.py
142+
packages/hypergumbo-lang-mainstream/tests/test_dockerfile_analyzer.py
143+
packages/hypergumbo-lang-mainstream/tests/test_gitignore.py
144+
packages/hypergumbo-lang-mainstream/tests/test_go.py
145+
packages/hypergumbo-lang-mainstream/tests/test_groovy.py
146+
packages/hypergumbo-lang-mainstream/tests/test_html_analysis.py
147+
packages/hypergumbo-lang-mainstream/tests/test_ini.py
148+
packages/hypergumbo-lang-mainstream/tests/test_java.py
149+
packages/hypergumbo-lang-mainstream/tests/test_jni_linker.py
150+
packages/hypergumbo-lang-mainstream/tests/test_json_analyzer.py
151+
packages/hypergumbo-lang-mainstream/tests/test_js_ts.py
152+
packages/hypergumbo-lang-mainstream/tests/test_kotlin.py
153+
packages/hypergumbo-lang-mainstream/tests/test_lua.py
154+
packages/hypergumbo-lang-mainstream/tests/test_make_analyzer.py
155+
packages/hypergumbo-lang-mainstream/tests/test_markdown.py
156+
packages/hypergumbo-lang-mainstream/tests/test_objc.py
157+
packages/hypergumbo-lang-mainstream/tests/test_perl.py
158+
packages/hypergumbo-lang-mainstream/tests/test_php.py
159+
packages/hypergumbo-lang-mainstream/tests/test_powershell.py
160+
packages/hypergumbo-lang-mainstream/tests/test_properties.py
161+
packages/hypergumbo-lang-mainstream/tests/test_python_ast_analysis.py
162+
packages/hypergumbo-lang-mainstream/tests/test_requirements.py
163+
packages/hypergumbo-lang-mainstream/tests/test_ruby.py
164+
packages/hypergumbo-lang-mainstream/tests/test_rust.py
165+
packages/hypergumbo-lang-mainstream/tests/test_scala.py
166+
packages/hypergumbo-lang-mainstream/tests/test_sql_analyzer.py
167+
packages/hypergumbo-lang-mainstream/tests/test_swift_objc_linker.py
168+
packages/hypergumbo-lang-mainstream/tests/test_swift.py
169+
packages/hypergumbo-lang-mainstream/tests/test_toml_analyzer.py
170+
packages/hypergumbo-lang-mainstream/tests/test_xml_analyzer.py
171+
packages/hypergumbo-lang-mainstream/tests/test_yaml_ansible.py

.githooks/pre-commit

Lines changed: 25 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -33,40 +33,57 @@ if ! command -v bandit &> /dev/null; then
3333
exit 1
3434
fi
3535

36-
# Run ruff
36+
# Run ruff - check packages/ if available, otherwise src/
3737
echo -n " Ruff (linting)... "
38-
if ruff check src/ tests/ --quiet 2>/dev/null; then
38+
if [ -d "packages/hypergumbo-core" ]; then
39+
RUFF_PATHS="packages/*/src packages/*/tests"
40+
else
41+
RUFF_PATHS="src/ tests/"
42+
fi
43+
if ruff check $RUFF_PATHS --quiet 2>/dev/null; then
3944
echo -e "${GREEN}${NC}"
4045
else
4146
echo -e "${RED}${NC}"
4247
echo ""
4348
echo -e "${RED}Ruff found issues:${NC}"
44-
ruff check src/ tests/
49+
ruff check $RUFF_PATHS
4550
exit 1
4651
fi
4752

48-
# Run bandit
53+
# Run bandit - check packages/ if available, otherwise src/
4954
echo -n " Bandit (security)... "
50-
if bandit -r src/ -c pyproject.toml --quiet 2>/dev/null; then
55+
if [ -d "packages/hypergumbo-core" ]; then
56+
BANDIT_PATH="packages/*/src"
57+
else
58+
BANDIT_PATH="src/"
59+
fi
60+
if bandit -r $BANDIT_PATH -c pyproject.toml --quiet 2>/dev/null; then
5161
echo -e "${GREEN}${NC}"
5262
else
5363
echo -e "${RED}${NC}"
5464
echo ""
5565
echo -e "${RED}Bandit found security issues:${NC}"
56-
bandit -r src/ -c pyproject.toml
66+
bandit -r $BANDIT_PATH -c pyproject.toml
5767
exit 1
5868
fi
5969

6070
# Run yamllint (optional - skip if not installed)
6171
echo -n " yamllint (YAML syntax)... "
6272
if command -v yamllint &> /dev/null; then
63-
if yamllint -c .yamllint.yaml src/hypergumbo/frameworks/ 2>/dev/null; then
73+
# Check packages/ structure first, fallback to legacy src/
74+
FRAMEWORKS_DIR="packages/hypergumbo-core/src/hypergumbo_core/frameworks"
75+
if [ ! -d "$FRAMEWORKS_DIR" ]; then
76+
FRAMEWORKS_DIR="src/hypergumbo/frameworks"
77+
fi
78+
if [ -d "$FRAMEWORKS_DIR" ] && yamllint -c .yamllint.yaml "$FRAMEWORKS_DIR" 2>/dev/null; then
6479
echo -e "${GREEN}${NC}"
80+
elif [ ! -d "$FRAMEWORKS_DIR" ]; then
81+
echo -e "${YELLOW}skipped (no frameworks dir)${NC}"
6582
else
6683
echo -e "${RED}${NC}"
6784
echo ""
6885
echo -e "${RED}yamllint found issues:${NC}"
69-
yamllint -c .yamllint.yaml src/hypergumbo/frameworks/
86+
yamllint -c .yamllint.yaml "$FRAMEWORKS_DIR"
7087
exit 1
7188
fi
7289
else

0 commit comments

Comments
 (0)