pi-usereq 0.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/.g.conf +20 -0
- package/.github/workflows/release-npm.yml +131 -0
- package/.gitignore +270 -0
- package/CHANGELOG.md +221 -0
- package/LICENSE +674 -0
- package/README.md +260 -0
- package/TODO.md +20 -0
- package/docs/pi.dev/agent-document-manifest.json +6399 -0
- package/docs/pi.dev/coding-agent-docs/compaction.md +394 -0
- package/docs/pi.dev/coding-agent-docs/custom-provider.md +596 -0
- package/docs/pi.dev/coding-agent-docs/development.md +71 -0
- package/docs/pi.dev/coding-agent-docs/extensions.md +2262 -0
- package/docs/pi.dev/coding-agent-docs/images/doom-extension.png +0 -0
- package/docs/pi.dev/coding-agent-docs/images/exy.png +0 -0
- package/docs/pi.dev/coding-agent-docs/images/interactive-mode.png +0 -0
- package/docs/pi.dev/coding-agent-docs/images/tree-view.png +0 -0
- package/docs/pi.dev/coding-agent-docs/json.md +82 -0
- package/docs/pi.dev/coding-agent-docs/keybindings.md +175 -0
- package/docs/pi.dev/coding-agent-docs/models.md +392 -0
- package/docs/pi.dev/coding-agent-docs/packages.md +218 -0
- package/docs/pi.dev/coding-agent-docs/prompt-templates.md +67 -0
- package/docs/pi.dev/coding-agent-docs/providers.md +195 -0
- package/docs/pi.dev/coding-agent-docs/rpc.md +1377 -0
- package/docs/pi.dev/coding-agent-docs/sdk.md +1124 -0
- package/docs/pi.dev/coding-agent-docs/session.md +412 -0
- package/docs/pi.dev/coding-agent-docs/settings.md +247 -0
- package/docs/pi.dev/coding-agent-docs/shell-aliases.md +13 -0
- package/docs/pi.dev/coding-agent-docs/skills.md +232 -0
- package/docs/pi.dev/coding-agent-docs/terminal-setup.md +106 -0
- package/docs/pi.dev/coding-agent-docs/termux.md +127 -0
- package/docs/pi.dev/coding-agent-docs/themes.md +295 -0
- package/docs/pi.dev/coding-agent-docs/tmux.md +61 -0
- package/docs/pi.dev/coding-agent-docs/tree.md +231 -0
- package/docs/pi.dev/coding-agent-docs/tui.md +887 -0
- package/docs/pi.dev/coding-agent-docs/windows.md +17 -0
- package/docs/pi.dev/mom-docs/artifacts-server.md +475 -0
- package/docs/pi.dev/mom-docs/events.md +307 -0
- package/docs/pi.dev/mom-docs/new.md +970 -0
- package/docs/pi.dev/mom-docs/sandbox.md +153 -0
- package/docs/pi.dev/mom-docs/slack-bot-minimal-guide.md +399 -0
- package/docs/pi.dev/mom-docs/v86.md +319 -0
- package/docs/pi.dev/pods-docs/gml-4.5.md +189 -0
- package/docs/pi.dev/pods-docs/gpt-oss.md +233 -0
- package/docs/pi.dev/pods-docs/implementation-plan.md +183 -0
- package/docs/pi.dev/pods-docs/kimi-k2.md +197 -0
- package/docs/pi.dev/pods-docs/models.md +116 -0
- package/docs/pi.dev/pods-docs/plan.md +166 -0
- package/docs/pi.dev/pods-docs/qwen3-coder.md +132 -0
- package/images/flowchart-bw.png +0 -0
- package/images/flowchart-bw.svg +102 -0
- package/images/flowchart.md +100 -0
- package/images/flowchart.png +0 -0
- package/images/flowchart.svg +3 -0
- package/package.json +46 -0
- package/req/docs/REFERENCES.md +4554 -0
- package/req/docs/REQUIREMENTS.md +475 -0
- package/req/docs/WORKFLOW.md +1059 -0
- package/scripts/debug-extension.ts +497 -0
- package/scripts/lib/extension-debug-harness.ts +450 -0
- package/scripts/lib/recording-extension-api.ts +786 -0
- package/scripts/lib/sdk-smoke.ts +503 -0
- package/scripts/pi-usereq-debug.sh +330 -0
- package/scripts/tool-args-to-params.ts +208 -0
- package/src/cli.ts +349 -0
- package/src/core/agent-tool-json.ts +621 -0
- package/src/core/compress-files.ts +72 -0
- package/src/core/compress-payload.ts +648 -0
- package/src/core/compress.ts +464 -0
- package/src/core/config.ts +272 -0
- package/src/core/doxygen-parser.ts +318 -0
- package/src/core/errors.ts +31 -0
- package/src/core/extension-status.ts +660 -0
- package/src/core/find-constructs.ts +319 -0
- package/src/core/find-payload.ts +915 -0
- package/src/core/generate-markdown.ts +120 -0
- package/src/core/path-context.ts +196 -0
- package/src/core/pi-notify.ts +430 -0
- package/src/core/pi-usereq-tools.ts +140 -0
- package/src/core/prompts.ts +184 -0
- package/src/core/reference-payload.ts +818 -0
- package/src/core/resources.ts +63 -0
- package/src/core/runtime-project-paths.ts +99 -0
- package/src/core/settings-menu.ts +233 -0
- package/src/core/source-analyzer.ts +1721 -0
- package/src/core/static-check.ts +674 -0
- package/src/core/token-counter.ts +729 -0
- package/src/core/tool-runner.ts +717 -0
- package/src/core/utils.ts +185 -0
- package/src/index.ts +2209 -0
- package/src/resources/guidelines/Google_C++_Style_Guide.md +3711 -0
- package/src/resources/guidelines/Google_Python_Style_Guide.md +3709 -0
- package/src/resources/prompts/analyze.md +130 -0
- package/src/resources/prompts/change.md +227 -0
- package/src/resources/prompts/check.md +139 -0
- package/src/resources/prompts/cover.md +219 -0
- package/src/resources/prompts/create.md +104 -0
- package/src/resources/prompts/fix.md +221 -0
- package/src/resources/prompts/flowchart.md +220 -0
- package/src/resources/prompts/implement.md +163 -0
- package/src/resources/prompts/new.md +226 -0
- package/src/resources/prompts/readme.md +182 -0
- package/src/resources/prompts/recreate.md +213 -0
- package/src/resources/prompts/refactor.md +213 -0
- package/src/resources/prompts/references.md +100 -0
- package/src/resources/prompts/renumber.md +119 -0
- package/src/resources/prompts/workflow.md +202 -0
- package/src/resources/prompts/write.md +99 -0
- package/src/resources/sounds/Machine-alert-beep-sound-effect.mp3 +0 -0
- package/src/resources/sounds/Soft-high-tech-notification-sound-effect.mp3 +0 -0
- package/src/resources/templates/Document_Source_Code_in_Doxygen_Style.md +130 -0
- package/src/resources/templates/HDT_Test_Authoring_Guide.md +318 -0
- package/src/resources/templates/Requirements_Template.md +78 -0
- package/tests/attended-results-scenarios.ts +758 -0
- package/tests/attended-results.test.ts +39 -0
- package/tests/cli-command-option-parity.test.ts +815 -0
- package/tests/debug-extension-harness.test.ts +463 -0
- package/tests/extension-registration.test.ts +2006 -0
- package/tests/fixtures/fixture_c.c +361 -0
- package/tests/fixtures/fixture_cpp.cpp +407 -0
- package/tests/fixtures/fixture_csharp.cs +411 -0
- package/tests/fixtures/fixture_elixir.ex +409 -0
- package/tests/fixtures/fixture_go.go +341 -0
- package/tests/fixtures/fixture_haskell.hs +250 -0
- package/tests/fixtures/fixture_java.java +430 -0
- package/tests/fixtures/fixture_javascript.js +383 -0
- package/tests/fixtures/fixture_kotlin.kt +451 -0
- package/tests/fixtures/fixture_lua.lua +276 -0
- package/tests/fixtures/fixture_perl.pl +310 -0
- package/tests/fixtures/fixture_php.php +433 -0
- package/tests/fixtures/fixture_python.py +502 -0
- package/tests/fixtures/fixture_ruby.rb +345 -0
- package/tests/fixtures/fixture_rust.rs +380 -0
- package/tests/fixtures/fixture_scala.scala +398 -0
- package/tests/fixtures/fixture_shell.sh +276 -0
- package/tests/fixtures/fixture_swift.swift +397 -0
- package/tests/fixtures/fixture_typescript.ts +434 -0
- package/tests/fixtures/fixture_zig.zig +295 -0
- package/tests/fixtures_attended_results/project/compress-line-numbers.json +5 -0
- package/tests/fixtures_attended_results/project/compress.json +5 -0
- package/tests/fixtures_attended_results/project/enable-static-check-invalid-command.json +5 -0
- package/tests/fixtures_attended_results/project/enable-static-check-valid.json +5 -0
- package/tests/fixtures_attended_results/project/files-static-check.json +5 -0
- package/tests/fixtures_attended_results/project/find-line-numbers.json +5 -0
- package/tests/fixtures_attended_results/project/find.json +5 -0
- package/tests/fixtures_attended_results/project/get-base-path.json +5 -0
- package/tests/fixtures_attended_results/project/git-check-clean.json +5 -0
- package/tests/fixtures_attended_results/project/git-check-dirty.json +5 -0
- package/tests/fixtures_attended_results/project/git-path.json +5 -0
- package/tests/fixtures_attended_results/project/git-wt-create-invalid.json +5 -0
- package/tests/fixtures_attended_results/project/git-wt-create-valid.json +5 -0
- package/tests/fixtures_attended_results/project/git-wt-delete-nonexistent.json +5 -0
- package/tests/fixtures_attended_results/project/git-wt-delete-valid.json +5 -0
- package/tests/fixtures_attended_results/project/git-wt-name.json +5 -0
- package/tests/fixtures_attended_results/project/references.json +5 -0
- package/tests/fixtures_attended_results/project/static-check.json +5 -0
- package/tests/fixtures_attended_results/project/tokens.json +5 -0
- package/tests/fixtures_attended_results/standalone/files-compress/fixture_c.c.json +5 -0
- package/tests/fixtures_attended_results/standalone/files-compress/fixture_cpp.cpp.json +5 -0
- package/tests/fixtures_attended_results/standalone/files-compress/fixture_csharp.cs.json +5 -0
- package/tests/fixtures_attended_results/standalone/files-compress/fixture_elixir.ex.json +5 -0
- package/tests/fixtures_attended_results/standalone/files-compress/fixture_go.go.json +5 -0
- package/tests/fixtures_attended_results/standalone/files-compress/fixture_haskell.hs.json +5 -0
- package/tests/fixtures_attended_results/standalone/files-compress/fixture_java.java.json +5 -0
- package/tests/fixtures_attended_results/standalone/files-compress/fixture_javascript.js.json +5 -0
- package/tests/fixtures_attended_results/standalone/files-compress/fixture_kotlin.kt.json +5 -0
- package/tests/fixtures_attended_results/standalone/files-compress/fixture_lua.lua.json +5 -0
- package/tests/fixtures_attended_results/standalone/files-compress/fixture_perl.pl.json +5 -0
- package/tests/fixtures_attended_results/standalone/files-compress/fixture_php.php.json +5 -0
- package/tests/fixtures_attended_results/standalone/files-compress/fixture_python.py.json +5 -0
- package/tests/fixtures_attended_results/standalone/files-compress/fixture_ruby.rb.json +5 -0
- package/tests/fixtures_attended_results/standalone/files-compress/fixture_rust.rs.json +5 -0
- package/tests/fixtures_attended_results/standalone/files-compress/fixture_scala.scala.json +5 -0
- package/tests/fixtures_attended_results/standalone/files-compress/fixture_shell.sh.json +5 -0
- package/tests/fixtures_attended_results/standalone/files-compress/fixture_swift.swift.json +5 -0
- package/tests/fixtures_attended_results/standalone/files-compress/fixture_typescript.ts.json +5 -0
- package/tests/fixtures_attended_results/standalone/files-compress/fixture_zig.zig.json +5 -0
- package/tests/fixtures_attended_results/standalone/files-compress-line-numbers/fixture_c.c.json +5 -0
- package/tests/fixtures_attended_results/standalone/files-compress-line-numbers/fixture_cpp.cpp.json +5 -0
- package/tests/fixtures_attended_results/standalone/files-compress-line-numbers/fixture_csharp.cs.json +5 -0
- package/tests/fixtures_attended_results/standalone/files-compress-line-numbers/fixture_elixir.ex.json +5 -0
- package/tests/fixtures_attended_results/standalone/files-compress-line-numbers/fixture_go.go.json +5 -0
- package/tests/fixtures_attended_results/standalone/files-compress-line-numbers/fixture_haskell.hs.json +5 -0
- package/tests/fixtures_attended_results/standalone/files-compress-line-numbers/fixture_java.java.json +5 -0
- package/tests/fixtures_attended_results/standalone/files-compress-line-numbers/fixture_javascript.js.json +5 -0
- package/tests/fixtures_attended_results/standalone/files-compress-line-numbers/fixture_kotlin.kt.json +5 -0
- package/tests/fixtures_attended_results/standalone/files-compress-line-numbers/fixture_lua.lua.json +5 -0
- package/tests/fixtures_attended_results/standalone/files-compress-line-numbers/fixture_perl.pl.json +5 -0
- package/tests/fixtures_attended_results/standalone/files-compress-line-numbers/fixture_php.php.json +5 -0
- package/tests/fixtures_attended_results/standalone/files-compress-line-numbers/fixture_python.py.json +5 -0
- package/tests/fixtures_attended_results/standalone/files-compress-line-numbers/fixture_ruby.rb.json +5 -0
- package/tests/fixtures_attended_results/standalone/files-compress-line-numbers/fixture_rust.rs.json +5 -0
- package/tests/fixtures_attended_results/standalone/files-compress-line-numbers/fixture_scala.scala.json +5 -0
- package/tests/fixtures_attended_results/standalone/files-compress-line-numbers/fixture_shell.sh.json +5 -0
- package/tests/fixtures_attended_results/standalone/files-compress-line-numbers/fixture_swift.swift.json +5 -0
- package/tests/fixtures_attended_results/standalone/files-compress-line-numbers/fixture_typescript.ts.json +5 -0
- package/tests/fixtures_attended_results/standalone/files-compress-line-numbers/fixture_zig.zig.json +5 -0
- package/tests/fixtures_attended_results/standalone/files-find/fixture_c.c.json +5 -0
- package/tests/fixtures_attended_results/standalone/files-find/fixture_cpp.cpp.json +5 -0
- package/tests/fixtures_attended_results/standalone/files-find/fixture_csharp.cs.json +5 -0
- package/tests/fixtures_attended_results/standalone/files-find/fixture_elixir.ex.json +5 -0
- package/tests/fixtures_attended_results/standalone/files-find/fixture_go.go.json +5 -0
- package/tests/fixtures_attended_results/standalone/files-find/fixture_haskell.hs.json +5 -0
- package/tests/fixtures_attended_results/standalone/files-find/fixture_java.java.json +5 -0
- package/tests/fixtures_attended_results/standalone/files-find/fixture_javascript.js.json +5 -0
- package/tests/fixtures_attended_results/standalone/files-find/fixture_kotlin.kt.json +5 -0
- package/tests/fixtures_attended_results/standalone/files-find/fixture_lua.lua.json +5 -0
- package/tests/fixtures_attended_results/standalone/files-find/fixture_perl.pl.json +5 -0
- package/tests/fixtures_attended_results/standalone/files-find/fixture_php.php.json +5 -0
- package/tests/fixtures_attended_results/standalone/files-find/fixture_python.py.json +5 -0
- package/tests/fixtures_attended_results/standalone/files-find/fixture_ruby.rb.json +5 -0
- package/tests/fixtures_attended_results/standalone/files-find/fixture_rust.rs.json +5 -0
- package/tests/fixtures_attended_results/standalone/files-find/fixture_scala.scala.json +5 -0
- package/tests/fixtures_attended_results/standalone/files-find/fixture_shell.sh.json +5 -0
- package/tests/fixtures_attended_results/standalone/files-find/fixture_swift.swift.json +5 -0
- package/tests/fixtures_attended_results/standalone/files-find/fixture_typescript.ts.json +5 -0
- package/tests/fixtures_attended_results/standalone/files-find/fixture_zig.zig.json +5 -0
- package/tests/fixtures_attended_results/standalone/files-find-line-numbers/fixture_c.c.json +5 -0
- package/tests/fixtures_attended_results/standalone/files-find-line-numbers/fixture_cpp.cpp.json +5 -0
- package/tests/fixtures_attended_results/standalone/files-find-line-numbers/fixture_csharp.cs.json +5 -0
- package/tests/fixtures_attended_results/standalone/files-find-line-numbers/fixture_elixir.ex.json +5 -0
- package/tests/fixtures_attended_results/standalone/files-find-line-numbers/fixture_go.go.json +5 -0
- package/tests/fixtures_attended_results/standalone/files-find-line-numbers/fixture_haskell.hs.json +5 -0
- package/tests/fixtures_attended_results/standalone/files-find-line-numbers/fixture_java.java.json +5 -0
- package/tests/fixtures_attended_results/standalone/files-find-line-numbers/fixture_javascript.js.json +5 -0
- package/tests/fixtures_attended_results/standalone/files-find-line-numbers/fixture_kotlin.kt.json +5 -0
- package/tests/fixtures_attended_results/standalone/files-find-line-numbers/fixture_lua.lua.json +5 -0
- package/tests/fixtures_attended_results/standalone/files-find-line-numbers/fixture_perl.pl.json +5 -0
- package/tests/fixtures_attended_results/standalone/files-find-line-numbers/fixture_php.php.json +5 -0
- package/tests/fixtures_attended_results/standalone/files-find-line-numbers/fixture_python.py.json +5 -0
- package/tests/fixtures_attended_results/standalone/files-find-line-numbers/fixture_ruby.rb.json +5 -0
- package/tests/fixtures_attended_results/standalone/files-find-line-numbers/fixture_rust.rs.json +5 -0
- package/tests/fixtures_attended_results/standalone/files-find-line-numbers/fixture_scala.scala.json +5 -0
- package/tests/fixtures_attended_results/standalone/files-find-line-numbers/fixture_shell.sh.json +5 -0
- package/tests/fixtures_attended_results/standalone/files-find-line-numbers/fixture_swift.swift.json +5 -0
- package/tests/fixtures_attended_results/standalone/files-find-line-numbers/fixture_typescript.ts.json +5 -0
- package/tests/fixtures_attended_results/standalone/files-find-line-numbers/fixture_zig.zig.json +5 -0
- package/tests/fixtures_attended_results/standalone/files-references/fixture_c.c.json +5 -0
- package/tests/fixtures_attended_results/standalone/files-references/fixture_cpp.cpp.json +5 -0
- package/tests/fixtures_attended_results/standalone/files-references/fixture_csharp.cs.json +5 -0
- package/tests/fixtures_attended_results/standalone/files-references/fixture_elixir.ex.json +5 -0
- package/tests/fixtures_attended_results/standalone/files-references/fixture_go.go.json +5 -0
- package/tests/fixtures_attended_results/standalone/files-references/fixture_haskell.hs.json +5 -0
- package/tests/fixtures_attended_results/standalone/files-references/fixture_java.java.json +5 -0
- package/tests/fixtures_attended_results/standalone/files-references/fixture_javascript.js.json +5 -0
- package/tests/fixtures_attended_results/standalone/files-references/fixture_kotlin.kt.json +5 -0
- package/tests/fixtures_attended_results/standalone/files-references/fixture_lua.lua.json +5 -0
- package/tests/fixtures_attended_results/standalone/files-references/fixture_perl.pl.json +5 -0
- package/tests/fixtures_attended_results/standalone/files-references/fixture_php.php.json +5 -0
- package/tests/fixtures_attended_results/standalone/files-references/fixture_python.py.json +5 -0
- package/tests/fixtures_attended_results/standalone/files-references/fixture_ruby.rb.json +5 -0
- package/tests/fixtures_attended_results/standalone/files-references/fixture_rust.rs.json +5 -0
- package/tests/fixtures_attended_results/standalone/files-references/fixture_scala.scala.json +5 -0
- package/tests/fixtures_attended_results/standalone/files-references/fixture_shell.sh.json +5 -0
- package/tests/fixtures_attended_results/standalone/files-references/fixture_swift.swift.json +5 -0
- package/tests/fixtures_attended_results/standalone/files-references/fixture_typescript.ts.json +5 -0
- package/tests/fixtures_attended_results/standalone/files-references/fixture_zig.zig.json +5 -0
- package/tests/fixtures_attended_results/standalone/files-tokens/fixture_c.c.json +5 -0
- package/tests/fixtures_attended_results/standalone/files-tokens/fixture_cpp.cpp.json +5 -0
- package/tests/fixtures_attended_results/standalone/files-tokens/fixture_csharp.cs.json +5 -0
- package/tests/fixtures_attended_results/standalone/files-tokens/fixture_elixir.ex.json +5 -0
- package/tests/fixtures_attended_results/standalone/files-tokens/fixture_go.go.json +5 -0
- package/tests/fixtures_attended_results/standalone/files-tokens/fixture_haskell.hs.json +5 -0
- package/tests/fixtures_attended_results/standalone/files-tokens/fixture_java.java.json +5 -0
- package/tests/fixtures_attended_results/standalone/files-tokens/fixture_javascript.js.json +5 -0
- package/tests/fixtures_attended_results/standalone/files-tokens/fixture_kotlin.kt.json +5 -0
- package/tests/fixtures_attended_results/standalone/files-tokens/fixture_lua.lua.json +5 -0
- package/tests/fixtures_attended_results/standalone/files-tokens/fixture_perl.pl.json +5 -0
- package/tests/fixtures_attended_results/standalone/files-tokens/fixture_php.php.json +5 -0
- package/tests/fixtures_attended_results/standalone/files-tokens/fixture_python.py.json +5 -0
- package/tests/fixtures_attended_results/standalone/files-tokens/fixture_ruby.rb.json +5 -0
- package/tests/fixtures_attended_results/standalone/files-tokens/fixture_rust.rs.json +5 -0
- package/tests/fixtures_attended_results/standalone/files-tokens/fixture_scala.scala.json +5 -0
- package/tests/fixtures_attended_results/standalone/files-tokens/fixture_shell.sh.json +5 -0
- package/tests/fixtures_attended_results/standalone/files-tokens/fixture_swift.swift.json +5 -0
- package/tests/fixtures_attended_results/standalone/files-tokens/fixture_typescript.ts.json +5 -0
- package/tests/fixtures_attended_results/standalone/files-tokens/fixture_zig.zig.json +5 -0
- package/tests/fixtures_attended_results/standalone/test-static-check-command/fixture_c.c.json +5 -0
- package/tests/fixtures_attended_results/standalone/test-static-check-command/fixture_cpp.cpp.json +5 -0
- package/tests/fixtures_attended_results/standalone/test-static-check-command/fixture_csharp.cs.json +5 -0
- package/tests/fixtures_attended_results/standalone/test-static-check-command/fixture_elixir.ex.json +5 -0
- package/tests/fixtures_attended_results/standalone/test-static-check-command/fixture_go.go.json +5 -0
- package/tests/fixtures_attended_results/standalone/test-static-check-command/fixture_haskell.hs.json +5 -0
- package/tests/fixtures_attended_results/standalone/test-static-check-command/fixture_java.java.json +5 -0
- package/tests/fixtures_attended_results/standalone/test-static-check-command/fixture_javascript.js.json +5 -0
- package/tests/fixtures_attended_results/standalone/test-static-check-command/fixture_kotlin.kt.json +5 -0
- package/tests/fixtures_attended_results/standalone/test-static-check-command/fixture_lua.lua.json +5 -0
- package/tests/fixtures_attended_results/standalone/test-static-check-command/fixture_perl.pl.json +5 -0
- package/tests/fixtures_attended_results/standalone/test-static-check-command/fixture_php.php.json +5 -0
- package/tests/fixtures_attended_results/standalone/test-static-check-command/fixture_python.py.json +5 -0
- package/tests/fixtures_attended_results/standalone/test-static-check-command/fixture_ruby.rb.json +5 -0
- package/tests/fixtures_attended_results/standalone/test-static-check-command/fixture_rust.rs.json +5 -0
- package/tests/fixtures_attended_results/standalone/test-static-check-command/fixture_scala.scala.json +5 -0
- package/tests/fixtures_attended_results/standalone/test-static-check-command/fixture_shell.sh.json +5 -0
- package/tests/fixtures_attended_results/standalone/test-static-check-command/fixture_swift.swift.json +5 -0
- package/tests/fixtures_attended_results/standalone/test-static-check-command/fixture_typescript.ts.json +5 -0
- package/tests/fixtures_attended_results/standalone/test-static-check-command/fixture_zig.zig.json +5 -0
- package/tests/fixtures_attended_results/standalone/test-static-check-dummy/fixture_c.c.json +5 -0
- package/tests/fixtures_attended_results/standalone/test-static-check-dummy/fixture_cpp.cpp.json +5 -0
- package/tests/fixtures_attended_results/standalone/test-static-check-dummy/fixture_csharp.cs.json +5 -0
- package/tests/fixtures_attended_results/standalone/test-static-check-dummy/fixture_elixir.ex.json +5 -0
- package/tests/fixtures_attended_results/standalone/test-static-check-dummy/fixture_go.go.json +5 -0
- package/tests/fixtures_attended_results/standalone/test-static-check-dummy/fixture_haskell.hs.json +5 -0
- package/tests/fixtures_attended_results/standalone/test-static-check-dummy/fixture_java.java.json +5 -0
- package/tests/fixtures_attended_results/standalone/test-static-check-dummy/fixture_javascript.js.json +5 -0
- package/tests/fixtures_attended_results/standalone/test-static-check-dummy/fixture_kotlin.kt.json +5 -0
- package/tests/fixtures_attended_results/standalone/test-static-check-dummy/fixture_lua.lua.json +5 -0
- package/tests/fixtures_attended_results/standalone/test-static-check-dummy/fixture_perl.pl.json +5 -0
- package/tests/fixtures_attended_results/standalone/test-static-check-dummy/fixture_php.php.json +5 -0
- package/tests/fixtures_attended_results/standalone/test-static-check-dummy/fixture_python.py.json +5 -0
- package/tests/fixtures_attended_results/standalone/test-static-check-dummy/fixture_ruby.rb.json +5 -0
- package/tests/fixtures_attended_results/standalone/test-static-check-dummy/fixture_rust.rs.json +5 -0
- package/tests/fixtures_attended_results/standalone/test-static-check-dummy/fixture_scala.scala.json +5 -0
- package/tests/fixtures_attended_results/standalone/test-static-check-dummy/fixture_shell.sh.json +5 -0
- package/tests/fixtures_attended_results/standalone/test-static-check-dummy/fixture_swift.swift.json +5 -0
- package/tests/fixtures_attended_results/standalone/test-static-check-dummy/fixture_typescript.ts.json +5 -0
- package/tests/fixtures_attended_results/standalone/test-static-check-dummy/fixture_zig.zig.json +5 -0
- package/tests/fixtures_attended_results/standalone/test-static-check-pylance/fixture_c.c.json +5 -0
- package/tests/fixtures_attended_results/standalone/test-static-check-pylance/fixture_cpp.cpp.json +5 -0
- package/tests/fixtures_attended_results/standalone/test-static-check-pylance/fixture_csharp.cs.json +5 -0
- package/tests/fixtures_attended_results/standalone/test-static-check-pylance/fixture_elixir.ex.json +5 -0
- package/tests/fixtures_attended_results/standalone/test-static-check-pylance/fixture_go.go.json +5 -0
- package/tests/fixtures_attended_results/standalone/test-static-check-pylance/fixture_haskell.hs.json +5 -0
- package/tests/fixtures_attended_results/standalone/test-static-check-pylance/fixture_java.java.json +5 -0
- package/tests/fixtures_attended_results/standalone/test-static-check-pylance/fixture_javascript.js.json +5 -0
- package/tests/fixtures_attended_results/standalone/test-static-check-pylance/fixture_kotlin.kt.json +5 -0
- package/tests/fixtures_attended_results/standalone/test-static-check-pylance/fixture_lua.lua.json +5 -0
- package/tests/fixtures_attended_results/standalone/test-static-check-pylance/fixture_perl.pl.json +5 -0
- package/tests/fixtures_attended_results/standalone/test-static-check-pylance/fixture_php.php.json +5 -0
- package/tests/fixtures_attended_results/standalone/test-static-check-pylance/fixture_python.py.json +5 -0
- package/tests/fixtures_attended_results/standalone/test-static-check-pylance/fixture_ruby.rb.json +5 -0
- package/tests/fixtures_attended_results/standalone/test-static-check-pylance/fixture_rust.rs.json +5 -0
- package/tests/fixtures_attended_results/standalone/test-static-check-pylance/fixture_scala.scala.json +5 -0
- package/tests/fixtures_attended_results/standalone/test-static-check-pylance/fixture_shell.sh.json +5 -0
- package/tests/fixtures_attended_results/standalone/test-static-check-pylance/fixture_swift.swift.json +5 -0
- package/tests/fixtures_attended_results/standalone/test-static-check-pylance/fixture_typescript.ts.json +5 -0
- package/tests/fixtures_attended_results/standalone/test-static-check-pylance/fixture_zig.zig.json +5 -0
- package/tests/fixtures_attended_results/standalone/test-static-check-ruff/fixture_c.c.json +5 -0
- package/tests/fixtures_attended_results/standalone/test-static-check-ruff/fixture_cpp.cpp.json +5 -0
- package/tests/fixtures_attended_results/standalone/test-static-check-ruff/fixture_csharp.cs.json +5 -0
- package/tests/fixtures_attended_results/standalone/test-static-check-ruff/fixture_elixir.ex.json +5 -0
- package/tests/fixtures_attended_results/standalone/test-static-check-ruff/fixture_go.go.json +5 -0
- package/tests/fixtures_attended_results/standalone/test-static-check-ruff/fixture_haskell.hs.json +5 -0
- package/tests/fixtures_attended_results/standalone/test-static-check-ruff/fixture_java.java.json +5 -0
- package/tests/fixtures_attended_results/standalone/test-static-check-ruff/fixture_javascript.js.json +5 -0
- package/tests/fixtures_attended_results/standalone/test-static-check-ruff/fixture_kotlin.kt.json +5 -0
- package/tests/fixtures_attended_results/standalone/test-static-check-ruff/fixture_lua.lua.json +5 -0
- package/tests/fixtures_attended_results/standalone/test-static-check-ruff/fixture_perl.pl.json +5 -0
- package/tests/fixtures_attended_results/standalone/test-static-check-ruff/fixture_php.php.json +5 -0
- package/tests/fixtures_attended_results/standalone/test-static-check-ruff/fixture_python.py.json +5 -0
- package/tests/fixtures_attended_results/standalone/test-static-check-ruff/fixture_ruby.rb.json +5 -0
- package/tests/fixtures_attended_results/standalone/test-static-check-ruff/fixture_rust.rs.json +5 -0
- package/tests/fixtures_attended_results/standalone/test-static-check-ruff/fixture_scala.scala.json +5 -0
- package/tests/fixtures_attended_results/standalone/test-static-check-ruff/fixture_shell.sh.json +5 -0
- package/tests/fixtures_attended_results/standalone/test-static-check-ruff/fixture_swift.swift.json +5 -0
- package/tests/fixtures_attended_results/standalone/test-static-check-ruff/fixture_typescript.ts.json +5 -0
- package/tests/fixtures_attended_results/standalone/test-static-check-ruff/fixture_zig.zig.json +5 -0
- package/tests/helpers.ts +204 -0
- package/tests/oracle-project.test.ts +63 -0
- package/tests/oracle-standalone.test.ts +48 -0
- package/tests/prompt-rendering.test.ts +66 -0
- package/tests/release-workflow.test.ts +133 -0
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
{
|
|
2
|
+
"code": 0,
|
|
3
|
+
"stdout": "{\n \"request\": {\n \"tool_name\": \"files-references\",\n \"scope\": \"explicit-files\",\n \"base_dir_path\": \"<ROOT>\",\n \"source_directory_count\": 0,\n \"source_directory_paths\": [],\n \"requested_file_count\": 1,\n \"requested_input_paths\": [\n \"tests/fixtures/fixture_php.php\"\n ],\n \"requested_canonical_paths\": [\n \"tests/fixtures/fixture_php.php\"\n ]\n },\n \"summary\": {\n \"processable_file_count\": 1,\n \"analyzed_file_count\": 1,\n \"error_file_count\": 0,\n \"skipped_file_count\": 0,\n \"total_symbol_count\": 54,\n \"total_import_count\": 6,\n \"total_comment_count\": 70,\n \"total_standalone_comment_count\": 27,\n \"total_doxygen_field_count\": 108,\n \"symbol_kind_counts\": {\n \"CLASS\": 5,\n \"CONSTANT\": 5,\n \"FUNCTION\": 29,\n \"INTERFACE\": 5,\n \"NAMESPACE\": 5,\n \"TRAIT\": 5\n }\n },\n \"repository\": {\n \"root_directory_path\": \"<ROOT>\",\n \"source_directory_paths\": [],\n \"file_count\": 1,\n \"file_canonical_paths\": [\n \"tests/fixtures/fixture_php.php\"\n ],\n \"directory_tree\": {\n \"node_name\": \".\",\n \"relative_path\": \".\",\n \"node_kind\": \"directory\",\n \"child_count\": 1,\n \"children\": [\n {\n \"node_name\": \"tests\",\n \"relative_path\": \"tests\",\n \"node_kind\": \"directory\",\n \"child_count\": 1,\n \"children\": [\n {\n \"node_name\": \"fixtures\",\n \"relative_path\": \"tests/fixtures\",\n \"node_kind\": \"directory\",\n \"child_count\": 1,\n \"children\": [\n {\n \"node_name\": \"fixture_php.php\",\n \"relative_path\": \"tests/fixtures/fixture_php.php\",\n \"node_kind\": \"file\",\n \"child_count\": 0,\n \"children\": []\n }\n ]\n }\n ]\n }\n ]\n }\n },\n \"files\": [\n {\n \"start_line_number\": 1,\n \"end_line_number\": 433,\n \"line_range\": [\n 1,\n 433\n ],\n \"request_index\": 0,\n \"input_path\": \"tests/fixtures/fixture_php.php\",\n \"canonical_path\": \"tests/fixtures/fixture_php.php\",\n \"absolute_path\": \"<ROOT>/tests/fixtures/fixture_php.php\",\n \"file_name\": \"fixture_php.php\",\n \"file_extension\": \".php\",\n \"language_id\": \"php\",\n \"language_name\": \"PHP\",\n \"status\": \"analyzed\",\n \"exists\": true,\n \"is_file\": true,\n \"import_count\": 6,\n \"symbol_count\": 54,\n \"comment_count\": 70,\n \"standalone_comment_count\": 27,\n \"doxygen_field_count\": 108,\n \"file_doxygen\": {\n \"brief\": [\n \"Comprehensive PHP test fixture for parser validation.\"\n ],\n \"details\": [\n \"Covers enums with methods, union/intersection types, readonly\\nproperties, constructor promotion, arrow functions, match expressions,\\nfirst-class callables, attributes, fibers, and named arguments.\"\n ]\n },\n \"imports\": [\n {\n \"start_line_number\": 14,\n \"end_line_number\": 14,\n \"line_range\": [\n 14,\n 14\n ],\n \"import_name\": \"App\\\\Contracts\\\\Repository\",\n \"statement_text\": \"use App\\\\Contracts\\\\Repository;\"\n },\n {\n \"start_line_number\": 15,\n \"end_line_number\": 15,\n \"line_range\": [\n 15,\n 15\n ],\n \"import_name\": \"App\\\\Events\\\\{ModelCreated, ModelDeleted}\",\n \"statement_text\": \"use App\\\\Events\\\\{ModelCreated, ModelDeleted};\"\n },\n {\n \"start_line_number\": 16,\n \"end_line_number\": 16,\n \"line_range\": [\n 16,\n 16\n ],\n \"import_name\": \"Psr\\\\Log\\\\LoggerInterface\",\n \"statement_text\": \"use Psr\\\\Log\\\\LoggerInterface;\"\n },\n {\n \"start_line_number\": 17,\n \"end_line_number\": 17,\n \"line_range\": [\n 17,\n 17\n ],\n \"import_name\": \"'config.php'\",\n \"statement_text\": \"require_once 'config.php';\"\n },\n {\n \"start_line_number\": 276,\n \"end_line_number\": 276,\n \"line_range\": [\n 276,\n 276\n ],\n \"import_name\": \"Cacheable\",\n \"statement_text\": \"use Cacheable;\"\n },\n {\n \"start_line_number\": 277,\n \"end_line_number\": 277,\n \"line_range\": [\n 277,\n 277\n ],\n \"import_name\": \"SoftDeletable\",\n \"statement_text\": \"use SoftDeletable;\"\n }\n ],\n \"symbols\": [\n {\n \"start_line_number\": 12,\n \"end_line_number\": 15,\n \"line_range\": [\n 12,\n 15\n ],\n \"declaration_order_index\": 0,\n \"symbol_name\": \"App\\\\Models\",\n \"qualified_name\": \"App\\\\Models\",\n \"symbol_kind\": \"NAMESPACE\",\n \"type_label\": \"NAMESPACE\",\n \"signature_text\": \"namespace App\\\\Models\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Single line comment\",\n \"attached_comment_lines\": [\n \"Single line comment\",\n \"Multi-line\",\n \"comment\"\n ],\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 22,\n \"end_line_number\": 22,\n \"line_range\": [\n 22,\n 22\n ],\n \"declaration_order_index\": 1,\n \"symbol_name\": \"VERSION\",\n \"qualified_name\": \"VERSION\",\n \"symbol_kind\": \"CONSTANT\",\n \"type_label\": \"CONSTANT\",\n \"signature_text\": \"const VERSION = \\\"1.0\\\"\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Application version string. */\",\n \"doxygen\": {\n \"brief\": [\n \"Application version string. */\"\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 25,\n \"end_line_number\": 25,\n \"line_range\": [\n 25,\n 25\n ],\n \"declaration_order_index\": 2,\n \"symbol_name\": \"MAX_PER_PAGE\",\n \"qualified_name\": \"MAX_PER_PAGE\",\n \"symbol_kind\": \"CONSTANT\",\n \"type_label\": \"CONSTANT\",\n \"signature_text\": \"const MAX_PER_PAGE = 50\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Maximum number of query results per page. */\",\n \"doxygen\": {\n \"brief\": [\n \"Maximum number of query results per page. */\"\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 45,\n \"end_line_number\": 47,\n \"line_range\": [\n 45,\n 47\n ],\n \"declaration_order_index\": 3,\n \"symbol_name\": \"isActive\",\n \"qualified_name\": \"isActive\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"public function isActive(): bool\",\n \"visibility\": \"pub\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Check if the status represents an active state.\",\n \"doxygen\": {\n \"brief\": [\n \"Check if the status represents an active state.\"\n ],\n \"returns\": [\n \"bool True if the entity is publicly visible.\"\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": [\n {\n \"line_number\": 46,\n \"text\": \"return $this === self::Published;\"\n }\n ]\n },\n {\n \"start_line_number\": 53,\n \"end_line_number\": 59,\n \"line_range\": [\n 53,\n 59\n ],\n \"declaration_order_index\": 4,\n \"symbol_name\": \"label\",\n \"qualified_name\": \"label\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"public function label(): string\",\n \"visibility\": \"pub\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Get a human-readable label for display.\",\n \"doxygen\": {\n \"brief\": [\n \"Get a human-readable label for display.\"\n ],\n \"returns\": [\n \"string Formatted status label.\"\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": [\n {\n \"line_number\": 54,\n \"text\": \"return match($this) {\"\n }\n ]\n },\n {\n \"start_line_number\": 69,\n \"end_line_number\": 111,\n \"line_range\": [\n 69,\n 111\n ],\n \"declaration_order_index\": 5,\n \"symbol_name\": \"BaseModel\",\n \"qualified_name\": \"BaseModel\",\n \"symbol_kind\": \"CLASS\",\n \"type_label\": \"CLASS\",\n \"signature_text\": \"abstract class BaseModel\",\n \"child_symbol_names\": [\n \"__construct\",\n \"save\",\n \"validateConstraints\"\n ],\n \"child_qualified_names\": [\n \"BaseModel.__construct\",\n \"BaseModel.save\",\n \"BaseModel.validateConstraints\"\n ],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Abstract base model with common persistence operations.\",\n \"doxygen\": {\n \"brief\": [\n \"Abstract base model with common persistence operations.\",\n \"Construct a model with promoted properties.\"\n ],\n \"details\": [\n \"Uses constructor promotion for compact field declaration.\"\n ],\n \"params\": [\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"int\",\n \"description\": \"$id Unique identifier (readonly after construction).\"\n },\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"\\\\DateTimeImmutable\",\n \"description\": \"$createdAt Timestamp of creation.\"\n }\n ]\n },\n \"body_comment_entries\": [\n {\n \"start_line_number\": 70,\n \"end_line_number\": 74,\n \"line_range\": [\n 70,\n 74\n ],\n \"text\": \"@brief Construct a model with promoted properties. @param int $id Unique identifier (readonly after construction). @param \\\\DateTimeImmutable $createdAt Timestamp of creation.\",\n \"text_lines\": [\n \"@brief Construct a model with promoted properties. @param int $id Unique identifier (readonly after construction). @param \\\\DateTimeImmutable $createdAt Timestamp of creation.\"\n ]\n },\n {\n \"start_line_number\": 80,\n \"end_line_number\": 83,\n \"line_range\": [\n 80,\n 83\n ],\n \"text\": \"@brief Persist the model to the data store. @return bool True if save succeeded.\",\n \"text_lines\": [\n \"@brief Persist the model to the data store. @return bool True if save succeeded.\"\n ]\n },\n {\n \"start_line_number\": 85,\n \"end_line_number\": 85,\n \"line_range\": [\n 85,\n 85\n ],\n \"text\": \"Validate before persisting\",\n \"text_lines\": [\n \"Validate before persisting\"\n ]\n },\n {\n \"start_line_number\": 92,\n \"end_line_number\": 95,\n \"line_range\": [\n 92,\n 95\n ],\n \"text\": \"@brief Validate model state before persistence. @return bool True if model is valid.\",\n \"text_lines\": [\n \"@brief Validate model state before persistence. @return bool True if model is valid.\"\n ]\n },\n {\n \"start_line_number\": 98,\n \"end_line_number\": 101,\n \"line_range\": [\n 98,\n 101\n ],\n \"text\": \"@brief Internal validation helper with type narrowing. @return bool True if entity passes all constraint checks.\",\n \"text_lines\": [\n \"@brief Internal validation helper with type narrowing. @return bool True if entity passes all constraint checks.\"\n ]\n },\n {\n \"start_line_number\": 106,\n \"end_line_number\": 109,\n \"line_range\": [\n 106,\n 109\n ],\n \"text\": \"@brief Convert model to array representation. @return array<string, mixed> Associative array of model properties.\",\n \"text_lines\": [\n \"@brief Convert model to array representation. @return array<string, mixed> Associative array of model properties.\"\n ]\n }\n ],\n \"exit_point_entries\": [\n {\n \"line_number\": 87,\n \"text\": \"return false;\"\n },\n {\n \"line_number\": 89,\n \"text\": \"return true;\"\n },\n {\n \"line_number\": 103,\n \"text\": \"return true;\"\n }\n ]\n },\n {\n \"start_line_number\": 75,\n \"end_line_number\": 78,\n \"line_range\": [\n 75,\n 78\n ],\n \"declaration_order_index\": 6,\n \"symbol_name\": \"__construct\",\n \"qualified_name\": \"BaseModel.__construct\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"public function __construct(\",\n \"visibility\": \"pub\",\n \"parent_symbol_name\": \"BaseModel\",\n \"parent_qualified_name\": \"BaseModel\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 1,\n \"attached_comment_summary_text\": \"Construct a model with promoted properties.\",\n \"doxygen\": {\n \"brief\": [\n \"Construct a model with promoted properties.\"\n ],\n \"params\": [\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"int\",\n \"description\": \"$id Unique identifier (readonly after construction).\"\n },\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"\\\\DateTimeImmutable\",\n \"description\": \"$createdAt Timestamp of creation.\"\n }\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 84,\n \"end_line_number\": 90,\n \"line_range\": [\n 84,\n 90\n ],\n \"declaration_order_index\": 7,\n \"symbol_name\": \"save\",\n \"qualified_name\": \"BaseModel.save\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"public function save(): bool\",\n \"visibility\": \"pub\",\n \"parent_symbol_name\": \"BaseModel\",\n \"parent_qualified_name\": \"BaseModel\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 1,\n \"attached_comment_summary_text\": \"Persist the model to the data store.\",\n \"doxygen\": {\n \"brief\": [\n \"Persist the model to the data store.\"\n ],\n \"returns\": [\n \"bool True if save succeeded.\"\n ]\n },\n \"body_comment_entries\": [\n {\n \"start_line_number\": 85,\n \"end_line_number\": 85,\n \"line_range\": [\n 85,\n 85\n ],\n \"text\": \"Validate before persisting\",\n \"text_lines\": [\n \"Validate before persisting\"\n ]\n }\n ],\n \"exit_point_entries\": [\n {\n \"line_number\": 87,\n \"text\": \"return false;\"\n },\n {\n \"line_number\": 89,\n \"text\": \"return true;\"\n }\n ]\n },\n {\n \"start_line_number\": 102,\n \"end_line_number\": 104,\n \"line_range\": [\n 102,\n 104\n ],\n \"declaration_order_index\": 8,\n \"symbol_name\": \"validateConstraints\",\n \"qualified_name\": \"BaseModel.validateConstraints\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"private static function validateConstraints(): bool\",\n \"visibility\": \"priv\",\n \"parent_symbol_name\": \"BaseModel\",\n \"parent_qualified_name\": \"BaseModel\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 1,\n \"attached_comment_summary_text\": \"Internal validation helper with type narrowing.\",\n \"doxygen\": {\n \"brief\": [\n \"Internal validation helper with type narrowing.\"\n ],\n \"returns\": [\n \"bool True if entity passes all constraint checks.\"\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": [\n {\n \"line_number\": 103,\n \"text\": \"return true;\"\n }\n ]\n },\n {\n \"start_line_number\": 120,\n \"end_line_number\": 179,\n \"line_range\": [\n 120,\n 179\n ],\n \"declaration_order_index\": 9,\n \"symbol_name\": \"User\",\n \"qualified_name\": \"User\",\n \"symbol_kind\": \"CLASS\",\n \"type_label\": \"CLASS\",\n \"signature_text\": \"final class User extends BaseModel\",\n \"child_symbol_names\": [\n \"__construct\",\n \"getName\",\n \"getIdentifier\",\n \"validate\",\n \"toArray\"\n ],\n \"child_qualified_names\": [\n \"User.__construct\",\n \"User.getName\",\n \"User.getIdentifier\",\n \"User.validate\",\n \"User.toArray\"\n ],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Concrete user entity with union and intersection types.\",\n \"doxygen\": {\n \"brief\": [\n \"Concrete user entity with union and intersection types.\",\n \"User's display name.\"\n ]\n },\n \"body_comment_entries\": [\n {\n \"start_line_number\": 121,\n \"end_line_number\": 121,\n \"line_range\": [\n 121,\n 121\n ],\n \"text\": \"@brief User's display name.\",\n \"text_lines\": [\n \"@brief User's display name.\"\n ]\n },\n {\n \"start_line_number\": 124,\n \"end_line_number\": 124,\n \"line_range\": [\n 124,\n 124\n ],\n \"text\": \"@brief User's email address or null if unverified.\",\n \"text_lines\": [\n \"@brief User's email address or null if unverified.\"\n ]\n },\n {\n \"start_line_number\": 127,\n \"end_line_number\": 132,\n \"line_range\": [\n 127,\n 132\n ],\n \"text\": \"@brief Construct a User with promoted and explicit properties. @param int $id Unique user ID. @param string $name Display name. @param string|null $email Optional email address.\",\n \"text_lines\": [\n \"@brief Construct a User with promoted and explicit properties. @param int $id Unique user ID. @param string $name Display name. @param string|null $email Optional email address.\"\n ]\n },\n {\n \"start_line_number\": 143,\n \"end_line_number\": 146,\n \"line_range\": [\n 143,\n 146\n ],\n \"text\": \"@brief Get the user's display name. @return string The user name.\",\n \"text_lines\": [\n \"@brief Get the user's display name. @return string The user name.\"\n ]\n },\n {\n \"start_line_number\": 151,\n \"end_line_number\": 154,\n \"line_range\": [\n 151,\n 154\n ],\n \"text\": \"@brief Get a value that may be string or int. @return string|int The identifier in either format.\",\n \"text_lines\": [\n \"@brief Get a value that may be string or int. @return string|int The identifier in either format.\"\n ]\n },\n {\n \"start_line_number\": 156,\n \"end_line_number\": 156,\n \"line_range\": [\n 156,\n 156\n ],\n \"text\": \"Return email if available, otherwise numeric ID\",\n \"text_lines\": [\n \"Return email if available, otherwise numeric ID\"\n ]\n },\n {\n \"start_line_number\": 160,\n \"end_line_number\": 163,\n \"line_range\": [\n 160,\n 163\n ],\n \"text\": \"@brief Validate user-specific constraints. @return bool True if name is non-empty.\",\n \"text_lines\": [\n \"@brief Validate user-specific constraints. @return bool True if name is non-empty.\"\n ]\n },\n {\n \"start_line_number\": 168,\n \"end_line_number\": 171,\n \"line_range\": [\n 168,\n 171\n ],\n \"text\": \"@brief Serialize user to array. @return array<string, mixed> User data array.\",\n \"text_lines\": [\n \"@brief Serialize user to array. @return array<string, mixed> User data array.\"\n ]\n }\n ],\n \"exit_point_entries\": [\n {\n \"line_number\": 148,\n \"text\": \"return $this->name;\"\n },\n {\n \"line_number\": 157,\n \"text\": \"return $this->email ?? $this->id;\"\n },\n {\n \"line_number\": 165,\n \"text\": \"return strlen($this->name) > 0;\"\n },\n {\n \"line_number\": 173,\n \"text\": \"return [\"\n }\n ]\n },\n {\n \"start_line_number\": 133,\n \"end_line_number\": 141,\n \"line_range\": [\n 133,\n 141\n ],\n \"declaration_order_index\": 10,\n \"symbol_name\": \"__construct\",\n \"qualified_name\": \"User.__construct\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"public function __construct(\",\n \"visibility\": \"pub\",\n \"parent_symbol_name\": \"User\",\n \"parent_qualified_name\": \"User\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 1,\n \"attached_comment_summary_text\": \"Construct a User with promoted and explicit properties.\",\n \"doxygen\": {\n \"brief\": [\n \"Construct a User with promoted and explicit properties.\"\n ],\n \"params\": [\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"int\",\n \"description\": \"$id Unique user ID.\"\n },\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"string\",\n \"description\": \"$name Display name.\"\n },\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"string|null\",\n \"description\": \"$email Optional email address.\"\n }\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 147,\n \"end_line_number\": 149,\n \"line_range\": [\n 147,\n 149\n ],\n \"declaration_order_index\": 11,\n \"symbol_name\": \"getName\",\n \"qualified_name\": \"User.getName\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"public function getName(): string\",\n \"visibility\": \"pub\",\n \"parent_symbol_name\": \"User\",\n \"parent_qualified_name\": \"User\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 1,\n \"attached_comment_summary_text\": \"Get the user's display name.\",\n \"doxygen\": {\n \"brief\": [\n \"Get the user's display name.\"\n ],\n \"returns\": [\n \"string The user name.\"\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": [\n {\n \"line_number\": 148,\n \"text\": \"return $this->name;\"\n }\n ]\n },\n {\n \"start_line_number\": 155,\n \"end_line_number\": 158,\n \"line_range\": [\n 155,\n 158\n ],\n \"declaration_order_index\": 12,\n \"symbol_name\": \"getIdentifier\",\n \"qualified_name\": \"User.getIdentifier\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"public function getIdentifier(): string|int\",\n \"visibility\": \"pub\",\n \"parent_symbol_name\": \"User\",\n \"parent_qualified_name\": \"User\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 1,\n \"attached_comment_summary_text\": \"Get a value that may be string or int.\",\n \"doxygen\": {\n \"brief\": [\n \"Get a value that may be string or int.\"\n ],\n \"returns\": [\n \"string|int The identifier in either format.\"\n ]\n },\n \"body_comment_entries\": [\n {\n \"start_line_number\": 156,\n \"end_line_number\": 156,\n \"line_range\": [\n 156,\n 156\n ],\n \"text\": \"Return email if available, otherwise numeric ID\",\n \"text_lines\": [\n \"Return email if available, otherwise numeric ID\"\n ]\n }\n ],\n \"exit_point_entries\": [\n {\n \"line_number\": 157,\n \"text\": \"return $this->email ?? $this->id;\"\n }\n ]\n },\n {\n \"start_line_number\": 164,\n \"end_line_number\": 166,\n \"line_range\": [\n 164,\n 166\n ],\n \"declaration_order_index\": 13,\n \"symbol_name\": \"validate\",\n \"qualified_name\": \"User.validate\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"protected function validate(): bool\",\n \"visibility\": \"prot\",\n \"parent_symbol_name\": \"User\",\n \"parent_qualified_name\": \"User\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 1,\n \"attached_comment_summary_text\": \"Validate user-specific constraints.\",\n \"doxygen\": {\n \"brief\": [\n \"Validate user-specific constraints.\"\n ],\n \"returns\": [\n \"bool True if name is non-empty.\"\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": [\n {\n \"line_number\": 165,\n \"text\": \"return strlen($this->name) > 0;\"\n }\n ]\n },\n {\n \"start_line_number\": 172,\n \"end_line_number\": 178,\n \"line_range\": [\n 172,\n 178\n ],\n \"declaration_order_index\": 14,\n \"symbol_name\": \"toArray\",\n \"qualified_name\": \"User.toArray\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"public function toArray(): array\",\n \"visibility\": \"pub\",\n \"parent_symbol_name\": \"User\",\n \"parent_qualified_name\": \"User\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 1,\n \"attached_comment_summary_text\": \"Serialize user to array.\",\n \"doxygen\": {\n \"brief\": [\n \"Serialize user to array.\"\n ],\n \"returns\": [\n \"array<string, mixed> User data array.\"\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": [\n {\n \"line_number\": 173,\n \"text\": \"return [\"\n }\n ]\n },\n {\n \"start_line_number\": 187,\n \"end_line_number\": 207,\n \"line_range\": [\n 187,\n 207\n ],\n \"declaration_order_index\": 15,\n \"symbol_name\": \"Repo\",\n \"qualified_name\": \"Repo\",\n \"symbol_kind\": \"INTERFACE\",\n \"type_label\": \"INTERFACE\",\n \"signature_text\": \"interface Repo\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Generic repository interface for data access patterns.\",\n \"doxygen\": {\n \"brief\": [\n \"Generic repository interface for data access patterns.\",\n \"Retrieve all entities.\"\n ],\n \"returns\": [\n \"iterable<BaseModel> Collection of models.\"\n ]\n },\n \"body_comment_entries\": [\n {\n \"start_line_number\": 188,\n \"end_line_number\": 191,\n \"line_range\": [\n 188,\n 191\n ],\n \"text\": \"@brief Retrieve all entities. @return iterable<BaseModel> Collection of models.\",\n \"text_lines\": [\n \"@brief Retrieve all entities. @return iterable<BaseModel> Collection of models.\"\n ]\n },\n {\n \"start_line_number\": 194,\n \"end_line_number\": 198,\n \"line_range\": [\n 194,\n 198\n ],\n \"text\": \"@brief Find a single entity by ID. @param int $id Entity identifier. @return BaseModel|null The found entity or null.\",\n \"text_lines\": [\n \"@brief Find a single entity by ID. @param int $id Entity identifier. @return BaseModel|null The found entity or null.\"\n ]\n },\n {\n \"start_line_number\": 201,\n \"end_line_number\": 205,\n \"line_range\": [\n 201,\n 205\n ],\n \"text\": \"@brief Count entities matching a filter. @param array<string, mixed> $criteria Filter criteria. @return int Number of matching entities.\",\n \"text_lines\": [\n \"@brief Count entities matching a filter. @param array<string, mixed> $criteria Filter criteria. @return int Number of matching entities.\"\n ]\n }\n ],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 192,\n \"end_line_number\": 215,\n \"line_range\": [\n 192,\n 215\n ],\n \"declaration_order_index\": 16,\n \"symbol_name\": \"findAll\",\n \"qualified_name\": \"findAll\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"public function findAll(): iterable\",\n \"visibility\": \"pub\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Retrieve all entities.\",\n \"doxygen\": {\n \"brief\": [\n \"Retrieve all entities.\",\n \"Find a single entity by ID.\"\n ],\n \"params\": [\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"int\",\n \"description\": \"$id Entity identifier.\"\n }\n ],\n \"returns\": [\n \"iterable<BaseModel> Collection of models.\",\n \"BaseModel|null The found entity or null.\"\n ]\n },\n \"body_comment_entries\": [\n {\n \"start_line_number\": 194,\n \"end_line_number\": 198,\n \"line_range\": [\n 194,\n 198\n ],\n \"text\": \"@brief Find a single entity by ID. @param int $id Entity identifier. @return BaseModel|null The found entity or null.\",\n \"text_lines\": [\n \"@brief Find a single entity by ID. @param int $id Entity identifier. @return BaseModel|null The found entity or null.\"\n ]\n },\n {\n \"start_line_number\": 201,\n \"end_line_number\": 205,\n \"line_range\": [\n 201,\n 205\n ],\n \"text\": \"@brief Count entities matching a filter. @param array<string, mixed> $criteria Filter criteria. @return int Number of matching entities.\",\n \"text_lines\": [\n \"@brief Count entities matching a filter. @param array<string, mixed> $criteria Filter criteria. @return int Number of matching entities.\"\n ]\n },\n {\n \"start_line_number\": 209,\n \"end_line_number\": 209,\n \"line_range\": [\n 209,\n 209\n ],\n \"text\": \"── Trait with abstract methods ────────────────────────────────────────\",\n \"text_lines\": [\n \"── Trait with abstract methods ────────────────────────────────────────\"\n ]\n },\n {\n \"start_line_number\": 211,\n \"end_line_number\": 214,\n \"line_range\": [\n 211,\n 214\n ],\n \"text\": \"@trait Cacheable @brief Provides caching capabilities for models.\",\n \"text_lines\": [\n \"@trait Cacheable @brief Provides caching capabilities for models.\"\n ]\n }\n ],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 199,\n \"end_line_number\": 215,\n \"line_range\": [\n 199,\n 215\n ],\n \"declaration_order_index\": 17,\n \"symbol_name\": \"findById\",\n \"qualified_name\": \"findById\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"public function findById(int $id): ?BaseModel\",\n \"visibility\": \"pub\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Find a single entity by ID.\",\n \"doxygen\": {\n \"brief\": [\n \"Find a single entity by ID.\",\n \"Count entities matching a filter.\"\n ],\n \"params\": [\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"int\",\n \"description\": \"$id Entity identifier.\"\n },\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"array<string,\",\n \"description\": \"mixed> $criteria Filter criteria.\"\n }\n ],\n \"returns\": [\n \"BaseModel|null The found entity or null.\",\n \"int Number of matching entities.\"\n ]\n },\n \"body_comment_entries\": [\n {\n \"start_line_number\": 201,\n \"end_line_number\": 205,\n \"line_range\": [\n 201,\n 205\n ],\n \"text\": \"@brief Count entities matching a filter. @param array<string, mixed> $criteria Filter criteria. @return int Number of matching entities.\",\n \"text_lines\": [\n \"@brief Count entities matching a filter. @param array<string, mixed> $criteria Filter criteria. @return int Number of matching entities.\"\n ]\n },\n {\n \"start_line_number\": 209,\n \"end_line_number\": 209,\n \"line_range\": [\n 209,\n 209\n ],\n \"text\": \"── Trait with abstract methods ────────────────────────────────────────\",\n \"text_lines\": [\n \"── Trait with abstract methods ────────────────────────────────────────\"\n ]\n },\n {\n \"start_line_number\": 211,\n \"end_line_number\": 214,\n \"line_range\": [\n 211,\n 214\n ],\n \"text\": \"@trait Cacheable @brief Provides caching capabilities for models.\",\n \"text_lines\": [\n \"@trait Cacheable @brief Provides caching capabilities for models.\"\n ]\n }\n ],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 206,\n \"end_line_number\": 215,\n \"line_range\": [\n 206,\n 215\n ],\n \"declaration_order_index\": 18,\n \"symbol_name\": \"count\",\n \"qualified_name\": \"count\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"public function count(array $criteria = []): int\",\n \"visibility\": \"pub\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Count entities matching a filter.\",\n \"doxygen\": {\n \"brief\": [\n \"Count entities matching a filter.\"\n ],\n \"params\": [\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"array<string,\",\n \"description\": \"mixed> $criteria Filter criteria.\"\n }\n ],\n \"returns\": [\n \"int Number of matching entities.\"\n ]\n },\n \"body_comment_entries\": [\n {\n \"start_line_number\": 209,\n \"end_line_number\": 209,\n \"line_range\": [\n 209,\n 209\n ],\n \"text\": \"── Trait with abstract methods ────────────────────────────────────────\",\n \"text_lines\": [\n \"── Trait with abstract methods ────────────────────────────────────────\"\n ]\n },\n {\n \"start_line_number\": 211,\n \"end_line_number\": 214,\n \"line_range\": [\n 211,\n 214\n ],\n \"text\": \"@trait Cacheable @brief Provides caching capabilities for models.\",\n \"text_lines\": [\n \"@trait Cacheable @brief Provides caching capabilities for models.\"\n ]\n }\n ],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 215,\n \"end_line_number\": 241,\n \"line_range\": [\n 215,\n 241\n ],\n \"declaration_order_index\": 19,\n \"symbol_name\": \"Cacheable\",\n \"qualified_name\": \"Cacheable\",\n \"symbol_kind\": \"TRAIT\",\n \"type_label\": \"TRAIT\",\n \"signature_text\": \"trait Cacheable\",\n \"child_symbol_names\": [\n \"cache\",\n \"invalidateCache\"\n ],\n \"child_qualified_names\": [\n \"Cacheable.cache\",\n \"Cacheable.invalidateCache\"\n ],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Provides caching capabilities for models.\",\n \"doxygen\": {\n \"brief\": [\n \"Provides caching capabilities for models.\",\n \"Cache TTL in seconds.\"\n ]\n },\n \"body_comment_entries\": [\n {\n \"start_line_number\": 216,\n \"end_line_number\": 216,\n \"line_range\": [\n 216,\n 216\n ],\n \"text\": \"@brief Cache TTL in seconds.\",\n \"text_lines\": [\n \"@brief Cache TTL in seconds.\"\n ]\n },\n {\n \"start_line_number\": 219,\n \"end_line_number\": 222,\n \"line_range\": [\n 219,\n 222\n ],\n \"text\": \"@brief Store the current object in cache. @return bool True if caching succeeded.\",\n \"text_lines\": [\n \"@brief Store the current object in cache. @return bool True if caching succeeded.\"\n ]\n },\n {\n \"start_line_number\": 224,\n \"end_line_number\": 224,\n \"line_range\": [\n 224,\n 224\n ],\n \"text\": \"Serialize and store with TTL\",\n \"text_lines\": [\n \"Serialize and store with TTL\"\n ]\n },\n {\n \"start_line_number\": 228,\n \"end_line_number\": 231,\n \"line_range\": [\n 228,\n 231\n ],\n \"text\": \"@brief Invalidate the cached version of this object. @return void\",\n \"text_lines\": [\n \"@brief Invalidate the cached version of this object. @return void\"\n ]\n },\n {\n \"start_line_number\": 233,\n \"end_line_number\": 233,\n \"line_range\": [\n 233,\n 233\n ],\n \"text\": \"Remove from cache backend\",\n \"text_lines\": [\n \"Remove from cache backend\"\n ]\n },\n {\n \"start_line_number\": 236,\n \"end_line_number\": 239,\n \"line_range\": [\n 236,\n 239\n ],\n \"text\": \"@brief Require implementing classes to provide a cache key. @return string The unique cache key.\",\n \"text_lines\": [\n \"@brief Require implementing classes to provide a cache key. @return string The unique cache key.\"\n ]\n }\n ],\n \"exit_point_entries\": [\n {\n \"line_number\": 225,\n \"text\": \"return true;\"\n }\n ]\n },\n {\n \"start_line_number\": 223,\n \"end_line_number\": 226,\n \"line_range\": [\n 223,\n 226\n ],\n \"declaration_order_index\": 20,\n \"symbol_name\": \"cache\",\n \"qualified_name\": \"Cacheable.cache\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"public function cache(): bool\",\n \"visibility\": \"pub\",\n \"parent_symbol_name\": \"Cacheable\",\n \"parent_qualified_name\": \"Cacheable\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 1,\n \"attached_comment_summary_text\": \"Store the current object in cache.\",\n \"doxygen\": {\n \"brief\": [\n \"Store the current object in cache.\"\n ],\n \"returns\": [\n \"bool True if caching succeeded.\"\n ]\n },\n \"body_comment_entries\": [\n {\n \"start_line_number\": 224,\n \"end_line_number\": 224,\n \"line_range\": [\n 224,\n 224\n ],\n \"text\": \"Serialize and store with TTL\",\n \"text_lines\": [\n \"Serialize and store with TTL\"\n ]\n }\n ],\n \"exit_point_entries\": [\n {\n \"line_number\": 225,\n \"text\": \"return true;\"\n }\n ]\n },\n {\n \"start_line_number\": 232,\n \"end_line_number\": 234,\n \"line_range\": [\n 232,\n 234\n ],\n \"declaration_order_index\": 21,\n \"symbol_name\": \"invalidateCache\",\n \"qualified_name\": \"Cacheable.invalidateCache\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"public function invalidateCache(): void\",\n \"visibility\": \"pub\",\n \"parent_symbol_name\": \"Cacheable\",\n \"parent_qualified_name\": \"Cacheable\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 1,\n \"attached_comment_summary_text\": \"Invalidate the cached version of this object.\",\n \"doxygen\": {\n \"brief\": [\n \"Invalidate the cached version of this object.\"\n ],\n \"returns\": [\n \"void\"\n ]\n },\n \"body_comment_entries\": [\n {\n \"start_line_number\": 233,\n \"end_line_number\": 233,\n \"line_range\": [\n 233,\n 233\n ],\n \"text\": \"Remove from cache backend\",\n \"text_lines\": [\n \"Remove from cache backend\"\n ]\n }\n ],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 247,\n \"end_line_number\": 266,\n \"line_range\": [\n 247,\n 266\n ],\n \"declaration_order_index\": 22,\n \"symbol_name\": \"SoftDeletable\",\n \"qualified_name\": \"SoftDeletable\",\n \"symbol_kind\": \"TRAIT\",\n \"type_label\": \"TRAIT\",\n \"signature_text\": \"trait SoftDeletable\",\n \"child_symbol_names\": [\n \"softDelete\",\n \"isDeleted\"\n ],\n \"child_qualified_names\": [\n \"SoftDeletable.softDelete\",\n \"SoftDeletable.isDeleted\"\n ],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Adds soft delete functionality to models.\",\n \"doxygen\": {\n \"brief\": [\n \"Adds soft delete functionality to models.\",\n \"Timestamp of soft deletion or null if active.\"\n ]\n },\n \"body_comment_entries\": [\n {\n \"start_line_number\": 248,\n \"end_line_number\": 248,\n \"line_range\": [\n 248,\n 248\n ],\n \"text\": \"@brief Timestamp of soft deletion or null if active.\",\n \"text_lines\": [\n \"@brief Timestamp of soft deletion or null if active.\"\n ]\n },\n {\n \"start_line_number\": 251,\n \"end_line_number\": 254,\n \"line_range\": [\n 251,\n 254\n ],\n \"text\": \"@brief Mark the entity as soft-deleted. @return void\",\n \"text_lines\": [\n \"@brief Mark the entity as soft-deleted. @return void\"\n ]\n },\n {\n \"start_line_number\": 259,\n \"end_line_number\": 262,\n \"line_range\": [\n 259,\n 262\n ],\n \"text\": \"@brief Check if the entity is currently deleted. @return bool True if soft-deleted.\",\n \"text_lines\": [\n \"@brief Check if the entity is currently deleted. @return bool True if soft-deleted.\"\n ]\n }\n ],\n \"exit_point_entries\": [\n {\n \"line_number\": 264,\n \"text\": \"return $this->deletedAt !== null;\"\n }\n ]\n },\n {\n \"start_line_number\": 255,\n \"end_line_number\": 257,\n \"line_range\": [\n 255,\n 257\n ],\n \"declaration_order_index\": 23,\n \"symbol_name\": \"softDelete\",\n \"qualified_name\": \"SoftDeletable.softDelete\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"public function softDelete(): void\",\n \"visibility\": \"pub\",\n \"parent_symbol_name\": \"SoftDeletable\",\n \"parent_qualified_name\": \"SoftDeletable\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 1,\n \"attached_comment_summary_text\": \"Mark the entity as soft-deleted.\",\n \"doxygen\": {\n \"brief\": [\n \"Mark the entity as soft-deleted.\"\n ],\n \"returns\": [\n \"void\"\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 263,\n \"end_line_number\": 265,\n \"line_range\": [\n 263,\n 265\n ],\n \"declaration_order_index\": 24,\n \"symbol_name\": \"isDeleted\",\n \"qualified_name\": \"SoftDeletable.isDeleted\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"public function isDeleted(): bool\",\n \"visibility\": \"pub\",\n \"parent_symbol_name\": \"SoftDeletable\",\n \"parent_qualified_name\": \"SoftDeletable\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 1,\n \"attached_comment_summary_text\": \"Check if the entity is currently deleted.\",\n \"doxygen\": {\n \"brief\": [\n \"Check if the entity is currently deleted.\"\n ],\n \"returns\": [\n \"bool True if soft-deleted.\"\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": [\n {\n \"line_number\": 264,\n \"text\": \"return $this->deletedAt !== null;\"\n }\n ]\n },\n {\n \"start_line_number\": 275,\n \"end_line_number\": 286,\n \"line_range\": [\n 275,\n 286\n ],\n \"declaration_order_index\": 25,\n \"symbol_name\": \"CachedUser\",\n \"qualified_name\": \"CachedUser\",\n \"symbol_kind\": \"CLASS\",\n \"type_label\": \"CLASS\",\n \"signature_text\": \"final class CachedUser extends User\",\n \"child_symbol_names\": [\n \"cacheKey\"\n ],\n \"child_qualified_names\": [\n \"CachedUser.cacheKey\"\n ],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"User entity with caching and soft-delete capabilities.\",\n \"doxygen\": {\n \"brief\": [\n \"User entity with caching and soft-delete capabilities.\"\n ]\n },\n \"body_comment_entries\": [\n {\n \"start_line_number\": 279,\n \"end_line_number\": 282,\n \"line_range\": [\n 279,\n 282\n ],\n \"text\": \"@brief Generate a unique cache key for this user. @return string Cache key in format \\\"user:{id}\\\".\",\n \"text_lines\": [\n \"@brief Generate a unique cache key for this user. @return string Cache key in format \\\"user:{id}\\\".\"\n ]\n }\n ],\n \"exit_point_entries\": [\n {\n \"line_number\": 284,\n \"text\": \"return \\\"user:{$this->id}\\\";\"\n }\n ]\n },\n {\n \"start_line_number\": 283,\n \"end_line_number\": 285,\n \"line_range\": [\n 283,\n 285\n ],\n \"declaration_order_index\": 26,\n \"symbol_name\": \"cacheKey\",\n \"qualified_name\": \"CachedUser.cacheKey\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"public function cacheKey(): string\",\n \"visibility\": \"pub\",\n \"parent_symbol_name\": \"CachedUser\",\n \"parent_qualified_name\": \"CachedUser\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 1,\n \"attached_comment_summary_text\": \"Generate a unique cache key for this user.\",\n \"doxygen\": {\n \"brief\": [\n \"Generate a unique cache key for this user.\"\n ],\n \"returns\": [\n \"string Cache key in format \\\"user:{id}\\\".\"\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": [\n {\n \"line_number\": 284,\n \"text\": \"return \\\"user:{$this->id}\\\";\"\n }\n ]\n },\n {\n \"start_line_number\": 295,\n \"end_line_number\": 305,\n \"line_range\": [\n 295,\n 305\n ],\n \"declaration_order_index\": 27,\n \"symbol_name\": \"Route\",\n \"qualified_name\": \"Route\",\n \"symbol_kind\": \"CLASS\",\n \"type_label\": \"CLASS\",\n \"signature_text\": \"class Route\",\n \"child_symbol_names\": [\n \"__construct\"\n ],\n \"child_qualified_names\": [\n \"Route.__construct\"\n ],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"PHP attribute for annotating controller methods with routes.\",\n \"doxygen\": {\n \"brief\": [\n \"PHP attribute for annotating controller methods with routes.\",\n \"Define a route attribute.\"\n ],\n \"params\": [\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"string\",\n \"description\": \"$path URL path pattern.\"\n },\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"string\",\n \"description\": \"$method HTTP method (GET, POST, etc.).\"\n }\n ]\n },\n \"body_comment_entries\": [\n {\n \"start_line_number\": 296,\n \"end_line_number\": 300,\n \"line_range\": [\n 296,\n 300\n ],\n \"text\": \"@brief Define a route attribute. @param string $path URL path pattern. @param string $method HTTP method (GET, POST, etc.).\",\n \"text_lines\": [\n \"@brief Define a route attribute. @param string $path URL path pattern. @param string $method HTTP method (GET, POST, etc.).\"\n ]\n }\n ],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 301,\n \"end_line_number\": 304,\n \"line_range\": [\n 301,\n 304\n ],\n \"declaration_order_index\": 28,\n \"symbol_name\": \"__construct\",\n \"qualified_name\": \"Route.__construct\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"public function __construct(\",\n \"visibility\": \"pub\",\n \"parent_symbol_name\": \"Route\",\n \"parent_qualified_name\": \"Route\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 1,\n \"attached_comment_summary_text\": \"Define a route attribute.\",\n \"doxygen\": {\n \"brief\": [\n \"Define a route attribute.\"\n ],\n \"params\": [\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"string\",\n \"description\": \"$path URL path pattern.\"\n },\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"string\",\n \"description\": \"$method HTTP method (GET, POST, etc.).\"\n }\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 314,\n \"end_line_number\": 316,\n \"line_range\": [\n 314,\n 316\n ],\n \"declaration_order_index\": 29,\n \"symbol_name\": \"helper\",\n \"qualified_name\": \"helper\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"function helper(): bool\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Standalone helper returning a boolean result.\",\n \"doxygen\": {\n \"brief\": [\n \"Standalone helper returning a boolean result.\"\n ],\n \"returns\": [\n \"bool Always returns true.\"\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": [\n {\n \"line_number\": 315,\n \"text\": \"return true;\"\n }\n ]\n },\n {\n \"start_line_number\": 324,\n \"end_line_number\": 333,\n \"line_range\": [\n 324,\n 333\n ],\n \"declaration_order_index\": 30,\n \"symbol_name\": \"processData\",\n \"qualified_name\": \"processData\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"function processData(mixed $data): string\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Process data using match expression for type dispatching.\",\n \"doxygen\": {\n \"brief\": [\n \"Process data using match expression for type dispatching.\"\n ],\n \"params\": [\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"mixed\",\n \"description\": \"$data Input data of any type.\"\n }\n ],\n \"returns\": [\n \"string Description of the processed data.\"\n ]\n },\n \"body_comment_entries\": [\n {\n \"start_line_number\": 325,\n \"end_line_number\": 325,\n \"line_range\": [\n 325,\n 325\n ],\n \"text\": \"Match expression for exhaustive type handling\",\n \"text_lines\": [\n \"Match expression for exhaustive type handling\"\n ]\n }\n ],\n \"exit_point_entries\": [\n {\n \"line_number\": 326,\n \"text\": \"return match(true) {\"\n }\n ]\n },\n {\n \"start_line_number\": 342,\n \"end_line_number\": 344,\n \"line_range\": [\n 342,\n 344\n ],\n \"declaration_order_index\": 31,\n \"symbol_name\": \"applyTransform\",\n \"qualified_name\": \"applyTransform\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"function applyTransform(array $items, callable $fn): array\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Higher-order function using arrow function syntax.\",\n \"doxygen\": {\n \"brief\": [\n \"Higher-order function using arrow function syntax.\"\n ],\n \"params\": [\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"array<int>\",\n \"description\": \"$items Array of integers.\"\n },\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"callable(int):\",\n \"description\": \"int $fn Transform function.\"\n }\n ],\n \"returns\": [\n \"array<int> Transformed array.\"\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": [\n {\n \"line_number\": 343,\n \"text\": \"return array_map(fn(int $x): int => $fn($x), $items);\"\n }\n ]\n },\n {\n \"start_line_number\": 352,\n \"end_line_number\": 355,\n \"line_range\": [\n 352,\n 355\n ],\n \"declaration_order_index\": 32,\n \"symbol_name\": \"createMultiplier\",\n \"qualified_name\": \"createMultiplier\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"function createMultiplier(int $factor): \\\\Closure\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Create a closure that multiplies its argument.\",\n \"doxygen\": {\n \"brief\": [\n \"Create a closure that multiplies its argument.\"\n ],\n \"params\": [\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"int\",\n \"description\": \"$factor The multiplication factor.\"\n }\n ],\n \"returns\": [\n \"\\\\Closure(int): int A multiplier closure.\"\n ]\n },\n \"body_comment_entries\": [\n {\n \"start_line_number\": 353,\n \"end_line_number\": 353,\n \"line_range\": [\n 353,\n 353\n ],\n \"text\": \"Capture $factor in the returned closure\",\n \"text_lines\": [\n \"Capture $factor in the returned closure\"\n ]\n }\n ],\n \"exit_point_entries\": [\n {\n \"line_number\": 354,\n \"text\": \"return fn(int $x): int => $x * $factor;\"\n }\n ]\n },\n {\n \"start_line_number\": 363,\n \"end_line_number\": 368,\n \"line_range\": [\n 363,\n 368\n ],\n \"declaration_order_index\": 33,\n \"symbol_name\": \"readFileContent\",\n \"qualified_name\": \"readFileContent\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"function readFileContent(string $path): string|false\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Read file contents with comprehensive error handling.\",\n \"doxygen\": {\n \"brief\": [\n \"Read file contents with comprehensive error handling.\"\n ],\n \"params\": [\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"string\",\n \"description\": \"$path File system path.\"\n }\n ],\n \"returns\": [\n \"string|false File contents or false on failure.\"\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": [\n {\n \"line_number\": 365,\n \"text\": \"return false;\"\n },\n {\n \"line_number\": 367,\n \"text\": \"return file_get_contents($path);\"\n }\n ]\n },\n {\n \"start_line_number\": 371,\n \"end_line_number\": 375,\n \"line_range\": [\n 371,\n 375\n ],\n \"declaration_order_index\": 34,\n \"symbol_name\": \"App\\\\Services\",\n \"qualified_name\": \"App\\\\Services\",\n \"symbol_kind\": \"NAMESPACE\",\n \"type_label\": \"NAMESPACE\",\n \"signature_text\": \"namespace App\\\\Services\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"coverage extension block\",\n \"attached_comment_lines\": [\n \"coverage extension block\"\n ],\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 372,\n \"end_line_number\": 375,\n \"line_range\": [\n 372,\n 375\n ],\n \"declaration_order_index\": 35,\n \"symbol_name\": \"App\\\\Http\",\n \"qualified_name\": \"App\\\\Http\",\n \"symbol_kind\": \"NAMESPACE\",\n \"type_label\": \"NAMESPACE\",\n \"signature_text\": \"namespace App\\\\Http\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 373,\n \"end_line_number\": 375,\n \"line_range\": [\n 373,\n 375\n ],\n \"declaration_order_index\": 36,\n \"symbol_name\": \"App\\\\Domain\",\n \"qualified_name\": \"App\\\\Domain\",\n \"symbol_kind\": \"NAMESPACE\",\n \"type_label\": \"NAMESPACE\",\n \"signature_text\": \"namespace App\\\\Domain\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 374,\n \"end_line_number\": 375,\n \"line_range\": [\n 374,\n 375\n ],\n \"declaration_order_index\": 37,\n \"symbol_name\": \"App\\\\Support\",\n \"qualified_name\": \"App\\\\Support\",\n \"symbol_kind\": \"NAMESPACE\",\n \"type_label\": \"NAMESPACE\",\n \"signature_text\": \"namespace App\\\\Support\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 375,\n \"end_line_number\": 375,\n \"line_range\": [\n 375,\n 375\n ],\n \"declaration_order_index\": 38,\n \"symbol_name\": \"ServiceContract\",\n \"qualified_name\": \"ServiceContract\",\n \"symbol_kind\": \"INTERFACE\",\n \"type_label\": \"INTERFACE\",\n \"signature_text\": \"interface ServiceContract {}\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 376,\n \"end_line_number\": 376,\n \"line_range\": [\n 376,\n 376\n ],\n \"declaration_order_index\": 39,\n \"symbol_name\": \"CacheContract\",\n \"qualified_name\": \"CacheContract\",\n \"symbol_kind\": \"INTERFACE\",\n \"type_label\": \"INTERFACE\",\n \"signature_text\": \"interface CacheContract {}\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 377,\n \"end_line_number\": 377,\n \"line_range\": [\n 377,\n 377\n ],\n \"declaration_order_index\": 40,\n \"symbol_name\": \"LoggerContract\",\n \"qualified_name\": \"LoggerContract\",\n \"symbol_kind\": \"INTERFACE\",\n \"type_label\": \"INTERFACE\",\n \"signature_text\": \"interface LoggerContract {}\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 378,\n \"end_line_number\": 378,\n \"line_range\": [\n 378,\n 378\n ],\n \"declaration_order_index\": 41,\n \"symbol_name\": \"EventContract\",\n \"qualified_name\": \"EventContract\",\n \"symbol_kind\": \"INTERFACE\",\n \"type_label\": \"INTERFACE\",\n \"signature_text\": \"interface EventContract {}\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 379,\n \"end_line_number\": 379,\n \"line_range\": [\n 379,\n 379\n ],\n \"declaration_order_index\": 42,\n \"symbol_name\": \"HandlesEvents\",\n \"qualified_name\": \"HandlesEvents\",\n \"symbol_kind\": \"TRAIT\",\n \"type_label\": \"TRAIT\",\n \"signature_text\": \"trait HandlesEvents {}\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 380,\n \"end_line_number\": 380,\n \"line_range\": [\n 380,\n 380\n ],\n \"declaration_order_index\": 43,\n \"symbol_name\": \"TracksChanges\",\n \"qualified_name\": \"TracksChanges\",\n \"symbol_kind\": \"TRAIT\",\n \"type_label\": \"TRAIT\",\n \"signature_text\": \"trait TracksChanges {}\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 381,\n \"end_line_number\": 381,\n \"line_range\": [\n 381,\n 381\n ],\n \"declaration_order_index\": 44,\n \"symbol_name\": \"AuthorizesRequests\",\n \"qualified_name\": \"AuthorizesRequests\",\n \"symbol_kind\": \"TRAIT\",\n \"type_label\": \"TRAIT\",\n \"signature_text\": \"trait AuthorizesRequests {}\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 382,\n \"end_line_number\": 382,\n \"line_range\": [\n 382,\n 382\n ],\n \"declaration_order_index\": 45,\n \"symbol_name\": \"API_LIMIT\",\n \"qualified_name\": \"API_LIMIT\",\n \"symbol_kind\": \"CONSTANT\",\n \"type_label\": \"CONSTANT\",\n \"signature_text\": \"const API_LIMIT = 50\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 383,\n \"end_line_number\": 383,\n \"line_range\": [\n 383,\n 383\n ],\n \"declaration_order_index\": 46,\n \"symbol_name\": \"DEFAULT_PAGE\",\n \"qualified_name\": \"DEFAULT_PAGE\",\n \"symbol_kind\": \"CONSTANT\",\n \"type_label\": \"CONSTANT\",\n \"signature_text\": \"const DEFAULT_PAGE = 1\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 384,\n \"end_line_number\": 384,\n \"line_range\": [\n 384,\n 384\n ],\n \"declaration_order_index\": 47,\n \"symbol_name\": \"TIMEOUT\",\n \"qualified_name\": \"TIMEOUT\",\n \"symbol_kind\": \"CONSTANT\",\n \"type_label\": \"CONSTANT\",\n \"signature_text\": \"const TIMEOUT = 30\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 385,\n \"end_line_number\": 385,\n \"line_range\": [\n 385,\n 385\n ],\n \"declaration_order_index\": 48,\n \"symbol_name\": \"ApiClient\",\n \"qualified_name\": \"ApiClient\",\n \"symbol_kind\": \"CLASS\",\n \"type_label\": \"CLASS\",\n \"signature_text\": \"final class ApiClient {}\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 395,\n \"end_line_number\": 395,\n \"line_range\": [\n 395,\n 395\n ],\n \"declaration_order_index\": 49,\n \"symbol_name\": \"req_cover_php_1\",\n \"qualified_name\": \"req_cover_php_1\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"function req_cover_php_1(int $value): int { return $value + 1; }\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Coverage helper construct 1.\",\n \"doxygen\": {\n \"brief\": [\n \"Coverage helper construct 1.\"\n ],\n \"details\": [\n \"Provides deterministic fixture-level Doxygen coverage block 1.\"\n ],\n \"params\": [\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"value\",\n \"description\": \"Input value for helper construct 1.\"\n }\n ],\n \"returns\": [\n \"Output value for helper construct 1.\"\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 404,\n \"end_line_number\": 404,\n \"line_range\": [\n 404,\n 404\n ],\n \"declaration_order_index\": 50,\n \"symbol_name\": \"req_cover_php_2\",\n \"qualified_name\": \"req_cover_php_2\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"function req_cover_php_2(int $value): int { return $value + 2; }\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Coverage helper construct 2.\",\n \"doxygen\": {\n \"brief\": [\n \"Coverage helper construct 2.\"\n ],\n \"details\": [\n \"Provides deterministic fixture-level Doxygen coverage block 2.\"\n ],\n \"params\": [\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"value\",\n \"description\": \"Input value for helper construct 2.\"\n }\n ],\n \"returns\": [\n \"Output value for helper construct 2.\"\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 413,\n \"end_line_number\": 413,\n \"line_range\": [\n 413,\n 413\n ],\n \"declaration_order_index\": 51,\n \"symbol_name\": \"req_cover_php_3\",\n \"qualified_name\": \"req_cover_php_3\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"function req_cover_php_3(int $value): int { return $value + 3; }\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Coverage helper construct 3.\",\n \"doxygen\": {\n \"brief\": [\n \"Coverage helper construct 3.\"\n ],\n \"details\": [\n \"Provides deterministic fixture-level Doxygen coverage block 3.\"\n ],\n \"params\": [\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"value\",\n \"description\": \"Input value for helper construct 3.\"\n }\n ],\n \"returns\": [\n \"Output value for helper construct 3.\"\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 422,\n \"end_line_number\": 422,\n \"line_range\": [\n 422,\n 422\n ],\n \"declaration_order_index\": 52,\n \"symbol_name\": \"req_cover_php_4\",\n \"qualified_name\": \"req_cover_php_4\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"function req_cover_php_4(int $value): int { return $value + 4; }\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Coverage helper construct 4.\",\n \"doxygen\": {\n \"brief\": [\n \"Coverage helper construct 4.\"\n ],\n \"details\": [\n \"Provides deterministic fixture-level Doxygen coverage block 4.\"\n ],\n \"params\": [\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"value\",\n \"description\": \"Input value for helper construct 4.\"\n }\n ],\n \"returns\": [\n \"Output value for helper construct 4.\"\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 431,\n \"end_line_number\": 431,\n \"line_range\": [\n 431,\n 431\n ],\n \"declaration_order_index\": 53,\n \"symbol_name\": \"req_cover_php_5\",\n \"qualified_name\": \"req_cover_php_5\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"function req_cover_php_5(int $value): int { return $value + 5; }\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Coverage helper construct 5.\",\n \"doxygen\": {\n \"brief\": [\n \"Coverage helper construct 5.\"\n ],\n \"details\": [\n \"Provides deterministic fixture-level Doxygen coverage block 5.\"\n ],\n \"params\": [\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"value\",\n \"description\": \"Input value for helper construct 5.\"\n }\n ],\n \"returns\": [\n \"Output value for helper construct 5.\"\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n }\n ],\n \"standalone_comments\": [\n {\n \"start_line_number\": 27,\n \"end_line_number\": 27,\n \"line_range\": [\n 27,\n 27\n ],\n \"text\": \"── Enum with methods (PHP 8.1) ────────────────────────────────────────\",\n \"text_lines\": [\n \"── Enum with methods (PHP 8.1) ────────────────────────────────────────\"\n ]\n },\n {\n \"start_line_number\": 29,\n \"end_line_number\": 32,\n \"line_range\": [\n 29,\n 32\n ],\n \"text\": \"@enum Status @brief Backed enum representing entity lifecycle states.\",\n \"text_lines\": [\n \"@enum Status\",\n \"@brief Backed enum representing entity lifecycle states.\"\n ]\n },\n {\n \"start_line_number\": 34,\n \"end_line_number\": 34,\n \"line_range\": [\n 34,\n 34\n ],\n \"text\": \"@brief Entity is in draft state, not yet visible.\",\n \"text_lines\": [\n \"@brief Entity is in draft state, not yet visible.\"\n ]\n },\n {\n \"start_line_number\": 36,\n \"end_line_number\": 36,\n \"line_range\": [\n 36,\n 36\n ],\n \"text\": \"@brief Entity is published and publicly accessible.\",\n \"text_lines\": [\n \"@brief Entity is published and publicly accessible.\"\n ]\n },\n {\n \"start_line_number\": 38,\n \"end_line_number\": 38,\n \"line_range\": [\n 38,\n 38\n ],\n \"text\": \"@brief Entity is archived and read-only.\",\n \"text_lines\": [\n \"@brief Entity is archived and read-only.\"\n ]\n },\n {\n \"start_line_number\": 62,\n \"end_line_number\": 62,\n \"line_range\": [\n 62,\n 62\n ],\n \"text\": \"── Abstract class with constructor promotion ──────────────────────────\",\n \"text_lines\": [\n \"── Abstract class with constructor promotion ──────────────────────────\"\n ]\n },\n {\n \"start_line_number\": 85,\n \"end_line_number\": 85,\n \"line_range\": [\n 85,\n 85\n ],\n \"text\": \"Validate before persisting\",\n \"text_lines\": [\n \"Validate before persisting\"\n ]\n },\n {\n \"start_line_number\": 92,\n \"end_line_number\": 95,\n \"line_range\": [\n 92,\n 95\n ],\n \"text\": \"@brief Validate model state before persistence. @return bool True if model is valid.\",\n \"text_lines\": [\n \"@brief Validate model state before persistence.\",\n \"@return bool True if model is valid.\"\n ]\n },\n {\n \"start_line_number\": 106,\n \"end_line_number\": 109,\n \"line_range\": [\n 106,\n 109\n ],\n \"text\": \"@brief Convert model to array representation. @return array<string, mixed> Associative array of model properties.\",\n \"text_lines\": [\n \"@brief Convert model to array representation.\",\n \"@return array<string, mixed> Associative array of model properties.\"\n ]\n },\n {\n \"start_line_number\": 113,\n \"end_line_number\": 113,\n \"line_range\": [\n 113,\n 113\n ],\n \"text\": \"── Concrete class with union types ────────────────────────────────────\",\n \"text_lines\": [\n \"── Concrete class with union types ────────────────────────────────────\"\n ]\n },\n {\n \"start_line_number\": 121,\n \"end_line_number\": 121,\n \"line_range\": [\n 121,\n 121\n ],\n \"text\": \"@brief User's display name.\",\n \"text_lines\": [\n \"@brief User's display name.\"\n ]\n },\n {\n \"start_line_number\": 124,\n \"end_line_number\": 124,\n \"line_range\": [\n 124,\n 124\n ],\n \"text\": \"@brief User's email address or null if unverified.\",\n \"text_lines\": [\n \"@brief User's email address or null if unverified.\"\n ]\n },\n {\n \"start_line_number\": 156,\n \"end_line_number\": 156,\n \"line_range\": [\n 156,\n 156\n ],\n \"text\": \"Return email if available, otherwise numeric ID\",\n \"text_lines\": [\n \"Return email if available, otherwise numeric ID\"\n ]\n },\n {\n \"start_line_number\": 181,\n \"end_line_number\": 181,\n \"line_range\": [\n 181,\n 181\n ],\n \"text\": \"── Interface with type hints ──────────────────────────────────────────\",\n \"text_lines\": [\n \"── Interface with type hints ──────────────────────────────────────────\"\n ]\n },\n {\n \"start_line_number\": 209,\n \"end_line_number\": 209,\n \"line_range\": [\n 209,\n 209\n ],\n \"text\": \"── Trait with abstract methods ────────────────────────────────────────\",\n \"text_lines\": [\n \"── Trait with abstract methods ────────────────────────────────────────\"\n ]\n },\n {\n \"start_line_number\": 216,\n \"end_line_number\": 216,\n \"line_range\": [\n 216,\n 216\n ],\n \"text\": \"@brief Cache TTL in seconds.\",\n \"text_lines\": [\n \"@brief Cache TTL in seconds.\"\n ]\n },\n {\n \"start_line_number\": 224,\n \"end_line_number\": 224,\n \"line_range\": [\n 224,\n 224\n ],\n \"text\": \"Serialize and store with TTL\",\n \"text_lines\": [\n \"Serialize and store with TTL\"\n ]\n },\n {\n \"start_line_number\": 233,\n \"end_line_number\": 233,\n \"line_range\": [\n 233,\n 233\n ],\n \"text\": \"Remove from cache backend\",\n \"text_lines\": [\n \"Remove from cache backend\"\n ]\n },\n {\n \"start_line_number\": 236,\n \"end_line_number\": 239,\n \"line_range\": [\n 236,\n 239\n ],\n \"text\": \"@brief Require implementing classes to provide a cache key. @return string The unique cache key.\",\n \"text_lines\": [\n \"@brief Require implementing classes to provide a cache key.\",\n \"@return string The unique cache key.\"\n ]\n },\n {\n \"start_line_number\": 248,\n \"end_line_number\": 248,\n \"line_range\": [\n 248,\n 248\n ],\n \"text\": \"@brief Timestamp of soft deletion or null if active.\",\n \"text_lines\": [\n \"@brief Timestamp of soft deletion or null if active.\"\n ]\n },\n {\n \"start_line_number\": 268,\n \"end_line_number\": 268,\n \"line_range\": [\n 268,\n 268\n ],\n \"text\": \"── Class using multiple traits ────────────────────────────────────────\",\n \"text_lines\": [\n \"── Class using multiple traits ────────────────────────────────────────\"\n ]\n },\n {\n \"start_line_number\": 288,\n \"end_line_number\": 288,\n \"line_range\": [\n 288,\n 288\n ],\n \"text\": \"── Attribute (PHP 8.0) ────────────────────────────────────────────────\",\n \"text_lines\": [\n \"── Attribute (PHP 8.0) ────────────────────────────────────────────────\"\n ]\n },\n {\n \"start_line_number\": 307,\n \"end_line_number\": 307,\n \"line_range\": [\n 307,\n 307\n ],\n \"text\": \"── Free functions ─────────────────────────────────────────────────────\",\n \"text_lines\": [\n \"── Free functions ─────────────────────────────────────────────────────\"\n ]\n },\n {\n \"start_line_number\": 325,\n \"end_line_number\": 325,\n \"line_range\": [\n 325,\n 325\n ],\n \"text\": \"Match expression for exhaustive type handling\",\n \"text_lines\": [\n \"Match expression for exhaustive type handling\"\n ]\n },\n {\n \"start_line_number\": 353,\n \"end_line_number\": 353,\n \"line_range\": [\n 353,\n 353\n ],\n \"text\": \"Capture $factor in the returned closure\",\n \"text_lines\": [\n \"Capture $factor in the returned closure\"\n ]\n },\n {\n \"start_line_number\": 387,\n \"end_line_number\": 387,\n \"line_range\": [\n 387,\n 387\n ],\n \"text\": \"REQ-COVER-SRS-231 START\",\n \"text_lines\": [\n \"REQ-COVER-SRS-231 START\"\n ]\n },\n {\n \"start_line_number\": 433,\n \"end_line_number\": 433,\n \"line_range\": [\n 433,\n 433\n ],\n \"text\": \"REQ-COVER-SRS-231 END\",\n \"text_lines\": [\n \"REQ-COVER-SRS-231 END\"\n ]\n }\n ]\n }\n ]\n}\n",
|
|
4
|
+
"stderr": ""
|
|
5
|
+
}
|