Full Code of cfwheels/cfwheels for AI

develop c393ccd77b7c cached
5263 files
93.4 MB
6.9M tokens
455 symbols
1 requests
Copy disabled (too large) Download .txt
Showing preview only (27,649K chars total). Download the full file to get everything.
Repository: cfwheels/cfwheels
Branch: develop
Commit: c393ccd77b7c
Files: 5263
Total size: 93.4 MB

Directory structure:
gitextract_uhqy_quz/

├── .ai/
│   ├── README.md
│   ├── cfml/
│   │   ├── README.md
│   │   ├── advanced/
│   │   │   └── closures.md
│   │   ├── best-practices/
│   │   │   ├── modern-patterns.md
│   │   │   └── performance.md
│   │   ├── components/
│   │   │   ├── component-basics.md
│   │   │   ├── functions.md
│   │   │   └── properties.md
│   │   ├── control-flow/
│   │   │   ├── conditionals.md
│   │   │   ├── exception-handling.md
│   │   │   └── loops.md
│   │   ├── data-types/
│   │   │   ├── arrays/
│   │   │   │   ├── array-creation.md
│   │   │   │   ├── array-iteration.md
│   │   │   │   └── array-methods.md
│   │   │   ├── numbers/
│   │   │   │   └── numeric-basics.md
│   │   │   ├── scopes/
│   │   │   │   └── variables-scope.md
│   │   │   ├── strings/
│   │   │   │   ├── string-functions.md
│   │   │   │   ├── string-interpolation.md
│   │   │   │   └── string-literals.md
│   │   │   ├── structures/
│   │   │   │   ├── struct-creation.md
│   │   │   │   └── structure-basics.md
│   │   │   ├── variable-scopes.md
│   │   │   └── variables.md
│   │   ├── database/
│   │   │   └── query-basics.md
│   │   └── syntax/
│   │       ├── basic-syntax.md
│   │       ├── cfscript-vs-tags.md
│   │       ├── comments.md
│   │       └── hash-escaping.md
│   └── wheels/
│       ├── channels/
│       │   └── channels.md
│       ├── controllers/
│       │   └── api.md
│       ├── cross-engine-compatibility.md
│       ├── deploy.md
│       ├── security/
│       │   └── https-detection.md
│       ├── snippets/
│       │   ├── controller-snippets.md
│       │   └── model-snippets.md
│       ├── testing/
│       │   ├── browser-testing.md
│       │   └── onboarding-harness.md
│       ├── troubleshooting/
│       │   ├── common-errors.md
│       │   └── form-helper-errors.md
│       ├── views/
│       │   └── query-association-patterns.md
│       └── wheels-bot.md
├── .cfformat.json
├── .claude/
│   ├── .devcontainer/
│   │   └── devcontainer.json
│   └── commands/
│       ├── _shared-rails.md
│       ├── address-review.md
│       ├── advise-on-deadlock.md
│       ├── auto-close-stale-triage.md
│       ├── propose-fix.md
│       ├── research-frameworks.md
│       ├── respond-to-critique.md
│       ├── review-pr.md
│       ├── review-the-review.md
│       ├── triage-issue.md
│       ├── update-docs.md
│       └── write-docs.md
├── .dockerignore
├── .editorconfig
├── .gitattributes
├── .gitbook.yaml
├── .github/
│   ├── FUNDING.yml
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug_report.md
│   │   └── feature_request.md
│   ├── RELEASE_PLAYBOOK.md
│   ├── actions/
│   │   ├── publish_forgebox_package/
│   │   │   ├── Dockerfile
│   │   │   ├── action.yml
│   │   │   └── entrypoint.sh
│   │   ├── setup-wheels-test-env/
│   │   │   └── action.yml
│   │   └── wheels-bot-skip-check/
│   │       └── action.yml
│   ├── labeler.yml
│   ├── pull_request_template.md
│   ├── slack.yml
│   └── workflows/
│       ├── bot-address-review.yml
│       ├── bot-advisor.yml
│       ├── bot-auto-close.yml
│       ├── bot-propose-fix.yml
│       ├── bot-research.yml
│       ├── bot-review-a.yml
│       ├── bot-review-b.yml
│       ├── bot-tdd-gate.yml
│       ├── bot-triage.yml
│       ├── bot-update-docs.yml
│       ├── bot-write-docs.yml
│       ├── bump-develop-version.yml
│       ├── compat-matrix.yml
│       ├── deploy-ci.yml
│       ├── docs-validation.yml
│       ├── docs-verify.yml
│       ├── generate-changelog.yml
│       ├── label.yml
│       ├── pr.yml
│       ├── publish-chocolatey.yml
│       ├── refresh-packages-baseline.yml
│       ├── refresh-visual-baselines.yml
│       ├── release-candidate.yml
│       ├── release.yml
│       ├── snapshot.yml
│       ├── version-bump.yml
│       └── web-deploy.yml
├── .gitignore
├── .husky/
│   ├── commit-msg
│   └── pre-commit
├── .nvmrc
├── .vscode/
│   ├── launch.json
│   ├── wheels-test.code-snippets
│   └── wheels.code-snippets
├── CFConfig.json
├── CHANGELOG.md
├── CLAUDE.md
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── Dockerfile.dev
├── LICENSE
├── NOTICE
├── README.md
├── RELEASE-CANDIDATE.md
├── SECURITY.md
├── app/
│   ├── controllers/
│   │   └── Controller.cfc
│   ├── events/
│   │   ├── onabort.cfm
│   │   ├── onapplicationend.cfm
│   │   ├── onapplicationstart.cfm
│   │   ├── onerror.cfm
│   │   ├── onerror.json.cfm
│   │   ├── onerror.xml.cfm
│   │   ├── onmaintenance.cfm
│   │   ├── onmissingtemplate.cfm
│   │   ├── onrequestend.cfm
│   │   ├── onrequeststart.cfm
│   │   ├── onsessionend.cfm
│   │   └── onsessionstart.cfm
│   ├── global/
│   │   └── functions.cfm
│   ├── jobs/
│   │   └── ProcessOrdersJob.cfc
│   ├── lib/
│   │   └── .keep
│   ├── migrator/
│   │   ├── .keep
│   │   └── migrations/
│   │       └── .keep
│   ├── models/
│   │   └── Model.cfc
│   ├── snippets/
│   │   ├── ActionContent.txt
│   │   ├── ApiControllerContent.txt
│   │   ├── BoxJSON.txt
│   │   ├── CRUDContent.txt
│   │   ├── ConfigAppContent.txt
│   │   ├── ConfigDataSourceH2Content.txt
│   │   ├── ConfigReloadPasswordContent.txt
│   │   ├── ConfigRoutes.txt
│   │   ├── ControllerContent.txt
│   │   ├── DBMigrate.txt
│   │   ├── McpConfig.json
│   │   ├── ModelContent.txt
│   │   ├── OpenCodeConfig.json
│   │   ├── ServerJSON.txt
│   │   ├── ViewContent.txt
│   │   ├── WheelsBoxJSON.txt
│   │   ├── bootstrap/
│   │   │   ├── layout.cfm
│   │   │   └── settings.cfm
│   │   ├── crud/
│   │   │   ├── _form.txt
│   │   │   ├── edit.txt
│   │   │   ├── index.txt
│   │   │   ├── new.txt
│   │   │   └── show.txt
│   │   ├── dbmigrate/
│   │   │   ├── announce.txt
│   │   │   ├── blank.txt
│   │   │   ├── change-column.txt
│   │   │   ├── change-table.txt
│   │   │   ├── create-column.txt
│   │   │   ├── create-index.txt
│   │   │   ├── create-record.txt
│   │   │   ├── create-table.txt
│   │   │   ├── execute.txt
│   │   │   ├── remove-column.txt
│   │   │   ├── remove-index.txt
│   │   │   ├── remove-record.txt
│   │   │   ├── remove-table.txt
│   │   │   ├── rename-column.txt
│   │   │   ├── rename-table.txt
│   │   │   └── update-record.txt
│   │   ├── mcp-server.js.txt
│   │   └── tests/
│   │       ├── controller.txt
│   │       ├── model.txt
│   │       └── view.txt
│   └── views/
│       ├── helpers.cfm
│       └── layout.cfm
├── cli/
│   ├── .gitignore
│   ├── CHANGELOG
│   ├── CLAUDE.md
│   ├── LICENSE
│   ├── PR-INSTRUCTIONS.md
│   ├── README.md
│   ├── WHEELS-CLI-ROADMAP.md
│   ├── docs/
│   │   └── CONFIG-COMMANDS.md
│   ├── lucli/
│   │   ├── ARCHITECTURE.md
│   │   ├── Module.cfc
│   │   ├── PLAN.md
│   │   ├── lib/
│   │   │   └── deploy/
│   │   │       ├── README.md
│   │   │       ├── bcpkix-jdk18on-1.78.jar
│   │   │       ├── bcprov-jdk18on-1.78.jar
│   │   │       ├── bcutil-jdk18on-1.78.jar
│   │   │       ├── eddsa-0.3.0.jar
│   │   │       ├── jmustache-1.16.jar
│   │   │       ├── jzlib-1.1.3.jar
│   │   │       ├── manifest.json
│   │   │       ├── slf4j-api-2.0.13.jar
│   │   │       ├── slf4j-nop-2.0.13.jar
│   │   │       ├── snakeyaml-2.3.jar
│   │   │       └── sshj-0.39.0.jar
│   │   ├── module.json
│   │   ├── resources/
│   │   │   └── extensions/
│   │   │       └── sqlite/
│   │   │           └── org.xerial.sqlite-jdbc-3.49.1.0.jar
│   │   ├── services/
│   │   │   ├── Admin.cfc
│   │   │   ├── Analysis.cfc
│   │   │   ├── BundleStager.cfc
│   │   │   ├── CfclassesPurger.cfc
│   │   │   ├── CodeGen.cfc
│   │   │   ├── Destroy.cfc
│   │   │   ├── Doctor.cfc
│   │   │   ├── FrameworkInstaller.cfc
│   │   │   ├── Helpers.cfc
│   │   │   ├── MigrationRunner.cfc
│   │   │   ├── ReleaseChannel.cfc
│   │   │   ├── RewriteConfigInstaller.cfc
│   │   │   ├── Scaffold.cfc
│   │   │   ├── SemVer.cfc
│   │   │   ├── ServerRegistry.cfc
│   │   │   ├── Stats.cfc
│   │   │   ├── Templates.cfc
│   │   │   ├── TestRunner.cfc
│   │   │   ├── UpdateChecker.cfc
│   │   │   ├── deploy/
│   │   │   │   ├── cli/
│   │   │   │   │   ├── DeployAccessoryCli.cfc
│   │   │   │   │   ├── DeployAppCli.cfc
│   │   │   │   │   ├── DeployArgsParser.cfc
│   │   │   │   │   ├── DeployBuildCli.cfc
│   │   │   │   │   ├── DeployLockCli.cfc
│   │   │   │   │   ├── DeployMainCli.cfc
│   │   │   │   │   ├── DeployProxyCli.cfc
│   │   │   │   │   ├── DeployPruneCli.cfc
│   │   │   │   │   ├── DeployRegistryCli.cfc
│   │   │   │   │   ├── DeploySecretsCli.cfc
│   │   │   │   │   ├── DeployServerCli.cfc
│   │   │   │   │   └── docs/
│   │   │   │   │       ├── accessories.md
│   │   │   │   │       ├── builder.md
│   │   │   │   │       ├── env.md
│   │   │   │   │       ├── hooks.md
│   │   │   │   │       ├── proxy.md
│   │   │   │   │       ├── registry.md
│   │   │   │   │       ├── servers.md
│   │   │   │   │       └── ssh.md
│   │   │   │   ├── commands/
│   │   │   │   │   ├── AccessoryCommands.cfc
│   │   │   │   │   ├── AppCommands.cfc
│   │   │   │   │   ├── AuditorCommands.cfc
│   │   │   │   │   ├── Base.cfc
│   │   │   │   │   ├── BuilderCommands.cfc
│   │   │   │   │   ├── DockerCommands.cfc
│   │   │   │   │   ├── HookCommands.cfc
│   │   │   │   │   ├── LockCommands.cfc
│   │   │   │   │   ├── ProxyCommands.cfc
│   │   │   │   │   ├── PruneCommands.cfc
│   │   │   │   │   └── RegistryCommands.cfc
│   │   │   │   ├── config/
│   │   │   │   │   ├── Accessory.cfc
│   │   │   │   │   ├── Builder.cfc
│   │   │   │   │   ├── Config.cfc
│   │   │   │   │   ├── ConfigLoader.cfc
│   │   │   │   │   ├── Env.cfc
│   │   │   │   │   ├── Proxy.cfc
│   │   │   │   │   ├── Registry.cfc
│   │   │   │   │   ├── Role.cfc
│   │   │   │   │   ├── Ssh.cfc
│   │   │   │   │   └── Validator.cfc
│   │   │   │   ├── lib/
│   │   │   │   │   ├── FakeSshPool.cfc
│   │   │   │   │   ├── JarLoader.cfc
│   │   │   │   │   ├── Mustache.cfc
│   │   │   │   │   ├── Output.cfc
│   │   │   │   │   ├── SecretResolver.cfc
│   │   │   │   │   ├── SshClient.cfc
│   │   │   │   │   ├── SshPool.cfc
│   │   │   │   │   ├── SshPoolFactory.cfc
│   │   │   │   │   ├── SshPoolTask.cfc
│   │   │   │   │   └── Yaml.cfc
│   │   │   │   └── secrets/
│   │   │   │       ├── AwsSecretsAdapter.cfc
│   │   │   │       ├── BaseAdapter.cfc
│   │   │   │       ├── BitwardenAdapter.cfc
│   │   │   │       ├── DopplerAdapter.cfc
│   │   │   │       ├── LastPassAdapter.cfc
│   │   │   │       ├── OnePasswordAdapter.cfc
│   │   │   │       └── SecretAdapterInterface.cfc
│   │   │   └── packages/
│   │   │       ├── HttpClient.cfc
│   │   │       ├── Installer.cfc
│   │   │       ├── ManifestCache.cfc
│   │   │       ├── PackagesMainCli.cfc
│   │   │       ├── PackagesRegistryCli.cfc
│   │   │       ├── Registry.cfc
│   │   │       └── VersionResolver.cfc
│   │   ├── templates/
│   │   │   ├── admin/
│   │   │   │   ├── _form.txt
│   │   │   │   ├── controller.txt
│   │   │   │   ├── edit.txt
│   │   │   │   ├── index.txt
│   │   │   │   ├── new.txt
│   │   │   │   └── show.txt
│   │   │   ├── app/
│   │   │   │   ├── _env
│   │   │   │   ├── _gitignore
│   │   │   │   ├── app/
│   │   │   │   │   ├── controllers/
│   │   │   │   │   │   └── Controller.cfc
│   │   │   │   │   ├── events/
│   │   │   │   │   │   ├── onabort.cfm
│   │   │   │   │   │   ├── onapplicationend.cfm
│   │   │   │   │   │   ├── onapplicationstart.cfm
│   │   │   │   │   │   ├── onerror.cfm
│   │   │   │   │   │   ├── onerror.json.cfm
│   │   │   │   │   │   ├── onerror.xml.cfm
│   │   │   │   │   │   ├── onmaintenance.cfm
│   │   │   │   │   │   ├── onmissingtemplate.cfm
│   │   │   │   │   │   ├── onrequestend.cfm
│   │   │   │   │   │   ├── onrequeststart.cfm
│   │   │   │   │   │   ├── onsessionend.cfm
│   │   │   │   │   │   └── onsessionstart.cfm
│   │   │   │   │   ├── global/
│   │   │   │   │   │   └── functions.cfm
│   │   │   │   │   ├── jobs/
│   │   │   │   │   │   ├── .gitkeep
│   │   │   │   │   │   └── README.md
│   │   │   │   │   ├── lib/
│   │   │   │   │   │   ├── .gitkeep
│   │   │   │   │   │   └── README.md
│   │   │   │   │   ├── mailers/
│   │   │   │   │   │   ├── .gitkeep
│   │   │   │   │   │   └── README.md
│   │   │   │   │   ├── migrator/
│   │   │   │   │   │   └── migrations/
│   │   │   │   │   │       └── .gitkeep
│   │   │   │   │   ├── models/
│   │   │   │   │   │   └── Model.cfc
│   │   │   │   │   ├── plugins/
│   │   │   │   │   │   ├── .gitkeep
│   │   │   │   │   │   └── README.md
│   │   │   │   │   ├── snippets/
│   │   │   │   │   │   ├── .gitkeep
│   │   │   │   │   │   ├── ActionContent.txt
│   │   │   │   │   │   ├── ApiControllerContent.txt
│   │   │   │   │   │   ├── BoxJSON.txt
│   │   │   │   │   │   ├── CRUDContent.txt
│   │   │   │   │   │   ├── ConfigAppContent.txt
│   │   │   │   │   │   ├── ConfigDataSourceH2Content.txt
│   │   │   │   │   │   ├── ConfigReloadPasswordContent.txt
│   │   │   │   │   │   ├── ConfigRoutes.txt
│   │   │   │   │   │   ├── ControllerContent.txt
│   │   │   │   │   │   ├── DBMigrate.txt
│   │   │   │   │   │   ├── ModelContent.txt
│   │   │   │   │   │   ├── README.md
│   │   │   │   │   │   ├── ServerJSON.txt
│   │   │   │   │   │   ├── ViewContent.txt
│   │   │   │   │   │   ├── WheelsBoxJSON.txt
│   │   │   │   │   │   └── mcp-server.js.txt
│   │   │   │   │   └── views/
│   │   │   │   │       ├── helpers.cfm
│   │   │   │   │       └── layout.cfm
│   │   │   │   ├── config/
│   │   │   │   │   ├── app.cfm
│   │   │   │   │   ├── environment.cfm
│   │   │   │   │   ├── routes.cfm
│   │   │   │   │   └── settings.cfm
│   │   │   │   ├── db/
│   │   │   │   │   └── .gitignore
│   │   │   │   ├── lucee.json
│   │   │   │   ├── public/
│   │   │   │   │   ├── Application.cfc
│   │   │   │   │   ├── files/
│   │   │   │   │   │   └── .gitkeep
│   │   │   │   │   ├── images/
│   │   │   │   │   │   └── .gitkeep
│   │   │   │   │   ├── index.cfm
│   │   │   │   │   ├── javascripts/
│   │   │   │   │   │   └── .gitkeep
│   │   │   │   │   ├── miscellaneous/
│   │   │   │   │   │   └── Application.cfc
│   │   │   │   │   ├── stylesheets/
│   │   │   │   │   │   └── .gitkeep
│   │   │   │   │   └── urlrewrite.xml
│   │   │   │   ├── rewrite.config
│   │   │   │   ├── tests/
│   │   │   │   │   ├── populate.cfm
│   │   │   │   │   ├── runner.cfm
│   │   │   │   │   └── specs/
│   │   │   │   │       ├── controllers/
│   │   │   │   │       │   └── .gitkeep
│   │   │   │   │       ├── functional/
│   │   │   │   │       │   └── .gitkeep
│   │   │   │   │       └── models/
│   │   │   │   │           └── .gitkeep
│   │   │   │   └── vendor/
│   │   │   │       └── .gitkeep
│   │   │   ├── deploy/
│   │   │   │   └── init/
│   │   │   │       ├── Dockerfile.mustache
│   │   │   │       ├── deploy.yml.mustache
│   │   │   │       ├── dockerignore.mustache
│   │   │   │       └── secrets.mustache
│   │   │   ├── migrations/
│   │   │   │   └── remove_table.txt
│   │   │   └── snippets/
│   │   │       ├── api-controller.txt
│   │   │       ├── auth-filter.txt
│   │   │       ├── auth-login-view.txt
│   │   │       ├── auth-sessions-controller.txt
│   │   │       ├── crud-controller.txt
│   │   │       ├── flash-messages.txt
│   │   │       ├── pagination-view.txt
│   │   │       ├── seeds-development.txt
│   │   │       ├── seeds.txt
│   │   │       ├── soft-delete-migration.txt
│   │   │       ├── soft-delete-mixin.txt
│   │   │       └── user-mailer.txt
│   │   └── tests/
│   │       ├── Application.cfc
│   │       ├── TestHelper.cfc
│   │       ├── _fixtures/
│   │       │   └── deploy/
│   │       │       ├── configs/
│   │       │       │   ├── full.yml
│   │       │       │   ├── invalid/
│   │       │       │   │   ├── invalid-host.yml
│   │       │       │   │   ├── missing-service.yml
│   │       │       │   │   └── unknown-key.yml
│   │       │       │   ├── minimal.yml
│   │       │       │   ├── with-accessories.yml
│   │       │       │   └── with-ssh.yml
│   │       │       ├── e2e/
│   │       │       │   ├── README.md
│   │       │       │   ├── app/
│   │       │       │   │   ├── Dockerfile.v1
│   │       │       │   │   └── Dockerfile.v2
│   │       │       │   ├── authorized_keys
│   │       │       │   ├── deploy.yml
│   │       │       │   ├── docker-compose.yml
│   │       │       │   ├── docker-shim.sh
│   │       │       │   ├── install-shims.sh
│   │       │       │   ├── test_key
│   │       │       │   └── test_key.pub
│   │       │       └── sshd/
│   │       │           ├── README.md
│   │       │           ├── authorized_keys
│   │       │           ├── docker-compose.yml
│   │       │           ├── test_key
│   │       │           └── test_key.pub
│   │       ├── _helpers/
│   │       │   └── DeployShellHelper.cfc
│   │       ├── runner.cfm
│   │       ├── specs/
│   │       │   ├── commands/
│   │       │   │   ├── ConsoleCommandSpec.cfc
│   │       │   │   ├── DbCommandSpec.cfc
│   │       │   │   ├── DeployCommandSpec.cfc
│   │       │   │   ├── DestroyCommandSpec.cfc
│   │       │   │   ├── GenerateCommandSpec.cfc
│   │       │   │   ├── InfoCommandSpec.cfc
│   │       │   │   ├── MigrateCommandSpec.cfc
│   │       │   │   ├── NewCommandSpec.cfc
│   │       │   │   ├── NewCommandTemplateSpec.cfc
│   │       │   │   ├── PackagesCommandSpec.cfc
│   │       │   │   ├── ReloadCommandSpec.cfc
│   │       │   │   └── TestCommandSpec.cfc
│   │       │   ├── deploy/
│   │       │   │   ├── DeployArgsParserSpec.cfc
│   │       │   │   ├── cli/
│   │       │   │   │   ├── DeployAccessoryCliSpec.cfc
│   │       │   │   │   ├── DeployAppCliSpec.cfc
│   │       │   │   │   ├── DeployBuildCliSpec.cfc
│   │       │   │   │   ├── DeployLockCliSpec.cfc
│   │       │   │   │   ├── DeployMainCliSpec.cfc
│   │       │   │   │   ├── DeployProxyCliSpec.cfc
│   │       │   │   │   ├── DeployPruneCliSpec.cfc
│   │       │   │   │   ├── DeployRegistryCliSpec.cfc
│   │       │   │   │   ├── DeploySecretsCliSpec.cfc
│   │       │   │   │   └── DeployServerCliSpec.cfc
│   │       │   │   ├── commands/
│   │       │   │   │   ├── AccessoryCommandsSpec.cfc
│   │       │   │   │   ├── AppCommandsSpec.cfc
│   │       │   │   │   ├── AuditorCommandsSpec.cfc
│   │       │   │   │   ├── BaseSpec.cfc
│   │       │   │   │   ├── BuilderCommandsSpec.cfc
│   │       │   │   │   ├── HookCommandsSpec.cfc
│   │       │   │   │   ├── LockCommandsSpec.cfc
│   │       │   │   │   ├── ProxyCommandsSpec.cfc
│   │       │   │   │   ├── PruneCommandsSpec.cfc
│   │       │   │   │   └── RegistryCommandsSpec.cfc
│   │       │   │   ├── config/
│   │       │   │   │   ├── AccessorySpec.cfc
│   │       │   │   │   ├── ConfigLoaderSpec.cfc
│   │       │   │   │   └── SshSpec.cfc
│   │       │   │   ├── integration/
│   │       │   │   │   └── E2EDeploySpec.cfc
│   │       │   │   ├── lib/
│   │       │   │   │   ├── FakeSshPoolSpec.cfc
│   │       │   │   │   ├── MustacheSpec.cfc
│   │       │   │   │   ├── OutputSpec.cfc
│   │       │   │   │   ├── SecretResolverSpec.cfc
│   │       │   │   │   ├── SshClassloadSpec.cfc
│   │       │   │   │   ├── SshClientSpec.cfc
│   │       │   │   │   ├── SshPoolDefaultsSpec.cfc
│   │       │   │   │   ├── SshPoolFactorySpec.cfc
│   │       │   │   │   ├── SshPoolSpec.cfc
│   │       │   │   │   └── YamlSpec.cfc
│   │       │   │   └── secrets/
│   │       │   │       ├── AwsSecretsAdapterSpec.cfc
│   │       │   │       ├── BitwardenAdapterSpec.cfc
│   │       │   │       ├── DopplerAdapterSpec.cfc
│   │       │   │       ├── LastPassAdapterSpec.cfc
│   │       │   │       ├── OnePasswordAdapterSpec.cfc
│   │       │   │       └── _stubs/
│   │       │   │           ├── StubAwsSecretsAdapter.cfc
│   │       │   │           ├── StubBitwardenAdapter.cfc
│   │       │   │           ├── StubDopplerAdapter.cfc
│   │       │   │           ├── StubLastPassAdapter.cfc
│   │       │   │           └── StubOnePasswordAdapter.cfc
│   │       │   ├── integration/
│   │       │   │   ├── DbCommandsSpec.cfc
│   │       │   │   ├── IntrospectSpec.cfc
│   │       │   │   └── ServerCommandsSpec.cfc
│   │       │   ├── packages/
│   │       │   │   ├── InstallerSpec.cfc
│   │       │   │   ├── ManifestCacheSpec.cfc
│   │       │   │   ├── PackagesMainCliSpec.cfc
│   │       │   │   ├── RegistryListAllSpec.cfc
│   │       │   │   ├── RegistrySpec.cfc
│   │       │   │   ├── VersionResolverSpec.cfc
│   │       │   │   └── _stubs/
│   │       │   │       └── FakeHttpClient.cfc
│   │       │   └── services/
│   │       │       ├── AdminSpec.cfc
│   │       │       ├── AnalysisSpec.cfc
│   │       │       ├── BundleStagerSpec.cfc
│   │       │       ├── CfclassesPurgerSpec.cfc
│   │       │       ├── CodeGenSpec.cfc
│   │       │       ├── DestroySpec.cfc
│   │       │       ├── DoctorSpec.cfc
│   │       │       ├── FrameworkInstallerSpec.cfc
│   │       │       ├── HelpersSpec.cfc
│   │       │       ├── MigrationRunnerSpec.cfc
│   │       │       ├── ReleaseChannelSpec.cfc
│   │       │       ├── ScaffoldSpec.cfc
│   │       │       ├── ServerRegistrySpec.cfc
│   │       │       ├── StatsSpec.cfc
│   │       │       ├── TemplatesSpec.cfc
│   │       │       ├── TestRunnerSpec.cfc
│   │       │       └── UpdateCheckerSpec.cfc
│   │       ├── test-module-install.sh
│   │       ├── test-new-exit-codes.sh
│   │       └── test-server-required-exit-codes.sh
│   └── src/
│       ├── ModuleConfig.cfc
│       ├── commands/
│       │   └── wheels/
│       │       ├── about.cfc
│       │       ├── analyze/
│       │       │   ├── code.cfc
│       │       │   └── performance.cfc
│       │       ├── assets/
│       │       │   ├── clean.cfc
│       │       │   ├── clobber.cfc
│       │       │   ├── init.cfc
│       │       │   └── precompile.cfc
│       │       ├── base.cfc
│       │       ├── benchmark.cfc
│       │       ├── browser/
│       │       │   ├── install.cfc
│       │       │   └── test.cfc
│       │       ├── cache/
│       │       │   └── clear.cfc
│       │       ├── cleanup/
│       │       │   ├── logs.cfc
│       │       │   ├── sessions.cfc
│       │       │   └── tmp.cfc
│       │       ├── config/
│       │       │   ├── check.cfc
│       │       │   ├── diff.cfc
│       │       │   ├── dump.cfc
│       │       │   ├── env.cfc
│       │       │   ├── list.cfc
│       │       │   └── set.cfc
│       │       ├── db/
│       │       │   ├── create.cfc
│       │       │   ├── drop.cfc
│       │       │   ├── dump.cfc
│       │       │   ├── reset.cfc
│       │       │   ├── restore.cfc
│       │       │   ├── rollback.cfc
│       │       │   ├── schema.cfc
│       │       │   ├── seed.cfc
│       │       │   ├── setup.cfc
│       │       │   ├── shell.cfc
│       │       │   ├── status.cfc
│       │       │   └── version.cfc
│       │       ├── dbmigrate/
│       │       │   ├── create/
│       │       │   │   ├── blank.cfc
│       │       │   │   ├── column.cfc
│       │       │   │   └── table.cfc
│       │       │   ├── diff.cfc
│       │       │   ├── down.cfc
│       │       │   ├── exec.cfc
│       │       │   ├── info.cfc
│       │       │   ├── latest.cfc
│       │       │   ├── remove/
│       │       │   │   └── table.cfc
│       │       │   ├── reset.cfc
│       │       │   └── up.cfc
│       │       ├── deploy/
│       │       │   ├── audit.cfc
│       │       │   ├── base.cfc
│       │       │   ├── exec.cfc
│       │       │   ├── hooks.cfc
│       │       │   ├── init.cfc
│       │       │   ├── lock.cfc
│       │       │   ├── logs.cfc
│       │       │   ├── proxy.cfc
│       │       │   ├── push.cfc
│       │       │   ├── rollback.cfc
│       │       │   ├── secrets.cfc
│       │       │   ├── setup.cfc
│       │       │   ├── status.cfc
│       │       │   └── stop.cfc
│       │       ├── deploy.cfc
│       │       ├── deps.cfc
│       │       ├── deptree.cfc
│       │       ├── destroy.cfc
│       │       ├── docker/
│       │       │   ├── DockerCommand.cfc
│       │       │   ├── build.cfc
│       │       │   ├── deploy.cfc
│       │       │   ├── exec.cfc
│       │       │   ├── init.cfc
│       │       │   ├── login.cfc
│       │       │   ├── logs.cfc
│       │       │   ├── push.cfc
│       │       │   └── stop.cfc
│       │       ├── docs/
│       │       │   ├── generate.cfc
│       │       │   └── serve.cfc
│       │       ├── doctor.cfc
│       │       ├── env/
│       │       │   ├── list.cfc
│       │       │   ├── merge.cfc
│       │       │   ├── set.cfc
│       │       │   ├── setup.cfc
│       │       │   ├── show.cfc
│       │       │   ├── switch.cfc
│       │       │   └── validate.cfc
│       │       ├── environment.cfc
│       │       ├── generate/
│       │       │   ├── admin.cfc
│       │       │   ├── api-resource.cfc
│       │       │   ├── app-wizard.cfc
│       │       │   ├── app.cfc
│       │       │   ├── code.cfc
│       │       │   ├── controller.cfc
│       │       │   ├── helper.cfc
│       │       │   ├── migration.cfc
│       │       │   ├── model.cfc
│       │       │   ├── property.cfc
│       │       │   ├── route.cfc
│       │       │   ├── scaffold.cfc
│       │       │   ├── seed.cfc
│       │       │   ├── snippets.cfc
│       │       │   ├── test.cfc
│       │       │   └── view.cfc
│       │       ├── get/
│       │       │   ├── environment.cfc
│       │       │   └── settings.cfc
│       │       ├── info.cfc
│       │       ├── init.cfc
│       │       ├── jobs/
│       │       │   ├── monitor.cfc
│       │       │   ├── purge.cfc
│       │       │   ├── retry.cfc
│       │       │   ├── status.cfc
│       │       │   └── work.cfc
│       │       ├── log/
│       │       │   ├── clear.cfc
│       │       │   └── tail.cfc
│       │       ├── maintenance/
│       │       │   ├── off.cfc
│       │       │   └── on.cfc
│       │       ├── mcp/
│       │       │   ├── remove.cfc
│       │       │   ├── setup.cfc
│       │       │   ├── status.cfc
│       │       │   ├── test.cfc
│       │       │   └── update.cfc
│       │       ├── notes.cfc
│       │       ├── optimize/
│       │       │   └── performance.cfc
│       │       ├── optimize.cfc
│       │       ├── playwright/
│       │       │   ├── init.cfc
│       │       │   └── install.cfc
│       │       ├── plugins/
│       │       │   ├── info.cfc
│       │       │   ├── init.cfc
│       │       │   ├── install.cfc
│       │       │   ├── list.cfc
│       │       │   ├── outdated.cfc
│       │       │   ├── remove.cfc
│       │       │   ├── search.cfc
│       │       │   ├── update.cfc
│       │       │   └── updateAll.cfc
│       │       ├── profile.cfc
│       │       ├── reload.cfc
│       │       ├── routes/
│       │       │   └── match.cfc
│       │       ├── routes.cfc
│       │       ├── secret.cfc
│       │       ├── security/
│       │       │   └── scan.cfc
│       │       ├── server/
│       │       │   ├── log.cfc
│       │       │   ├── open.cfc
│       │       │   ├── restart.cfc
│       │       │   ├── start.cfc
│       │       │   ├── status.cfc
│       │       │   └── stop.cfc
│       │       ├── set/
│       │       │   ├── datasource.cfc
│       │       │   ├── environment.cfc
│       │       │   └── settings.cfc
│       │       ├── stats.cfc
│       │       ├── test/
│       │       │   ├── all.cfc
│       │       │   ├── coverage.cfc
│       │       │   ├── integration.cfc
│       │       │   ├── migrate.cfc
│       │       │   ├── run.cfc
│       │       │   ├── unit.cfc
│       │       │   └── watch.cfc
│       │       ├── upgrade.cfc
│       │       ├── version.cfc
│       │       └── watch.cfc
│       ├── interceptors/
│       │   └── postInstall.cfc
│       ├── models/
│       │   ├── AdminIntrospectionService.cfc
│       │   ├── AdminViewService.cfc
│       │   ├── AnalysisService.cfc
│       │   ├── BaseCommand.cfc
│       │   ├── BrowserService.cfc
│       │   ├── CodeGenerationService.cfc
│       │   ├── DetailOutputService.cfc
│       │   ├── EnvironmentService.cfc
│       │   ├── MCPService.cfc
│       │   ├── MigrationService.cfc
│       │   ├── OptimizationService.cfc
│       │   ├── PluginService.cfc
│       │   ├── ScaffoldService.cfc
│       │   ├── SecurityService.cfc
│       │   ├── SharedParameters.cfc
│       │   ├── TemplateService.cfc
│       │   ├── TestMigrationService.cfc
│       │   ├── TestService.cfc
│       │   └── helpers.cfc
│       ├── recipes/
│       │   └── config-migration.boxr
│       └── templates/
│           ├── ActionContent.txt
│           ├── ApiControllerContent.txt
│           ├── BoxJSON.txt
│           ├── CRUDContent.txt
│           ├── ConfigAppContent.txt
│           ├── ConfigDataSourceH2Content.txt
│           ├── ConfigReloadPasswordContent.txt
│           ├── ConfigRoutes.txt
│           ├── ControllerContent.txt
│           ├── DBMigrate.txt
│           ├── HelperContent.txt
│           ├── McpConfig.json
│           ├── ModelContent.txt
│           ├── OpenCodeConfig.json
│           ├── ServerJSON.txt
│           ├── ViewContent.txt
│           ├── ViteConfig.txt
│           ├── ViteMainCSS.txt
│           ├── ViteMainJS.txt
│           ├── VitePackageJSON.txt
│           ├── WheelsBoxJSON.txt
│           ├── admin/
│           │   ├── AdminControllerContent.txt
│           │   ├── _form.txt
│           │   ├── edit.txt
│           │   ├── index.txt
│           │   ├── new.txt
│           │   └── show.txt
│           ├── bootstrap/
│           │   ├── layout.cfm
│           │   └── settings.cfm
│           ├── crud/
│           │   ├── _form.txt
│           │   ├── edit.txt
│           │   ├── index.txt
│           │   ├── new.txt
│           │   └── show.txt
│           ├── dbmigrate/
│           │   ├── announce.txt
│           │   ├── blank.txt
│           │   ├── change-column.txt
│           │   ├── change-table.txt
│           │   ├── create-column.txt
│           │   ├── create-index.txt
│           │   ├── create-record.txt
│           │   ├── create-table.txt
│           │   ├── execute.txt
│           │   ├── remove-column.txt
│           │   ├── remove-index.txt
│           │   ├── remove-record.txt
│           │   ├── remove-table.txt
│           │   ├── rename-column.txt
│           │   ├── rename-table.txt
│           │   └── update-record.txt
│           └── tests/
│               ├── controller.txt
│               ├── helper.txt
│               ├── model.txt
│               └── view.txt
├── commitlint.config.js
├── compose.yml
├── config/
│   ├── app.cfm
│   ├── development/
│   │   └── settings.cfm
│   ├── environment.cfm
│   ├── maintenance/
│   │   └── settings.cfm
│   ├── production/
│   │   └── settings.cfm
│   ├── routes.cfm
│   ├── settings.cfm
│   └── testing/
│       └── settings.cfm
├── context7.json
├── docker-compose.db-h2.yml
├── docker-compose.db-mysql.yml
├── docker-compose.db-postgres.yml
├── docker-compose.dev.yml
├── docs/
│   ├── AI_INTEGRATION_GUIDE.md
│   ├── api/
│   │   ├── v1.4.5.json
│   │   ├── v2.0.0.json
│   │   ├── v2.1.0.json
│   │   ├── v2.2.0.json
│   │   ├── v2.3.0.json
│   │   ├── v2.4.0.json
│   │   ├── v2.5.0.json
│   │   ├── v3.0.0.json
│   │   └── v4.0.0.json
│   ├── contributing/
│   │   └── wheels-bot.md
│   ├── plans/
│   │   └── 2026-03-07-phase1-verify-test.md
│   ├── releases/
│   │   ├── blog-drafts/
│   │   │   ├── README.md
│   │   │   ├── anatomy-of-a-wheels-package.md
│   │   │   ├── beyond-findall-scopes-enums-query-builder.md
│   │   │   └── wheels-claude-stdio-mcp.md
│   │   ├── blog-skeletons/
│   │   │   ├── 01-closing-the-maturity-gap.md
│   │   │   ├── 02-upgrading-from-3x.md
│   │   │   ├── 03-security-hardening.md
│   │   │   ├── 04-background-jobs.md
│   │   │   ├── 05-lucli-zero-docker.md
│   │   │   ├── 06-testing.md
│   │   │   ├── 07-multi-tenancy.md
│   │   │   ├── 08-wirebox-to-wheelsdi.md
│   │   │   ├── 09-wheels-deploy.md
│   │   │   ├── README.md
│   │   │   ├── social-announcements.md
│   │   │   ├── social-post-anatomy-of-a-wheels-package.md
│   │   │   ├── social-post-beyond-findall.md
│   │   │   ├── social-post-rate-limited-api.md
│   │   │   └── social-post-wheels-claude-stdio-mcp.md
│   │   ├── wheels-3.0-vs-4.0.md
│   │   └── wheels-4.0-audit.md
│   ├── superpowers/
│   │   ├── artifacts/
│   │   │   ├── lucli-pr-1/
│   │   │   │   ├── PR.md
│   │   │   │   └── cfml-exit-code.patch
│   │   │   └── lucli-pr-2/
│   │   │       └── ISSUE.md
│   │   ├── plans/
│   │   │   ├── 2026-03-12-ci-engine-grouped-testing.md
│   │   │   ├── 2026-03-26-wheels-plugins-sentry-hotwire-basecoat.md
│   │   │   ├── 2026-04-09-lucli-foundation-prs.md
│   │   │   ├── 2026-04-09-phase2-core-cli.md
│   │   │   ├── 2026-04-09-phase3-scaffold-distribution.md
│   │   │   ├── 2026-04-09-phase4-in-process-everything.md
│   │   │   ├── 2026-04-10-wheels-distribution.md
│   │   │   ├── 2026-04-11-cli-testing.md
│   │   │   ├── 2026-04-11-cli-tier1-porting.md
│   │   │   ├── 2026-04-14-congratulations-page-redesign.md
│   │   │   ├── 2026-04-15-auto-migration-rename-detection.md
│   │   │   ├── 2026-04-15-browser-testing-foundation.md
│   │   │   ├── 2026-04-15-browser-testing-pr2.md
│   │   │   ├── 2026-04-15-browser-testing-pr3.md
│   │   │   ├── 2026-04-15-browser-testing-pr4.md
│   │   │   ├── 2026-04-16-vite-pipeline-maturity.md
│   │   │   ├── 2026-04-16-wheels-4.0-upgrade-guide.md
│   │   │   ├── 2026-04-17-web-cohesion-foundation.md
│   │   │   ├── 2026-04-17-web-cohesion-visual-polish.md
│   │   │   ├── 2026-04-18-guides-rewrite-phase-0-report.md
│   │   │   ├── 2026-04-18-guides-rewrite-phase-0.md
│   │   │   ├── 2026-04-18-guides-rewrite-phase-1-report.md
│   │   │   ├── 2026-04-18-guides-rewrite-phase-1.md
│   │   │   ├── 2026-04-19-framework-gaps-from-guides-phase-1.md
│   │   │   ├── 2026-04-20-guides-rewrite-phase-2a-report.md
│   │   │   ├── 2026-04-20-guides-rewrite-phase-2a.md
│   │   │   ├── 2026-04-20-guides-rewrite-phase-2b-cli-report.md
│   │   │   ├── 2026-04-20-guides-rewrite-phase-2b-cli.md
│   │   │   ├── 2026-04-20-guides-rewrite-phase-2b-digging-deeper-report.md
│   │   │   ├── 2026-04-20-guides-rewrite-phase-2b-digging-deeper.md
│   │   │   ├── 2026-04-20-guides-rewrite-phase-2b-testing-report.md
│   │   │   ├── 2026-04-20-guides-rewrite-phase-2b-testing.md
│   │   │   ├── 2026-04-20-wheels-deploy-kamal-port.md
│   │   │   ├── 2026-04-21-guides-rewrite-phase-2c-report.md
│   │   │   ├── 2026-04-21-guides-rewrite-phase-2c.md
│   │   │   ├── 2026-04-21-phase1-retrospective.md
│   │   │   ├── 2026-04-23-wheels-packages-phase1-extraction.md
│   │   │   ├── 2026-04-23-wheels-packages-phase4-inapp.md
│   │   │   ├── 2026-04-23-wheels-packages-phase4-site.md
│   │   │   ├── 2026-04-29-fresh-vm-batch-a-doc-sweep.md
│   │   │   ├── 2026-04-29-fresh-vm-batch-b-cli-polish.md
│   │   │   ├── 2026-04-29-fresh-vm-batch-c-scaffold-align.md
│   │   │   ├── 2026-04-29-fresh-vm-batch-d-di-singleton.md
│   │   │   ├── 2026-04-29-fresh-vm-batch-e-browser-test-infra.md
│   │   │   ├── 2026-04-29-fresh-vm-onboarding-findings.md
│   │   │   ├── 2026-05-07-api-docs-validation-retro.md
│   │   │   └── 2026-05-15-rate-limited-api-article.md
│   │   └── specs/
│   │       ├── 2026-03-27-cockroachdb-adapter-phase2-design.md
│   │       ├── 2026-04-03-module-system-design.md
│   │       ├── 2026-04-08-lucli-ci-pipeline-design.md
│   │       ├── 2026-04-09-wheels-cli-lucli-integration-design.md
│   │       ├── 2026-04-10-wheels-distribution-design.md
│   │       ├── 2026-04-11-cli-testing-design.md
│   │       ├── 2026-04-11-cli-tier1-porting-design.md
│   │       ├── 2026-04-14-congratulations-page-redesign.md
│   │       ├── 2026-04-15-auto-migration-rename-detection-design.md
│   │       ├── 2026-04-15-browser-testing-design.md
│   │       ├── 2026-04-15-browser-testing-pr2-design.md
│   │       ├── 2026-04-15-browser-testing-pr3-design.md
│   │       ├── 2026-04-15-browser-testing-pr4-design.md
│   │       ├── 2026-04-16-vite-pipeline-maturity-design.md
│   │       ├── 2026-04-16-wheels-4.0-upgrade-guide-design.md
│   │       ├── 2026-04-17-wheels-dev-cohesion-design.md
│   │       ├── 2026-04-18-guides-rewrite-v4-design.md
│   │       ├── 2026-04-18-starlight-phase-3-design.md
│   │       ├── 2026-04-20-wheels-deploy-kamal-port-design.md
│   │       ├── 2026-04-23-wheels-packages-phase1-extraction-design.md
│   │       ├── 2026-04-23-wheels-packages-phase4-site-design.md
│   │       ├── 2026-04-23-wheels-packages-phase4-ui-design.md
│   │       └── 2026-05-15-deploy-secrets-flat-aliases-design.md
│   └── wheels-vs-frameworks.md
├── e2e/
│   ├── README.md
│   ├── api-endpoints.spec.ts
│   ├── configuration.spec.ts
│   ├── integration.spec.ts
│   ├── user-workflows.spec.ts
│   ├── wheels-features.spec.ts
│   └── wheels-framework.spec.ts
├── examples/
│   ├── README.md
│   ├── starter-app/
│   │   ├── .gitignore
│   │   ├── LICENSE
│   │   ├── README.md
│   │   ├── app/
│   │   │   ├── controllers/
│   │   │   │   ├── Accounts.cfc
│   │   │   │   ├── Controller.cfc
│   │   │   │   ├── Main.cfc
│   │   │   │   ├── PasswordResets.cfc
│   │   │   │   ├── Register.cfc
│   │   │   │   ├── Sessions.cfc
│   │   │   │   ├── admin/
│   │   │   │   │   ├── Auditlogs.cfc
│   │   │   │   │   ├── Permissions.cfc
│   │   │   │   │   ├── Roles.cfc
│   │   │   │   │   ├── Settings.cfc
│   │   │   │   │   ├── UserPermissions.cfc
│   │   │   │   │   └── Users.cfc
│   │   │   │   └── functions/
│   │   │   │       ├── auth.cfm
│   │   │   │       └── filters.cfm
│   │   │   ├── events/
│   │   │   │   ├── onabort.cfm
│   │   │   │   ├── onapplicationend.cfm
│   │   │   │   ├── onapplicationstart.cfm
│   │   │   │   ├── onerror.cfm
│   │   │   │   ├── onerror.json.cfm
│   │   │   │   ├── onerror.xml.cfm
│   │   │   │   ├── onmaintenance.cfm
│   │   │   │   ├── onmissingtemplate.cfm
│   │   │   │   ├── onrequestend.cfm
│   │   │   │   ├── onrequeststart.cfm
│   │   │   │   ├── onsessionend.cfm
│   │   │   │   └── onsessionstart.cfm
│   │   │   ├── global/
│   │   │   │   ├── auth.cfm
│   │   │   │   ├── functions.cfm
│   │   │   │   ├── install.cfm
│   │   │   │   ├── logging.cfm
│   │   │   │   └── utils.cfm
│   │   │   ├── jobs/
│   │   │   │   └── ProcessOrdersJob.cfc
│   │   │   ├── lib/
│   │   │   │   └── .keep
│   │   │   ├── mailers/
│   │   │   │   └── UserNotificationsMailer.cfc
│   │   │   ├── migrator/
│   │   │   │   ├── .keep
│   │   │   │   └── migrations/
│   │   │   │       ├── 20180519095317_Creates_User_Table.cfc
│   │   │   │       ├── 20180519100056_Creates_Roles_Table.cfc
│   │   │   │       ├── 20180519100244_Creates_Permissions_Table.cfc
│   │   │   │       ├── 20180519100412_Creates_RolePermissions_Table.cfc
│   │   │   │       ├── 20180519100428_Creates_UserPermissions_Table.cfc
│   │   │   │       ├── 20180519100429_Creates_Settings_Table.cfc
│   │   │   │       ├── 20180519100430_Creates_Auditlog_Table.cfc
│   │   │   │       ├── 20180519105943_Adds_Default_Roles.cfc
│   │   │   │       ├── 20180519105944_Adds_Default_UserAccounts.cfc
│   │   │   │       ├── 20180519105945_Adds_Default_Settings.cfc
│   │   │   │       ├── 20180519105946_Adds_Default_Permissions.cfc
│   │   │   │       ├── 20180519105947_Adds_Default_UserPermissions.cfc
│   │   │   │       └── 20180519105948_Adds_Dummy_Auditlogs.cfc
│   │   │   ├── models/
│   │   │   │   ├── Auditlog.cfc
│   │   │   │   ├── Model.cfc
│   │   │   │   ├── Permission.cfc
│   │   │   │   ├── Role.cfc
│   │   │   │   ├── RolePermission.cfc
│   │   │   │   ├── Setting.cfc
│   │   │   │   ├── User.cfc
│   │   │   │   ├── UserPermission.cfc
│   │   │   │   └── auth/
│   │   │   │       ├── LDAP.cfc
│   │   │   │       └── Local.cfc
│   │   │   ├── snippets/
│   │   │   │   ├── ActionContent.txt
│   │   │   │   ├── ApiControllerContent.txt
│   │   │   │   ├── BoxJSON.txt
│   │   │   │   ├── CRUDContent.txt
│   │   │   │   ├── ConfigAppContent.txt
│   │   │   │   ├── ConfigDataSourceH2Content.txt
│   │   │   │   ├── ConfigReloadPasswordContent.txt
│   │   │   │   ├── ConfigRoutes.txt
│   │   │   │   ├── ControllerContent.txt
│   │   │   │   ├── DBMigrate.txt
│   │   │   │   ├── ModelContent.txt
│   │   │   │   ├── ServerJSON.txt
│   │   │   │   ├── ViewContent.txt
│   │   │   │   ├── WheelsBoxJSON.txt
│   │   │   │   ├── bootstrap/
│   │   │   │   │   ├── layout.cfm
│   │   │   │   │   └── settings.cfm
│   │   │   │   ├── crud/
│   │   │   │   │   ├── _form.txt
│   │   │   │   │   ├── edit.txt
│   │   │   │   │   ├── index.txt
│   │   │   │   │   ├── new.txt
│   │   │   │   │   └── show.txt
│   │   │   │   ├── dbmigrate/
│   │   │   │   │   ├── announce.txt
│   │   │   │   │   ├── blank.txt
│   │   │   │   │   ├── change-column.txt
│   │   │   │   │   ├── change-table.txt
│   │   │   │   │   ├── create-column.txt
│   │   │   │   │   ├── create-index.txt
│   │   │   │   │   ├── create-record.txt
│   │   │   │   │   ├── create-table.txt
│   │   │   │   │   ├── execute.txt
│   │   │   │   │   ├── remove-column.txt
│   │   │   │   │   ├── remove-index.txt
│   │   │   │   │   ├── remove-record.txt
│   │   │   │   │   ├── remove-table.txt
│   │   │   │   │   ├── rename-column.txt
│   │   │   │   │   ├── rename-table.txt
│   │   │   │   │   └── update-record.txt
│   │   │   │   └── tests/
│   │   │   │       ├── controller.txt
│   │   │   │       ├── model.txt
│   │   │   │       └── view.txt
│   │   │   └── views/
│   │   │       ├── accounts/
│   │   │       │   ├── edit.cfm
│   │   │       │   ├── resetPassword.cfm
│   │   │       │   └── show.cfm
│   │   │       ├── admin/
│   │   │       │   ├── auditlogs/
│   │   │       │   │   ├── _filter.cfm
│   │   │       │   │   ├── _modal.cfm
│   │   │       │   │   └── index.cfm
│   │   │       │   ├── permissions/
│   │   │       │   │   ├── _form.cfm
│   │   │       │   │   ├── edit.cfm
│   │   │       │   │   └── index.cfm
│   │   │       │   ├── roles/
│   │   │       │   │   ├── _form.cfm
│   │   │       │   │   ├── edit.cfm
│   │   │       │   │   ├── index.cfm
│   │   │       │   │   └── new.cfm
│   │   │       │   ├── settings/
│   │   │       │   │   ├── _form.cfm
│   │   │       │   │   ├── edit.cfm
│   │   │       │   │   └── index.cfm
│   │   │       │   ├── userpermissions/
│   │   │       │   │   └── index.cfm
│   │   │       │   └── users/
│   │   │       │       ├── _filter.cfm
│   │   │       │       ├── edit.cfm
│   │   │       │       ├── form/
│   │   │       │       │   ├── _auth.cfm
│   │   │       │       │   ├── _details.cfm
│   │   │       │       │   └── _role.cfm
│   │   │       │       ├── index.cfm
│   │   │       │       ├── new.cfm
│   │   │       │       └── show.cfm
│   │   │       ├── emails/
│   │   │       │   ├── _footer.cfm
│   │   │       │   ├── _header.cfm
│   │   │       │   ├── passwordReset.cfm
│   │   │       │   ├── passwordResetAdmin.cfm
│   │   │       │   ├── passwordResetAdminPlain.cfm
│   │   │       │   ├── passwordResetPlain.cfm
│   │   │       │   ├── verify.cfm
│   │   │       │   └── verifyPlain.cfm
│   │   │       ├── helpers.cfm
│   │   │       ├── layout/
│   │   │       │   ├── _footer.cfm
│   │   │       │   └── _navigation.cfm
│   │   │       ├── layout.cfm
│   │   │       ├── main/
│   │   │       │   └── index.cfm
│   │   │       ├── passwordresets/
│   │   │       │   ├── edit.cfm
│   │   │       │   └── new.cfm
│   │   │       ├── register/
│   │   │       │   └── new.cfm
│   │   │       ├── sessions/
│   │   │       │   └── new.cfm
│   │   │       └── wheels/
│   │   │           ├── layout.cfm
│   │   │           └── wheels.cfm
│   │   ├── box.json
│   │   ├── config/
│   │   │   ├── app.cfm
│   │   │   ├── development/
│   │   │   │   └── settings.cfm
│   │   │   ├── environment.cfm
│   │   │   ├── maintenance/
│   │   │   │   └── settings.cfm
│   │   │   ├── production/
│   │   │   │   └── settings.cfm
│   │   │   ├── routes.cfm
│   │   │   ├── settings.cfm
│   │   │   └── testing/
│   │   │       └── settings.cfm
│   │   ├── db/
│   │   │   └── .keep
│   │   ├── plugins/
│   │   │   ├── .keep
│   │   │   ├── FlashMessagesBootstrap/
│   │   │   │   ├── FlashMessagesBootstrap.cfc
│   │   │   │   ├── LICENSE
│   │   │   │   ├── README.md
│   │   │   │   ├── box.json
│   │   │   │   ├── index.cfm
│   │   │   │   └── stylesheets/
│   │   │   │       └── bootstrap.min.cfm
│   │   │   ├── authenticateThis/
│   │   │   │   ├── authenticateThis.cfc
│   │   │   │   ├── box.json
│   │   │   │   ├── index.cfm
│   │   │   │   └── tests/
│   │   │   │       ├── AuthenticateTest.cfc
│   │   │   │       └── _assets/
│   │   │   │           └── models/
│   │   │   │               └── dummy.cfc
│   │   │   └── jsconfirm/
│   │   │       ├── JSConfirm.cfc
│   │   │       ├── LICENSE
│   │   │       ├── README.md
│   │   │       ├── box.json
│   │   │       └── index.cfm
│   │   ├── public/
│   │   │   ├── Application.cfc
│   │   │   ├── files/
│   │   │   │   └── .keep
│   │   │   ├── images/
│   │   │   │   └── .keep
│   │   │   ├── index.cfm
│   │   │   ├── javascripts/
│   │   │   │   ├── .keep
│   │   │   │   ├── custom.js
│   │   │   │   └── daterangepicker.js
│   │   │   ├── miscellaneous/
│   │   │   │   └── Application.cfc
│   │   │   ├── stylesheets/
│   │   │   │   ├── .keep
│   │   │   │   ├── custom.css
│   │   │   │   └── daterangepicker.css
│   │   │   ├── test-mcp.cfm
│   │   │   └── urlrewrite.xml
│   │   ├── server.json
│   │   └── tests/
│   │       ├── RocketUnit/
│   │       │   ├── Test.cfc
│   │       │   ├── functions/
│   │       │   │   ├── Auth.cfc
│   │       │   │   ├── Permissions.cfc
│   │       │   │   ├── Utils.cfc
│   │       │   │   └── models/
│   │       │   │       ├── Auditlog.cfc
│   │       │   │       ├── Permission.cfc
│   │       │   │       ├── Role.cfc
│   │       │   │       └── User.cfc
│   │       │   └── requests/
│   │       │       ├── Accounts.cfc
│   │       │       ├── Main.cfc
│   │       │       └── Sessions.cfc
│   │       ├── _assets/
│   │       │   ├── controllers/
│   │       │   │   └── Controller.cfc
│   │       │   ├── files/
│   │       │   │   └── .keep
│   │       │   ├── migrator/
│   │       │   │   └── migrations/
│   │       │   │       └── .keep
│   │       │   ├── models/
│   │       │   │   └── Model.cfc
│   │       │   ├── plugins/
│   │       │   │   └── .keep
│   │       │   └── views/
│   │       │       ├── .keep
│   │       │       ├── helpers.cfm
│   │       │       └── layout.cfm
│   │       ├── populate.cfm
│   │       ├── routes.cfm
│   │       ├── runner.cfm
│   │       └── specs/
│   │           └── functions/
│   │               └── ExampleSpec.cfc
│   └── tweet/
│       ├── .ai/
│       │   ├── CONTRIBUTION_SUMMARY.md
│       │   ├── MCP-ENFORCEMENT.md
│       │   ├── QUICK_REFERENCE.md
│       │   ├── README.md
│       │   ├── cfml/
│       │   │   ├── README.md
│       │   │   ├── advanced/
│       │   │   │   └── closures.md
│       │   │   ├── best-practices/
│       │   │   │   ├── modern-patterns.md
│       │   │   │   └── performance.md
│       │   │   ├── components/
│       │   │   │   ├── component-basics.md
│       │   │   │   ├── functions.md
│       │   │   │   └── properties.md
│       │   │   ├── control-flow/
│       │   │   │   ├── conditionals.md
│       │   │   │   ├── exception-handling.md
│       │   │   │   └── loops.md
│       │   │   ├── data-types/
│       │   │   │   ├── arrays/
│       │   │   │   │   ├── array-creation.md
│       │   │   │   │   ├── array-iteration.md
│       │   │   │   │   └── array-methods.md
│       │   │   │   ├── numbers/
│       │   │   │   │   └── numeric-basics.md
│       │   │   │   ├── scopes/
│       │   │   │   │   └── variables-scope.md
│       │   │   │   ├── strings/
│       │   │   │   │   ├── string-functions.md
│       │   │   │   │   ├── string-interpolation.md
│       │   │   │   │   └── string-literals.md
│       │   │   │   ├── structures/
│       │   │   │   │   ├── struct-creation.md
│       │   │   │   │   └── structure-basics.md
│       │   │   │   ├── variable-scopes.md
│       │   │   │   └── variables.md
│       │   │   ├── database/
│       │   │   │   └── query-basics.md
│       │   │   └── syntax/
│       │   │       ├── basic-syntax.md
│       │   │       ├── cfscript-vs-tags.md
│       │   │       ├── comments.md
│       │   │       └── hash-escaping.md
│       │   └── wheels/
│       │       ├── README.md
│       │       ├── cli/
│       │       │   └── generators/
│       │       │       ├── controllers.md
│       │       │       ├── migrations.md
│       │       │       ├── models.md
│       │       │       └── scaffolds.md
│       │       ├── communication/
│       │       │   └── email-sending.md
│       │       ├── configuration/
│       │       │   ├── application.md
│       │       │   ├── best-practices.md
│       │       │   ├── environments.md
│       │       │   ├── framework-settings.md
│       │       │   ├── overview.md
│       │       │   ├── routing.md
│       │       │   ├── security.md
│       │       │   └── troubleshooting.md
│       │       ├── controllers/
│       │       │   ├── api.md
│       │       │   ├── architecture.md
│       │       │   ├── filters/
│       │       │   │   ├── authentication.md
│       │       │   │   ├── authorization.md
│       │       │   │   └── before-after.md
│       │       │   ├── filters.md
│       │       │   ├── http-detection.md
│       │       │   ├── model-interactions.md
│       │       │   ├── params/
│       │       │   │   └── verification.md
│       │       │   ├── rendering/
│       │       │   │   ├── json.md
│       │       │   │   ├── redirects.md
│       │       │   │   └── views.md
│       │       │   ├── rendering.md
│       │       │   ├── security.md
│       │       │   └── testing.md
│       │       ├── core-concepts/
│       │       │   ├── mvc-architecture/
│       │       │   │   ├── controllers.md
│       │       │   │   ├── conventions.md
│       │       │   │   ├── models.md
│       │       │   │   └── views.md
│       │       │   ├── orm/
│       │       │   │   ├── mapping-basics.md
│       │       │   │   ├── primary-keys.md
│       │       │   │   ├── properties.md
│       │       │   │   └── tableless-models.md
│       │       │   ├── rails-comparison.md
│       │       │   └── routing/
│       │       │       ├── basics.md
│       │       │       ├── http-methods.md
│       │       │       ├── patterns.md
│       │       │       └── resources.md
│       │       ├── database/
│       │       │   ├── associations/
│       │       │   │   ├── belongs-to.md
│       │       │   │   ├── has-many.md
│       │       │   │   ├── has-one.md
│       │       │   │   └── nested-properties.md
│       │       │   ├── migrations/
│       │       │   │   ├── advanced-operations.md
│       │       │   │   ├── best-practices.md
│       │       │   │   ├── column-types.md
│       │       │   │   ├── creating-migrations.md
│       │       │   │   ├── date-function-issues.md
│       │       │   │   ├── rollback.md
│       │       │   │   └── running-migrations.md
│       │       │   ├── queries/
│       │       │   │   ├── creating-records.md
│       │       │   │   ├── deleting-records.md
│       │       │   │   ├── finding-records.md
│       │       │   │   └── updating-records.md
│       │       │   └── validations/
│       │       │       ├── custom.md
│       │       │       ├── format.md
│       │       │       ├── presence.md
│       │       │       └── uniqueness.md
│       │       ├── files/
│       │       │   └── downloads.md
│       │       ├── integration/
│       │       │   └── modern-frontend-stack.md
│       │       ├── models/
│       │       │   ├── advanced-features.md
│       │       │   ├── advanced-patterns.md
│       │       │   ├── architecture.md
│       │       │   ├── associations.md
│       │       │   ├── best-practices.md
│       │       │   ├── callbacks.md
│       │       │   ├── methods-reference.md
│       │       │   ├── performance.md
│       │       │   ├── testing.md
│       │       │   ├── user-authentication.md
│       │       │   └── validations.md
│       │       ├── patterns/
│       │       │   ├── authentication.md
│       │       │   ├── crud.md
│       │       │   └── validation-templates.md
│       │       ├── security/
│       │       │   ├── csrf-protection.md
│       │       │   └── https-detection.md
│       │       ├── snippets/
│       │       │   ├── controller-snippets.md
│       │       │   └── model-snippets.md
│       │       ├── testing/
│       │       │   └── browser-automation-patterns.md
│       │       ├── troubleshooting/
│       │       │   ├── common-errors.md
│       │       │   └── form-helper-errors.md
│       │       ├── views/
│       │       │   ├── advanced-patterns.md
│       │       │   ├── architecture.md
│       │       │   ├── best-practices.md
│       │       │   ├── data-handling.md
│       │       │   ├── forms.md
│       │       │   ├── helpers/
│       │       │   │   ├── custom.md
│       │       │   │   ├── dates.md
│       │       │   │   ├── forms.md
│       │       │   │   └── links.md
│       │       │   ├── helpers.md
│       │       │   ├── layouts/
│       │       │   │   ├── content-for.md
│       │       │   │   ├── partials.md
│       │       │   │   └── structure.md
│       │       │   ├── layouts.md
│       │       │   ├── partials.md
│       │       │   ├── query-association-patterns.md
│       │       │   └── testing.md
│       │       └── workflows/
│       │           ├── documentation-loading-strategy.md
│       │           ├── enhanced-mcp-develop-specification.md
│       │           ├── intelligent-analysis-planning-engine.md
│       │           ├── pre-implementation.md
│       │           └── template-driven-implementation-patterns.md
│       ├── .claude/
│       │   ├── .devcontainer/
│       │   │   └── devcontainer.json
│       │   ├── commands/
│       │   │   └── wheels_execute.md
│       │   ├── settings.local.json
│       │   └── skills/
│       │       ├── README.md
│       │       ├── SKILLS-QUICK-START.md
│       │       ├── wheels-anti-pattern-detector/
│       │       │   └── SKILL.md
│       │       ├── wheels-api-generator/
│       │       │   └── SKILL.md
│       │       ├── wheels-auth-generator/
│       │       │   └── SKILL.md
│       │       ├── wheels-controller-generator/
│       │       │   └── SKILL.md
│       │       ├── wheels-debugging/
│       │       │   └── SKILL.md
│       │       ├── wheels-deployment/
│       │       │   └── SKILL.md
│       │       ├── wheels-documentation-generator/
│       │       │   └── SKILL.md
│       │       ├── wheels-migration-generator/
│       │       │   └── SKILL.md
│       │       ├── wheels-model-generator/
│       │       │   ├── SKILL.md
│       │       │   └── templates/
│       │       │       ├── basic-model.cfc
│       │       │       └── user-authentication-model.cfc
│       │       ├── wheels-refactoring/
│       │       │   └── SKILL.md
│       │       ├── wheels-test-generator/
│       │       │   └── SKILL.md
│       │       └── wheels-view-generator/
│       │           └── SKILL.md
│       ├── .gitignore
│       ├── .opencode/
│       │   └── command/
│       │       └── wheels_execute.md
│       ├── .vscode/
│       │   ├── wheels-test.code-snippets
│       │   └── wheels.code-snippets
│       ├── AGENTS.md
│       ├── LICENSE
│       ├── README.md
│       ├── app/
│       │   ├── controllers/
│       │   │   ├── Controller.cfc
│       │   │   ├── Follows.cfc
│       │   │   ├── Likes.cfc
│       │   │   ├── Sessions.cfc
│       │   │   ├── Tweets.cfc
│       │   │   └── Users.cfc
│       │   ├── events/
│       │   │   ├── onabort.cfm
│       │   │   ├── onapplicationend.cfm
│       │   │   ├── onapplicationstart.cfm
│       │   │   ├── onerror.cfm
│       │   │   ├── onerror.json.cfm
│       │   │   ├── onerror.xml.cfm
│       │   │   ├── onmaintenance.cfm
│       │   │   ├── onmissingtemplate.cfm
│       │   │   ├── onrequestend.cfm
│       │   │   ├── onrequeststart.cfm
│       │   │   ├── onsessionend.cfm
│       │   │   └── onsessionstart.cfm
│       │   ├── global/
│       │   │   └── functions.cfm
│       │   ├── jobs/
│       │   │   └── ProcessOrdersJob.cfc
│       │   ├── lib/
│       │   │   └── .keep
│       │   ├── mailers/
│       │   │   └── UserNotificationsMailer.cfc
│       │   ├── migrator/
│       │   │   ├── .keep
│       │   │   └── migrations/
│       │   │       ├── .keep
│       │   │       ├── 20251021133355_CreateUsersTable.cfc
│       │   │       ├── 20251021133401_CreateTweetsTable.cfc
│       │   │       ├── 20251021133404_CreateLikesTable.cfc
│       │   │       └── 20251021133406_CreateFollowsTable.cfc
│       │   ├── models/
│       │   │   ├── Follow.cfc
│       │   │   ├── Like.cfc
│       │   │   ├── Model.cfc
│       │   │   ├── Tweet.cfc
│       │   │   └── User.cfc
│       │   ├── snippets/
│       │   │   ├── ActionContent.txt
│       │   │   ├── ApiControllerContent.txt
│       │   │   ├── BoxJSON.txt
│       │   │   ├── CRUDContent.txt
│       │   │   ├── ConfigAppContent.txt
│       │   │   ├── ConfigDataSourceH2Content.txt
│       │   │   ├── ConfigReloadPasswordContent.txt
│       │   │   ├── ConfigRoutes.txt
│       │   │   ├── ControllerContent.txt
│       │   │   ├── DBMigrate.txt
│       │   │   ├── ModelContent.txt
│       │   │   ├── ServerJSON.txt
│       │   │   ├── ViewContent.txt
│       │   │   ├── WheelsBoxJSON.txt
│       │   │   ├── bootstrap/
│       │   │   │   ├── layout.cfm
│       │   │   │   └── settings.cfm
│       │   │   ├── crud/
│       │   │   │   ├── _form.txt
│       │   │   │   ├── edit.txt
│       │   │   │   ├── index.txt
│       │   │   │   ├── new.txt
│       │   │   │   └── show.txt
│       │   │   ├── dbmigrate/
│       │   │   │   ├── announce.txt
│       │   │   │   ├── blank.txt
│       │   │   │   ├── change-column.txt
│       │   │   │   ├── change-table.txt
│       │   │   │   ├── create-column.txt
│       │   │   │   ├── create-index.txt
│       │   │   │   ├── create-record.txt
│       │   │   │   ├── create-table.txt
│       │   │   │   ├── execute.txt
│       │   │   │   ├── remove-column.txt
│       │   │   │   ├── remove-index.txt
│       │   │   │   ├── remove-record.txt
│       │   │   │   ├── remove-table.txt
│       │   │   │   ├── rename-column.txt
│       │   │   │   ├── rename-table.txt
│       │   │   │   └── update-record.txt
│       │   │   ├── mcp-server.js.txt
│       │   │   └── tests/
│       │   │       ├── controller.txt
│       │   │       ├── model.txt
│       │   │       └── view.txt
│       │   └── views/
│       │       ├── helpers.cfm
│       │       ├── layout.cfm
│       │       ├── sessions/
│       │       │   └── new.cfm
│       │       ├── tweets/
│       │       │   └── index.cfm
│       │       ├── usernotificationsmailer/
│       │       │   └── sendEmail.cfm
│       │       └── users/
│       │           ├── edit.cfm
│       │           ├── new.cfm
│       │           └── show.cfm
│       ├── box.json
│       ├── config/
│       │   ├── app.cfm
│       │   ├── development/
│       │   │   └── settings.cfm
│       │   ├── environment.cfm
│       │   ├── maintenance/
│       │   │   └── settings.cfm
│       │   ├── production/
│       │   │   └── settings.cfm
│       │   ├── routes.cfm
│       │   ├── settings.cfm
│       │   └── testing/
│       │       └── settings.cfm
│       ├── plugins/
│       │   └── .keep
│       ├── public/
│       │   ├── .htaccess
│       │   ├── Application.cfc
│       │   ├── files/
│       │   │   └── .keep
│       │   ├── images/
│       │   │   └── .keep
│       │   ├── index.bxm
│       │   ├── index.cfm
│       │   ├── javascripts/
│       │   │   └── .keep
│       │   ├── miscellaneous/
│       │   │   └── Application.cfc
│       │   ├── stylesheets/
│       │   │   └── .keep
│       │   └── urlrewrite.xml
│       ├── server.json
│       ├── tests/
│       │   ├── _assets/
│       │   │   ├── controllers/
│       │   │   │   └── Controller.cfc
│       │   │   ├── files/
│       │   │   │   └── .keep
│       │   │   ├── migrator/
│       │   │   │   └── migrations/
│       │   │   │       └── .keep
│       │   │   ├── models/
│       │   │   │   └── Model.cfc
│       │   │   ├── plugins/
│       │   │   │   └── .keep
│       │   │   └── views/
│       │   │       ├── .keep
│       │   │       ├── helpers.cfm
│       │   │       └── layout.cfm
│       │   ├── populate.cfm
│       │   ├── routes.cfm
│       │   ├── runner.cfm
│       │   └── specs/
│       │       └── functions/
│       │           └── ExampleSpec.cfc
│       ├── vendor/
│       │   └── .keep
│       └── wheels-base-template-3.0.0-SNAPSHOT.rc.1+1053-20251021194426
├── lucee.json
├── package.json
├── playwright.config.ts
├── plugins/
│   └── .keep
├── public/
│   ├── .htaccess
│   ├── Application.cfc
│   ├── ApplicationProxy.cfc
│   ├── files/
│   │   └── .keep
│   ├── images/
│   │   └── .keep
│   ├── index.bxm
│   ├── index.cfm
│   ├── javascripts/
│   │   └── .keep
│   ├── miscellaneous/
│   │   └── Application.cfc
│   ├── stylesheets/
│   │   └── .keep
│   └── urlrewrite.xml
├── server.json
├── tests/
│   ├── README.md
│   ├── TestRunner.cfc
│   ├── _assets/
│   │   ├── controllers/
│   │   │   └── Controller.cfc
│   │   ├── files/
│   │   │   └── .keep
│   │   ├── migrator/
│   │   │   └── migrations/
│   │   │       └── .keep
│   │   ├── models/
│   │   │   ├── Author.cfc
│   │   │   ├── Model.cfc
│   │   │   └── Post.cfc
│   │   ├── plugins/
│   │   │   └── .keep
│   │   └── views/
│   │       ├── .keep
│   │       ├── helpers.cfm
│   │       └── layout.cfm
│   ├── populate.cfm
│   ├── routes.cfm
│   ├── runner.cfm
│   └── specs/
│       └── functional/
│           └── ExampleSpec.cfc
├── tools/
│   ├── article-tests/
│   │   ├── Probe.cfc
│   │   ├── Probes.cfc
│   │   ├── README.md
│   │   ├── boxlang.json
│   │   ├── edge-cases.cfm
│   │   ├── run.cfm
│   │   └── run.sh
│   ├── auto-merge.sh
│   ├── build/
│   │   ├── base/
│   │   │   ├── .gitignore
│   │   │   ├── .mcp.json
│   │   │   ├── .opencode.json
│   │   │   ├── README.md
│   │   │   ├── box.json
│   │   │   ├── config/
│   │   │   │   ├── app.cfm
│   │   │   │   └── settings.cfm
│   │   │   └── server.json
│   │   ├── cli/
│   │   │   ├── README.md
│   │   │   └── box.json
│   │   ├── core/
│   │   │   ├── README.md
│   │   │   ├── box.json
│   │   │   └── wheels.json
│   │   ├── lib/
│   │   │   └── ant-contrib-1.0b3.jar
│   │   └── scripts/
│   │       ├── README.md
│   │       ├── build-base.sh
│   │       ├── build-cli.sh
│   │       ├── build-core.sh
│   │       ├── build-starterApp.sh
│   │       ├── generate-changelog.sh
│   │       ├── prepare-base.sh
│   │       ├── prepare-cli.sh
│   │       ├── prepare-core.sh
│   │       ├── prepare-starterApp.sh
│   │       ├── publish-to-forgebox.sh
│   │       └── test-forgebox-package.sh
│   ├── ci/
│   │   ├── lucee.ci.json
│   │   ├── run-tests.sh
│   │   ├── setup-datasources.cfm
│   │   └── smoke-test-module.sh
│   ├── deploy-config-diff.sh
│   ├── deploy-dry-run-diff.sh
│   ├── deploy-dry-run-normalize.py
│   ├── deploy-e2e-down.sh
│   ├── deploy-e2e-up.sh
│   ├── deploy-sshd-down.sh
│   ├── deploy-sshd-up.sh
│   ├── deploy-verb-smoke.sh
│   ├── distribution-drafts/
│   │   ├── README.md
│   │   ├── apt-repo/
│   │   │   ├── README.md
│   │   │   ├── scripts/
│   │   │   │   └── regenerate-apt-metadata.sh
│   │   │   ├── templates/
│   │   │   │   ├── aptftparchive.conf
│   │   │   │   ├── index.html
│   │   │   │   └── wheels.gpg.placeholder
│   │   │   └── workflows/
│   │   │       └── wheels-released.yml
│   │   ├── homebrew/
│   │   │   ├── auto-update-channel-patch.md
│   │   │   ├── bleeding-edge-update.yml
│   │   │   └── wheels-be.rb
│   │   ├── linux-packages/
│   │   │   ├── README.md
│   │   │   ├── build-linux-packages.sh
│   │   │   ├── nfpm-wheels-be.yaml
│   │   │   └── nfpm-wheels.yaml
│   │   ├── scoop/
│   │   │   ├── README.md
│   │   │   ├── build-manifests.py
│   │   │   ├── validate.py
│   │   │   ├── wheels-be.json
│   │   │   └── wheels.json
│   │   ├── snapshots-repo/
│   │   │   ├── README.md
│   │   │   └── cleanup-old-snapshots.yml
│   │   ├── winget/
│   │   │   ├── README.md
│   │   │   ├── Wheels.Wheels/
│   │   │   │   └── 4.0.0/
│   │   │   │       ├── Wheels.Wheels.installer.yaml
│   │   │   │       ├── Wheels.Wheels.locale.en-US.yaml
│   │   │   │       └── Wheels.Wheels.yaml
│   │   │   ├── Wheels.WheelsBE/
│   │   │   │   └── 4.0.0-snapshot.1789/
│   │   │   │       ├── Wheels.WheelsBE.installer.yaml
│   │   │   │       ├── Wheels.WheelsBE.locale.en-US.yaml
│   │   │   │       └── Wheels.WheelsBE.yaml
│   │   │   └── validate.py
│   │   └── yum-repo/
│   │       ├── README.md
│   │       ├── scripts/
│   │       │   └── regenerate-yum-metadata.sh
│   │       ├── templates/
│   │       │   ├── index.html
│   │       │   ├── wheels-be.repo
│   │       │   ├── wheels.gpg.placeholder
│   │       │   └── wheels.repo
│   │       └── workflows/
│   │           └── wheels-released.yml
│   ├── docker/
│   │   ├── .gitignore
│   │   ├── Oracle/
│   │   │   └── 01-configure-cursors.sql
│   │   ├── README.md
│   │   ├── adobe2018/
│   │   │   ├── CFConfig-actions.json
│   │   │   ├── CFConfig.json
│   │   │   ├── Dockerfile
│   │   │   ├── box.json
│   │   │   ├── lib/
│   │   │   │   └── .keep
│   │   │   ├── server.json
│   │   │   └── settings.cfm
│   │   ├── adobe2021/
│   │   │   ├── CFConfig-actions.json
│   │   │   ├── CFConfig.json
│   │   │   ├── Dockerfile
│   │   │   ├── box.json
│   │   │   ├── lib/
│   │   │   │   ├── .keep
│   │   │   │   └── sqlite-jdbc-3.50.3.0.jar
│   │   │   ├── server.json
│   │   │   └── settings.cfm
│   │   ├── adobe2023/
│   │   │   ├── CFConfig-actions.json
│   │   │   ├── CFConfig.json
│   │   │   ├── Dockerfile
│   │   │   ├── box.json
│   │   │   ├── lib/
│   │   │   │   ├── .keep
│   │   │   │   └── sqlite-jdbc-3.50.3.0.jar
│   │   │   ├── server.json
│   │   │   └── settings.cfm
│   │   ├── adobe2025/
│   │   │   ├── CFConfig-actions.json
│   │   │   ├── CFConfig.json
│   │   │   ├── Dockerfile
│   │   │   ├── box.json
│   │   │   ├── lib/
│   │   │   │   ├── .keep
│   │   │   │   └── sqlite-jdbc-3.50.3.0.jar
│   │   │   ├── server.json
│   │   │   └── settings.cfm
│   │   ├── boxlang/
│   │   │   ├── CFConfig-actions.json
│   │   │   ├── CFConfig.json
│   │   │   ├── Dockerfile
│   │   │   ├── box.json
│   │   │   ├── lib/
│   │   │   │   └── .keep
│   │   │   ├── server.json
│   │   │   └── settings.cfm
│   │   ├── dev/
│   │   │   ├── cfconfig-h2.json
│   │   │   ├── cfconfig-mysql.json
│   │   │   └── cfconfig-postgres.json
│   │   ├── github/
│   │   │   ├── README.md
│   │   │   ├── Tasks.cfc
│   │   │   ├── core-tests.sh
│   │   │   ├── db-up.sh
│   │   │   ├── functions.sh
│   │   │   ├── server-up.sh
│   │   │   └── wait-for-it.sh
│   │   ├── lucee5/
│   │   │   ├── CFConfig-actions.json
│   │   │   ├── CFConfig.json
│   │   │   ├── Dockerfile
│   │   │   ├── box.json
│   │   │   ├── lib/
│   │   │   │   └── .keep
│   │   │   ├── server.json
│   │   │   └── settings.cfm
│   │   ├── lucee6/
│   │   │   ├── CFConfig-actions.json
│   │   │   ├── CFConfig.json
│   │   │   ├── Dockerfile
│   │   │   ├── box.json
│   │   │   ├── lib/
│   │   │   │   └── .keep
│   │   │   ├── server.json
│   │   │   └── settings.cfm
│   │   ├── lucee7/
│   │   │   ├── CFConfig-actions.json
│   │   │   ├── CFConfig.json
│   │   │   ├── Dockerfile
│   │   │   ├── box.json
│   │   │   ├── server.json
│   │   │   └── settings.cfm
│   │   ├── sqlserver/
│   │   │   ├── APPLE_SILICON.md
│   │   │   ├── Dockerfile
│   │   │   ├── Dockerfile_CICD
│   │   │   ├── README.md
│   │   │   └── init-db.sh
│   │   └── testui/
│   │       ├── .gitignore
│   │       ├── DEVELOPMENT.md
│   │       ├── DOCKER-INTEGRATION.md
│   │       ├── DOCKER-README.md
│   │       ├── DOCKER-USAGE.md
│   │       ├── Dockerfile
│   │       ├── Dockerfile.dev
│   │       ├── IMPLEMENTATION-NOTES.md
│   │       ├── README.md
│   │       ├── docker-build.sh
│   │       ├── docker-compose.dev.yml
│   │       ├── docker-compose.test.yml
│   │       ├── docker-entrypoint.sh
│   │       ├── docker-test.sh
│   │       ├── index.html
│   │       ├── nginx.conf
│   │       ├── package.json
│   │       ├── proxy_buffer_size.conf
│   │       ├── public/
│   │       │   └── error.html
│   │       ├── src/
│   │       │   ├── App.vue
│   │       │   ├── assets/
│   │       │   │   └── main.css
│   │       │   ├── components/
│   │       │   │   ├── PreflightStatus.vue
│   │       │   │   ├── StatusBadge.vue
│   │       │   │   ├── TestResultItem.vue
│   │       │   │   └── TestStats.vue
│   │       │   ├── env.d.ts
│   │       │   ├── main.ts
│   │       │   ├── router/
│   │       │   │   └── index.ts
│   │       │   ├── services/
│   │       │   │   ├── docker.service.ts
│   │       │   │   ├── preflight.service.ts
│   │       │   │   └── test.service.ts
│   │       │   ├── shims-vue.d.ts
│   │       │   ├── stores/
│   │       │   │   ├── databaseStore.ts
│   │       │   │   ├── engineStore.ts
│   │       │   │   ├── testStore.ts
│   │       │   │   └── themeStore.ts
│   │       │   ├── types/
│   │       │   │   └── index.ts
│   │       │   ├── types.ts
│   │       │   ├── utils/
│   │       │   │   ├── api.ts
│   │       │   │   └── theme.ts
│   │       │   └── views/
│   │       │       ├── HomeView.vue
│   │       │       └── TestsView.vue
│   │       ├── supervisord.conf
│   │       ├── tsconfig.json
│   │       ├── tsconfig.node.json
│   │       └── vite.config.ts
│   ├── docs-validation/
│   │   ├── .gitignore
│   │   ├── README.md
│   │   ├── agent/
│   │   │   ├── prompt-guide.md
│   │   │   └── prompt.md
│   │   ├── lib/
│   │   │   ├── agent.mjs
│   │   │   ├── guides.mjs
│   │   │   ├── reference-store.mjs
│   │   │   ├── snapshot.mjs
│   │   │   ├── source-map.mjs
│   │   │   ├── state.mjs
│   │   │   └── tools.mjs
│   │   ├── orchestrate.mjs
│   │   ├── package.json
│   │   └── state.json
│   ├── install-playwright.sh
│   ├── installer/
│   │   ├── chocolatey/
│   │   │   ├── README.md
│   │   │   ├── build-choco.ps1
│   │   │   ├── lucli.nuspec
│   │   │   └── tools/
│   │   │       ├── VERIFICATION.txt
│   │   │       ├── chocolateyinstall.ps1
│   │   │       └── chocolateyuninstall.ps1
│   │   ├── macos/
│   │   │   ├── .gitignore
│   │   │   ├── Info.plist
│   │   │   ├── README.md
│   │   │   ├── WheelsInstallerApp.swift
│   │   │   ├── assets/
│   │   │   │   └── wheels_logo.icns
│   │   │   ├── build-swift.sh
│   │   │   ├── create-dmg.sh
│   │   │   ├── install-wheels
│   │   │   └── installer/
│   │   │       └── wheels-installer.dmg
│   │   └── windows/
│   │       ├── README.md
│   │       ├── install-wheels.iss
│   │       └── install-wheels.ps1
│   ├── issue-resolver/
│   │   ├── lib/
│   │   │   ├── config.ts
│   │   │   ├── github.ts
│   │   │   └── session.ts
│   │   ├── run.ts
│   │   ├── setup.ts
│   │   └── tsconfig.json
│   ├── lucee-extensions/
│   │   └── sqlite/
│   │       ├── .gitignore
│   │       ├── README.md
│   │       ├── build.sh
│   │       ├── install.sh
│   │       └── src/
│   │           ├── SQLite.cfc
│   │           ├── build.properties
│   │           └── sqlite-jdbc-3.49.1.0.jar
│   ├── scripts/
│   │   ├── integration-test.sh
│   │   └── setup.sh
│   ├── test-cli-e2e.sh
│   ├── test-cli-local.sh
│   ├── test-local.sh
│   ├── test-matrix.sh
│   ├── test-onboarding.sh
│   ├── test-tutorial-ch7.sh
│   ├── vscode-ext/
│   │   ├── .gitignore
│   │   ├── .vscodeignore
│   │   ├── CHANGELOG.md
│   │   ├── LICENSE
│   │   ├── README.md
│   │   ├── assets/
│   │   │   └── templates/
│   │   │       ├── controller.cfc
│   │   │       ├── model.cfc
│   │   │       ├── view-edit.cfm
│   │   │       ├── view-index.cfm
│   │   │       ├── view-new.cfm
│   │   │       └── view-show.cfm
│   │   ├── package.json
│   │   ├── snippets/
│   │   │   ├── wheels-api.json
│   │   │   └── wheels.code-snippets
│   │   └── src/
│   │       └── extension.js
│   └── workspace/
│       └── .keep
├── web/
│   ├── .prettierignore
│   ├── .prettierrc.json
│   ├── README.md
│   ├── content/
│   │   └── blog/
│   │       └── posts/
│   │           ├── 0-8-2-released.md
│   │           ├── 0-8-3-final-beta-release.md
│   │           ├── 0-9-1-available.md
│   │           ├── 0-9-2-release.md
│   │           ├── 0-9-final-beta-cycle.md
│   │           ├── 1-0-1-maintenance-release.md
│   │           ├── 1-0-2-maintenance-release.md
│   │           ├── 1-0-we-are-production-ready.md
│   │           ├── 1-1-1-released.md
│   │           ├── 1-1-4-released.md
│   │           ├── 1-1-6-released.md
│   │           ├── 1-1-8-released.md
│   │           ├── 1-1-beta-1-available.md
│   │           ├── 1-3-0-released.md
│   │           ├── 1-3-1-maintenance-release.md
│   │           ├── 1-3-2-maintenance-release.md
│   │           ├── 1-3-3-maintenance-release.md
│   │           ├── 10-years-of-cfwheels-welcome-adam-cfwheels-2-x.md
│   │           ├── andy-bellenie-joins-core-team.md
│   │           ├── andy-bellenie-to-speak-at-scotch-on-the-rocks-2013.md
│   │           ├── another-great-cf-objective-is-over-wheels.md
│   │           ├── apologies-duplicate-entries-rss.md
│   │           ├── associations-chapter-in-documentation.md
│   │           ├── background-jobs-without-redis.md
│   │           ├── behind-the-scenes-how-a-single-commit-becomes-a-running-application-across-40-configurations.md
│   │           ├── building-search-forms-with-tableless-models-in-cfwheels.md
│   │           ├── calling-all-plugin-authors-time-for-2-x-.md
│   │           ├── celebrating-20-years-of-cfwheels-a-look-back-and-a-step-forward-as-wheels-dev.md
│   │           ├── cf-objective-2011.md
│   │           ├── cf-objective-finale.md
│   │           ├── cf-objective-starts-and-free-t-shirts.md
│   │           ├── cfmeetup-intro-wheels-orm.md
│   │           ├── cfmeetup-presentation-thursday.md
│   │           ├── cfunited-2010-on-wheels.md
│   │           ├── cfwheels-1-4-0-released-new-documentation-too.md
│   │           ├── cfwheels-1-4-1-maintenance-release.md
│   │           ├── cfwheels-1-4-2-maintenance-release.md
│   │           ├── cfwheels-1-4-3-maintenance-release.md
│   │           ├── cfwheels-1-4-4-maintenance-release.md
│   │           ├── cfwheels-1-4-5-maintenance-release.md
│   │           ├── cfwheels-1-4-6-maintenance-release.md
│   │           ├── cfwheels-2-0-0-beta-1-now-available.md
│   │           ├── cfwheels-2-0-1-maintenance-release.md
│   │           ├── cfwheels-2-0-2-security-release.md
│   │           ├── cfwheels-2-0-released.md
│   │           ├── cfwheels-2-1-0-beta-now-available.md
│   │           ├── cfwheels-2-1-released.md
│   │           ├── cfwheels-2-2-released.md
│   │           ├── cfwheels-2-3-0-rc-1.md
│   │           ├── cfwheels-2-3-0-released.md
│   │           ├── cfwheels-added-to-the-htmx-server-side-examples-page.md
│   │           ├── cfwheels-announces-a-bug-bounty.md
│   │           ├── cfwheels-dotenvsettings-plugin-published.md
│   │           ├── cfwheels-fully-embraces-forgebox-packages.md
│   │           ├── cfwheels-guides-moved-to-gitbook.md
│   │           ├── cfwheels-has-moved-to-github-discussions.md
│   │           ├── cfwheels-htmx-plugin-published.md
│   │           ├── cfwheels-joins-open-source-collective.md
│   │           ├── cfwheels-on-cf-alive-the-sequel.md
│   │           ├── cfwheels-on-cf-alive.md
│   │           ├── cfwheels-v2-4-0-released.md
│   │           ├── cfwheels-v2-5-0-released.md
│   │           ├── cfwheels-x-dresshead-short-sleeved-dress-contrasting-wrap-details-irregular-hemline.md
│   │           ├── changing-of-the-guards-at-cfwheels.md
│   │           ├── cleaner-configuration-in-wheels-3-0-less-magic-more-clarity.md
│   │           ├── come-get-your-fresh-0-7-release.md
│   │           ├── congratulate-tony-petruzzi-lead-developer.md
│   │           ├── contributing-to-wheels.md
│   │           ├── core-team-updates.md
│   │           ├── couple-blog-series.md
│   │           ├── creating-a-basic-crud-interface-with-wheels-3-0.md
│   │           ├── creating-a-mega-quick-json-api-in-cfwheels-2-x.md
│   │           ├── creating-custom-urls-with-routes.md
│   │           ├── debugging-plugin-performance-in-cfwheels-2-x-with-fusionreactor.md
│   │           ├── documentation-updates-pages-sending-email-configurations.md
│   │           ├── download-0-9-3.md
│   │           ├── from-wirebox-to-wheelsdi.md
│   │           ├── getting-started-video-tutorial.md
│   │           ├── getting-the-example-app-up-and-running.md
│   │           ├── hello-database-tutorial.md
│   │           ├── help-us-test-the-coldfusion-on-wheels-1-1-4-release-candidate.md
│   │           ├── how-oo-almost-destroyed-business.md
│   │           ├── internal-documentation-in-cfwheels-2-0-beta.md
│   │           ├── introducing-wheels-3-0-a-new-era-for-cfml-development.md
│   │           ├── litepost-contest-ends-feb-19.md
│   │           ├── litepost-contest-screencasts.md
│   │           ├── litepost-contest-winners.md
│   │           ├── litepost-contest.md
│   │           ├── lucli-zero-docker-developer-experience.md
│   │           ├── methods-tracking-change.md
│   │           ├── moving-to-github.md
│   │           ├── moving-towards-2-x-beta.md
│   │           ├── multi-tenancy-built-in.md
│   │           ├── new-chapter-object-validation.md
│   │           ├── new-documentation-sending-files.md
│   │           ├── new-documentation-using-layouts-chapter-new-tutorials.md
│   │           ├── new-tutorial-wheels-ajax-and-you.md
│   │           ├── presentation-mdcfug-tonight.md
│   │           ├── release-candidate-1-0-rc1.md
│   │           ├── release-candidate-1-1-rc-1.md
│   │           ├── released-1-0-4.md
│   │           ├── released-1-0-5.md
│   │           ├── released-coldfusion-on-wheels-1-0-3.md
│   │           ├── released-today-0-9-4.md
│   │           ├── released-version-0-8.md
│   │           ├── released-version-1-1-3.md
│   │           ├── request-lifecycle-in-wheels-3-0-clearer-execution-order.md
│   │           ├── screencast-basic-crud-interface-in-cfwheels-2-x.md
│   │           ├── screencast-introduction-to-unit-testing-in-cfwheels-2-x.md
│   │           ├── screencast-routing-in-cfwheels-2-x-part-2.md
│   │           ├── screencast-routing-in-cfwheels-2-x.md
│   │           ├── screencasts-are-back.md
│   │           ├── security-fixes-for-1-1-7-and-1-0-6-released.md
│   │           ├── security-hardening-in-wheels-4.md
│   │           ├── skip-the-plugin-rate-limited-api.md
│   │           ├── starting-2nd-beta-1-1.md
│   │           ├── starting-a-new-cfwheels-project-with-the-cli.md
│   │           ├── submit-feedback-uservoice.md
│   │           ├── testing-in-wheels-4.md
│   │           ├── testing-plugins-on-cfwheels-2-x-and-travis-ci-via-commandbox.md
│   │           ├── the-cfwheels-channel-on-cfml-slack-has-been-archived.md
│   │           ├── todomvc-implementation-with-cfwheels-and-htmx.md
│   │           ├── tshirt-hosting-giveaways-cfunited.md
│   │           ├── two-new-repositories-published.md
│   │           ├── unit-testing-your-new-2-x-app-in-2-x-beta.md
│   │           ├── upcoming-previous-presentations.md
│   │           ├── upgrade-to-0-8-1.md
│   │           ├── upgrade-to-1-1-5-today.md
│   │           ├── upgrading-from-wheels-3x.md
│   │           ├── version-1-1-2-released-today.md
│   │           ├── version-1-1-is-here.md
│   │           ├── way-new-collaboration.md
│   │           ├── weekend-reading-new-documentation.md
│   │           ├── welcome-don-humphreys-core-team.md
│   │           ├── welcome-james-gibson-core-team.md
│   │           ├── wheels-3-0-project-structure-what-changed-and-why-it-matters.md
│   │           ├── wheels-3-0-request-handling-the-move-to-public-index-cfm.md
│   │           ├── wheels-3-0-setting-up-your-development-environment.md
│   │           ├── wheels-4-closing-the-maturity-gap.md
│   │           ├── wheels-added-cfml-framework-generator-eclipse.md
│   │           ├── wheels-api-documentation-available.md
│   │           ├── wheels-blog-badges-wallpaper-t-shirts.md
│   │           ├── wheels-cli-asset-commands-precompile-clean-clobber.md
│   │           ├── wheels-cli-config-commands-check-diff-dump.md
│   │           ├── wheels-cli-database-commands-db-create-db-drop.md
│   │           ├── wheels-cli-environment-commands-set-show-merge-switch-validate.md
│   │           ├── wheels-cli-essentials-inspect-your-app-with-about-get-commands.md
│   │           ├── wheels-cli-matures-to-version-1-0.md
│   │           ├── wheels-cli-modern-commands-for-faster-smarter-wheels-3-0-development.md
│   │           ├── wheels-cli-plugin-commands-search-install-remove-init.md
│   │           ├── wheels-cli-testing-commands-run-all-unit-integration-watch-coverage.md
│   │           ├── wheels-cli-the-hidden-productivity-booster-for-wheels-developers.md
│   │           ├── wheels-deploy-kamal-port.md
│   │           ├── wheels-dev-goes-public-a-production-wheels-3-0-application-you-can-actually-study.md
│   │           ├── wheels-hanging-with-big-boys.md
│   │           ├── wheels-round-up-2009-12-11.md
│   │           ├── wheels-screencasts-continue.md
│   │           ├── wheels-vs-code-extension-supercharge-your-wheels-development.md
│   │           └── why-we-rebuilt-our-ci-pipeline.md
│   ├── package.json
│   ├── packages/
│   │   └── ui/
│   │       ├── package.json
│   │       ├── src/
│   │       │   ├── components/
│   │       │   │   ├── Footer.astro
│   │       │   │   ├── Header.astro
│   │       │   │   ├── Logo.astro
│   │       │   │   ├── RssPill.astro
│   │       │   │   └── starlight/
│   │       │   │       ├── EditLink.astro
│   │       │   │       ├── Footer.astro
│   │       │   │       ├── Header.astro
│   │       │   │       ├── PageTitle.astro
│   │       │   │       ├── SocialIcons.astro
│   │       │   │       └── VersionSwitcher.astro
│   │       │   ├── data/
│   │       │   │   └── versions.ts
│   │       │   └── styles/
│   │       │       ├── base.css
│   │       │       ├── starlight-theme.css
│   │       │       └── tokens.css
│   │       └── tsconfig.json
│   ├── pnpm-workspace.yaml
│   ├── scripts/
│   │   ├── README.md
│   │   ├── generate-api-docs.mjs
│   │   ├── recover-blog-images.mjs
│   │   └── visual-regression.mjs
│   ├── sites/
│   │   ├── api/
│   │   │   ├── astro.config.mjs
│   │   │   ├── package.json
│   │   │   ├── src/
│   │   │   │   ├── components/
│   │   │   │   │   └── FunctionSignature.astro
│   │   │   │   ├── content/
│   │   │   │   │   └── docs/
│   │   │   │   │       ├── index.md
│   │   │   │   │       ├── v1-4-5/
│   │   │   │   │       │   ├── index.md
│   │   │   │   │       │   └── miscellaneous/
│   │   │   │   │       │       ├── accessibleproperties.md
│   │   │   │   │       │       ├── adddefaultroutes.md
│   │   │   │   │       │       ├── adderror.md
│   │   │   │   │       │       ├── adderrortobase.md
│   │   │   │   │       │       ├── addformat.md
│   │   │   │   │       │       ├── addroute.md
│   │   │   │   │       │       ├── aftercreate.md
│   │   │   │   │       │       ├── afterdelete.md
│   │   │   │   │       │       ├── afterfind.md
│   │   │   │   │       │       ├── afterinitialization.md
│   │   │   │   │       │       ├── afternew.md
│   │   │   │   │       │       ├── aftersave.md
│   │   │   │   │       │       ├── afterupdate.md
│   │   │   │   │       │       ├── aftervalidation.md
│   │   │   │   │       │       ├── aftervalidationoncreate.md
│   │   │   │   │       │       ├── aftervalidationonupdate.md
│   │   │   │   │       │       ├── allchanges.md
│   │   │   │   │       │       ├── allerrors.md
│   │   │   │   │       │       ├── autolink.md
│   │   │   │   │       │       ├── automaticvalidations.md
│   │   │   │   │       │       ├── average.md
│   │   │   │   │       │       ├── beforecreate.md
│   │   │   │   │       │       ├── beforedelete.md
│   │   │   │   │       │       ├── beforesave.md
│   │   │   │   │       │       ├── beforeupdate.md
│   │   │   │   │       │       ├── beforevalidation.md
│   │   │   │   │       │       ├── beforevalidationoncreate.md
│   │   │   │   │       │       ├── beforevalidationonupdate.md
│   │   │   │   │       │       ├── belongsto.md
│   │   │   │   │       │       ├── buttontag.md
│   │   │   │   │       │       ├── buttonto.md
│   │   │   │   │       │       ├── caches.md
│   │   │   │   │       │       ├── capitalize.md
│   │   │   │   │       │       ├── changedfrom.md
│   │   │   │   │       │       ├── changedproperties.md
│   │   │   │   │       │       ├── checkbox.md
│   │   │   │   │       │       ├── checkboxtag.md
│   │   │   │   │       │       ├── clearchangeinformation.md
│   │   │   │   │       │       ├── clearerrors.md
│   │   │   │   │       │       ├── columndataforproperty.md
│   │   │   │   │       │       ├── columnforproperty.md
│   │   │   │   │       │       ├── columnnames.md
│   │   │   │   │       │       ├── columns.md
│   │   │   │   │       │       ├── compareto.md
│   │   │   │   │       │       ├── contentfor.md
│   │   │   │   │       │       ├── contentforlayout.md
│   │   │   │   │       │       ├── controller.md
│   │   │   │   │       │       ├── count.md
│   │   │   │   │       │       ├── create.md
│   │   │   │   │       │       ├── cycle.md
│   │   │   │   │       │       ├── datasource.md
│   │   │   │   │       │       ├── dateselect.md
│   │   │   │   │       │       ├── dateselecttags.md
│   │   │   │   │       │       ├── datetimeselect.md
│   │   │   │   │       │       ├── datetimeselecttags.md
│   │   │   │   │       │       ├── dayselecttag.md
│   │   │   │   │       │       ├── delete.md
│   │   │   │   │       │       ├── deleteall.md
│   │   │   │   │       │       ├── deletebykey.md
│   │   │   │   │       │       ├── deleteone.md
│   │   │   │   │       │       ├── deobfuscateparam.md
│   │   │   │   │       │       ├── distanceoftimeinwords.md
│   │   │   │   │       │       ├── endformtag.md
│   │   │   │   │       │       ├── errorcount.md
│   │   │   │   │       │       ├── errormessageon.md
│   │   │   │   │       │       ├── errormessagesfor.md
│   │   │   │   │       │       ├── errorson.md
│   │   │   │   │       │       ├── errorsonbase.md
│   │   │   │   │       │       ├── excerpt.md
│   │   │   │   │       │       ├── exists.md
│   │   │   │   │       │       ├── filefield.md
│   │   │   │   │       │       ├── filefieldtag.md
│   │   │   │   │       │       ├── filterchain.md
│   │   │   │   │       │       ├── filters.md
│   │   │   │   │       │       ├── findall.md
│   │   │   │   │       │       ├── findallkeys.md
│   │   │   │   │       │       ├── findbykey.md
│   │   │   │   │       │       ├── findfirst.md
│   │   │   │   │       │       ├── findlast.md
│   │   │   │   │       │       ├── findone.md
│   │   │   │   │       │       ├── findorcreateby-property.md
│   │   │   │   │       │       ├── flash.md
│   │   │   │   │       │       ├── flashclear.md
│   │   │   │   │       │       ├── flashcount.md
│   │   │   │   │       │       ├── flashdelete.md
│   │   │   │   │       │       ├── flashinsert.md
│   │   │   │   │       │       ├── flashisempty.md
│   │   │   │   │       │       ├── flashkeep.md
│   │   │   │   │       │       ├── flashkeyexists.md
│   │   │   │   │       │       ├── flashmessages.md
│   │   │   │   │       │       ├── get.md
│   │   │   │   │       │       ├── gettablenameprefix.md
│   │   │   │   │       │       ├── haschanged.md
│   │   │   │   │       │       ├── haserrors.md
│   │   │   │   │       │       ├── hasmany.md
│   │   │   │   │       │       ├── hasmanycheckbox.md
│   │   │   │   │       │       ├── hasmanyradiobutton.md
│   │   │   │   │       │       ├── hasone.md
│   │   │   │   │       │       ├── hasproperty.md
│   │   │   │   │       │       ├── hiddenfield.md
│   │   │   │   │       │       ├── hiddenfieldtag.md
│   │   │   │   │       │       ├── highlight.md
│   │   │   │   │       │       ├── hourselecttag.md
│   │   │   │   │       │       ├── humanize.md
│   │   │   │   │       │       ├── hyphenize.md
│   │   │   │   │       │       ├── imagetag.md
│   │   │   │   │       │       ├── includecontent.md
│   │   │   │   │       │       ├── includedinobject.md
│   │   │   │   │       │       ├── includelayout.md
│   │   │   │   │       │       ├── includepartial.md
│   │   │   │   │       │       ├── index.md
│   │   │   │   │       │       ├── invokewithtransaction.md
│   │   │   │   │       │       ├── isajax.md
│   │   │   │   │       │       ├── isclass.md
│   │   │   │   │       │       ├── isget.md
│   │   │   │   │       │       ├── isinstance.md
│   │   │   │   │       │       ├── isnew.md
│   │   │   │   │       │       ├── ispost.md
│   │   │   │   │       │       ├── issecure.md
│   │   │   │   │       │       ├── javascriptincludetag.md
│   │   │   │   │       │       ├── key.md
│   │   │   │   │       │       ├── linkto.md
│   │   │   │   │       │       ├── mailto.md
│   │   │   │   │       │       ├── maximum.md
│   │   │   │   │       │       ├── mimetypes.md
│   │   │   │   │       │       ├── minimum.md
│   │   │   │   │       │       ├── minuteselecttag.md
│   │   │   │   │       │       ├── model.md
│   │   │   │   │       │       ├── monthselecttag.md
│   │   │   │   │       │       ├── nestedproperties.md
│   │   │   │   │       │       ├── new.md
│   │   │   │   │       │       ├── obfuscateparam.md
│   │   │   │   │       │       ├── onlyprovides.md
│   │   │   │   │       │       ├── pagination.md
│   │   │   │   │       │       ├── paginationlinks.md
│   │   │   │   │       │       ├── passwordfield.md
│   │   │   │   │       │       ├── passwordfieldtag.md
│   │   │   │   │       │       ├── pluginnames.md
│   │   │   │   │       │       ├── pluralize.md
│   │   │   │   │       │       ├── primarykey.md
│   │   │   │   │       │       ├── primarykeys.md
│   │   │   │   │       │       ├── properties.md
│   │   │   │   │       │       ├── property.md
│   │   │   │   │       │       ├── propertyispresent.md
│   │   │   │   │       │       ├── propertynames.md
│   │   │   │   │       │       ├── protectedproperties.md
│   │   │   │   │       │       ├── provides.md
│   │   │   │   │       │       ├── radiobutton.md
│   │   │   │   │       │       ├── radiobuttontag.md
│   │   │   │   │       │       ├── redirectto.md
│   │   │   │   │       │       ├── reload.md
│   │   │   │   │       │       ├── rendernothing.md
│   │   │   │   │       │       ├── renderpage.md
│   │   │   │   │       │       ├── renderpartial.md
│   │   │   │   │       │       ├── rendertext.md
│   │   │   │   │       │       ├── renderwith.md
│   │   │   │   │       │       ├── resetcycle.md
│   │   │   │   │       │       ├── response.md
│   │   │   │   │       │       ├── save.md
│   │   │   │   │       │       ├── secondselecttag.md
│   │   │   │   │       │       ├── select.md
│   │   │   │   │       │       ├── selecttag.md
│   │   │   │   │       │       ├── sendemail.md
│   │   │   │   │       │       ├── sendfile.md
│   │   │   │   │       │       ├── set.md
│   │   │   │   │       │       ├── setfilterchain.md
│   │   │   │   │       │       ├── setpagination.md
│   │   │   │   │       │       ├── setprimarykey.md
│   │   │   │   │       │       ├── setprimarykeys.md
│   │   │   │   │       │       ├── setproperties.md
│   │   │   │   │       │       ├── setresponse.md
│   │   │   │   │       │       ├── settablenameprefix.md
│   │   │   │   │       │       ├── setverificationchain.md
│   │   │   │   │       │       ├── simpleformat.md
│   │   │   │   │       │       ├── singularize.md
│   │   │   │   │       │       ├── startformtag.md
│   │   │   │   │       │       ├── striplinks.md
│   │   │   │   │       │       ├── striptags.md
│   │   │   │   │       │       ├── stylesheetlinktag.md
│   │   │   │   │       │       ├── submittag.md
│   │   │   │   │       │       ├── sum.md
│   │   │   │   │       │       ├── table.md
│   │   │   │   │       │       ├── tablename.md
│   │   │   │   │       │       ├── textarea.md
│   │   │   │   │       │       ├── textareatag.md
│   │   │   │   │       │       ├── textfield.md
│   │   │   │   │       │       ├── textfieldtag.md
│   │   │   │   │       │       ├── timeagoinwords.md
│   │   │   │   │       │       ├── timeselect.md
│   │   │   │   │       │       ├── timeselecttags.md
│   │   │   │   │       │       ├── timeuntilinwords.md
│   │   │   │   │       │       ├── titleize.md
│   │   │   │   │       │       ├── toggle.md
│   │   │   │   │       │       ├── toxhtml.md
│   │   │   │   │       │       ├── truncate.md
│   │   │   │   │       │       ├── update.md
│   │   │   │   │       │       ├── updateall.md
│   │   │   │   │       │       ├── updatebykey.md
│   │   │   │   │       │       ├── updateone.md
│   │   │   │   │       │       ├── updateproperties.md
│   │   │   │   │       │       ├── updateproperty.md
│   │   │   │   │       │       ├── urlfor.md
│   │   │   │   │       │       ├── useslayout.md
│   │   │   │   │       │       ├── valid.md
│   │   │   │   │       │       ├── validate.md
│   │   │   │   │       │       ├── validateoncreate.md
│   │   │   │   │       │       ├── validateonupdate.md
│   │   │   │   │       │       ├── validatesconfirmationof.md
│   │   │   │   │       │       ├── validatesexclusionof.md
│   │   │   │   │       │       ├── validatesformatof.md
│   │   │   │   │       │       ├── validatesinclusionof.md
│   │   │   │   │       │       ├── validateslengthof.md
│   │   │   │   │       │       ├── validatesnumericalityof.md
│   │   │   │   │       │       ├── validatespresenceof.md
│   │   │   │   │       │       ├── validatesuniquenessof.md
│   │   │   │   │       │       ├── validationtypeforproperty.md
│   │   │   │   │       │       ├── verificationchain.md
│   │   │   │   │       │       ├── verifies.md
│   │   │   │   │       │       ├── wordtruncate.md
│   │   │   │   │       │       └── yearselecttag.md
│   │   │   │   │       ├── v2-0-0/
│   │   │   │   │       │   ├── configuration/
│   │   │   │   │       │   │   ├── addformat.md
│   │   │   │   │       │   │   ├── collection.md
│   │   │   │   │       │   │   ├── constraints.md
│   │   │   │   │       │   │   ├── controller.md
│   │   │   │   │       │   │   ├── createmigration.md
│   │   │   │   │       │   │   ├── delete.md
│   │   │   │   │       │   │   ├── end.md
│   │   │   │   │       │   │   ├── get.md
│   │   │   │   │       │   │   ├── getavailablemigrations.md
│   │   │   │   │       │   │   ├── getcurrentmigrationversion.md
│   │   │   │   │       │   │   ├── index.md
│   │   │   │   │       │   │   ├── mapper.md
│   │   │   │   │       │   │   ├── member.md
│   │   │   │   │       │   │   ├── migrateto.md
│   │   │   │   │       │   │   ├── migratetolatest.md
│   │   │   │   │       │   │   ├── namespace.md
│   │   │   │   │       │   │   ├── package.md
│   │   │   │   │       │   │   ├── patch.md
│   │   │   │   │       │   │   ├── post.md
│   │   │   │   │       │   │   ├── put.md
│   │   │   │   │       │   │   ├── redomigration.md
│   │   │   │   │       │   │   ├── resource.md
│   │   │   │   │       │   │   ├── resources.md
│   │   │   │   │       │   │   ├── root.md
│   │   │   │   │       │   │   ├── scope.md
│   │   │   │   │       │   │   ├── set.md
│   │   │   │   │       │   │   └── wildcard.md
│   │   │   │   │       │   ├── controller/
│   │   │   │   │       │   │   ├── caches.md
│   │   │   │   │       │   │   ├── filterchain.md
│   │   │   │   │       │   │   ├── filters.md
│   │   │   │   │       │   │   ├── flash.md
│   │   │   │   │       │   │   ├── flashclear.md
│   │   │   │   │       │   │   ├── flashcount.md
│   │   │   │   │       │   │   ├── flashdelete.md
│   │   │   │   │       │   │   ├── flashinsert.md
│   │   │   │   │       │   │   ├── flashisempty.md
│   │   │   │   │       │   │   ├── flashkeep.md
│   │   │   │   │       │   │   ├── flashkeyexists.md
│   │   │   │   │       │   │   ├── getemails.md
│   │   │   │   │       │   │   ├── getfiles.md
│   │   │   │   │       │   │   ├── getredirect.md
│   │   │   │   │       │   │   ├── index.md
│   │   │   │   │       │   │   ├── isajax.md
│   │   │   │   │       │   │   ├── isdelete.md
│   │   │   │   │       │   │   ├── isget.md
│   │   │   │   │       │   │   ├── ishead.md
│   │   │   │   │       │   │   ├── isoptions.md
│   │   │   │   │       │   │   ├── ispatch.md
│   │   │   │   │       │   │   ├── ispost.md
│   │   │   │   │       │   │   ├── isput.md
│   │   │   │   │       │   │   ├── issecure.md
│   │   │   │   │       │   │   ├── onlyprovides.md
│   │   │   │   │       │   │   ├── pagination.md
│   │   │   │   │       │   │   ├── processaction.md
│   │   │   │   │       │   │   ├── processrequest.md
│   │   │   │   │       │   │   ├── protectsfromforgery.md
│   │   │   │   │       │   │   ├── provides.md
│   │   │   │   │       │   │   ├── redirectto.md
│   │   │   │   │       │   │   ├── rendernothing.md
│   │   │   │   │       │   │   ├── renderpartial.md
│   │   │   │   │       │   │   ├── rendertext.md
│   │   │   │   │       │   │   ├── renderview.md
│   │   │   │   │       │   │   ├── renderwith.md
│   │   │   │   │       │   │   ├── response.md
│   │   │   │   │       │   │   ├── sendemail.md
│   │   │   │   │       │   │   ├── sendfile.md
│   │   │   │   │       │   │   ├── setfilterchain.md
│   │   │   │   │       │   │   ├── setpagination.md
│   │   │   │   │       │   │   ├── setresponse.md
│   │   │   │   │       │   │   ├── setverificationchain.md
│   │   │   │   │       │   │   ├── useslayout.md
│   │   │   │   │       │   │   ├── verificationchain.md
│   │   │   │   │       │   │   └── verifies.md
│   │   │   │   │       │   ├── global-helpers/
│   │   │   │   │       │   │   ├── capitalize.md
│   │   │   │   │       │   │   ├── controller.md
│   │   │   │   │       │   │   ├── deobfuscateparam.md
│   │   │   │   │       │   │   ├── distanceoftimeinwords.md
│   │   │   │   │       │   │   ├── excerpt.md
│   │   │   │   │       │   │   ├── humanize.md
│   │   │   │   │       │   │   ├── hyphenize.md
│   │   │   │   │       │   │   ├── index.md
│   │   │   │   │       │   │   ├── mimetypes.md
│   │   │   │   │       │   │   ├── model.md
│   │   │   │   │       │   │   ├── obfuscateparam.md
│   │   │   │   │       │   │   ├── pluginnames.md
│   │   │   │   │       │   │   ├── pluralize.md
│   │   │   │   │       │   │   ├── singularize.md
│   │   │   │   │       │   │   ├── timeagoinwords.md
│   │   │   │   │       │   │   ├── timeuntilinwords.md
│   │   │   │   │       │   │   ├── titleize.md
│   │   │   │   │       │   │   ├── truncate.md
│   │   │   │   │       │   │   ├── urlfor.md
│   │   │   │   │       │   │   └── wordtruncate.md
│   │   │   │   │       │   ├── index.md
│   │   │   │   │       │   ├── model-class/
│   │   │   │   │       │   │   ├── average.md
│   │   │   │   │       │   │   ├── columndataforproperty.md
│   │   │   │   │       │   │   ├── columnforproperty.md
│   │   │   │   │       │   │   ├── columnnames.md
│   │   │   │   │       │   │   ├── columns.md
│   │   │   │   │       │   │   ├── count.md
│   │   │   │   │       │   │   ├── create.md
│   │   │   │   │       │   │   ├── deleteall.md
│   │   │   │   │       │   │   ├── deletebykey.md
│   │   │   │   │       │   │   ├── deleteone.md
│   │   │   │   │       │   │   ├── exists.md
│   │   │   │   │       │   │   ├── findall.md
│   │   │   │   │       │   │   ├── findallkeys.md
│   │   │   │   │       │   │   ├── findbykey.md
│   │   │   │   │       │   │   ├── findfirst.md
│   │   │   │   │       │   │   ├── findlast.md
│   │   │   │   │       │   │   ├── findone.md
│   │   │   │   │       │   │   ├── gettablenameprefix.md
│   │   │   │   │       │   │   ├── index.md
│   │   │   │   │       │   │   ├── invokewithtransaction.md
│   │   │   │   │       │   │   ├── isclass.md
│   │   │   │   │       │   │   ├── isinstance.md
│   │   │   │   │       │   │   ├── maximum.md
│   │   │   │   │       │   │   ├── minimum.md
│   │   │   │   │       │   │   ├── new.md
│   │   │   │   │       │   │   ├── onmissingmethod.md
│   │   │   │   │       │   │   ├── primarykey.md
│   │   │   │   │       │   │   ├── primarykeys.md
│   │   │   │   │       │   │   ├── propertynames.md
│   │   │   │   │       │   │   ├── save.md
│   │   │   │   │       │   │   ├── sum.md
│   │   │   │   │       │   │   ├── tablename.md
│   │   │   │   │       │   │   ├── updateall.md
│   │   │   │   │       │   │   ├── updatebykey.md
│   │   │   │   │       │   │   ├── updateone.md
│   │   │   │   │       │   │   └── validationtypeforproperty.md
│   │   │   │   │       │   ├── model-configuration/
│   │   │   │   │       │   │   ├── accessibleproperties.md
│   │   │   │   │       │   │   ├── aftercreate.md
│   │   │   │   │       │   │   ├── afterdelete.md
│   │   │   │   │       │   │   ├── afterfind.md
│   │   │   │   │       │   │   ├── afterinitialization.md
│   │   │   │   │       │   │   ├── afternew.md
│   │   │   │   │       │   │   ├── aftersave.md
│   │   │   │   │       │   │   ├── afterupdate.md
│   │   │   │   │       │   │   ├── aftervalidation.md
│   │   │   │   │       │   │   ├── aftervalidationoncreate.md
│   │   │   │   │       │   │   ├── aftervalidationonupdate.md
│   │   │   │   │       │   │   ├── automaticvalidations.md
│   │   │   │   │       │   │   ├── beforecreate.md
│   │   │   │   │       │   │   ├── beforedelete.md
│   │   │   │   │       │   │   ├── beforesave.md
│   │   │   │   │       │   │   ├── beforeupdate.md
│   │   │   │   │       │   │   ├── beforevalidation.md
│   │   │   │   │       │   │   ├── beforevalidationoncreate.md
│   │   │   │   │       │   │   ├── beforevalidationonupdate.md
│   │   │   │   │       │   │   ├── belongsto.md
│   │   │   │   │       │   │   ├── datasource.md
│   │   │   │   │       │   │   ├── hasmany.md
│   │   │   │   │       │   │   ├── hasone.md
│   │   │   │   │       │   │   ├── index.md
│   │   │   │   │       │   │   ├── nestedproperties.md
│   │   │   │   │       │   │   ├── property.md
│   │   │   │   │       │   │   ├── protectedproperties.md
│   │   │   │   │       │   │   ├── setprimarykey.md
│   │   │   │   │       │   │   ├── setprimarykeys.md
│   │   │   │   │       │   │   ├── settablenameprefix.md
│   │   │   │   │       │   │   ├── table.md
│   │   │   │   │       │   │   ├── validate.md
│   │   │   │   │       │   │   ├── validateoncreate.md
│   │   │   │   │       │   │   ├── validateonupdate.md
│   │   │   │   │       │   │   ├── validatesconfirmationof.md
│   │   │   │   │       │   │   ├── validatesexclusionof.md
│   │   │   │   │       │   │   ├── validatesformatof.md
│   │   │   │   │       │   │   ├── validatesinclusionof.md
│   │   │   │   │       │   │   ├── validateslengthof.md
│   │   │   │   │       │   │   ├── validatesnumericalityof.md
│   │   │   │   │       │   │   ├── validatespresenceof.md
│   │   │   │   │       │   │   └── validatesuniquenessof.md
│   │   │   │   │       │   ├── model-object/
│   │   │   │   │       │   │   ├── adderror.md
│   │   │   │   │       │   │   ├── adderrortobase.md
│   │   │   │   │       │   │   ├── allchanges.md
│   │   │   │   │       │   │   ├── allerrors.md
│   │   │   │   │       │   │   ├── changedfrom.md
│   │   │   │   │       │   │   ├── changedproperties.md
│   │   │   │   │       │   │   ├── clearchangeinformation.md
│   │   │   │   │       │   │   ├── clearerrors.md
│   │   │   │   │       │   │   ├── compareto.md
│   │   │   │   │       │   │   ├── delete.md
│   │   │   │   │       │   │   ├── errorcount.md
│   │   │   │   │       │   │   ├── errorson.md
│   │   │   │   │       │   │   ├── errorsonbase.md
│   │   │   │   │       │   │   ├── haschanged.md
│   │   │   │   │       │   │   ├── haserrors.md
│   │   │   │   │       │   │   ├── hasproperty.md
│   │   │   │   │       │   │   ├── index.md
│   │   │   │   │       │   │   ├── isnew.md
│   │   │   │   │       │   │   ├── ispersisted.md
│   │   │   │   │       │   │   ├── key.md
│   │   │   │   │       │   │   ├── properties.md
│   │   │   │   │       │   │   ├── propertyisblank.md
│   │   │   │   │       │   │   ├── propertyispresent.md
│   │   │   │   │       │   │   ├── reload.md
│   │   │   │   │       │   │   ├── setproperties.md
│   │   │   │   │       │   │   ├── toggle.md
│   │   │   │   │       │   │   ├── update.md
│   │   │   │   │       │   │   ├── updateproperty.md
│   │   │   │   │       │   │   └── valid.md
│   │   │   │   │       │   └── view-helpers/
│   │   │   │   │       │       ├── authenticitytokenfield.md
│   │   │   │   │       │       ├── autolink.md
│   │   │   │   │       │       ├── buttontag.md
│   │   │   │   │       │       ├── buttonto.md
│   │   │   │   │       │       ├── checkbox.md
│   │   │   │   │       │       ├── checkboxtag.md
│   │   │   │   │       │       ├── contentfor.md
│   │   │   │   │       │       ├── contentforlayout.md
│   │   │   │   │       │       ├── csrfmetatags.md
│   │   │   │   │       │       ├── cycle.md
│   │   │   │   │       │       ├── dateselect.md
│   │   │   │   │       │       ├── dateselecttags.md
│   │   │   │   │       │       ├── datetimeselect.md
│   │   │   │   │       │       ├── datetimeselecttags.md
│   │   │   │   │       │       ├── dayselecttag.md
│   │   │   │   │       │       ├── endformtag.md
│   │   │   │   │       │       ├── errormessageon.md
│   │   │   │   │       │       ├── errormessagesfor.md
│   │   │   │   │       │       ├── filefield.md
│   │   │   │   │       │       ├── filefieldtag.md
│   │   │   │   │       │       ├── flashmessages.md
│   │   │   │   │       │       ├── hasmanycheckbox.md
│   │   │   │   │       │       ├── hasmanyradiobutton.md
│   │   │   │   │       │       ├── hiddenfield.md
│   │   │   │   │       │       ├── hiddenfieldtag.md
│   │   │   │   │       │       ├── highlight.md
│   │   │   │   │       │       ├── hourselecttag.md
│   │   │   │   │       │       ├── imagetag.md
│   │   │   │   │       │       ├── includecontent.md
│   │   │   │   │       │       ├── includedinobject.md
│   │   │   │   │       │       ├── includelayout.md
│   │   │   │   │       │       ├── includepartial.md
│   │   │   │   │       │       ├── index.md
│   │   │   │   │       │       ├── javascriptincludetag.md
│   │   │   │   │       │       ├── linkto.md
│   │   │   │   │       │       ├── mailto.md
│   │   │   │   │       │       ├── minuteselecttag.md
│   │   │   │   │       │       ├── monthselecttag.md
│   │   │   │   │       │       ├── paginationlinks.md
│   │   │   │   │       │       ├── passwordfield.md
│   │   │   │   │       │       ├── passwordfieldtag.md
│   │   │   │   │       │       ├── radiobutton.md
│   │   │   │   │       │       ├── radiobuttontag.md
│   │   │   │   │       │       ├── resetcycle.md
│   │   │   │   │       │       ├── secondselecttag.md
│   │   │   │   │       │       ├── select.md
│   │   │   │   │       │       ├── selecttag.md
│   │   │   │   │       │       ├── simpleformat.md
│   │   │   │   │       │       ├── startformtag.md
│   │   │   │   │       │       ├── striplinks.md
│   │   │   │   │       │       ├── striptags.md
│   │   │   │   │       │       ├── stylesheetlinktag.md
│   │   │   │   │       │       ├── submittag.md
│   │   │   │   │       │       ├── textarea.md
│   │   │   │   │       │       ├── textareatag.md
│   │   │   │   │       │       ├── textfield.md
│   │   │   │   │       │       ├── textfieldtag.md
│   │   │   │   │       │       ├── timeselect.md
│   │   │   │   │       │       ├── timeselecttags.md
│   │   │   │   │       │       └── yearselecttag.md
│   │   │   │   │       ├── v2-1-0/
│   │   │   │   │       │   ├── configuration/
│   │   │   │   │       │   │   ├── addformat.md
│   │   │   │   │       │   │   ├── collection.md
│   │   │   │   │       │   │   ├── constraints.md
│   │   │   │   │       │   │   ├── controller.md
│   │   │   │   │       │   │   ├── delete.md
│   │   │   │   │       │   │   ├── end.md
│   │   │   │   │       │   │   ├── get.md
│   │   │   │   │       │   │   ├── index.md
│   │   │   │   │       │   │   ├── mapper.md
│   │   │   │   │       │   │   ├── member.md
│   │   │   │   │       │   │   ├── namespace.md
│   │   │   │   │       │   │   ├── package.md
│   │   │   │   │       │   │   ├── patch.md
│   │   │   │   │       │   │   ├── post.md
│   │   │   │   │       │   │   ├── put.md
│   │   │   │   │       │   │   ├── resource.md
│   │   │   │   │       │   │   ├── resources.md
│   │   │   │   │       │   │   ├── root.md
│   │   │   │   │       │   │   ├── scope.md
│   │   │   │   │       │   │   ├── set.md
│   │   │   │   │       │   │   └── wildcard.md
│   │   │   │   │       │   ├── controller/
│   │   │   │   │       │   │   ├── authenticitytoken.md
│   │   │   │   │       │   │   ├── caches.md
│   │   │   │   │       │   │   ├── filterchain.md
│   │   │   │   │       │   │   ├── filters.md
│   │   │   │   │       │   │   ├── flash.md
│   │   │   │   │       │   │   ├── flashclear.md
│   │   │   │   │       │   │   ├── flashcount.md
│   │   │   │   │       │   │   ├── flashdelete.md
│   │   │   │   │       │   │   ├── flashinsert.md
│   │   │   │   │       │   │   ├── flashisempty.md
│   │   │   │   │       │   │   ├── flashkeep.md
│   │   │   │   │       │   │   ├── flashkeyexists.md
│   │   │   │   │       │   │   ├── getemails.md
│   │   │   │   │       │   │   ├── getfiles.md
│   │   │   │   │       │   │   ├── getredirect.md
│   │   │   │   │       │   │   ├── index.md
│   │   │   │   │       │   │   ├── isajax.md
│   │   │   │   │       │   │   ├── isdelete.md
│   │   │   │   │       │   │   ├── isget.md
│   │   │   │   │       │   │   ├── ishead.md
│   │   │   │   │       │   │   ├── isoptions.md
│   │   │   │   │       │   │   ├── ispatch.md
│   │   │   │   │       │   │   ├── ispost.md
│   │   │   │   │       │   │   ├── isput.md
│   │   │   │   │       │   │   ├── issecure.md
│   │   │   │   │       │   │   ├── onlyprovides.md
│   │   │   │   │       │   │   ├── pagination.md
│   │   │   │   │       │   │   ├── processaction.md
│   │   │   │   │       │   │   ├── processrequest.md
│   │   │   │   │       │   │   ├── protectsfromforgery.md
│   │   │   │   │       │   │   ├── provides.md
│   │   │   │   │       │   │   ├── redirectto.md
│   │   │   │   │       │   │   ├── rendernothing.md
│   │   │   │   │       │   │   ├── renderpartial.md
│   │   │   │   │       │   │   ├── rendertext.md
│   │   │   │   │       │   │   ├── renderview.md
│   │   │   │   │       │   │   ├── renderwith.md
│   │   │   │   │       │   │   ├── response.md
│   │   │   │   │       │   │   ├── sendemail.md
│   │   │   │   │       │   │   ├── sendfile.md
│   │   │   │   │       │   │   ├── setfilterchain.md
│   │   │   │   │       │   │   ├── setpagination.md
│   │   │   │   │       │   │   ├── setresponse.md
│   │   │   │   │       │   │   ├── setverificationchain.md
│   │   │   │   │       │   │   ├── useslayout.md
│   │   │   │   │       │   │   ├── verificationchain.md
│   │   │   │   │       │   │   └── verifies.md
│   │   │   │   │       │   ├── global-helpers/
│   │   │   │   │       │   │   ├── capitalize.md
│   │   │   │   │       │   │   ├── controller.md
│   │   │   │   │       │   │   ├── deobfuscateparam.md
│   │   │   │   │       │   │   ├── distanceoftimeinwords.md
│   │   │   │   │       │   │   ├── excerpt.md
│   │   │   │   │       │   │   ├── humanize.md
│   │   │   │   │       │   │   ├── hyphenize.md
│   │   │   │   │       │   │   ├── index.md
│   │   │   │   │       │   │   ├── mimetypes.md
│   │   │   │   │       │   │   ├── model.md
│   │   │   │   │       │   │   ├── obfuscateparam.md
│   │   │   │   │       │   │   ├── pluginnames.md
│   │   │   │   │       │   │   ├── pluralize.md
│   │   │   │   │       │   │   ├── singularize.md
│   │   │   │   │       │   │   ├── timeagoinwords.md
│   │   │   │   │       │   │   ├── timeuntilinwords.md
│   │   │   │   │       │   │   ├── titleize.md
│   │   │   │   │       │   │   ├── truncate.md
│   │   │   │   │       │   │   ├── urlfor.md
│   │   │   │   │       │   │   └── wordtruncate.md
│   │   │   │   │       │   ├── index.md
│   │   │   │   │       │   ├── migrator/
│   │   │   │   │       │   │   ├── addcolumn.md
│   │   │   │   │       │   │   ├── addforeignkey.md
│   │   │   │   │       │   │   ├── addindex.md
│   │   │   │   │       │   │   ├── addrecord.md
│   │   │   │   │       │   │   ├── addreference.md
│   │   │   │   │       │   │   ├── biginteger.md
│   │   │   │   │       │   │   ├── binary.md
│   │   │   │   │       │   │   ├── boolean.md
│   │   │   │   │       │   │   ├── change.md
│   │   │   │   │       │   │   ├── changecolumn.md
│   │   │   │   │       │   │   ├── changetable.md
│   │   │   │   │       │   │   ├── char.md
│   │   │   │   │       │   │   ├── column.md
│   │   │   │   │       │   │   ├── create.md
│   │   │   │   │       │   │   ├── createmigration.md
│   │   │   │   │       │   │   ├── createtable.md
│   │   │   │   │       │   │   ├── createview.md
│   │   │   │   │       │   │   ├── date.md
│   │   │   │   │       │   │   ├── datetime.md
│   │   │   │   │       │   │   ├── decimal.md
│   │   │   │   │       │   │   ├── down.md
│   │   │   │   │       │   │   ├── dropforeignkey.md
│   │   │   │   │       │   │   ├── dropreference.md
│   │   │   │   │       │   │   ├── droptable.md
│   │   │   │   │       │   │   ├── dropview.md
│   │   │   │   │       │   │   ├── execute.md
│   │   │   │   │       │   │   ├── float.md
│   │   │   │   │       │   │   ├── getavailablemigrations.md
│   │   │   │   │       │   │   ├── getcurrentmigrationversion.md
│   │   │   │   │       │   │   ├── index.md
│   │   │   │   │       │   │   ├── integer.md
│   │   │   │   │       │   │   ├── migrateto.md
│   │   │   │   │       │   │   ├── migratetolatest.md
│   │   │   │   │       │   │   ├── primarykey.md
│   │   │   │   │       │   │   ├── redomigration.md
│   │   │   │   │       │   │   ├── references.md
│   │   │   │   │       │   │   ├── removecolumn.md
│   │   │   │   │       │   │   ├── removeindex.md
│   │   │   │   │       │   │   ├── removerecord.md
│   │   │   │   │       │   │   ├── renamecolumn.md
│   │   │   │   │       │   │   ├── renametable.md
│   │   │   │   │       │   │   ├── string.md
│   │   │   │   │       │   │   ├── text.md
│   │   │   │   │       │   │   ├── time.md
│   │   │   │   │       │   │   ├── timestamp.md
│   │   │   │   │       │   │   ├── timestamps.md
│   │   │   │   │       │   │   ├── uniqueidentifier.md
│   │   │   │   │       │   │   ├── up.md
│   │   │   │   │       │   │   └── updaterecord.md
│   │   │   │   │       │   ├── miscellaneous/
│   │   │   │   │       │   │   ├── announce.md
│   │   │   │   │       │   │   └── index.md
│   │   │   │   │       │   ├── model-class/
│   │   │   │   │       │   │   ├── average.md
│   │   │   │   │       │   │   ├── columndataforproperty.md
│   │   │   │   │       │   │   ├── columnforproperty.md
│   │   │   │   │       │   │   ├── columnnames.md
│   │   │   │   │       │   │   ├── columns.md
│   │   │   │   │       │   │   ├── count.md
│   │   │   │   │       │   │   ├── create.md
│   │   │   │   │       │   │   ├── deleteall.md
│   │   │   │   │       │   │   ├── deletebykey.md
│   │   │   │   │       │   │   ├── deleteone.md
│   │   │   │   │       │   │   ├── exists.md
│   │   │   │   │       │   │   ├── findall.md
│   │   │   │   │       │   │   ├── findallkeys.md
│   │   │   │   │       │   │   ├── findbykey.md
│   │   │   │   │       │   │   ├── findfirst.md
│   │   │   │   │       │   │   ├── findlast.md
│   │   │   │   │       │   │   ├── findone.md
│   │   │   │   │       │   │   ├── gettablenameprefix.md
│   │   │   │   │       │   │   ├── index.md
│   │   │   │   │       │   │   ├── invokewithtransaction.md
│   │   │   │   │       │   │   ├── isclass.md
│   │   │   │   │       │   │   ├── isinstance.md
│   │   │   │   │       │   │   ├── maximum.md
│   │   │   │   │       │   │   ├── minimum.md
│   │   │   │   │       │   │   ├── new.md
│   │   │   │   │       │   │   ├── onmissingmethod.md
│   │   │   │   │       │   │   ├── primarykey.md
│   │   │   │   │       │   │   ├── primarykeys.md
│   │   │   │   │       │   │   ├── propertynames.md
│   │   │   │   │       │   │   ├── save.md
│   │   │   │   │       │   │   ├── sum.md
│   │   │   │   │       │   │   ├── tablename.md
│   │   │   │   │       │   │   ├── updateall.md
│   │   │   │   │       │   │   ├── updatebykey.md
│   │   │   │   │       │   │   ├── updateone.md
│   │   │   │   │       │   │   └── validationtypeforproperty.md
│   │   │   │   │       │   ├── model-configuration/
│   │   │   │   │       │   │   ├── accessibleproperties.md
│   │   │   │   │       │   │   ├── aftercreate.md
│   │   │   │   │       │   │   ├── afterdelete.md
│   │   │   │   │       │   │   ├── afterfind.md
│   │   │   │   │       │   │   ├── afterinitialization.md
│   │   │   │   │       │   │   ├── afternew.md
│   │   │   │   │       │   │   ├── aftersave.md
│   │   │   │   │       │   │   ├── afterupdate.md
│   │   │   │   │       │   │   ├── aftervalidation.md
│   │   │   │   │       │   │   ├── aftervalidationoncreate.md
│   │   │   │   │       │   │   ├── aftervalidationonupdate.md
│   │   │   │   │       │   │   ├── automaticvalidations.md
│   │   │   │   │       │   │   ├── beforecreate.md
│   │   │   │   │       │   │   ├── beforedelete.md
│   │   │   │   │       │   │   ├── beforesave.md
│   │   │   │   │       │   │   ├── beforeupdate.md
│   │   │   │   │       │   │   ├── beforevalidation.md
│   │   │   │   │       │   │   ├── beforevalidationoncreate.md
│   │   │   │   │       │   │   ├── beforevalidationonupdate.md
│   │   │   │   │       │   │   ├── belongsto.md
│   │   │   │   │       │   │   ├── datasource.md
│   │   │   │   │       │   │   ├── hasmany.md
│   │   │   │   │       │   │   ├── hasone.md
│   │   │   │   │       │   │   ├── index.md
│   │   │   │   │       │   │   ├── nestedproperties.md
│   │   │   │   │       │   │   ├── property.md
│   │   │   │   │       │   │   ├── protectedproperties.md
│   │   │   │   │       │   │   ├── setprimarykey.md
│   │   │   │   │       │   │   ├── setprimarykeys.md
│   │   │   │   │       │   │   ├── settablenameprefix.md
│   │   │   │   │       │   │   ├── table.md
│   │   │   │   │       │   │   ├── validate.md
│   │   │   │   │       │   │   ├── validateoncreate.md
│   │   │   │   │       │   │   ├── validateonupdate.md
│   │   │   │   │       │   │   ├── validatesconfirmationof.md
│   │   │   │   │       │   │   ├── validatesexclusionof.md
│   │   │   │   │       │   │   ├── validatesformatof.md
│   │   │   │   │       │   │   ├── validatesinclusionof.md
│   │   │   │   │       │   │   ├── validateslengthof.md
│   │   │   │   │       │   │   ├── validatesnumericalityof.md
│   │   │   │   │       │   │   ├── validatespresenceof.md
│   │   │   │   │       │   │   └── validatesuniquenessof.md
│   │   │   │   │       │   ├── model-object/
│   │   │   │   │       │   │   ├── adderror.md
│   │   │   │   │       │   │   ├── adderrortobase.md
│   │   │   │   │       │   │   ├── allchanges.md
│   │   │   │   │       │   │   ├── allerrors.md
│   │   │   │   │       │   │   ├── changedfrom.md
│   │   │   │   │       │   │   ├── changedproperties.md
│   │   │   │   │       │   │   ├── clearchangeinformation.md
│   │   │   │   │       │   │   ├── clearerrors.md
│   │   │   │   │       │   │   ├── compareto.md
│   │   │   │   │       │   │   ├── delete.md
│   │   │   │   │       │   │   ├── errorcount.md
│   │   │   │   │       │   │   ├── errorson.md
│   │   │   │   │       │   │   ├── errorsonbase.md
│   │   │   │   │       │   │   ├── haschanged.md
│   │   │   │   │       │   │   ├── haserrors.md
│   │   │   │   │       │   │   ├── hasproperty.md
│   │   │   │   │       │   │   ├── index.md
│   │   │   │   │       │   │   ├── isnew.md
│   │   │   │   │       │   │   ├── ispersisted.md
│   │   │   │   │       │   │   ├── key.md
│   │   │   │   │       │   │   ├── properties.md
│   │   │   │   │       │   │   ├── propertyisblank.md
│   │   │   │   │       │   │   ├── propertyispresent.md
│   │   │   │   │       │   │   ├── reload.md
│   │   │   │   │       │   │   ├── setproperties.md
│   │   │   │   │       │   │   ├── toggle.md
│   │   │   │   │       │   │   ├── update.md
│   │   │   │   │       │   │   ├── updateproperty.md
│   │   │   │   │       │   │   └── valid.md
│   │   │   │   │       │   └── view-helpers/
│   │   │   │   │       │       ├── authenticitytokenfield.md
│   │   │   │   │       │       ├── autolink.md
│   │   │   │   │       │       ├── buttontag.md
│   │   │   │   │       │       ├── buttonto.md
│   │   │   │   │       │       ├── checkbox.md
│   │   │   │   │       │       ├── checkboxtag.md
│   │   │   │   │       │       ├── contentfor.md
│   │   │   │   │       │       ├── contentforlayout.md
│   │   │   │   │       │       ├── csrfmetatags.md
│   │   │   │   │       │       ├── cycle.md
│   │   │   │   │       │       ├── dateselect.md
│   │   │   │   │       │       ├── dateselecttags.md
│   │   │   │   │       │       ├── datetimeselect.md
│   │   │   │   │       │       ├── datetimeselecttags.md
│   │   │   │   │       │       ├── dayselecttag.md
│   │   │   │   │       │       ├── endformtag.md
│   │   │   │   │       │       ├── errormessageon.md
│   │   │   │   │       │       ├── errormessagesfor.md
│   │   │   │   │       │       ├── filefield.md
│   │   │   │   │       │       ├── filefieldtag.md
│   │   │   │   │       │       ├── flashmessages.md
│   │   │   │   │       │       ├── hasmanycheckbox.md
│   │   │   │   │       │       ├── hasmanyradiobutton.md
│   │   │   │   │       │       ├── hiddenfield.md
│   │   │   │   │       │       ├── hiddenfieldtag.md
│   │   │   │   │       │       ├── highlight.md
│   │   │   │   │       │       ├── hourselecttag.md
│   │   │   │   │       │       ├── imagetag.md
│   │   │   │   │       │       ├── includecontent.md
│   │   │   │   │       │       ├── includedinobject.md
│   │   │   │   │       │       ├── includelayout.md
│   │   │   │   │       │       ├── includepartial.md
│   │   │   │   │       │       ├── index.md
│   │   │   │   │       │       ├── javascriptincludetag.md
│   │   │   │   │       │       ├── linkto.md
│   │   │   │   │       │       ├── mailto.md
│   │   │   │   │       │       ├── minuteselecttag.md
│   │   │   │   │       │       ├── monthselecttag.md
│   │   │   │   │       │       ├── paginationlinks.md
│   │   │   │   │       │       ├── passwordfield.md
│   │   │   │   │       │       ├── passwordfieldtag.md
│   │   │   │   │       │       ├── radiobutton.md
│   │   │   │   │       │       ├── radiobuttontag.md
│   │   │   │   │       │       ├── resetcycle.md
│   │   │   │   │       │       ├── secondselecttag.md
│   │   │   │   │       │       ├── select.md
│   │   │   │   │       │       ├── selecttag.md
│   │   │   │   │       │       ├── simpleformat.md
│   │   │   │   │       │       ├── startformtag.md
│   │   │   │   │       │       ├── striplinks.md
│   │   │   │   │       │       ├── striptags.md
│   │   │   │   │       │       ├── stylesheetlinktag.md
│   │   │   │   │       │       ├── submittag.md
│   │   │   │   │       │       ├── textarea.md
│   │   │   │   │       │       ├── textareatag.md
│   │   │   │   │       │       ├── textfield.md
│   │   │   │   │       │       ├── textfieldtag.md
│   │   │   │   │       │       ├── timeselect.md
│   │   │   │   │       │       ├── timeselecttags.md
│   │   │   │   │       │       └── yearselecttag.md
│   │   │   │   │       ├── v2-2-0/
│   │   │   │   │       │   ├── configuration/
│   │   │   │   │       │   │   ├── addformat.md
│   │   │   │   │       │   │   ├── collection.md
│   │   │   │   │       │   │   ├── constraints.md
│   │   │   │   │       │   │   ├── controller.md
│   │   │   │   │       │   │   ├── delete.md
│   │   │   │   │       │   │   ├── end.md
│   │   │   │   │       │   │   ├── get.md
│   │   │   │   │       │   │   ├── index.md
│   │   │   │   │       │   │   ├── mapper.md
│   │   │   │   │       │   │   ├── member.md
│   │   │   │   │       │   │   ├── namespace.md
│   │   │   │   │       │   │   ├── package.md
│   │   │   │   │       │   │   ├── patch.md
│   │   │   │   │       │   │   ├── post.md
│   │   │   │   │       │   │   ├── put.md
│   │   │   │   │       │   │   ├── resource.md
│   │   │   │   │       │   │   ├── resources.md
│   │   │   │   │       │   │   ├── root.md
│   │   │   │   │       │   │   ├── scope.md
│   │   │   │   │       │   │   ├── set.md
│   │   │   │   │       │   │   └── wildcard.md
│   │   │   │   │       │   ├── controller/
│   │   │   │   │       │   │   ├── authenticitytoken.md
│   │   │   │   │       │   │   ├── caches.md
│   │   │   │   │       │   │   ├── filterchain.md
│   │   │   │   │       │   │   ├── filters.md
│   │   │   │   │       │   │   ├── flash.md
│   │   │   │   │       │   │   ├── flashclear.md
│   │   │   │   │       │   │   ├── flashcount.md
│   │   │   │   │       │   │   ├── flashdelete.md
│   │   │   │   │       │   │   ├── flashinsert.md
│   │   │   │   │       │   │   ├── flashisempty.md
│   │   │   │   │       │   │   ├── flashkeep.md
│   │   │   │   │       │   │   ├── flashkeyexists.md
│   │   │   │   │       │   │   ├── getemails.md
│   │   │   │   │       │   │   ├── getfiles.md
│   │   │   │   │       │   │   ├── getredirect.md
│   │   │   │   │       │   │   ├── index.md
│   │   │   │   │       │   │   ├── isajax.md
│   │   │   │   │       │   │   ├── isdelete.md
│   │   │   │   │       │   │   ├── isget.md
│   │   │   │   │       │   │   ├── ishead.md
│   │   │   │   │       │   │   ├── isoptions.md
│   │   │   │   │       │   │   ├── ispatch.md
│   │   │   │   │       │   │   ├── ispost.md
│   │   │   │   │       │   │   ├── isput.md
│   │   │   │   │       │   │   ├── issecure.md
│   │   │   │   │       │   │   ├── onlyprovides.md
│   │   │   │   │       │   │   ├── pagination.md
│   │   │   │   │       │   │   ├── processaction.md
│   │   │   │   │       │   │   ├── processrequest.md
│   │   │   │   │       │   │   ├── protectsfromforgery.md
│   │   │   │   │       │   │   ├── provides.md
│   │   │   │   │       │   │   ├── redirectto.md
│   │   │   │   │       │   │   ├── rendernothing.md
│   │   │   │   │       │   │   ├── renderpartial.md
│   │   │   │   │       │   │   ├── rendertext.md
│   │   │   │   │       │   │   ├── renderview.md
│   │   │   │   │       │   │   ├── renderwith.md
│   │   │   │   │       │   │   ├── response.md
│   │   │   │   │       │   │   ├── sendemail.md
│   │   │   │   │       │   │   ├── sendfile.md
│   │   │   │   │       │   │   ├── setfilterchain.md
│   │   │   │   │       │   │   ├── setpagination.md
│   │   │   │   │       │   │   ├── setresponse.md
│   │   │   │   │       │   │   ├── setverificationchain.md
│   │   │   │   │       │   │   ├── useslayout.md
│   │   │   │   │       │   │   ├── verificationchain.md
│   │   │   │   │       │   │   └── verifies.md
│   │   │   │   │       │   ├── global-helpers/
│   │   │   │   │       │   │   ├── capitalize.md
│   │   │   │   │       │   │   ├── controller.md
│   │   │   │   │       │   │   ├── deobfuscateparam.md
│   │   │   │   │       │   │   ├── distanceoftimeinwords.md
│   │   │   │   │       │   │   ├── excerpt.md
│   │   │   │   │       │   │   ├── humanize.md
│   │   │   │   │       │   │   ├── hyphenize.md
│   │   │   │   │       │   │   ├── index.md
│   │   │   │   │       │   │   ├── mimetypes.md
│   │   │   │   │       │   │   ├── model.md
│   │   │   │   │       │   │   ├── obfuscateparam.md
│   │   │   │   │       │   │   ├── pluginnames.md
│   │   │   │   │       │   │   ├── pluralize.md
│   │   │   │   │       │   │   ├── singularize.md
│   │   │   │   │       │   │   ├── timeagoinwords.md
│   │   │   │   │       │   │   ├── timeuntilinwords.md
│   │   │   │   │       │   │   ├── titleize.md
│   │   │   │   │       │   │   ├── truncate.md
│   │   │   │   │       │   │   ├── urlfor.md
│   │   │   │   │       │   │   └── wordtruncate.md
│   │   │   │   │       │   ├── index.md
│   │   │   │   │       │   ├── migrator/
│   │   │   │   │       │   │   ├── addcolumn.md
│   │   │   │   │       │   │   ├── addforeignkey.md
│   │   │   │   │       │   │   ├── addindex.md
│   │   │   │   │       │   │   ├── addrecord.md
│   │   │   │   │       │   │   ├── addreference.md
│   │   │   │   │       │   │   ├── biginteger.md
│   │   │   │   │       │   │   ├── binary.md
│   │   │   │   │       │   │   ├── boolean.md
│   │   │   │   │       │   │   ├── change.md
│   │   │   │   │       │   │   ├── changecolumn.md
│   │   │   │   │       │   │   ├── changetable.md
│   │   │   │   │       │   │   ├── char.md
│   │   │   │   │       │   │   ├── column.md
│   │   │   │   │       │   │   ├── create.md
│   │   │   │   │       │   │   ├── createmigration.md
│   │   │   │   │       │   │   ├── createtable.md
│   │   │   │   │       │   │   ├── createview.md
│   │   │   │   │       │   │   ├── date.md
│   │   │   │   │       │   │   ├── datetime.md
│   │   │   │   │       │   │   ├── decimal.md
│   │   │   │   │       │   │   ├── down.md
│   │   │   │   │       │   │   ├── dropforeignkey.md
│   │   │   │   │       │   │   ├── dropreference.md
│   │   │   │   │       │   │   ├── droptable.md
│   │   │   │   │       │   │   ├── dropview.md
│   │   │   │   │       │   │   ├── execute.md
│   │   │   │   │       │   │   ├── float.md
│   │   │   │   │       │   │   ├── getavailablemigrations.md
│   │   │   │   │       │   │   ├── getcurrentmigrationversion.md
│   │   │   │   │       │   │   ├── index.md
│   │   │   │   │       │   │   ├── integer.md
│   │   │   │   │       │   │   ├── migrateto.md
│   │   │   │   │       │   │   ├── migratetolatest.md
│   │   │   │   │       │   │   ├── primarykey.md
│   │   │   │   │       │   │   ├── redomigration.md
│   │   │   │   │       │   │   ├── references.md
│   │   │   │   │       │   │   ├── removecolumn.md
│   │   │   │   │       │   │   ├── removeindex.md
│   │   │   │   │       │   │   ├── removerecord.md
│   │   │   │   │       │   │   ├── renamecolumn.md
│   │   │   │   │       │   │   ├── renametable.md
│   │   │   │   │       │   │   ├── string.md
│   │   │   │   │       │   │   ├── text.md
│   │   │   │   │       │   │   ├── time.md
│   │   │   │   │       │   │   ├── timestamp.md
│   │   │   │   │       │   │   ├── timestamps.md
│   │   │   │   │       │   │   ├── uniqueidentifier.md
│   │   │   │   │       │   │   ├── up.md
│   │   │   │   │       │   │   └── updaterecord.md
│   │   │   │   │       │   ├── miscellaneous/
│   │   │   │   │       │   │   ├── announce.md
│   │   │   │   │       │   │   └── index.md
│   │   │   │   │       │   ├── model-class/
│   │   │   │   │       │   │   ├── average.md
│   │   │   │   │       │   │   ├── columndataforproperty.md
│   │   │   │   │       │   │   ├── columnforproperty.md
│   │   │   │   │       │   │   ├── columnnames.md
│   │   │   │   │       │   │   ├── columns.md
│   │   │   │   │       │   │   ├── count.md
│   │   │   │   │       │   │   ├── create.md
│   │   │   │   │       │   │   ├── deleteall.md
│   │   │   │   │       │   │   ├── deletebykey.md
│   │   │   │   │       │   │   ├── deleteone.md
│   │   │   │   │       │   │   ├── exists.md
│   │   │   │   │       │   │   ├── findall.md
│   │   │   │   │       │   │   ├── findallkeys.md
│   │   │   │   │       │   │   ├── findbykey.md
│   │   │   │   │       │   │   ├── findfirst.md
│   │   │   │   │       │   │   ├── findlastone.md
│   │   │   │   │       │   │   ├── findone.md
│   │   │   │   │       │   │   ├── gettablenameprefix.md
│   │   │   │   │       │   │   ├── index.md
│   │   │   │   │       │   │   ├── invokewithtransaction.md
│   │   │   │   │       │   │   ├── isclass.md
│   │   │   │   │       │   │   ├── isinstance.md
│   │   │   │   │       │   │   ├── maximum.md
│   │   │   │   │       │   │   ├── minimum.md
│   │   │   │   │       │   │   ├── new.md
│   │   │   │   │       │   │   ├── onmissingmethod.md
│   │   │   │   │       │   │   ├── primarykey.md
│   │   │   │   │       │   │   ├── primarykeys.md
│   │   │   │   │       │   │   ├── propertynames.md
│   │   │   │   │       │   │   ├── save.md
│   │   │   │   │       │   │   ├── sum.md
│   │   │   │   │       │   │   ├── tablename.md
│   │   │   │   │       │   │   ├── updateall.md
│   │   │   │   │       │   │   ├── updatebykey.md
│   │   │   │   │       │   │   ├── updateone.md
│   │   │   │   │       │   │   └── validationtypeforproperty.md
│   │   │   │   │       │   ├── model-configuration/
│   │   │   │   │       │   │   ├── accessibleproperties.md
│   │   │   │   │       │   │   ├── aftercreate.md
│   │   │   │   │       │   │   ├── afterdelete.md
│   │   │   │   │       │   │   ├── afterfind.md
│   │   │   │   │       │   │   ├── afterinitialization.md
│   │   │   │   │       │   │   ├── afternew.md
│   │   │   │   │       │   │   ├── aftersave.md
│   │   │   │   │       │   │   ├── afterupdate.md
│   │   │   │   │       │   │   ├── aftervalidation.md
│   │   │   │   │       │   │   ├── aftervalidationoncreate.md
│   │   │   │   │       │   │   ├── aftervalidationonupdate.md
│   │   │   │   │       │   │   ├── automaticvalidations.md
│   │   │   │   │       │   │   ├── beforecreate.md
│   │   │   │   │       │   │   ├── beforedelete.md
│   │   │   │   │       │   │   ├── beforesave.md
│   │   │   │   │       │   │   ├── beforeupdate.md
│   │   │   │   │       │   │   ├── beforevalidation.md
│   │   │   │   │       │   │   ├── beforevalidationoncreate.md
│   │   │   │   │       │   │   ├── beforevalidationonupdate.md
│   │   │   │   │       │   │   ├── belongsto.md
│   │   │   │   │       │   │   ├── datasource.md
│   │   │   │   │       │   │   ├── hasmany.md
│   │   │   │   │       │   │   ├── hasone.md
│   │   │   │   │       │   │   ├── index.md
│   │   │   │   │       │   │   ├── nestedproperties.md
│   │   │   │   │       │   │   ├── property.md
│   │   │   │   │       │   │   ├── protectedproperties.md
│   │   │   │   │       │   │   ├── setprimarykey.md
│   │   │   │   │       │   │   ├── setprimarykeys.md
│   │   │   │   │       │   │   ├── settablenameprefix.md
│   │   │   │   │       │   │   ├── table.md
│   │   │   │   │       │   │   ├── validate.md
│   │   │   │   │       │   │   ├── validateoncreate.md
│   │   │   │   │       │   │   ├── validateonupdate.md
│   │   │   │   │       │   │   ├── validatesconfirmationof.md
│   │   │   │   │       │   │   ├── validatesexclusionof.md
│   │   │   │   │       │   │   ├── validatesformatof.md
│   │   │   │   │       │   │   ├── validatesinclusionof.md
│   │   │   │   │       │   │   ├── validateslengthof.md
│   │   │   │   │       │   │   ├── validatesnumericalityof.md
│   │   │   │   │       │   │   ├── validatespresenceof.md
│   │   │   │   │       │   │   └── validatesuniquenessof.md
│   │   │   │   │       │   ├── model-object/
│   │   │   │   │       │   │   ├── adderror.md
│   │   │   │   │       │   │   ├── adderrortobase.md
│   │   │   │   │       │   │   ├── allchanges.md
│   │   │   │   │       │   │   ├── allerrors.md
│   │   │   │   │       │   │   ├── changedfrom.md
│   │   │   │   │       │   │   ├── changedproperties.md
│   │   │   │   │       │   │   ├── clearchangeinformation.md
│   │   │   │   │       │   │   ├── clearerrors.md
│   │   │   │   │       │   │   ├── compareto.md
│   │   │   │   │       │   │   ├── delete.md
│   │   │   │   │       │   │   ├── errorcount.md
│   │   │   │   │       │   │   ├── errorson.md
│   │   │   │   │       │   │   ├── errorsonbase.md
│   │   │   │   │       │   │   ├── haschanged.md
│   │   │   │   │       │   │   ├── haserrors.md
│   │   │   │   │       │   │   ├── hasproperty.md
│   │   │   │   │       │   │   ├── index.md
│   │   │   │   │       │   │   ├── isnew.md
│   │   │   │   │       │   │   ├── ispersisted.md
│   │   │   │   │       │   │   ├── key.md
│   │   │   │   │       │   │   ├── properties.md
│   │   │   │   │       │   │   ├── propertyisblank.md
│   │   │   │   │       │   │   ├── propertyispresent.md
│   │   │   │   │       │   │   ├── reload.md
│   │   │   │   │       │   │   ├── setproperties.md
│   │   │   │   │       │   │   ├── toggle.md
│   │   │   │   │       │   │   ├── update.md
│   │   │   │   │       │   │   ├── updateproperty.md
│   │   │   │   │       │   │   └── valid.md
│   │   │   │   │       │   └── view-helpers/
│   │   │   │   │       │       ├── authenticitytokenfield.md
│   │   │   │   │       │       ├── autolink.md
│   │   │   │   │       │       ├── buttontag.md
│   │   │   │   │       │       ├── buttonto.md
│   │   │   │   │       │       ├── checkbox.md
│   │   │   │   │       │       ├── checkboxtag.md
│   │   │   │   │       │       ├── contentfor.md
│   │   │   │   │       │       ├── contentforlayout.md
│   │   │   │   │       │       ├── csrfmetatags.md
│   │   │   │   │       │       ├── cycle.md
│   │   │   │   │       │       ├── dateselect.md
│   │   │   │   │       │       ├── dateselecttags.md
│   │   │   │   │       │       ├── datetimeselect.md
│   │   │   │   │       │       ├── datetimeselecttags.md
│   │   │   │   │       │       ├── dayselecttag.md
│   │   │   │   │       │       ├── endformtag.md
│   │   │   │   │       │       ├── errormessageon.md
│   │   │   │   │       │       ├── errormessagesfor.md
│   │   │   │   │       │       ├── filefield.md
│   │   │   │   │       │       ├── filefieldtag.md
│   │   │   │   │       │       ├── flashmessages.md
│   │   │   │   │       │       ├── hasmanycheckbox.md
│   │   │   │   │       │       ├── hasmanyradiobutton.md
│   │   │   │   │       │       ├── hiddenfield.md
│   │   │   │   │       │       ├── hiddenfieldtag.md
│   │   │   │   │       │       ├── highlight.md
│   │   │   │   │       │       ├── hourselecttag.md
│   │   │   │   │       │       ├── imagetag.md
│   │   │   │   │       │       ├── includecontent.md
│   │   │   │   │       │       ├── includedinobject.md
│   │   │   │   │       │       ├── includelayout.md
│   │   │   │   │       │       ├── includepartial.md
│   │   │   │   │       │       ├── index.md
│   │   │   │   │       │       ├── javascriptincludetag.md
│   │   │   │   │       │       ├── linkto.md
│   │   │   │   │       │       ├── mailto.md
│   │   │   │   │       │       ├── minuteselecttag.md
│   │   │   │   │       │       ├── monthselecttag.md
│   │   │   │   │       │       ├── paginationlinks.md
│   │   │   │   │       │       ├── passwordfield.md
│   │   │   │   │       │       ├── passwordfieldtag.md
│   │   │   │   │       │       ├── radiobutton.md
│   │   │   │   │       │       ├── radiobuttontag.md
│   │   │   │   │       │       ├── resetcycle.md
│   │   │   │   │       │       ├── secondselecttag.md
│   │   │   │   │       │       ├── select.md
│   │   │   │   │       │       ├── selecttag.md
│   │   │   │   │       │       ├── simpleformat.md
│   │   │   │   │       │       ├── startformtag.md
│   │   │   │   │       │       ├── striplinks.md
│   │   │   │   │       │       ├── striptags.md
│   │   │   │   │       │       ├── stylesheetlinktag.md
│   │   │   │   │       │       ├── submittag.md
│   │   │   │   │       │       ├── textarea.md
│   │   │   │   │       │       ├── textareatag.md
│   │   │   │   │       │       ├── textfield.md
│   │   │   │   │       │       ├── textfieldtag.md
│   │   │   │   │       │       ├── timeselect.md
│   │   │   │   │       │       ├── timeselecttags.md
│   │   │   │   │       │       └── yearselecttag.md
│   │   │   │   │       ├── v2-3-0/
│   │   │   │   │       │   ├── configuration/
│   │   │   │   │       │   │   ├── addformat.md
│   │   │   │   │       │   │   ├── collection.md
│   │   │   │   │       │   │   ├── constraints.md
│   │   │   │   │       │   │   ├── controller.md
│   │   │   │   │       │   │   ├── delete.md
│   │   │   │   │       │   │   ├── end.md
│   │   │   │   │       │   │   ├── get.md
│   │   │   │   │       │   │   ├── index.md
│   │   │   │   │       │   │   ├── mapper.md
│   │   │   │   │       │   │   ├── member.md
│   │   │   │   │       │   │   ├── namespace.md
│   │   │   │   │       │   │   ├── package.md
│   │   │   │   │       │   │   ├── patch.md
│   │   │   │   │       │   │   ├── post.md
│   │   │   │   │       │   │   ├── put.md
│   │   │   │   │       │   │   ├── resource.md
│   │   │   │   │       │   │   ├── resources.md
│   │   │   │   │       │   │   ├── root.md
│   │   │   │   │       │   │   ├── scope.md
│   │   │   │   │       │   │   ├── set.md
│   │   │   │   │       │   │   └── wildcard.md
│   │   │   │   │       │   ├── controller/
│   │   │   │   │       │   │   ├── authenticitytoken.md
│   │   │   │   │       │   │   ├── caches.md
│   │   │   │   │       │   │   ├── filterchain.md
│   │   │   │   │       │   │   ├── filters.md
│   │   │   │   │       │   │   ├── flash.md
│   │   │   │   │       │   │   ├── flashclear.md
│   │   │   │   │       │   │   ├── flashcount.md
│   │   │   │   │       │   │   ├── flashdelete.md
│   │   │   │   │       │   │   ├── flashinsert.md
│   │   │   │   │       │   │   ├── flashisempty.md
│   │   │   │   │       │   │   ├── flashkeep.md
│   │   │   │   │       │   │   ├── flashkeyexists.md
│   │   │   │   │       │   │   ├── getemails.md
│   │   │   │   │       │   │   ├── getfiles.md
│   │   │   │   │       │   │   ├── getredirect.md
│   │   │   │   │       │   │   ├── index.md
│   │   │   │   │       │   │   ├── isajax.md
│   │   │   │   │       │   │   ├── isdelete.md
│   │   │   │   │       │   │   ├── isget.md
│   │   │   │   │       │   │   ├── ishead.md
│   │   │   │   │       │   │   ├── isoptions.md
│   │   │   │   │       │   │   ├── ispatch.md
│   │   │   │   │       │   │   ├── ispost.md
│   │   │   │   │       │   │   ├── isput.md
│   │   │   │   │       │   │   ├── issecure.md
│   │   │   │   │       │   │   ├── onlyprovides.md
│   │   │   │   │       │   │   ├── pagination.md
│   │   │   │   │       │   │   ├── processaction.md
│   │   │   │   │       │   │   ├── processrequest.md
│   │   │   │   │       │   │   ├── protectsfromforgery.md
│   │   │   │   │       │   │   ├── provides.md
│   │   │   │   │       │   │   ├── redirectto.md
│   │   │   │   │       │   │   ├── rendernothing.md
│   │   │   │   │       │   │   ├── renderpartial.md
│   │   │   │   │       │   │   ├── rendertext.md
│   │   │   │   │       │   │   ├── renderview.md
│   │   │   │   │       │   │   ├── renderwith.md
│   │   │   │   │       │   │   ├── response.md
│   │   │   │   │       │   │   ├── sendemail.md
│   │   │   │   │       │   │   ├── sendfile.md
│   │   │   │   │       │   │   ├── setfilterchain.md
│   │   │   │   │       │   │   ├── setpagination.md
│   │   │   │   │       │   │   ├── setresponse.md
│   │   │   │   │       │   │   ├── setverificationchain.md
│   │   │   │   │       │   │   ├── useslayout.md
│   │   │   │   │       │   │   ├── verificationchain.md
│   │   │   │   │       │   │   └── verifies.md
│   │   │   │   │       │   ├── global-helpers/
│   │   │   │   │       │   │   ├── capitalize.md
│   │   │   │   │       │   │   ├── controller.md
│   │   │   │   │       │   │   ├── deobfuscateparam.md
│   │   │   │   │       │   │   ├── distanceoftimeinwords.md
│   │   │   │   │       │   │   ├── excerpt.md
│   │   │   │   │       │   │   ├── humanize.md
│   │   │   │   │       │   │   ├── hyphenize.md
│   │   │   │   │       │   │   ├── index.md
│   │   │   │   │       │   │   ├── mimetypes.md
│   │   │   │   │       │   │   ├── model.md
│   │   │   │   │       │   │   ├── obfuscateparam.md
│   │   │   │   │       │   │   ├── pluginnames.md
│   │   │   │   │       │   │   ├── pluralize.md
│   │   │   │   │       │   │   ├── singularize.md
│   │   │   │   │       │   │   ├── timeagoinwords.md
│   │   │   │   │       │   │   ├── timeuntilinwords.md
│   │   │   │   │       │   │   ├── titleize.md
│   │   │   │   │       │   │   ├── truncate.md
│   │   │   │   │       │   │   ├── urlfor.md
│   │   │   │   │       │   │   └── wordtruncate.md
│   │   │   │   │       │   ├── index.md
│   │   │   │   │       │   ├── migrator/
│   │   │   │   │       │   │   ├── addcolumn.md
│   │   │   │   │       │   │   ├── addforeignkey.md
│   │   │   │   │       │   │   ├── addindex.md
│   │   │   │   │       │   │   ├── addrecord.md
│   │   │   │   │       │   │   ├── addreference.md
│   │   │   │   │       │   │   ├── biginteger.md
│   │   │   │   │       │   │   ├── binary.md
│   │   │   │   │       │   │   ├── boolean.md
│   │   │   │   │       │   │   ├── change.md
│   │   │   │   │       │   │   ├── changecolumn.md
│   │   │   │   │       │   │   ├── changetable.md
│   │   │   │   │       │   │   ├── char.md
│   │   │   │   │       │   │   ├── column.md
│   │   │   │   │       │   │   ├── create.md
│   │   │   │   │       │   │   ├── createmigration.md
│   │   │   │   │       │   │   ├── createtable.md
│   │   │   │   │       │   │   ├── createview.md
│   │   │   │   │       │   │   ├── date.md
│   │   │   │   │       │   │   ├── datetime.md
│   │   │   │   │       │   │   ├── decimal.md
│   │   │   │   │       │   │   ├── down.md
│   │   │   │   │       │   │   ├── dropforeignkey.md
│   │   │   │   │       │   │   ├── dropreference.md
│   │   │   │   │       │   │   ├── droptable.md
│   │   │   │   │       │   │   ├── dropview.md
│   │   │   │   │       │   │   ├── execute.md
│   │   │   │   │       │   │   ├── float.md
│   │   │   │   │       │   │   ├── getavailablemigrations.md
│   │   │   │   │       │   │   ├── getcurrentmigrationversion.md
│   │   │   │   │       │   │   ├── index.md
│   │   │   │   │       │   │   ├── integer.md
│   │   │   │   │       │   │   ├── migrateto.md
│   │   │   │   │       │   │   ├── migratetolatest.md
│   │   │   │   │       │   │   ├── primarykey.md
│   │   │   │   │       │   │   ├── redomigration.md
│   │   │   │   │       │   │   ├── references.md
│   │   │   │   │       │   │   ├── removecolumn.md
│   │   │   │   │       │   │   ├── removeindex.md
│   │   │   │   │       │   │   ├── removerecord.md
│   │   │   │   │       │   │   ├── renamecolumn.md
│   │   │   │   │       │   │   ├── renametable.md
│   │   │   │   │       │   │   ├── string.md
│   │   │   │   │       │   │   ├── text.md
│   │   │   │   │       │   │   ├── time.md
│   │   │   │   │       │   │   ├── timestamp.md
│   │   │   │   │       │   │   ├── timestamps.md
│   │   │   │   │       │   │   ├── uniqueidentifier.md
│   │   │   │   │       │   │   ├── up.md
│   │   │   │   │       │   │   └── updaterecord.md
│   │   │   │   │       │   ├── miscellaneous/
│   │   │   │   │       │   │   ├── announce.md
│   │   │   │   │       │   │   └── index.md
│   │   │   │   │       │   ├── model-class/
│   │   │   │   │       │   │   ├── average.md
│   │   │   │   │       │   │   ├── columndataforproperty.md
│   │   │   │   │       │   │   ├── columnforproperty.md
│   │   │   │   │       │   │   ├── columnnames.md
│   │   │   │   │       │   │   ├── columns.md
│   │   │   │   │       │   │   ├── count.md
│   │   │   │   │       │   │   ├── create.md
│   │   │   │   │       │   │   ├── deleteall.md
│   │   │   │   │       │   │   ├── deletebykey.md
│   │   │   │   │       │   │   ├── deleteone.md
│   │   │   │   │       │   │   ├── exists.md
│   │   │   │   │       │   │   ├── findall.md
│   │   │   │   │       │   │   ├── findallkeys.md
│   │   │   │   │       │   │   ├── findbykey.md
│   │   │   │   │       │   │   ├── findfirst.md
│   │   │   │   │       │   │   ├── findlastone.md
│   │   │   │   │       │   │   ├── findone.md
│   │   │   │   │       │   │   ├── gettablenameprefix.md
│   │   │   │   │       │   │   ├── index.md
│   │   │   │   │       │   │   ├── invokewithtransaction.md
│   │   │   │   │       │   │   ├── isclass.md
│   │   │   │   │       │   │   ├── isinstance.md
│   │   │   │   │       │   │   ├── maximum.md
│   │   │   │   │       │   │   ├── minimum.md
│   │   │   │   │       │   │   ├── new.md
│   │   │   │   │       │   │   ├── onmissingmethod.md
│   │   │   │   │       │   │   ├── primarykey.md
│   │   │   │   │       │   │   ├── primarykeys.md
│   │   │   │   │       │   │   ├── propertynames.md
│   │   │   │   │       │   │   ├── save.md
│   │   │   │   │       │   │   ├── sum.md
│   │   │   │   │       │   │   ├── tablename.md
│   │   │   │   │       │   │   ├── updateall.md
│   │   │   │   │       │   │   ├── updatebykey.md
│   │   │   │   │       │   │   ├── updateone.md
│   │   │   │   │       │   │   └── validationtypeforproperty.md
│   │   │   │   │       │   ├── model-configuration/
│   │   │   │   │       │   │   ├── accessibleproperties.md
│   │   │   │   │       │   │   ├── aftercreate.md
│   │   │   │   │       │   │   ├── afterdelete.md
│   │   │   │   │       │   │   ├── afterfind.md
│   │   │   │   │       │   │   ├── afterinitialization.md
│   │   │   │   │       │   │   ├── afternew.md
│   │   │   │   │       │   │   ├── aftersave.md
│   │   │   │   │       │   │   ├── afterupdate.md
│   │   │   │   │       │   │   ├── aftervalidation.md
│   │   │   │   │       │   │   ├── aftervalidationoncreate.md
│   │   │   │   │       │   │   ├── aftervalidationonupdate.md
│   │   │   │   │       │   │   ├── automaticvalidations.md
│   │   │   │   │       │   │   ├── beforecreate.md
│   │   │   │   │       │   │   ├── beforedelete.md
│   │   │   │   │       │   │   ├── beforesave.md
│   │   │   │   │       │   │   ├── beforeupdate.md
│   │   │   │   │       │   │   ├── beforevalidation.md
│   │   │   │   │       │   │   ├── beforevalidationoncreate.md
│   │   │   │   │       │   │   ├── beforevalidationonupdate.md
│   │   │   │   │       │   │   ├── belongsto.md
│   │   │   │   │       │   │   ├── datasource.md
│   │   │   │   │       │   │   ├── hasmany.md
│   │   │   │   │       │   │   ├── hasone.md
│   │   │   │   │       │   │   ├── index.md
│   │   │   │   │       │   │   ├── nestedproperties.md
│   │   │   │   │       │   │   ├── property.md
│   │   │   │   │       │   │   ├── protectedproperties.md
│   │   │   │   │       │   │   ├── setprimarykey.md
│   │   │   │   │       │   │   ├── setprimarykeys.md
│   │   │   │   │       │   │   ├── settablenameprefix.md
│   │   │   │   │       │   │   ├── table.md
│   │   │   │   │       │   │   ├── validate.md
│   │   │   │   │       │   │   ├── validateoncreate.md
│   │   │   │   │       │   │   ├── validateonupdate.md
│   │   │   │   │       │   │   ├── validatesconfirmationof.md
│   │   │   │   │       │   │   ├── validatesexclusionof.md
│   │   │   │   │       │   │   ├── validatesformatof.md
│   │   │   │   │       │   │   ├── validatesinclusionof.md
│   │   │   │   │       │   │   ├── validateslengthof.md
│   │   │   │   │       │   │   ├── validatesnumericalityof.md
│   │   │   │   │       │   │   ├── validatespresenceof.md
│   │   │   │   │       │   │   └── validatesuniquenessof.md
│   │   │   │   │       │   ├── model-object/
│   │   │   │   │       │   │   ├── adderror.md
│   │   │   │   │       │   │   ├── adderrortobase.md
│   │   │   │   │       │   │   ├── allchanges.md
│   │   │   │   │       │   │   ├── allerrors.md
│   │   │   │   │       │   │   ├── changedfrom.md
│   │   │   │   │       │   │   ├── changedproperties.md
│   │   │   │   │       │   │   ├── clearchangeinformation.md
│   │   │   │   │       │   │   ├── clearerrors.md
│   │   │   │   │       │   │   ├── compareto.md
│   │   │   │   │       │   │   ├── delete.md
│   │   │   │   │       │   │   ├── errorcount.md
│   │   │   │   │       │   │   ├── errorson.md
│   │   │   │   │       │   │   ├── errorsonbase.md
│   │   │   │   │       │   │   ├── haschanged.md
│   │   │   │   │       │   │   ├── haserrors.md
│   │   │   │   │       │   │   ├── hasproperty.md
│   │   │   │   │       │   │   ├── index.md
│   │   │   │   │       │   │   ├── isnew.md
│   │   │   │   │       │   │   ├── ispersisted.md
│   │   │   │   │       │   │   ├── key.md
│   │   │   │   │       │   │   ├── properties.md
│   │   │   │   │       │   │   ├── propertyisblank.md
│   │   │   │   │       │   │   ├── propertyispresent.md
│   │   │   │   │       │   │   ├── reload.md
│   │   │   │   │       │   │   ├── setproperties.md
│   │   │   │   │       │   │   ├── toggle.md
│   │   │   │   │       │   │   ├── update.md
│   │   │   │   │       │   │   ├── updateproperty.md
│   │   │   │   │       │   │   └── valid.md
│   │   │   │   │       │   └── view-helpers/
│   │   │   │   │       │       ├── authenticitytokenfield.md
│   │   │   │   │       │       ├── autolink.md
│   │   │   │   │       │       ├── buttontag.md
│   │   │   │   │       │       ├── buttonto.md
│   │   │   │   │       │       ├── checkbox.md
│   │   │   │   │       │       ├── checkboxtag.md
│   │   │   │   │       │       ├── contentfor.md
│   │   │   │   │       │       ├── contentforlayout.md
│   │   │   │   │       │       ├── csrfmetatags.md
│   │   │   │   │       │       ├── cycle.md
│   │   │   │   │       │       ├── dateselect.md
│   │   │   │   │       │       ├── dateselecttags.md
│   │   │   │   │       │       ├── datetimeselect.md
│   │   │   │   │       │       ├── datetimeselecttags.md
│   │   │   │   │       │       ├── dayselecttag.md
│   │   │   │   │       │       ├── endformtag.md
│   │   │   │   │       │       ├── errormessageon.md
│   │   │   │   │       │       ├── errormessagesfor.md
│   │   │   │   │       │       ├── filefield.md
│   │   │   │   │       │       ├── filefieldtag.md
│   │   │   │   │       │       ├── flashmessages.md
│   │   │   │   │       │       ├── hasmanycheckbox.md
│   │   │   │   │       │       ├── hasmanyradiobutton.md
│   │   │   │   │       │       ├── hiddenfield.md
│   │   │   │   │       │       ├── hiddenfieldtag.md
│   │   │   │   │       │       ├── highlight.md
│   │   │   │   │       │       ├── hourselecttag.md
│   │   │   │   │       │       ├── imagetag.md
│   │   │   │   │       │       ├── includecontent.md
│   │   │   │   │       │       ├── includedinobject.md
│   │   │   │   │       │       ├── includelayout.md
│   │   │   │   │       │       ├── includepartial.md
│   │   │   │   │       │       ├── index.md
│   │   │   │   │       │       ├── javascriptincludetag.md
│   │   │   │   │       │       ├── linkto.md
│   │   │   │   │       │       ├── mailto.md
│   │   │   │   │       │       ├── minuteselecttag.md
│   │   │   │   │       │       ├── monthselecttag.md
│   │   │   │   │       │       ├── paginationlinks.md
│   │   │   │   │       │       ├── passwordfield.md
│   │   │   │   │       │       ├── passwordfieldtag.md
│   │   │   │   │       │       ├── radiobutton.md
│   │   │   │   │       │       ├── radiobuttontag.md
│   │   │   │   │       │       ├── resetcycle.md
│   │   │   │   │       │       ├── secondselecttag.md
│   │   │   │   │       │       ├── select.md
│   │   │   │   │       │       ├── selecttag.md
│   │   │   │   │       │       ├── simpleformat.md
│   │   │   │   │       │       ├── startformtag.md
│   │   │   │   │       │       ├── striplinks.md
│   │   │   │   │       │       ├── striptags.md
│   │   │   │   │       │       ├── stylesheetlinktag.md
│   │   │   │   │       │       ├── submittag.md
│   │   │   │   │       │       ├── textarea.md
│   │   │   │   │       │       ├── textareatag.md
│   │   │   │   │       │       ├── textfield.md
│   │   │   │   │       │       ├── textfieldtag.md
│   │   │   │   │       │       ├── timeselect.md
│   │   │   │   │       │       ├── timeselecttags.md
│   │   │   │   │       │       └── yearselecttag.md
│   │   │   │   │       ├── v2-4-0/
│   │   │   │   │       │   ├── configuration/
│   │   │   │   │       │   │   ├── addformat.md
│   │   │   │   │       │   │   ├── collection.md
│   │   │   │   │       │   │   ├── constraints.md
│   │   │   │   │       │   │   ├── controller.md
│   │   │   │   │       │   │   ├── delete.md
│   │   │   │   │       │   │   ├── end.md
│   │   │   │   │       │   │   ├── get.md
│   │   │   │   │       │   │   ├── index.md
│   │   │   │   │       │   │   ├── mapper.md
│   │   │   │   │       │   │   ├── member.md
│   │   │   │   │       │   │   ├── namespace.md
│   │   │   │   │       │   │   ├── package.md
│   │   │   │   │       │   │   ├── patch.md
│   │   │   │   │       │   │   ├── post.md
│   │   │   │   │       │   │   ├── put.md
│   │   │   │   │       │   │   ├── resource.md
│   │   │   │   │       │   │   ├── resources.md
│   │   │   │   │       │   │   ├── root.md
│   │   │   │   │       │   │   ├── scope.md
│   │   │   │   │       │   │   ├── set.md
│   │   │   │   │       │   │   └── wildcard.md
│   │   │   │   │       │   ├── controller/
│   │   │   │   │       │   │   ├── authenticitytoken.md
│   │   │   │   │       │   │   ├── caches.md
│   │   │   │   │       │   │   ├── filterchain.md
│   │   │   │   │       │   │   ├── filters.md
│   │   │   │   │       │   │   ├── flash.md
│   │   │   │   │       │   │   ├── flashclear.md
│   │   │   │   │       │   │   ├── flashcount.md
│   │   │   │   │       │   │   ├── flashdelete.md
│   │   │   │   │       │   │   ├── flashinsert.md
│   │   │   │   │       │   │   ├── flashisempty.md
│   │   │   │   │       │   │   ├── flashkeep.md
│   │   │   │   │       │   │   ├── flashkeyexists.md
│   │   │   │   │       │   │   ├── getemails.md
│   │   │   │   │       │   │   ├── getfiles.md
│   │   │   │   │       │   │   ├── getredirect.md
│   │   │   │   │       │   │   ├── index.md
│   │   │   │   │       │   │   ├── isajax.md
│   │   │   │   │       │   │   ├── isdelete.md
│   │   │   │   │       │   │   ├── isget.md
│   │   │   │   │       │   │   ├── ishead.md
│   │   │   │   │       │   │   ├── isoptions.md
│   │   │   │   │       │   │   ├── ispatch.md
│   │   │   │   │       │   │   ├── ispost.md
│   │   │   │   │       │   │   ├── isput.md
│   │   │   │   │       │   │   ├── issecure.md
│   │   │   │   │       │   │   ├── onlyprovides.md
│   │   │   │   │       │   │   ├── pagination.md
│   │   │   │   │       │   │   ├── processaction.md
│   │   │   │   │       │   │   ├── processrequest.md
│   │   │   │   │       │   │   ├── protectsfromforgery.md
│   │   │   │   │       │   │   ├── provides.md
│   │   │   │   │       │   │   ├── redirectto.md
│   │   │   │   │       │   │   ├── rendernothing.md
│   │   │   │   │       │   │   ├── renderpartial.md
│   │   │   │   │       │   │   ├── rendertext.md
│   │   │   │   │       │   │   ├── renderview.md
│   │   │   │   │       │   │   ├── renderwith.md
│   │   │   │   │       │   │   ├── response.md
│   │   │   │   │       │   │   ├── sendemail.md
│   │   │   │   │       │   │   ├── sendfile.md
│   │   │   │   │       │   │   ├── setfilterchain.md
│   │   │   │   │       │   │   ├── setpagination.md
│   │   │   │   │       │   │   ├── setresponse.md
│   │   │   │   │       │   │   ├── setverificationchain.md
│   │   │   │   │       │   │   ├── useslayout.md
│   │   │   │   │       │   │   ├── verificationchain.md
│   │   │   │   │       │   │   └── verifies.md
│   │   │   │   │       │   ├── global-helpers/
│   │   │   │   │       │   │   ├── capitalize.md
│   │   │   │   │       │   │   ├── controller.md
│   │   │   │   │       │   │   ├── deobfuscateparam.md
│   │   │   │   │       │   │   ├── distanceoftimeinwords.md
│   │   │   │   │       │   │   ├── excerpt.md
│   │   │   │   │       │   │   ├── humanize.md
│   │   │   │   │       │   │   ├── hyphenize.md
│   │   │   │   │       │   │   ├── index.md
│   │   │   │   │       │   │   ├── mimetypes.md
│   │   │   │   │       │   │   ├── model.md
│   │   │   │   │       │   │   ├── obfuscateparam.md
│   │   │   │   │       │   │   ├── pluginnames.md
│   │   │   │   │       │   │   ├── pluralize.md
│   │   │   │   │       │   │   ├── singularize.md
│   │   │   │   │       │   │   ├── timeagoinwords.md
│   │   │   │   │       │   │   ├── timeuntilinwords.md
│   │   │   │   │       │   │   ├── titleize.md
│   │   │   │   │       │   │   ├── truncate.md
│   │   │   │   │       │   │   ├── urlfor.md
│   │   │   │   │       │   │   └── wordtruncate.md
│   │   │   │   │       │   ├── index.md
│   │   │   │   │       │   ├── migrator/
│   │   │   │   │       │   │   ├── addcolumn.md
│   │   │   │   │       │   │   ├── addforeignkey.md
│   │   │   │   │       │   │   ├── addindex.md
│   │   │   │   │       │   │   ├── addrecord.md
│   │   │   │   │       │   │   ├── addreference.md
│   │   │   │   │       │   │   ├── biginteger.md
│   │   │   │   │       │   │   ├── binary.md
│   │   │   │   │       │   │   ├── boolean.md
│   │   │   │   │       │   │   ├── change.md
│   │   │   │   │       │   │   ├── changecolumn.md
│   │   │   │   │       │   │   ├── changetable.md
│   │   │   │   │       │   │   ├── char.md
│   │   │   │   │       │   │   ├── column.md
│   │   │   │   │       │   │   ├── create.md
│   │   │   │   │       │   │   ├── createmigration.md
│   │   │   │   │       │   │   ├── createtable.md
│   │   │   │   │       │   │   ├── createview.md
│   │   │   │   │       │   │   ├── date.md
│   │   │   │   │       │   │   ├── datetime.md
│   │   │   │   │       │   │   ├── decimal.md
│   │   │   │   │       │   │   ├── down.md
│   │   │   │   │       │   │   ├── dropforeignkey.md
│   │   │   │   │       │   │   ├── dropreference.md
│   │   │   │   │       │   │   ├── droptable.md
│   │   │   │   │       │   │   ├── dropview.md
│   │   │   │   │       │   │   ├── execute.md
│   │   │   │   │       │   │   ├── float.md
│   │   │   │   │       │   │   ├── getavailablemigrations.md
│   │   │   │   │       │   │   ├── getcurrentmigrationversion.md
│   │   │   │   │       │   │   ├── index.md
│   │   │   │   │       │   │   ├── integer.md
│   │   │   │   │       │   │   ├── migrateto.md
│   │   │   │   │       │   │   ├── migratetolatest.md
│   │   │   │   │       │   │   ├── primarykey.md
│   │   │   │   │       │   │   ├── redomigration.md
│   │   │   │   │       │   │   ├── references.md
│   │   │   │   │       │   │   ├── removecolumn.md
│   │   │   │   │       │   │   ├── removeindex.md
│   │   │   │   │       │   │   ├── removerecord.md
│   │   │   │   │       │   │   ├── renamecolumn.md
│   │   │   │   │       │   │   ├── renametable.md
│   │   │   │   │       │   │   ├── string.md
│   │   │   │   │       │   │   ├── text.md
│   │   │   │   │       │   │   ├── time.md
│   │   │   │   │       │   │   ├── timestamp.md
│   │   │   │   │       │   │   ├── timestamps.md
│   │   │   │   │       │   │   ├── uniqueidentifier.md
│   │   │   │   │       │   │   ├── up.md
│   │   │   │   │       │   │   └── updaterecord.md
│   │   │   │   │       │   ├── miscellaneous/
│   │   │   │   │       │   │   ├── announce.md
│   │   │   │   │       │   │   └── index.md
│   │   │   │   │       │   ├── model-class/
│   │   │   │   │       │   │   ├── average.md
│   │   │   │   │       │   │   ├── columndataforproperty.md
│   │   │   │   │       │   │   ├── columnforproperty.md
│   │   │   │   │       │   │   ├── columnnames.md
│   │   │   │   │       │   │   ├── columns.md
│   │   │   │   │       │   │   ├── count.md
│   │   │   │   │       │   │   ├── create.md
│   │   │   │   │       │   │   ├── deleteall.md
│   │   │   │   │       │   │   ├── deletebykey.md
│   │   │   │   │       │   │   ├── deleteone.md
│   │   │   │   │       │   │   ├── exists.md
│   │   │   │   │       │   │   ├── findall.md
│   │   │   │   │       │   │   ├── findallkeys.md
│   │   │   │   │       │   │   ├── findbykey.md
│   │   │   │   │       │   │   ├── findfirst.md
│   │   │   │   │       │   │   ├── findlastone.md
│   │   │   │   │       │   │   ├── findone.md
│   │   │   │   │       │   │   ├── gettablenameprefix.md
│   │   │   │   │       │   │   ├── index.md
│   │   │   │   │       │   │   ├── invokewithtransaction.md
│   │   │   │   │       │   │   ├── isclass.md
│   │   │   │   │       │   │   ├── isinstance.md
│   │   │   │   │       │   │   ├── maximum.md
│   │   │   │   │       │   │   ├── minimum.md
│   │   │   │   │       │   │   ├── new.md
│   │   │   │   │       │   │   ├── onmissingmethod.md
│   │   │   │   │       │   │   ├── primarykey.md
│   │   │   │   │       │   │   ├── primarykeys.md
│   │   │   │   │       │   │   ├── propertynames.md
│   │   │   │   │       │   │   ├── save.md
│   │   │   │   │       │   │   ├── sum.md
│   │   │   │   │       │   │   ├── tablename.md
│   │   │   │   │       │   │   ├── updateall.md
│   │   │   │   │       │   │   ├── updatebykey.md
│   │   │   │   │       │   │   ├── updateone.md
│   │   │   │   │       │   │   └── validationtypeforproperty.md
│   │   │   │   │       │   ├── model-configuration/
│   │   │   │   │       │   │   ├── accessibleproperties.md
│   │   │   │   │       │   │   ├── aftercreate.md
│   │   │   │   │       │   │   ├── afterdelete.md
│   │   │   │   │       │   │   ├── afterfind.md
│   │   │   │   │       │   │   ├── afterinitialization.md
│   │   │   │   │       │   │   ├── afternew.md
│   │   │   │   │       │   │   ├── aftersave.md
│   │   │   │   │       │   │   ├── afterupdate.md
│   │   │   │   │       │   │   ├── aftervalidation.md
│   │   │   │   │       │   │   ├── aftervalidationoncreate.md
│   │   │   │   │       │   │   ├── aftervalidationonupdate.md
│   │   │   │   │       │   │   ├── automaticvalidations.md
│   │   │   │   │       │   │   ├── beforecreate.md
│   │   │   │   │       │   │   ├── beforedelete.md
│   │   │   │   │       │   │   ├── beforesave.md
│   │   │   │   │       │   │   ├── beforeupdate.md
│   │   │   │   │       │   │   ├── beforevalidation.md
│   │   │   │   │       │   │   ├── beforevalidationoncreate.md
│   │   │   │   │       │   │   ├── beforevalidationonupdate.md
│   │   │   │   │       │   │   ├── belongsto.md
│   │   │   │   │       │   │   ├── datasource.md
│   │   │   │   │       │   │   ├── hasmany.md
│   │   │   │   │       │   │   ├── hasone.md
│   │   │   │   │       │   │   ├── index.md
│   │   │   │   │       │   │   ├── nestedproperties.md
│   │   │   │   │       │   │   ├── property.md
│   │   │   │   │       │   │   ├── protectedproperties.md
│   │   │   │   │       │   │   ├── setprimarykey.md
│   │   │   │   │       │   │   ├── setprimarykeys.md
│   │   │   │   │       │   │   ├── settablenameprefix.md
│   │   │   │   │       │   │   ├── table.md
│   │   │   │   │       │   │   ├── validate.md
│   │   │   │   │       │   │   ├── validateoncreate.md
│   │   │   │   │       │   │   ├── validateonupdate.md
│   │   │   │   │       │   │   ├── validatesconfirmationof.md
│   │   │   │   │       │   │   ├── validatesexclusionof.md
│   │   │   │   │       │   │   ├── validatesformatof.md
│   │   │   │   │       │   │   ├── validatesinclusionof.md
│   │   │   │   │       │   │   ├── validateslengthof.md
│   │   │   │   │       │   │   ├── validatesnumericalityof.md
│   │   │   │   │       │   │   ├── validatespresenceof.md
│   │   │   │   │       │   │   └── validatesuniquenessof.md
│   │   │   │   │       │   ├── model-object/
│   │   │   │   │       │   │   ├── adderror.md
│   │   │   │   │       │   │   ├── adderrortobase.md
│   │   │   │   │       │   │   ├── allchanges.md
│   │   │   │   │       │   │   ├── allerrors.md
│   │   │   │   │       │   │   ├── changedfrom.md
│   │   │   │   │       │   │   ├── changedproperties.md
│   │   │   │   │       │   │   ├── clearchangeinformation.md
│   │   │   │   │       │   │   ├── clearerrors.md
│   │   │   │   │       │   │   ├── compareto.md
│   │   │   │   │       │   │   ├── delete.md
│   │   │   │   │       │   │   ├── errorcount.md
│   │   │   │   │       │   │   ├── errorson.md
│   │   │   │   │       │   │   ├── errorsonbase.md
│   │   │   │   │       │   │   ├── haschanged.md
│   │   │   │   │       │   │   ├── haserrors.md
│   │   │   │   │       │   │   ├── hasproperty.md
│   │   │   │   │       │   │   ├── index.md
│   │   │   │   │       │   │   ├── isnew.md
│   │   │   │   │       │   │   ├── ispersisted.md
│   │   │   │   │       │   │   ├── key.md
│   │   │   │   │       │   │   ├── properties.md
│   │   │   │   │       │   │   ├── propertyisblank.md
│   │   │   │   │       │   │   ├── propertyispresent.md
│   │   │   │   │       │   │   ├── reload.md
│   │   │   │   │       │   │   ├── setproperties.md
│   │   │   │   │       │   │   ├── toggle.md
│   │   │   │   │       │   │   ├── update.md
│   │   │   │   │       │   │   ├── updateproperty.md
│   │   │   │   │       │   │   └── valid.md
│   │   │   │   │       │   └── view-helpers/
│   │   │   │   │       │       ├── authenticitytokenfield.md
│   │   │   │   │       │       ├── autolink.md
│   │   │   │   │       │       ├── buttontag.md
│   │   │   │   │       │       ├── buttonto.md
│   │   │   │   │       │       ├── checkbox.md
│   │   │   │   │       │       ├── checkboxtag.md
│   │   │   │   │       │       ├── contentfor.md
│   │   │   │   │       │       ├── contentforlayout.md
│   │   │   │   │       │       ├── csrfmetatags.md
│   │   │   │   │       │       ├── cycle.md
│   │   │   │   │       │       ├── dateselect.md
│   │   │   │   │       │       ├── dateselecttags.md
│   │   │   │   │       │       ├── datetimeselect.md
│   │   │   │   │       │       ├── datetimeselecttags.md
│   │   │   │   │       │       ├── dayselecttag.md
│   │   │   │   │       │       ├── endformtag.md
│   │   │   │   │       │       ├── errormessageon.md
│   │   │   │   │       │       ├── errormessagesfor.md
│   │   │   │   │       │       ├── filefield.md
│   │   │   │   │       │       ├── filefieldtag.md
│   │   │   │   │       │       ├── flashmessages.md
│   │   │   │   │       │       ├── hasmanycheckbox.md
│   │   │   │   │       │       ├── hasmanyradiobutton.md
│   │   │   │   │       │       ├── hiddenfield.md
│   │   │   │   │       │       ├── hiddenfieldtag.md
│   │   │   │   │       │       ├── highlight.md
│   │   │   │   │       │       ├── hourselecttag.md
│   │   │   │   │       │       ├── imagetag.md
│   │   │   │   │       │       ├── includecontent.md
│   │   │   │   │       │       ├── includedinobject.md
│   │   │   │   │       │       ├── includelayout.md
│   │   │   │   │       │       ├── includepartial.md
│   │   │   │   │       │       ├── index.md
│   │   │   │   │       │       ├── javascriptincludetag.md
│   │   │   │   │       │       ├── linkto.md
│   │   │   │   │       │       ├── mailto.md
│   │   │   │   │       │       ├── minuteselecttag.md
│   │   │   │   │       │       ├── monthselecttag.md
│   │   │   │   │       │       ├── paginationlinks.md
│   │   │   │   │       │       ├── passwordfield.md
│   │   │   │   │       │       ├── passwordfieldtag.md
│   │   │   │   │       │       ├── radiobutton.md
│   │   │   │   │       │       ├── radiobuttontag.md
│   │   │   │   │       │       ├── resetcycle.md
│   │   │   │   │       │       ├── secondselecttag.md
│   │   │   │   │       │       ├── select.md
│   │   │   │   │       │       ├── selecttag.md
│   │   │   │   │       │       ├── simpleformat.md
│   │   │   │   │       │       ├── startformtag.md
│   │   │   │   │       │       ├── striplinks.md
│   │   │   │   │       │       ├── striptags.md
│   │   │   │   │       │       ├── stylesheetlinktag.md
│   │   │   │   │       │       ├── submittag.md
│   │   │   │   │       │       ├── textarea.md
│   │   │   │   │       │       ├── textareatag.md
│   │   │   │   │       │       ├── textfield.md
│   │   │   │   │       │       ├── textfieldtag.md
│   │   │   │   │       │       ├── timeselect.md
│   │   │   │   │       │       ├── timeselecttags.md
│   │   │   │   │       │       └── yearselecttag.md
│   │   │   │   │       ├── v2-5-0/
│   │   │   │   │       │   ├── configuration/
│   │   │   │   │       │   │   ├── addformat.md
│   │   │   │   │       │   │   ├── collection.md
│   │   │   │   │       │   │   ├── constraints.md
│   │   │   │   │       │   │   ├── controller.md
│   │   │   │   │       │   │   ├── delete.md
│   │   │   │   │       │   │   ├── end.md
│   │   │   │   │       │   │   ├── get.md
│   │   │   │   │       │   │   ├── index.md
│   │   │   │   │       │   │   ├── mapper.md
│   │   │   │   │       │   │   ├── member.md
│   │   │   │   │       │   │   ├── namespace.md
│   │   │   │   │       │   │   ├── package.md
│   │   │   │   │       │   │   ├── patch.md
│   │   │   │   │       │   │   ├── post.md
│   │   │   │   │       │   │   ├── put.md
│   │   │   │   │       │   │   ├── resource.md
│   │   │   │   │       │   │   ├── resources.md
│   │   │   │   │       │   │   ├── root.md
│   │   │   │   │       │   │   ├── scope.md
│   │   │   │   │       │   │   ├── set.md
│   │   │   │   │       │   │   └── wildcard.md
│   │   │   │   │       │   ├── controller/
│   │   │   │   │       │   │   ├── authenticitytoken.md
│   │   │   │   │       │   │   ├── caches.md
│   │   │   │   │       │   │   ├── filterchain.md
│   │   │   │   │       │   │   ├── filters.md
│   │   │   │   │       │   │   ├── flash.md
│   │   │   │   │       │   │   ├── flashclear.md
│   │   │   │   │       │   │   ├── flashcount.md
│   │   │   │   │       │   │   ├── flashdelete.md
│   │   │   │   │       │   │   ├── flashinsert.md
│   │   │   │   │       │   │   ├── flashisempty.md
│   │   │   │   │       │   │   ├── flashkeep.md
│   │   │   │   │       │   │   ├── flashkeyexists.md
│   │   │   │   │       │   │   ├── getemails.md
│   │   │   │   │       │   │   ├── getfiles.md
│   │   │   │   │       │   │   ├── getredirect.md
│   │   │   │   │       │   │   ├── index.md
│   │   │   │   │       │   │   ├── isajax.md
│   │   │   │   │       │   │   ├── isdelete.md
│   │   │   │   │       │   │   ├── isget.md
│   │   │   │   │       │   │   ├── ishead.md
│   │   │   │   │       │   │   ├── isoptions.md
│   │   │   │   │       │   │   ├── ispatch.md
│   │   │   │   │       │   │   ├── ispost.md
│   │   │   │   │       │   │   ├── isput.md
│   │   │   │   │       │   │   ├── issecure.md
│   │   │   │   │       │   │   ├── onlyprovides.md
│   │   │   │   │       │   │   ├── pagination.md
│   │   │   │   │       │   │   ├── processaction.md
│   │   │   │   │       │   │   ├── processrequest.md
│   │   │   │   │       │   │   ├── protectsfromforgery.md
│   │   │   │   │       │   │   ├── provides.md
│   │   │   │   │       │   │   ├── redirectto.md
│   │   │   │   │       │   │   ├── rendernothing.md
│   │   │   │   │       │   │   ├── renderpartial.md
│   │   │   │   │       │   │   ├── rendertext.md
│   │   │   │   │       │   │   ├── renderview.md
│   │   │   │   │       │   │   ├── renderwith.md
│   │   │   │   │       │   │   ├── response.md
│   │   │   │   │       │   │   ├── sendemail.md
│   │   │   │   │       │   │   ├── sendfile.md
│   │   │   │   │       │   │   ├── setfilterchain.md
│   │   │   │   │       │   │   ├── setpagination.md
│   │   │   │   │       │   │   ├── setresponse.md
│   │   │   │   │       │   │   ├── setverificationchain.md
│   │   │   │   │       │   │   ├── useslayout.md
│   │   │   │   │       │   │   ├── verificationchain.md
│   │   │   │   │       │   │   └── verifies.md
│   │   │   │   │       │   ├── global-helpers/
│   │   │   │   │       │   │   ├── capitalize.md
│   │   │   │   │       │   │   ├── controller.md
│   │   │   │   │       │   │   ├── deobfuscateparam.md
│   │   │   │   │       │   │   ├── distanceoftimeinwords.md
│   │   │   │   │       │   │   ├── excerpt.md
│   │   │   │   │       │   │   ├── humanize.md
│   │   │   │   │       │   │   ├── hyphenize.md
│   │   │   │   │       │   │   ├── index.md
│   │   │   │   │       │   │   ├── mimetypes.md
│   │   │   │   │       │   │   ├── model.md
│   │   │   │   │       │   │   ├── obfuscateparam.md
│   │   │   │   │       │   │   ├── pluginnames.md
│   │   │   │   │       │   │   ├── pluralize.md
│   │   │   │   │       │   │   ├── singularize.md
│   │   │   │   │       │   │   ├── timeagoinwords.md
│   │   │   │   │       │   │   ├── timeuntilinwords.md
│   │   │   │   │       │   │   ├── titleize.md
│   │   │   │   │       │   │   ├── truncate.md
│   │   │   │   │       │   │   ├── urlfor.md
│   │   │   │   │       │   │   └── wordtruncate.md
│   │   │   │   │       │   ├── index.md
│   │   │   │   │       │   ├── migrator/
│   │   │   │   │       │   │   ├── addcolumn.md
│   │   │   │   │       │   │   ├── addforeignkey.md
│   │   │   │   │       │   │   ├── addindex.md
│   │   │   │   │       │   │   ├── addrecord.md
│   │   │   │   │       │   │   ├── addreference.md
│   │   │   │   │       │   │   ├── biginteger.md
│   │   │   │   │       │   │   ├── binary.md
│   │   │   │   │       │   │   ├── boolean.md
│   │   │   │   │       │   │   ├── change.md
│   │   │   │   │       │   │   ├── changecolumn.md
│   │   │   │   │       │   │   ├── changetable.md
│   │   │   │   │       │   │   ├── char.md
│   │   │   │   │       │   │   ├── column.md
│   │   │   │   │       │   │   ├── create.md
│   │   │   │   │       │   │   ├── createmigration.md
│   │   │   │   │       │   │   ├── createtable.md
│   │   │   │   │       │   │   ├── createview.md
│   │   │   │   │       │   │   ├── date.md
│   │   │   │   │       │   │   ├── datetime.md
│   │   │   │   │       │   │   ├── decimal.md
│   │   │   │   │       │   │   ├── down.md
│   │   │   │   │       │   │   ├── dropforeignkey.md
│   │   │   │   │       │   │   ├── dropreference.md
│   │   │   │   │       │   │   ├── droptable.md
│   │   │   │   │       │   │   ├── dropview.md
│   │   │   │   │       │   │   ├── execute.md
│   │   │   │   │       │   │   ├── float.md
│   │   │   │   │       │   │   ├── getavailablemigrations.md
│   │   │   │   │       │   │   ├── getcurrentmigrationversion.md
│   │   │   │   │       │   │   ├── index.md
│   │   │   │   │       │   │   ├── integer.md
│   │   │   │   │       │   │   ├── migrateto.md
│   │   │   │   │       │   │   ├── migratetolatest.md
│   │   │   │   │       │   │   ├── primarykey.md
│   │   │   │   │       │   │   ├── redomigration.md
│   │   │   │   │       │   │   ├── references.md
│   │   │   │   │       │   │   ├── removecolumn.md
│   │   │   │   │       │   │   ├── removeindex.md
│   │   │   │   │       │   │   ├── removerecord.md
│   │   │   │   │       │   │   ├── renamecolumn.md
│   │   │   │   │       │   │   ├── renametable.md
│   │   │   │   │       │   │   ├── string.md
│   │   │   │   │       │   │   ├── text.md
│   │   │   │   │       │   │   ├── time.md
│   │   │   │   │       │   │   ├── timestamp.md
│   │   │   │   │       │   │   ├── timestamps.md
│   │   │   │   │       │   │   ├── uniqueidentifier.md
│   │   │   │   │       │   │   ├── up.md
│   │   │   │   │       │   │   └── updaterecord.md
│   │   │   │   │       │   ├── miscellaneous/
│   │   │   │   │       │   │   ├── announce.md
│   │   │   │   │       │   │   ├── assert.md
│   │   │   │   │       │   │   ├── fail.md
│   │   │   │   │       │   │   ├── index.md
│   │   │   │   │       │   │   └── testexample.md
│   │   │   │   │       │   ├── model-class/
│   │   │   │   │       │   │   ├── average.md
│   │   │   │   │       │   │   ├── columndataforproperty.md
│   │   │   │   │       │   │   ├── columnforproperty.md
│   │   │   │   │       │   │   ├── columnnames.md
│   │   │   │   │       │   │   ├── columns.md
│   │   │   │   │       │   │   ├── count.md
│   │   │   │   │       │   │   ├── create.md
│   │   │   │   │       │   │   ├── deleteall.md
│   │   │   │   │       │   │   ├── deletebykey.md
│   │   │   │   │       │   │   ├── deleteone.md
│   │   │   │   │       │   │   ├── exists.md
│   │   │   │   │       │   │   ├── findall.md
│   │   │   │   │       │   │   ├── findallkeys.md
│   │   │   │   │       │   │   ├── findbykey.md
│   │   │   │   │       │   │   ├── findfirst.md
│   │   │   │   │       │   │   ├── findlastone.md
│   │   │   │   │       │   │   ├── findone.md
│   │   │   │   │       │   │   ├── gettablenameprefix.md
│   │   │   │   │       │   │   ├── index.md
│   │   │   │   │       │   │   ├── invokewithtransaction.md
│   │   │   │   │       │   │   ├── isclass.md
│   │   │   │   │       │   │   ├── isinstance.md
│   │   │   │   │       │   │   ├── maximum.md
│   │   │   │   │       │   │   ├── minimum.md
│   │   │   │   │       │   │   ├── new.md
│   │   │   │   │       │   │   ├── onmissingmethod.md
│   │   │   │   │       │   │   ├── primarykey.md
│   │   │   │   │       │   │   ├── primarykeys.md
│   │   │   │   │       │   │   ├── propertynames.md
│   │   │   │   │       │   │   ├── save.md
│   │   │   │   │       │   │   ├── sum.md
│   │   │   │   │       │   │   ├── tablename.md
│   │   │   │   │       │   │   ├── updateall.md
│   │   │   │   │       │   │   ├── updatebykey.md
│   │   │   │   │       │   │   ├── updateone.md
│   │   │   │   │       │   │   └── validationtypeforproperty.md
│   │   │   │   │       │   ├── model-configuration/
│   │   │   │   │       │   │   ├── accessibleproperties.md
│   │   │   │   │       │   │   ├── aftercreate.md
│   │   │   │   │       │   │   ├── afterdelete.md
│   │   │   │   │       │   │   ├── afterfind.md
│   │   │   │   │       │   │   ├── afterinitialization.md
│   │   │   │   │       │   │   ├── afternew.md
│   │   │   │   │       │   │   ├── aftersave.md
│   │   │   │   │       │   │   ├── afterupdate.md
│   │   │   │   │       │   │   ├── aftervalidation.md
│   │   │   │   │       │   │   ├── aftervalidationoncreate.md
│   │   │   │   │       │   │   ├── aftervalidationonupdate.md
│   │   │   │   │       │   │   ├── automaticvalidations.md
│   │   │   │   │       │   │   ├── beforecreate.md
│   │   │   │   │       │   │   ├── beforedelete.md
│   │   │   │   │       │   │   ├── beforesave.md
│   │   │   │   │       │   │   ├── beforeupdate.md
│   │   │   │   │       │   │   ├── beforevalidation.md
│   │   │   │   │       │   │   ├── beforevalidationoncreate.md
│   │   │   │   │       │   │   ├── beforevalidationonupdate.md
│   │   │   │   │       │   │   ├── belongsto.md
│   │   │   │   │       │   │   ├── datasource.md
│   │   │   │   │       │   │   ├── hasmany.md
│   │   │   │   │       │   │   ├── hasone.md
│   │   │   │   │       │   │   ├── index.md
│   │   │   │   │       │   │   ├── nestedproperties.md
│   │   │   │   │       │   │   ├── property.md
│   │   │   │   │       │   │   ├── protectedproperties.md
│   │   │   │   │       │   │   ├── setprimarykey.md
│   │   │   │   │       │   │   ├── setprimarykeys.md
│   │   │   │   │       │   │   ├── settablenameprefix.md
│   │   │   │   │       │   │   ├── table.md
│   │   │   │   │       │   │   ├── validate.md
│   │   │   │   │       │   │   ├── validateoncreate.md
│   │   │   │   │       │   │   ├── validateonupdate.md
│   │   │   │   │       │   │   ├── validatesconfirmationof.md
│   │   │   │   │       │   │   ├── validatesexclusionof.md
│   │   │   │   │       │   │   ├── validatesformatof.md
│   │   │   │   │       │   │   ├── validatesinclusionof.md
│   │   │   │   │       │   │   ├── validateslengthof.md
│   │   │   │   │       │   │   ├── validatesnumericalityof.md
│   │   │   │   │       │   │   ├── validatespresenceof.md
│   │   │   │   │       │   │   └── validatesuniquenessof.md
│   │   │   │   │       │   ├── model-object/
│   │   │   │   │       │   │   ├── adderror.md
│   │   │   │   │       │   │   ├── adderrortobase.md
│   │   │   │   │       │   │   ├── allchanges.md
│   │   │   │   │       │   │   ├── allerrors.md
│   │   │   │   │       │   │   ├── changedfrom.md
│   │   │   │   │       │   │   ├── changedproperties.md
│   │   │   │   │       │   │   ├── clearchangeinformation.md
│   │   │   │   │       │   │   ├── clearerrors.md
│   │   │   │   │       │   │   ├── compareto.md
│   │   │   │   │       │   │   ├── delete.md
│   │   │   │   │       │   │   ├── errorcount.md
│   │   │   │   │       │   │   ├── errorson.md
│   │   │   │   │       │   │   ├── errorsonbase.md
│   │   │   │   │       │   │   ├── haschanged.md
│   │   │   │   │       │   │   ├── haserrors.md
│   │   │   │   │       │   │   ├── hasproperty.md
│   │   │   │   │       │   │   ├── index.md
│   │   │   │   │       │   │   ├── isnew.md
│   │   │   │   │       │   │   ├── ispersisted.md
│   │   │   │   │       │   │   ├── key.md
│   │   │   │   │       │   │   ├── properties.md
│   │   │   │   │       │   │   ├── propertyisblank.md
│   │   │   │   │       │   │   ├── propertyispresent.md
│   │   │   │   │       │   │   ├── reload.md
│   │   │   │   │       │   │   ├── setproperties.md
│   │   │   │   │       │   │   ├── toggle.md
│   │   │   │   │       │   │   ├── update.md
│   │   │   │   │       │   │   ├── updateproperty.md
│   │   │   │   │       │   │   └── valid.md
│   │   │   │   │       │   ├── test-model/
│   │   │   │   │       │   │   ├── debug.md
│   │   │   │   │       │   │   ├── index.md
│   │   │   │   │       │   │   └── raised.md
│   │   │   │   │       │   ├── test-model-configuration/
│   │   │   │   │       │   │   ├── afterall.md
│   │   │   │   │       │   │   ├── beforeall.md
│   │   │   │   │       │   │   ├── index.md
│   │   │   │   │       │   │   ├── packagesetup.md
│   │   │   │   │       │   │   ├── packageteardown.md
│   │   │   │   │       │   │   ├── setup.md
│   │   │   │   │       │   │   └── teardown.md
│   │   │   │   │       │   └── view-helpers/
│   │   │   │   │       │       ├── authenticitytokenfield.md
│   │   │   │   │       │       ├── autolink.md
│   │   │   │   │       │       ├── buttontag.md
│   │   │   │   │       │       ├── buttonto.md
│   │   │   │   │       │       ├── checkbox.md
│   │   │   │   │       │       ├── checkboxtag.md
│   │   │   │   │       │       ├── contentfor.md
│   │   │   │   │       │       ├── contentforlayout.md
│   │   │   │   │       │       ├── csrfmetatags.md
│   │   │   │   │       │       ├── cycle.md
│   │   │   │   │       │       ├── dateselect.md
│   │   │   │   │       │       ├── dateselecttags.md
│   │   │   │   │       │       ├── datetimeselect.md
│   │   │   │   │       │       ├── datetimeselecttags.md
│   │   │   │   │       │       ├── dayselecttag.md
│   │   │   │   │       │       ├── endformtag.md
│   │   │   │   │       │       ├── errormessageon.md
│   │   │   │   │       │       ├── errormessagesfor.md
│   │   │   │   │       │       ├── filefield.md
│   │   │   │   │       │       ├── filefieldtag.md
│   │   │   │   │       │       ├── flashmessages.md
│   │   │   │   │       │       ├── hasmanycheckbox.md
│   │   │   │   │       │       ├── hasmanyradiobutton.md
│   │   │   │   │       │       ├── hiddenfield.md
│   │   │   │   │       │       ├── hiddenfieldtag.md
│   │   │   │   │       │       ├── highlight.md
│   │   │   │   │       │       ├── hourselecttag.md
│   │   │   │   │       │       ├── imagetag.md
│   │   │   │   │       │       ├── includecontent.md
│   │   │   │   │       │       ├── includedinobject.md
│   │   │   │   │       │       ├── includelayout.md
│   │   │   │   │       │       ├── includepartial.md
│   │   │   │   │       │       ├── index.md
│   │   │   │   │       │       ├── javascriptincludetag.md
│   │   │   │   │       │       ├── linkto.md
│   │   │   │   │       │       ├── mailto.md
│   │   │   │   │       │       ├── minuteselecttag.md
│   │   │   │   │       │       ├── monthselecttag.md
│   │   │   │   │       │       ├── paginationlinks.md
│   │   │   │   │       │       ├── passwordfield.md
│   │   │   │   │       │       ├── passwordfieldtag.md
│   │   │   │   │       │       ├── radiobutton.md
│   │   │   │   │       │       ├── radiobuttontag.md
│   │   │   │   │       │       ├── resetcycle.md
│   │   │   │   │       │       ├── secondselecttag.md
│   │   │   │   │       │       ├── select.md
│   │   │   │   │       │       ├── selecttag.md
│   │   │   │   │       │       ├── simpleformat.md
│   │   │   │   │       │       ├── startformtag.md
│   │   │   │   │       │       ├── striplinks.md
│   │   │   │   │       │       ├── striptags.md
│   │   │   │   │       │       ├── stylesheetlinktag.md
│   │   │   │   │       │       ├── submittag.md
│   │   │   │   │       │       ├── textarea.md
│   │   │   │   │       │       ├── textareatag.md
│   │   │   │   │       │       ├── textfield.md
│   │   │   │   │       │       ├── textfieldtag.md
│   │   │   │   │       │       ├── timeselect.md
│   │   │   │   │       │       ├── timeselecttags.md
│   │   │   │   │       │       └── yearselecttag.md
│   │   │   │   │       ├── v3-0-0/
│   │   │   │   │       │   ├── configuration/
│   │   │   │   │       │   │   ├── addformat.md
│   │   │   │   │       │   │   ├── collection.md
│   │   │   │   │       │   │   ├── constraints.md
│   │   │   │   │       │   │   ├── controller.md
│   │   │   │   │       │   │   ├── delete.md
│   │   │   │   │       │   │   ├── end.md
│   │   │   │   │       │   │   ├── get.md
│   │   │   │   │       │   │   ├── index.md
│   │   │   │   │       │   │   ├── mapper.md
│   │   │   │   │       │   │   ├── member.md
│   │   │   │   │       │   │   ├── namespace.md
│   │   │   │   │       │   │   ├── package.md
│   │   │   │   │       │   │   ├── patch.md
│   │   │   │   │       │   │   ├── post.md
│   │   │   │   │       │   │   ├── put.md
│   │   │   │   │       │   │   ├── resource.md
│   │   │   │   │       │   │   ├── resources.md
│   │   │   │   │       │   │   ├── root.md
│   │   │   │   │       │   │   ├── scope.md
│   │   │   │   │       │   │   ├── set.md
│   │   │   │   │       │   │   └── wildcard.md
│   │   │   │   │       │   ├── controller/
│   │   │   │   │       │   │   ├── authenticitytoken.md
│   │   │   │   │       │   │   ├── caches.md
│   │   │   │   │       │   │   ├── clearcachableactions.md
│   │   │   │   │       │   │   ├── filterchain.md
│   │   │   │   │       │   │   ├── filters.md
│   │   │   │   │       │   │   ├── flash.md
│   │   │   │   │       │   │   ├── flashclear.md
│   │   │   │   │       │   │   ├── flashcount.md
│   │   │   │   │       │   │   ├── flashdelete.md
│   │   │   │   │       │   │   ├── flashinsert.md
│   │   │   │   │       │   │   ├── flashisempty.md
│   │   │   │   │       │   │   ├── flashkeep.md
│   │   │   │   │       │   │   ├── flashkeyexists.md
│   │   │   │   │       │   │   ├── getemails.md
│   │   │   │   │       │   │   ├── getfiles.md
│   │   │   │   │       │   │   ├── getredirect.md
│   │   │   │   │       │   │   ├── index.md
│   │   │   │   │       │   │   ├── isajax.md
│   │   │   │   │       │   │   ├── isdelete.md
│   │   │   │   │       │   │   ├── isget.md
│   │   │   │   │       │   │   ├── ishead.md
│   │   │   │   │       │   │   ├── isoptions.md
│   │   │   │   │       │   │   ├── ispatch.md
│   │   │   │   │       │   │   ├── ispost.md
│   │   │   │   │       │   │   ├── isput.md
│   │   │   │   │       │   │   ├── issecure.md
│   │   │   │   │       │   │   ├── onlyprovides.md
│   │   │   │   │       │   │   ├── pagination.md
│   │   │   │   │       │   │   ├── processaction.md
│   │   │   │   │       │   │   ├── processrequest.md
│   │   │   │   │       │   │   ├── protectsfromforgery.md
│   │   │   │   │       │   │   ├── provides.md
│   │   │   │   │       │   │   ├── redirectto.md
│   │   │   │   │       │   │   ├── rendernothing.md
│   │   │   │   │       │   │   ├── renderpartial.md
│   │   │   │   │       │   │   ├── rendertext.md
│   │   │   │   │       │   │   ├── renderview.md
│   │   │   │   │       │   │   ├── renderwith.md
│   │   │   │   │       │   │   ├── response.md
│   │   │   │   │       │   │   ├── sendemail.md
│   │   │   │   │       │   │   ├── sendfile.md
│   │   │   │   │       │   │   ├── setfilterchain.md
│   │   │   │   │       │   │   ├── setflashstorage.md
│   │   │   │   │       │   │   ├── setpagination.md
│   │   │   │   │       │   │   ├── setresponse.md
│   │   │   │   │       │   │   ├── setverificationchain.md
│   │   │   │   │       │   │   ├── useslayout.md
│   │   │   │   │       │   │   ├── verificationchain.md
│   │   │   │   │       │   │   └── verifies.md
│   │   │   │   │       │   ├── global-helpers/
│   │   │   │   │       │   │   ├── capitalize.md
│   │   │   │   │       │   │   ├── controller.md
│   │   │   │   │       │   │   ├── deobfuscateparam.md
│   │   │   │   │       │   │   ├── distanceoftimeinwords.md
│   │   │   │   │       │   │   ├── excerpt.md
│   │   │   │   │       │   │   ├── humanize.md
│   │   │   │   │       │   │   ├── hyphenize.md
│   │   │   │   │       │   │   ├── index.md
│   │   │   │   │       │   │   ├── mimetypes.md
│   │   │   │   │       │   │   ├── model.md
│   │   │   │   │       │   │   ├── obfuscateparam.md
│   │   │   │   │       │   │   ├── pluginnames.md
│   │   │   │   │       │   │   ├── pluralize.md
│   │   │   │   │       │   │   ├── singularize.md
│   │   │   │   │       │   │   ├── timeagoinwords.md
│   │   │   │   │       │   │   ├── timeuntilinwords.md
│   │   │   │   │       │   │   ├── titleize.md
│   │   │   │   │       │   │   ├── truncate.md
│   │   │   │   │       │   │   ├── urlfor.md
│   │   │   │   │       │   │   └── wordtruncate.md
│   │   │   │   │       │   ├── index.md
│   │   │   │   │       │   ├── migrator/
│   │   │   │   │       │   │   ├── addcolumn.md
│   │   │   │   │       │   │   ├── addforeignkey.md
│   │   │   │   │       │   │   ├── addindex.md
│   │   │   │   │       │   │   ├── addrecord.md
│   │   │   │   │       │   │   ├── addreference.md
│   │   │   │   │       │   │   ├── biginteger.md
│   │   │   │   │       │   │   ├── binary.md
│   │   │   │   │       │   │   ├── boolean.md
│   │   │   │   │       │   │   ├── change.md
│   │   │   │   │       │   │   ├── changecolumn.md
│   │   │   │   │       │   │   ├── changetable.md
│   │   │   │   │       │   │   ├── char.md
│   │   │   │   │       │   │   ├── column.md
│   │   │   │   │       │   │   ├── create.md
│   │   │   │   │       │   │   ├── createmigration.md
│   │   │   │   │       │   │   ├── createtable.md
│   │   │   │   │       │   │   ├── createview.md
│   │   │   │   │       │   │   ├── date.md
│   │   │   │   │       │   │   ├── datetime.md
│   │   │   │   │       │   │   ├── decimal.md
│   │   │   │   │       │   │   ├── down.md
│   │   │   │   │       │   │   ├── dropforeignkey.md
│   │   │   │   │       │   │   ├── dropreference.md
│   │   │   │   │       │   │   ├── droptable.md
│   │   │   │   │       │   │   ├── dropview.md
│   │   │   │   │       │   │   ├── execute.md
│   │   │   │   │       │   │   ├── float.md
│   │   │   │   │       │   │   ├── getavailablemigrations.md
│   │   │   │   │       │   │   ├── getcurrentmigrationversion.md
│   │   │   │   │       │   │   ├── index.md
│   │   │   │   │       │   │   ├── integer.md
│   │   │   │   │       │   │   ├── migrateto.md
│   │   │   │   │       │   │   ├── migratetolatest.md
│   │   │   │   │       │   │   ├── primarykey.md
│   │   │   │   │       │   │   ├── redomigration.md
│   │   │   │   │       │   │   ├── references.md
│   │   │   │   │       │   │   ├── removecolumn.md
│   │   │   │   │       │   │   ├── removeindex.md
│   │   │   │   │       │   │   ├── removerecord.md
│   │   │   │   │       │   │   ├── renamecolumn.md
│   │   │   │   │       │   │   ├── renametable.md
│   │   │   │   │       │   │   ├── string.md
│   │   │   │   │       │   │   ├── text.md
│   │   │   │   │       │   │   ├── time.md
│   │   │   │   │       │   │   ├── timestamp.md
│   │   │   │   │       │   │   ├── timestamps.md
│   │   │   │   │       │   │   ├── uniqueidentifier.md
│   │   │   │   │       │   │   ├── up.md
│   │   │   │   │       │   │   └── updaterecord.md
│   │   │   │   │       │   ├── miscellaneous/
│   │   │   │   │       │   │   ├── announce.md
│   │   │   │   │       │   │   ├── assert.md
│   │   │   │   │       │   │   ├── fail.md
│   │   │   │   │       │   │   ├── getroutes.md
│   │   │   │   │       │   │   └── index.md
│   │   │   │   │       │   ├── model-class/
│   │   │   │   │       │   │   ├── average.md
│   │   │   │   │       │   │   ├── columndataforproperty.md
│   │   │   │   │       │   │   ├── columnforproperty.md
│   │   │   │   │       │   │   ├── columnnames.md
│   │   │   │   │       │   │   ├── columns.md
│   │   │   │   │       │   │   ├── count.md
│   │   │   │   │       │   │   ├── create.md
│   │   │   │   │       │   │   ├── deleteall.md
│   │   │   │   │       │   │   ├── deletebykey.md
│   │   │   │   │       │   │   ├── deleteone.md
│   │   │   │   │       │   │   ├── exists.md
│   │   │   │   │       │   │   ├── findall.md
│   │   │   │   │       │   │   ├── findallkeys.md
│   │   │   │   │       │   │   ├── findbykey.md
│   │   │   │   │       │   │   ├── findfirst.md
│   │   │   │   │       │   │   ├── findlastone.md
│   │   │   │   │       │   │   ├── findone.md
│   │   │   │   │       │   │   ├── gettablenameprefix.md
│   │   │   │   │       │   │   ├── index.md
│   │   │   │   │       │   │   ├── invokewithtransaction.md
│   │   │   │   │       │   │   ├── isclass.md
│   │   │   │   │       │   │   ├── isinstance.md
│   │   │   │   │       │   │   ├── maximum.md
│   │   │   │   │       │   │   ├── minimum.md
│   │   │   │   │       │   │   ├── new.md
│   │   │   │   │       │   │   ├── onmissingmethod.md
│   │   │   │   │       │   │   ├── primarykey.md
│   │   │   │   │       │   │   ├── primarykeys.md
│   │   │   │   │       │   │   ├── propertynames.md
│   │   │   │   │       │   │   ├── save.md
│   │   │   │   │       │   │   ├── sum.md
│   │   │   │   │       │   │   ├── tablename.md
│   │   │   │   │       │   │   ├── updateall.md
│   │   │   │   │       │   │   ├── updatebykey.md
│   │   │   │   │       │   │   ├── updateone.md
│   │   │   │   │       │   │   └── validationtypeforproperty.md
│   │   │   │   │       │   ├── model-configuration/
│   │   │   │   │       │   │   ├── accessibleproperties.md
│   │   │   │   │       │   │   ├── aftercreate.md
│   │   │   │   │       │   │   ├── afterdelete.md
│   │   │   │   │       │   │   ├── afterfind.md
│   │   │   │   │       │   │   ├── afterinitialization.md
│   │   │   │   │       │   │   ├── afternew.md
│   │   │   │   │       │   │   ├── aftersave.md
│   │   │   │   │       │   │   ├── afterupdate.md
│   │   │   │   │       │   │   ├── aftervalidation.md
│   │   │   │   │       │   │   ├── aftervalidationoncreate.md
│   │   │   │   │       │   │   ├── aftervalidationonupdate.md
│   │   │   │   │       │   │   ├── automaticvalidations.md
│   │   │   │   │       │   │   ├── beforecreate.md
│   │   │   │   │       │   │   ├── beforedelete.md
│   │   │   │   │       │   │   ├── beforesave.md
│   │   │   │   │       │   │   ├── beforeupdate.md
│   │   │   │   │       │   │   ├── beforevalidation.md
│   │   │   │   │       │   │   ├── beforevalidationoncreate.md
│   │   │   │   │       │   │   ├── beforevalidationonupdate.md
│   │   │   │   │       │   │   ├── belongsto.md
│   │   │   │   │       │   │   ├── datasource.md
│   │   │   │   │       │   │   ├── hasmany.md
│   │   │   │   │       │   │   ├── hasone.md
│   │   │   │   │       │   │   ├── index.md
│   │   │   │   │       │   │   ├── nestedproperties.md
│   │   │   │   │       │   │   ├── property.md
│   │   │   │   │       │   │   ├── protectedproperties.md
│   │   │   │   │       │   │   ├── setprimarykey.md
│   │   │   │   │       │   │   ├── setprimarykeys.md
│   │   │   │   │       │   │   ├── settablenameprefix.md
│   │   │   │   │       │   │   ├── table.md
│   │   │   │   │       │   │   ├── validate.md
│   │   │   │   │       │   │   ├── validateoncreate.md
│   │   │   │   │       │   │   ├── validateonupdate.md
│   │   │   │   │       │   │   ├── validatesconfirmationof.md
│   │   │   │   │       │   │   ├── validatesexclusionof.md
│   │   │   │   │       │   │   ├── 

================================================
FILE CONTENTS
================================================

================================================
FILE: .ai/README.md
================================================
# Wheels Framework Reference Docs

Searchable reference for CFML language and Wheels framework patterns.

## CFML Language (`cfml/`)

- `syntax/` — CFScript basics, tags vs script, comments, hash escaping
- `data-types/` — Variables, scopes, arrays, strings, structures, numbers
- `control-flow/` — Conditionals, loops, exception handling
- `components/` — CFC basics, functions, properties
- `database/` — Query fundamentals
- `advanced/` — Closures, advanced features
- `best-practices/` — Modern CFML patterns

## Wheels Framework (`wheels/`)

- `models/` — ORM architecture, associations, validations, performance
- `controllers/` — Actions, filters, rendering, security, parameters
- `views/` — Layouts, partials, form helpers, link helpers, assets
- `database/` — Migrations, associations, queries, validations
- `configuration/` — Routing, environments, settings
- `core-concepts/` — MVC architecture, ORM mapping, routing conventions
- `cli/` — Generators, server management
- `communication/` — Email sending
- `files/` — File uploads and downloads
- `jobs/` — Background job processing
- `mcp/` — AI agent integration via LuCLI stdio MCP
- `middleware/` — Request pipeline (rate limiting, tenant resolver, pipeline structure)
- `packages/` — First-party packages (sentry, hotwire, basecoat) and activation model
- `security/` — CSRF, authentication, authorization
- `patterns/` — Common development patterns, validation templates
- `snippets/` — Code examples for all component types
- `integration/` — Frontend stack (Tailwind, Alpine, HTMX)
- `testing/` — Testing strategies and patterns
- `troubleshooting/` — Common errors and debugging


================================================
FILE: .ai/cfml/README.md
================================================
# CFML Language Documentation

This section contains documentation for core CFML (ColdFusion Markup Language) concepts, syntax, and features. This is foundational knowledge that applies to all CFML frameworks including Wheels.

## Directory Structure

### [Syntax](./syntax/)
Core CFML syntax and language fundamentals:
- **Basic Syntax** - Variables, operators, basic constructs
- **CFScript vs Tags** - Modern CFScript vs traditional tag-based syntax
- **Comments** - Commenting conventions and best practices
- **Hash Escaping** - Using literal # symbols vs variable interpolation (##FF0000, #anchor)

### [Data Types](./data-types/)
CFML's built-in data types and their usage:
- **Variables** - Variable declaration, scoping, and lifecycle
- **Variable Scopes** - Understanding CFML's various scopes
- **Arrays** - Array creation, methods, and iteration
- **Strings** - String manipulation, interpolation, and functions
- **Structures** - Struct creation and manipulation
- **Numbers** - Numeric types and operations

### [Control Flow](./control-flow/)
Program flow control structures:
- **Conditionals** - if/else, switch statements, ternary operators
- **Loops** - for, while, loop structures and iteration
- **Exception Handling** - try/catch blocks and error management

### [Components](./components/)
CFML Component (CFC) fundamentals:
- **Component Basics** - Creating and using CFCs
- **Functions** - Method definition, parameters, return values
- **Properties** - Component properties and accessors

### [Database](./database/)
Database interaction with CFML:
- **Query Basics** - cfquery, queryExecute, and result handling

### [Advanced](./advanced/)
Advanced CFML concepts:
- **Closures** - Function expressions and anonymous functions

### [Best Practices](./best-practices/)
Modern CFML development patterns:
- **Modern Patterns** - Contemporary CFML coding standards and practices

## Using This Documentation

This CFML documentation is designed to provide foundational knowledge that complements the Wheels framework documentation. When working with Wheels:

1. Start here for core language concepts
2. Reference the [Wheels documentation](../wheels/) for framework-specific patterns
3. Use both together to understand how CFML constructs work within the Wheels framework

## Related Documentation

- [Wheels Framework Documentation](../wheels/) - Framework-specific patterns and conventions
- [CFML Reference](https://cfdocs.org/) - Complete CFML function and tag reference
- [Modern CFML Guide](https://github.com/ColdBox/modern-cfml) - Contemporary CFML development practices

================================================
FILE: .ai/cfml/advanced/closures.md
================================================
# Closures

## Overview
Closures in CFML are functions that have access to variables in their lexical environment. They enable functional programming patterns, delayed execution, and powerful abstractions. Closures retain references to their surrounding scope even after the outer function has finished executing.

## Syntax
```cfscript
// Anonymous closure assigned to variable
var closure = function(params) { return result; };

// Arrow function syntax (modern engines)
var arrowClosure = (params) => result;
```

## Examples

### Basic Closure with Lexical Scope Access
```cfscript
function createGreeter() {
    var greeting = "Hello";

    // Closure has access to 'greeting' variable
    var greeterClosure = function(name) {
        return greeting & ", " & name & "!";
    };

    return greeterClosure;
}

greet = createGreeter();
message = greet("Luis"); // "Hello, Luis!"
```

### Higher-Order Functions
```cfscript
function makeAdder(required numeric x) {
    return function(required numeric y) {
        return x + y; // 'x' from outer scope
    };
}

addFive = makeAdder(5);
result = addFive(10); // 15

// Create multiple specialized functions
addOne = makeAdder(1);
addTen = makeAdder(10);
```

### Functional Array Operations
```cfscript
products = [
    { name: "Laptop", price: 999, category: "electronics" },
    { name: "Book", price: 25, category: "media" },
    { name: "Mouse", price: 45, category: "electronics" }
];

// Filter using closure
expensiveItems = products.filter(function(item) {
    return item.price > 50;
});

// Map with closure
productNames = products.map(function(item) {
    return item.name;
});

// Reduce with closure
totalValue = products.reduce(function(sum, item) {
    return sum + item.price;
}, 0);
```

### Event Handler Pattern
```cfscript
function createEventHandler(eventType) {
    var timestamp = now();

    return function(data) {
        writeLog("Event: #eventType# at #timestamp#");
        writeLog("Data: #serializeJSON(data)#");
        // Process event data
    };
}

clickHandler = createEventHandler("click");
submitHandler = createEventHandler("submit");

// Later use
clickHandler({ x: 100, y: 200 });
```

### Arrow Functions (Modern Syntax)
```cfscript
// Simple arrow function
square = (x) => x * x;

// Multi-parameter arrow function
add = (x, y) => x + y;

// Complex arrow function with block body
processUser = (user) => {
    if (user.isActive) {
        return user.name.toUpperCase();
    } else {
        return "Inactive: " & user.name;
    }
};

// Array operations with arrow functions
numbers = [1, 2, 3, 4, 5];
doubled = numbers.map((n) => n * 2);
evens = numbers.filter((n) => n % 2 == 0);
```

### Closure Scope Demonstration
```cfscript
function outerFunction(outerParam) {
    var outerVar = "outer";

    function innerFunction(innerParam) {
        var innerVar = "inner";

        // Closure has access to all scopes
        return function(closureParam) {
            return outerParam & " " & outerVar & " " & innerParam & " " & innerVar & " " & closureParam;
        };
    }

    return innerFunction("middle");
}

myClosure = outerFunction("first");
result = myClosure("last"); // "first outer middle inner last"
```

### Practical: Configuration Builder Pattern
```cfscript
function createConfigBuilder() {
    var config = {};

    return {
        setDatabase: function(dsn) {
            config.database = dsn;
            return this; // Enable chaining
        },

        setCache: function(provider) {
            config.cache = provider;
            return this;
        },

        setTimeout: function(seconds) {
            config.timeout = seconds;
            return this;
        },

        build: function() {
            return duplicate(config); // Return copy
        }
    };
}

// Usage with method chaining
appConfig = createConfigBuilder()
    .setDatabase("myDB")
    .setCache("redis")
    .setTimeout(30)
    .build();
```

### Delayed Execution Pattern
```cfscript
function createValidator() {
    var rules = [];

    return {
        addRule: function(ruleFn) {
            rules.append(ruleFn);
            return this;
        },

        validate: function(data) {
            for (var rule in rules) {
                if (!rule(data)) {
                    return false;
                }
            }
            return true;
        }
    };
}

// Setup validation rules
validator = createValidator()
    .addRule(function(data) { return structKeyExists(data, "email"); })
    .addRule(function(data) { return len(data.email) > 0; })
    .addRule(function(data) { return find("@", data.email); });

// Later validation
isValid = validator.validate({ email: "user@domain.com" });
```

## Key Points
- Closures retain access to their lexical environment
- Variables from outer scopes are "captured" by reference
- Enable functional programming patterns (map, filter, reduce)
- Perfect for event handlers and callback functions
- Arrow functions provide concise syntax (Lucee/Adobe 2018+)
- Useful for creating specialized functions and configuration builders

## Closure Scope Chain
1. Closure's local scope
2. Closure's arguments scope
3. Outer function's local scope
4. Owner function's local scope
5. ColdFusion built-in scopes

## Common Use Cases
- **Event Handlers**: Capture context for event processing
- **Functional Programming**: Array transformations and filtering
- **Factory Functions**: Create specialized function instances
- **Configuration**: Build objects with captured settings
- **Partial Application**: Create functions with pre-filled parameters

## Performance Considerations
- Closures maintain references to outer scope variables
- Can prevent garbage collection of outer scope
- Use sparingly in memory-constrained environments
- Arrow functions may have slight performance benefits

## Related Concepts
- [Functions](../components/functions.md)
- [Array Methods](../data-types/arrays/array-methods.md)
- [Variable Scopes](../data-types/variable-scopes.md)

================================================
FILE: .ai/cfml/best-practices/modern-patterns.md
================================================
# Modern CFML Patterns

## Overview
Modern CFML development emphasizes script syntax, functional programming patterns, component-based architecture, and best practices that align with contemporary software development principles.

## Key Principles
- Prefer script syntax over tag-based syntax for business logic
- Use functional programming patterns where appropriate
- Follow object-oriented principles (encapsulation, inheritance, composition)
- Implement dependency injection for loose coupling
- Write testable, maintainable code

## Examples

### Script vs Tag Syntax
```cfscript
// MODERN: Script syntax (preferred)
component accessors="true" {

    property name="userService" inject="UserService";

    function getUsers(filters = {}) {
        if (!structKeyExists(filters, "active")) {
            filters.active = true;
        }

        return userService.findAll(filters);
    }
}

// LEGACY: Tag syntax (avoid for business logic)
<cfcomponent>
    <cffunction name="getUsers">
        <cfargument name="filters" default="#{}#">

        <cfif NOT structKeyExists(arguments.filters, "active")>
            <cfset arguments.filters.active = true>
        </cfif>

        <cfreturn variables.userService.findAll(arguments.filters)>
    </cffunction>
</cfcomponent>
```

### Functional Programming Patterns
```cfscript
// MODERN: Functional approach
function processOrderData(orders) {
    return orders
        .filter((order) => order.isValid)
        .map((order) => order.calculateTotal())
        .reduce((sum, total) => sum + total, 0);
}

// Use closures for configuration
function createValidator(rules) {
    return function(data) {
        return rules.every((rule) => rule(data));
    };
}

emailValidator = createValidator([
    (data) => structKeyExists(data, "email"),
    (data) => len(data.email) > 0,
    (data) => find("@", data.email) > 0
]);
```

### Component-Based Architecture
```cfscript
// MODERN: Single Responsibility Principle
component singleton {

    property name="logger" inject="Logger";
    property name="validator" inject="DataValidator";

    function processUser(required userData) {
        // Validate input
        if (!validator.isValid(userData)) {
            throw("Invalid user data");
        }

        // Log activity
        logger.info("Processing user: " & userData.id);

        // Delegate to specialized services
        var user = userFactory.create(userData);
        var result = userRepository.save(user);

        return result;
    }
}
```

### Dependency Injection Pattern
```cfscript
// MODERN: Constructor injection
component accessors="true" {

    property name="userRepository";
    property name="emailService";
    property name="logger";

    function init(
        required userRepository,
        required emailService,
        required logger
    ) {
        variables.userRepository = arguments.userRepository;
        variables.emailService = arguments.emailService;
        variables.logger = arguments.logger;

        return this;
    }

    function createUser(userData) {
        try {
            var user = userRepository.create(userData);
            emailService.sendWelcomeEmail(user);
            logger.info("User created: " & user.getId());
            return user;
        } catch (any e) {
            logger.error("User creation failed", e);
            rethrow;
        }
    }
}
```

### Error Handling Best Practices
```cfscript
// MODERN: Comprehensive error handling
component {

    function processPayment(paymentData) {
        try {
            // Validate input
            validatePaymentData(paymentData);

            // Process payment
            var result = paymentGateway.charge(paymentData);

            // Log success
            auditLogger.logPayment(result);

            return {
                success: true,
                transactionId: result.id,
                message: "Payment processed successfully"
            };

        } catch (ValidationError e) {
            return {
                success: false,
                error: "validation",
                message: e.message
            };
        } catch (PaymentError e) {
            return {
                success: false,
                error: "payment",
                message: "Payment processing failed"
            };
        } catch (any e) {
            logger.error("Unexpected payment error", e);
            return {
                success: false,
                error: "system",
                message: "System error occurred"
            };
        }
    }
}
```

### Configuration Management
```cfscript
// MODERN: Environment-based configuration
component singleton {

    property name="config";

    function init() {
        loadConfiguration();
        return this;
    }

    private function loadConfiguration() {
        variables.config = {
            database: {
                host: getSystemSetting("DB_HOST", "localhost"),
                port: getSystemSetting("DB_PORT", "3306"),
                database: getSystemSetting("DB_NAME", "myapp"),
                username: getSystemSetting("DB_USER", ""),
                password: getSystemSetting("DB_PASSWORD", "")
            },
            cache: {
                provider: getSystemSetting("CACHE_PROVIDER", "memory"),
                ttl: val(getSystemSetting("CACHE_TTL", "3600"))
            },
            logging: {
                level: getSystemSetting("LOG_LEVEL", "INFO"),
                file: getSystemSetting("LOG_FILE", "application.log")
            }
        };
    }

    function get(required string key, defaultValue = "") {
        return structFindKey(variables.config, arguments.key)?[1].value ?: arguments.defaultValue;
    }
}
```

### Testing-Friendly Design
```cfscript
// MODERN: Testable component design
component {

    property name="httpService" inject="HttpService";
    property name="cacheService" inject="CacheService";

    function getUserData(required numeric userID) {
        // Check cache first
        var cacheKey = "user_" & arguments.userID;
        var cachedData = cacheService.get(cacheKey);

        if (!isNull(cachedData)) {
            return cachedData;
        }

        // Fetch from API
        var userData = httpService.get("/api/users/" & arguments.userID);

        // Cache for future use
        cacheService.set(cacheKey, userData, 300); // 5 minutes

        return userData;
    }
}
```

### Fluent Interface Pattern
```cfscript
// MODERN: Method chaining for readable APIs
component {

    property name="query" default="";
    property name="params" default="[]";

    function select(columns) {
        variables.query = "SELECT " & arguments.columns;
        return this;
    }

    function from(table) {
        variables.query &= " FROM " & arguments.table;
        return this;
    }

    function where(condition, value) {
        variables.query &= " WHERE " & arguments.condition;
        variables.params.append(arguments.value);
        return this;
    }

    function execute() {
        return queryExecute(variables.query, variables.params);
    }
}

// Usage
results = queryBuilder
    .select("id, name, email")
    .from("users")
    .where("active = ?", true)
    .execute();
```

### Resource Management
```cfscript
// MODERN: Using try/finally for resource cleanup
function processFileWithCleanup(filePath) {
    var fileHandle = "";

    try {
        fileHandle = fileOpen(filePath, "read");

        var results = [];
        while (!fileIsEOF(fileHandle)) {
            var line = fileReadLine(fileHandle);
            results.append(processLine(line));
        }

        return results;
    } finally {
        // Always cleanup resources
        if (isObject(fileHandle)) {
            fileClose(fileHandle);
        }
    }
}
```

## Modern Development Practices

### 1. Variable Scoping
```cfscript
// MODERN: Explicit scoping
function processData(data) {
    var result = [];  // Explicitly scoped

    for (var item in arguments.data) {
        var processed = transformItem(item);  // Local scope
        result.append(processed);
    }

    return result;
}
```

### 2. Type Hinting
```cfscript
// MODERN: Use type hints for clarity
public User function createUser(
    required string email,
    required string firstName,
    required string lastName,
    boolean active = true
) {
    return new User(arguments.email, arguments.firstName, arguments.lastName, arguments.active);
}
```

### 3. Null Safety
```cfscript
// MODERN: Safe navigation and null handling
function getUserDisplayName(user) {
    return user?.profile?.displayName
        ?: user?.firstName & " " & user?.lastName
        ?: user?.email
        ?: "Unknown User";
}
```

### 4. Configuration Over Convention
```cfscript
// MODERN: Configurable behavior
component {

    function init(config = {}) {
        variables.config = {
            timeout: config.timeout ?: 30,
            retries: config.retries ?: 3,
            cache: config.cache ?: true
        };
        return this;
    }
}
```

## Anti-Patterns to Avoid

### 1. God Objects
```cfscript
// AVOID: Single component doing everything
component {
    function processUser() { /* 200+ lines */ }
    function sendEmails() { /* 100+ lines */ }
    function generateReports() { /* 150+ lines */ }
    function handlePayments() { /* 300+ lines */ }
}
```

### 2. Hard-coded Dependencies
```cfscript
// AVOID: Hard-coded dependencies
component {
    function processOrder() {
        var paymentService = new PaymentService();  // Hard-coded!
        var emailService = new EmailService();      // Hard-coded!
    }
}
```

### 3. Mixed Concerns
```cfscript
// AVOID: Business logic mixed with presentation
function getUserList() {
    var users = queryExecute("SELECT * FROM users");
    var html = "<table>";
    for (var user in users) {
        html &= "<tr><td>" & user.name & "</td></tr>";  // Presentation logic!
    }
    html &= "</table>";
    return html;
}
```

## Key Takeaways
- **Script syntax** for business logic components
- **Functional patterns** for data transformation
- **Dependency injection** for loose coupling
- **Explicit scoping** for performance and clarity
- **Type hints** for better documentation
- **Error handling** with specific catch blocks
- **Resource cleanup** in finally blocks
- **Environment-based** configuration

## Related Concepts
- [Component Basics](../components/component-basics.md)
- [Functions](../components/functions.md)
- [Exception Handling](../control-flow/exception-handling.md)
- [Closures](../advanced/closures.md)

================================================
FILE: .ai/cfml/best-practices/performance.md
================================================
# Performance Best Practices

## Overview
CFML performance optimization involves proper variable scoping, efficient database queries, appropriate caching strategies, and understanding engine-specific behaviors. Modern CFML engines provide many optimization opportunities.

## Key Performance Areas
- Variable scoping and memory management
- Database query optimization
- Caching strategies
- String and array operations
- Component instantiation patterns

## Examples

### Variable Scoping Performance
```cfscript
// SLOW: Unscoped variables require scope chain lookup
function processData(data) {
    result = [];  // Searches through scope chain
    for (item in arguments.data) {
        processedItem = processItem(item);  // Scope chain lookup
        result.append(processedItem);
    }
    return result;
}

// FAST: Explicitly scoped variables
function processData(data) {
    var result = [];  // Local scope - direct access
    for (var item in arguments.data) {
        var processedItem = processItem(item);  // Local scope
        result.append(processedItem);
    }
    return result;
}
```

### Database Query Optimization
```cfscript
// SLOW: Multiple queries in loop
function getUsersWithProfiles(userIDs) {
    var users = [];
    for (var id in arguments.userIDs) {
        var user = queryExecute("SELECT * FROM users WHERE id = ?", [id]);
        var profile = queryExecute("SELECT * FROM profiles WHERE user_id = ?", [id]);
        users.append({user: user, profile: profile});
    }
    return users;
}

// FAST: Single query with JOIN
function getUsersWithProfiles(userIDs) {
    var sql = "
        SELECT u.*, p.*
        FROM users u
        LEFT JOIN profiles p ON u.id = p.user_id
        WHERE u.id IN (" & arrayToList(arguments.userIDs) & ")
    ";
    return queryExecute(sql);
}

// BETTER: Parameterized with IN clause
function getUsersWithProfiles(userIDs) {
    var placeholders = arrayMap(arguments.userIDs, function() { return "?"; });
    var sql = "
        SELECT u.*, p.*
        FROM users u
        LEFT JOIN profiles p ON u.id = p.user_id
        WHERE u.id IN (" & arrayToList(placeholders) & ")
    ";
    return queryExecute(sql, arguments.userIDs);
}
```

### Caching Strategies
```cfscript
// Application-level caching
component singleton {

    function getExpensiveData(key) {
        var cacheKey = "expensive_data_" & arguments.key;

        // Check application cache first
        if (structKeyExists(application.cache, cacheKey)) {
            return application.cache[cacheKey];
        }

        // Generate expensive data
        var data = performExpensiveCalculation(arguments.key);

        // Cache for 1 hour
        if (!structKeyExists(application, "cache")) {
            application.cache = {};
        }
        application.cache[cacheKey] = data;

        return data;
    }
}

// Query caching
function getCachedUsers() {
    return queryExecute(
        "SELECT * FROM users WHERE active = 1",
        {},
        {
            cachedwithin: createTimeSpan(0, 1, 0, 0)  // 1 hour
        }
    );
}
```

### String Operations Performance
```cfscript
// SLOW: String concatenation in loop
function buildLargeString(items) {
    var result = "";
    for (var item in arguments.items) {
        result = result & item & chr(13);  // Creates new string each time
    }
    return result;
}

// FAST: Use StringBuilder for large string operations
function buildLargeString(items) {
    var buffer = createObject("java", "java.lang.StringBuilder").init();
    for (var item in arguments.items) {
        buffer.append(item).append(chr(13));
    }
    return buffer.toString();
}

// FASTEST: Use array join for simple concatenation
function buildLargeString(items) {
    return arrayToList(arguments.items, chr(13));
}
```

### Array Operations Performance
```cfscript
// SLOW: Growing array in loop without pre-sizing
function processLargeDataset(data) {
    var results = [];
    for (var item in arguments.data) {
        results.append(processItem(item));  // Array grows dynamically
    }
    return results;
}

// FAST: Pre-size array when length is known
function processLargeDataset(data) {
    var results = arrayNew(1);
    arrayResize(results, arrayLen(arguments.data));  // Pre-allocate space

    var index = 1;
    for (var item in arguments.data) {
        results[index] = processItem(item);
        index++;
    }
    return results;
}
```

### Component Instantiation Performance
```cfscript
// SLOW: Creating new instances repeatedly
function processMultipleItems(items) {
    var results = [];
    for (var item in arguments.items) {
        var processor = new ItemProcessor();  // New instance each time
        results.append(processor.process(item));
    }
    return results;
}

// FAST: Reuse component instances
component {

    property name="itemProcessor";

    function init() {
        variables.itemProcessor = new ItemProcessor();  // Single instance
        return this;
    }

    function processMultipleItems(items) {
        var results = [];
        for (var item in arguments.items) {
            results.append(variables.itemProcessor.process(item));
        }
        return results;
    }
}
```

### Memory Management
```cfscript
// GOOD: Explicit cleanup of large objects
function processLargeFile(filePath) {
    var fileData = fileRead(arguments.filePath);  // Large memory usage

    try {
        var results = processFileData(fileData);
        return results;
    } finally {
        fileData = "";  // Help GC by nullifying large variables
    }
}

// GOOD: Limit result set sizes
function getUsers(filters = {}) {
    // Always include reasonable limits
    if (!structKeyExists(filters, "maxResults")) {
        filters.maxResults = 1000;
    }

    var sql = "SELECT * FROM users WHERE active = 1";
    var params = [];

    if (structKeyExists(filters, "department")) {
        sql &= " AND department = ?";
        params.append(filters.department);
    }

    sql &= " LIMIT " & filters.maxResults;

    return queryExecute(sql, params);
}
```

### Efficient Data Structures
```cfscript
// Use appropriate data structures
component {

    function init() {
        // Use ordered struct for maintaining insertion order
        variables.orderedData = structNew("ordered");

        // Use case-sensitive struct when case matters
        variables.caseSensitiveData = structNew("casesensitive");

        // Use synchronized arrays for thread-safe operations
        variables.threadSafeArray = arrayNew(1, "string", true);

        return this;
    }
}
```

### Lazy Loading Pattern
```cfscript
component {

    property name="expensiveResource";

    function getExpensiveResource() {
        if (!structKeyExists(variables, "expensiveResource")) {
            variables.expensiveResource = loadExpensiveResource();
        }
        return variables.expensiveResource;
    }

    private function loadExpensiveResource() {
        // Expensive initialization only when needed
        return performExpensiveOperation();
    }
}
```

### Bulk Operations
```cfscript
// SLOW: Individual database operations
function updateMultipleUsers(userUpdates) {
    for (var update in arguments.userUpdates) {
        queryExecute(
            "UPDATE users SET name = ? WHERE id = ?",
            [update.name, update.id]
        );
    }
}

// FAST: Batch operations
function updateMultipleUsers(userUpdates) {
    var sql = "UPDATE users SET name = CASE ";
    var params = [];

    for (var update in arguments.userUpdates) {
        sql &= "WHEN id = ? THEN ? ";
        params.append(update.id);
        params.append(update.name);
    }

    sql &= "END WHERE id IN (" & arrayToList(arrayMap(arguments.userUpdates, function(u) { return u.id; })) & ")";

    queryExecute(sql, params);
}
```

## Engine-Specific Performance Tips

### Adobe ColdFusion
- Use `cachedwithin` for query caching
- Enable trusted cache in production
- Use `cfupdate` and `cfinsert` for simple database operations
- Configure JVM heap size appropriately

### Lucee
- Arrays passed by reference (performance benefit)
- Use `cachedWithin` or query caching
- Configure connection pooling in datasources
- Use Lucee-specific functions where available

## Monitoring and Profiling

### Application Monitoring
```cfscript
component {

    function monitoredFunction(data) {
        var startTime = getTickCount();

        try {
            var result = expensiveOperation(data);
            return result;
        } finally {
            var executionTime = getTickCount() - startTime;

            if (executionTime > 5000) {  // Log slow operations
                writeLog(
                    text = "Slow operation detected: #executionTime#ms",
                    type = "warning",
                    file = "performance"
                );
            }
        }
    }
}
```

### Memory Usage Tracking
```cfscript
function memoryIntensiveOperation() {
    var initialMemory = getMemoryUsage();

    // Perform memory-intensive work
    var result = processLargeDataSet();

    var finalMemory = getMemoryUsage();
    var memoryUsed = finalMemory.used - initialMemory.used;

    if (memoryUsed > 100 * 1024 * 1024) {  // 100MB
        writeLog("High memory usage: " & memoryUsed & " bytes");
    }

    return result;
}
```

## Performance Testing
```cfscript
// Simple performance timing
function benchmarkFunction(func, iterations = 1000) {
    var startTime = getTickCount();

    for (var i = 1; i <= iterations; i++) {
        func();
    }

    var totalTime = getTickCount() - startTime;
    var avgTime = totalTime / iterations;

    return {
        totalTime: totalTime,
        averageTime: avgTime,
        iterations: iterations
    };
}
```

## Key Takeaways
- **Always scope variables** explicitly for performance
- **Use appropriate caching** strategies (query, application, session)
- **Minimize database round trips** with JOINs and batch operations
- **Pre-size collections** when possible
- **Reuse component instances** instead of creating new ones
- **Use StringBuilder** for large string operations
- **Monitor and profile** application performance
- **Choose appropriate data structures** for the use case

## Related Concepts
- [Variable Scopes](../data-types/variable-scopes.md)
- [Query Basics](../database/query-basics.md)
- [Components](../components/component-basics.md)
- [Arrays](../data-types/arrays/array-methods.md)

================================================
FILE: .ai/cfml/components/component-basics.md
================================================
# Component Basics

## Overview
Components (CFCs) are CFML's object-oriented constructs that combine data (properties) and behavior (methods). They support inheritance, interfaces, encapsulation, and can be used for web services, ORM entities, and dependency injection.

## Syntax
```cfscript
component [attributes] {
    // properties
    // methods
    // constructor
}
```

## Examples

### Basic Component Structure
```cfscript
/**
 * I represent a user in the system
 * @author Luis Majano
 */
component accessors="true" {

    /**
     * The name of the user
     */
    property name="name";

    /**
     * The age of the user
     */
    property name="age" type="numeric";

    /**
     * Constructor
     */
    function init(required name) {
        variables.name = arguments.name;
        return this;
    }

    function run() {
        // run baby, run!
    }
}
```

### Creating Component Instances
```cfscript
// Using 'new' keyword (calls init() automatically)
user = new User(name="Luis");

// Using createObject() (must call init() manually)
user = createObject("component", "User").init(name="Luis");

// Execute methods
user.run();
```

### Component Scopes
```cfscript
component {

    // Pseudo-constructor: executes when object is created
    this.createdAt = now();
    variables.privateData = "secret";

    function init() {
        // Constructor method
        variables.initialized = true;
        return this;
    }

    function publicMethod() {
        // Accessible from outside (this & variables scope)
        return "public";
    }

    private function privateMethod() {
        // Only accessible internally (variables scope only)
        return "private";
    }
}
```

### Component Attributes
```cfscript
// Multiple attributes
component accessors="true"
         serializable="false"
         extends="BaseUser"
         implements="IUser" {

    property name="firstName";
    property name="lastName";
}

// Interface implementation
component implements="cachebox.system.cache.ICacheProvider" {
    // Must implement interface methods
}
```

### Annotation-Based Attributes
```cfscript
/**
 * My User Component
 * @extends BaseUser
 * @accessors true
 * @serializable true
 */
component {

    /**
     * User's first name
     * @type string
     * @default ""
     */
    property name="firstName";
}
```

### Method Chaining
```cfscript
component {
    property name="value";

    function setValue(required val) {
        variables.value = arguments.val;
        return this; // Enable chaining
    }

    function getValue() {
        return variables.value;
    }
}

// Usage with chaining
obj = new MyClass()
    .setValue("hello")
    .setValue("world");
```

## Key Points
- Components are blueprints for objects (classes)
- Support single inheritance via `extends` attribute
- Can implement multiple interfaces
- **this scope**: Public visibility (external access)
- **variables scope**: Private visibility (internal only)
- **static scope**: Class-level variables/methods (Lucee only)
- Pseudo-constructor executes before init() method
- Components are first-class objects in CFML

## Common Attributes
- `accessors` - Auto-generate getters/setters for properties
- `extends` - Inherit from another component
- `implements` - Implement one or more interfaces
- `persistent` - Make component a Hibernate ORM entity
- `serializable` - Allow serialization to string/binary format
- `output` - Allow output to response stream

## Component Lifecycle
1. `new` or `createObject()` called
2. Pseudo-constructor executes
3. `init()` method called automatically (if using `new`)
4. Object ready for use

## Best Practices
- Always provide a constructor (`init()` method)
- Use `accessors="true"` for automatic property methods
- Document components and methods with JavaDoc syntax
- Follow single responsibility principle
- Use dependency injection for loose coupling
- Prefer composition over inheritance

## Related Concepts
- [Properties](properties.md)
- [Functions](functions.md)

================================================
FILE: .ai/cfml/components/functions.md
================================================
# Component Functions

## Overview
Functions (methods) in CFML components define the behavior and actions objects can perform. They support various access modifiers, return types, dynamic arguments, and can be manipulated at runtime due to CFML's dynamic nature.

## Syntax
```cfscript
[access] [modifier] [returnType] function functionName([arguments]) {
    // function body
    [return value;]
}
```

## Examples

### Basic Function Definitions
```cfscript
component {

    function hello() {
        return "Hello, World!";
    }

    public string function greet(required string name) {
        return "Hello, #arguments.name#!";
    }

    private void function logMessage(required string message) {
        writeLog(arguments.message);
    }
}
```

### Function Access Modifiers
```cfscript
component {

    // Public - accessible from outside
    public function publicMethod() {
        return "accessible everywhere";
    }

    // Private - internal access only
    private function privateMethod() {
        return "internal only";
    }

    // Package - same package access
    package function packageMethod() {
        return "package level access";
    }

    // Remote - accessible via web services/REST
    remote function remoteMethod() {
        return "web service accessible";
    }
}
```

### Function Modifiers
```cfscript
component {

    // Static function (Lucee, Adobe 2021+)
    public static function createInstance(required name) {
        return new User(arguments.name);
    }

    // Final function (cannot be overridden)
    public final function getId() {
        return variables.id;
    }

    // Abstract function (must be implemented by subclasses)
    public abstract function processData();
}
```

### Dynamic Arguments
```cfscript
component {

    // Function accepts any number of arguments
    function flexibleFunction() {
        writeDump(arguments); // All passed arguments

        for (var key in arguments) {
            writeOutput("Arg #key#: #arguments[key]#");
        }
    }

    // Named and positional argument support
    function calculate(required numeric a, required numeric b) {
        return a + b;
    }
}

// Usage examples
obj = new MyComponent();

// Positional arguments
result = obj.calculate(10, 20);

// Named arguments
result = obj.calculate(a=10, b=20);

// Argument collection (struct)
args = {a: 10, b: 20};
result = obj.calculate(argumentCollection=args);

// Argument collection (array)
args = [10, 20];
result = obj.calculate(argumentCollection=args);
```

### Function Return Types and Documentation
```cfscript
component {

    /**
     * Calculates user's age based on birth date
     *
     * @birthDate The user's birth date
     * @return The calculated age in years
     */
    public numeric function calculateAge(required date birthDate) {
        var today = now();
        return dateDiff("yyyy", arguments.birthDate, today);
    }

    /**
     * Validates email address format
     *
     * @email Email address to validate
     * @return True if valid, false otherwise
     */
    public boolean function isValidEmail(required string email) {
        return reFindNoCase("^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}$", arguments.email);
    }
}
```

### Function Scoping and Local Variables
```cfscript
component {

    function processData(required array data) {
        // Always var scope local variables
        var result = [];
        var i = 0;

        // Alternative local scope syntax
        local.processedCount = 0;
        local.errors = [];

        for (var item in arguments.data) {
            try {
                var processed = processItem(item);
                result.append(processed);
                local.processedCount++;
            }
            catch (any e) {
                local.errors.append(e.message);
            }
        }

        return {
            results: result,
            count: local.processedCount,
            errors: local.errors
        };
    }
}
```

### Method Chaining
```cfscript
component {

    property name="value";

    function setValue(required val) {
        variables.value = arguments.val;
        return this; // Enable chaining
    }

    function transform(required func) {
        variables.value = func(variables.value);
        return this;
    }

    function getValue() {
        return variables.value;
    }
}

// Chainable usage
result = obj
    .setValue("hello world")
    .transform(function(str) { return ucase(str); })
    .transform(function(str) { return reverse(str); })
    .getValue();
```

### Function Metadata and Attributes
```cfscript
component {

    /**
     * Custom web service method
     *
     * @output false
     * @returnFormat JSON
     * @httpMethod POST
     */
    remote function getData() description="Retrieves user data" {
        return getUserData();
    }

    // Using annotation-based metadata
    /**
     * Process payment
     * @secure true
     * @audit true
     * @returnFormat JSON
     */
    function processPayment(required amount) {
        // Implementation
    }
}
```

## Key Points
- Functions are **first-class objects** - can be manipulated at runtime
- Access determines scope placement: public/remote go in `this` and `variables`, private/package only in `variables`
- Dynamic language allows runtime function injection, removal, and renaming
- All functions default to `any` return type and `public` access
- Local variables must be var scoped to avoid memory leaks
- Arguments can be accessed positionally, by name, or via collections

## Function Access Scope Placement
- **Public/Remote**: Placed in both `this` and `variables` scopes
- **Private/Package**: Placed only in `variables` scope
- This enables dynamic runtime manipulation of object behavior

## Variable Scope Chain (for unscoped variables in functions)
1. Local (function-local)
2. Arguments
3. Thread local (in threads only)
4. Query (in query loops)
5. Thread
6. Variables
7. CGI, CFFILE, URL, Form, Cookie, Client

## Best Practices
- Always use explicit return types for better documentation
- Var scope all local variables to prevent memory leaks
- Use meaningful function names and parameter names
- Document functions with JavaDoc syntax
- Validate input arguments appropriately
- Use access modifiers to enforce encapsulation
- Return `this` from setters to enable method chaining

## Related Concepts
- [Component Basics](component-basics.md)
- [Properties](properties.md)
- [Variable Scopes](../data-types/variable-scopes.md)

================================================
FILE: .ai/cfml/components/properties.md
================================================
# Component Properties

## Overview
Properties in CFML components define the data/attributes that objects can hold. With `accessors="true"`, they automatically generate getter and setter methods. Properties support typing, defaults, and can be configured for web services and ORM mapping.

## Syntax
```cfscript
property [attributes] name="propertyName" [type="dataType"] [default="defaultValue"];
```

## Examples

### Basic Property Definitions
```cfscript
component accessors="true" {

    property name="firstName" default="";
    property name="lastName" default="";
    property name="age" type="numeric" default="0";
    property name="addresses" type="array";
    property name="isActive" type="boolean" default="true";
}
```

### Typed Properties
```cfscript
component accessors="true" {

    property name="id" type="string";
    property name="score" type="numeric";
    property name="birthDate" type="date";
    property name="tags" type="array";
    property name="metadata" type="struct";
    property name="user" type="User"; // Custom component type
}
```

### Property Attributes
```cfscript
component accessors="true" {

    // Control getter/setter generation
    property name="readOnly" getter="true" setter="false";
    property name="writeOnly" getter="false" setter="true";

    // Property validation
    property name="email" type="string" required="true";
    property name="status" type="string" validate="regex"
             pattern="^(active|inactive|pending)$";
}
```

### Annotation-Based Properties
```cfscript
component accessors="true" {

    /**
     * The user's age
     * @type numeric
     * @default 0
     * @required false
     */
    property name="age";

    /**
     * User's email address
     * @type string
     * @validate email
     */
    property name="email";
}
```

### Property Usage with Accessors
```cfscript
component accessors="true" {
    property name="firstName";
    property name="lastName";

    function getFullName() {
        return getFirstName() & " " & getLastName();
    }
}

// Usage
user = new User();
user.setFirstName("Luis");
user.setLastName("Majano");

fullName = user.getFullName(); // "Luis Majano"
```

### Manual Property Implementation
```cfscript
component {

    property name="value";

    // Custom getter with validation
    function getValue() {
        if (!structKeyExists(variables, "value")) {
            throw("Value not initialized");
        }
        return variables.value;
    }

    // Custom setter with validation
    function setValue(required newValue) {
        if (isNull(arguments.newValue) || arguments.newValue == "") {
            throw("Value cannot be null or empty");
        }
        variables.value = arguments.newValue;
        return this;
    }
}
```

### ORM Entity Properties
```cfscript
component persistent="true" table="users" accessors="true" {

    property name="id" fieldtype="id" generator="increment";
    property name="username" column="user_name" length="50" notnull="true";
    property name="email" ormtype="string" length="100" unique="true";
    property name="createdDate" ormtype="timestamp" default="now()";

    // Relationships
    property name="profile" fieldtype="one-to-one" cfc="UserProfile";
    property name="orders" fieldtype="one-to-many" cfc="Order" fkcolumn="user_id";
}
```

### Lazy Loading Properties
```cfscript
component accessors="true" {

    property name="expensiveData" lazy="true";

    function getExpensiveData() {
        if (!structKeyExists(variables, "expensiveData")) {
            // Lazy load expensive computation
            variables.expensiveData = performExpensiveCalculation();
        }
        return variables.expensiveData;
    }
}
```

## Key Points
- Properties are stored in the `variables` scope by default
- `accessors="true"` auto-generates `get{PropertyName}()` and `set{PropertyName}()` methods
- Property names are case-insensitive but conventionally camelCase
- Default values are assigned during object creation
- Properties support full type validation and conversion
- Can be configured for ORM persistence and web service exposure

## Common Property Attributes
- `type` - Data type (string, numeric, boolean, array, struct, component name)
- `default` - Default value when object is created
- `getter` - Generate getter method (true/false)
- `setter` - Generate setter method (true/false)
- `required` - Property must have value
- `validate` - Validation type (email, regex, range, etc.)

## ORM-Specific Attributes
- `fieldtype` - ORM field type (id, column, one-to-one, one-to-many, etc.)
- `column` - Database column name
- `ormtype` - Hibernate type mapping
- `length` - Maximum field length
- `notnull` - Database not-null constraint

## Best Practices
- Use meaningful property names that describe the data
- Provide appropriate default values
- Use typing for better code documentation and validation
- Consider lazy loading for expensive properties
- Document properties with JavaDoc comments
- Use ORM annotations for database-mapped entities

## Related Concepts
- [Component Basics](component-basics.md)
- [Functions](functions.md)
- [Variable Scopes](../data-types/variable-scopes.md)

================================================
FILE: .ai/cfml/control-flow/conditionals.md
================================================
# Conditionals

## Overview
Conditionals in CFML allow you to execute different code paths based on boolean conditions. CFML supports standard if/else statements, ternary operators, elvis operators, safe navigation, and switch statements for complex control flow.

## Syntax
```cfscript
if (condition) {
    // code
} else if (condition) {
    // code
} else {
    // code
}
```

## Examples

### Basic If/Else Statements
```cfscript
age = 25;

if (age < 18) {
    status = "Minor";
} else if (age >= 18 && age < 65) {
    status = "Adult";
} else {
    status = "Senior";
}
```

### Comparison Operators
```cfscript
a = 10;
b = 5;

// Standard operators
if (a == b)    // equal
if (a != b)    // not equal
if (a > b)     // greater than
if (a >= b)    // greater than or equal
if (a < b)     // less than
if (a <= b)    // less than or equal

// CFML alternative operators
if (a EQ b)    // equal
if (a NEQ b)   // not equal
if (a GT b)    // greater than
if (a GTE b)   // greater than or equal
if (a LT b)    // less than
if (a LTE b)   // less than or equal
```

### Boolean Evaluations
```cfscript
// Arrays, structures, strings
items = [1, 2, 3];
if (isArray(items)) {
    // Process array
}

person = { name: "Luis", age: 35 };
if (person.keyExists("email")) {
    // Process email
}

// Numeric boolean evaluation
if (1)  // true
if (0)  // false
if (-5) // true
```

### Ternary Operator
```cfscript
// Basic ternary
age = 20;
category = (age >= 18) ? "Adult" : "Minor";

// Chained ternary
status = (score >= 90) ? "A" :
         (score >= 80) ? "B" :
         (score >= 70) ? "C" : "F";

// With function calls
message = (isUserActive) ? getWelcomeMessage() : getInactiveMessage();
```

### Elvis Operator (Null Coalescing)
```cfscript
// Assign default if null or undefined
userName = form.username ?: "Anonymous";
displayName = user.displayName ?: user.firstName ?: "Guest";

// With safe navigation
email = user?.profile?.email ?: "no-email@domain.com";
```

### Safe Navigation Operator
```cfscript
user = {
    profile: {
        name: "Luis",
        contacts: {
            email: "luis@ortus.com"
        }
    }
};

// Safe navigation prevents key-not-exists errors
name = user?.profile?.name;              // "Luis"
phone = user?.profile?.contacts?.phone;  // undefined (no error)
city = user?.address?.city ?: "Unknown"; // "Unknown"

// Complex navigation
result = data?.results?.items?[1]?.title ?: "No title";
```

### Switch Statements
```cfscript
city = "Miami";

switch (city) {
    case "New York":
        region = "East Coast";
        break;

    case "Los Angeles":
        region = "West Coast";
        break;

    case "Miami": case "Tampa": {
        region = "Florida";
        break;
    }

    default:
        region = "Unknown";
}
```

### Complex Conditional Logic
```cfscript
function processUser(required user) {
    // Multiple conditions with logical operators
    if (user.isActive && user.hasPermission("admin") || user.isSuperUser) {
        return processAdminUser(user);
    }

    // Nested conditions
    if (user.subscription) {
        if (user.subscription.isPremium) {
            return processPremiumUser(user);
        } else if (user.subscription.isValid()) {
            return processStandardUser(user);
        }
    }

    return processGuestUser(user);
}
```

### Validation Patterns
```cfscript
function validateUser(required struct userData) {
    // Guard clauses for early returns
    if (!structKeyExists(userData, "email")) {
        throw("Email is required");
    }

    if (!isValidEmail(userData.email)) {
        throw("Invalid email format");
    }

    // Combined validation
    if (len(trim(userData.password ?: "")) < 8) {
        throw("Password must be at least 8 characters");
    }

    return true;
}
```

## Key Points
- **Truthy values**: All numbers except 0, non-empty strings, arrays, structures
- **Falsy values**: 0, empty string, null, undefined
- Elvis operator (`?:`) provides null-safe default assignment
- Safe navigation (`?.`) prevents "key not exists" exceptions
- Switch statements only evaluate single expressions, not multiple conditions
- Use guard clauses for early returns to reduce nesting
- Logical operators: `&&` (AND), `||` (OR), `!` (NOT)

## Best Practices
- Use guard clauses to reduce nesting levels
- Prefer explicit comparisons over truthy/falsy evaluation for clarity
- Use safe navigation with elvis operator for robust null handling
- Keep conditional logic simple and readable
- Consider extracting complex conditions into named functions
- Use switch statements for multiple discrete value comparisons

## Common Patterns
```cfscript
// Guard clause pattern
if (!isValid(input)) {
    return;
}

// Null-safe access pattern
value = data?.nested?.property ?: defaultValue;

// Validation pattern
if (!isDefined("form.username") || !len(trim(form.username))) {
    errors.append("Username is required");
}
```

## Related Concepts
- [Loops](loops.md)
- [Exception Handling](exception-handling.md)
- [Variables](../data-types/variables.md)

================================================
FILE: .ai/cfml/control-flow/exception-handling.md
================================================
# Exception Handling

## Overview
CFML provides comprehensive exception handling through try/catch/finally blocks, custom exception throwing, and built-in exception types. Proper exception handling enables graceful error recovery and robust application behavior.

## Syntax
```cfscript
try {
    // code that might throw exception
} catch (exceptionType variableName) {
    // handle specific exception type
} catch (any e) {
    // handle any remaining exceptions
} finally {
    // cleanup code that always runs
}
```

## Examples

### Basic Try/Catch/Finally
```cfscript
try {
    result = 10 / 0; // Will throw division by zero
    writeOutput("Result: " & result);
} catch (any e) {
    writeOutput("Error occurred: " & e.message);
} finally {
    writeOutput("Cleanup code runs regardless");
}
```

### Multiple Exception Types
```cfscript
try {
    qResult = queryExecute("SELECT * FROM users WHERE id = ?", [userID]);
    userData = processUserData(qResult);
} catch (database e) {
    writeLog("Database error: " & e.message);
    // Handle database-specific issues
} catch (expression e) {
    writeLog("Expression error: " & e.detail);
    // Handle parsing/evaluation errors
} catch (any e) {
    writeLog("Unexpected error: " & e.message);
    // Handle all other exceptions
}
```

### Custom Exception Throwing
```cfscript
function validateUser(required struct userData) {
    if (!structKeyExists(userData, "email")) {
        throw(
            type = "ValidationError",
            message = "Email is required",
            detail = "User data must include email address",
            errorCode = "USER_001"
        );
    }

    if (!isValidEmail(userData.email)) {
        throw(
            type = "ValidationError",
            message = "Invalid email format",
            detail = "Email address format is not valid: " & userData.email,
            errorCode = "USER_002"
        );
    }

    return true;
}

// Usage
try {
    validateUser({ name: "John" }); // Missing email
} catch (ValidationError e) {
    writeOutput("Validation failed: " & e.message);
    writeOutput("Error code: " & e.errorCode);
}
```

### Rethrowing Exceptions
```cfscript
function processUserData(required userData) {
    try {
        // Attempt processing
        result = complexDataProcessing(userData);
        return result;
    } catch (any e) {
        // Log the error for debugging
        writeLog("Processing failed for user: " & userData.id);
        writeLog("Error: " & e.message);

        // Re-throw to let caller handle
        rethrow;
    }
}
```

### Exception Information Access
```cfscript
try {
    riskyOperation();
} catch (any e) {
    // Access exception properties
    writeOutput("Type: " & e.type);
    writeOutput("Message: " & e.message);
    writeOutput("Detail: " & e.detail);
    writeOutput("Error Code: " & e.errorCode);
    writeOutput("Extended Info: " & e.extendedInfo);

    // Stack trace information
    if (structKeyExists(e, "stackTrace")) {
        writeOutput("Stack Trace: " & e.stackTrace);
    }
}
```

### Resource Management Pattern
```cfscript
function processFile(required string filePath) {
    var fileHandle = "";

    try {
        fileHandle = fileOpen(filePath, "read");

        while (!fileIsEOF(fileHandle)) {
            line = fileReadLine(fileHandle);
            processLine(line);
        }

        return "File processed successfully";
    } catch (any e) {
        throw(
            message = "File processing failed",
            detail = "Error processing file: " & filePath,
            extendedInfo = e.message
        );
    } finally {
        // Ensure file is always closed
        if (isObject(fileHandle)) {
            fileClose(fileHandle);
        }
    }
}
```

### Nested Exception Handling
```cfscript
function complexOperation(data) {
    try {
        // Outer operation
        validateInput(data);

        try {
            // Inner operation that might fail
            result = performCalculation(data);
        } catch (MathError e) {
            // Handle math-specific errors
            result = getDefaultCalculationResult();
            writeLog("Using default calculation due to: " & e.message);
        }

        return processResult(result);
    } catch (ValidationError e) {
        throw(
            type = "ProcessingError",
            message = "Input validation failed",
            detail = e.message
        );
    } catch (any e) {
        // Log and wrap unexpected errors
        writeLog("Unexpected error in complexOperation: " & e.message);
        throw(
            type = "SystemError",
            message = "System error occurred",
            detail = "Contact administrator"
        );
    }
}
```

### Exception Factory Pattern
```cfscript
component {

    public function createValidationException(required message, code = "VALIDATION_ERROR") {
        throw(
            type = "ValidationError",
            message = arguments.message,
            errorCode = arguments.code,
            detail = "Data validation failed"
        );
    }

    public function createDatabaseException(required message, query = "") {
        throw(
            type = "DatabaseError",
            message = arguments.message,
            detail = "Database operation failed",
            extendedInfo = arguments.query
        );
    }
}

// Usage
errorFactory = new ErrorFactory();

try {
    if (age < 0) {
        errorFactory.createValidationException("Age cannot be negative", "AGE_001");
    }
} catch (ValidationError e) {
    handleValidationError(e);
}
```

## Built-in Exception Types
- `application` - Application-level exceptions
- `database` - Database operation errors
- `template` - CFML template errors
- `security` - Security-related errors
- `object` - Object instantiation/method errors
- `missingInclude` - Missing include file errors
- `expression` - Expression evaluation errors
- `lock` - Lock operation errors
- `any` - Catches all exception types

## Exception Object Properties
- `type` - Exception type/category
- `message` - Brief error description
- `detail` - Detailed error information
- `errorCode` - Custom error code
- `extendedInfo` - Additional custom information
- `stackTrace` - Call stack information

## Best Practices
- **Catch specific types first**, then general types
- **Always include finally blocks** for cleanup
- **Log exceptions appropriately** for debugging
- **Don't catch and ignore** - handle or rethrow
- **Use custom exception types** for business logic errors
- **Provide meaningful error messages** for users
- **Clean up resources** in finally blocks
- **Rethrow when appropriate** to maintain error context

## Error Recovery Patterns
```cfscript
// Retry pattern
function reliableOperation(data, maxRetries = 3) {
    for (var attempt = 1; attempt <= maxRetries; attempt++) {
        try {
            return performOperation(data);
        } catch (TemporaryError e) {
            if (attempt == maxRetries) {
                rethrow;
            }
            sleep(attempt * 1000); // Exponential backoff
        }
    }
}

// Fallback pattern
function getDataWithFallback(id) {
    try {
        return getPrimaryData(id);
    } catch (any e) {
        try {
            return getBackupData(id);
        } catch (any fallbackError) {
            return getDefaultData();
        }
    }
}
```

## Related Concepts
- [Conditionals](conditionals.md)

================================================
FILE: .ai/cfml/control-flow/loops.md
================================================
# Loops in CFML

## Overview
CFML provides several loop constructs for iterating over data and executing repetitive tasks. Modern CFScript syntax is preferred for its readability and consistency with other programming languages.

## For Loops

### Basic For Loop
```cfscript
// Traditional for loop
for (var i = 1; i <= 10; i++) {
    writeOutput("Number: " & i & "<br>");
}

// Countdown loop
for (var i = 10; i >= 1; i--) {
    writeOutput("Countdown: " & i & "<br>");
}

// Custom step
for (var i = 0; i <= 100; i += 10) {
    writeOutput("Step: " & i & "<br>");
}
```

### For-In Loops

#### Array Iteration (CF9.0.1+)
```cfscript
var fruits = ["apple", "banana", "cherry", "date"];

// Iterate over values
for (var fruit in fruits) {
    writeOutput("Fruit: " & fruit & "<br>");
}

// Access array index within loop (CF10+)
for (var fruit in fruits) {
    writeOutput("Index " & arrayFind(fruits, fruit) & ": " & fruit & "<br>");
}
```

#### Struct Iteration
```cfscript
var person = {
    name: "John",
    age: 30,
    city: "New York"
};

// Iterate over keys
for (var key in person) {
    writeOutput(key & ": " & person[key] & "<br>");
}
```

#### List Iteration (CF10+)
```cfscript
var csvData = "apple,banana,cherry,date";

// Iterate over list items
for (var item in csvData) {
    writeOutput("Item: " & item & "<br>");
}

// Custom delimiter
var pipeData = "red|green|blue";
for (var color in listToArray(pipeData, "|")) {
    writeOutput("Color: " & color & "<br>");
}
```

#### Query Iteration (CF10+)
```cfscript
var users = queryNew("name,email,active", "varchar,varchar,bit", [
    ["John Doe", "john@example.com", true],
    ["Jane Smith", "jane@example.com", false],
    ["Bob Johnson", "bob@example.com", true]
]);

// Iterate over query rows
for (var row in users) {
    writeOutput("User: " & row.name & " (" & row.email & ")<br>");
    // users.currentRow is available for current row number
}
```

## While Loops

### Basic While Loop
```cfscript
var counter = 1;

while (counter <= 5) {
    writeOutput("Counter: " & counter & "<br>");
    counter++;
}
```

### Conditional While Loop
```cfscript
var userInput = "";
var attempts = 0;
var maxAttempts = 3;

while (isEmpty(userInput) && attempts < maxAttempts) {
    userInput = trim(form.userInput ?: "");
    attempts++;

    if (isEmpty(userInput)) {
        writeOutput("Please provide valid input. Attempt " & attempts & "<br>");
    }
}
```

## Advanced Loop Patterns

### Loop Control Statements

#### Break Statement
```cfscript
var numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];

for (var num in numbers) {
    if (num > 5) {
        break; // Exit loop when number exceeds 5
    }
    writeOutput(num & " ");
}
// Output: 1 2 3 4 5
```

#### Continue Statement
```cfscript
var numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];

for (var num in numbers) {
    if (num % 2 == 0) {
        continue; // Skip even numbers
    }
    writeOutput(num & " ");
}
// Output: 1 3 5 7 9
```

### Query Loops with Grouping (CF10+)

#### Basic Query Grouping
```cfscript
var salesData = queryNew("region,salesperson,amount", "varchar,varchar,numeric", [
    ["North", "John", 1000],
    ["North", "Jane", 1500],
    ["South", "Bob", 2000],
    ["South", "Alice", 1200],
    ["South", "Charlie", 1800]
]);

// Group by region using cfloop
cfloop(query=salesData, group="region") {
    writeOutput("<h3>Region: " & region & "</h3>");

    // Inner loop for items within group
    cfloop() {
        writeOutput("&nbsp;&nbsp;" & salesperson & ": $" & numberFormat(amount) & "<br>");
    }
}
```

### File Processing Loops

#### Read File Line by Line
```cfscript
var filePath = expandPath("./data.txt");

if (fileExists(filePath)) {
    cfloop(file=filePath, index="line") {
        // Process each line
        if (len(trim(line))) {
            writeOutput("Line: " & line & "<br>");
        }
    }
}
```

#### Read File by Characters
```cfscript
var filePath = expandPath("./config.txt");

cfloop(file=filePath, index="chars", characters=16, charset="UTF-8") {
    // Process file in 16-character chunks
    processChunk(chars);
}
```

## Date/Time Loops

### Date Range Iteration
```cfscript
var startDate = createDate(2024, 1, 1);
var endDate = createDate(2024, 1, 7);

for (var currentDate = startDate;
     dateCompare(currentDate, endDate, "d") <= 0;
     currentDate = dateAdd("d", 1, currentDate)) {

    writeOutput("Date: " & dateFormat(currentDate, "yyyy-mm-dd") & "<br>");
}
```

### Time-based Processing
```cfscript
var startTime = createTime(9, 0, 0);  // 9:00 AM
var endTime = createTime(17, 0, 0);   // 5:00 PM
var intervalMinutes = 30;

for (var currentTime = startTime;
     timeFormat(currentTime, "HH:mm") <= timeFormat(endTime, "HH:mm");
     currentTime = dateAdd("n", intervalMinutes, currentTime)) {

    writeOutput("Time Slot: " & timeFormat(currentTime, "h:mm tt") & "<br>");
}
```

## Tag-Based Loop Syntax (Legacy)

### Basic Tag Loops
```cfml
<!--- For loop --->
<cfloop from="1" to="10" index="i">
    <cfoutput>Number: #i#<br></cfoutput>
</cfloop>

<!--- Array loop --->
<cfset fruits = ["apple", "banana", "cherry"]>
<cfloop array="#fruits#" item="fruit">
    <cfoutput>Fruit: #fruit#<br></cfoutput>
</cfloop>

<!--- Struct loop --->
<cfset person = {name: "John", age: 30}>
<cfloop collection="#person#" item="key">
    <cfoutput>#key#: #person[key]#<br></cfoutput>
</cfloop>

<!--- List loop --->
<cfset colors = "red,green,blue">
<cfloop list="#colors#" item="color">
    <cfoutput>Color: #color#<br></cfoutput>
</cfloop>
```

## Modern Functional Approaches

### Array Each (Alternative to Loops)
```cfscript
var numbers = [1, 2, 3, 4, 5];

// Using arrayEach instead of for loop
arrayEach(numbers, function(num, index) {
    writeOutput("Index " & index & ": " & num & "<br>");
});

// Member function syntax
numbers.each(function(num, index) {
    writeOutput("Number: " & num & " at position " & index & "<br>");
});
```

### Struct Each
```cfscript
var settings = {
    theme: "dark",
    language: "en",
    notifications: true
};

// Iterate using structEach
structEach(settings, function(key, value) {
    writeOutput(key & " = " & value & "<br>");
});

// Member function
settings.each(function(key, value) {
    writeOutput("Setting: " & key & " -> " & value & "<br>");
});
```

## Performance Considerations

### Loop Optimization
```cfscript
var items = getDataFromDatabase(); // Assume large dataset

// Inefficient: Calculate length on each iteration
for (var i = 1; i <= arrayLen(items); i++) {
    processItem(items[i]);
}

// Better: Cache length calculation
var itemCount = arrayLen(items);
for (var i = 1; i <= itemCount; i++) {
    processItem(items[i]);
}

// Best: Use for-in loop for cleaner code
for (var item in items) {
    processItem(item);
}
```

## Error Handling in Loops

### Safe Loop Iteration
```cfscript
var data = [1, "invalid", 3, null, 5];

for (var item in data) {
    try {
        if (isNull(item)) {
            continue;
        }

        if (isNumeric(item)) {
            var result = item * 2;
            writeOutput("Result: " & result & "<br>");
        }
    } catch (any e) {
        writeLog("Error processing item: " & e.message);
        continue; // Continue with next item
    }
}
```

## Wheels Query Loops (CRITICAL)

**⚠️ Wheels associations return Query objects, not arrays. This is essential for proper iteration.**

### Wheels Association Loops
```cfm
<!-- In Wheels views/controllers -->
<cfset post = model("Post").findByKey(1)>

<!-- ❌ WRONG - Treating association as array -->
<cfloop array="#post.comments()#" index="comment">  <!-- ERROR! -->
    #comment.content#
</cfloop>

<!-- ✅ CORRECT - Using query loop -->
<cfloop query="post.comments()">
    #post.comments().content#  <!-- Access fields directly -->
</cfloop>

<!-- ✅ ALSO CORRECT - Assign to variable first -->
<cfset comments = post.comments()>
<cfloop query="comments">
    #comments.author#: #comments.content#
</cfloop>

<!-- Check if query has records -->
<cfif post.comments().recordCount gt 0>
    <cfloop query="post.comments()">
        <p>#post.comments().content#</p>
    </cfloop>
<cfelse>
    <p>No comments found.</p>
</cfif>
```

### Wheels Model Finder Loops
```cfm
<!-- Model finders also return queries -->
<cfset users = model("User").findAll()>
<cfloop query="users">
    #users.name# - #users.email#
</cfloop>

<!-- With conditions -->
<cfset activeUsers = model("User").findAll(where="active = 1")>
<cfloop query="activeUsers">
    #activeUsers.name#
</cfloop>
```

**Key Wheels Points:**
- All association methods return Query objects: `post.comments()`, `user.orders()`
- All model finders return Query objects: `model("User").findAll()`
- Use `.recordCount` for counts, not `ArrayLen()`
- Use `<cfloop query="...">` syntax, not `<cfloop array="...">`

## Key Points

- Use CFScript syntax for modern loop constructs
- For-in loops are available for arrays, structs, lists, and queries
- `break` and `continue` statements control loop execution
- CF10+ supports query grouping with `cfloop`
- Consider functional approaches (`each`, `map`, `filter`) for data processing
- Always handle potential errors in loops processing external data
- Cache array lengths and expensive calculations outside loops
- **Wheels**: Always treat model results as queries, not arrays

## Related Concepts

- [Conditionals](conditionals.md)
- [Array Methods](../data-types/arrays/array-methods.md)
- [Query Processing](../database/query-basics.md)
- [Exception Handling](exception-handling.md)

================================================
FILE: .ai/cfml/data-types/arrays/array-creation.md
================================================
# Array Creation

## Overview
CFML arrays are dynamic, 1-indexed collections that can grow and shrink at runtime. They can be created using literal syntax or constructor functions, and support both typed and untyped variants.

## Syntax
```cfscript
// Literal syntax
array = [element1, element2, element3];

// Constructor function
array = arrayNew(dimensions);
```

## Examples

### Basic Array Creation
```cfscript
// Empty array
meals = [];

// Array with initial values
meals = ["Breakfast", "Lunch", "Dinner"];

// Mixed types (dynamic arrays)
mixed = [1, "hello", true, now()];
```

### Multi-Dimensional Arrays
```cfscript
// 2D array (grid/matrix)
grid = arrayNew(2);
grid[1][1] = "Hammer";
grid[1][2] = "Nail";
grid[2][1] = "Screwdriver";
grid[2][2] = "Screw";

// 3D array
cube = arrayNew(3);
cube[1][1][1] = "value";
```

### Typed Arrays (Adobe Engines)
```cfscript
// Typed array creation (Adobe syntax)
stringArray = arrayNew["String"](1);
numericArray = arrayNew["Numeric"](1);
userArray = arrayNew["User"](1);

// Literal typed syntax (Adobe)
strings = ["String"]["word1", "word2", "word3"];
```

### Typed Arrays (Lucee Engines)
```cfscript
// Lucee syntax for typed arrays
stringArray = arrayNew(1, "String");
numericArray = arrayNew(1, "Numeric");
userArray = arrayNew(1, "User");

// Synchronized arrays (thread-safe)
syncArray = arrayNew(1, "String", true);
```

### Array Population
```cfscript
// Add elements after creation
meals = [];
meals.append("Breakfast");
meals.append("Lunch");
meals.append("Dinner");

// Using array functions
arrayAppend(meals, "Dessert");

// Direct assignment
meals[5] = "Snack";
```

## Key Points
- Arrays start at index **1**, not 0
- CFML supports up to 3-dimensional arrays
- Arrays are dynamic and can grow/shrink at runtime
- **Adobe**: Arrays passed by value by default
- **Lucee**: Arrays passed by reference by default
- Typed arrays enforce data types with automatic casting
- Synchronized arrays are thread-safe but ~93% slower

## Array Types (for Typed Arrays)
- Array
- Binary
- Boolean
- Component
- CFC by Name/SubType
- Date/Datetime
- Function
- Numeric
- Query
- String
- Struct

## Performance Considerations
- Unsynchronized arrays are ~93% faster
- Pre-sizing arrays can improve performance
- Typed arrays provide type safety with casting overhead
- Consider using ArrayList for Java interop scenarios

## Related Concepts
- [Array Methods](array-methods.md)
- [Array Iteration](array-iteration.md)
- [Variables](../variables.md)

================================================
FILE: .ai/cfml/data-types/arrays/array-iteration.md
================================================
# Array Iteration

## Overview
CFML provides multiple ways to iterate over arrays: traditional for loops, modern for-in loops, functional each() methods, and multi-threaded parallel processing. Each approach has different use cases and performance characteristics.

## Syntax
```cfscript
// For-in loop (modern)
for (var item in array) { }

// Traditional for loop
for (var i = 1; i <= array.len(); i++) { }

// Functional each()
array.each(function(item, index) { });
```

## Examples

### Modern For-In Loop (Recommended)
```cfscript
meals = ["Breakfast", "Lunch", "Dinner"];

for (var meal in meals) {
    writeOutput("I will have: #meal#");
}
```

### Traditional Index-Based Loop
```cfscript
meals = ["Breakfast", "Lunch", "Dinner"];

for (var i = 1; i <= meals.len(); i++) {
    writeOutput("Meal #i#: #meals[i]#");
}
```

### Functional Each() Method
```cfscript
meals = ["Breakfast", "Lunch", "Dinner"];

meals.each(function(element, index) {
    writeOutput("Index #index#: #element#");
});

// With arrow function syntax (modern engines)
meals.each((element, index) => {
    writeOutput("Index #index#: #element#");
});
```

### Loop with CFML Loop Construct
```cfscript
meals = ["Breakfast", "Lunch", "Dinner"];

cfloop(from=1, to=meals.len(), index="i") {
    writeOutput("Meal: #meals[i]#");
}

cfloop(array=meals, index="i", item="meal") {
    writeOutput("Index #i#: #meal#");
}
```

### Multi-Threaded Parallel Processing
```cfscript
largeArray = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];

// Parallel processing with each()
largeArray.each(function(item) {
    // Simulate heavy processing
    sleep(100);
    writeOutput("Processed: #item#");
}, true, 4); // parallel=true, maxThreads=4

// Traditional parallel syntax
arrayEach(largeArray, function(item) {
    processHeavyTask(item);
}, true, 4);
```

### Iteration with Break/Continue Logic
```cfscript
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];

// Using traditional for loop for early exit
for (var i = 1; i <= numbers.len(); i++) {
    if (numbers[i] == 5) {
        break; // Exit loop
    }
    if (numbers[i] % 2 == 0) {
        continue; // Skip even numbers
    }
    writeOutput(numbers[i]);
}
```

### Nested Array Iteration
```cfscript
matrix = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
];

// Nested for-in loops
for (var row in matrix) {
    for (var cell in row) {
        writeOutput("Cell value: #cell#");
    }
}

// Index-based nested iteration
for (var i = 1; i <= matrix.len(); i++) {
    for (var j = 1; j <= matrix[i].len(); j++) {
        writeOutput("matrix[#i#][#j#] = #matrix[i][j]#");
    }
}
```

### Functional Iteration Patterns
```cfscript
products = [
    {name: "Laptop", price: 999},
    {name: "Mouse", price: 25},
    {name: "Keyboard", price: 75}
];

// Process each item functionally
products.each(function(product, index) {
    var tax = product.price * 0.08;
    writeOutput("#product.name#: $#product.price# (Tax: $#tax#)");
});

// Chain with other functional methods
expensiveProducts = products
    .filter((product) => product.price > 50)
    .each((product) => writeOutput("Expensive: #product.name#"));
```

## Key Points
- **For-in loops** are most readable and efficient for simple iteration
- **Traditional for loops** allow index access and break/continue control
- **each() method** enables functional programming patterns and chaining
- **Parallel processing** can improve performance but adds complexity
- **Thread safety** is crucial when using parallel iteration
- **Performance**: For-in loops are generally fastest for simple cases

## Performance Considerations
- For-in loops: Fastest for simple iteration
- Traditional for loops: Good when index is needed
- each() method: Slight overhead but enables chaining
- Parallel processing: Only beneficial for CPU-intensive operations
- Avoid parallel processing overhead for simple operations

## Multi-Threading Warnings
- Ensure proper variable scoping (`var` keyword)
- Use appropriate locking for shared resources
- Thread exceptions may not be visible
- Consider ColdBox Futures for advanced parallel processing

## Related Concepts
- [Array Creation](array-creation.md)
- [Array Methods](array-methods.md)
- [Closures](../../advanced/closures.md)
- [Control Flow](../../control-flow/loops.md)

================================================
FILE: .ai/cfml/data-types/arrays/array-methods.md
================================================
# Array Methods

## Overview
CFML provides extensive array manipulation capabilities through both traditional functions and member functions. Member functions offer better readability and method chaining for modern development.

## Syntax
```cfscript
// Traditional function syntax
result = arrayFunction(array, parameters);

// Member function syntax (preferred)
result = array.methodName(parameters);
```

## Examples

### Basic Array Operations
```cfscript
meals = ["Breakfast", "Lunch", "Dinner"];

// Get array length
size = meals.len();              // 3
size = arrayLen(meals);          // 3

// Add elements
meals.append("Dessert");         // ["Breakfast", "Lunch", "Dinner", "Dessert"]
meals.prepend("Snack");          // ["Snack", "Breakfast", "Lunch", "Dinner", "Dessert"]

// Insert at specific position
meals.insertAt(2, "Brunch");     // Insert at index 2
```

### Array Modification
```cfscript
numbers = [3, 1, 4, 1, 5];

// Sort array
numbers.sort("numeric");         // [1, 1, 3, 4, 5]
numbers.sort("numeric", "desc"); // [5, 4, 3, 1, 1]

// Remove elements
numbers.delete(1);               // Remove value 1 (first occurrence)
numbers.deleteAt(3);             // Remove element at index 3
numbers.clear();                 // Remove all elements
```

### Array Searching and Validation
```cfscript
fruits = ["apple", "banana", "cherry"];

// Find elements
index = fruits.find("banana");           // 2
index = fruits.findNoCase("APPLE");      // 1

// Check existence
exists = fruits.contains("cherry");       // true
exists = fruits.containsNoCase("APPLE"); // true

// Check if empty
isEmpty = fruits.isEmpty();              // false
```

### Functional Array Operations
```cfscript
numbers = [1, 2, 3, 4, 5];

// Map - transform each element
doubled = numbers.map(function(item) {
    return item * 2;
}); // [2, 4, 6, 8, 10]

// Filter - select elements matching criteria
evens = numbers.filter(function(item) {
    return item % 2 == 0;
}); // [2, 4]

// Reduce - aggregate to single value
sum = numbers.reduce(function(total, item) {
    return total + item;
}, 0); // 15

// Each - iterate with side effects
numbers.each(function(item, index) {
    writeOutput("Item #index#: #item#");
});
```

### Array Slicing and Manipulation
```cfscript
data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];

// Get slice (traditional)
subset = data.slice(3, 6);       // [3, 4, 5, 6]

// Array slicing with literal syntax (Adobe)
subset = data[3:6];              // [3, 4, 5, 6]
subset = data[1:-1:2];           // [1, 3, 5, 7, 9] (every 2nd element)
subset = data[-3:-1];            // [8, 9, 10] (last 3 elements)
```

### Array Conversion
```cfscript
numbers = [1, 2, 3, 4, 5];

// Convert to list
numberList = numbers.toList();           // "1,2,3,4,5"
numberList = numbers.toList("|");        // "1|2|3|4|5"

// Get string representation
arrayString = numbers.toString();        // "[1, 2, 3, 4, 5]"
```

### Advanced Array Operations
```cfscript
// Reverse array
numbers.reverse();

// Get unique values
duplicates = [1, 2, 2, 3, 3, 3];
unique = duplicates.filter(function(item, index, array) {
    return array.find(item) == index;
});

// Flatten nested arrays (custom function needed)
nested = [[1, 2], [3, 4], [5]];
// Would need custom implementation

// Array concatenation
arr1 = [1, 2, 3];
arr2 = [4, 5, 6];
combined = arr1.merge(arr2);     // [1, 2, 3, 4, 5, 6]
```

## Key Points
- Member functions support method chaining: `array.sort().reverse()`
- Array operations typically return new arrays (immutable style)
- Functional methods (`map`, `filter`, `reduce`) follow functional programming patterns
- Index operations are 1-based, not 0-based
- Negative indexing supported in modern engines
- Type-specific operations available for typed arrays

## Common Methods Reference
- **Size**: `len()`, `size()`, `isEmpty()`
- **Add/Remove**: `append()`, `prepend()`, `insertAt()`, `delete()`, `deleteAt()`, `clear()`
- **Search**: `find()`, `findNoCase()`, `contains()`, `containsNoCase()`
- **Transform**: `map()`, `filter()`, `reduce()`, `sort()`, `reverse()`
- **Convert**: `toList()`, `toString()`, `slice()`

## Related Concepts
- [Array Creation](array-creation.md)
- [Array Iteration](array-iteration.md)
- [Closures](../../advanced/closures.md)

================================================
FILE: .ai/cfml/data-types/numbers/numeric-basics.md
================================================
# Numeric Basics

## Overview
CFML supports two primary numeric types: integers (whole numbers) and floats (decimal numbers). Internally backed by Java's Integer and Double classes, with different storage behaviors between CFML engines.

## Syntax
```cfscript
integerValue = 123;
floatValue = 123.45;
```

## Examples

### Basic Number Assignment
```cfscript
age = 35;                    // integer
price = 25.99;               // float
temperature = -10;           // negative integer
percentage = 0.75;           // decimal between 0 and 1
```

### Mathematical Operations
```cfscript
a = 10;
b = 3;

sum = a + b;        // 13
difference = a - b; // 7
product = a * b;    // 30
quotient = a / b;   // 3.33333...
remainder = a % b;  // 1 (modulo)
power = a ^ b;      // 1000 (exponent)
```

### Type-Safe Function Parameters
```cfscript
numeric function add(numeric a, numeric b) {
    return a + b;
}

result = add(10, 20); // 30
```

### Numeric Validation and Conversion
```cfscript
// Check if value is numeric
isNumeric(123);        // true
isNumeric("123");      // true
isNumeric("abc");      // false
isNumeric("123.45");   // true

// Convert to numeric
toNumeric("123");      // 123
toNumeric("FF", "hex"); // 255
toNumeric("1010", "bin"); // 10

// Parse numbers from strings
parseNumber("$1,234.56"); // 1234.56
```

### Precision Handling
```cfscript
// Standard precision issues
result = 0.1 + 0.2; // 0.30000000000000004

// Use precisionEvaluate for exact decimal math
preciseResult = precisionEvaluate(0.1 + 0.2); // 0.3

// Currency calculations
price = 29.99;
tax = precisionEvaluate(price * 0.08);
total = precisionEvaluate(price + tax);
```

### Common Math Functions
```cfscript
number = -15.67;

abs(number);        // 15.67 (absolute value)
ceiling(number);    // -15 (round up)
floor(number);      // -16 (round down)
round(number);      // -16 (round to nearest)
int(number);        // -15 (truncate decimals)

// Advanced math
sqr(25);           // 5 (square root)
sin(90);           // sine function
cos(0);            // cosine function
pi();              // 3.141592653589793
```

### Random Numbers
```cfscript
// Random float between 0 and 1
randomFloat = rand();

// Random integer in range
randomInt = randRange(1, 100);

// Seed the random generator
randomize(12345);
```

## Key Points
- **Lucee**: All numbers stored as Double
- **Adobe**: Integers as Integer, floats as Double
- Automatic type conversion between integers and floats
- Use `precisionEvaluate()` for exact decimal arithmetic
- CFML is dynamically typed - no explicit type declaration needed
- Functions accept generic `numeric` type parameter

## Numeric Limits
- **Integer**: -2,147,483,648 to 2,147,483,647 (32-bit)
- **Double**: 64-bit floating point with ~15-16 decimal digit precision

## Performance Considerations
- Integer operations are generally faster than float operations
- Use appropriate numeric types for your use case
- Consider memory usage for large numeric datasets
- `precisionEvaluate()` has performance overhead

## Related Concepts
- [Variables](../variables.md)

================================================
FILE: .ai/cfml/data-types/scopes/variables-scope.md
================================================
# Variables Scope in CFML

## Overview
The `variables` scope is the default scope in CFML. Variables declared without an explicit scope prefix are automatically assigned to the `variables` scope. Understanding variable scoping is crucial for proper CFML development.

## Basic Variable Declaration

### Implicit Variables Scope
```cfscript
// These are equivalent
myVariable = "Hello World";
variables.myVariable = "Hello World";

// Both create a variable in the variables scope
writeOutput(myVariable);           // Hello World
writeOutput(variables.myVariable); // Hello World
```

### Tag-based Declaration
```cfml
<!--- These are equivalent --->
<cfset myVariable = "Hello World">
<cfset variables.myVariable = "Hello World">

<!--- Both can be referenced without scope prefix --->
<cfoutput>#myVariable#</cfoutput>
<cfoutput>#variables.myVariable#</cfoutput>
```

## Scope Characteristics

### Local to Template/Component
```cfscript
// In a .cfm file
variables.pageTitle = "Home Page";
variables.userData = {name: "John", age: 30};

// These variables are only accessible within this template
function displayUserInfo() {
    // Can access variables scope from within functions in same component
    writeOutput("User: " & variables.userData.name);
}
```

### Component Variables Scope
```cfscript
component {
    // Variables scope in components
    variables.componentName = "UserService";
    variables.version = "1.0";

    function init() {
        variables.initialized = true;
        return this;
    }

    function getName() {
        // Functions can access variables scope
        return variables.componentName;
    }

    function processUser(userData) {
        // Local variables within function (implicit variables scope)
        processedData = processUserData(userData);

        // This creates variables.processedData accessible to other functions
        return processedData;
    }

    function getProcessedData() {
        // Can access processedData from other function
        return variables.processedData ?: {};
    }
}
```

## Function-Level Scoping

### Local vs Variables Scope
```cfscript
component {
    variables.componentData = "component level";

    function demonstrateScoping() {
        // Without 'var' or 'local' - goes to variables scope
        unscoped = "accessible to other functions";

        // With 'var' - local to this function only
        var localVar = "only in this function";

        // With 'local' prefix - also local to this function
        local.anotherLocal = "also only in this function";

        // Variables scope - explicit
        variables.componentLevel = "accessible to all functions";
    }

    function accessTest() {
        // Can access unscoped and variables.componentLevel
        writeOutput(variables.unscoped);        // Works
        writeOutput(variables.componentLevel);  // Works

        // Cannot access localVar or local.anotherLocal
        // These would cause errors or be undefined
    }
}
```

### Best Practice for Local Variables
```cfscript
function processData(inputData) {
    // Always use 'var' for function-local variables
    var result = {};
    var errorCount = 0;
    var processedItems = [];

    // Process data without affecting variables scope
    for (var item in inputData) {
        var processedItem = processItem(item);
        if (processedItem.success) {
            arrayAppend(processedItems, processedItem.data);
        } else {
            errorCount++;
        }
    }

    result.items = processedItems;
    result.errorCount = errorCount;

    return result;
}
```

## Scope Visibility Rules

### Within Components
```cfscript
component {
    variables.publicData = "available to all functions";

    function functionA() {
        variables.sharedData = "set in function A";
        var privateData = "only in function A";
    }

    function functionB() {
        // Can access sharedData set in functionA
        if (structKeyExists(variables, "sharedData")) {
            writeOutput(variables.sharedData); // Works
        }

        // Cannot access privateData from functionA
        // This would be undefined
    }

    function getComponentState() {
        // Return all variables scope data
        return variables;
    }
}
```

### External Access Restrictions
```cfscript
// In main template or other component
var userService = new UserService();

// Cannot directly access variables scope from outside
// This would cause an error:
// userService.variables.someData

// Must use public methods to access data
var componentName = userService.getName(); // Allowed
```

## Common Patterns

### Component Initialization
```cfscript
component {
    // Set default values in variables scope
    variables.initialized = false;
    variables.settings = {};
    variables.dataCache = {};

    function init(settings = {}) {
        variables.settings = arguments.settings;
        variables.initialized = true;
        variables.dataCache = {};

        return this;
    }

    function isInitialized() {
        return variables.initialized;
    }

    function getSetting(key, defaultValue = "") {
        return structKeyExists(variables.settings, key) ?
            variables.settings[key] : defaultValue;
    }
}
```

### Shared Utilities
```cfscript
component {
    // Shared utility functions and data
    variables.utils = {
        formatCurrency: function(amount) {
            return dollarFormat(amount);
        },
        formatDate: function(date) {
            return dateFormat(date, "mm/dd/yyyy");
        }
    };

    variables.constants = {
        MAX_ITEMS: 100,
        DEFAULT_TIMEOUT: 30,
        API_VERSION: "1.0"
    };

    function formatUserData(userData) {
        var formatted = {};
        formatted.displayName = userData.firstName & " " & userData.lastName;
        formatted.salary = variables.utils.formatCurrency(userData.salary);
        formatted.hireDate = variables.utils.formatDate(userData.hireDate);

        return formatted;
    }
}
```

## Advanced Scoping Scenarios

### Mixing Scopes Safely
```cfscript
component {
    variables.componentId = createUUID();
    variables.metrics = {
        callCount: 0,
        errorCount: 0
    };

    function publicMethod(data) {
        // Increment call counter (variables scope)
        variables.metrics.callCount++;

        // Local processing variables
        var result = {};
        var hasErrors = false;

        try {
            // Use local variables for processing
            var processedData = processBusinessLogic(data);
            result.success = true;
            result.data = processedData;

        } catch (any e) {
            // Update component-level error tracking
            variables.metrics.errorCount++;
            result.success = false;
            result.error = e.message;
            hasErrors = true;
        }

        return result;
    }

    function getMetrics() {
        // Return copy to prevent external modification
        return duplicate(variables.metrics);
    }
}
```

### Dynamic Variable Creation
```cfscript
component {
    function setDynamicProperty(key, value) {
        // Dynamically create variables scope properties
        variables[key] = value;
    }

    function getDynamicProperty(key, defaultValue = "") {
        return structKeyExists(variables, key) ?
            variables[key] : defaultValue;
    }

    function getAllProperties() {
        // Return all variables scope content
        var result = {};
        for (var key in variables) {
            // Skip functions and system properties
            if (!isCustomFunction(variables[key])) {
                result[key] = variables[key];
            }
        }
        return result;
    }
}
```

## Memory and Performance Considerations

### Cleanup Pattern
```cfscript
component {
    variables.largeDataSet = [];
    variables.cacheData = {};

    function cleanup() {
        // Clear large data structures
        variables.largeDataSet = [];
        variables.cacheData = {};

        // Set references to null for garbage collection
        variables.expensiveObject = javaCast("null", "");
    }

    function onApplicationEnd() {
        cleanup();
    }
}
```

## Key Points

- `variables` is the default scope in CFML
- Variables in `variables` scope are accessible to all functions within the same component/template
- Use `var` keyword for function-local variables to avoid scope pollution
- Variables scope is not accessible from outside the component
- Each component instance has its own `variables` scope
- Functions can read and modify variables scope data
- Always initialize variables scope properties in components
- Use proper scoping to prevent variable conflicts and memory leaks

## Related Concepts

- [Component Basics](../../components/component-basics.md)
- [Functions](../../components/functions.md)

================================================
FILE: .ai/cfml/data-types/strings/string-functions.md
================================================
# String Functions

## Overview
CFML provides extensive built-in functions for string manipulation, including length calculation, trimming, replacement, and extraction. These functions can be used as traditional functions or member functions.

## Syntax
```cfscript
// Traditional function syntax
result = functionName(string, parameters);

// Member function syntax (modern)
result = string.functionName(parameters);
```

## Examples

### Length and Trimming
```cfscript
message = " Hello World ";

// Get string length
length = len(message);        // 13
length = message.len();       // 13

// Trim whitespace
cleaned = trim(message);      // "Hello World"
cleaned = message.trim();     // "Hello World"

// Left and right trimming
leftTrim = ltrim(message);    // "Hello World "
rightTrim = rtrim(message);   // " Hello World"
```

### String Replacement
```cfscript
text = "Hello World";

// Replace first occurrence
result = replace(text, "l", "L");           // "HeLlo World"

// Replace all occurrences
result = replace(text, "l", "L", "ALL");    // "HeLLo WorLd"

// Case-insensitive replacement
result = replaceNoCase(text, "HELLO", "Hi", "ALL");

// Regular expression replacement
cleaned = reReplace("test 123!", "[^a-z0-9]", "", "ALL");
```

### Substring Operations
```cfscript
data = "Welcome to CFML";

// Extract substring
part = mid(data, 4, 5);       // "come "
part = data[4:8];             // "come" (range syntax)

// Remove characters
result = removeChars(data, 2, 5);  // "e to CFML"
```

### List Operations
```cfscript
// Convert string to array
names = "Luis,Maria,Carlos,Ana";
nameArray = names.listToArray();
nameArray = listToArray(names, ",");

// Multi-character delimiter
data = "item1,|item2,|item3";
items = listToArray(data, ",|", false, true);
```

### Case Conversion
```cfscript
text = "Hello World";

uppercase = ucase(text);      // "HELLO WORLD"
lowercase = lcase(text);      // "hello world"

uppercase = text.ucase();     // Member function
lowercase = text.lcase();     // Member function
```

### String Validation
```cfscript
// Check if string is numeric
isNumeric("123");         // true
isNumeric("abc");         // false

// Check if empty
len(trim(myString)) == 0; // empty check pattern
```

## Key Points
- Member functions provide better readability and chaining capability
- String operations return new strings (immutable nature)
- Functions are case-insensitive but preserve case in results
- Regular expressions supported with `RE` prefixed functions
- List functions treat strings as delimited lists
- Performance: Use StringBuilder for heavy concatenation operations

## Common Functions Reference
- `len()` - String length
- `trim()`, `ltrim()`, `rtrim()` - Whitespace removal
- `replace()`, `replaceNoCase()` - Text replacement
- `mid()` - Substring extraction
- `ucase()`, `lcase()` - Case conversion
- `listToArray()` - List to array conversion
- `find()`, `findNoCase()` - String searching
- `reverse()` - String reversal

## Related Concepts
- [String Literals](string-literals.md)
- [String Interpolation](string-interpolation.md)
- [Arrays](../arrays/array-methods.md)

================================================
FILE: .ai/cfml/data-types/strings/string-interpolation.md
================================================
# String Interpolation

## Overview
String interpolation in CFML allows embedding variable values and expressions directly within strings using hash (`#`) delimiters. This provides a clean way to build dynamic strings without concatenation.

## Syntax
```cfscript
string = "Text with #variableName# embedded";
string = "Expression result: #expression#";
```

## Examples

### Basic Variable Interpolation
```cfscript
name = "Luis";
age = 35;

// Simple variable interpolation
message = "Hello #name#, you are #age# years old.";
writeOutput(message); // Hello Luis, you are 35 years old.
```

### Expression Interpolation
```cfscript
firstName = "Luis";
lastName = "Majano";

// Function calls and expressions
welcome = "Welcome #firstName# #lastName# on #dateFormat(now(), 'mm/dd/yyyy')#";

// Mathematical expressions
price = 25.99;
tax = 0.08;
total = "Total cost: $#numberFormat(price * (1 + tax), '9.99')#";
```

### Complex Object Interpolation
```cfscript
user = {
    name: "Luis",
    email: "luis@ortus.com",
    active: true
};

// Structure access
info = "User: #user.name# (#user.email#) - Active: #user.active#";

// Array access
scores = [95, 87, 92];
report = "Best score: #scores[1]#, Average: #arrayAvg(scores)#";
```

### Conditional Interpolation
```cfscript
status = "active";
message = "User is #status == 'active' ? 'currently active' : 'inactive'#";

// Using safe navigation
user = { profile: { name: "Luis" } };
greeting = "Hello #user?.profile?.name ?: 'Guest'#";
```

### Nested Interpolation
```cfscript
template = "Hello #{variables.user.firstName}#";
dynamicVar = "user.firstName";
value = "Welcome #evaluate('variables.#dynamicVar#')#";
```

## Key Points
- Hash symbols (`#`) delimit interpolated expressions
- Any valid CFML expression can be interpolated
- Interpolation works in both single and double quotes
- Complex objects require proper syntax (dots, brackets)
- Functions can be called within interpolation
- Avoid redundant hashing: use `a = b` not `a = #b#`
- Performance: Simple concatenation may be faster for basic cases

## Common Patterns
```cfscript
// Date formatting
message = "Today is #dateFormat(now(), 'full')#";

// Conditional display
status = "Status: #isActive ? 'Online' : 'Offline'#";

// Number formatting
price = "Price: $#dollarFormat(cost)#";

// String manipulation
title = "Title: #ucase(productName)#";
```

## Best Practices
- Don't over-hash: `name = #firstName#` should be `name = firstName`
- Use for output and string building, not simple assignments
- Consider performance for complex expressions in loops
- Use safe navigation (`?.`) for potentially null objects

## Related Concepts
- [String Literals](string-literals.md)
- [String Functions](string-functions.md)
- [Variables](../variables.md)
- [Conditionals](../../control-flow/conditionals.md)

================================================
FILE: .ai/cfml/data-types/strings/string-literals.md
================================================
# String Literals

## Overview
Strings in CFML store collections of characters and are backed by Java's immutable String class. They can be defined using single or double quotes and support various manipulation techniques.

## Syntax
```cfscript
stringVariable = "text content";
// or
stringVariable = 'text content';
```

## Examples

### Basic String Creation
```cfscript
name = "Luis";
message = 'Hello World!';
empty = "";
```

### String Interpolation
```cfscript
name = "Luis";
greeting = "Hello #name#, welcome!";
writeOutput(greeting); // Hello Luis, welcome!

// Complex expressions in interpolation
welcome = "Good morning #name#, today is #dateFormat(now(), 'mm/dd/yyyy')#";
```

### Character Extraction (Modern Engines)
```cfscript
name = "Luis";
firstChar = name[1];      // "L" (1-based indexing)
lastChar = name[-1];      // "s" (negative indexing from end)

// Range extraction (Adobe 2018+)
data = "Hello CFML. You Rock!";
substring = data[4:12];   // "lo CFML"
stepped = data[4:10:2];   // "l FL" (every 2nd character)
```

### String Concatenation
```cfscript
firstName = "Luis";
lastName = "Majano";

// Using & operator
fullName = firstName & " " & lastName;

// Using &= assignment operator
greeting = "Hello ";
greeting &= firstName;
greeting &= "!";
```

## Key Points
- Strings are **immutable** (Java String objects)
- Both single and double quotes work identically
- String indexes start at **1**, not 0
- Negative indexing available in modern engines
- Interpolation works with `#expression#` syntax
- Heavy concatenation should use StringBuilder for performance
- Case-insensitive language but string content preserves case

## Related Concepts
- [String Functions](string-functions.md)
- [String Interpolation](string-interpolation.md)
- [Variables](../variables.md)

================================================
FILE: .ai/cfml/data-types/structures/struct-creation.md
================================================
# Struct Creation in CFML

## Overview
CFML structures (similar to objects/dictionaries in other languages) are key-value collections that support multiple creation methods and types. Modern CFML offers literal syntax and various struct types for different use cases.

## Basic Struct Creation

### Literal Syntax (Modern Approach)
```cfscript
// Empty struct
var person = {};

// Struct with initial values
var user = {
    name: "John Doe",
    age: 30,
    email: "john@example.com",
    active: true
};

// Mixed data types
var mixed = {
    id: 1,
    data: ["a", "b", "c"],
    config: {theme: "dark", lang: "en"},
    callback: function() { return "hello"; }
};
```

### Traditional Function Syntax
```cfscript
// Empty struct using structNew()
var person = structNew();

// Populate after creation
person.name = "John Doe";
person["age"] = 30;
person.email = "john@example.com";
```

## Advanced Struct Types (CF2016+)

### Ordered Structs
```cfscript
// Ordered struct maintains insertion order
var orderedData = structNew("ordered");
orderedData.first = "A";
orderedData.second = "B";
orderedData.third = "C";

// Literal syntax for ordered struct
var orderedLiteral = [:]; // Empty ordered struct
var orderedWithData = [=]; // Alternative syntax

// With initial data (order preserved)
var config = [=];
config.database = "mydb";
config.username = "user";
config.password = "pass";
```

### Case-Sensitive Structs (CF2021+)
```cfscript
// Case-sensitive struct
var caseSensitive = structNew("casesensitive");
caseSensitive.Name = "John"; // Capital N
caseSensitive.name = "Jane"; // Lowercase n - different key

// Literal syntax
var csStruct = ${
    "FirstName": "John",
    "firstName": "Jane"  // Different from FirstName
};

// Ordered and case-sensitive
var orderedCS = structNew("ordered-casesensitive");
var orderedCSLiteral = $[=];
```

### Sorted Structs (CF2016 Update 3+)
```cfscript
// Text-based sorting
var textSorted = structNew("ordered", "text", "asc");
textSorted.zebra = "Z";
textSorted.apple = "A";
textSorted.banana = "B";
// Keys will be ordered: apple, banana, zebra

// Numeric sorting
var numericSorted = structNew("ordered", "numeric", "desc");
numericSorted["10"] = "ten";
numericSorted["2"] = "two";
numericSorted["100"] = "hundred";
// Keys ordered: 100, 10, 2

// Custom sorting with callback
var customSorted = structNew("ordered", function(a, b) {
    // Custom comparison logic
    return len(a) - len(b); // Sort by key length
});
```

## Dynamic Struct Creation

### From Arrays
```cfscript
// Create struct from parallel arrays
var keys = ["name", "age", "city"];
var values = ["John", 30, "NYC"];
var person = {};

for (var i = 1; i <= arrayLen(keys); i++) {
    person[keys[i]] = values[i];
}

// Using arrayEach with closure
var person2 = {};
keys.each(function(key, index) {
    person2[key] = values[index];
});
```

### From Query Data
```cfscript
// Convert query row to struct
var users = queryNew("id,name,email", "integer,varchar,varchar", [
    [1, "John", "john@example.com"],
    [2, "Jane", "jane@example.com"]
]);

// Single row to struct
var firstUser = {};
var columnList = users.columnList;
for (var col in listToArray(columnList)) {
    firstUser[col] = users[col][1];
}

// All rows to array of structs
var userStructs = [];
for (var row = 1; row <= users.recordCount; row++) {
    var userStruct = {};
    for (var col in listToArray(columnList)) {
        userStruct[col] = users[col][row];
    }
    arrayAppend(userStructs, userStruct);
}
```

## Nested Structures

### Deep Nesting
```cfscript
var application = {
    config: {
        database: {
            host: "localhost",
            port: 3306,
            credentials: {
                username: "user",
                password: "pass"
            }
        },
        cache: {
            enabled: true,
            ttl: 3600,
            providers: ["memory", "redis"]
        }
    },
    features: {
        authentication: true,
        reporting: false,
        api: {
            version: "2.0",
            endpoints: ["/users", "/orders", "/products"]
        }
    }
};

// Accessing nested values
var dbHost = application.config.database.host;
var apiVersion = application.features.api.version;
```

### Safe Navigation
```cfscript
function getNestedValue(struct, path, defaultValue = "") {
    var current = struct;
    var keys = listToArray(path, ".");

    for (var key in keys) {
        if (isStruct(current) && structKeyExists(current, key)) {
            current = current[key];
        } else {
            return defaultValue;
        }
    }

    return current;
}

// Usage
var dbPort = getNestedValue(application, "config.database.port", 3306);
var invalidPath = getNestedValue(application, "config.nonexistent.value", "default");
```

## Struct Factories

### Configuration Builder
```cfscript
function createConfig(environment = "production") {
    var baseConfig = {
        appName: "MyApp",
        version: "1.0",
        debug: false
    };

    var envConfigs = {
        development: {
            debug: true,
            database: "dev_db",
            logLevel: "DEBUG"
        },
        testing: {
            debug: true,
            database: "test_db",
            logLevel: "INFO"
        },
        production: {
            debug: false,
            database: "prod_db",
            logLevel: "ERROR"
        }
    };

    // Merge base config with environment-specific config
    if (structKeyExists(envConfigs, environment)) {
        structAppend(baseConfig, envConfigs[environment]);
    }

    return baseConfig;
}

var devConfig = createConfig("development");
var prodConfig = createConfig("production");
```

### Object Factory Pattern
```cfscript
function createUser(name, email, role = "user") {
    return {
        id: createUUID(),
        name: arguments.name,
        email: arguments.email,
        role: arguments.role,
        createdAt: now(),
        isActive: true,

        // Methods as struct properties
        getName: function() {
            return this.name;
        },

        isAdmin: function() {
            return this.role == "admin";
        },

        toJSON: function() {
            return serializeJSON(this);
        }
    };
}

var admin = createUser("John Admin", "admin@example.com", "admin");
var regularUser = createUser("Jane User", "jane@example.com");
```

## Advanced Patterns

### Immutable Struct Pattern
```cfscript
function createImmutableStruct(data) {
    var immutable = duplicate(data);

    // Add helper methods that return new instances
    immutable.set = function(key, value) {
        var newStruct = duplicate(this);
        newStruct[key] = value;
        return createImmutableStruct(newStruct);
    };

    immutable.get = function(key, defaultValue = "") {
        return structKeyExists(this, key) ? this[key] : defaultValue;
    };

    immutable.keys = function() {
        return structKeyArray(this);
    };

    return immutable;
}

var original = createImmutableStruct({name: "John", age: 30});
var updated = original.set("age", 31); // Returns new instance
// original remains unchanged
```

### Struct Validation
```cfscript
function createValidatedStruct(schema, data = {}) {
    var validated = {};

    for (var field in schema) {
        var fieldDef = schema[field];
        var value = structKeyExists(data, field) ? data[field] : fieldDef.default;

        // Type validation
        if (structKeyExists(fieldDef, "type")) {
            if (fieldDef.type == "string" && !isSimpleValue(value)) {
                throw("Field '#field#' must be a string");
            } else if (fieldDef.type == "numeric" && !isNumeric(value)) {
                throw("Field '#field#' must be numeric");
            } else if (fieldDef.type == "boolean" && !isBoolean(value)) {
                throw("Field '#field#' must be boolean");
            }
        }

        // Required validation
        if (structKeyExists(fieldDef, "required") && fieldDef.required && isEmpty(value)) {
            throw("Field '#field#' is required");
        }

        validated[field] = value;
    }

    return validated;
}

// Usage
var userSchema = {
    name: {type: "string", required: true},
    age: {type: "numeric", default: 0},
    active: {type: "boolean", default: true}
};

var validUser = createValidatedStruct(userSchema, {
    name: "John",
    age: 30
});
```

## Key Points

- Use literal syntax `{}` for modern CFML development
- Struct keys are case-insensitive by default (except case-sensitive types)
- Use `structNew("ordered")` or `[:]` for ordered structs
- Case-sensitive structs available in CF2021+ with `${}` syntax
- Structs are passed by reference
- Use `structKeyExists()` to safely check for key existence
- Member functions available on structs (CF11+)
- Sorted structs can use custom callback functions for ordering

## Related Concepts

- [Array Creation](../arrays/array-creation.md)
- [Variables Scope](../scopes/variables-scope.md)
- [Object-Oriented Programming](../../components/component-basics.md)

================================================
FILE: .ai/cfml/data-types/structures/structure-basics.md
================================================
# Structure Basics

## Overview
Structures in CFML are unordered collections of key-value pairs, similar to dictionaries or hash maps. They're based on Java's Map interface and provide flexible data storage with various specialized types for different use cases.

## Syntax
```cfscript
// Literal syntax
structure = { key1: value1, key2: value2 };

// Constructor function
structure = structNew([type]);
```

## Examples

### Basic Structure Creation
```cfscript
// Empty structure
person = {};

// Structure with initial values
person = {
    name: "Luis",
    age: 35,
    active: true
};

// Case-sensitive keys (quoted)
person = {
    "firstName": "Luis",
    "lastName": "Majano",
    "isActive": true
};
```

### Value Access Methods
```cfscript
person = { name: "Luis", age: 35 };

// Dot notation (converts to uppercase)
name = person.name;
age = person.age;

// Array notation (preserves case)
name = person["name"];
age = person["age"];

// Using structFind()
name = person.find("name");
name = structFind(person, "name");
```

### Adding and Modifying Values
```cfscript
person = { name: "Luis" };

// Add new keys
person.age = 35;
person["email"] = "luis@ortus.com";

// Update existing values
person.age = 36;
person["age"] = 37;

// Using struct functions
person.insert("city", "Boston");
person.update("city", "Miami");
structInsert(person, "country", "USA");
```

### Safe Navigation
```cfscript
user = { profile: { name: "Luis" } };

// Safe navigation to avoid errors
name = user?.profile?.name;           // "Luis"
email = user?.profile?.email;         // null (no error)
email = user?.profile?.email ?: "N/A"; // "N/A" (with default)
```

### Structure Types
```cfscript
// Case-sensitive structure
sensitiveStruct = structNew("casesensitive");
sensitiveStruct["Name"] = "Luis";
sensitiveStruct["name"] = "Maria"; // Different from "Name"

// Ordered structure (maintains insertion order)
orderedStruct = structNew("ordered");
orderedStruct = [:]; // literal syntax

// Adobe case-sensitive literal syntax
caseStruct = ${ Name: "Luis" };
```

## Key Points
- Keys are case-insensitive by default (stored uppercase)
- Use quoted keys to preserve exact casing
- Array notation preserves case, dot notation does not
- Structures are passed by reference to functions
- Unordered by default (except ordered/linked types)
- Based on Java's Map interface

## Common Structure Types
- `normal` - Standard case-insensitive structure
- `casesensitive` - Keys are case-sensitive
- `ordered`/`linked` - Maintains insertion order
- `ordered-casesensitive` - Both ordered and case-sensitive
- `soft` - Lucee only: soft references for memory management
- `synchronized` - Lucee only: thread-safe operations
- `weak` - Lucee only: weak references

## Related Concepts
- [Variables](../variables.md)
- [Variable Scopes](../variable-scopes.md)

================================================
FILE: .ai/cfml/data-types/variable-scopes.md
================================================
# Variable Scopes

## Overview
CFML organizes variables into different scopes based on context and persistence requirements. All scopes are implemented as structures (hash maps) for key-value storage. Understanding scopes is crucial for performance and avoiding variable conflicts.

## Syntax
```cfscript
scopeName.variableName = value;
// or unscoped (searches scope chain)
variableName = value;
```

## Examples

### Persistence Scopes
```cfscript
// Application-wide variables
application.appName = "MyApp";

// Session-specific variables
session.userID = 12345;

// Single request variables
request.startTime = now();

// Client storage (cookies/database)
client.userPreferences = "dark_mode";

// Server RAM storage
server.startupTime = now();
```

### Component Scopes
```cfscript
component {

    // Private scope - internal to CFC only
    variables.privateData = "secret";

    // Public scope - accessible from outside
    this.publicData = "visible";

    function myMethod() {
        // Function-local scope
        var localVar = "function only";
        local.anotherLocal = "also local";

        // Access arguments
        return arguments.param1;
    }
}
```

### Template Scopes
```cfscript
// Default scope for variables
variables.myVar = "hello";

// Same as above (variables is default)
myVar = "hello";

// Form and URL scopes
echo("Form field: " & form.username);
echo("URL param: " & url.action);
```

### Explicit Scoping Best Practice
```cfscript
// BAD - unscoped variable lookup is slow
myVar = "hello";

// GOOD - explicit scoping is faster
variables.myVar = "hello";

// GOOD - accessing form data
if (structKeyExists(form, "username")) {
    variables.username = form.username;
}
```

## Key Points
- **Performance**: Explicit scoping improves performance by avoiding scope chain lookup
- **Variables scope**: Default scope for variable assignments
- **Case-insensitive**: All scope names are case-insensitive
- **Scope chain**: Unscoped variables search in specific order (Local → Arguments → Thread → Variables → CGI → URL → Form → Cookie → Client)
- **Memory references**: Structures are passed by reference, not value
- **Thread safety**: Most scopes are not thread-safe by default

## Scope Search Order (Unscoped Variables)
1. Local (function-local only)
2. Arguments
3. Thread local (inside threads only)
4. Query (in query loops)
5. Thread
6. Variables
7. CGI
8. CFFILE
9. URL
10. Form
11. Cookie
12. Client

## Related Concepts
- [Variables](variables.md)
- [Functions](../components/functions.md)
- [Components](../components/component-basics.md)

================================================
FILE: .ai/cfml/data-types/variables.md
================================================
# Variables

## Overview
CFML variables are dynamic pointers to data that can hold any value type. They don't require type declaration and can change types at runtime. Variables are case-insensitive but best practice is to maintain consistent casing.

## Syntax
```cfscript
variableName = value;
```

## Examples

### Basic Variable Assignment
```cfscript
a = "string";           // string
b = now();             // datetime
c = 123;               // integer
d = 1.34;              // float
f = false;             // boolean
```

### Dynamic Typing
```cfscript
a = "Hello Luis";      // string
a = [1,2,3];          // now it's an array
a = { name: "Luis" };  // now it's a structure
```

### Variable Interpolation
```cfscript
name = "Luis";
greeting = "Hello #name#, how are you?";
writeOutput(greeting);
```

### Variable Existence Checking
```cfscript
// Using isDefined() - variable name in quotes
if (isDefined("myVariable")) {
    writeOutput(myVariable);
}

// Using isNull() - variable NOT in quotes
if (!isNull(myVariable)) {
    writeOutput(myVariable);
}

// Using structKeyExists()
if (structKeyExists(variables, "myVariable")) {
    writeOutput(myVariable);
}
```

## Key Points
- Variables are dynamically typed and can change types at runtime
- Case-insensitive but consistent casing is recommended
- Assignments evaluate from right to left
- String interpolation uses `#variableName#` syntax
- Semi-colons are optional in modern engines
- All variables are stored in scopes (structures/hash maps)
- CFML provides type validation functions (`isArray()`, `isString()`, etc.)

## Related Concepts
- [Variable Scopes](variable-scopes.md)
- [Strings](strings/string-literals.md)
- [Arrays](arrays/array-creation.md)
- [Structures](structures/structure-basics.md)

================================================
FILE: .ai/cfml/database/query-basics.md
================================================
# Query Basics

## Overview
CFML provides simple yet powerful database querying capabilities through cfquery tags and queryExecute() functions. Queries can be executed against named datasources, with support for parameterized queries to prevent SQL injection.

## Syntax
```cfscript
// Function syntax
result = queryExecute(sql, params, options);

// Tag syntax
<cfquery name="result" datasource="myDB">
    SQL statement here
</cfquery>
```

## Examples

### Basic Query Execution
```cfscript
// Simple query with queryExecute()
qItems = queryExecute(
    "SELECT quantity, item FROM cupboard ORDER BY item"
);

// Query with named datasource
qUsers = queryExecute(
    "SELECT id, name, email FROM users",
    {},
    { datasource: "myDatabase" }
);
```

### Tag Syntax
```markup
<cfquery name="qItems" datasource="pantry">
    SELECT quantity, item
    FROM cupboard
    ORDER BY item
</cfquery>
```

### Parameterized Queries (SQL Injection Prevention)
```cfscript
// Named parameters
userID = 123;
qUser = queryExecute(
    "SELECT * FROM users WHERE id = :userID",
    {
        userID: { value: userID, cfsqltype: "integer" }
    }
);

// Positional parameters
qProducts = queryExecute(
    "SELECT * FROM products WHERE category = ? AND price > ?",
    [
        { value: "electronics", cfsqltype: "varchar" },
        { value: 100, cfsqltype: "numeric" }
    ]
);
```

### Datasource Configuration in Application.cfc
```cfscript
// Application.cfc
component {
    this.name = "MyApp";

    // Default datasource
    this.datasource = "myDB";

    // Multiple datasources
    this.datasources = {
        "myDB": {
            driver: "MySQL",
            host: "localhost",
            port: "3306",
            database: "myapp",
            username: getSystemSetting("DB_USER"),
            password: getSystemSetting("DB_PASSWORD")
        },
        "reporting": {
            class: "com.mysql.jdbc.Driver",
            connectionString: "jdbc:mysql://localhost:3306/reports",
            username: "reporter",
            password: "secret"
        }
    };
}
```

### Inline Datasource Definition (Lucee)
```cfscript
qData = queryExecute(
    "SELECT * FROM employees WHERE department = ?",
    [{ value: "IT", cfsqltype: "varchar" }],
    {
        datasource: {
            class: "com.microsoft.sqlserver.jdbc.SQLServerDriver",
            connectionString: "jdbc:sqlserver://server:1433;databaseName=HR",
            username: getSystemSetting("DB_USER"),
            password: getSystemSetting("DB_PASSWORD")
        }
    }
);
```

### Query Result Processing
```cfscript
// Traditional loop
for (var row in qItems) {
    writeOutput("Item: #row.item#, Quantity: #row.quantity#<br>");
}

// Each() method
qItems.each(function(row, index) {
    writeOutput("Row #index#: #row.item# - #row.quantity#<br>");
});

// Index-based access
for (var i = 1; i <= qItems.recordCount; i++) {
    writeOutput("#qItems.item[i]#: #qItems.quantity[i]#<br>");
}
```

### Query Metadata Access
```cfscript
qResult = queryExecute("SELECT * FROM users LIMIT 5");

// Query properties
recordCount = qResult.recordCount;      // Number of rows
columnList = qResult.columnList;        // Comma-delimited column names
columns = qResult.getColumnNames();     // Array of column names

// Check if query has data
if (qResult.recordCount > 0) {
    // Process results
}
```

### Dynamic Query Building
```cfscript
function searchUsers(filters = {}) {
    var sql = "SELECT * FROM users WHERE 1=1";
    var params = {};

    if (structKeyExists(filters, "name")) {
        sql &= " AND name LIKE :name";
        params.name = { value: "%#filters.name#%", cfsqltype: "varchar" };
    }

    if (structKeyExists(filters, "active")) {
        sql &= " AND active = :active";
        params.active = { value: filters.active, cfsqltype: "bit" };
    }

    return queryExecute(sql, params);
}
```

### Query Options
```cfscript
qResults = queryExecute(
    "SELECT * FROM large_table",
    {},
    {
        datasource: "myDB",
        timeout: 30,                    // Query timeout in seconds
        maxrows: 1000,                  // Limit result set
        blockfactor: 100,               // Rows to fetch at once
        returntype: "array",            // Return as array of structs
        ormoptions: { cacheable: true } // ORM-specific options
    }
);
```

## Key Points
- Always use parameterized queries to prevent SQL injection
- Default datasource can be set in Application.cfc for convenience
- Query objects are iterable and provide metadata access
- Lucee supports inline datasource definitions
- CFML queries return special query objects with built-in methods
- Parameters support type validation through cfsqltype

## SQL Parameter Types (cfsqltype)
- `varchar`, `char` - String data
- `integer`, `numeric`, `decimal` - Numeric data
- `bit`, `boolean` - Boolean values
- `date`, `time`, `timestamp` - Date/time values
- `blob`, `clob` - Binary/large text data

## Security Best Practices
- Always parameterize user input
- Use cfsqltype for proper type validation
- Store database credentials as environment variables
- Implement connection limits and timeouts
- Use read-only database users for reporting queries

## Performance Considerations
- Use appropriate indexes on queried columns
- Limit result sets with WHERE clauses and LIMIT
- Consider using blockfactor for large result sets
- Cache frequently-used query results
- Monitor query execution times

## Related Concepts
- [Exception Handling](../control-flow/exception-handling.md)

================================================
FILE: .ai/cfml/syntax/basic-syntax.md
================================================
# Basic CFML Syntax

## Overview
CFML supports two syntax styles: tag-based syntax (for views/templates) and script syntax (for business logic/components). Modern CFML development emphasizes script syntax for components and business logic.

## Syntax
- `.cfm` files: ColdFusion markup files (tag-based by default)
- `.cfc` files: ColdFusion Component files (script-based by default)
- Semi-colons are optional in Lucee and Adobe ColdFusion 2018+
- Language is case-insensitive but best practice is to maintain consistent casing

## Examples

### Basic Script Syntax
```cfscript
// Variable assignment
s = new Sample();
writeOutput( s.hello() );

// Function definition
function hello(){
    return "Hello, World!";
}
```

### Tag Syntax
```markup
<cfset s = new Sample()>
<cfoutput>#s.hello()#</cfoutput>
```

### Mixed Syntax (Script in Tag-based File)
```markup
<cfscript>
    s = new Sample();
    writeOutput( s.hello() );
</cfscript>
```

## Key Points
- Tag syntax uses `<cf...>` constructs
- Script syntax uses JavaScript-like syntax
- Semi-colons are line terminators (optional in modern engines)
- Variables are dynamically typed
- Case-insensitive language but consistent casing is recommended
- Built-in functions are first-class functions (can be passed as arguments)

## Related Concepts
- [Comments](comments.md)
- [Variables](../data-types/variables.md)
- [Variable Scopes](../data-types/variable-scopes.md)

================================================
FILE: .ai/cfml/syntax/cfscript-vs-tags.md
================================================
# CFScript vs Tags

## Overview
CFML offers two syntactic approaches: traditional tag-based syntax and modern script syntax. Modern CFML development favors script syntax for business logic and tag syntax for presentation layers.

## Syntax
- **Tag Syntax**: XML-like tags with `<cf...>` prefix
- **Script Syntax**: JavaScript-like syntax within `<cfscript>` blocks or `.cfc` files
- **Tags in Script**: Modern engines allow tag-like constructs in script format

## Examples

### Tag Syntax Example
```markup
<cfset name = "Luis">
<cfoutput>Hello #name#!</cfoutput>

<cfif structKeyExists(session, "user")>
    <cfset currentUser = session.user>
</cfif>
```

### Script Syntax Example
```cfscript
name = "Luis";
writeOutput("Hello " & name & "!");

if (structKeyExists(session, "user")) {
    currentUser = session.user;
}
```

### Tags in Script Format
```cfscript
cfhttp(method="GET", charset="utf-8", url="https://www.google.com/", result="result") {
    cfhttpparam(name="q", type="formfield", value="cfml");
}
```

### Component Definition
```cfscript
component {

    public string function hello() {
        return "Hello, World!";
    }

}
```

## Key Points
- Script syntax is preferred for business logic and components
- Tag syntax is preferred for presentation/view layers
- No functional differences between approaches - purely syntactic
- Script syntax is more familiar to developers from other languages
- Tags in script eliminate need for switching between syntaxes
- Modern engines support both approaches seamlessly

## Related Concepts
- [Basic Syntax](basic-syntax.md)
- [Comments](comments.md)
- [Components](../components/component-basics.md)

================================================
FILE: .ai/cfml/syntax/comments.md
================================================
# CFML Comments

## Overview
CFML supports multiple comment styles for different contexts: tag comments, script comments, and documentation comments. Proper commenting is essential for code maintenance and documentation generation.

## Syntax
- **Tag Comments**: `<!--- comment --->`
- **Script Single-line**: `// comment`
- **Script Multi-line**: `/* comment */`
- **Documentation**: `/** JavaDoc-style */`

## Examples

### Tag Comments
```markup
<!--- HTML Comment (visible in source) -->
<!-- I am an HTML Comment -->

<!--- ColdFusion Comment (not sent to browser) -->
<!--- I am a ColdFusion Comment --->
```

### Script Comments
```cfscript
// Single line comment

/*
  Multi
  Line
  Comments
  are
  great!
*/

/**
 * Multi-line Javadoc style comment
 *
 * @COLDBOX_CONFIG_FILE The override location of the config file
 * @COLDBOX_APP_ROOT_PATH The location of the app on disk
 */
```

### Documentation Comments
```cfscript
/**
 * This is my component
 *
 * @author Luis Majano
 */
component extends="Base" implements="IHello" singleton {

    /**
     * Constructor
     *
     * @wirebox The Injector
     * @wirebox.inject wirebox
     * @vars The vars I need
     * @vars.generic Array
     *
     * @return MyComponent
     * @throws SomethingException
     */
    function init(required wirebox, required vars) {
        variables.wirebox = arguments.wirebox;
        return this;
    }

}
```

### Function Documentation
```cfscript
/**
 * This is the hint for the function
 *
 * @param1 This is the hint for the param
 */
function myFunc(string param1) {
    // Function implementation
}
```

## Key Points
- CFML comments (`<!--- --->`) are not sent to the browser
- HTML comments (`<!-- -->`) are visible in browser source
- JavaDoc-style comments affect component and function metadata
- Documentation comments enable automatic API documentation generation
- DocBox library can generate documentation from CFCDoc comments
- Leading asterisks in multi-line comments are parsed out automatically

## Related Concepts
- [Basic Syntax](basic-syntax.md)
- [Components](../components/component-basics.md)
- [Functions](../components/functions.md)

================================================
FILE: .ai/cfml/syntax/hash-escaping.md
================================================
# Hash/Pound Sign Escaping in CFML

## Overview
In CFML, the hash symbol (#) has special meaning for variable interpolation and evaluation. When you need to use a literal hash symbol (such as in CSS colors, HTML anchors, or other contexts), you must escape it by doubling it (##).

## The Rule
**Single # = Variable evaluation**
**Double ## = Literal hash symbol**

## Syntax
```cfml
// Variable interpolation (single #)
name = "John";
message = "Hello #name#!";  // Outputs: Hello John!

// Literal hash symbol (double ##)
color = "##FF0000";  // Outputs: #FF0000
```

## When Hash Escaping is Required

### 1. CSS Color Values
```cfml
<cfscript>
// Wrong - CFML tries to evaluate #FFF as a variable
badColor = "#FFF";  // Error: Variable FFF is undefined

// Correct - Double ## creates literal #
goodColor = "##FFF";  // Outputs: #FFF
backgroundColor = "##333333";  // Outputs: #333333
</cfscript>

// In cfoutput blocks
<cfoutput>
<style>
    body { background-color: ##e0e0e0; }
    .highlight { color: ##ff6600; }
</style>
</cfoutput>
```

### 2. HTML Anchors and Fragment Identifiers
```cfml
<cfscript>
// Anchor links
anchorLink = '<a href="##section1">Go to Section 1</a>';

// Fragment identifiers
fragmentUrl = "page.cfm##top";
</cfscript>

<cfoutput>
<a href="##contact">Contact Section</a>
<div id="contact">...</div>
</cfoutput>
```

### 3. JavaScript and CSS in CFML Blocks
```cfml
<cfoutput>
<script>
    // Hash in JavaScript strings within CFML
    var elementId = "##myElement";
    document.querySelector("##navbar").style.display = "block";

    // Hash in regular expressions
    var hashRegex = /##[\w]+/g;
</script>

<style>
    ##header { margin-top: 20px; }
    .class##variation { color: ##blue; }
</style>
</cfoutput>
```

### 4. URL Parameters and Query Strings
```cfml
<cfscript>
// URL with fragment
redirectUrl = "dashboard.cfm?tab=overview##results";

// Social media sharing URLs
twitterUrl = "https://twitter.com/intent/tweet?hashtags=cfml&text=Learning##CFML";
</cfscript>
```

### 5. Regular Expressions
```cfml
<cfscript>
// Hash symbols in regex patterns
hashtagPattern = "##\w+";  // Matches hashtags like #cfml
colorPattern = "##[0-9A-Fa-f]{6}";  // Matches hex colors like #FF0000

// Using reFind with hash patterns
text = "Check out #CFML and #WebDev";
hashTags = reFind("##\w+", text, 1, true);
</cfscript>
```

### 6. Database Queries with Hash Values
```cfml
<cfscript>
// Inserting literal hash values into database
colorCode = "##FF5733";
queryExecute(
    "INSERT INTO colors (name, hex_value) VALUES (?, ?)",
    ["Orange", colorCode]
);

// Hash in SQL comments (less common)
sql = "
    SELECT * FROM products
    -- This query filters by color ##FF0000
    WHERE color_hex = ?
";
</cfscript>
```

## Context-Dependent Escaping

### In CFScript
```cfml
<cfscript>
// Always double ## for literal hash
cssColor = "##336699";
jsSelector = "##elementId";
htmlAnchor = '<a href="##top">Top</a>';
</cfscript>
```

### In Tag Attributes
```cfml
<!-- In tag attributes, escaping is usually required -->
<cfset linkUrl = "page.cfm##section">
<cfset cssClass = "color-##ff0000">

<!-- In cfoutput, definitely required -->
<cfoutput>
<div style="background: ##f5f5f5;">Content</div>
</cfoutput>
```

### In String Literals vs. Output Blocks
```cfml
<cfscript>
// In string assignments - double ##
colorVar = "##red";
anchorVar = "##top";
</cfscript>

<!-- In output blocks - double ## -->
<cfoutput>
<style>
    .main { color: ##333; }
</style>
</cfoutput>

<!-- Outside CFML processing - single # is fine -->
<style>
    .static { color: #333; }
</style>
```

## Common Mistakes and Solutions

### Mistake 1: Forgetting to Escape in Strings
```cfml
<cfscript>
// Wrong - Will cause "Variable FFF is undefined" error
// color = "#FFF";

// Correct
color = "##FFF";
</cfscript>
```

### Mistake 2: Over-escaping Outside CFML Context
```cfml
<!-- Wrong - Double escaping where not needed -->
<!-- <style>
    body { color: ##333; }  /* This will output ##333 literally */
</style> -->

<!-- Correct - No CFML processing here -->
<style>
    body { color: #333; }
</style>

<!-- But in cfoutput blocks, you DO need escaping -->
<cfoutput>
<style>
    body { color: ##333; }  /* This correctly outputs #333 */
</style>
</cfoutput>
```

### Mistake 3: Mixed Variable and Literal Usage
```cfml
<cfscript>
userId = 123;
// Combining variable interpolation with literal hash
userUrl = "profile.cfm?id=#userId###details";
// Output: profile.cfm?id=123#details
</cfscript>
```

## Complex Examples

### CSS with CFML Variables
```cfml
<cfscript>
primaryColor = "##2c3e50";
secondaryColor = "##ecf0f1";
fontSize = 16;
</cfscript>

<cfoutput>
<style>
    .theme-primary {
        background-color: #primaryColor#;
        color: #secondaryColor#;
        font-size: #fontSize#px;
        border: 1px solid ##ddd;  /* Literal gray border */
    }

    ##header { /* Literal ID selector */
        background: linear-gradient(to right, #primaryColor#, ##ffffff);
    }
</style>
</cfoutput>
```

### JavaScript with Mixed Hash Usage
```cfml
<cfscript>
modalId = "confirmModal";
</cfscript>

<cfoutput>
<script>
    // Variable interpolation for ID
    var modal = document.getElementById("#modalId#");

    // Literal hash for CSS selectors in JavaScript
    var header = document.querySelector("##header");
    var navItems = document.querySelectorAll("##navbar .nav-item");

    // Hash in object keys or values
    var config = {
        theme: "#primaryColor#",
        anchor: "##main-content"
    };
</script>
</cfoutput>
```

### URL Building with Fragments
```cfml
<cfscript>
page = "dashboard";
section = "reports";
userId = session.userId;

// Building URL with query params and fragment
dashboardUrl = "#page#.cfm?user=#userId###section#";
// Output: dashboard.cfm?user=123#reports

// Social sharing URL with hashtags
shareText = "Check out this CFML framework!";
twitterUrl = "https://twitter.com/intent/tweet?text=#urlEncodedFormat(shareText)#&hashtags=cfml,webdev";
</cfscript>
```

## Best Practices

### 1. Consistency in Escaping
- Always double ## when you need a literal hash symbol in CFML-processed content
- Be consistent across your codebase

### 2. Context Awareness
- Understand whether your code is in a CFML-processed context
- Static HTML/CSS/JS files don't need hash escaping
- Dynamic content within `<cfoutput>` or CFScript strings does need escaping

### 3. Testing Hash-Heavy Content
```cfml
<cfscript>
// When working with lots of hash symbols, test thoroughly
cssContent = "
    ##main { background: ##f0f0f0; }
    ##sidebar { border: 1px solid ##ccc; }
    .highlight { color: ##ff6600; }
";

// Verify output matches expectations
writeOutput(htmlCodeFormat(cssContent));
</cfscript>
```

### 4. Documentation
- Comment your code when mixing variable interpolation with literal hashes
- Make intent clear for future maintainers

## Key Points
- **Single #** triggers variable evaluation in CFML
- **Double ##** produces a literal hash symbol
- Escaping is required in CFML-processed contexts (CFScript strings, cfoutput blocks)
- Static HTML/CSS/JavaScript files don't require hash escaping
- Common use cases: CSS colors, HTML anchors, JavaScript selectors, URLs with fragments
- Test thoroughly when mixing variable interpolation with literal hash symbols

## Related Concepts
- [Variable Interpolation](../data-types/variables.md)
- [String Literals](../data-types/strings/string-literals.md)
- [CFScript vs Tags](./cfscript-vs-tags.md)

================================================
FILE: .ai/wheels/channels/channels.md
================================================
# Channels — Pub/Sub for SSE

Channels add a pub/sub abstraction on top of Wheels' existing Server-Sent Events (SSE) support. The existing low-level SSE API (`renderSSE`, `initSSEStream`, `sendSSEEvent`) continues to work unchanged — channels are a higher-level layer built on top.

## Quick Start

```cfm
// Controller — subscribe the client to a channel via SSE
function notifications() {
    subscribeToChannel(
        channel = "user.#params.userId#",
        events = "notification,alert"
    );
}

// Publish from anywhere — model callback, job, controller, etc.
publish(
    channel = "user.42",
    event = "notification",
    data = SerializeJSON({title: "New message", body: "Hello!"})
);
```

```html
<!-- View — auto-generate EventSource script tag -->
#channelSSETag(channel="user.#params.userId#", route="notifications")#
```

## Configuration

```cfm
// config/settings.cfm

// Default adapter: "memory" (single server) or "database" (multi-server)
set(channelAdapter = "memory");
```

## Adapters

### Memory (Default)

In-memory pub/sub using `ConcurrentHashMap`. Events are delivered instantly to subscribers on the same server. No persistence — events are lost if no subscribers are connected.

Best for: single-server deployments, development.

### Database

Persists events to a `wheels_events` table (auto-created on first use). Subscribers poll the table at configurable intervals. Events are retained for 60 minutes by default with automatic cleanup.

Best for: multi-server deployments, event history/replay.

```cfm
// Use database adapter globally
set(channelAdapter = "database");

// Or per-call
subscribeToChannel(channel = "updates", adapter = "database");
publish(channel = "updates", event = "change", data = "...", adapter = "database");
```

## API Reference

### Global Functions

#### `publish(channel, event, data, adapter)`

Publish an event to a channel. Available anywhere global helpers are accessible (controllers, models, jobs, views).

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `channel` | string | required | Channel name (e.g. `"user.42"`, `"orders"`) |
| `event` | string | required | Event type (e.g. `"notification"`, `"update"`) |
| `data` | string | required | Event data (typically JSON) |
| `adapter` | string | `""` | `"memory"` or `"database"` (defaults to `channelAdapter` setting) |

Returns struct: `{id, channel, event, subscriberCount, timestamp}` (memory) or `{id, channel, event, persisted}` (database).

### Controller Functions

#### `subscribeToChannel(channel, events, lastEventId, adapter, pollInterval, timeout, heartbeatInterval)`

Open a long-lived SSE connection that streams events from a channel to the client. Automatically detects `Last-Event-ID` from request headers for resume support.

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `channel` | string | required | Channel to subscribe to |
| `events` | string | `""` | Comma-delimited event types to filter (empty = all) |
| `lastEventId` | string | `""` | Resume from this event ID (auto-detected from header) |
| `adapter` | string | `""` | Override adapter type |
| `pollInterval` | numeric | `2` | Seconds between polls (database adapter only) |
| `timeout` | numeric | `300` | Max connection duration in seconds |
| `heartbeatInterval` | numeric | `15` | Seconds between keep-alive pings |

#### `channelSSETag(channel, route, controller, action, events)`

Generate a `<script>` tag with an EventSource connection to a channel endpoint.

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `channel` | string | required | Channel name |
| `route` | string | `""` | Named route for the SSE endpoint |
| `controller` | string | `""` | Controller name (used if no route) |
| `action` | string | `"stream"` | Action name |
| `events` | string | `""` | Comma-delimited event types |

### Channel Engine (wheels.Channel)

The in-memory pub/sub engine. Usually accessed indirectly via `publish()` and `subscribeToChannel()`, but available directly for advanced use.

```cfm
var engine = $getChannelEngine("memory");

// Direct subscribe/publish
var subId = engine.subscribe(channel = "chat.room.1", callback = function(event) {
    // event = {id, channel, event, data, timestamp}
});

engine.publish(channel = "chat.room.1", event = "message", data = '{"text":"hi"}');

engine.unsubscribe("chat.room.1", subId);

// Inspect
engine.subscriberCount("chat.room.1");  // numeric
engine.getChannels();                    // array of channel names
engine.removeChannel("chat.room.1");     // remove channel + all subscribers
```

### DatabaseAdapter (wheels.channel.DatabaseAdapter)

Database-backed adapter. Usually accessed indirectly, but available for direct use.

```cfm
var adapter = $getChannelEngine("database");

adapter.publish(channel = "orders", event = "created", data = SerializeJSON(order));

// Poll for events since a timestamp or event ID
var events = adapter.poll(channel = "orders", since = DateAdd("n", -5, Now()));
var events = adapter.poll(channel = "orders", lastEventId = "evt-123");

// Manual cleanup (automatic cleanup runs every 5 minutes)
adapter.cleanup(olderThanMinutes = 30);
```

#### Database Table: `wheels_events`

Auto-created on first use. Schema:

| Column | Type | Description |
|--------|------|-------------|
| `id` | VARCHAR(36) PK | Event UUID |
| `channel` | VARCHAR(255) | Channel name |
| `event` | VARCHAR(255) | Event type |
| `data` | TEXT/CLOB | Event payload |
| `createdAt` | TIMESTAMP/DATETIME | When the event was published |

Indexes: `(channel, createdAt)`, `(createdAt)`.

## JavaScript Client

Include `wheels-sse.js` (located at `/wheels/assets/js/wheels-sse.js`) for a zero-dependency EventSource client with auto-reconnect.

```html
<script src="/wheels/assets/js/wheels-sse.js"></script>
<script>
// Basic usage
const sse = new WheelsSSE('/notifications/stream', {
    channel: 'user.42',
    events: ['notification', 'alert'],
    onMessage: (data, event, id) => {
        console.log('Received:', event, data);
    }
});

// Typed event listeners
sse.on('notification', (data, id) => {
    showNotification(data.title, data.body);
});

// Close when done
sse.close();

// Static factory
const sse2 = WheelsSSE.subscribe('/stream', {channel: 'orders'});
```

### Constructor Options

| Option | Type | Default | Description |
|--------|------|---------|-------------|
| `channel` | string | `""` | Channel name (added as URL param) |
| `events` | string[] | `[]` | Event types to filter |
| `lastEventId` | string | `""` | Resume from this event ID |
| `reconnectInterval` | number | `1000` | Initial reconnect delay (ms) |
| `maxReconnectInterval` | number | `30000` | Max reconnect delay (ms) |
| `reconnectDecay` | number | `2` | Backoff multiplier |
| `maxRetries` | number | `0` | Max reconnect attempts (0 = unlimited) |
| `onOpen` | Function | `null` | Called when connection opens |
| `onError` | Function | `null` | Called on connection error |
| `onMessage` | Function | `null` | Called for every event: `(data, event, id)` |

### Methods

- `on(event, callback)` — Add typed event listener. Returns `this` for chaining.
- `off(event, callback)` — Remove listener. Returns `this`.
- `close()` — Disconnect and stop reconnecting.
- `lastEventId` (getter) — Last received event ID.

### Auto-Reconnect

The client reconnects automatically with exponential backoff:
- Start at `reconnectInterval` (default 1s)
- Multiply by `reconnectDecay` (default 2x) each attempt
- Cap at `maxReconnectInterval` (default 30s)
- Stop after `maxRetries` (default 0 = unlimited)
- Reset backoff on successful connection

## Usage Patterns

### Per-User Notifications

```cfm
// Route
.get(name = "userNotifications", pattern = "notifications/stream", to = "notifications##stream")

// Controller
function stream() {
    subscribeToChannel(channel = "user.#session.userId#");
}

// Anywhere — model callback, job, etc.
publish(
    channel = "user.#user.id#",
    event = "notification",
    data = SerializeJSON({title: "Order shipped", orderId: order.id})
);
```

### Chat Room

```cfm
// Controller
function messages() {
    subscribeToChannel(
        channel = "chat.room.#params.roomId#",
        events = "message,typing,presence"
    );
}

function send() {
    // Save message to database...
    publish(
        channel = "chat.room.#params.roomId#",
        event = "message",
        data = SerializeJSON({user: session.userName, text: params.text})
    );
    renderNothing();
}
```

### Dashboard Updates (Database Adapter)

```cfm
// config/settings.cfm
set(channelAdapter = "database");

// Controller
function dashboard() {
    subscribeToChannel(
        channel = "dashboard.metrics",
        pollInterval = 5,
        timeout = 600
    );
}

// Background job publishes metrics
publish(
    channel = "dashboard.metrics",
    event = "metrics",
    data = SerializeJSON(calculateMetrics())
);
```


================================================
FILE: .ai/wheels/controllers/api.md
================================================
# API Controllers

## Description
Comprehensive guide to building JSON and XML APIs with Wheels controllers, including REST patterns, error handling, authentication, and response formatting.

## Basic API Controller Pattern

### JSON API Controller
```cfm
component extends="Controller" {

    function config() {
        super.config();
        provides("json");
        filters(through="setJsonResponse");
    }

    function index() {
        products = model("Product").findAll();
        renderWith(data={products: products});
    }

    function show() {
        product = model("Product").findByKey(params.key);

        if (IsObject(product)) {
            renderWith(data={product: product});
        } else {
            renderWith(data={error: "Product not found"}, status=404);
        }
    }

    function create() {
        product = model("Product").new(params.product);

        if (product.save()) {
            renderWith(data={product: product}, status=201);
        } else {
            renderWith(
                data={
                    error: "Validation failed",
                    errors: product.allErrors()
                },
                status=422
            );
        }
    }

    function update() {
        product = model("Product").findByKey(params.key);

        if (IsObject(product)) {
            product.update(params.product);

            if (product.hasErrors()) {
                renderWith(
                    data={
                        error: "Validation failed",
                        errors: product.allErrors()
                    },
                    status=422
                );
            } else {
                renderWith(data={product: product});
            }
        } else {
            renderWith(data={error: "Product not found"}, status=404);
        }
    }

    function delete() {
        product = model("Product").findByKey(params.key);

        if (IsObject(product)) {
            product.delete();
            renderWith(data={}, status=204);
        } else {
            renderWith(data={error: "Product not found"}, status=404);
        }
    }

    /**
     * Force JSON format for all requests
     */
    private function setJsonResponse() {
        params.format = "json";
    }

}
```

## REST API with Error Handling

### Comprehensive API Controller
```cfm
component extends="Controller" {

    function config() {
        super.config();
        provides("json");
        filters(through="setJsonFormat,corsHeaders");
    }

    function index() {
        try {
            products = model("Product").findAll(
                page=params.page ?: 1,
                perPage=params.perPage ?: 25,
                order="createdAt DESC"
            );

            renderWith(data={
                products: products,
                pagination: {
                    page: products.currentPage,
                    pages: products.pageCount,
                    total: products.totalRecords
                }
            });
        } catch (any e) {
            renderWith(
                data={error: "Internal server error"},
                status=500
            );
        }
    }

    function show() {
        try {
            product = model("Product").findByKey(params.key);

            if (IsObject(product)) {
                renderWith(data={
                    product: product,
                    links: {
                        self: "#application.baseUrl#/api/products/#product.id#",
                        category: "#application.baseUrl#/api/categories/#product.categoryId#"
                    }
                });
            } else {
                renderWith(
                    data={
                        error: "Product not found",
                        code: "PRODUCT_NOT_FOUND"
                    },
                    status=404
                );
            }
        } catch (any e) {
            logApiError(e);
            renderWith(
                data={error: "Internal server error"},
                status=500
            );
        }
    }

    private function corsHeaders() {
        header name="Access-Control-Allow-Origin" value="*";
        header name="Access-Control-Allow-Methods" value="GET,POST,PUT,DELETE,OPTIONS";
        header name="Access-Control-Allow-Headers" value="Content-Type,Authorization";
    }

    private function setJsonFormat() {
        params.format = "json";
    }

    private function logApiError(required any exception) {
        writeLog(
            file="api_errors",
            text="API Error: #arguments.exception.message# - Action: #params.controller#.#params.action#"
        );
    }

}
```

## API Authentication

### Token-Based Authentication
```cfm
component extends="Controller" {

    function config() {
        super.config();
        provides("json");
        filters(through="authenticateToken");
    }

    private function authenticateToken() {
        local.authHeader = getHttpRequestData().headers["Authorization"] ?: "";

        if (!len(local.authHeader) || !reFindNoCase("^Bearer\s+", local.authHeader)) {
            renderWith(
                data={error: "Missing or invalid Authorization header"},
                status=401
            );
            return;
        }

        local.token = reReplace(local.authHeader, "^Bearer\s+", "", "one");

        // Validate token
        local.user = validateApiToken(local.token);
        if (!IsObject(local.user)) {
            renderWith(
                data={error: "Invalid or expired token"},
                status=401
            );
            return;
        }

        // Set current user for this request
        variables.currentUser = local.user;
    }

    private function validateApiToken(required string token) {
        return model("User").findOne(
            where="apiToken = :token AND tokenExpiresAt > :now",
            params={
                token: arguments.token,
                now: now()
            }
        );
    }

}
```

### API Key Authentication
```cfm
component extends="Controller" {

    function config() {
        super.config();
        provides("json");
        filters(through="authenticateApiKey");
    }

    private function authenticateApiKey() {
        local.apiKey = params.apiKey ?: getHttpRequestData().headers["X-API-Key"] ?: "";

        if (!len(local.apiKey)) {
            renderWith(
                data={error: "API key required"},
                status=401
            );
            return;
        }

        local.client = model("ApiClient").findOne(where="apiKey = :key", params={key: local.apiKey});
        if (!IsObject(local.client) || !local.client.isActive) {
            renderWith(
                data={error: "Invalid API key"},
                status=401
            );
            return;
        }

        // Rate limiting check
        if (exceedsRateLimit(local.client)) {
            renderWith(
                data={error: "Rate limit exceeded"},
                status=429
            );
            return;
        }

        variables.apiClient = local.client;
    }

    private function exceedsRateLimit(required apiClient) {
        // Implement rate limiting logic
        return false;
    }

}
```

## JSON Request Handling

### Processing JSON Payloads
```cfm
function apiCreate() {
    // JSON body automatically parsed to params
    // Content-Type: application/json
    // {"product": {"name": "Laptop", "price": 999.99}}

    if (!StructKeyExists(params, "product")) {
        renderWith(
            data={error: "Missing product data"},
            status=400
        );
        return;
    }

    product = model("Product").create(params.product);

    if (product.hasErrors()) {
        renderWith(
            data={
                error: "Validation failed",
                errors: formatValidationErrors(product.allErrors())
            },
            status=422
        );
    } else {
        renderWith(
            data={
                product: product,
                message: "Product created successfully"
            },
            status=201
        );
    }
}

private function formatValidationErrors(required array errors) {
    local.formatted = {};

    for (local.error in arguments.errors) {
        if (!StructKeyExists(local.formatted, local.error.property)) {
            local.formatted[local.error.property] = [];
        }
        arrayAppend(local.formatted[local.error.property], local.error.message);
    }

    return local.formatted;
}
```

### Handling Different Content Types
```cfm
function flexibleCreate() {
    // Handle both JSON and form data
    local.contentType = getHttpRequestData().headers["Content-Type"] ?: "";

    if (findNoCase("application/json", local.contentType)) {
        // JSON payload
        if (!StructKeyExists(params, "product")) {
            renderWith(data={error: "Invalid JSON structure"}, status=400);
            return;
        }
    } else {
        // Form data or other content types
        if (!StructKeyExists(params, "product")) {
            renderWith(data={error: "Missing product data"}, status=400);
            return;
        }
    }

    product = model("Product").create(params.product);

    if (product.hasErrors()) {
        renderWith(data={errors: product.allErrors()}, status=422);
    } else {
        renderWith(data={product: product}, status=201);
    }
}
```

## API Response Formatting

### Consistent Response Structure
```cfm
function standardizedResponse() {
    products = model("Product").findAll(page=params.page ?: 1, perPage=10);

    response = {
        success = true,
        data = {
            products = products,
            meta = {
                total = products.totalRecords,
                page = products.currentPage,
                pages = products.pageCount,
                perPage = 10
            }
        },
        timestamp = now()
    };

    renderWith(data=response);
}

function standardizedError() {
    response = {
        success = false,
        error = {
            code = "VALIDATION_ERROR",
            message = "The provided data is invalid",
            details = product.allErrors()
        },
        timestamp = now()
    };

    renderWith(data=response, status=422);
}
```

### HATEOAS (Hypermedia as the Engine of Application State)
```cfm
function resourceWithLinks() {
    product = model("Product").findByKey(params.key);

    if (IsObject(product)) {
        response = {
            product = product,
            links = {
                self = "#application.baseUrl#/api/products/#product.id#",
                category = "#application.baseUrl#/api/categories/#product.categoryId#",
                reviews = "#application.baseUrl#/api/products/#product.id#/reviews",
                edit = "#application.baseUrl#/api/products/#product.id#",
                delete = "#application.baseUrl#/api/products/#product.id#"
            }
        };

        renderWith(data=response);
    } else {
        renderWith(data={error: "Not found"}, status=404);
    }
}
```

## API Versioning

### URL-Based Versioning
```cfm
// /app/controllers/api/v1/Products.cfc
component extends="wheels.Controller" {

    function config() {
        super.config();
        provides("json");
        filters(through="setApiVersion");
    }

    private function setApiVersion() {
        variables.apiVersion = "1.0";
        header name="API-Version" value=variables.apiVersion;
    }

    function index() {
        products = model("Product").findAll();

        // Version 1 response format
        renderWith(data={
            products: products,
            version: variables.apiVersion
        });
    }

}

// /app/controllers/api/v2/Products.cfc
component extends="wheels.Controller" {

    function config() {
        super.config();
        provides("json");
        filters(through="setApiVersion");
    }

    private function setApiVersion() {
        variables.apiVersion = "2.0";
        header name="API-Version" value=variables.apiVersion;
    }

    function index() {
        products = model("Product").findAll();

        // Version 2 response format (enhanced)
        renderWith(data={
            data: products,
            meta: {
                version: variables.apiVersion,
                total: products.totalRecords,
                links: {
                    self: "#application.baseUrl#/api/v2/products"
                }
            }
        });
    }

}
```

### Header-Based Versioning
```cfm
function config() {
    super.config();
    provides("json");
    filters(through="detectApiVersion");
}

private function detectApiVersion() {
    variables.apiVersion = getHttpRequestData().headers["Accept-Version"] ?: "1.0";
    header name="API-Version" value=variables.apiVersion;
}

function index() {
    products = model("Product").findAll();

    switch (variables.apiVersion) {
        case "1.0":
            renderWith(data={products: products});
            break;
        case "2.0":
            renderWith(data={
                data: products,
                meta: {version: "2.0", total: products.totalRecords}
            });
            break;
        default:
            renderWith(data={error: "Unsupported API version"}, status=400);
    }
}
```

## Error Handling and Status Codes

### HTTP Status Code Best Practices
```cfm
function restfulCreate() {
    product = model("Product").new(params.product);

    if (product.save()) {
        // 201 Created
        renderWith(data={product: product}, status=201);
    } else {
        // 422 Unprocessable Entity
        renderWith(data={errors: product.allErrors()}, status=422);
    }
}

function restfulShow() {
    product = model("Product").findByKey(params.key);

    if (IsObject(product)) {
        // 200 OK
        renderWith(data={product: product});
    } else {
        // 404 Not Found
        renderWith(data={error: "Product not found"}, status=404);
    }
}

function restfulDelete() {
    product = model("Product").findByKey(params.key);

    if (IsObject(product)) {
        product.delete();
        // 204 No Content
        renderNothing(status=204);
    } else {
        // 404 Not Found
        renderWith(data={error: "Product not found"}, status=404);
    }
}
```

### Comprehensive Error Responses
```cfm
function handleApiError(required any exception) {
    local.errorResponse = {
        error = {
            type = arguments.exception.type ?: "UnknownError",
            message = arguments.exception.message ?: "An unexpected error occurred",
            timestamp = now()
        }
    };

    // Add stack trace in development
    if (application.environment == "development") {
        local.errorResponse.error.detail = arguments.exception.detail ?: "";
        local.errorResponse.error.stackTrace = arguments.exception.stackTrace ?: "";
    }

    // Determine status code based on error type
    local.statusCode = 500;
    switch (arguments.exception.type) {
        case "ValidationError":
            local.statusCode = 422;
            break;
        case "NotFound":
            local.statusCode = 404;
            break;
        case "Unauthorized":
            local.statusCode = 401;
            break;
        case "Forbidden":
            local.statusCode = 403;
            break;
    }

    renderWith(data=local.errorResponse, status=local.statusCode);
}
```

## API Documentation and Testing

### Self-Documenting Endpoints
```cfm
function apiInfo() {
    endpoints = {
        products = {
            list = "GET /api/products",
            show = "GET /api/products/{id}",
            create = "POST /api/products",
            update = "PUT /api/products/{id}",
            delete = "DELETE /api/products/{id}"
        },
        categories = {
            list = "GET /api/categories",
            show = "GET /api/categories/{id}"
        }
    };

    renderWith(data={
        api = "Products API",
        version = "1.0",
        endpoints = endpoints,
        documentation = "#application.baseUrl#/api/docs"
    });
}
```

### Health Check Endpoint
```cfm
function health() {
    local.health = {
        status = "ok",
        timestamp = now(),
        version = application.version ?: "1.0",
        environment = application.environment
    };

    // Check database connectivity
    try {
        model("Product").count();
        local.health.database = "connected";
    } catch (any e) {
        local.health.database = "error";
        local.health.status = "error";
    }

    renderWith(data=local.health);
}
```

## Rate Limiting

### Basic Rate Limiting
```cfm
function config() {
    super.config();
    provides("json");
    filters(through="rateLimiting");
}

private function rateLimiting() {
    local.clientId = variables.apiClient.id ?: "anonymous";
    local.cacheKey = "rate_limit_#local.clientId#";
    local.requestCount = cacheGet(local.cacheKey) ?: 0;
    local.limit = 100; // 100 requests per hour

    if (local.requestCount >= local.limit) {
        header name="X-RateLimit-Limit" value=local.limit;
        header name="X-RateLimit-Remaining" value=0;
        renderWith(
            data={error: "Rate limit exceeded"},
            status=429
        );
        return;
    }

    // Increment counter
    cachePut(local.cacheKey, local.requestCount + 1, createTimeSpan(0, 1, 0, 0)); // 1 hour

    // Add rate limit headers
    header name="X-RateLimit-Limit" value=local.limit;
    header name="X-RateLimit-Remaining" value=(local.limit - local.requestCount - 1);
}
```

## CORS Support

### Comprehensive CORS Handling
```cfm
function config() {
    super.config();
    provides("json");
    filters(through="handleCors");
}

private function handleCors() {
    // Set CORS headers
    header name="Access-Control-Allow-Origin" value="*";
    header name="Access-Control-Allow-Methods" value="GET,POST,PUT,DELETE,OPTIONS";
    header name="Access-Control-Allow-Headers" value="Content-Type,Authorization,X-API-Key";
    header name="Access-Control-Max-Age" value="86400"; // 24 hours

    // Handle preflight requests
    if (cgi.request_method == "OPTIONS") {
        renderNothing(status=204);
    }
}
```

## API Testing

### Testing API Endpoints
```cfm
// In test file
function testApiIndex() {
    params = {
        controller: "api.products",
        action: "index",
        format: "json"
    };

    result = processAction(params);

    assert("result.statusCode == 200");
    assert("isJSON(result.content)");

    data = deserializeJSON(result.content);
    assert("StructKeyExists(data, 'products')");
}

function testApiCreateWithValidData() {
    params = {
        controller: "api.products",
        action: "create",
        format: "json",
        product: {
            name: "Test Product",
            price: 99.99
        }
    };

    result = processAction(params);

    assert("result.statusCode == 201");

    data = deserializeJSON(result.content);
    assert("StructKeyExists(data, 'product')");
    assert("data.product.name == 'Test Product'");
}

function testApiCreateWithInvalidData() {
    params = {
        controller: "api.products",
        action: "create",
        format: "json",
        product: {
            name: "" // Invalid - name required
        }
    };

    result = processAction(params);

    assert("result.statusCode == 422");

    data = deserializeJSON(result.content);
    assert("StructKeyExists(data, 'errors')");
}
```

## Best Practices

### 1. Use Appropriate HTTP Methods and Status Codes
```cfm
// GET for reading
function index() { /* 200 OK */ }
function show() { /* 200 OK or 404 Not Found */ }

// POST for creating
function create() { /* 201 Created or 422 Unprocessable Entity */ }

// PUT/PATCH for updating
function update() { /* 200 OK or 422 Unprocessable Entity */ }

// DELETE for removing
function delete() { /* 204 No Content or 404 Not Found */ }
```

### 2. Consistent Error Format
```cfm
// Always return errors in same format
{
    "error": {
        "code": "VALIDATION_ERROR",
        "message": "Validation failed",
        "details": {...}
    }
}
```

### 3. Include Pagination Metadata
```cfm
{
    "data": [...],
    "meta": {
        "page": 1,
        "pages": 10,
        "total": 250,
        "perPage": 25
    }
}
```

### 4. Version Your APIs
```cfm
// URL versioning
/api/v1/products
/api/v2/products

// Header versioning
Accept-Version: 1.0
```

### 5. Implement Rate Limiting
```cfm
// Return rate limit headers
X-RateLimit-Limit: 100
X-RateLimit-Remaining: 95
X-RateLimit-Reset: 1640995200
```

## Related Documentation
- [Controller Architecture](./architecture.md)
- [Controller Security](./security.md)
- [Controller Rendering](./rendering.md)

================================================
FILE: .ai/wheels/cross-engine-compatibility.md
================================================
# Cross-Engine Compatibility Guide

Wheels runs on multiple CFML engines (Lucee 5/6/7, Adobe CF 2018-2025, BoxLang) and databases (H2, MySQL, PostgreSQL, SQL Server, CockroachDB). Each engine has runtime differences that can cause code to pass on one engine but fail on another. This guide documents the known gotchas.

## Engine-Specific Gotchas

### struct.map() Collision (Lucee + Adobe)

Lucee and Adobe resolve `obj.map()` as the built-in struct member function, not the CFC method. This affects the DI container's `map()` method.

```cfm
// WRONG — triggers struct.map(callback) on Lucee/Adobe
arguments.container.map("myService").to("path").asSingleton();

// RIGHT — use the alias that avoids the collision
arguments.container.mapInstance("myService").to("path").asSingleton();
```

**Why**: When a CFC is typed as `any` or passed generically, the engine's native struct member function takes precedence over the CFC's own `map()` method.

### Application Scope Function Members (Adobe CF)

Adobe CF's `application` scope is a special Java-backed struct that doesn't reliably store closures or function references.

```cfm
// WRONG — works on Lucee, breaks on Adobe
application.registerMiddleware = function() { ... };

// RIGHT — use a plain struct context
var context = Duplicate(application);
context.registerMiddleware = function() { ... };
plugin.onPluginLoad(context);
```

**Why**: Adobe's application scope is implemented differently from a regular CFML struct. Function members get lost or throw errors during serialization.

### Closure `this` Captures Declaring Scope

CFML closures bind `this` to the component where they are DEFINED, not where they are ASSIGNED. This trips up test code that dynamically adds methods.

```cfm
// WRONG — this.renderText() calls renderText on the TEST spec, not the controller
_controller.myAction = function() {
    this.renderText("hello");  // ERROR: method not found
};

// RIGHT — capture the reference in a shared struct
var ctx = {ctrl: _controller};
_controller.myAction = function() {
    ctx.ctrl.renderText("hello");  // works
};
```

### Bracket-Notation Function Calls (Adobe CF 2021/2023)

`obj["key"]()` crashes the Adobe CF parser when used inside closures.

```cfm
// WRONG — crashes Adobe CF 2021/2023 inside closures
var result = obj["dynamicMethod"]();

// RIGHT — split into two statements
var fn = obj["dynamicMethod"];
var result = fn();
```

### Method Reference Extraction Loses Receiver (BoxLang)

BoxLang implements method dispatch with JavaScript-style semantics: pulling a method off an object into a local variable produces a bare function reference with no bound receiver. Calling that local then runs the function in an empty context, and any in-component call inside (helpers prefixed with `$`, `this.x()`, etc.) fails to resolve. The lookup-and-call **must** stay in a single expression for BoxLang to bind the receiver.

```cfm
// WRONG — drops the receiver on BoxLang, so $helper() throws
//          "Function [$helper] not found" when publicMethod runs
local.method = arguments.object[arguments.methodName];
local.method();

// RIGHT — single-expression bracket-call binds the receiver
arguments.object[arguments.methodName]();
```

**Why**: BoxLang treats `obj["method"]` as a property access that returns a callable, not a bound method. Only an immediate invocation `obj["method"]()` lets BoxLang's call dispatcher know which object is the receiver. Lucee and Adobe CF preserve the receiver across both forms, so this trap only fires on BoxLang.

**On `invoke()`**: The `invoke()` BIF is the Lucee/Adobe path via `Base.cfc` and preserves the receiver on those engines. Whether it preserves the receiver on BoxLang has **not** been verified — the `invokeMethod` override in `BoxLangAdapter.cfc` exists precisely because earlier BoxLang versions had `invoke()` parity gaps. Until a BoxLang run confirms the BIF binds the receiver, prefer the single-expression bracket-call on BoxLang. If a future audit confirms parity, the override can be deleted entirely.

**Reference example**: `vendor/wheels/engineAdapters/BoxLang/BoxLangAdapter.cfc::invokeMethod`. The original two-statement form silently worked until #2241 added `$blockInProduction()` calls inside every `Public.cfc` handler — at which point every internal Wheels route (`/wheels/info`, `/wheels/routes`, ...) started 500-ing on BoxLang. Regression test: `vendor/wheels/tests/specs/dispatch/InvokeMethodSpec.cfc` (issue #2646).

### Inline Closure as Constructor Named Argument (Adobe CF)

Passing a function literal directly as a named argument to a `new Component(...)` call crashes Adobe CF's bytecode generator with `java.lang.ArrayStoreException: coldfusion.compiler.ASTcffunction`. The compile error fires from `getComponentMetadata()` and crashes the **entire** TestBox bundle for the engine — not just the one spec — because Adobe CF eagerly compiles every CFC in the bundle directory before any test runs.

```cfm
// WRONG — crashes Adobe CF at compile time
var mw = new wheels.middleware.RateLimiter(
    maxRequests = 5,
    keyFunction = function(req) { return "client-1"; }
);

// RIGHT — hoist the closure into a local var first
var keyFn = function(req) { return "client-1"; };
var mw = new wheels.middleware.RateLimiter(
    maxRequests = 5,
    keyFunction = keyFn
);
```

**Why**: Adobe CF's `ExprAssembler.invokeNew` (called via `generateSetVarCode` → `assignStatement`) tries to store the function AST node into a typed array that doesn't accept `ASTcffunction` entries. The bug only manifests when the function literal appears in the argument list of `new` (not bare function calls).

**Reference examples**: `vendor/wheels/tests/specs/middleware/RateLimiterSpec.cfc` (12 sites) and the original `SessionStrategySpec.cfc` workaround. Lucee and BoxLang compile both forms identically — there is no behavior change from hoisting, only better cross-engine portability.

### Array By-Value in Struct Literals (Adobe CF)

Adobe CF copies arrays by value when they appear in struct literal syntax. Closures that append to the copy won't affect the original.

```cfm
// WRONG — myArray is copied by value into the struct
var config = {arr: myArray};
// Closures that modify config.arr don't affect myArray

// RIGHT — reference via parent struct
var parent = {arr: myArray};
var config = {owner: parent};
// config.owner.arr is a reference, not a copy
```

### `$appKey()` Returns `"$wheels"` (All Engines)

The `$appKey()` function returns `"$wheels"` when `application.$wheels` exists. Test setup must set defaults in BOTH scopes.

```cfm
// WRONG — only sets one scope
application.wheels.myNewSetting = "value";

// RIGHT — set both (CI app reloads can break the struct reference)
application.$wheels.myNewSetting = "value";
application.wheels.myNewSetting = "value";
```

### `createDynamicProxy` Requires a CFC on Lucee 7

Lucee 6 accepted a CFML struct with named function entries as the first argument to `createDynamicProxy` — Lucee wired struct keys to interface methods. Lucee 7 tightened the signature to require a Component instance. Passing a struct fails with a misleading error: `"Can't cast Complex Object Type Struct to String"` — Lucee 7 is trying the CFC-path-string overload and choking on the struct argument.

```cfm
// WRONG — works on Lucee 6, fails on Lucee 7
var handler = {
    accept: function(dialog) {
        dialog.accept();
    }
};
createDynamicProxy(handler, ["java.util.function.Consumer"]);

// RIGHT — CFC instance, works on Lucee 6 AND Lucee 7
component MyConsumer {
    public any function init(required struct state) {
        variables.state = arguments.state;
        return this;
    }
    public void function accept(required any dialog) {
        variables.state.value = dialog.message();
        dialog.accept();
    }
}

var consumer = new MyConsumer(state={value: ""});
createDynamicProxy(consumer, ["java.util.function.Consumer"]);
```

**Why**: Lucee 7 adds overload dispatch prefers the `createDynamicProxy(cfcPathString, interfaces)` signature and rejects struct arguments at the cast step. The struct-argument legacy path was removed.

**Reference example**: [`vendor/wheels/wheelstest/DialogConsumer.cfc`](../../vendor/wheels/wheelstest/DialogConsumer.cfc) shows the CFC-based pattern used by `BrowserClient` to proxy Playwright's `Consumer<Dialog>`. The probe in `$requireDialogSupport` mirrors the real call shape so engine compatibility is verified on the same code path.

### `DirectoryCreate()` Second Argument Is Lucee-Only

Lucee accepts `DirectoryCreate(path, createPath, mode)` and recurses parent directories when `createPath=true`. Adobe CF's signature varies by version and at least some Adobe builds reject any second argument with `"The function takes 1 parameter"` (issue #2567).

```cfm
// WRONG — crashes on Adobe CF
DirectoryCreate(path, true);

// RIGHT — engine-agnostic recursive mkdir via Java NIO
if (!DirectoryExists(path)) {
    CreateObject("java", "java.io.File").init(path).mkdirs();
}
```

**Why**: `java.io.File.mkdirs()` is part of the JDK on every CFML engine and recurses parents the same way on Lucee, Adobe CF, and BoxLang. Reach for it whenever a path's parents may be missing — relying on the BIF's `createPath` extension is a portability trap.

### Binary Data Representation (BoxLang / Lucee 6 vs Lucee 7 / Adobe)

`FileReadBinary()` and multipart-upload byte content are surfaced differently across engines:

| Engine | `IsArray(bytes)` | `IsBinary(bytes)` | Shape |
|--------|-----------------|-------------------|-------|
| Lucee 7, Adobe CF | `false` | `true` | `byte[]` Java array |
| BoxLang, Lucee 6 (some configs) | `true` | `false` | CFML array of integers |

Both shapes are valid representations that the JDBC driver accepts when binding a `cf_sql_blob` / `cf_sql_varbinary` parameter. Wheels' model property setter (`$setProperty`) is aware of this: the scalar-column type guard exempts binary columns so the array shape passes through to the JDBC layer unchanged (fix: #2660).

```cfm
// Works on all engines — the model exempts blob/longblob/bytea columns from
// the array-rejection guard regardless of which shape the engine produces.
local.bytes = FileReadBinary(expandPath("/uploads/tmp/") & cffile.serverFile);
local.photo = model("Photo").new(filename="avatar.png", fileData=local.bytes);
local.photo.save();
```

**When this matters**: only for columns whose `cf_sql_*` type resolves to `validationtype == "binary"` — blob, longblob, bytea, varbinary, and clob. (Note: `clob` stores character data, not bytes — it's grouped here only because Wheels' internal `$getValidationType` maps `CF_SQL_CLOB` to `"binary"` for guard-exemption purposes.) All other scalar columns (varchar, integer, datetime, ...) still reject array/struct values; structs bound to *any* column, including binary ones, also still throw — the exemption is array-shape-only.

### `getMetadata().type` Returns FQN on BoxLang

`getMetadata(obj).type` returns the literal string `"component"` on Lucee and Adobe CF, but returns the fully-qualified class name (e.g. `wheels.tests._assets.models.BulkItem`) on BoxLang. Test assertions that hardcode the string `"component"` silently pass on Lucee/Adobe and silently fail on BoxLang.

```cfm
// WRONG — passes on Lucee/Adobe, fails on BoxLang
expect(found).toBeInstanceOf("component");

// RIGHT — asserts against the Model base class via IsInstanceOf (all engines)
expect(found).toBeWheelsModel();
```

**Why**: `IsInstanceOf(obj, "Model")` walks the inheritance chain identically on Lucee, Adobe CF, and BoxLang. `toBeWheelsModel()` is a wrapper on `wheels.wheelstest.system.Expectation` that routes through `toBeInstanceOf("Model")`.

**Reference**: `vendor/wheels/wheelstest/system/Expectation.cfc::toBeWheelsModel`, issue #2662.

### `local.X = ...` Inside `catch` Doesn't Persist (BoxLang)

Writes to the `local` scope inside a `catch` block don't survive past the block on BoxLang. The catch body apparently runs under a nested `local` that gets discarded when control leaves; on Lucee and Adobe CF the catch shares the enclosing function's `local`, so the assignment sticks.

```cfm
// WRONG — passes on Lucee/Adobe, fails on BoxLang
local.caught = false;
try {
    Throw(type = "TestException", message = "boom");
} catch (TestException e) {
    local.caught = true;   // discarded when catch exits on BoxLang
}
expect(local.caught).toBeTrue();   // reads outer local — still false

// RIGHT — struct field assignment targets a heap object (all engines)
var state = {caught = false};
try {
    Throw(type = "TestException", message = "boom");
} catch (TestException e) {
    state.caught = true;
}
expect(state.caught).toBeTrue();

// ALSO RIGHT — var-declared name without `local.` prefix
var caught = false;
try {
    Throw(type = "TestException", message = "boom");
} catch (TestException e) {
    caught = true;
}
expect(caught).toBeTrue();
```

**Why the bare-`var` form survives**: BoxLang's catch-scoped local only shadows keys written via explicit `local.X = ...`; an unscoped write to a `var`-declared name appears to resolve through the var-declaration slot and escapes the catch-scope shadow. Prefer the struct-field form anyway — it's cleaner, mirrors the prior-art `TenantResolverSpec` pattern, and doesn't rely on this behaviour being preserved across BoxLang releases.

**Why this fires only in specs**: production code rarely needs a catch to flip a boolean for a later read in the same function — typical catch blocks rethrow, log, or assign struct fields. Specs that use `try/catch` to *assert* exception propagation are the natural trap, since they need the post-catch flag.

**Reference**: issue #2744, regression test `vendor/wheels/tests/specs/model/lockingSpec.cfc :: "releases lock even when callback throws an exception"`. The same pattern works in `vendor/wheels/tests/specs/middleware/TenantResolverSpec.cfc` because it tracks state via `var result = {threw = false}; result.threw = true`.

### Private View Helpers Not Integrated

`$integrateComponents()` only copies `public` methods into controllers. Private helper functions in view CFCs are never available.

```cfm
// WRONG — private function won't be integrated
private string function myHelper() { ... }

// RIGHT — use public access with $ prefix for internal helpers
public string function $myHelper() { ... }
```

### `attributeCollection` with the `arguments` Scope (Adobe CF 2023/2025)

Adobe CF 2023 and 2025 reject the raw `arguments` scope when passed as `attributeCollection` to *any* built-in CFML tag, throwing engine-specific errors (`cfheader` reports `"Failed to add HTML header"`) and aborting the request. Lucee 6/7, BoxLang, and Adobe CF 2018/2021 all accept the `arguments` scope without complaint. Both the string-interpolated form (`attributeCollection = "#arguments#"`) and the CFScript direct-struct form (`attributeCollection = arguments`) are affected.

```cfm
// WRONG — crashes Adobe CF 2023 and 2025
cfheader(attributeCollection = "#arguments#");
cfimage(attributeCollection = arguments);

// RIGHT — copy to a plain struct first; either invocation form works once
// `local.args` is a plain struct (the engine's stricter check only objects
// to the special `arguments` scope object, not to the form of the call).
local.args = {};
for (local.key in arguments) {
    local.args[local.key] = arguments[local.key];
}
cfheader(attributeCollection = "#local.args#");
cfimage(attributeCollection = local.args);
```

**Why**: Adobe CF 2023 and 2025 impose a stricter type check on `attributeCollection` and require a plain CFML struct, not the special `arguments` scope object. The struct-copy pattern is safe and idiomatic across all engines. `$header()` is the dispatch-path blocker (runs on every request) — the others surface as soon as the corresponding helper is called.

**Reference fix**: [#2750](https://github.com/wheels-dev/wheels/pull/2750) (closes #2741) — patches all 13 affected wrappers in `vendor/wheels/Global.cfc` uniformly: `$header`, `$cache`, `$content`, `$mail`, `$directory`, `$file`, `$location`, `$htmlhead`, `$image`, `$dbinfo`, `$invoke`, `$wddx`, `$zip`. `$dbinfo()` rebuilds the local copy before each of its four `cfdbinfo` calls because the catch path mutates `arguments` between calls — a useful pattern when a helper writes through `arguments` between tag invocations.

### `cfheader` / `cfcontent` on a Committed Response (Adobe CF 2023/2025)

Adobe CF 2023/2025 throws `InvalidHeaderException: Failed to add HTML header` from `cfheader`, and a similar exception from `cfcontent`, once the servlet response has been committed (the output buffer flushed). This bites hardest inside `onError` handlers, where partial view output has typically already flushed before the handler runs — the secondary `cfheader` failure then replaces the original exception in the response. Lucee and BoxLang tolerate the same call as a no-op.

Use the canonical `$responseCommitted()` probe — `public boolean function $responseCommitted()` in `vendor/wheels/Global.cfc` — to short-circuit defensively. Wrap the actual tag call in `try/catch` and re-probe in the catch to rethrow only when the response is still uncommitted (a genuine caller bug):

```cfm
public void function $myTagWrapper() {
    local.args = {};
    for (local.key in arguments) local.args[local.key] = arguments[local.key];
    if ($responseCommitted()) return;
    try {
        cfheader(attributeCollection = "#local.args#");
    } catch (any e) {
        if (!$responseCommitted()) rethrow;
    }
}
```

`$header()` and `$content()` already adopt this shape. Future tag wrappers (`$location`, `$cache`, `$htmlhead`, `$mail`, …) should pick up `$responseCommitted()` rather than reinventing the probe.

**Reference fix**: [#2756](https://github.com/wheels-dev/wheels/pull/2756) — adds `$responseCommitted()` and applies the defensive shape to `$header()` and `$content()`.

## Database-Specific Gotchas

### H2 Database (Test Default)

H2 is the embedded database used by default in tests. Key differences:
- Case-sensitive by default for identifiers
- `NOW()` is supported (Wheels normalizes this)
- Some MySQL-specific functions (e.g., `GROUP_CONCAT`) not available
- Simpler locking model than production databases

### Migration Date Functions

Use `NOW()` for cross-database compatibility in migrations:

```cfm
// WRONG — database-specific
execute("INSERT INTO users (name, createdAt) VALUES ('Admin', CURRENT_TIMESTAMP)");

// RIGHT — NOW() works across MySQL, PostgreSQL, SQL Server, H2
execute("INSERT INTO users (name, createdAt, updatedAt) VALUES ('Admin', NOW(), NOW())");
```

### Parameter Binding in Migrations

Direct SQL with `execute()` is more reliable than parameter binding for seed data:

```cfm
// WRONG — parameter binding unreliable in migrations
execute(sql="INSERT INTO roles (name) VALUES (?)", parameters=[{value="admin"}]);

// RIGHT — direct SQL
execute("INSERT INTO roles (name, createdAt, updatedAt) VALUES ('admin', NOW(), NOW())");
```

### PostgreSQL / CockroachDB — Migration DDL Differences

`PostgreSQLMigrator.addColumnOptions` (shared by `CockroachDBMigrator`) diverges from `Abstract.addColumnOptions` in two intentional ways:

- **Empty string defaults**: Abstract-based adapters (MySQL, SQLite, H2, Oracle, MSSQL) omit the `DEFAULT` clause entirely when `default=""` on string/text/char columns. The PostgreSQL family emits `DEFAULT ''` explicitly.
- **Boolean literals**: Abstract-based adapters serialize `true` as `1` / `false` as `0`. The PostgreSQL family emits `DEFAULT true` / `DEFAULT false`.

When writing migrator spec assertions that check generated DDL, branch on `adapter.adapterName()`:

```cfm
var name = adapter.adapterName();
var isPostgresFamily = (name == "PostgreSQL" || name == "CockroachDB");
if (isPostgresFamily) {
    expect(sql).toInclude("DEFAULT true");
} else {
    // Abstract-based adapters (MySQL, SQLite, H2, Oracle, MSSQL)
    expect(sql).toInclude("DEFAULT 1");
}
```

See `vendor/wheels/tests/specs/migrator/addColumnOptionsSpec.cfc` and `migrationSpec.cfc` for working examples of this branching idiom.

### MySQL — TEXT and FLOAT DEFAULT suppression

`MySQLMigrator.optionsIncludeDefault` returns `false` for `text`, `mediumtext`, `longtext`, and `float` columns. The inherited `Abstract.addColumnOptions` short-circuits the entire `DEFAULT` clause when `optionsIncludeDefault` returns false — meaning a non-empty `default="long body"` on a `text` column is silently dropped in the emitted DDL on MySQL. Rationale: pre-8.0.13 MySQL rejects `DEFAULT` on `TEXT`/`BLOB` columns outright.

When writing migrator spec assertions that involve TEXT-family columns with non-empty defaults, add an `isMySQLFamily` carve-out alongside the `isPostgresFamily` one:

```cfm
var name = adapter.adapterName();
var isPostgresFamily = (name == "PostgreSQL" || name == "CockroachDB");
var isMySQLFamily = (name == "MySQL");

if (isMySQLFamily) {
    // DEFAULT clause is suppressed entirely for text/float on MySQL
    expect(sql).notToInclude("DEFAULT");
} else {
    expect(sql).toInclude("DEFAULT");
    expect(sql).toInclude("'long body'");
}
```

### CockroachDB (Soft-Fail in CI)

CockroachDB is in CI but marked as soft-fail — test failures are logged as warnings, not build failures. Controlled by `SOFT_FAIL_DBS` in `.github/workflows/tests.yml`.

### Oracle — Multi-Row INSERT and RETURNING Incompatibility

Oracle 23 rejects `INSERT INTO t (cols) VALUES (?,?), (?,?), ...` (the SQL-standard table value constructor) when the JDBC driver also requests `RETURN_GENERATED_KEYS`. The Oracle JDBC driver translates `RETURN_GENERATED_KEYS` into a `RETURNING ROWID INTO` clause, and Oracle 23 does not permit `RETURNING` combined with multi-row VALUES.

`OracleModel` overrides `$bulkInsertSQL()` to emit `INSERT ALL INTO t (cols) VALUES (...) INTO t (cols) VALUES (...) SELECT 1 FROM dual` — Oracle's idiomatic multi-row form, which avoids both the table value constructor and the RETURNING expansion. This is transparent to framework users; `insertAll()` works the same on Oracle as on other databases.

If you write code that generates raw bulk-insert SQL for Oracle (or adds a new adapter), use `INSERT ALL ... SELECT 1 FROM dual` rather than multi-row VALUES. The canonical implementation is `vendor/wheels/databaseAdapters/Oracle/OracleModel.cfc::$bulkInsertSQL`.

### Oracle — DDL Auto-Commit and Transaction Wrapper

Oracle implicitly commits DDL statements (RENAME, CREATE, ALTER, DROP, …) and closes the JDBC statement as part of that commit. If the DDL is wrapped in `transaction action="begin" { ... commit }`, the subsequent `transaction action="commit"` runs against a closed statement and raises `ORA: Closed statement`. PostgreSQL and SQLite (via SAVEPOINT) honor the wrapper and will roll back DDL on error. MySQL DDL also causes an implicit commit (the wrapper is a no-op there), but MySQL's multi-rename form — `RENAME TABLE a TO a', b TO b'` — is itself a single atomic statement, so no partial-rename scenario arises. Oracle cannot use the wrapper at all.

If you write code that runs DDL inside a transaction block, branch on the adapter and run the DDL bare on Oracle. The canonical implementation is `vendor/wheels/Migrator.cfc::renameSystemTables`:

```cfm
if (FindNoCase("Oracle", dbType)) {
    for (var sql in rv.sql) {
        $query(datasource = dsn, sql = sql);
    }
} else {
    transaction action="begin" {
        try {
            for (var sql in rv.sql) {
                $query(datasource = dsn, sql = sql);
            }
            transaction action="commit";
        } catch (any e) {
            transaction action="rollback";
            rethrow;
        }
    }
}
```

There is no rollback to forfeit on Oracle — the implicit commit makes each DDL atomic on its own.

## Testing Across Engines

### Local Test Procedure

Always test on at least TWO engines before pushing — Lucee and Adobe catch different bugs:

```bash
cd /path/to/wheels/rig    # repo root with compose.yml

docker compose up -d lucee6 adobe2025

# Wait ~60s, then test both with SQLite (works on ALL engines — H2 is Lucee-only)
curl -s "http://localhost:60006/wheels/core/tests?db=sqlite&format=json" > /tmp/lucee6.json
curl -s "http://localhost:62025/wheels/core/tests?db=sqlite&format=json" > /tmp/adobe2025.json
```

### Engine Ports

| Engine | Port |
|--------|------|
| lucee5 | 60005 |
| lucee6 | 60006 |
| lucee7 | 60007 |
| adobe2018 | 62018 |
| adobe2021 | 62021 |
| adobe2023 | 62023 |
| adobe2025 | 62025 |
| boxlang | 60001 |

### Why Both Engines Matter

- "It passed on Lucee" is not sufficient — Adobe CF has different struct member functions, application scope handling, and closure behavior
- "It's just a docs change" can still break test discovery if file naming affects CFC compilation
- CI runs take 20+ minutes across all matrix combinations; catching failures locally saves everyone time


================================================
FILE: .ai/wheels/deploy.md
================================================
# Deploy Reference

`wheels deploy` ships a Dockerized Wheels app to production Linux servers via SSH. Ported from Basecamp Kamal's developer CLI — same `config/deploy.yml` schema, same on-server conventions (container names, labels, network, lock path), invokes the same `kamal-proxy` Go binary for zero-downtime rollover. No Ruby runtime required.

## Commands

```
wheels deploy init                     # scaffold config/deploy.yml + .kamal/secrets
wheels deploy setup                    # one-time server bootstrap + first deploy
wheels deploy                          # rolling deploy
wheels deploy --dry-run                # print commands without executing
wheels deploy rollback v1              # roll back to a previous version
wheels deploy config                   # print resolved config as YAML
wheels deploy version                  # show Kamal version this port mirrors
```

## Subcommands

```
wheels deploy app <verb>         # boot/start/stop/details/containers/images/logs/live/maintenance/remove
wheels deploy proxy <verb>       # boot/reboot/start/stop/restart/details/logs/remove
wheels deploy accessory <verb>   # boot/reboot/start/stop/restart/details/logs/remove (sidecars: db/redis/search)
wheels deploy build <verb>       # deliver/push/pull/create/remove/details/dev
wheels deploy registry <verb>    # setup/login/logout/remove
wheels deploy bootstrap          # install Docker on every host (flat alias — preferred)
wheels deploy exec "<cmd>"       # run a command on every host (flat alias — preferred)
wheels deploy server <verb>      # exec/bootstrap (legacy nested form — see #2677)
wheels deploy prune <verb>       # all/images/containers [--keep=N]
wheels deploy lock <verb>        # acquire/release/status (manual — normal deploys auto-lock)
wheels deploy fetch-secrets ...  # resolve KEY=VALUE lines from an adapter (flat alias — preferred)
wheels deploy extract-secrets    # pull one key from a KEY=VALUE block (flat alias — preferred)
wheels deploy print-secrets      # print resolved .kamal/secrets (flat alias — preferred)
wheels deploy secrets <verb>     # fetch/extract/print (legacy nested form — see #2697)
wheels deploy audit              # tail /tmp/kamal-audit.log on each server
wheels deploy details            # aggregate app + proxy + accessory status
wheels deploy remove --confirm   # teardown all app/proxy/accessory containers
wheels deploy docs [section]     # in-terminal config reference
```

## On-server parity contract (byte-compatible with Ruby Kamal)

- Container names: `<service>-<role>-<version>`
- Labels: `service=`, `role=`, `destination=`, `version=`
- Docker network: `kamal`
- Lock file: `/tmp/kamal_deploy_lock_<service>`
- Proxy config: `/home/<user>/.config/kamal-proxy/`
- Hook env prefix: `KAMAL_*` (never `WHEELS_*` — user hooks migrate unchanged)

A server managed by Ruby Kamal can be taken over by `wheels deploy` without cleanup.

## Architecture

```
cli/lucli/services/deploy/
├── cli/*.cfc             DeployMainCli + Deploy<App|Proxy|Accessory|Build|Registry|Server|Prune|Lock|Secrets>Cli
├── commands/*.cfc        Base + Docker/App/Proxy/Builder/Registry/Auditor/Lock/Hook/Accessory/PruneCommands
├── config/*.cfc          Config + Role/Env/Builder/Proxy/Registry/Ssh/Accessory/Validator/ConfigLoader
├── lib/*.cfc             JarLoader/Mustache/Yaml/SshClient/SshPool/FakeSshPool/Output/SecretResolver
└── secrets/*.cfc         BaseAdapter + OnePassword/Bitwarden/AwsSecrets/LastPass/Doppler adapters

cli/lucli/lib/deploy/*.jar  jmustache, snakeyaml, sshj + BouncyCastle transitives (URLClassLoader-isolated)
cli/lucli/templates/deploy/ Mustache templates for `wheels deploy init` output
```

Commands-are-strings invariant: every `*Commands.cfc` method returns a shell-command string; only `*Cli.cfc` and the orchestrator execute them. That's why `--dry-run` is trivial and unit tests run without network.

## Critical gotchas

1. **Kamal-compatible schema, ONE divergence.** ERB in `deploy.yml` is NOT supported (rendering it would require embedding a Ruby runtime). Kamal's native `${VAR}` env-var interpolation is preserved unchanged — uppercase-snake tokens resolve via `envOverride → .kamal/secrets → System.getenv → ""` (see `ConfigLoader.$interpolate`). Mustache (`{{...}}`) is used only by `wheels deploy init` to scaffold a fresh `deploy.yml`/`secrets`; it is NOT applied to `deploy.yml` at runtime. Everything else in `config/deploy.yml` is byte-identical to Kamal 2.4.0.
2. **Hook env prefix is `KAMAL_`, not `WHEELS_`.** Deliberate — Ruby Kamal users' existing `.kamal/hooks/` scripts work unchanged.
3. **`app live` / `app maintenance` use a marker file** (`/tmp/kamal-maintenance-<svc>`) rather than kamal-proxy native maintenance mode. Phase 2 simplification; Phase 3 follow-up will align with Kamal's proxy-native semantics.
4. **`wheels deploy remove` is destructive and requires `--confirm`.** Bare `wheels deploy remove` throws without touching anything.
5. **Lucee reserved scope names in subagent-authored deploy code.** `client`, `session`, `application` — use `ssh`/`sc`, `sess`, `app` instead. Bit us multiple times during the port.
6. **No `--dry-run` flag in Ruby Kamal 2.4.0.** The `tools/deploy-config-diff.sh` harness compares config-layer output only. Byte-identical command-string parity is aspirational; see `tools/deploy-dry-run-diff.sh` for the plan.
7. **`wheels deploy server <verb>` collides with LuCLI's top-level `server` command.** LuCLI (the picocli runtime under the wheels brand) registers `server` for Lucee dev-server lifecycle, so picocli grabs the `server` token before it can reach the deploy dispatcher. The wheels module exposes flat aliases `wheels deploy bootstrap` and `wheels deploy exec` that sidestep the collision — these are the canonical CLI form. The nested `server <verb>` branch is retained in `Module.cfc::deploy()` for MCP/programmatic callers. See [#2677](https://github.com/wheels-dev/wheels/issues/2677).
8. **`wheels deploy secrets <verb>` collides with LuCLI's top-level `secrets` command.** Same shape as #2677 — LuCLI registers `secrets` for its own cre
Download .txt
Showing preview only (367K chars total). Download the full file or copy to clipboard to get everything.
gitextract_uhqy_quz/

├── .ai/
│   ├── README.md
│   ├── cfml/
│   │   ├── README.md
│   │   ├── advanced/
│   │   │   └── closures.md
│   │   ├── best-practices/
│   │   │   ├── modern-patterns.md
│   │   │   └── performance.md
│   │   ├── components/
│   │   │   ├── component-basics.md
│   │   │   ├── functions.md
│   │   │   └── properties.md
│   │   ├── control-flow/
│   │   │   ├── conditionals.md
│   │   │   ├── exception-handling.md
│   │   │   └── loops.md
│   │   ├── data-types/
│   │   │   ├── arrays/
│   │   │   │   ├── array-creation.md
│   │   │   │   ├── array-iteration.md
│   │   │   │   └── array-methods.md
│   │   │   ├── numbers/
│   │   │   │   └── numeric-basics.md
│   │   │   ├── scopes/
│   │   │   │   └── variables-scope.md
│   │   │   ├── strings/
│   │   │   │   ├── string-functions.md
│   │   │   │   ├── string-interpolation.md
│   │   │   │   └── string-literals.md
│   │   │   ├── structures/
│   │   │   │   ├── struct-creation.md
│   │   │   │   └── structure-basics.md
│   │   │   ├── variable-scopes.md
│   │   │   └── variables.md
│   │   ├── database/
│   │   │   └── query-basics.md
│   │   └── syntax/
│   │       ├── basic-syntax.md
│   │       ├── cfscript-vs-tags.md
│   │       ├── comments.md
│   │       └── hash-escaping.md
│   └── wheels/
│       ├── channels/
│       │   └── channels.md
│       ├── controllers/
│       │   └── api.md
│       ├── cross-engine-compatibility.md
│       ├── deploy.md
│       ├── security/
│       │   └── https-detection.md
│       ├── snippets/
│       │   ├── controller-snippets.md
│       │   └── model-snippets.md
│       ├── testing/
│       │   ├── browser-testing.md
│       │   └── onboarding-harness.md
│       ├── troubleshooting/
│       │   ├── common-errors.md
│       │   └── form-helper-errors.md
│       ├── views/
│       │   └── query-association-patterns.md
│       └── wheels-bot.md
├── .cfformat.json
├── .claude/
│   ├── .devcontainer/
│   │   └── devcontainer.json
│   └── commands/
│       ├── _shared-rails.md
│       ├── address-review.md
│       ├── advise-on-deadlock.md
│       ├── auto-close-stale-triage.md
│       ├── propose-fix.md
│       ├── research-frameworks.md
│       ├── respond-to-critique.md
│       ├── review-pr.md
│       ├── review-the-review.md
│       ├── triage-issue.md
│       ├── update-docs.md
│       └── write-docs.md
├── .dockerignore
├── .editorconfig
├── .gitattributes
├── .gitbook.yaml
├── .github/
│   ├── FUNDING.yml
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug_report.md
│   │   └── feature_request.md
│   ├── RELEASE_PLAYBOOK.md
│   ├── actions/
│   │   ├── publish_forgebox_package/
│   │   │   ├── Dockerfile
│   │   │   ├── action.yml
│   │   │   └── entrypoint.sh
│   │   ├── setup-wheels-test-env/
│   │   │   └── action.yml
│   │   └── wheels-bot-skip-check/
│   │       └── action.yml
│   ├── labeler.yml
│   ├── pull_request_template.md
│   ├── slack.yml
│   └── workflows/
│       ├── bot-address-review.yml
│       ├── bot-advisor.yml
│       ├── bot-auto-close.yml
│       ├── bot-propose-fix.yml
│       ├── bot-research.yml
│       ├── bot-review-a.yml
│       ├── bot-review-b.yml
│       ├── bot-tdd-gate.yml
│       ├── bot-triage.yml
│       ├── bot-update-docs.yml
│       ├── bot-write-docs.yml
│       ├── bump-develop-version.yml
│       ├── compat-matrix.yml
│       ├── deploy-ci.yml
│       ├── docs-validation.yml
│       ├── docs-verify.yml
│       ├── generate-changelog.yml
│       ├── label.yml
│       ├── pr.yml
│       ├── publish-chocolatey.yml
│       ├── refresh-packages-baseline.yml
│       ├── refresh-visual-baselines.yml
│       ├── release-candidate.yml
│       ├── release.yml
│       ├── snapshot.yml
│       ├── version-bump.yml
│       └── web-deploy.yml
├── .gitignore
├── .husky/
│   ├── commit-msg
│   └── pre-commit
├── .nvmrc
├── .vscode/
│   ├── launch.json
│   ├── wheels-test.code-snippets
│   └── wheels.code-snippets
├── CFConfig.json
├── CHANGELOG.md
├── CLAUDE.md
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── Dockerfile.dev
├── LICENSE
├── NOTICE
├── README.md
├── RELEASE-CANDIDATE.md
├── SECURITY.md
├── app/
│   ├── controllers/
│   │   └── Controller.cfc
│   ├── events/
│   │   ├── onabort.cfm
│   │   ├── onapplicationend.cfm
│   │   ├── onapplicationstart.cfm
│   │   ├── onerror.cfm
│   │   ├── onerror.json.cfm
│   │   ├── onerror.xml.cfm
│   │   ├── onmaintenance.cfm
│   │   ├── onmissingtemplate.cfm
│   │   ├── onrequestend.cfm
│   │   ├── onrequeststart.cfm
│   │   ├── onsessionend.cfm
│   │   └── onsessionstart.cfm
│   ├── global/
│   │   └── functions.cfm
│   ├── jobs/
│   │   └── ProcessOrdersJob.cfc
│   ├── lib/
│   │   └── .keep
│   ├── migrator/
│   │   ├── .keep
│   │   └── migrations/
│   │       └── .keep
│   ├── models/
│   │   └── Model.cfc
│   ├── snippets/
│   │   ├── ActionContent.txt
│   │   ├── ApiControllerContent.txt
│   │   ├── BoxJSON.txt
│   │   ├── CRUDContent.txt
│   │   ├── ConfigAppContent.txt
│   │   ├── ConfigDataSourceH2Content.txt
│   │   ├── ConfigReloadPasswordContent.txt
│   │   ├── ConfigRoutes.txt
│   │   ├── ControllerContent.txt
│   │   ├── DBMigrate.txt
│   │   ├── McpConfig.json
│   │   ├── ModelContent.txt
│   │   ├── OpenCodeConfig.json
│   │   ├── ServerJSON.txt
│   │   ├── ViewContent.txt
│   │   ├── WheelsBoxJSON.txt
│   │   ├── bootstrap/
│   │   │   ├── layout.cfm
│   │   │   └── settings.cfm
│   │   ├── crud/
│   │   │   ├── _form.txt
│   │   │   ├── edit.txt
│   │   │   ├── index.txt
│   │   │   ├── new.txt
│   │   │   └── show.txt
│   │   ├── dbmigrate/
│   │   │   ├── announce.txt
│   │   │   ├── blank.txt
│   │   │   ├── change-column.txt
│   │   │   ├── change-table.txt
│   │   │   ├── create-column.txt
│   │   │   ├── create-index.txt
│   │   │   ├── create-record.txt
│   │   │   ├── create-table.txt
│   │   │   ├── execute.txt
│   │   │   ├── remove-column.txt
│   │   │   ├── remove-index.txt
│   │   │   ├── remove-record.txt
│   │   │   ├── remove-table.txt
│   │   │   ├── rename-column.txt
│   │   │   ├── rename-table.txt
│   │   │   └── update-record.txt
│   │   ├── mcp-server.js.txt
│   │   └── tests/
│   │       ├── controller.txt
│   │       ├── model.txt
│   │       └── view.txt
│   └── views/
│       ├── helpers.cfm
│       └── layout.cfm
├── cli/
│   ├── .gitignore
│   ├── CHANGELOG
│   ├── CLAUDE.md
│   ├── LICENSE
│   ├── PR-INSTRUCTIONS.md
│   ├── README.md
│   ├── WHEELS-CLI-ROADMAP.md
│   ├── docs/
│   │   └── CONFIG-COMMANDS.md
│   ├── lucli/
│   │   ├── ARCHITECTURE.md
│   │   ├── Module.cfc
│   │   ├── PLAN.md
│   │   ├── lib/
│   │   │   └── deploy/
│   │   │       ├── README.md
│   │   │       ├── bcpkix-jdk18on-1.78.jar
│   │   │       ├── bcprov-jdk18on-1.78.jar
│   │   │       ├── bcutil-jdk18on-1.78.jar
│   │   │       ├── eddsa-0.3.0.jar
│   │   │       ├── jmustache-1.16.jar
│   │   │       ├── jzlib-1.1.3.jar
│   │   │       ├── manifest.json
│   │   │       ├── slf4j-api-2.0.13.jar
│   │   │       ├── slf4j-nop-2.0.13.jar
│   │   │       ├── snakeyaml-2.3.jar
│   │   │       └── sshj-0.39.0.jar
│   │   ├── module.json
│   │   ├── resources/
│   │   │   └── extensions/
│   │   │       └── sqlite/
│   │   │           └── org.xerial.sqlite-jdbc-3.49.1.0.jar
│   │   ├── services/
│   │   │   ├── Admin.cfc
│   │   │   ├── Analysis.cfc
│   │   │   ├── BundleStager.cfc
│   │   │   ├── CfclassesPurger.cfc
│   │   │   ├── CodeGen.cfc
│   │   │   ├── Destroy.cfc
│   │   │   ├── Doctor.cfc
│   │   │   ├── FrameworkInstaller.cfc
│   │   │   ├── Helpers.cfc
│   │   │   ├── MigrationRunner.cfc
│   │   │   ├── ReleaseChannel.cfc
│   │   │   ├── RewriteConfigInstaller.cfc
│   │   │   ├── Scaffold.cfc
│   │   │   ├── SemVer.cfc
│   │   │   ├── ServerRegistry.cfc
│   │   │   ├── Stats.cfc
│   │   │   ├── Templates.cfc
│   │   │   ├── TestRunner.cfc
│   │   │   ├── UpdateChecker.cfc
│   │   │   ├── deploy/
│   │   │   │   ├── cli/
│   │   │   │   │   ├── DeployAccessoryCli.cfc
│   │   │   │   │   ├── DeployAppCli.cfc
│   │   │   │   │   ├── DeployArgsParser.cfc
│   │   │   │   │   ├── DeployBuildCli.cfc
│   │   │   │   │   ├── DeployLockCli.cfc
│   │   │   │   │   ├── DeployMainCli.cfc
│   │   │   │   │   ├── DeployProxyCli.cfc
│   │   │   │   │   ├── DeployPruneCli.cfc
│   │   │   │   │   ├── DeployRegistryCli.cfc
│   │   │   │   │   ├── DeploySecretsCli.cfc
│   │   │   │   │   ├── DeployServerCli.cfc
│   │   │   │   │   └── docs/
│   │   │   │   │       ├── accessories.md
│   │   │   │   │       ├── builder.md
│   │   │   │   │       ├── env.md
│   │   │   │   │       ├── hooks.md
│   │   │   │   │       ├── proxy.md
│   │   │   │   │       ├── registry.md
│   │   │   │   │       ├── servers.md
│   │   │   │   │       └── ssh.md
│   │   │   │   ├── commands/
│   │   │   │   │   ├── AccessoryCommands.cfc
│   │   │   │   │   ├── AppCommands.cfc
│   │   │   │   │   ├── AuditorCommands.cfc
│   │   │   │   │   ├── Base.cfc
│   │   │   │   │   ├── BuilderCommands.cfc
│   │   │   │   │   ├── DockerCommands.cfc
│   │   │   │   │   ├── HookCommands.cfc
│   │   │   │   │   ├── LockCommands.cfc
│   │   │   │   │   ├── ProxyCommands.cfc
│   │   │   │   │   ├── PruneCommands.cfc
│   │   │   │   │   └── RegistryCommands.cfc
│   │   │   │   ├── config/
│   │   │   │   │   ├── Accessory.cfc
│   │   │   │   │   ├── Builder.cfc
│   │   │   │   │   ├── Config.cfc
│   │   │   │   │   ├── ConfigLoader.cfc
│   │   │   │   │   ├── Env.cfc
│   │   │   │   │   ├── Proxy.cfc
│   │   │   │   │   ├── Registry.cfc
│   │   │   │   │   ├── Role.cfc
│   │   │   │   │   ├── Ssh.cfc
│   │   │   │   │   └── Validator.cfc
│   │   │   │   ├── lib/
│   │   │   │   │   ├── FakeSshPool.cfc
│   │   │   │   │   ├── JarLoader.cfc
│   │   │   │   │   ├── Mustache.cfc
│   │   │   │   │   ├── Output.cfc
│   │   │   │   │   ├── SecretResolver.cfc
│   │   │   │   │   ├── SshClient.cfc
│   │   │   │   │   ├── SshPool.cfc
│   │   │   │   │   ├── SshPoolFactory.cfc
│   │   │   │   │   ├── SshPoolTask.cfc
│   │   │   │   │   └── Yaml.cfc
│   │   │   │   └── secrets/
│   │   │   │       ├── AwsSecretsAdapter.cfc
│   │   │   │       ├── BaseAdapter.cfc
│   │   │   │       ├── BitwardenAdapter.cfc
│   │   │   │       ├── DopplerAdapter.cfc
│   │   │   │       ├── LastPassAdapter.cfc
│   │   │   │       ├── OnePasswordAdapter.cfc
│   │   │   │       └── SecretAdapterInterface.cfc
│   │   │   └── packages/
│   │   │       ├── HttpClient.cfc
│   │   │       ├── Installer.cfc
│   │   │       ├── ManifestCache.cfc
│   │   │       ├── PackagesMainCli.cfc
│   │   │       ├── PackagesRegistryCli.cfc
│   │   │       ├── Registry.cfc
│   │   │       └── VersionResolver.cfc
│   │   ├── templates/
│   │   │   ├── admin/
│   │   │   │   ├── _form.txt
│   │   │   │   ├── controller.txt
│   │   │   │   ├── edit.txt
│   │   │   │   ├── index.txt
│   │   │   │   ├── new.txt
│   │   │   │   └── show.txt
│   │   │   ├── app/
│   │   │   │   ├── _env
│   │   │   │   ├── _gitignore
│   │   │   │   ├── app/
│   │   │   │   │   ├── controllers/
│   │   │   │   │   │   └── Controller.cfc
│   │   │   │   │   ├── events/
│   │   │   │   │   │   ├── onabort.cfm
│   │   │   │   │   │   ├── onapplicationend.cfm
│   │   │   │   │   │   ├── onapplicationstart.cfm
│   │   │   │   │   │   ├── onerror.cfm
│   │   │   │   │   │   ├── onerror.json.cfm
│   │   │   │   │   │   ├── onerror.xml.cfm
│   │   │   │   │   │   ├── onmaintenance.cfm
│   │   │   │   │   │   ├── onmissingtemplate.cfm
│   │   │   │   │   │   ├── onrequestend.cfm
│   │   │   │   │   │   ├── onrequeststart.cfm
│   │   │   │   │   │   ├── onsessionend.cfm
│   │   │   │   │   │   └── onsessionstart.cfm
│   │   │   │   │   ├── global/
│   │   │   │   │   │   └── functions.cfm
│   │   │   │   │   ├── jobs/
│   │   │   │   │   │   ├── .gitkeep
│   │   │   │   │   │   └── README.md
│   │   │   │   │   ├── lib/
│   │   │   │   │   │   ├── .gitkeep
│   │   │   │   │   │   └── README.md
│   │   │   │   │   ├── mailers/
│   │   │   │   │   │   ├── .gitkeep
│   │   │   │   │   │   └── README.md
│   │   │   │   │   ├── migrator/
│   │   │   │   │   │   └── migrations/
│   │   │   │   │   │       └── .gitkeep
│   │   │   │   │   ├── models/
│   │   │   │   │   │   └── Model.cfc
│   │   │   │   │   ├── plugins/
│   │   │   │   │   │   ├── .gitkeep
│   │   │   │   │   │   └── README.md
│   │   │   │   │   ├── snippets/
│   │   │   │   │   │   ├── .gitkeep
│   │   │   │   │   │   ├── ActionContent.txt
│   │   │   │   │   │   ├── ApiControllerContent.txt
│   │   │   │   │   │   ├── BoxJSON.txt
│   │   │   │   │   │   ├── CRUDContent.txt
│   │   │   │   │   │   ├── ConfigAppContent.txt
│   │   │   │   │   │   ├── ConfigDataSourceH2Content.txt
│   │   │   │   │   │   ├── ConfigReloadPasswordContent.txt
│   │   │   │   │   │   ├── ConfigRoutes.txt
│   │   │   │   │   │   ├── ControllerContent.txt
│   │   │   │   │   │   ├── DBMigrate.txt
│   │   │   │   │   │   ├── ModelContent.txt
│   │   │   │   │   │   ├── README.md
│   │   │   │   │   │   ├── ServerJSON.txt
│   │   │   │   │   │   ├── ViewContent.txt
│   │   │   │   │   │   ├── WheelsBoxJSON.txt
│   │   │   │   │   │   └── mcp-server.js.txt
│   │   │   │   │   └── views/
│   │   │   │   │       ├── helpers.cfm
│   │   │   │   │       └── layout.cfm
│   │   │   │   ├── config/
│   │   │   │   │   ├── app.cfm
│   │   │   │   │   ├── environment.cfm
│   │   │   │   │   ├── routes.cfm
│   │   │   │   │   └── settings.cfm
│   │   │   │   ├── db/
│   │   │   │   │   └── .gitignore
│   │   │   │   ├── lucee.json
│   │   │   │   ├── public/
│   │   │   │   │   ├── Application.cfc
│   │   │   │   │   ├── files/
│   │   │   │   │   │   └── .gitkeep
│   │   │   │   │   ├── images/
│   │   │   │   │   │   └── .gitkeep
│   │   │   │   │   ├── index.cfm
│   │   │   │   │   ├── javascripts/
│   │   │   │   │   │   └── .gitkeep
│   │   │   │   │   ├── miscellaneous/
│   │   │   │   │   │   └── Application.cfc
│   │   │   │   │   ├── stylesheets/
│   │   │   │   │   │   └── .gitkeep
│   │   │   │   │   └── urlrewrite.xml
│   │   │   │   ├── rewrite.config
│   │   │   │   ├── tests/
│   │   │   │   │   ├── populate.cfm
│   │   │   │   │   ├── runner.cfm
│   │   │   │   │   └── specs/
│   │   │   │   │       ├── controllers/
│   │   │   │   │       │   └── .gitkeep
│   │   │   │   │       ├── functional/
│   │   │   │   │       │   └── .gitkeep
│   │   │   │   │       └── models/
│   │   │   │   │           └── .gitkeep
│   │   │   │   └── vendor/
│   │   │   │       └── .gitkeep
│   │   │   ├── deploy/
│   │   │   │   └── init/
│   │   │   │       ├── Dockerfile.mustache
│   │   │   │       ├── deploy.yml.mustache
│   │   │   │       ├── dockerignore.mustache
│   │   │   │       └── secrets.mustache
│   │   │   ├── migrations/
│   │   │   │   └── remove_table.txt
│   │   │   └── snippets/
│   │   │       ├── api-controller.txt
│   │   │       ├── auth-filter.txt
│   │   │       ├── auth-login-view.txt
│   │   │       ├── auth-sessions-controller.txt
│   │   │       ├── crud-controller.txt
│   │   │       ├── flash-messages.txt
│   │   │       ├── pagination-view.txt
│   │   │       ├── seeds-development.txt
│   │   │       ├── seeds.txt
│   │   │       ├── soft-delete-migration.txt
│   │   │       ├── soft-delete-mixin.txt
│   │   │       └── user-mailer.txt
│   │   └── tests/
│   │       ├── Application.cfc
│   │       ├── TestHelper.cfc
│   │       ├── _fixtures/
│   │       │   └── deploy/
│   │       │       ├── configs/
│   │       │       │   ├── full.yml
│   │       │       │   ├── invalid/
│   │       │       │   │   ├── invalid-host.yml
│   │       │       │   │   ├── missing-service.yml
│   │       │       │   │   └── unknown-key.yml
│   │       │       │   ├── minimal.yml
│   │       │       │   ├── with-accessories.yml
│   │       │       │   └── with-ssh.yml
│   │       │       ├── e2e/
│   │       │       │   ├── README.md
│   │       │       │   ├── app/
│   │       │       │   │   ├── Dockerfile.v1
│   │       │       │   │   └── Dockerfile.v2
│   │       │       │   ├── authorized_keys
│   │       │       │   ├── deploy.yml
│   │       │       │   ├── docker-compose.yml
│   │       │       │   ├── docker-shim.sh
│   │       │       │   ├── install-shims.sh
│   │       │       │   ├── test_key
│   │       │       │   └── test_key.pub
│   │       │       └── sshd/
│   │       │           ├── README.md
│   │       │           ├── authorized_keys
│   │       │           ├── docker-compose.yml
│   │       │           ├── test_key
│   │       │           └── test_key.pub
│   │       ├── _helpers/
│   │       │   └── DeployShellHelper.cfc
│   │       ├── runner.cfm
│   │       ├── specs/
│   │       │   ├── commands/
│   │       │   │   ├── ConsoleCommandSpec.cfc
│   │       │   │   ├── DbCommandSpec.cfc
│   │       │   │   ├── DeployCommandSpec.cfc
│   │       │   │   ├── DestroyCommandSpec.cfc
│   │       │   │   ├── GenerateCommandSpec.cfc
│   │       │   │   ├── InfoCommandSpec.cfc
│   │       │   │   ├── MigrateCommandSpec.cfc
│   │       │   │   ├── NewCommandSpec.cfc
│   │       │   │   ├── NewCommandTemplateSpec.cfc
│   │       │   │   ├── PackagesCommandSpec.cfc
│   │       │   │   ├── ReloadCommandSpec.cfc
│   │       │   │   └── TestCommandSpec.cfc
│   │       │   ├── deploy/
│   │       │   │   ├── DeployArgsParserSpec.cfc
│   │       │   │   ├── cli/
│   │       │   │   │   ├── DeployAccessoryCliSpec.cfc
│   │       │   │   │   ├── DeployAppCliSpec.cfc
│   │       │   │   │   ├── DeployBuildCliSpec.cfc
│   │       │   │   │   ├── DeployLockCliSpec.cfc
│   │       │   │   │   ├── DeployMainCliSpec.cfc
│   │       │   │   │   ├── DeployProxyCliSpec.cfc
│   │       │   │   │   ├── DeployPruneCliSpec.cfc
│   │       │   │   │   ├── DeployRegistryCliSpec.cfc
│   │       │   │   │   ├── DeploySecretsCliSpec.cfc
│   │       │   │   │   └── DeployServerCliSpec.cfc
│   │       │   │   ├── commands/
│   │       │   │   │   ├── AccessoryCommandsSpec.cfc
│   │       │   │   │   ├── AppCommandsSpec.cfc
│   │       │   │   │   ├── AuditorCommandsSpec.cfc
│   │       │   │   │   ├── BaseSpec.cfc
│   │       │   │   │   ├── BuilderCommandsSpec.cfc
│   │       │   │   │   ├── HookCommandsSpec.cfc
│   │       │   │   │   ├── LockCommandsSpec.cfc
│   │       │   │   │   ├── ProxyCommandsSpec.cfc
│   │       │   │   │   ├── PruneCommandsSpec.cfc
│   │       │   │   │   └── RegistryCommandsSpec.cfc
│   │       │   │   ├── config/
│   │       │   │   │   ├── AccessorySpec.cfc
│   │       │   │   │   ├── ConfigLoaderSpec.cfc
│   │       │   │   │   └── SshSpec.cfc
│   │       │   │   ├── integration/
│   │       │   │   │   └── E2EDeploySpec.cfc
│   │       │   │   ├── lib/
│   │       │   │   │   ├── FakeSshPoolSpec.cfc
│   │       │   │   │   ├── MustacheSpec.cfc
│   │       │   │   │   ├── OutputSpec.cfc
│   │       │   │   │   ├── SecretResolverSpec.cfc
│   │       │   │   │   ├── SshClassloadSpec.cfc
│   │       │   │   │   ├── SshClientSpec.cfc
│   │       │   │   │   ├── SshPoolDefaultsSpec.cfc
│   │       │   │   │   ├── SshPoolFactorySpec.cfc
│   │       │   │   │   ├── SshPoolSpec.cfc
│   │       │   │   │   └── YamlSpec.cfc
│   │       │   │   └── secrets/
│   │       │   │       ├── AwsSecretsAdapterSpec.cfc
│   │       │   │       ├── BitwardenAdapterSpec.cfc
│   │       │   │       ├── DopplerAdapterSpec.cfc
│   │       │   │       ├── LastPassAdapterSpec.cfc
│   │       │   │       ├── OnePasswordAdapterSpec.cfc
│   │       │   │       └── _stubs/
│   │       │   │           ├── StubAwsSecretsAdapter.cfc
│   │       │   │           ├── StubBitwardenAdapter.cfc
│   │       │   │           ├── StubDopplerAdapter.cfc
│   │       │   │           ├── StubLastPassAdapter.cfc
│   │       │   │           └── StubOnePasswordAdapter.cfc
│   │       │   ├── integration/
│   │       │   │   ├── DbCommandsSpec.cfc
│   │       │   │   ├── IntrospectSpec.cfc
│   │       │   │   └── ServerCommandsSpec.cfc
│   │       │   ├── packages/
│   │       │   │   ├── InstallerSpec.cfc
│   │       │   │   ├── ManifestCacheSpec.cfc
│   │       │   │   ├── PackagesMainCliSpec.cfc
│   │       │   │   ├── RegistryListAllSpec.cfc
│   │       │   │   ├── RegistrySpec.cfc
│   │       │   │   ├── VersionResolverSpec.cfc
│   │       │   │   └── _stubs/
│   │       │   │       └── FakeHttpClient.cfc
│   │       │   └── services/
│   │       │       ├── AdminSpec.cfc
│   │       │       ├── AnalysisSpec.cfc
│   │       │       ├── BundleStagerSpec.cfc
│   │       │       ├── CfclassesPurgerSpec.cfc
│   │       │       ├── CodeGenSpec.cfc
│   │       │       ├── DestroySpec.cfc
│   │       │       ├── DoctorSpec.cfc
│   │       │       ├── FrameworkInstallerSpec.cfc
│   │       │       ├── HelpersSpec.cfc
│   │       │       ├── MigrationRunnerSpec.cfc
│   │       │       ├── ReleaseChannelSpec.cfc
│   │       │       ├── ScaffoldSpec.cfc
│   │       │       ├── ServerRegistrySpec.cfc
│   │       │       ├── StatsSpec.cfc
│   │       │       ├── TemplatesSpec.cfc
│   │       │       ├── TestRunnerSpec.cfc
│   │       │       └── UpdateCheckerSpec.cfc
│   │       ├── test-module-install.sh
│   │       ├── test-new-exit-codes.sh
│   │       └── test-server-required-exit-codes.sh
│   └── src/
│       ├── ModuleConfig.cfc
│       ├── commands/
│       │   └── wheels/
│       │       ├── about.cfc
│       │       ├── analyze/
│       │       │   ├── code.cfc
│       │       │   └── performance.cfc
│       │       ├── assets/
│       │       │   ├── clean.cfc
│       │       │   ├── clobber.cfc
│       │       │   ├── init.cfc
│       │       │   └── precompile.cfc
│       │       ├── base.cfc
│       │       ├── benchmark.cfc
│       │       ├── browser/
│       │       │   ├── install.cfc
│       │       │   └── test.cfc
│       │       ├── cache/
│       │       │   └── clear.cfc
│       │       ├── cleanup/
│       │       │   ├── logs.cfc
│       │       │   ├── sessions.cfc
│       │       │   └── tmp.cfc
│       │       ├── config/
│       │       │   ├── check.cfc
│       │       │   ├── diff.cfc
│       │       │   ├── dump.cfc
│       │       │   ├── env.cfc
│       │       │   ├── list.cfc
│       │       │   └── set.cfc
│       │       ├── db/
│       │       │   ├── create.cfc
│       │       │   ├── drop.cfc
│       │       │   ├── dump.cfc
│       │       │   ├── reset.cfc
│       │       │   ├── restore.cfc
│       │       │   ├── rollback.cfc
│       │       │   ├── schema.cfc
│       │       │   ├── seed.cfc
│       │       │   ├── setup.cfc
│       │       │   ├── shell.cfc
│       │       │   ├── status.cfc
│       │       │   └── version.cfc
│       │       ├── dbmigrate/
│       │       │   ├── create/
│       │       │   │   ├── blank.cfc
│       │       │   │   ├── column.cfc
│       │       │   │   └── table.cfc
│       │       │   ├── diff.cfc
│       │       │   ├── down.cfc
│       │       │   ├── exec.cfc
│       │       │   ├── info.cfc
│       │       │   ├── latest.cfc
│       │       │   ├── remove/
│       │       │   │   └── table.cfc
│       │       │   ├── reset.cfc
│       │       │   └── up.cfc
│       │       ├── deploy/
│       │       │   ├── audit.cfc
│       │       │   ├── base.cfc
│       │       │   ├── exec.cfc
│       │       │   ├── hooks.cfc
│       │       │   ├── init.cfc
│       │       │   ├── lock.cfc
│       │       │   ├── logs.cfc
│       │       │   ├── proxy.cfc
│       │       │   ├── push.cfc
│       │       │   ├── rollback.cfc
│       │       │   ├── secrets.cfc
│       │       │   ├── setup.cfc
│       │       │   ├── status.cfc
│       │       │   └── stop.cfc
│       │       ├── deploy.cfc
│       │       ├── deps.cfc
│       │       ├── deptree.cfc
│       │       ├── destroy.cfc
│       │       ├── docker/
│       │       │   ├── DockerCommand.cfc
│       │       │   ├── build.cfc
│       │       │   ├── deploy.cfc
│       │       │   ├── exec.cfc
│       │       │   ├── init.cfc
│       │       │   ├── login.cfc
│       │       │   ├── logs.cfc
│       │       │   ├── push.cfc
│       │       │   └── stop.cfc
│       │       ├── docs/
│       │       │   ├── generate.cfc
│       │       │   └── serve.cfc
│       │       ├── doctor.cfc
│       │       ├── env/
│       │       │   ├── list.cfc
│       │       │   ├── merge.cfc
│       │       │   ├── set.cfc
│       │       │   ├── setup.cfc
│       │       │   ├── show.cfc
│       │       │   ├── switch.cfc
│       │       │   └── validate.cfc
│       │       ├── environment.cfc
│       │       ├── generate/
│       │       │   ├── admin.cfc
│       │       │   ├── api-resource.cfc
│       │       │   ├── app-wizard.cfc
│       │       │   ├── app.cfc
│       │       │   ├── code.cfc
│       │       │   ├── controller.cfc
│       │       │   ├── helper.cfc
│       │       │   ├── migration.cfc
│       │       │   ├── model.cfc
│       │       │   ├── property.cfc
│       │       │   ├── route.cfc
│       │       │   ├── scaffold.cfc
│       │       │   ├── seed.cfc
│       │       │   ├── snippets.cfc
│       │       │   ├── test.cfc
│       │       │   └── view.cfc
│       │       ├── get/
│       │       │   ├── environment.cfc
│       │       │   └── settings.cfc
│       │       ├── info.cfc
│       │       ├── init.cfc
│       │       ├── jobs/
│       │       │   ├── monitor.cfc
│       │       │   ├── purge.cfc
│       │       │   ├── retry.cfc
│       │       │   ├── status.cfc
│       │       │   └── work.cfc
│       │       ├── log/
│       │       │   ├── clear.cfc
│       │       │   └── tail.cfc
│       │       ├── maintenance/
│       │       │   ├── off.cfc
│       │       │   └── on.cfc
│       │       ├── mcp/
│       │       │   ├── remove.cfc
│       │       │   ├── setup.cfc
│       │       │   ├── status.cfc
│       │       │   ├── test.cfc
│       │       │   └── update.cfc
│       │       ├── notes.cfc
│       │       ├── optimize/
│       │       │   └── performance.cfc
│       │       ├── optimize.cfc
│       │       ├── playwright/
│       │       │   ├── init.cfc
│       │       │   └── install.cfc
│       │       ├── plugins/
│       │       │   ├── info.cfc
│       │       │   ├── init.cfc
│       │       │   ├── install.cfc
│       │       │   ├── list.cfc
│       │       │   ├── outdated.cfc
│       │       │   ├── remove.cfc
│       │       │   ├── search.cfc
│       │       │   ├── update.cfc
│       │       │   └── updateAll.cfc
│       │       ├── profile.cfc
│       │       ├── reload.cfc
│       │       ├── routes/
│       │       │   └── match.cfc
│       │       ├── routes.cfc
│       │       ├── secret.cfc
│       │       ├── security/
│       │       │   └── scan.cfc
│       │       ├── server/
│       │       │   ├── log.cfc
│       │       │   ├── open.cfc
│       │       │   ├── restart.cfc
│       │       │   ├── start.cfc
│       │       │   ├── status.cfc
│       │       │   └── stop.cfc
│       │       ├── set/
│       │       │   ├── datasource.cfc
│       │       │   ├── environment.cfc
│       │       │   └── settings.cfc
│       │       ├── stats.cfc
│       │       ├── test/
│       │       │   ├── all.cfc
│       │       │   ├── coverage.cfc
│       │       │   ├── integration.cfc
│       │       │   ├── migrate.cfc
│       │       │   ├── run.cfc
│       │       │   ├── unit.cfc
│       │       │   └── watch.cfc
│       │       ├── upgrade.cfc
│       │       ├── version.cfc
│       │       └── watch.cfc
│       ├── interceptors/
│       │   └── postInstall.cfc
│       ├── models/
│       │   ├── AdminIntrospectionService.cfc
│       │   ├── AdminViewService.cfc
│       │   ├── AnalysisService.cfc
│       │   ├── BaseCommand.cfc
│       │   ├── BrowserService.cfc
│       │   ├── CodeGenerationService.cfc
│       │   ├── DetailOutputService.cfc
│       │   ├── EnvironmentService.cfc
│       │   ├── MCPService.cfc
│       │   ├── MigrationService.cfc
│       │   ├── OptimizationService.cfc
│       │   ├── PluginService.cfc
│       │   ├── ScaffoldService.cfc
│       │   ├── SecurityService.cfc
│       │   ├── SharedParameters.cfc
│       │   ├── TemplateService.cfc
│       │   ├── TestMigrationService.cfc
│       │   ├── TestService.cfc
│       │   └── helpers.cfc
│       ├── recipes/
│       │   └── config-migration.boxr
│       └── templates/
│           ├── ActionContent.txt
│           ├── ApiControllerContent.txt
│           ├── BoxJSON.txt
│           ├── CRUDContent.txt
│           ├── ConfigAppContent.txt
│           ├── ConfigDataSourceH2Content.txt
│           ├── ConfigReloadPasswordContent.txt
│           ├── ConfigRoutes.txt
│           ├── ControllerContent.txt
│           ├── DBMigrate.txt
│           ├── HelperContent.txt
│           ├── McpConfig.json
│           ├── ModelContent.txt
│           ├── OpenCodeConfig.json
│           ├── ServerJSON.txt
│           ├── ViewContent.txt
│           ├── ViteConfig.txt
│           ├── ViteMainCSS.txt
│           ├── ViteMainJS.txt
│           ├── VitePackageJSON.txt
│           ├── WheelsBoxJSON.txt
│           ├── admin/
│           │   ├── AdminControllerContent.txt
│           │   ├── _form.txt
│           │   ├── edit.txt
│           │   ├── index.txt
│           │   ├── new.txt
│           │   └── show.txt
│           ├── bootstrap/
│           │   ├── layout.cfm
│           │   └── settings.cfm
│           ├── crud/
│           │   ├── _form.txt
│           │   ├── edit.txt
│           │   ├── index.txt
│           │   ├── new.txt
│           │   └── show.txt
│           ├── dbmigrate/
│           │   ├── announce.txt
│           │   ├── blank.txt
│           │   ├── change-column.txt
│           │   ├── change-table.txt
│           │   ├── create-column.txt
│           │   ├── create-index.txt
│           │   ├── create-record.txt
│           │   ├── create-table.txt
│           │   ├── execute.txt
│           │   ├── remove-column.txt
│           │   ├── remove-index.txt
│           │   ├── remove-record.txt
│           │   ├── remove-table.txt
│           │   ├── rename-column.txt
│           │   ├── rename-table.txt
│           │   └── update-record.txt
│           └── tests/
│               ├── controller.txt
│               ├── helper.txt
│               ├── model.txt
│               └── view.txt
├── commitlint.config.js
├── compose.yml
├── config/
│   ├── app.cfm
│   ├── development/
│   │   └── settings.cfm
│   ├── environment.cfm
│   ├── maintenance/
│   │   └── settings.cfm
│   ├── production/
│   │   └── settings.cfm
│   ├── routes.cfm
│   ├── settings.cfm
│   └── testing/
│       └── settings.cfm
├── context7.json
├── docker-compose.db-h2.yml
├── docker-compose.db-mysql.yml
├── docker-compose.db-postgres.yml
├── docker-compose.dev.yml
├── docs/
│   ├── AI_INTEGRATION_GUIDE.md
│   ├── api/
│   │   ├── v1.4.5.json
│   │   ├── v2.0.0.json
│   │   ├── v2.1.0.json
│   │   ├── v2.2.0.json
│   │   ├── v2.3.0.json
│   │   ├── v2.4.0.json
│   │   ├── v2.5.0.json
│   │   ├── v3.0.0.json
│   │   └── v4.0.0.json
│   ├── contributing/
│   │   └── wheels-bot.md
│   ├── plans/
│   │   └── 2026-03-07-phase1-verify-test.md
│   ├── releases/
│   │   ├── blog-drafts/
│   │   │   ├── README.md
│   │   │   ├── anatomy-of-a-wheels-package.md
│   │   │   ├── beyond-findall-scopes-enums-query-builder.md
│   │   │   └── wheels-claude-stdio-mcp.md
│   │   ├── blog-skeletons/
│   │   │   ├── 01-closing-the-maturity-gap.md
│   │   │   ├── 02-upgrading-from-3x.md
│   │   │   ├── 03-security-hardening.md
│   │   │   ├── 04-background-jobs.md
│   │   │   ├── 05-lucli-zero-docker.md
│   │   │   ├── 06-testing.md
│   │   │   ├── 07-multi-tenancy.md
│   │   │   ├── 08-wirebox-to-wheelsdi.md
│   │   │   ├── 09-wheels-deploy.md
│   │   │   ├── README.md
│   │   │   ├── social-announcements.md
│   │   │   ├── social-post-anatomy-of-a-wheels-package.md
│   │   │   ├── social-post-beyond-findall.md
│   │   │   ├── social-post-rate-limited-api.md
│   │   │   └── social-post-wheels-claude-stdio-mcp.md
│   │   ├── wheels-3.0-vs-4.0.md
│   │   └── wheels-4.0-audit.md
│   ├── superpowers/
│   │   ├── artifacts/
│   │   │   ├── lucli-pr-1/
│   │   │   │   ├── PR.md
│   │   │   │   └── cfml-exit-code.patch
│   │   │   └── lucli-pr-2/
│   │   │       └── ISSUE.md
│   │   ├── plans/
│   │   │   ├── 2026-03-12-ci-engine-grouped-testing.md
│   │   │   ├── 2026-03-26-wheels-plugins-sentry-hotwire-basecoat.md
│   │   │   ├── 2026-04-09-lucli-foundation-prs.md
│   │   │   ├── 2026-04-09-phase2-core-cli.md
│   │   │   ├── 2026-04-09-phase3-scaffold-distribution.md
│   │   │   ├── 2026-04-09-phase4-in-process-everything.md
│   │   │   ├── 2026-04-10-wheels-distribution.md
│   │   │   ├── 2026-04-11-cli-testing.md
│   │   │   ├── 2026-04-11-cli-tier1-porting.md
│   │   │   ├── 2026-04-14-congratulations-page-redesign.md
│   │   │   ├── 2026-04-15-auto-migration-rename-detection.md
│   │   │   ├── 2026-04-15-browser-testing-foundation.md
│   │   │   ├── 2026-04-15-browser-testing-pr2.md
│   │   │   ├── 2026-04-15-browser-testing-pr3.md
│   │   │   ├── 2026-04-15-browser-testing-pr4.md
│   │   │   ├── 2026-04-16-vite-pipeline-maturity.md
│   │   │   ├── 2026-04-16-wheels-4.0-upgrade-guide.md
│   │   │   ├── 2026-04-17-web-cohesion-foundation.md
│   │   │   ├── 2026-04-17-web-cohesion-visual-polish.md
│   │   │   ├── 2026-04-18-guides-rewrite-phase-0-report.md
│   │   │   ├── 2026-04-18-guides-rewrite-phase-0.md
│   │   │   ├── 2026-04-18-guides-rewrite-phase-1-report.md
│   │   │   ├── 2026-04-18-guides-rewrite-phase-1.md
│   │   │   ├── 2026-04-19-framework-gaps-from-guides-phase-1.md
│   │   │   ├── 2026-04-20-guides-rewrite-phase-2a-report.md
│   │   │   ├── 2026-04-20-guides-rewrite-phase-2a.md
│   │   │   ├── 2026-04-20-guides-rewrite-phase-2b-cli-report.md
│   │   │   ├── 2026-04-20-guides-rewrite-phase-2b-cli.md
│   │   │   ├── 2026-04-20-guides-rewrite-phase-2b-digging-deeper-report.md
│   │   │   ├── 2026-04-20-guides-rewrite-phase-2b-digging-deeper.md
│   │   │   ├── 2026-04-20-guides-rewrite-phase-2b-testing-report.md
│   │   │   ├── 2026-04-20-guides-rewrite-phase-2b-testing.md
│   │   │   ├── 2026-04-20-wheels-deploy-kamal-port.md
│   │   │   ├── 2026-04-21-guides-rewrite-phase-2c-report.md
│   │   │   ├── 2026-04-21-guides-rewrite-phase-2c.md
│   │   │   ├── 2026-04-21-phase1-retrospective.md
│   │   │   ├── 2026-04-23-wheels-packages-phase1-extraction.md
│   │   │   ├── 2026-04-23-wheels-packages-phase4-inapp.md
│   │   │   ├── 2026-04-23-wheels-packages-phase4-site.md
│   │   │   ├── 2026-04-29-fresh-vm-batch-a-doc-sweep.md
│   │   │   ├── 2026-04-29-fresh-vm-batch-b-cli-polish.md
│   │   │   ├── 2026-04-29-fresh-vm-batch-c-scaffold-align.md
│   │   │   ├── 2026-04-29-fresh-vm-batch-d-di-singleton.md
│   │   │   ├── 2026-04-29-fresh-vm-batch-e-browser-test-infra.md
│   │   │   ├── 2026-04-29-fresh-vm-onboarding-findings.md
│   │   │   ├── 2026-05-07-api-docs-validation-retro.md
│   │   │   └── 2026-05-15-rate-limited-api-article.md
│   │   └── specs/
│   │       ├── 2026-03-27-cockroachdb-adapter-phase2-design.md
│   │       ├── 2026-04-03-module-system-design.md
│   │       ├── 2026-04-08-lucli-ci-pipeline-design.md
│   │       ├── 2026-04-09-wheels-cli-lucli-integration-design.md
│   │       ├── 2026-04-10-wheels-distribution-design.md
│   │       ├── 2026-04-11-cli-testing-design.md
│   │       ├── 2026-04-11-cli-tier1-porting-design.md
│   │       ├── 2026-04-14-congratulations-page-redesign.md
│   │       ├── 2026-04-15-auto-migration-rename-detection-design.md
│   │       ├── 2026-04-15-browser-testing-design.md
│   │       ├── 2026-04-15-browser-testing-pr2-design.md
│   │       ├── 2026-04-15-browser-testing-pr3-design.md
│   │       ├── 2026-04-15-browser-testing-pr4-design.md
│   │       ├── 2026-04-16-vite-pipeline-maturity-design.md
│   │       ├── 2026-04-16-wheels-4.0-upgrade-guide-design.md
│   │       ├── 2026-04-17-wheels-dev-cohesion-design.md
│   │       ├── 2026-04-18-guides-rewrite-v4-design.md
│   │       ├── 2026-04-18-starlight-phase-3-design.md
│   │       ├── 2026-04-20-wheels-deploy-kamal-port-design.md
│   │       ├── 2026-04-23-wheels-packages-phase1-extraction-design.md
│   │       ├── 2026-04-23-wheels-packages-phase4-site-design.md
│   │       ├── 2026-04-23-wheels-packages-phase4-ui-design.md
│   │       └── 2026-05-15-deploy-secrets-flat-aliases-design.md
│   └── wheels-vs-frameworks.md
├── e2e/
│   ├── README.md
│   ├── api-endpoints.spec.ts
│   ├── configuration.spec.ts
│   ├── integration.spec.ts
│   ├── user-workflows.spec.ts
│   ├── wheels-features.spec.ts
│   └── wheels-framework.spec.ts
├── examples/
│   ├── README.md
│   ├── starter-app/
│   │   ├── .gitignore
│   │   ├── LICENSE
│   │   ├── README.md
│   │   ├── app/
│   │   │   ├── controllers/
│   │   │   │   ├── Accounts.cfc
│   │   │   │   ├── Controller.cfc
│   │   │   │   ├── Main.cfc
│   │   │   │   ├── PasswordResets.cfc
│   │   │   │   ├── Register.cfc
│   │   │   │   ├── Sessions.cfc
│   │   │   │   ├── admin/
│   │   │   │   │   ├── Auditlogs.cfc
│   │   │   │   │   ├── Permissions.cfc
│   │   │   │   │   ├── Roles.cfc
│   │   │   │   │   ├── Settings.cfc
│   │   │   │   │   ├── UserPermissions.cfc
│   │   │   │   │   └── Users.cfc
│   │   │   │   └── functions/
│   │   │   │       ├── auth.cfm
│   │   │   │       └── filters.cfm
│   │   │   ├── events/
│   │   │   │   ├── onabort.cfm
│   │   │   │   ├── onapplicationend.cfm
│   │   │   │   ├── onapplicationstart.cfm
│   │   │   │   ├── onerror.cfm
│   │   │   │   ├── onerror.json.cfm
│   │   │   │   ├── onerror.xml.cfm
│   │   │   │   ├── onmaintenance.cfm
│   │   │   │   ├── onmissingtemplate.cfm
│   │   │   │   ├── onrequestend.cfm
│   │   │   │   ├── onrequeststart.cfm
│   │   │   │   ├── onsessionend.cfm
│   │   │   │   └── onsessionstart.cfm
│   │   │   ├── global/
│   │   │   │   ├── auth.cfm
│   │   │   │   ├── functions.cfm
│   │   │   │   ├── install.cfm
│   │   │   │   ├── logging.cfm
│   │   │   │   └── utils.cfm
│   │   │   ├── jobs/
│   │   │   │   └── ProcessOrdersJob.cfc
│   │   │   ├── lib/
│   │   │   │   └── .keep
│   │   │   ├── mailers/
│   │   │   │   └── UserNotificationsMailer.cfc
│   │   │   ├── migrator/
│   │   │   │   ├── .keep
│   │   │   │   └── migrations/
│   │   │   │       ├── 20180519095317_Creates_User_Table.cfc
│   │   │   │       ├── 20180519100056_Creates_Roles_Table.cfc
│   │   │   │       ├── 20180519100244_Creates_Permissions_Table.cfc
│   │   │   │       ├── 20180519100412_Creates_RolePermissions_Table.cfc
│   │   │   │       ├── 20180519100428_Creates_UserPermissions_Table.cfc
│   │   │   │       ├── 20180519100429_Creates_Settings_Table.cfc
│   │   │   │       ├── 20180519100430_Creates_Auditlog_Table.cfc
│   │   │   │       ├── 20180519105943_Adds_Default_Roles.cfc
│   │   │   │       ├── 20180519105944_Adds_Default_UserAccounts.cfc
│   │   │   │       ├── 20180519105945_Adds_Default_Settings.cfc
│   │   │   │       ├── 20180519105946_Adds_Default_Permissions.cfc
│   │   │   │       ├── 20180519105947_Adds_Default_UserPermissions.cfc
│   │   │   │       └── 20180519105948_Adds_Dummy_Auditlogs.cfc
│   │   │   ├── models/
│   │   │   │   ├── Auditlog.cfc
│   │   │   │   ├── Model.cfc
│   │   │   │   ├── Permission.cfc
│   │   │   │   ├── Role.cfc
│   │   │   │   ├── RolePermission.cfc
│   │   │   │   ├── Setting.cfc
│   │   │   │   ├── User.cfc
│   │   │   │   ├── UserPermission.cfc
│   │   │   │   └── auth/
│   │   │   │       ├── LDAP.cfc
│   │   │   │       └── Local.cfc
│   │   │   ├── snippets/
│   │   │   │   ├── ActionContent.txt
│   │   │   │   ├── ApiControllerContent.txt
│   │   │   │   ├── BoxJSON.txt
│   │   │   │   ├── CRUDContent.txt
│   │   │   │   ├── ConfigAppContent.txt
│   │   │   │   ├── ConfigDataSourceH2Content.txt
│   │   │   │   ├── ConfigReloadPasswordContent.txt
│   │   │   │   ├── ConfigRoutes.txt
│   │   │   │   ├── ControllerContent.txt
│   │   │   │   ├── DBMigrate.txt
│   │   │   │   ├── ModelContent.txt
│   │   │   │   ├── ServerJSON.txt
│   │   │   │   ├── ViewContent.txt
│   │   │   │   ├── WheelsBoxJSON.txt
│   │   │   │   ├── bootstrap/
│   │   │   │   │   ├── layout.cfm
│   │   │   │   │   └── settings.cfm
│   │   │   │   ├── crud/
│   │   │   │   │   ├── _form.txt
│   │   │   │   │   ├── edit.txt
│   │   │   │   │   ├── index.txt
│   │   │   │   │   ├── new.txt
│   │   │   │   │   └── show.txt
│   │   │   │   ├── dbmigrate/
│   │   │   │   │   ├── announce.txt
│   │   │   │   │   ├── blank.txt
│   │   │   │   │   ├── change-column.txt
│   │   │   │   │   ├── change-table.txt
│   │   │   │   │   ├── create-column.txt
│   │   │   │   │   ├── create-index.txt
│   │   │   │   │   ├── create-record.txt
│   │   │   │   │   ├── create-table.txt
│   │   │   │   │   ├── execute.txt
│   │   │   │   │   ├── remove-column.txt
│   │   │   │   │   ├── remove-index.txt
│   │   │   │   │   ├── remove-record.txt
│   │   │   │   │   ├── remove-table.txt
│   │   │   │   │   ├── rename-column.txt
│   │   │   │   │   ├── rename-table.txt
│   │   │   │   │   └── update-record.txt
│   │   │   │   └── tests/
│   │   │   │       ├── controller.txt
│   │   │   │       ├── model.txt
│   │   │   │       └── view.txt
│   │   │   └── views/
│   │   │       ├── accounts/
│   │   │       │   ├── edit.cfm
│   │   │       │   ├── resetPassword.cfm
│   │   │       │   └── show.cfm
│   │   │       ├── admin/
│   │   │       │   ├── auditlogs/
│   │   │       │   │   ├── _filter.cfm
│   │   │       │   │   ├── _modal.cfm
│   │   │       │   │   └── index.cfm
│   │   │       │   ├── permissions/
│   │   │       │   │   ├── _form.cfm
│   │   │       │   │   ├── edit.cfm
│   │   │       │   │   └── index.cfm
│   │   │       │   ├── roles/
│   │   │       │   │   ├── _form.cfm
│   │   │       │   │   ├── edit.cfm
│   │   │       │   │   ├── index.cfm
│   │   │       │   │   └── new.cfm
│   │   │       │   ├── settings/
│   │   │       │   │   ├── _form.cfm
│   │   │       │   │   ├── edit.cfm
│   │   │       │   │   └── index.cfm
│   │   │       │   ├── userpermissions/
│   │   │       │   │   └── index.cfm
│   │   │       │   └── users/
│   │   │       │       ├── _filter.cfm
│   │   │       │       ├── edit.cfm
│   │   │       │       ├── form/
│   │   │       │       │   ├── _auth.cfm
│   │   │       │       │   ├── _details.cfm
│   │   │       │       │   └── _role.cfm
│   │   │       │       ├── index.cfm
│   │   │       │       ├── new.cfm
│   │   │       │       └── show.cfm
│   │   │       ├── emails/
│   │   │       │   ├── _footer.cfm
│   │   │       │   ├── _header.cfm
│   │   │       │   ├── passwordReset.cfm
│   │   │       │   ├── passwordResetAdmin.cfm
│   │   │       │   ├── passwordResetAdminPlain.cfm
│   │   │       │   ├── passwordResetPlain.cfm
│   │   │       │   ├── verify.cfm
│   │   │       │   └── verifyPlain.cfm
│   │   │       ├── helpers.cfm
│   │   │       ├── layout/
│   │   │       │   ├── _footer.cfm
│   │   │       │   └── _navigation.cfm
│   │   │       ├── layout.cfm
│   │   │       ├── main/
│   │   │       │   └── index.cfm
│   │   │       ├── passwordresets/
│   │   │       │   ├── edit.cfm
│   │   │       │   └── new.cfm
│   │   │       ├── register/
│   │   │       │   └── new.cfm
│   │   │       ├── sessions/
│   │   │       │   └── new.cfm
│   │   │       └── wheels/
│   │   │           ├── layout.cfm
│   │   │           └── wheels.cfm
│   │   ├── box.json
│   │   ├── config/
│   │   │   ├── app.cfm
│   │   │   ├── development/
│   │   │   │   └── settings.cfm
│   │   │   ├── environment.cfm
│   │   │   ├── maintenance/
│   │   │   │   └── settings.cfm
│   │   │   ├── production/
│   │   │   │   └── settings.cfm
│   │   │   ├── routes.cfm
│   │   │   ├── settings.cfm
│   │   │   └── testing/
│   │   │       └── settings.cfm
│   │   ├── db/
│   │   │   └── .keep
│   │   ├── plugins/
│   │   │   ├── .keep
│   │   │   ├── FlashMessagesBootstrap/
│   │   │   │   ├── FlashMessagesBootstrap.cfc
│   │   │   │   ├── LICENSE
│   │   │   │   ├── README.md
│   │   │   │   ├── box.json
│   │   │   │   ├── index.cfm
│   │   │   │   └── stylesheets/
│   │   │   │       └── bootstrap.min.cfm
│   │   │   ├── authenticateThis/
│   │   │   │   ├── authenticateThis.cfc
│   │   │   │   ├── box.json
│   │   │   │   ├── index.cfm
│   │   │   │   └── tests/
│   │   │   │       ├── AuthenticateTest.cfc
│   │   │   │       └── _assets/
│   │   │   │           └── models/
│   │   │   │               └── dummy.cfc
│   │   │   └── jsconfirm/
│   │   │       ├── JSConfirm.cfc
│   │   │       ├── LICENSE
│   │   │       ├── README.md
│   │   │       ├── box.json
│   │   │       └── index.cfm
│   │   ├── public/
│   │   │   ├── Application.cfc
│   │   │   ├── files/
│   │   │   │   └── .keep
│   │   │   ├── images/
│   │   │   │   └── .keep
│   │   │   ├── index.cfm
│   │   │   ├── javascripts/
│   │   │   │   ├── .keep
│   │   │   │   ├── custom.js
│   │   │   │   └── daterangepicker.js
│   │   │   ├── miscellaneous/
│   │   │   │   └── Application.cfc
│   │   │   ├── stylesheets/
│   │   │   │   ├── .keep
│   │   │   │   ├── custom.css
│   │   │   │   └── daterangepicker.css
│   │   │   ├── test-mcp.cfm
│   │   │   └── urlrewrite.xml
│   │   ├── server.json
│   │   └── tests/
│   │       ├── RocketUnit/
│   │       │   ├── Test.cfc
│   │       │   ├── functions/
│   │       │   │   ├── Auth.cfc
│   │       │   │   ├── Permissions.cfc
│   │       │   │   ├── Utils.cfc
│   │       │   │   └── models/
│   │       │   │       ├── Auditlog.cfc
│   │       │   │       ├── Permission.cfc
│   │       │   │       ├── Role.cfc
│   │       │   │       └── User.cfc
│   │       │   └── requests/
│   │       │       ├── Accounts.cfc
│   │       │       ├── Main.cfc
│   │       │       └── Sessions.cfc
│   │       ├── _assets/
│   │       │   ├── controllers/
│   │       │   │   └── Controller.cfc
│   │       │   ├── files/
│   │       │   │   └── .keep
│   │       │   ├── migrator/
│   │       │   │   └── migrations/
│   │       │   │       └── .keep
│   │       │   ├── models/
│   │       │   │   └── Model.cfc
│   │       │   ├── plugins/
│   │       │   │   └── .keep
│   │       │   └── views/
│   │       │       ├── .keep
│   │       │       ├── helpers.cfm
│   │       │       └── layout.cfm
│   │       ├── populate.cfm
│   │       ├── routes.cfm
│   │       ├── runner.cfm
│   │       └── specs/
│   │           └── functions/
│   │               └── ExampleSpec.cfc
│   └── tweet/
│       ├── .ai/
│       │   ├── CONTRIBUTION_SUMMARY.md
│       │   ├── MCP-ENFORCEMENT.md
│       │   ├── QUICK_REFERENCE.md
│       │   ├── README.md
│       │   ├── cfml/
│       │   │   ├── README.md
│       │   │   ├── advanced/
│       │   │   │   └── closures.md
│       │   │   ├── best-practices/
│       │   │   │   ├── modern-patterns.md
│       │   │   │   └── performance.md
│       │   │   ├── components/
│       │   │   │   ├── component-basics.md
│       │   │   │   ├── functions.md
│       │   │   │   └── properties.md
│       │   │   ├── control-flow/
│       │   │   │   ├── conditionals.md
│       │   │   │   ├── exception-handling.md
│       │   │   │   └── loops.md
│       │   │   ├── data-types/
│       │   │   │   ├── arrays/
│       │   │   │   │   ├── array-creation.md
│       │   │   │   │   ├── array-iteration.md
│       │   │   │   │   └── array-methods.md
│       │   │   │   ├── numbers/
│       │   │   │   │   └── numeric-basics.md
│       │   │   │   ├── scopes/
│       │   │   │   │   └── variables-scope.md
│       │   │   │   ├── strings/
│       │   │   │   │   ├── string-functions.md
│       │   │   │   │   ├── string-interpolation.md
│       │   │   │   │   └── string-literals.md
│       │   │   │   ├── structures/
│       │   │   │   │   ├── struct-creation.md
│       │   │   │   │   └── structure-basics.md
│       │   │   │   ├── variable-scopes.md
│       │   │   │   └── variables.md
│       │   │   ├── database/
│       │   │   │   └── query-basics.md
│       │   │   └── syntax/
│       │   │       ├── basic-syntax.md
│       │   │       ├── cfscript-vs-tags.md
│       │   │       ├── comments.md
│       │   │       └── hash-escaping.md
│       │   └── wheels/
│       │       ├── README.md
│       │       ├── cli/
│       │       │   └── generators/
│       │       │       ├── controllers.md
│       │       │       ├── migrations.md
│       │       │       ├── models.md
│       │       │       └── scaffolds.md
│       │       ├── communication/
│       │       │   └── email-sending.md
│       │       ├── configuration/
│       │       │   ├── application.md
│       │       │   ├── best-practices.md
│       │       │   ├── environments.md
│       │       │   ├── framework-settings.md
│       │       │   ├── overview.md
│       │       │   ├── routing.md
│       │       │   ├── security.md
│       │       │   └── troubleshooting.md
│       │       ├── controllers/
│       │       │   ├── api.md
│       │       │   ├── architecture.md
│       │       │   ├── filters/
│       │       │   │   ├── authentication.md
│       │       │   │   ├── authorization.md
│       │       │   │   └── before-after.md
│       │       │   ├── filters.md
│       │       │   ├── http-detection.md
│       │       │   ├── model-interactions.md
│       │       │   ├── params/
│       │       │   │   └── verification.md
│       │       │   ├── rendering/
│       │       │   │   ├── json.md
│       │       │   │   ├── redirects.md
│       │       │   │   └── views.md
│       │       │   ├── rendering.md
│       │       │   ├── security.md
│       │       │   └── testing.md
│       │       ├── core-concepts/
│       │       │   ├── mvc-architecture/
│       │       │   │   ├── controllers.md
│       │       │   │   ├── conventions.md
│       │       │   │   ├── models.md
│       │       │   │   └── views.md
│       │       │   ├── orm/
│       │       │   │   ├── mapping-basics.md
│       │       │   │   ├── primary-keys.md
│       │       │   │   ├── properties.md
│       │       │   │   └── tableless-models.md
│       │       │   ├── rails-comparison.md
│       │       │   └── routing/
│       │       │       ├── basics.md
│       │       │       ├── http-methods.md
│       │       │       ├── patterns.md
│       │       │       └── resources.md
│       │       ├── database/
│       │       │   ├── associations/
│       │       │   │   ├── belongs-to.md
│       │       │   │   ├── has-many.md
│       │       │   │   ├── has-one.md
│       │       │   │   └── nested-properties.md
│       │       │   ├── migrations/
│       │       │   │   ├── advanced-operations.md
│       │       │   │   ├── best-practices.md
│       │       │   │   ├── column-types.md
│       │       │   │   ├── creating-migrations.md
│       │       │   │   ├── date-function-issues.md
│       │       │   │   ├── rollback.md
│       │       │   │   └── running-migrations.md
│       │       │   ├── queries/
│       │       │   │   ├── creating-records.md
│       │       │   │   ├── deleting-records.md
│       │       │   │   ├── finding-records.md
│       │       │   │   └── updating-records.md
│       │       │   └── validations/
│       │       │       ├── custom.md
│       │       │       ├── format.md
│       │       │       ├── presence.md
│       │       │       └── uniqueness.md
│       │       ├── files/
│       │       │   └── downloads.md
│       │       ├── integration/
│       │       │   └── modern-frontend-stack.md
│       │       ├── models/
│       │       │   ├── advanced-features.md
│       │       │   ├── advanced-patterns.md
│       │       │   ├── architecture.md
│       │       │   ├── associations.md
│       │       │   ├── best-practices.md
│       │       │   ├── callbacks.md
│       │       │   ├── methods-reference.md
│       │       │   ├── performance.md
│       │       │   ├── testing.md
│       │       │   ├── user-authentication.md
│       │       │   └── validations.md
│       │       ├── patterns/
│       │       │   ├── authentication.md
│       │       │   ├── crud.md
│       │       │   └── validation-templates.md
│       │       ├── security/
│       │       │   ├── csrf-protection.md
│       │       │   └── https-detection.md
│       │       ├── snippets/
│       │       │   ├── controller-snippets.md
│       │       │   └── model-snippets.md
│       │       ├── testing/
│       │       │   └── browser-automation-patterns.md
│       │       ├── troubleshooting/
│       │       │   ├── common-errors.md
│       │       │   └── form-helper-errors.md
│       │       ├── views/
│       │       │   ├── advanced-patterns.md
│       │       │   ├── architecture.md
│       │       │   ├── best-practices.md
│       │       │   ├── data-handling.md
│       │       │   ├── forms.md
│       │       │   ├── helpers/
│       │       │   │   ├── custom.md
│       │       │   │   ├── dates.md
│       │       │   │   ├── forms.md
│       │       │   │   └── links.md
│       │       │   ├── helpers.md
│       │       │   ├── layouts/
│       │       │   │   ├── content-for.md
│       │       │   │   ├── partials.md
│       │       │   │   └── structure.md
│       │       │   ├── layouts.md
│       │       │   ├── partials.md
│       │       │   ├── query-association-patterns.md
│       │       │   └── testing.md
│       │       └── workflows/
│       │           ├── documentation-loading-strategy.md
│       │           ├── enhanced-mcp-develop-specification.md
│       │           ├── intelligent-analysis-planning-engine.md
│       │           ├── pre-implementation.md
│       │           └── template-driven-implementation-patterns.md
│       ├── .claude/
│       │   ├── .devcontainer/
│       │   │   └── devcontainer.json
│       │   ├── commands/
│       │   │   └── wheels_execute.md
│       │   ├── settings.local.json
│       │   └── skills/
│       │       ├── README.md
│       │       ├── SKILLS-QUICK-START.md
│       │       ├── wheels-anti-pattern-detector/
│       │       │   └── SKILL.md
│       │       ├── wheels-api-generator/
│       │       │   └── SKILL.md
│       │       ├── wheels-auth-generator/
│       │       │   └── SKILL.md
│       │       ├── wheels-controller-generator/
│       │       │   └── SKILL.md
│       │       ├── wheels-debugging/
│       │       │   └── SKILL.md
│       │       ├── wheels-deployment/
│       │       │   └── SKILL.md
│       │       ├── wheels-documentation-generator/
│       │       │   └── SKILL.md
│       │       ├── wheels-migration-generator/
│       │       │   └── SKILL.md
│       │       ├── wheels-model-generator/
│       │       │   ├── SKILL.md
│       │       │   └── templates/
│       │       │       ├── basic-model.cfc
│       │       │       └── user-authentication-model.cfc
│       │       ├── wheels-refactoring/
│       │       │   └── SKILL.md
│       │       ├── wheels-test-generator/
│       │       │   └── SKILL.md
│       │       └── wheels-view-generator/
│       │           └── SKILL.md
│       ├── .gitignore
│       ├── .opencode/
│       │   └── command/
│       │       └── wheels_execute.md
│       ├── .vscode/
│       │   ├── wheels-test.code-snippets
│       │   └── wheels.code-snippets
│       ├── AGENTS.md
│       ├── LICENSE
│       ├── README.md
│       ├── app/
│       │   ├── controllers/
│       │   │   ├── Controller.cfc
│       │   │   ├── Follows.cfc
│       │   │   ├── Likes.cfc
│       │   │   ├── Sessions.cfc
│       │   │   ├── Tweets.cfc
│       │   │   └── Users.cfc
│       │   ├── events/
│       │   │   ├── onabort.cfm
│       │   │   ├── onapplicationend.cfm
│       │   │   ├── onapplicationstart.cfm
│       │   │   ├── onerror.cfm
│       │   │   ├── onerror.json.cfm
│       │   │   ├── onerror.xml.cfm
│       │   │   ├── onmaintenance.cfm
│       │   │   ├── onmissingtemplate.cfm
│       │   │   ├── onrequestend.cfm
│       │   │   ├── onrequeststart.cfm
│       │   │   ├── onsessionend.cfm
│       │   │   └── onsessionstart.cfm
│       │   ├── global/
│       │   │   └── functions.cfm
│       │   ├── jobs/
│       │   │   └── ProcessOrdersJob.cfc
│       │   ├── lib/
│       │   │   └── .keep
│       │   ├── mailers/
│       │   │   └── UserNotificationsMailer.cfc
│       │   ├── migrator/
│       │   │   ├── .keep
│       │   │   └── migrations/
│       │   │       ├── .keep
│       │   │       ├── 20251021133355_CreateUsersTable.cfc
│       │   │       ├── 20251021133401_CreateTweetsTable.cfc
│       │   │       ├── 20251021133404_CreateLikesTable.cfc
│       │   │       └── 20251021133406_CreateFollowsTable.cfc
│       │   ├── models/
│       │   │   ├── Follow.cfc
│       │   │   ├── Like.cfc
│       │   │   ├── Model.cfc
│       │   │   ├── Tweet.cfc
│       │   │   └── User.cfc
│       │   ├── snippets/
│       │   │   ├── ActionContent.txt
│       │   │   ├── ApiControllerContent.txt
│       │   │   ├── BoxJSON.txt
│       │   │   ├── CRUDContent.txt
│       │   │   ├── ConfigAppContent.txt
│       │   │   ├── ConfigDataSourceH2Content.txt
│       │   │   ├── ConfigReloadPasswordContent.txt
│       │   │   ├── ConfigRoutes.txt
│       │   │   ├── ControllerContent.txt
│       │   │   ├── DBMigrate.txt
│       │   │   ├── ModelContent.txt
│       │   │   ├── ServerJSON.txt
│       │   │   ├── ViewContent.txt
│       │   │   ├── WheelsBoxJSON.txt
│       │   │   ├── bootstrap/
│       │   │   │   ├── layout.cfm
│       │   │   │   └── settings.cfm
│       │   │   ├── crud/
│       │   │   │   ├── _form.txt
│       │   │   │   ├── edit.txt
│       │   │   │   ├── index.txt
│       │   │   │   ├── new.txt
│       │   │   │   └── show.txt
│       │   │   ├── dbmigrate/
│       │   │   │   ├── announce.txt
│       │   │   │   ├── blank.txt
│       │   │   │   ├── change-column.txt
│       │   │   │   ├── change-table.txt
│       │   │   │   ├── create-column.txt
│       │   │   │   ├── create-index.txt
│       │   │   │   ├── create-record.txt
│       │   │   │   ├── create-table.txt
│       │   │   │   ├── execute.txt
│       │   │   │   ├── remove-column.txt
│       │   │   │   ├── remove-index.txt
│       │   │   │   ├── remove-record.txt
│       │   │   │   ├── remove-table.txt
│       │   │   │   ├── rename-column.txt
│       │   │   │   ├── rename-table.txt
│       │   │   │   └── update-record.txt
│       │   │   ├── mcp-server.js.txt
│       │   │   └── tests/
│       │   │       ├── controller.txt
│       │   │       ├── model.txt
│       │   │       └── view.txt
│       │   └── views/
│       │       ├── helpers.cfm
│       │       ├── layout.cfm
│       │       ├── sessions/
│       │       │   └── new.cfm
│       │       ├── tweets/
│       │       │   └── index.cfm
│       │       ├── usernotificationsmailer/
│       │       │   └── sendEmail.cfm
│       │       └── users/
│       │           ├── edit.cfm
│       │           ├── new.cfm
│       │           └── show.cfm
│       ├── box.json
│       ├── config/
│       │   ├── app.cfm
│       │   ├── development/
│       │   │   └── settings.cfm
│       │   ├── environment.cfm
│       │   ├── maintenance/
│       │   │   └── settings.cfm
│       │   ├── production/
│       │   │   └── settings.cfm
│       │   ├── routes.cfm
│       │   ├── settings.cfm
│       │   └── testing/
│       │       └── settings.cfm
│       ├── plugins/
│       │   └── .keep
│       ├── public/
│       │   ├── .htaccess
│       │   ├── Application.cfc
│       │   ├── files/
│       │   │   └── .keep
│       │   ├── images/
│       │   │   └── .keep
│       │   ├── index.bxm
│       │   ├── index.cfm
│       │   ├── javascripts/
│       │   │   └── .keep
│       │   ├── miscellaneous/
│       │   │   └── Application.cfc
│       │   ├── stylesheets/
│       │   │   └── .keep
│       │   └── urlrewrite.xml
│       ├── server.json
│       ├── tests/
│       │   ├── _assets/
│       │   │   ├── controllers/
│       │   │   │   └── Controller.cfc
│       │   │   ├── files/
│       │   │   │   └── .keep
│       │   │   ├── migrator/
│       │   │   │   └── migrations/
│       │   │   │       └── .keep
│       │   │   ├── models/
│       │   │   │   └── Model.cfc
│       │   │   ├── plugins/
│       │   │   │   └── .keep
│       │   │   └── views/
│       │   │       ├── .keep
│       │   │       ├── helpers.cfm
│       │   │       └── layout.cfm
│       │   ├── populate.cfm
│       │   ├── routes.cfm
│       │   ├── runner.cfm
│       │   └── specs/
│       │       └── functions/
│       │           └── ExampleSpec.cfc
│       ├── vendor/
│       │   └── .keep
│       └── wheels-base-template-3.0.0-SNAPSHOT.rc.1+1053-20251021194426
├── lucee.json
├── package.json
├── playwright.config.ts
├── plugins/
│   └── .keep
├── public/
│   ├── .htaccess
│   ├── Application.cfc
│   ├── ApplicationProxy.cfc
│   ├── files/
│   │   └── .keep
│   ├── images/
│   │   └── .keep
│   ├── index.bxm
│   ├── index.cfm
│   ├── javascripts/
│   │   └── .keep
│   ├── miscellaneous/
│   │   └── Application.cfc
│   ├── stylesheets/
│   │   └── .keep
│   └── urlrewrite.xml
├── server.json
├── tests/
│   ├── README.md
│   ├── TestRunner.cfc
│   ├── _assets/
│   │   ├── controllers/
│   │   │   └── Controller.cfc
│   │   ├── files/
│   │   │   └── .keep
│   │   ├── migrator/
│   │   │   └── migrations/
│   │   │       └── .keep
│   │   ├── models/
│   │   │   ├── Author.cfc
│   │   │   ├── Model.cfc
│   │   │   └── Post.cfc
│   │   ├── plugins/
│   │   │   └── .keep
│   │   └── views/
│   │       ├── .keep
│   │       ├── helpers.cfm
│   │       └── layout.cfm
│   ├── populate.cfm
│   ├── routes.cfm
│   ├── runner.cfm
│   └── specs/
│       └── functional/
│           └── ExampleSpec.cfc
├── tools/
│   ├── article-tests/
│   │   ├── Probe.cfc
│   │   ├── Probes.cfc
│   │   ├── README.md
│   │   ├── boxlang.json
│   │   ├── edge-cases.cfm
│   │   ├── run.cfm
│   │   └── run.sh
│   ├── auto-merge.sh
│   ├── build/
│   │   ├── base/
│   │   │   ├── .gitignore
│   │   │   ├── .mcp.json
│   │   │   ├── .opencode.json
│   │   │   ├── README.md
│   │   │   ├── box.json
│   │   │   ├── config/
│   │   │   │   ├── app.cfm
│   │   │   │   └── settings.cfm
│   │   │   └── server.json
│   │   ├── cli/
│   │   │   ├── README.md
│   │   │   └── box.json
│   │   ├── core/
│   │   │   ├── README.md
│   │   │   ├── box.json
│   │   │   └── wheels.json
│   │   ├── lib/
│   │   │   └── ant-contrib-1.0b3.jar
│   │   └── scripts/
│   │       ├── README.md
│   │       ├── build-base.sh
│   │       ├── build-cli.sh
│   │       ├── build-core.sh
│   │       ├── build-starterApp.sh
│   │       ├── generate-changelog.sh
│   │       ├── prepare-base.sh
│   │       ├── prepare-cli.sh
│   │       ├── prepare-core.sh
│   │       ├── prepare-starterApp.sh
│   │       ├── publish-to-forgebox.sh
│   │       └── test-forgebox-package.sh
│   ├── ci/
│   │   ├── lucee.ci.json
│   │   ├── run-tests.sh
│   │   ├── setup-datasources.cfm
│   │   └── smoke-test-module.sh
│   ├── deploy-config-diff.sh
│   ├── deploy-dry-run-diff.sh
│   ├── deploy-dry-run-normalize.py
│   ├── deploy-e2e-down.sh
│   ├── deploy-e2e-up.sh
│   ├── deploy-sshd-down.sh
│   ├── deploy-sshd-up.sh
│   ├── deploy-verb-smoke.sh
│   ├── distribution-drafts/
│   │   ├── README.md
│   │   ├── apt-repo/
│   │   │   ├── README.md
│   │   │   ├── scripts/
│   │   │   │   └── regenerate-apt-metadata.sh
│   │   │   ├── templates/
│   │   │   │   ├── aptftparchive.conf
│   │   │   │   ├── index.html
│   │   │   │   └── wheels.gpg.placeholder
│   │   │   └── workflows/
│   │   │       └── wheels-released.yml
│   │   ├── homebrew/
│   │   │   ├── auto-update-channel-patch.md
│   │   │   ├── bleeding-edge-update.yml
│   │   │   └── wheels-be.rb
│   │   ├── linux-packages/
│   │   │   ├── README.md
│   │   │   ├── build-linux-packages.sh
│   │   │   ├── nfpm-wheels-be.yaml
│   │   │   └── nfpm-wheels.yaml
│   │   ├── scoop/
│   │   │   ├── README.md
│   │   │   ├── build-manifests.py
│   │   │   ├── validate.py
│   │   │   ├── wheels-be.json
│   │   │   └── wheels.json
│   │   ├── snapshots-repo/
│   │   │   ├── README.md
│   │   │   └── cleanup-old-snapshots.yml
│   │   ├── winget/
│   │   │   ├── README.md
│   │   │   ├── Wheels.Wheels/
│   │   │   │   └── 4.0.0/
│   │   │   │       ├── Wheels.Wheels.installer.yaml
│   │   │   │       ├── Wheels.Wheels.locale.en-US.yaml
│   │   │   │       └── Wheels.Wheels.yaml
│   │   │   ├── Wheels.WheelsBE/
│   │   │   │   └── 4.0.0-snapshot.1789/
│   │   │   │       ├── Wheels.WheelsBE.installer.yaml
│   │   │   │       ├── Wheels.WheelsBE.locale.en-US.yaml
│   │   │   │       └── Wheels.WheelsBE.yaml
│   │   │   └── validate.py
│   │   └── yum-repo/
│   │       ├── README.md
│   │       ├── scripts/
│   │       │   └── regenerate-yum-metadata.sh
│   │       ├── templates/
│   │       │   ├── index.html
│   │       │   ├── wheels-be.repo
│   │       │   ├── wheels.gpg.placeholder
│   │       │   └── wheels.repo
│   │       └── workflows/
│   │           └── wheels-released.yml
│   ├── docker/
│   │   ├── .gitignore
│   │   ├── Oracle/
│   │   │   └── 01-configure-cursors.sql
│   │   ├── README.md
│   │   ├── adobe2018/
│   │   │   ├── CFConfig-actions.json
│   │   │   ├── CFConfig.json
│   │   │   ├── Dockerfile
│   │   │   ├── box.json
│   │   │   ├── lib/
│   │   │   │   └── .keep
│   │   │   ├── server.json
│   │   │   └── settings.cfm
│   │   ├── adobe2021/
│   │   │   ├── CFConfig-actions.json
│   │   │   ├── CFConfig.json
│   │   │   ├── Dockerfile
│   │   │   ├── box.json
│   │   │   ├── lib/
│   │   │   │   ├── .keep
│   │   │   │   └── sqlite-jdbc-3.50.3.0.jar
│   │   │   ├── server.json
│   │   │   └── settings.cfm
│   │   ├── adobe2023/
│   │   │   ├── CFConfig-actions.json
│   │   │   ├── CFConfig.json
│   │   │   ├── Dockerfile
│   │   │   ├── box.json
│   │   │   ├── lib/
│   │   │   │   ├── .keep
│   │   │   │   └── sqlite-jdbc-3.50.3.0.jar
│   │   │   ├── server.json
│   │   │   └── settings.cfm
│   │   ├── adobe2025/
│   │   │   ├── CFConfig-actions.json
│   │   │   ├── CFConfig.json
│   │   │   ├── Dockerfile
│   │   │   ├── box.json
│   │   │   ├── lib/
│   │   │   │   ├── .keep
│   │   │   │   └── sqlite-jdbc-3.50.3.0.jar
│   │   │   ├── server.json
│   │   │   └── settings.cfm
│   │   ├── boxlang/
│   │   │   ├── CFConfig-actions.json
│   │   │   ├── CFConfig.json
│   │   │   ├── Dockerfile
│   │   │   ├── box.json
│   │   │   ├── lib/
│   │   │   │   └── .keep
│   │   │   ├── server.json
│   │   │   └── settings.cfm
│   │   ├── dev/
│   │   │   ├── cfconfig-h2.json
│   │   │   ├── cfconfig-mysql.json
│   │   │   └── cfconfig-postgres.json
│   │   ├── github/
│   │   │   ├── README.md
│   │   │   ├── Tasks.cfc
│   │   │   ├── core-tests.sh
│   │   │   ├── db-up.sh
│   │   │   ├── functions.sh
│   │   │   ├── server-up.sh
│   │   │   └── wait-for-it.sh
│   │   ├── lucee5/
│   │   │   ├── CFConfig-actions.json
│   │   │   ├── CFConfig.json
│   │   │   ├── Dockerfile
│   │   │   ├── box.json
│   │   │   ├── lib/
│   │   │   │   └── .keep
│   │   │   ├── server.json
│   │   │   └── settings.cfm
│   │   ├── lucee6/
│   │   │   ├── CFConfig-actions.json
│   │   │   ├── CFConfig.json
│   │   │   ├── Dockerfile
│   │   │   ├── box.json
│   │   │   ├── lib/
│   │   │   │   └── .keep
│   │   │   ├── server.json
│   │   │   └── settings.cfm
│   │   ├── lucee7/
│   │   │   ├── CFConfig-actions.json
│   │   │   ├── CFConfig.json
│   │   │   ├── Dockerfile
│   │   │   ├── box.json
│   │   │   ├── server.json
│   │   │   └── settings.cfm
│   │   ├── sqlserver/
│   │   │   ├── APPLE_SILICON.md
│   │   │   ├── Dockerfile
│   │   │   ├── Dockerfile_CICD
│   │   │   ├── README.md
│   │   │   └── init-db.sh
│   │   └── testui/
│   │       ├── .gitignore
│   │       ├── DEVELOPMENT.md
│   │       ├── DOCKER-INTEGRATION.md
│   │       ├── DOCKER-README.md
│   │       ├── DOCKER-USAGE.md
│   │       ├── Dockerfile
│   │       ├── Dockerfile.dev
│   │       ├── IMPLEMENTATION-NOTES.md
│   │       ├── README.md
│   │       ├── docker-build.sh
│   │       ├── docker-compose.dev.yml
│   │       ├── docker-compose.test.yml
│   │       ├── docker-entrypoint.sh
│   │       ├── docker-test.sh
│   │       ├── index.html
│   │       ├── nginx.conf
│   │       ├── package.json
│   │       ├── proxy_buffer_size.conf
│   │       ├── public/
│   │       │   └── error.html
│   │       ├── src/
│   │       │   ├── App.vue
│   │       │   ├── assets/
│   │       │   │   └── main.css
│   │       │   ├── components/
│   │       │   │   ├── PreflightStatus.vue
│   │       │   │   ├── StatusBadge.vue
│   │       │   │   ├── TestResultItem.vue
│   │       │   │   └── TestStats.vue
│   │       │   ├── env.d.ts
│   │       │   ├── main.ts
│   │       │   ├── router/
│   │       │   │   └── index.ts
│   │       │   ├── services/
│   │       │   │   ├── docker.service.ts
│   │       │   │   ├── preflight.service.ts
│   │       │   │   └── test.service.ts
│   │       │   ├── shims-vue.d.ts
│   │       │   ├── stores/
│   │       │   │   ├── databaseStore.ts
│   │       │   │   ├── engineStore.ts
│   │       │   │   ├── testStore.ts
│   │       │   │   └── themeStore.ts
│   │       │   ├── types/
│   │       │   │   └── index.ts
│   │       │   ├── types.ts
│   │       │   ├── utils/
│   │       │   │   ├── api.ts
│   │       │   │   └── theme.ts
│   │       │   └── views/
│   │       │       ├── HomeView.vue
│   │       │       └── TestsView.vue
│   │       ├── supervisord.conf
│   │       ├── tsconfig.json
│   │       ├── tsconfig.node.json
│   │       └── vite.config.ts
│   ├── docs-validation/
│   │   ├── .gitignore
│   │   ├── README.md
│   │   ├── agent/
│   │   │   ├── prompt-guide.md
│   │   │   └── prompt.md
│   │   ├── lib/
│   │   │   ├── agent.mjs
│   │   │   ├── guides.mjs
│   │   │   ├── reference-store.mjs
│   │   │   ├── snapshot.mjs
│   │   │   ├── source-map.mjs
│   │   │   ├── state.mjs
│   │   │   └── tools.mjs
│   │   ├── orchestrate.mjs
│   │   ├── package.json
│   │   └── state.json
│   ├── install-playwright.sh
│   ├── installer/
│   │   ├── chocolatey/
│   │   │   ├── README.md
│   │   │   ├── build-choco.ps1
│   │   │   ├── lucli.nuspec
│   │   │   └── tools/
│   │   │       ├── VERIFICATION.txt
│   │   │       ├── chocolateyinstall.ps1
│   │   │       └── chocolateyuninstall.ps1
│   │   ├── macos/
│   │   │   ├── .gitignore
│   │   │   ├── Info.plist
│   │   │   ├── README.md
│   │   │   ├── WheelsInstallerApp.swift
│   │   │   ├── assets/
│   │   │   │   └── wheels_logo.icns
│   │   │   ├── build-swift.sh
│   │   │   ├── create-dmg.sh
│   │   │   ├── install-wheels
│   │   │   └── installer/
│   │   │       └── wheels-installer.dmg
│   │   └── windows/
│   │       ├── README.md
│   │       ├── install-wheels.iss
│   │       └── install-wheels.ps1
│   ├── issue-resolver/
│   │   ├── lib/
│   │   │   ├── config.ts
│   │   │   ├── github.ts
│   │   │   └── session.ts
│   │   ├── run.ts
│   │   ├── setup.ts
│   │   └── tsconfig.json
│   ├── lucee-extensions/
│   │   └── sqlite/
│   │       ├── .gitignore
│   │       ├── README.md
│   │       ├── build.sh
│   │       ├── install.sh
│   │       └── src/
│   │           ├── SQLite.cfc
│   │           ├── build.properties
│   │           └── sqlite-jdbc-3.49.1.0.jar
│   ├── scripts/
│   │   ├── integration-test.sh
│   │   └── setup.sh
│   ├── test-cli-e2e.sh
│   ├── test-cli-local.sh
│   ├── test-local.sh
│   ├── test-matrix.sh
│   ├── test-onboarding.sh
│   ├── test-tutorial-ch7.sh
│   ├── vscode-ext/
│   │   ├── .gitignore
│   │   ├── .vscodeignore
│   │   ├── CHANGELOG.md
│   │   ├── LICENSE
│   │   ├── README.md
│   │   ├── assets/
│   │   │   └── templates/
│   │   │       ├── controller.cfc
│   │   │       ├── model.cfc
│   │   │       ├── view-edit.cfm
│   │   │       ├── view-index.cfm
│   │   │       ├── view-new.cfm
│   │   │       └── view-show.cfm
│   │   ├── package.json
│   │   ├── snippets/
│   │   │   ├── wheels-api.json
│   │   │   └── wheels.code-snippets
│   │   └── src/
│   │       └── extension.js
│   └── workspace/
│       └── .keep
├── web/
│   ├── .prettierignore
│   ├── .prettierrc.json
│   ├── README.md
│   ├── content/
│   │   └── blog/
│   │       └── posts/
│   │           ├── 0-8-2-released.md
│   │           ├── 0-8-3-final-beta-release.md
│   │           ├── 0-9-1-available.md
│   │           ├── 0-9-2-release.md
│   │           ├── 0-9-final-beta-cycle.md
│   │           ├── 1-0-1-maintenance-release.md
│   │           ├── 1-0-2-maintenance-release.md
│   │           ├── 1-0-we-are-production-ready.md
│   │           ├── 1-1-1-released.md
│   │           ├── 1-1-4-released.md
│   │           ├── 1-1-6-released.md
│   │           ├── 1-1-8-released.md
│   │           ├── 1-1-beta-1-available.md
│   │           ├── 1-3-0-released.md
│   │           ├── 1-3-1-maintenance-release.md
│   │           ├── 1-3-2-maintenance-release.md
│   │           ├── 1-3-3-maintenance-release.md
│   │           ├── 10-years-of-cfwheels-welcome-adam-cfwheels-2-x.md
│   │           ├── andy-bellenie-joins-core-team.md
│   │           ├── andy-bellenie-to-speak-at-scotch-on-the-rocks-2013.md
│   │           ├── another-great-cf-objective-is-over-wheels.md
│   │           ├── apologies-duplicate-entries-rss.md
│   │           ├── associations-chapter-in-documentation.md
│   │           ├── background-jobs-without-redis.md
│   │           ├── behind-the-scenes-how-a-single-commit-becomes-a-running-application-across-40-configurations.md
│   │           ├── building-search-forms-with-tableless-models-in-cfwheels.md
│   │           ├── calling-all-plugin-authors-time-for-2-x-.md
│   │           ├── celebrating-20-years-of-cfwheels-a-look-back-and-a-step-forward-as-wheels-dev.md
│   │           ├── cf-objective-2011.md
│   │           ├── cf-objective-finale.md
│   │           ├── cf-objective-starts-and-free-t-shirts.md
│   │           ├── cfmeetup-intro-wheels-orm.md
│   │           ├── cfmeetup-presentation-thursday.md
│   │           ├── cfunited-2010-on-wheels.md
│   │           ├── cfwheels-1-4-0-released-new-documentation-too.md
│   │           ├── cfwheels-1-4-1-maintenance-release.md
│   │           ├── cfwheels-1-4-2-maintenance-release.md
│   │           ├── cfwheels-1-4-3-maintenance-release.md
│   │           ├── cfwheels-1-4-4-maintenance-release.md
│   │           ├── cfwheels-1-4-5-maintenance-release.md
│   │           ├── cfwheels-1-4-6-maintenance-release.md
│   │           ├── cfwheels-2-0-0-beta-1-now-available.md
│   │           ├── cfwheels-2-0-1-maintenance-release.md
│   │           ├── cfwheels-2-0-2-security-release.md
│   │           ├── cfwheels-2-0-released.md
│   │           ├── cfwheels-2-1-0-beta-now-available.md
│   │           ├── cfwheels-2-1-released.md
│   │           ├── cfwheels-2-2-released.md
│   │           ├── cfwheels-2-3-0-rc-1.md
│   │           ├── cfwheels-2-3-0-released.md
│   │           ├── cfwheels-added-to-the-htmx-server-side-examples-page.md
│   │           ├── cfwheels-announces-a-bug-bounty.md
│   │           ├── cfwheels-dotenvsettings-plugin-published.md
│   │           ├── cfwheels-fully-embraces-forgebox-packages.md
│   │           ├── cfwheels-guides-moved-to-gitbook.md
│   │           ├── cfwheels-has-moved-to-github-discussions.md
│   │           ├── cfwheels-htmx-plugin-published.md
│   │           ├── cfwheels-joins-open-source-collective.md
│   │           ├── cfwheels-on-cf-alive-the-sequel.md
│   │           ├── cfwheels-on-cf-alive.md
│   │           ├── cfwheels-v2-4-0-released.md
│   │           ├── cfwheels-v2-5-0-released.md
│   │           ├── cfwheels-x-dresshead-short-sleeved-dress-contrasting-wrap-details-irregular-hemline.md
│   │           ├── changing-of-the-guards-at-cfwheels.md
│   │           ├── cleaner-configuration-in-wheels-3-0-less-magic-more-clarity.md
│   │           ├── come-get-your-fresh-0-7-release.md
│   │           ├── congratulate-tony-petruzzi-lead-developer.md
│   │           ├── contributing-to-wheels.md
│   │           ├── core-team-updates.md
│   │           ├── couple-blog-series.md
│   │           ├── creating-a-basic-crud-interface-with-wheels-3-0.md
│   │           ├── creating-a-mega-quick-json-api-in-cfwheels-2-x.md
│   │           ├── creating-custom-urls-with-routes.md
│   │           ├── debugging-plugin-performance-in-cfwheels-2-x-with-fusionreactor.md
│   │           ├── documentation-updates-pages-sending-email-configurations.md
│   │           ├── download-0-9-3.md
│   │           ├── from-wirebox-to-wheelsdi.md
│   │           ├── getting-started-video-tutorial.md
│   │           ├── getting-the-example-app-up-and-running.md
│   │           ├── hello-database-tutorial.md
│   │           ├── help-us-test-the-coldfusion-on-wheels-1-1-4-release-candidate.md
│   │           ├── how-oo-almost-destroyed-business.md
│   │           ├── internal-documentation-in-cfwheels-2-0-beta.md
│   │           ├── introducing-wheels-3-0-a-new-era-for-cfml-development.md
│   │           ├── litepost-contest-ends-feb-19.md
│   │           ├── litepost-contest-screencasts.md
│   │           ├── litepost-contest-winners.md
│   │           ├── litepost-contest.md
│   │           ├── lucli-zero-docker-developer-experience.md
│   │           ├── methods-tracking-change.md
│   │           ├── moving-to-github.md
│   │           ├── moving-towards-2-x-beta.md
│   │           ├── multi-tenancy-built-in.md
│   │           ├── new-chapter-object-validation.md
│   │           ├── new-documentation-sending-files.md
│   │           ├── new-documentation-using-layouts-chapter-new-tutorials.md
│   │           ├── new-tutorial-wheels-ajax-and-you.md
│   │           ├── presentation-mdcfug-tonight.md
│   │           ├── release-candidate-1-0-rc1.md
│   │           ├── release-candidate-1-1-rc-1.md
│   │           ├── released-1-0-4.md
│   │           ├── released-1-0-5.md
│   │           ├── released-coldfusion-on-wheels-1-0-3.md
│   │           ├── released-today-0-9-4.md
│   │           ├── released-version-0-8.md
│   │           ├── released-version-1-1-3.md
│   │           ├── request-lifecycle-in-wheels-3-0-clearer-execution-order.md
│   │           ├── screencast-basic-crud-interface-in-cfwheels-2-x.md
│   │           ├── screencast-introduction-to-unit-testing-in-cfwheels-2-x.md
│   │           ├── screencast-routing-in-cfwheels-2-x-part-2.md
│   │           ├── screencast-routing-in-cfwheels-2-x.md
│   │           ├── screencasts-are-back.md
│   │           ├── security-fixes-for-1-1-7-and-1-0-6-released.md
│   │           ├── security-hardening-in-wheels-4.md
│   │           ├── skip-the-plugin-rate-limited-api.md
│   │           ├── starting-2nd-beta-1-1.md
│   │           ├── starting-a-new-cfwheels-project-with-the-cli.md
│   │           ├── submit-feedback-uservoice.md
│   │           ├── testing-in-wheels-4.md
│   │           ├── testing-plugins-on-cfwheels-2-x-and-travis-ci-via-commandbox.md
│   │           ├── the-cfwheels-channel-on-cfml-slack-has-been-archived.md
│   │           ├── todomvc-implementation-with-cfwheels-and-htmx.md
│   │           ├── tshirt-hosting-giveaways-cfunited.md
│   │           ├── two-new-repositories-published.md
│   │           ├── unit-testing-your-new-2-x-app-in-2-x-beta.md
│   │           ├── upcoming-previous-presentations.md
│   │           ├── upgrade-to-0-8-1.md
│   │           ├── upgrade-to-1-1-5-today.md
│   │           ├── upgrading-from-wheels-3x.md
│   │           ├── version-1-1-2-released-today.md
│   │           ├── version-1-1-is-here.md
│   │           ├── way-new-collaboration.md
│   │           ├── weekend-reading-new-documentation.md
│   │           ├── welcome-don-humphreys-core-team.md
│   │           ├── welcome-james-gibson-core-team.md
│   │           ├── wheels-3-0-project-structure-what-changed-and-why-it-matters.md
│   │           ├── wheels-3-0-request-handling-the-move-to-public-index-cfm.md
│   │           ├── wheels-3-0-setting-up-your-development-environment.md
│   │           ├── wheels-4-closing-the-maturity-gap.md
│   │           ├── wheels-added-cfml-framework-generator-eclipse.md
│   │           ├── wheels-api-documentation-available.md
│   │           ├── wheels-blog-badges-wallpaper-t-shirts.md
│   │           ├── wheels-cli-asset-commands-precompile-clean-clobber.md
│   │           ├── wheels-cli-config-commands-check-diff-dump.md
│   │           ├── wheels-cli-database-commands-db-create-db-drop.md
│   │           ├── wheels-cli-environment-commands-set-show-merge-switch-validate.md
│   │           ├── wheels-cli-essentials-inspect-your-app-with-about-get-commands.md
│   │           ├── wheels-cli-matures-to-version-1-0.md
│   │           ├── wheels-cli-modern-commands-for-faster-smarter-wheels-3-0-development.md
│   │           ├── wheels-cli-plugin-commands-search-install-remove-init.md
│   │           ├── wheels-cli-testing-commands-run-all-unit-integration-watch-coverage.md
│   │           ├── wheels-cli-the-hidden-productivity-booster-for-wheels-developers.md
│   │           ├── wheels-deploy-kamal-port.md
│   │           ├── wheels-dev-goes-public-a-production-wheels-3-0-application-you-can-actually-study.md
│   │           ├── wheels-hanging-with-big-boys.md
│   │           ├── wheels-round-up-2009-12-11.md
│   │           ├── wheels-screencasts-continue.md
│   │           ├── wheels-vs-code-extension-supercharge-your-wheels-development.md
│   │           └── why-we-rebuilt-our-ci-pipeline.md
│   ├── package.json
│   ├── packages/
│   │   └── ui/
│   │       ├── package.json
│   │       ├── src/
│   │       │   ├── components/
│   │       │   │   ├── Footer.astro
│   │       │   │   ├── Header.astro
│   │       │   │   ├── Logo.astro
│   │       │   │   ├── RssPill.astro
│   │       │   │   └── starlight/
│   │       │   │       ├── EditLink.astro
│   │       │   │       ├── Footer.astro
│   │       │   │       ├── Header.astro
│   │       │   │       ├── PageTitle.astro
│   │       │   │       ├── SocialIcons.astro
│   │       │   │       └── VersionSwitcher.astro
│   │       │   ├── data/
│   │       │   │   └── versions.ts
│   │       │   └── styles/
│   │       │       ├── base.css
│   │       │       ├── starlight-theme.css
│   │       │       └── tokens.css
│   │       └── tsconfig.json
│   ├── pnpm-workspace.yaml
│   ├── scripts/
│   │   ├── README.md
│   │   ├── generate-api-docs.mjs
│   │   ├── recover-blog-images.mjs
│   │   └── visual-regression.mjs
│   ├── sites/
│   │   ├── api/
│   │   │   ├── astro.config.mjs
│   │   │   ├── package.json
│   │   │   ├── src/
│   │   │   │   ├── components/
│   │   │   │   │   └── FunctionSignature.astro
│   │   │   │   ├── content/
│   │   │   │   │   └── docs/
│   │   │   │   │       ├── index.md
│   │   │   │   │       ├── v1-4-5/
│   │   │   │   │       │   ├── index.md
│   │   │   │   │       │   └── miscellaneous/
│   │   │   │   │       │       ├── accessibleproperties.md
│   │   │   │   │       │       ├── adddefaultroutes.md
│   │   │   │   │       │       ├── adderror.md
│   │   │   │   │       │       ├── adderrortobase.md
│   │   │   │   │       │       ├── addformat.md
│   │   │   │   │       │       ├── addroute.md
│   │   │   │   │       │       ├── aftercreate.md
│   │   │   │   │       │       ├── afterdelete.md
│   │   │   │   │       │       ├── afterfind.md
│   │   │   │   │       │       ├── afterinitialization.md
│   │   │   │   │       │       ├── afternew.md
│   │   │   │   │       │       ├── aftersave.md
│   │   │   │   │       │       ├── afterupdate.md
│   │   │   │   │       │       ├── aftervalidation.md
│   │   │   │   │       │       ├── aftervalidationoncreate.md
│   │   │   │   │       │       ├── aftervalidationonupdate.md
│   │   │   │   │       │       ├── allchanges.md
│   │   │   │   │       │       ├── allerrors.md
│   │   │   │   │       │       ├── autolink.md
│   │   │   │   │       │       ├── automaticvalidations.md
│   │   │   │   │       │       ├── average.md
│   │   │   │   │       │       ├── beforecreate.md
│   │   │   │   │       │       ├── beforedelete.md
│   │   │   │   │       │       ├── beforesave.md
│   │   │   │   │       │       ├── beforeupdate.md
│   │   │   │   │       │       ├── beforevalidation.md
│   │   │   │   │       │       ├── beforevalidationoncreate.md
│   │   │   │   │       │       ├── beforevalidationonupdate.md
│   │   │   │   │       │       ├── belongsto.md
│   │   │   │   │       │       ├── buttontag.md
│   │   │   │   │       │       ├── buttonto.md
│   │   │   │   │       │       ├── caches.md
│   │   │   │   │       │       ├── capitalize.md
│   │   │   │   │       │       ├── changedfrom.md
│   │   │   │   │       │       ├── changedproperties.md
│   │   │   │   │       │       ├── checkbox.md
│   │   │   │   │       │       ├── checkboxtag.md
│   │   │   │   │       │       ├── clearchangeinformation.md
│   │   │   │   │       │       ├── clearerrors.md
│   │   │   │   │       │       ├── columndataforproperty.md
│   │   │   │   │       │       ├── columnforproperty.md
│   │   │   │   │       │       ├── columnnames.md
│   │   │   │   │       │       ├── columns.md
│   │   │   │   │       │       ├── compareto.md
│   │   │   │   │       │       ├── contentfor.md
│   │   │   │   │       │       ├── contentforlayout.md
│   │   │   │   │       │       ├── controller.md
│   │   │   │   │       │       ├── count.md
│   │   │   │   │       │       ├── create.md
│   │   │   │   │       │       ├── cycle.md
│   │   │   │   │       │       ├── datasource.md
│   │   │   │   │       │       ├── dateselect.md
│   │   │   │   │       │       ├── dateselecttags.md
│   │   │   │   │       │       ├── datetimeselect.md
│   │   │   │   │       │       ├── datetimeselecttags.md
│   │   │   │   │       │       ├── dayselecttag.md
│   │   │   │   │       │       ├── delete.md
│   │   │   │   │       │       ├── deleteall.md
│   │   │   │   │       │       ├── deletebykey.md
│   │   │   │   │       │       ├── deleteone.md
│   │   │   │   │       │       ├── deobfuscateparam.md
│   │   │   │   │       │       ├── distanceoftimeinwords.md
│   │   │   │   │       │       ├── endformtag.md
│   │   │   │   │       │       ├── errorcount.md
│   │   │   │   │       │       ├── errormessageon.md
│   │   │   │   │       │       ├── errormessagesfor.md
│   │   │   │   │       │       ├── errorson.md
│   │   │   │   │       │       ├── errorsonbase.md
│   │   │   │   │       │       ├── excerpt.md
│   │   │   │   │       │       ├── exists.md
│   │   │   │   │       │       ├── filefield.md
│   │   │   │   │       │       ├── filefieldtag.md
│   │   │   │   │       │       ├── filterchain.md
│   │   │   │   │       │       ├── filters.md
│   │   │   │   │       │       ├── findall.md
│   │   │   │   │       │       ├── findallkeys.md
│   │   │   │   │       │       ├── findbykey.md
│   │   │   │   │       │       ├── findfirst.md
│   │   │   │   │       │       ├── findlast.md
│   │   │   │   │       │       ├── findone.md
│   │   │   │   │       │       ├── findorcreateby-property.md
│   │   │   │   │       │       ├── flash.md
│   │   │   │   │       │       ├── flashclear.md
│   │   │   │   │       │       ├── flashcount.md
│   │   │   │   │       │       ├── flashdelete.md
│   │   │   │   │       │       ├── flashinsert.md
│   │   │   │   │       │       ├── flashisempty.md
│   │   │   │   │       │       ├── flashkeep.md
│   │   │   │   │       │       ├── flashkeyexists.md
│   │   │   │   │       │       ├── flashmessages.md
│   │   │   │   │       │       ├── get.md
│   │   │   │   │       │       ├── gettablenameprefix.md
│   │   │   │   │       │       ├── haschanged.md
│   │   │   │   │       │       ├── haserrors.md
│   │   │   │   │       │       ├── hasmany.md
│   │   │   │   │       │       ├── hasmanycheckbox.md
│   │   │   │   │       │       ├── hasmanyradiobutton.md
│   │   │   │   │       │       ├── hasone.md
│   │   │   │   │       │       ├── hasproperty.md
│   │   │   │   │       │       ├── hiddenfield.md
│   │   │   │   │       │       ├── hiddenfieldtag.md
│   │   │   │   │       │       ├── highlight.md
│   │   │   │   │       │       ├── hourselecttag.md
│   │   │   │   │       │       ├── humanize.md
│   │   │   │   │       │       ├── hyphenize.md
│   │   │   │   │       │       ├── imagetag.md
│   │   │   │   │       │       ├── includecontent.md
│   │   │   │   │       │       ├── includedinobject.md
│   │   │   │   │       │       ├── includelayout.md
│   │   │   │   │       │       ├── includepartial.md
│   │   │   │   │       │       ├── index.md
│   │   │   │   │       │       ├── invokewithtransaction.md
│   │   │   │   │       │       ├── isajax.md
│   │   │   │   │       │       ├── isclass.md
│   │   │   │   │       │       ├── isget.md
│   │   │   │   │       │       ├── isinstance.md
│   │   │   │   │       │       ├── isnew.md
│   │   │   │   │       │       ├── ispost.md
│   │   │   │   │       │       ├── issecure.md
│   │   │   │   │       │       ├── javascriptincludetag.md
│   │   │   │   │       │       ├── key.md
│   │   │   │   │       │       ├── linkto.md
│   │   │   │   │       │       ├── mailto.md
│   │   │   │   │       │       ├── maximum.md
│   │   │   │   │       │       ├── mimetypes.md
│   │   │   │   │       │       ├── minimum.md
│   │   │   │   │       │       ├── minuteselecttag.md
│   │   │   │   │       │       ├── model.md
│   │   │   │   │       │       ├── monthselecttag.md
│   │   │   │   │       │       ├── nestedproperties.md
│   │   │   │   │       │       ├── new.md
│   │   │   │   │       │       ├── obfuscateparam.md
│   │   │   │   │       │       ├── onlyprovides.md
│   │   │   │   │       │       ├── pagination.md
│   │   │   │   │       │       ├── paginationlinks.md
│   │   │   │   │       │       ├── passwordfield.md
│   │   │   │   │       │       ├── passwordfieldtag.md
│   │   │   │   │       │       ├── pluginnames.md
│   │   │   │   │       │       ├── pluralize.md
│   │   │   │   │       │       ├── primarykey.md
│   │   │   │   │       │       ├── primarykeys.md
│   │   │   │   │       │       ├── properties.md
│   │   │   │   │       │       ├── property.md
│   │   │   │   │       │       ├── propertyispresent.md
│   │   │   │   │       │       ├── propertynames.md
│   │   │   │   │       │       ├── protectedproperties.md
│   │   │   │   │       │       ├── provides.md
│   │   │   │   │       │       ├── radiobutton.md
│   │   │   │   │       │       ├── radiobuttontag.md
│   │   │   │   │       │       ├── redirectto.md
│   │   │   │   │       │       ├── reload.md
│   │   │   │   │       │       ├── rendernothing.md
│   │   │   │   │       │       ├── renderpage.md
│   │   │   │   │       │       ├── renderpartial.md
│   │   │   │   │       │       ├── rendertext.md
│   │   │   │   │       │       ├── renderwith.md
│   │   │   │   │       │       ├── resetcycle.md
│   │   │   │   │       │       ├── response.md
│   │   │   │   │       │       ├── save.md
│   │   │   │   │       │       ├── secondselecttag.md
│   │   │   │   │       │       ├── select.md
│   │   │   │   │       │       ├── selecttag.md
│   │   │   │   │       │       ├── sendemail.md
│   │   │   │   │       │       ├── sendfile.md
│   │   │   │   │       │       ├── set.md
│   │   │   │   │       │       ├── setfilterchain.md
│   │   │   │   │       │       ├── setpagination.md
│   │   │   │   │       │       ├── setprimarykey.md
│   │   │   │   │       │       ├── setprimarykeys.md
│   │   │   │   │       │       ├── setproperties.md
│   │   │   │   │       │       ├── setresponse.md
│   │   │   │   │       │       ├── settablenameprefix.md
│   │   │   │   │       │       ├── setverificationchain.md
│   │   │   │   │       │       ├── simpleformat.md
│   │   │   │   │       │       ├── singularize.md
│   │   │   │   │       │       ├── startformtag.md
│   │   │   │   │       │       ├── striplinks.md
│   │   │   │   │       │       ├── striptags.md
│   │   │   │   │       │       ├── stylesheetlinktag.md
│   │   │   │   │       │       ├── submittag.md
│   │   │   │   │       │       ├── sum.md
│   │   │   │   │       │       ├── table.md
│   │   │   │   │       │       ├── tablename.md
│   │   │   │   │       │       ├── textarea.md
│   │   │   │   │       │       ├── textareatag.md
│   │   │   │   │       │       ├── textfield.md
│   │   │   │   │       │       ├── textfieldtag.md
│   │   │   │   │       │       ├── timeagoinwords.md
│   │   │   │   │       │       ├── timeselect.md
│   │   │   │   │       │       ├── timeselecttags.md
│   │   │   │   │       │       ├── timeuntilinwords.md
│   │   │   │   │       │       ├── titleize.md
│   │   │   │   │       │       ├── toggle.md
│   │   │   │   │       │       ├── toxhtml.md
│   │   │   │   │       │       ├── truncate.md
│   │   │   │   │       │       ├── update.md
│   │   │   │   │       │       ├── updateall.md
│   │   │   │   │       │       ├── updatebykey.md
│   │   │   │   │       │       ├── updateone.md
│   │   │   │   │       │       ├── updateproperties.md
│   │   │   │   │       │       ├── updateproperty.md
│   │   │   │   │       │       ├── urlfor.md
│   │   │   │   │       │       ├── useslayout.md
│   │   │   │   │       │       ├── valid.md
│   │   │   │   │       │       ├── validate.md
│   │   │   │   │       │       ├── validateoncreate.md
│   │   │   │   │       │       ├── validateonupdate.md
│   │   │   │   │       │       ├── validatesconfirmationof.md
│   │   │   │   │       │       ├── validatesexclusionof.md
│   │   │   │   │       │       ├── validatesformatof.md
│   │   │   │   │       │       ├── validatesinclusionof.md
│   │   │   │   │       │       ├── validateslengthof.md
│   │   │   │   │       │       ├── validatesnumericalityof.md
│   │   │   │   │       │       ├── validatespresenceof.md
│   │   │   │   │       │       ├── validatesuniquenessof.md
│   │   │   │   │       │       ├── validationtypeforproperty.md
│   │   │   │   │       │       ├── verificationchain.md
│   │   │   │   │       │       ├── verifies.md
│   │   │   │   │       │       ├── wordtruncate.md
│   │   │   │   │       │       └── yearselecttag.md
│   │   │   │   │       ├── v2-0-0/
│   │   │   │   │       │   ├── configuration/
│   │   │   │   │       │   │   ├── addformat.md
│   │   │   │   │       │   │   ├── collection.md
│   │   │   │   │       │   │   ├── constraints.md
│   │   │   │   │       │   │   ├── controller.md
│   │   │   │   │       │   │   ├── createmigration.md
│   │   │   │   │       │   │   ├── delete.md
│   │   │   │   │       │   │   ├── end.md
│   │   │   │   │       │   │   ├── get.md
│   │   │   │   │       │   │   ├── getavailablemigrations.md
│   │   │   │   │       │   │   ├── getcurrentmigrationversion.md
│   │   │   │   │       │   │   ├── index.md
│   │   │   │   │       │   │   ├── mapper.md
│   │   │   │   │       │   │   ├── member.md
│   │   │   │   │       │   │   ├── migrateto.md
│   │   │   │   │       │   │   ├── migratetolatest.md
│   │   │   │   │       │   │   ├── namespace.md
│   │   │   │   │       │   │   ├── package.md
│   │   │   │   │       │   │   ├── patch.md
│   │   │   │   │       │   │   ├── post.md
│   │   │   │   │       │   │   ├── put.md
│   │   │   │   │       │   │   ├── redomigration.md
│   │   │   │   │       │   │   ├── resource.md
│   │   │   │   │       │   │   ├── resources.md
│   │   │   │   │       │   │   ├── root.md
│   │   │   │   │       │   │   ├── scope.md
│   │   │   │   │       │   │   ├── set.md
│   │   │   │   │       │   │   └── wildcard.md
│   │   │   │   │       │   ├── controller/
│   │   │   │   │       │   │   ├── caches.md
│   │   │   │   │       │   │   ├── filterchain.md
│   │   │   │   │       │   │   ├── filters.md
│   │   │   │   │       │   │   ├── flash.md
│   │   │   │   │       │   │   ├── flashclear.md
│   │   │   │   │       │   │   ├── flashcount.md
│   │   │   │   │       │   │   ├── flashdelete.md
│   │   │   │   │       │   │   ├── flashinsert.md
│   │   │   │   │       │   │   ├── flashisempty.md
│   │   │   │   │       │   │   ├── flashkeep.md
│   │   │   │   │       │   │   ├── flashkeyexists.md
│   │   │   │   │       │   │   ├── getemails.md
│   │   │   │   │       │   │   ├── getfiles.md
│   │   │   │   │       │   │   ├── getredirect.md
│   │   │   │   │       │   │   ├── index.md
│   │   │   │   │       │   │   ├── isajax.md
│   │   │   │   │       │   │   ├── isdelete.md
│   │   │   │   │       │   │   ├── isget.md
│   │   │   │   │       │   │   ├── ishead.md
│   │   │   │   │       │   │   ├── isoptions.md
│   │   │   │   │       │   │   ├── ispatch.md
│   │   │   │   │       │   │   ├── ispost.md
│   │   │   │   │       │   │   ├── isput.md
│   │   │   │   │       │   │   ├── issecure.md
│   │   │   │   │       │   │   ├── onlyprovides.md
│   │   │   │   │       │   │   ├── pagination.md
│   │   │   │   │       │   │   ├── processaction.md
│   │   │   │   │       │   │   ├── processrequest.md
│   │   │   │   │       │   │   ├── protectsfromforgery.md
│   │   │   │   │       │   │   ├── provides.md
│   │   │   │   │       │   │   ├── redirectto.md
│   │   │   │   │       │   │   ├── rendernothing.md
│   │   │   │   │       │   │   ├── renderpartial.md
│   │   │   │   │       │   │   ├── rendertext.md
│   │   │   │   │       │   │   ├── renderview.md
│   │   │   │   │       │   │   ├── renderwith.md
│   │   │   │   │       │   │   ├── response.md
│   │   │   │   │       │   │   ├── sendemail.md
│   │   │   │   │       │   │   ├── sendfile.md
│   │   │   │   │       │   │   ├── setfilterchain.md
│   │   │   │   │       │   │   ├── setpagination.md
│   │   │   │   │       │   │   ├── setresponse.md
│   │   │   │   │       │   │   ├── setverificationchain.md
│   │   │   │   │       │   │   ├── useslayout.md
│   │   │   │   │       │   │   ├── verificationchain.md
│   │   │   │   │       │   │   └── verifies.md
│   │   │   │   │       │   ├── global-helpers/
│   │   │   │   │       │   │   ├── capitalize.md
│   │   │   │   │       │   │   ├── controller.md
│   │   │   │   │       │   │   ├── deobfuscateparam.md
│   │   │   │   │       │   │   ├── distanceoftimeinwords.md
│   │   │   │   │       │   │   ├── excerpt.md
│   │   │   │   │       │   │   ├── humanize.md
│   │   │   │   │       │   │   ├── hyphenize.md
│   │   │   │   │       │   │   ├── index.md
│   │   │   │   │       │   │   ├── mimetypes.md
│   │   │   │   │       │   │   ├── model.md
│   │   │   │   │       │   │   ├── obfuscateparam.md
│   │   │   │   │       │   │   ├── pluginnames.md
│   │   │   │   │       │   │   ├── pluralize.md
│   │   │   │   │       │   │   ├── singularize.md
│   │   │   │   │       │   │   ├── timeagoinwords.md
│   │   │   │   │       │   │   ├── timeuntilinwords.md
│   │   │   │   │       │   │   ├── titleize.md
│   │   │   │   │       │   │   ├── truncate.md
│   │   │   │   │       │   │   ├── urlfor.md
│   │   │   │   │       │   │   └── wordtruncate.md
│   │   │   │   │       │   ├── index.md
│   │   │   │   │       │   ├── model-class/
│   │   │   │   │       │   │   ├── average.md
│   │   │   │   │       │   │   ├── columndataforproperty.md
│   │   │   │   │       │   │   ├── columnforproperty.md
│   │   │   │   │       │   │   ├── columnnames.md
│   │   │   │   │       │   │   ├── columns.md
│   │   │   │   │       │   │   ├── count.md
│   │   │   │   │       │   │   ├── create.md
│   │   │   │   │       │   │   ├── deleteall.md
│   │   │   │   │       │   │   ├── deletebykey.md
│   │   │   │   │       │   │   ├── deleteone.md
│   │   │   │   │       │   │   ├── exists.md
│   │   │   │   │       │   │   ├── findall.md
│   │   │   │   │       │   │   ├── findallkeys.md
│   │   │   │   │       │   │   ├── findbykey.md
│   │   │   │   │       │   │   ├── findfirst.md
│   │   │   │   │       │   │   ├── findlast.md
│   │   │   │   │       │   │   ├── findone.md
│   │   │   │   │       │   │   ├── gettablenameprefix.md
│   │   │   │   │       │   │   ├── index.md
│   │   │   │   │       │   │   ├── invokewithtransaction.md
│   │   │   │   │       │   │   ├── isclass.md
│   │   │   │   │       │   │   ├── isinstance.md
│   │   │   │   │       │   │   ├── maximum.md
│   │   │   │   │       │   │   ├── minimum.md
│   │   │   │   │       │   │   ├── new.md
│   │   │   │   │       │   │   ├── onmissingmethod.md
│   │   │   │   │       │   │   ├── primarykey.md
│   │   │   │   │       │   │   ├── primarykeys.md
│   │   │   │   │       │   │   ├── propertynames.md
│   │   │   │   │       │   │   ├── save.md
│   │   │   │   │       │   │   ├── sum.md
│   │   │   │   │       │   │   ├── tablename.md
│   │   │   │   │       │   │   ├── updateall.md
│   │   │   │   │       │   │   ├── updatebykey.md
│   │   │   │   │       │   │   ├── updateone.md
│   │   │   │   │       │   │   └── validationtypeforproperty.md
│   │   │   │   │       │   ├── model-configuration/
│   │   │   │   │       │   │   ├── accessibleproperties.md
│   │   │   │   │       │   │   ├── aftercreate.md
│   │   │   │   │       │   │   ├── afterdelete.md
│   │   │   │   │       │   │   ├── afterfind.md
│   │   │   │   │       │   │   ├── afterinitialization.md
│   │   │   │   │       │   │   ├── afternew.md
│   │   │   │   │       │   │   ├── aftersave.md
│   │   │   │   │       │   │   ├── afterupdate.md
│   │   │   │   │       │   │   ├── aftervalidation.md
│   │   │   │   │       │   │   ├── aftervalidationoncreate.md
│   │   │   │   │       │   │   ├── aftervalidationonupdate.md
│   │   │   │   │       │   │   ├── automaticvalidations.md
│   │   │   │   │       │   │   ├── beforecreate.md
│   │   │   │   │       │   │   ├── beforedelete.md
│   │   │   │   │       │   │   ├── beforesave.md
│   │   │   │   │       │   │   ├── beforeupdate.md
│   │   │   │   │       │   │   ├── beforevalidation.md
│   │   │   │   │       │   │   ├── beforevalidationoncreate.md
│   │   │   │   │       │   │   ├── beforevalidationonupdate.md
│   │   │   │   │       │   │   ├── belongsto.md
│   │   │   │   │       │   │   ├── datasource.md
│   │   │   │   │       │   │   ├── hasmany.md
│   │   │   │   │       │   │   ├── hasone.md
│   │   │   │   │       │   │   ├── index.md
│   │   │   │   │       │   │   ├── nestedproperties.md
│   │   │   │   │       │   │   ├── property.md
│   │   │   │   │       │   │   ├── protectedproperties.md
│   │   │   │   │       │   │   ├── setprimarykey.md
│   │   │   │   │       │   │   ├── setprimarykeys.md
│   │   │   │   │       │   │   ├── settablenameprefix.md
│   │   │   │   │       │   │   ├── table.md
│   │   │   │   │       │   │   ├── validate.md
│   │   │   │   │       │   │   ├── validateoncreate.md
│   │   │   │   │       │   │   ├── validateonupdate.md
│   │   │   │   │       │   │   ├── validatesconfirmationof.md
│   │   │   │   │       │   │   ├── validatesexclusionof.md
│   │   │   │   │       │   │   ├── validatesformatof.md
│   │   │   │   │       │   │   ├── validatesinclusionof.md
│   │   │   │   │       │   │   ├── validateslengthof.md
│   │   │   │   │       │   │   ├── validatesnumericalityof.md
│   │   │   │   │       │   │   ├── validatespresenceof.md
│   │   │   │   │       │   │   └── validatesuniquenessof.md
│   │   │   │   │       │   ├── model-object/
│   │   │   │   │       │   │   ├── adderror.md
│   │   │   │   │       │   │   ├── adderrortobase.md
│   │   │   │   │       │   │   ├── allchanges.md
│   │   │   │   │       │   │   ├── allerrors.md
│   │   │   │   │       │   │   ├── changedfrom.md
│   │   │   │   │       │   │   ├── changedproperties.md
│   │   │   │   │       │   │   ├── clearchangeinformation.md
│   │   │   │   │       │   │   ├── clearerrors.md
│   │   │   │   │       │   │   ├── compareto.md
│   │   │   │   │       │   │   ├── delete.md
│   │   │   │   │       │   │   ├── errorcount.md
│   │   │   │   │       │   │   ├── errorson.md
│   │   │   │   │       │   │   ├── errorsonbase.md
│   │   │   │   │       │   │   ├── haschanged.md
│   │   │   │   │       │   │   ├── haserrors.md
│   │   │   │   │       │   │   ├── hasproperty.md
│   │   │   │   │       │   │   ├── index.md
│   │   │   │   │       │   │   ├── isnew.md
│   │   │   │   │       │   │   ├── ispersisted.md
│   │   │   │   │       │   │   ├── key.md
│   │   │   │   │       │   │   ├── properties.md
│   │   │   │   │       │   │   ├── propertyisblank.md
│   │   │   │   │       │   │   ├── propertyispresent.md
│   │   │   │   │       │   │   ├── reload.md
│   │   │   │   │       │   │   ├── setproperties.md
│   │   │   │   │       │   │   ├── toggle.md
│   │   │   │   │       │   │   ├── update.md
│   │   │   │   │       │   │   ├── updateproperty.md
│   │   │   │   │       │   │   └── valid.md
│   │   │   │   │       │   └── view-helpers/
│   │   │   │   │       │       ├── authenticitytokenfield.md
│   │   │   │   │       │       ├── autolink.md
│   │   │   │   │       │       ├── buttontag.md
│   │   │   │   │       │       ├── buttonto.md
│   │   │   │   │       │       ├── checkbox.md
│   │   │   │   │       │       ├── checkboxtag.md
│   │   │   │   │       │       ├── contentfor.md
│   │   │   │   │       │       ├── contentforlayout.md
│   │   │   │   │       │       ├── csrfmetatags.md
│   │   │   │   │       │       ├── cycle.md
│   │   │   │   │       │       ├── dateselect.md
│   │   │   │   │       │       ├── dateselecttags.md
│   │   │   │   │       │       ├── datetimeselect.md
│   │   │   │   │       │       ├── datetimeselecttags.md
│   │   │   │   │       │       ├── dayselecttag.md
│   │   │   │   │       │       ├── endformtag.md
│   │   │   │   │       │       ├── errormessageon.md
│   │   │   │   │       │       ├── errormessagesfor.md
│   │   │   │   │       │       ├── filefield.md
│   │   │   │   │       │       ├── filefieldtag.md
│   │   │   │   │       │       ├── flashmessages.md
│   │   │   │   │       │       ├── hasmanycheckbox.md
│   │   │   │   │       │       ├── hasmanyradiobutton.md
│   │   │   │   │       │       ├── hiddenfield.md
│   │   │   │   │       │       ├── hiddenfieldtag.md
│   │   │   │   │       │       ├── highlight.md
│   │   │   │   │       │       ├── hourselecttag.md
│   │   │   │   │       │       ├── imagetag.md
│   │   │   │   │       │       ├── includecontent.md
│   │   │   │   │       │       ├── includedinobject.md
│   │   │   │   │       │       ├── includelayout.md
│   │   │   │   │       │       ├── includepartial.md
│   │   │   │   │       │       ├── index.md
│   │   │   │   │       │       ├── javascriptincludetag.md
│   │   │   │   │       │       ├── linkto.md
│   │   │   │   │       │       ├── mailto.md
│   │   │   │   │       │       ├── minuteselecttag.md
│   │   │   │   │       │       ├── monthselecttag.md
│   │   │   │   │       │       ├── paginationlinks.md
│   │   │   │   │       │       ├── passwordfield.md
│   │   │   │   │       │       ├── passwordfieldtag.md
│   │   │   │   │       │       ├── radiobutton.md
│   │   │   │   │       │       ├── radiobuttontag.md
│   │   │   │   │       │       ├── resetcycle.md
│   │   │   │   │       │       ├── secondselecttag.md
│   │   │   │   │       │       ├── select.md
│   │   │   │   │       │       ├── selecttag.md
│   │   │   │   │       │       ├── simpleformat.md
│   │   │   │   │       │       ├── startformtag.md
│   │   │   │   │       │       ├── striplinks.md
│   │   │   │   │       │       ├── striptags.md
│   │   │   │   │       │       ├── stylesheetlinktag.md
│   │   │   │   │       │       ├── submittag.md
│   │   │   │   │       │       ├── textarea.md
│   │   │   │   │       │       ├── textareatag.md
│   │   │   │   │       │       ├── textfield.md
│   │   │   │   │       │       ├── textfieldtag.md
│   │   │   │   │       │       ├── timeselect.md
│   │   │   │   │       │       ├── timeselecttags.md
│   │   │   │   │       │       └── yearselecttag.md
│   │   │   │   │       ├── v2-1-0/
│   │   │   │   │       │   ├── configuration/
│   │   │   │   │       │   │   ├── addformat.md
│   │   │   │   │       │   │   ├── collection.md
│   │   │   │   │       │   │   ├── constraints.md
│   │   │   │   │       │   │   ├── controller.md
│   │   │   │   │       │   │   ├── delete.md
│   │   │   │   │       │   │   ├── end.md
│   │   │   │   │       │   │   ├── get.md
│   │   │   │   │       │   │   ├── index.md
│   │   │   │   │       │   │   ├── mapper.md
│   │   │   │   │       │   │   ├── member.md
│   │   │   │   │       │   │   ├── namespace.md
│   │   │   │   │       │   │   ├── package.md
│   │   │   │   │       │   │   ├── patch.md
│   │   │   │   │       │   │   ├── post.md
│   │   │   │   │       │   │   ├── put.md
│   │   │   │   │       │   │   ├── resource.md
│   │   │   │   │       │   │   ├── resources.md
│   │   │   │   │       │   │   ├── root.md
│   │   │   │   │       │   │   ├── scope.md
│   │   │   │   │       │   │   ├── set.md
│   │   │   │   │       │   │   └── wildcard.md
│   │   │   │   │       │   ├── controller/
│   │   │   │   │       │   │   ├── authenticitytoken.md
│   │   │   │   │       │   │   ├── caches.md
│   │   │   │   │       │   │   ├── filterchain.md
│   │   │   │   │       │   │   ├── filters.md
│   │   │   │   │       │   │   ├── flash.md
│   │   │   │   │       │   │   ├── flashclear.md
│   │   │   │   │       │   │   ├── flashcount.md
│   │   │   │   │       │   │   ├── flashdelete.md
│   │   │   │   │       │   │   ├── flashinsert.md
│   │   │   │   │       │   │   ├── flashisempty.md
│   │   │   │   │       │   │   ├── flashkeep.md
│   │   │   │   │       │   │   ├── flashkeyexists.md
│   │   │   │   │       │   │   ├── getemails.md
│   │   │   │   │       │   │   ├── getfiles.md
│   │   │   │   │       │   │   ├── getredirect.md
│   │   │   │   │       │   │   ├── index.md
│   │   │   │   │       │   │   ├── isajax.md
│   │   │   │   │       │   │   ├── isdelete.md
│   │   │   │   │       │   │   ├── isget.md
│   │   │   │   │       │   │   ├── ishead.md
│   │   │   │   │       │   │   ├── isoptions.md
│   │   │   │   │       │   │   ├── ispatch.md
│   │   │   │   │       │   │   ├── ispost.md
│   │   │   │   │       │   │   ├── isput.md
│   │   │   │   │       │   │   ├── issecure.md
│   │   │   │   │       │   │   ├── onlyprovides.md
│   │   │   │   │       │   │   ├── pagination.md
│   │   │   │   │       │   │   ├── processaction.md
│   │   │   │   │       │   │   ├── processrequest.md
│   │   │   │   │       │   │   ├── protectsfromforgery.md
│   │   │   │   │       │   │   ├── provides.md
│   │   │   │   │       │   │   ├── redirectto.md
│   │   │   │   │       │   │   ├── rendernothing.md
│   │   │   │   │       │   │   ├── renderpartial.md
│   │   │   │   │       │   │   ├── rendertext.md
│   │   │   │   │       │   │   ├── renderview.md
│   │   │   │   │       │   │   ├── renderwith.md
│   │   │   │   │       │   │   ├── response.md
│   │   │   │   │       │   │   ├── sendemail.md
│   │   │   │   │       │   │   ├── sendfile.md
│   │   │   │   │       │   │   ├── setfilterchain.md
│   │   │   │   │       │   │   ├── setpagination.md
│   │   │   │   │       │   │   ├── setresponse.md
│   │   │   │   │       │   │   ├── setverificationchain.md
│   │   │   │   │       │   │   ├── useslayout.md
│   │   │   │   │       │   │   ├── verificationchain.md
│   │   │   │   │       │   │   └── verifies.md
│   │   │   │   │       │   ├── global-helpers/
│   │   │   │   │       │   │   ├── capitalize.md
│   │   │   │   │       │   │   ├── controller.md
│   │   │   │   │       │   │   ├── deobfuscateparam.md
│   │   │   │   │       │   │   ├── distanceoftimeinwords.md
│   │   │   │   │       │   │   ├── excerpt.md
│   │   │   │   │       │   │   ├── humanize.md
│   │   │   │   │       │   │   ├── hyphenize.md
│   │   │   │   │       │   │   ├── index.md
│   │   │   │   │       │   │   ├── mimetypes.md
│   │   │   │   │       │   │   ├── model.md
│   │   │   │   │       │   │   ├── obfuscateparam.md
│   │   │   │   │       │   │   ├── pluginnames.md
│   │   │   │   │       │   │   ├── pluralize.md
│   │   │   │   │       │   │   ├── singularize.md
│   │   │   │   │       │   │   ├── timeagoinwords.md
│   │   │   │   │       │   │   ├── timeuntilinwords.md
│   │   │   │   │       │   │   ├── titleize.md
│   │   │   │   │       │   │   ├── truncate.md
│   │   │   │   │       │   │   ├── urlfor.md
│   │   │   │   │       │   │   └── wordtruncate.md
│   │   │   │   │       │   ├── index.md
│   │   │   │   │       │   ├── migrator/
│   │   │   │   │       │   │   ├── addcolumn.md
│   │   │   │   │       │   │   ├── addforeignkey.md
│   │   │   │   │       │   │   ├── addindex.md
│   │   │   │   │       │   │   ├── addrecord.md
│   │   │   │   │       │   │   ├── addreference.md
│   │   │   │   │       │   │   ├── biginteger.md
│   │   │   │   │       │   │   ├── binary.md
│   │   │   │   │       │   │   ├── boolean.md
│   │   │   │   │       │   │   ├── change.md
│   │   │   │   │       │   │   ├── changecolumn.md
│   │   │   │   │       │   │   ├── changetable.md
│   │   │   │   │       │   │   ├── char.md
│   │   │   │   │       │   │   ├── column.md
│   │   │   │   │       │   │   ├── create.md
│   │   │   │   │       │   │   ├── createmigration.md
│   │   │   │   │       │   │   ├── createtable.md
│   │   │   │   │       │   │   ├── createview.md
│   │   │   │   │       │   │   ├── date.md
│   │   │   │   │       │   │   ├── datetime.md
│   │   │   │   │       │   │   ├── decimal.md
│   │   │   │   │       │   │   ├── down.md
│   │   │   │   │       │   │   ├── dropforeignkey.md
│   │   │   │   │       │   │   ├── dropreference.md
│   │   │   │   │       │   │   ├── droptable.md
│   │   │   │   │       │   │   ├── dropview.md
│   │   │   │   │       │   │   ├── execute.md
│   │   │   │   │       │   │   ├── float.md
│   │   │   │   │       │   │   ├── getavailablemigrations.md
│   │   │   │   │       │   │   ├── getcurrentmigrationversion.md
│   │   │   │   │       │   │   ├── index.md
│   │   │   │   │       │   │   ├── integer.md
│   │   │   │   │       │   │   ├── migrateto.md
│   │   │   │   │       │   │   ├── migratetolatest.md
│   │   │   │   │       │   │   ├── primarykey.md
│   │   │   │   │       │   │   ├── redomigration.md
│   │   │   │   │       │   │   ├── references.md
│   │   │   │   │       │   │   ├── removecolumn.md
│   │   │   │   │       │   │   ├── removeindex.md
│   │   │   │   │       │   │   ├── removerecord.md
│   │   │   │   │       │   │   ├── renamecolumn.md
│   │   │   │   │       │   │   ├── renametable.md
│   │   │   │   │       │   │   ├── string.md
│   │   │   │   │       │   │   ├── text.md
│   │   │   │   │       │   │   ├── time.md
│   │   │   │   │       │   │   ├── timestamp.md
│   │   │   │   │       │   │   ├── timestamps.md
│   │   │   │   │       │   │   ├── uniqueidentifier.md
│   │   │   │   │       │   │   ├── up.md
│   │   │   │   │       │   │   └── updaterecord.md
│   │   │   │   │       │   ├── miscellaneous/
│   │   │   │   │       │   │   ├── announce.md
│   │   │   │   │       │   │   └── index.md
│   │   │   │   │       │   ├── model-class/
│   │   │   │   │       │   │   ├── average.md
│   │   │   │   │       │   │   ├── columndataforproperty.md
│   │   │   │   │       │   │   ├── columnforproperty.md
│   │   │   │   │       │   │   ├── columnnames.md
│   │   │   │   │       │   │   ├── columns.md
│   │   │   │   │       │   │   ├── count.md
│   │   │   │   │       │   │   ├── create.md
│   │   │   │   │       │   │   ├── deleteall.md
│   │   │   │   │       │   │   ├── deletebykey.md
│   │   │   │   │       │   │   ├── deleteone.md
│   │   │   │   │       │   │   ├── exists.md
│   │   │   │   │       │   │   ├── findall.md
│   │   │   │   │       │   │   ├── findallkeys.md
│   │   │   │   │       │   │   ├── findbykey.md
│   │   │   │   │       │   │   ├── findfirst.md
│   │   │   │   │       │   │   ├── findlast.md
│   │   │   │   │       │   │   ├── findone.md
│   │   │   │   │       │   │   ├── gettablenameprefix.md
│   │   │   │   │       │   │   ├── index.md
│   │   │   │   │       │   │   ├── invokewithtransaction.md
│   │   │   │   │       │   │   ├── isclass.md
│   │   │   │   │       │   │   ├── isinstance.md
│   │   │   │   │       │   │   ├── maximum.md
│   │   │   │   │       │   │   ├── minimum.md
│   │   │   │   │       │   │   ├── new.md
│   │   │   │   │       │   │   ├── onmissingmethod.md
│   │   │   │   │       │   │   ├── primarykey.md
│   │   │   │   │       │   │   ├── primarykeys.md
│   │   │   │   │       │   │   ├── propertynames.md
│   │   │   │   │       │   │   ├── save.md
│   │   │   │   │       │   │   ├── sum.md
│   │   │   │   │       │   │   ├── tablename.md
│   │   │   │   │       │   │   ├── updateall.md
│   │   │   │   │       │   │   ├── updatebykey.md
│   │   │   │   │       │   │   ├── updateone.md
│   │   │   │   │       │   │   └── validationtypeforproperty.md
│   │   │   │   │       │   ├── model-configuration/
│   │   │   │   │       │   │   ├── accessibleproperties.md
│   │   │   │   │       │   │   ├── aftercreate.md
│   │   │   │   │       │   │   ├── afterdelete.md
│   │   │   │   │       │   │   ├── afterfind.md
│   │   │   │   │       │   │   ├── afterinitialization.md
│   │   │   │   │       │   │   ├── afternew.md
│   │   │   │   │       │   │   ├── aftersave.md
│   │   │   │   │       │   │   ├── afterupdate.md
│   │   │   │   │       │   │   ├── aftervalidation.md
│   │   │   │   │       │   │   ├── aftervalidationoncreate.md
│   │   │   │   │       │   │   ├── aftervalidationonupdate.md
│   │   │   │   │       │   │   ├── automaticvalidations.md
│   │   │   │   │       │   │   ├── beforecreate.md
│   │   │   │   │       │   │   ├── beforedelete.md
│   │   │   │   │       │   │   ├── beforesave.md
│   │   │   │   │       │   │   ├── beforeupdate.md
│   │   │   │   │       │   │   ├── beforevalidation.md
│   │   │   │   │       │   │   ├── beforevalidationoncreate.md
│   │   │   │   │       │   │   ├── beforevalidationonupdate.md
│   │   │   │   │       │   │   ├── belongsto.md
│   │   │   │   │       │   │   ├── datasource.md
│   │   │   │   │       │   │   ├── hasmany.md
│   │   │   │   │       │   │   ├── hasone.md
│   │   │   │   │       │   │   ├── index.md
│   │   │   │   │       │   │   ├── nestedproperties.md
│   │   │   │   │       │   │   ├── property.md
│   │   │   │   │       │   │   ├── protectedproperties.md
│   │   │   │   │       │   │   ├── setprimarykey.md
│   │   │   │   │       │   │   ├── setprimarykeys.md
│   │   │   │   │       │   │   ├── settablenameprefix.md
│   │   │   │   │       │   │   ├── table.md
│   │   │   │   │       │   │   ├── validate.md
│   │   │   │   │       │   │   ├── validateoncreate.md
│   │   │   │   │       │   │   ├── validateonupdate.md
│   │   │   │   │       │   │   ├── validatesconfirmationof.md
│   │   │   │   │       │   │   ├── validatesexclusionof.md
│   │   │   │   │       │   │   ├── validatesformatof.md
│   │   │   │   │       │   │   ├── validatesinclusionof.md
│   │   │   │   │       │   │   ├── validateslengthof.md
│   │   │   │   │       │   │   ├── validatesnumericalityof.md
│   │   │   │   │       │   │   ├── validatespresenceof.md
│   │   │   │   │       │   │   └── validatesuniquenessof.md
│   │   │   │   │       │   ├── model-object/
│   │   │   │   │       │   │   ├── adderror.md
│   │   │   │   │       │   │   ├── adderrortobase.md
│   │   │   │   │       │   │   ├── allchanges.md
│   │   │   │   │       │   │   ├── allerrors.md
│   │   │   │   │       │   │   ├── changedfrom.md
│   │   │   │   │       │   │   ├── changedproperties.md
│   │   │   │   │       │   │   ├── clearchangeinformation.md
│   │   │   │   │       │   │   ├── clearerrors.md
│   │   │   │   │       │   │   ├── compareto.md
│   │   │   │   │       │   │   ├── delete.md
│   │   │   │   │       │   │   ├── errorcount.md
│   │   │   │   │       │   │   ├── errorson.md
│   │   │   │   │       │   │   ├── errorsonbase.md
│   │   │   │   │       │   │   ├── haschanged.md
│   │   │   │   │       │   │   ├── haserrors.md
│   │   │   │   │       │   │   ├── hasproperty.md
│   │   │   │   │       │   │   ├── index.md
│   │   │   │   │       │   │   ├── isnew.md
│   │   │   │   │       │   │   ├── ispersisted.md
│   │   │   │   │       │   │   ├── key.md
│   │   │   │   │       │   │   ├── properties.md
│   │   │   │   │       │   │   ├── propertyisblank.md
│   │   │   │   │       │   │   ├── propertyispresent.md
│   │   │   │   │       │   │   ├── reload.md
│   │   │   │   │       │   │   ├── setproperties.md
│   │   │   │   │       │   │   ├── toggle.md
│   │   │   │   │       │   │   ├── update.md
│   │   │   │   │       │   │   ├── updateproperty.md
│   │   │   │   │       │   │   └── valid.md
│   │   │   │   │       │   └── view-helpers/
│   │   │   │   │       │       ├── authenticitytokenfield.md
│   │   │   │   │       │       ├── autolink.md
│   │   │   │   │       │       ├── buttontag.md
│   │   │   │   │       │       ├── buttonto.md
│   │   │   │   │       │       ├── checkbox.md
│   │   │   │   │       │       ├── checkboxtag.md
│   │   │   │   │       │       ├── contentfor.md
│   │   │   │   │       │       ├── contentforlayout.md
│   │   │   │   │       │       ├── csrfmetatags.md
│   │   │   │   │       │       ├── cycle.md
│   │   │   │   │       │       ├── dateselect.md
│   │   │   │   │       │       ├── dateselecttags.md
│   │   │   │   │       │       ├── datetimeselect.md
│   │   │   │   │       │       ├── datetimeselecttags.md
│   │   │   │   │       │       ├── dayselecttag.md
│   │   │   │   │       │       ├── endformtag.md
│   │   │   │   │       │       ├── errormessageon.md
│   │   │   │   │       │       ├── errormessagesfor.md
│   │   │   │   │       │       ├── filefield.md
│   │   │   │   │       │       ├── filefieldtag.md
│   │   │   │   │       │       ├── flashmessages.md
│   │   │   │   │       │       ├── hasmanycheckbox.md
│   │   │   │   │       │       ├── hasmanyradiobutton.md
│   │   │   │   │       │       ├── hiddenfield.md
│   │   │   │   │       │       ├── hiddenfieldtag.md
│   │   │   │   │       │       ├── highlight.md
│   │   │   │   │       │       ├── hourselecttag.md
│   │   │   │   │       │       ├── imagetag.md
│   │   │   │   │       │       ├── includecontent.md
│   │   │   │   │       │       ├── includedinobject.md
│   │   │   │   │       │       ├── includelayout.md
│   │   │   │   │       │       ├── includepartial.md
│   │   │   │   │       │       ├── index.md
│   │   │   │   │       │       ├── javascriptincludetag.md
│   │   │   │   │       │       ├── linkto.md
│   │   │   │   │       │       ├── mailto.md
│   │   │   │   │       │       ├── minuteselecttag.md
│   │   │   │   │       │       ├── monthselecttag.md
│   │   │   │   │       │       ├── paginationlinks.md
│   │   │   │   │       │       ├── passwordfield.md
│   │   │   │   │       │       ├── passwordfieldtag.md
│   │   │   │   │       │       ├── radiobutton.md
│   │   │   │   │       │       ├── radiobuttontag.md
│   │   │   │   │       │       ├── resetcycle.md
│   │   │   │   │       │       ├── secondselecttag.md
│   │   │   │   │       │       ├── select.md
│   │   │   │   │       │       ├── selecttag.md
│   │   │   │   │       │       ├── simpleformat.md
│   │   │   │   │       │       ├── startformtag.md
│   │   │   │   │       │       ├── striplinks.md
│   │   │   │   │       │       ├── striptags.md
│   │   │   │   │       │       ├── stylesheetlinktag.md
│   │   │   │   │       │       ├── submittag.md
│   │   │   │   │       │       ├── textarea.md
│   │   │   │   │       │       ├── textareatag.md
│   │   │   │   │       │       ├── textfield.md
│   │   │   │   │       │       ├── textfieldtag.md
│   │   │   │   │       │       ├── timeselect.md
│   │   │   │   │       │       ├── timeselecttags.md
│   │   │   │   │       │       └── yearselecttag.md
│   │   │   │   │       ├── v2-2-0/
│   │   │   │   │       │   ├── configuration/
│   │   │   │   │       │   │   ├── addformat.md
│   │   │   │   │       │   │   ├── collection.md
│   │   │   │   │       │   │   ├── constraints.md
│   │   │   │   │       │   │   ├── controller.md
│   │   │   │   │       │   │   ├── delete.md
│   │   │   │   │       │   │   ├── end.md
│   │   │   │   │       │   │   ├── get.md
│   │   │   │   │       │   │   ├── index.md
│   │   │   │   │       │   │   ├── mapper.md
│   │   │   │   │       │   │   ├── member.md
│   │   │   │   │       │   │   ├── namespace.md
│   │   │   │   │       │   │   ├── package.md
│   │   │   │   │       │   │   ├── patch.md
│   │   │   │   │       │   │   ├── post.md
│   │   │   │   │       │   │   ├── put.md
│   │   │   │   │       │   │   ├── resource.md
│   │   │   │   │       │   │   ├── resources.md
│   │   │   │   │       │   │   ├── root.md
│   │   │   │   │       │   │   ├── scope.md
│   │   │   │   │       │   │   ├── set.md
│   │   │   │   │       │   │   └── wildcard.md
│   │   │   │   │       │   ├── controller/
│   │   │   │   │       │   │   ├── authenticitytoken.md
│   │   │   │   │       │   │   ├── caches.md
│   │   │   │   │       │   │   ├── filterchain.md
│   │   │   │   │       │   │   ├── filters.md
│   │   │   │   │       │   │   ├── flash.md
│   │   │   │   │       │   │   ├── flashclear.md
│   │   │   │   │       │   │   ├── flashcount.md
│   │   │   │   │       │   │   ├── flashdelete.md
│   │   │   │   │       │   │   ├── flashinsert.md
│   │   │   │   │       │   │   ├── flashisempty.md
│   │   │   │   │       │   │   ├── flashkeep.md
│   │   │   │   │       │   │   ├── flashkeyexists.md
│   │   │   │   │       │   │   ├── getemails.md
│   │   │   │   │       │   │   ├── getfiles.md
│   │   │   │   │       │   │   ├── getredirect.md
│   │   │   │   │       │   │   ├── index.md
│   │   │   │   │       │   │   ├── isajax.md
│   │   │   │   │       │   │   ├── isdelete.md
│   │   │   │   │       │   │   ├── isget.md
│   │   │   │   │       │   │   ├── ishead.md
│   │   │   │   │       │   │   ├── isoptions.md
│   │   │   │   │       │   │   ├── ispatch.md
│   │   │   │   │       │   │   ├── ispost.md
│   │   │   │   │       │   │   ├── isput.md
│   │   │   │   │       │   │   ├── issecure.md
│   │   │   │   │       │   │   ├── onlyprovides.md
│   │   │   │   │       │   │   ├── pagination.md
│   │   │   │   │       │   │   ├── processaction.md
│   │   │   │   │       │   │   ├── processrequest.md
│   │   │   │   │       │   │   ├── protectsfromforgery.md
│   │   │   │   │       │   │   ├── provides.md
│   │   │   │   │       │   │   ├── redirectto.md
│   │   │   │   │       │   │   ├── rendernothing.md
│   │   │   │   │       │   │   ├── renderpartial.md
│   │   │   │   │       │   │   ├── rendertext.md
│   │   │   │   │       │   │   ├── renderview.md
│   │   │   │   │       │   │   ├── renderwith.md
│   │   │   │   │       │   │   ├── response.md
│   │   │   │   │       │   │   ├── sendemail.md
│   │   │   │   │       │   │   ├── sendfile.md
│   │   │   │   │       │   │   ├── setfilterchain.md
│   │   │   │   │       │   │   ├── setpagination.md
│   │   │   │   │       │   │   ├── setresponse.md
│   │   │   │   │       │   │   ├── setverificationchain.md
│   │   │   │   │       │   │   ├── useslayout.md
│   │   │   │   │       │   │   ├── verificationchain.md
│   │   │   │   │       │   │   └── verifies.md
│   │   │   │   │       │   ├── global-helpers/
│   │   │   │   │       │   │   ├── capitalize.md
│   │   │   │   │       │   │   ├── controller.md
│   │   │   │   │       │   │   ├── deobfuscateparam.md
│   │   │   │   │       │   │   ├── distanceoftimeinwords.md
│   │   │   │   │       │   │   ├── excerpt.md
│   │   │   │   │       │   │   ├── humanize.md
│   │   │   │   │       │   │   ├── hyphenize.md
│   │   │   │   │       │   │   ├── index.md
│   │   │   │   │       │   │   ├── mimetypes.md
│   │   │   │   │       │   │   ├── model.md
│   │   │   │   │       │   │   ├── obfuscateparam.md
│   │   │   │   │       │   │   ├── pluginnames.md
│   │   │   │   │       │   │   ├── pluralize.md
│   │   │   │   │       │   │   ├── singularize.md
│   │   │   │   │       │   │   ├── timeagoinwords.md
│   │   │   │   │       │   │   ├── timeuntilinwords.md
│   │   │   │   │       │   │   ├── titleize.md
│   │   │   │   │       │   │   ├── truncate.md
│   │   │   │   │       │   │   ├── urlfor.md
│   │   │   │   │       │   │   └── wordtruncate.md
│   │   │   │   │       │   ├── index.md
│   │   │   │   │       │   ├── migrator/
│   │   │   │   │       │   │   ├── addcolumn.md
│   │   │   │   │       │   │   ├── addforeignkey.md
│   │   │   │   │       │   │   ├── addindex.md
│   │   │   │   │       │   │   ├── addrecord.md
│   │   │   │   │       │   │   ├── addreference.md
│   │   │   │   │       │   │   ├── biginteger.md
│   │   │   │   │       │   │   ├── binary.md
│   │   │   │   │       │   │   ├── boolean.md
│   │   │   │   │       │   │   ├── change.md
│   │   │   │   │       │   │   ├── changecolumn.md
│   │   │   │   │       │   │   ├── changetable.md
│   │   │   │   │       │   │   ├── char.md
│   │   │   │   │       │   │   ├── column.md
│   │   │   │   │       │   │   ├── create.md
│   │   │   │   │       │   │   ├── createmigration.md
│   │   │   │   │       │   │   ├── createtable.md
│   │   │   │   │       │   │   ├── createview.md
│   │   │   │   │       │   │   ├── date.md
│   │   │   │   │       │   │   ├── datetime.md
│   │   │   │   │       │   │   ├── decimal.md
│   │   │   │   │       │   │   ├── down.md
│   │   │   │   │       │   │   ├── dropforeignkey.md
│   │   │   │   │       │   │   ├── dropreference.md
│   │   │   │   │       │   │   ├── droptable.md
│   │   │   │   │       │   │   ├── dropview.md
│   │   │   │   │       │   │   ├── execute.md
│   │   │   │   │       │   │   ├── float.md
│   │   │   │   │       │   │   ├── getavailablemigrations.md
│   │   │   │   │       │   │   ├── getcurrentmigrationversion.md
│   │   │   │   │       │   │   ├── index.md
│   │   │   │   │       │   │   ├── integer.md
│   │   │   │   │       │   │   ├── migrateto.md
│   │   │   │   │       │   │   ├── migratetolatest.md
│   │   │   │   │       │   │   ├── primarykey.md
│   │   │   │   │       │   │   ├── redomigration.md
│   │   │   │   │       │   │   ├── references.md
│   │   │   │   │       │   │   ├── removecolumn.md
│   │   │   │   │       │   │   ├── removeindex.md
│   │   │   │   │       │   │   ├── removerecord.md
│   │   │   │   │       │   │   ├── renamecolumn.md
│   │   │   │   │       │   │   ├── renametable.md
│   │   │   │   │       │   │   ├── string.md
│   │   │   │   │       │   │   ├── text.md
│   │   │   │   │       │   │   ├── time.md
│   │   │   │   │       │   │   ├── timestamp.md
│   │   │   │   │       │   │   ├── timestamps.md
│   │   │   │   │       │   │   ├── uniqueidentifier.md
│   │   │   │   │       │   │   ├── up.md
│   │   │   │   │       │   │   └── updaterecord.md
│   │   │   │   │       │   ├── miscellaneous/
│   │   │   │   │       │   │   ├── announce.md
│   │   │   │   │       │   │   └── index.md
│   │   │   │   │       │   ├── model-class/
│   │   │   │   │       │   │   ├── average.md
│   │   │   │   │       │   │   ├── columndataforproperty.md
│   │   │   │   │       │   │   ├── columnforproperty.md
│   │   │   │   │       │   │   ├── columnnames.md
│   │   │   │   │       │   │   ├── columns.md
│   │   │   │   │       │   │   ├── count.md
│   │   │   │   │       │   │   ├── create.md
│   │   │   │   │       │   │   ├── deleteall.md
│   │   │   │   │       │   │   ├── deletebykey.md
│   │   │   │   │       │   │   ├── deleteone.md
│   │   │   │   │       │   │   ├── exists.md
│   │   │   │   │       │   │   ├── findall.md
│   │   │   │   │       │   │   ├── findallkeys.md
│   │   │   │   │       │   │   ├── findbykey.md
│   │   │   │   │       │   │   ├── findfirst.md
│   │   │   │   │       │   │   ├── findlastone.md
│   │   │   │   │       │   │   ├── findone.md
│   │   │   │   │       │   │   ├── gettablenameprefix.md
│   │   │   │   │       │   │   ├── index.md
│   │   │   │   │       │   │   ├── invokewithtransaction.md
│   │   │   │   │       │   │   ├── isclass.md
│   │   │   │   │       │   │   ├── isinstance.md
│   │   │   │   │       │   │   ├── maximum.md
│   │   │   │   │       │   │   ├── minimum.md
│   │   │   │   │       │   │   ├── new.md
│   │   │   │   │       │   │   ├── onmissingmethod.md
│   │   │   │   │       │   │   ├── primarykey.md
│   │   │   │   │       │   │   ├── primarykeys.md
│   │   │   │   │       │   │   ├── propertynames.md
│   │   │   │   │       │   │   ├── save.md
│   │   │   │   │       │   │   ├── sum.md
│   │   │   │   │       │   │   ├── tablename.md
│   │   │   │   │       │   │   ├── updateall.md
│   │   │   │   │       │   │   ├── updatebykey.md
│   │   │   │   │       │   │   ├── updateone.md
│   │   │   │   │       │   │   └── validationtypeforproperty.md
│   │   │   │   │       │   ├── model-configuration/
│   │   │   │   │       │   │   ├── accessibleproperties.md
│   │   │   │   │       │   │   ├── aftercreate.md
│   │   │   │   │       │   │   ├── afterdelete.md
│   │   │   │   │       │   │   ├── afterfind.md
│   │   │   │   │       │   │   ├── afterinitialization.md
│   │   │   │   │       │   │   ├── afternew.md
│   │   │   │   │       │   │   ├── aftersave.md
│   │   │   │   │       │   │   ├── afterupdate.md
│   │   │   │   │       │   │   ├── aftervalidation.md
│   │   │   │   │       │   │   ├── aftervalidationoncreate.md
│   │   │   │   │       │   │   ├── aftervalidationonupdate.md
│   │   │   │   │       │   │   ├── automaticvalidations.md
│   │   │   │   │       │   │   ├── beforecreate.md
│   │   │   │   │       │   │   ├── beforedelete.md
│   │   │   │   │       │   │   ├── beforesave.md
│   │   │   │   │       │   │   ├── beforeupdate.md
│   │   │   │   │       │   │   ├── beforevalidation.md
│   │   │   │   │       │   │   ├── beforevalidationoncreate.md
│   │   │   │   │       │   │   ├── beforevalidationonupdate.md
│   │   │   │   │       │   │   ├── belongsto.md
│   │   │   │   │       │   │   ├── datasource.md
│   │   │   │   │       │   │   ├── hasmany.md
│   │   │   │   │       │   │   ├── hasone.md
│   │   │   │   │       │   │   ├── index.md
│   │   │   │   │       │   │   ├── nestedproperties.md
│   │   │   │   │       │   │   ├── property.md
│   │   │   │   │       │   │   ├── protectedproperties.md
│   │   │   │   │       │   │   ├── setprimarykey.md
│   │   │   │   │       │   │   ├── setprimarykeys.md
│   │   │   │   │       │   │   ├── settablenameprefix.md
│   │   │   │   │       │   │   ├── table.md
│   │   │   │   │       │   │   ├── validate.md
│   │   │   │   │       │   │   ├── validateoncreate.md
│   │   │   │   │       │   │   ├── validateonupdate.md
│   │   │   │   │       │   │   ├── validatesconfirmationof.md
│   │   │   │   │       │   │   ├── validatesexclusionof.md
│   │   │   │   │       │   │   ├── validatesformatof.md
│   │   │   │   │       │   │   ├── validatesinclusionof.md
│   │   │   │   │       │   │   ├── validateslengthof.md
│   │   │   │   │       │   │   ├── validatesnumericalityof.md
│   │   │   │   │       │   │   ├── validatespresenceof.md
│   │   │   │   │       │   │   └── validatesuniquenessof.md
│   │   │   │   │       │   ├── model-object/
│   │   │   │   │       │   │   ├── adderror.md
│   │   │   │   │       │   │   ├── adderrortobase.md
│   │   │   │   │       │   │   ├── allchanges.md
│   │   │   │   │       │   │   ├── allerrors.md
│   │   │   │   │       │   │   ├── changedfrom.md
│   │   │   │   │       │   │   ├── changedproperties.md
│   │   │   │   │       │   │   ├── clearchangeinformation.md
│   │   │   │   │       │   │   ├── clearerrors.md
│   │   │   │   │       │   │   ├── compareto.md
│   │   │   │   │       │   │   ├── delete.md
│   │   │   │   │       │   │   ├── errorcount.md
│   │   │   │   │       │   │   ├── errorson.md
│   │   │   │   │       │   │   ├── errorsonbase.md
│   │   │   │   │       │   │   ├── haschanged.md
│   │   │   │   │       │   │   ├── haserrors.md
│   │   │   │   │       │   │   ├── hasproperty.md
│   │   │   │   │       │   │   ├── index.md
│   │   │   │   │       │   │   ├── isnew.md
│   │   │   │   │       │   │   ├── ispersisted.md
│   │   │   │   │       │   │   ├── key.md
│   │   │   │   │       │   │   ├── properties.md
│   │   │   │   │       │   │   ├── propertyisblank.md
│   │   │   │   │       │   │   ├── propertyispresent.md
│   │   │   │   │       │   │   ├── reload.md
│   │   │   │   │       │   │   ├── setproperties.md
│   │   │   │   │       │   │   ├── toggle.md
│   │   │   │   │       │   │   ├── update.md
│   │   │   │   │       │   │   ├── updateproperty.md
│   │   │   │   │       │   │   └── valid.md
│   │   │   │   │       │   └── view-helpers/
│   │   │   │   │       │       ├── authenticitytokenfield.md
│   │   │   │   │       │       ├── autolink.md
│   │   │   │   │       │       ├── buttontag.md
│   │   │   │   │       │       ├── buttonto.md
│   │   │   │   │       │       ├── checkbox.md
│   │   │   │   │       │       ├── checkboxtag.md
│   │   │   │   │       │       ├── contentfor.md
│   │   │   │   │       │       ├── contentforlayout.md
│   │   │   │   │       │       ├── csrfmetatags.md
│   │   │   │   │       │       ├── cycle.md
│   │   │   │   │       │       ├── dateselect.md
│   │   │   │   │       │       ├── dateselecttags.md
│   │   │   │   │       │       ├── datetimeselect.md
│   │   │   │   │       │       ├── datetimeselecttags.md
│   │   │   │   │       │       ├── dayselecttag.md
│   │   │   │   │       │       ├── endformtag.md
│   │   │   │   │       │       ├── errormessageon.md
│   │   │   │   │       │       ├── errormessagesfor.md
│   │   │   │   │       │       ├── filefield.md
│   │   │   │   │       │       ├── filefieldtag.md
│   │   │   │   │       │       ├── flashmessages.md
│   │   │   │   │       │       ├── hasmanycheckbox.md
│   │   │   │   │       │       ├── hasmanyradiobutton.md
│   │   │   │   │       │       ├── hiddenfield.md
│   │   │   │   │       │       ├── hiddenfieldtag.md
│   │   │   │   │       │       ├── highlight.md
│   │   │   │   │       │       ├── hourselecttag.md
│   │   │   │   │       │       ├── imagetag.md
│   │   │   │   │       │       ├── includecontent.md
│   │   │   │   │       │       ├── includedinobject.md
│   │   │   │   │       │       ├── includelayout.md
│   │   │   │   │       │       ├── includepartial.md
│   │   │   │   │       │       ├── index.md
│   │   │   │   │       │       ├── javascriptincludetag.md
│   │   │   │   │       │       ├── linkto.md
│   │   │   │   │       │       ├── mailto.md
│   │   │   │   │       │       ├── minuteselecttag.md
│   │   │   │   │       │       ├── monthselecttag.md
│   │   │   │   │       │       ├── paginationlinks.md
│   │   │   │   │       │       ├── passwordfield.md
│   │   │   │   │       │       ├── passwordfieldtag.md
│   │   │   │   │       │       ├── radiobutton.md
│   │   │   │   │       │       ├── radiobuttontag.md
│   │   │   │   │       │       ├── resetcycle.md
│   │   │   │   │       │       ├── secondselecttag.md
│   │   │   │   │       │       ├── select.md
│   │   │   │   │       │       ├── selecttag.md
│   │   │   │   │       │       ├── simpleformat.md
│   │   │   │   │       │       ├── startformtag.md
│   │   │   │   │       │       ├── striplinks.md
│   │   │   │   │       │       ├── striptags.md
│   │   │   │   │       │       ├── stylesheetlinktag.md
│   │   │   │   │       │       ├── submittag.md
│   │   │   │   │       │       ├── textarea.md
│   │   │   │   │       │       ├── textareatag.md
│   │   │   │   │       │       ├── textfield.md
│   │   │   │   │       │       ├── textfieldtag.md
│   │   │   │   │       │       ├── timeselect.md
│   │   │   │   │       │       ├── timeselecttags.md
│   │   │   │   │       │       └── yearselecttag.md
│   │   │   │   │       ├── v2-3-0/
│   │   │   │   │       │   ├── configuration/
│   │   │   │   │       │   │   ├── addformat.md
│   │   │   │   │       │   │   ├── collection.md
│   │   │   │   │       │   │   ├── constraints.md
│   │   │   │   │       │   │   ├── controller.md
│   │   │   │   │       │   │   ├── delete.md
│   │   │   │   │       │   │   ├── end.md
│   │   │   │   │       │   │   ├── get.md
│   │   │   │   │       │   │   ├── index.md
│   │   │   │   │       │   │   ├── mapper.md
│   │   │   │   │       │   │   ├── member.md
│   │   │   │   │       │   │   ├── namespace.md
│   │   │   │   │       │   │   ├── package.md
│   │   │   │   │       │   │   ├── patch.md
│   │   │   │   │       │   │   ├── post.md
│   │   │   │   │       │   │   ├── put.md
│   │   │   │   │       │   │   ├── resource.md
│   │   │   │   │       │   │   ├── resources.md
│   │   │   │   │       │   │   ├── root.md
│   │   │   │   │       │   │   ├── scope.md
│   │   │   │   │       │   │   ├── set.md
│   │   │   │   │       │   │   └── wildcard.md
│   │   │   │   │       │   ├── controller/
│   │   │   │   │       │   │   ├── authenticitytoken.md
│   │   │   │   │       │   │   ├── caches.md
│   │   │   │   │       │   │   ├── filterchain.md
│   │   │   │   │       │   │   ├── filters.md
│   │   │   │   │       │   │   ├── flash.md
│   │   │   │   │       │   │   ├── flashclear.md
│   │   │   │   │       │   │   ├── flashcount.md
│   │   │   │   │       │   │   ├── flashdelete.md
│   │   │   │   │       │   │   ├── flashinsert.md
│   │   │   │   │       │   │   ├── flashisempty.md
│   │   │   │   │       │   │   ├── flashkeep.md
│   │   │   │   │       │   │   ├── flashkeyexists.md
│   │   │   │   │       │   │   ├── getemails.md
│   │   │   │   │       │   │   ├── getfiles.md
│   │   │   │   │       │   │   ├── getredirect.md
│   │   │   │   │       │   │   ├── index.md
│   │   │   │   │       │   │   ├── isajax.md
│   │   │   │   │       │   │   ├── isdelete.md
│   │   │   │   │       │   │   ├── isget.md
│   │   │   │   │       │   │   ├── ishead.md
│   │   │   │   │       │   │   ├── isoptions.md
│   │   │   │   │       │   │   ├── ispatch.md
│   │   │   │   │       │   │   ├── ispost.md
│   │   │   │   │       │   │   ├── isput.md
│   │   │   │   │       │   │   ├── issecure.md
│   │   │   │   │       │   │   ├── onlyprovides.md
│   │   │   │   │       │   │   ├── pagination.md
│   │   │   │   │       │   │   ├── processaction.md
│   │   │   │   │       │   │   ├── processrequest.md
│   │   │   │   │       │   │   ├── protectsfromforgery.md
│   │   │   │   │       │   │   ├── provides.md
│   │   │   │   │       │   │   ├── redirectto.md
│   │   │   │   │       │   │   ├── rendernothing.md
│   │   │   │   │       │   │   ├── renderpartial.md
│   │   │   │   │       │   │   ├── rendertext.md
│   │   │   │   │       │   │   ├── renderview.md
│   │   │   │   │       │   │   ├── renderwith.md
│   │   │   │   │       │   │   ├── response.md
│   │   │   │   │       │   │   ├── sendemail.md
│   │   │   │   │       │   │   ├── sendfile.md
│   │   │   │   │       │   │   ├── setfilterchain.md
│   │   │   │   │       │   │   ├── setpagination.md
│   │   │   │   │       │   │   ├── setresponse.md
│   │   │   │   │       │   │   ├── setverificationchain.md
│   │   │   │   │       │   │   ├── useslayout.md
│   │   │   │   │       │   │   ├── verificationchain.md
│   │   │   │   │       │   │   └── verifies.md
│   │   │   │   │       │   ├── global-helpers/
│   │   │   │   │       │   │   ├── capitalize.md
│   │   │   │   │       │   │   ├── controller.md
│   │   │   │   │       │   │   ├── deobfuscateparam.md
│   │   │   │   │       │   │   ├── distanceoftimeinwords.md
│   │   │   │   │       │   │   ├── excerpt.md
│   │   │   │   │       │   │   ├── humanize.md
│   │   │   │   │       │   │   ├── hyphenize.md
│   │   │   │   │       │   │   ├── index.md
│   │   │   │   │       │   │   ├── mimetypes.md
│   │   │   │   │       │   │   ├── model.md
│   │   │   │   │       │   │   ├── obfuscateparam.md
│   │   │   │   │       │   │   ├── pluginnames.md
│   │   │   │   │       │   │   ├── pluralize.md
│   │   │   │   │       │   │   ├── singularize.md
│   │   │   │   │       │   │   ├── timeagoinwords.md
│   │   │   │   │       │   │   ├── timeuntilinwords.md
│   │   │   │   │       │   │   ├── titleize.md
│   │   │   │   │       │   │   ├── truncate.md
│   │   │   │   │       │   │   ├── urlfor.md
│   │   │   │   │       │   │   └── wordtruncate.md
│   │   │   │   │       │   ├── index.md
│   │   │   │   │       │   ├── migrator/
│   │   │   │   │       │   │   ├── addcolumn.md
│   │   │   │   │       │   │   ├── addforeignkey.md
│   │   │   │   │       │   │   ├── addindex.md
│   │   │   │   │       │   │   ├── addrecord.md
│   │   │   │   │       │   │   ├── addreference.md
│   │   │   │   │       │   │   ├── biginteger.md
│   │   │   │   │       │   │   ├── binary.md
│   │   │   │   │       │   │   ├── boolean.md
│   │   │   │   │       │   │   ├── change.md
│   │   │   │   │       │   │   ├── changecolumn.md
│   │   │   │   │       │   │   ├── changetable.md
│   │   │   │   │       │   │   ├── char.md
│   │   │   │   │       │   │   ├── column.md
│   │   │   │   │       │   │   ├── create.md
│   │   │   │   │       │   │   ├── createmigration.md
│   │   │   │   │       │   │   ├── createtable.md
│   │   │   │   │       │   │   ├── createview.md
│   │   │   │   │       │   │   ├── date.md
│   │   │   │   │       │   │   ├── datetime.md
│   │   │   │   │       │   │   ├── decimal.md
│   │   │   │   │       │   │   ├── down.md
│   │   │   │   │       │   │   ├── dropforeignkey.md
│   │   │   │   │       │   │   ├── dropreference.md
│   │   │   │   │       │   │   ├── droptable.md
│   │   │   │   │       │   │   ├── dropview.md
│   │   │   │   │       │   │   ├── execute.md
│   │   │   │   │       │   │   ├── float.md
│   │   │   │   │       │   │   ├── getavailablemigrations.md
│   │   │   │   │       │   │   ├── getcurrentmigrationversion.md
│   │   │   │   │       │   │   ├── index.md
│   │   │   │   │       │   │   ├── integer.md
│   │   │   │   │       │   │   ├── migrateto.md
│   │   │   │   │       │   │   ├── migratetolatest.md
│   │   │   │   │       │   │   ├── primarykey.md
│   │   │   │   │       │   │   ├── redomigration.md
│   │   │   │   │       │   │   ├── references.md
│   │   │   │   │       │   │   ├── removecolumn.md
│   │   │   │   │       │   │   ├── removeindex.md
│   │   │   │   │       │   │   ├── removerecord.md
│   │   │   │   │       │   │   ├── renamecolumn.md
│   │   │   │   │       │   │   ├── renametable.md
│   │   │   │   │       │   │   ├── string.md
│   │   │   │   │       │   │   ├── text.md
│   │   │   │   │       │   │   ├── time.md
│   │   │   │   │       │   │   ├── timestamp.md
│   │   │   │   │       │   │   ├── timestamps.md
│   │   │   │   │       │   │   ├── uniqueidentifier.md
│   │   │   │   │       │   │   ├── up.md
│   │   │   │   │       │   │   └── updaterecord.md
│   │   │   │   │       │   ├── miscellaneous/
│   │   │   │   │       │   │   ├── announce.md
│   │   │   │   │       │   │   └── index.md
│   │   │   │   │       │   ├── model-class/
│   │   │   │   │       │   │   ├── average.md
│   │   │   │   │       │   │   ├── columndataforproperty.md
│   │   │   │   │       │   │   ├── columnforproperty.md
│   │   │   │   │       │   │   ├── columnnames.md
│   │   │   │   │       │   │   ├── columns.md
│   │   │   │   │       │   │   ├── count.md
│   │   │   │   │       │   │   ├── create.md
│   │   │   │   │       │   │   ├── deleteall.md
│   │   │   │   │       │   │   ├── deletebykey.md
│   │   │   │   │       │   │   ├── deleteone.md
│   │   │   │   │       │   │   ├── exists.md
│   │   │   │   │       │   │   ├── findall.md
│   │   │   │   │       │   │   ├── findallkeys.md
│   │   │   │   │       │   │   ├── findbykey.md
│   │   │   │   │       │   │   ├── findfirst.md
│   │   │   │   │       │   │   ├── findlastone.md
│   │   │   │   │       │   │   ├── findone.md
│   │   │   │   │       │   │   ├── gettablenameprefix.md
│   │   │   │   │       │   │   ├── index.md
│   │   │   │   │       │   │   ├── invokewithtransaction.md
│   │   │   │   │       │   │   ├── isclass.md
│   │   │   │   │       │   │   ├── isinstance.md
│   │   │   │   │       │   │   ├── maximum.md
│   │   │   │   │       │   │   ├── minimum.md
│   │   │   │   │       │   │   ├── new.md
│   │   │   │   │       │   │   ├── onmissingmethod.md
│   │   │   │   │       │   │   ├── primarykey.md
│   │   │   │   │       │   │   ├── primarykeys.md
│   │   │   │   │       │   │   ├── propertynames.md
│   │   │   │   │       │   │   ├── save.md
│   │   │   │   │       │   │   ├── sum.md
│   │   │   │   │       │   │   ├── tablename.md
│   │   │   │   │       │   │   ├── updateall.md
│   │   │   │   │       │   │   ├── updatebykey.md
│   │   │   │   │       │   │   ├── updateone.md
│   │   │   │   │       │   │   └── validationtypeforproperty.md
│   │   │   │   │       │   ├── model-configuration/
│   │   │   │   │       │   │   ├── accessibleproperties.md
│   │   │   │   │       │   │   ├── aftercreate.md
│   │   │   │   │       │   │   ├── afterdelete.md
│   │   │   │   │       │   │   ├── afterfind.md
│   │   │   │   │       │   │   ├── afterinitialization.md
│   │   │   │   │       │   │   ├── afternew.md
│   │   │   │   │       │   │   ├── aftersave.md
│   │   │   │   │       │   │   ├── afterupdate.md
│   │   │   │   │       │   │   ├── aftervalidation.md
│   │   │   │   │       │   │   ├── aftervalidationoncreate.md
│   │   │   │   │       │   │   ├── aftervalidationonupdate.md
│   │   │   │   │       │   │   ├── automaticvalidations.md
│   │   │   │   │       │   │   ├── beforecreate.md
│   │   │   │   │       │   │   ├── beforedelete.md
│   │   │   │   │       │   │   ├── beforesave.md
│   │   │   │   │       │   │   ├── beforeupdate.md
│   │   │   │   │       │   │   ├── beforevalidation.md
│   │   │   │   │       │   │   ├── beforevalidationoncreate.md
│   │   │   │   │       │   │   ├── beforevalidationonupdate.md
│   │   │   │   │       │   │   ├── belongsto.md
│   │   │   │   │       │   │   ├── datasource.md
│   │   │   │   │       │   │   ├── hasmany.md
│   │   │   │   │       │   │   ├── hasone.md
│   │   │   │   │       │   │   ├── index.md
│   │   │   │   │       │   │   ├── nestedproperties.md
│   │   │   │   │       │   │   ├── property.md
│   │   │   │   │       │   │   ├── protectedproperties.md
│   │   │   │   │       │   │   ├── setprimarykey.md
│   │   │   │   │       │   │   ├── setprimarykeys.md
│   │   │   │   │       │   │   ├── settablenameprefix.md
│   │   │   │   │       │   │   ├── table.md
│   │   │   │   │       │   │   ├── validate.md
│   │   │   │   │       │   │   ├── validateoncreate.md
│   │   │   │   │       │   │   ├── validateonupdate.md
│   │   │   │   │       │   │   ├── validatesconfirmationof.md
│   │   │   │   │       │   │   ├── validatesexclusionof.md
│   │   │   │   │       │   │   ├── validatesformatof.md
│   │   │   │   │       │   │   ├── validatesinclusionof.md
│   │   │   │   │       │   │   ├── validateslengthof.md
│   │   │   │   │       │   │   ├── validatesnumericalityof.md
│   │   │   │   │       │   │   ├── validatespresenceof.md
│   │   │   │   │       │   │   └── validatesuniquenessof.md
│   │   │   │   │       │   ├── model-object/
│   │   │   │   │       │   │   ├── adderror.md
│   │   │   │   │       │   │   ├── adderrortobase.md
│   │   │   │   │       │   │   ├── allchanges.md
│   │   │   │   │       │   │   ├── allerrors.md
│   │   │   │   │       │   │   ├── changedfrom.md
│   │   │   │   │       │   │   ├── changedproperties.md
│   │   │   │   │       │   │   ├── clearchangeinformation.md
│   │   │   │   │       │   │   ├── clearerrors.md
│   │   │   │   │       │   │   ├── compareto.md
│   │   │   │   │       │   │   ├── delete.md
│   │   │   │   │       │   │   ├── errorcount.md
│   │   │   │   │       │   │   ├── errorson.md
│   │   │   │   │       │   │   ├── errorsonbase.md
│   │   │   │   │       │   │   ├── haschanged.md
│   │   │   │   │       │   │   ├── haserrors.md
│   │   │   │   │       │   │   ├── hasproperty.md
│   │   │   │   │       │   │   ├── index.md
│   │   │   │   │       │   │   ├── isnew.md
│   │   │   │   │       │   │   ├── ispersisted.md
│   │   │   │   │       │   │   ├── key.md
│   │   │   │   │       │   │   ├── properties.md
│   │   │   │   │       │   │   ├── propertyisblank.md
│   │   │   │   │       │   │   ├── propertyispresent.md
│   │   │   │   │       │   │   ├── reload.md
│   │   │   │   │       │   │   ├── setproperties.md
│   │   │   │   │       │   │   ├── toggle.md
│   │   │   │   │       │   │   ├── update.md
│   │   │   │   │       │   │   ├── updateproperty.md
│   │   │   │   │       │   │   └── valid.md
│   │   │   │   │       │   └── view-helpers/
│   │   │   │   │       │       ├── authenticitytokenfield.md
│   │   │   │   │       │       ├── autolink.md
│   │   │   │   │       │       ├── buttontag.md
│   │   │   │   │       │       ├── buttonto.md
│   │   │   │   │       │       ├── checkbox.md
│   │   │   │   │       │       ├── checkboxtag.md
│   │   │   │   │       │       ├── contentfor.md
│   │   │   │   │       │       ├── contentforlayout.md
│   │   │   │   │       │       ├── csrfmetatags.md
│   │   │   │   │       │       ├── cycle.md
│   │   │   │   │       │       ├── dateselect.md
│   │   │   │   │       │       ├── dateselecttags.md
│   │   │   │   │       │       ├── datetimeselect.md
│   │   │   │   │       │       ├── datetimeselecttags.md
│   │   │   │   │       │       ├── dayselecttag.md
│   │   │   │   │       │       ├── endformtag.md
│   │   │   │   │       │       ├── errormessageon.md
│   │   │   │   │       │       ├── errormessagesfor.md
│   │   │   │   │       │       ├── filefield.md
│   │   │   │   │       │       ├── filefieldtag.md
│   │   │   │   │       │       ├── flashmessages.md
│   │   │   │   │       │       ├── hasmanycheckbox.md
│   │   │   │   │       │       ├── hasmanyradiobutton.md
│   │   │   │   │       │       ├── hiddenfield.md
│   │   │   │   │       │       ├── hiddenfieldtag.md
│   │   │   │   │       │       ├── highlight.md
│   │   │   │   │       │       ├── hourselecttag.md
│   │   │   │   │       │       ├── imagetag.md
│   │   │   │   │       │       ├── includecontent.md
│   │   │   │   │       │       ├── includedinobject.md
│   │   │   │   │       │       ├── includelayout.md
│   │   │   │   │       │       ├── includepartial.md
│   │   │   │   │       │       ├── index.md
│   │   │   │   │       │       ├── javascriptincludetag.md
│   │   │   │   │       │       ├── linkto.md
│   │   │   │   │       │       ├── mailto.md
│   │   │   │   │       │       ├── minuteselecttag.md
│   │   │   │   │       │       ├── monthselecttag.md
│   │   │   │   │       │       ├── paginationlinks.md
│   │   │   │   │       │       ├── passwordfield.md
│   │   │   │   │       │       ├── passwordfieldtag.md
│   │   │   │   │       │       ├── radiobutton.md
│   │   │   │   │       │       ├── radiobuttontag.md
│   │   │   │   │       │       ├── resetcycle.md
│   │   │   │   │       │       ├── secondselecttag.md
│   │   │   │   │       │       ├── select.md
│   │   │   │   │       │       ├── selecttag.md
│   │   │   │   │       │       ├── simpleformat.md
│   │   │   │   │       │       ├── startformtag.md
│   │   │   │   │       │       ├── striplinks.md
│   │   │   │   │       │       ├── striptags.md
│   │   │   │   │       │       ├── stylesheetlinktag.md
│   │   │   │   │       │       ├── submittag.md
│   │   │   │   │       │       ├── textarea.md
│   │   │   │   │       │       ├── textareatag.md
│   │   │   │   │       │       ├── textfield.md
│   │   │   │   │       │       ├── textfieldtag.md
│   │   │   │   │       │       ├── timeselect.md
│   │   │   │   │       │       ├── timeselecttags.md
│   │   │   │   │       │       └── yearselecttag.md
│   │   │   │   │       ├── v2-4-0/
│   │   │   │   │       │   ├── configuration/
│   │   │   │   │       │   │   ├── addformat.md
│   │   │   │   │       │   │   ├── collection.md
│   │   │   │   │       │   │   ├── constraints.md
│   │   │   │   │       │   │   ├── controller.md
│   │   │   │   │       │   │   ├── delete.md
│   │   │   │   │       │   │   ├── end.md
│   │   │   │   │       │   │   ├── get.md
│   │   │   │   │       │   │   ├── index.md
│   │   │   │   │       │   │   ├── mapper.md
│   │   │   │   │       │   │   ├── member.md
│   │   │   │   │       │   │   ├── namespace.md
│   │   │   │   │       │   │   ├── package.md
│   │   │   │   │       │   │   ├── patch.md
│   │   │   │   │       │   │   ├── post.md
│   │   │   │   │       │   │   ├── put.md
│   │   │   │   │       │   │   ├── resource.md
│   │   │   │   │       │   │   ├── resources.md
│   │   │   │   │       │   │   ├── root.md
│   │   │   │   │       │   │   ├── scope.md
│   │   │   │   │       │   │   ├── set.md
│   │   │   │   │       │   │   └── wildcard.md
│   │   │   │   │       │   ├── controller/
│   │   │   │   │       │   │   ├── authenticitytoken.md
│   │   │   │   │       │   │   ├── caches.md
│   │   │   │   │       │   │   ├── filterchain.md
│   │   │   │   │       │   │   ├── filters.md
│   │   │   │   │       │   │   ├── flash.md
│   │   │   │   │       │   │   ├── flashclear.md
│   │   │   │   │       │   │   ├── flashcount.md
│   │   │   │   │       │   │   ├── flashdelete.md
│   │   │   │   │       │   │   ├── flashinsert.md
│   │   │   │   │       │   │   ├── flashisempty.md
│   │   │   │   │       │   │   ├── flashkeep.md
│   │   │   │   │       │   │   ├── flashkeyexists.md
│   │   │   │   │       │   │   ├── getemails.md
│   │   │   │   │       │   │   ├── getfiles.md
│   │   │   │   │       │   │   ├── getredirect.md
│   │   │   │   │       │   │   ├── index.md
│   │   │   │   │       │   │   ├── isajax.md
│   │   │   │   │       │   │   ├── isdelete.md
│   │   │   │   │       │   │   ├── isget.md
│   │   │   │   │       │   │   ├── ishead.md
│   │   │   │   │       │   │   ├── isoptions.md
│   │   │   │   │       │   │   ├── ispatch.md
│   │   │   │   │       │   │   ├── ispost.md
│   │   │   │   │       │   │   ├── isput.md
│   │   │   │   │       │   │   ├── issecure.md
│   │   │   │   │       │   │   ├── onlyprovides.md
│   │   │   │   │       │   │   ├── pagination.md
│   │   │   │   │       │   │   ├── processaction.md
│   │   │   │   │       │   │   ├── processrequest.md
│   │   │   │   │       │   │   ├── protectsfromforgery.md
│   │   │   │   │       │   │   ├── provides.md
│   │   │   │   │       │   │   ├── redirectto.md
│   │   │   │   │       │   │   ├── rendernothing.md
│   │   │   │   │       │   │   ├── renderpartial.md
│   │   │   │   │       │   │   ├── rendertext.md
│   │   │   │   │       │   │   ├── renderview.md
│   │   │   │   │       │   │   ├── renderwith.md
│   │   │   │   │       │   │   ├── response.md
│   │   │   │   │       │   │   ├── sendemail.md
│   │   │   │   │       │   │   ├── sendfile.md
│   │   │   │   │       │   │   ├── setfilterchain.md
│   │   │   │   │       │   │   ├── setpagination.md
│   │   │   │   │       │   │   ├── setresponse.md
│   │   │   │   │       │   │   ├── setverificationchain.md
│   │   │   │   │       │   │   ├── useslayout.md
│   │   │   │   │       │   │   ├── verificationchain.md
│   │   │   │   │       │   │   └── verifies.md
│   │   │   │   │       │   ├── global-helpers/
│   │   │   │   │       │   │   ├── capitalize.md
│   │   │   │   │       │   │   ├── controller.md
│   │   │   │   │       │   │   ├── deobfuscateparam.md
│   │   │   │   │       │   │   ├── distanceoftimeinwords.md
│   │   │   │   │       │   │   ├── excerpt.md
│   │   │   │   │       │   │   ├── humanize.md
│   │   │   │   │       │   │   ├── hyphenize.md
│   │   │   │   │       │   │   ├── index.md
│   │   │   │   │       │   │   ├── mimetypes.md
│   │   │   │   │       │   │   ├── model.md
│   │   │   │   │       │   │   ├── obfuscateparam.md
│   │   │   │   │       │   │   ├── pluginnames.md
│   │   │   │   │       │   │   ├── pluralize.md
│   │   │   │   │       │   │   ├── singularize.md
│   │   │   │   │       │   │   ├── timeagoinwords.md
│   │   │   │   │       │   │   ├── timeuntilinwords.md
│   │   │   │   │       │   │   ├── titleize.md
│   │   │   │   │       │   │   ├── truncate.md
│   │   │   │   │       │   │   ├── urlfor.md
│   │   │   │   │       │   │   └── wordtruncate.md
│   │   │   │   │       │   ├── index.md
│   │   │   │   │       │   ├── migrator/
│   │   │   │   │       │   │   ├── addcolumn.md
│   │   │   │   │       │   │   ├── addforeignkey.md
│   │   │   │   │       │   │   ├── addindex.md
│   │   │   │   │       │   │   ├── addrecord.md
│   │   │   │   │       │   │   ├── addreference.md
│   │   │   │   │       │   │   ├── biginteger.md
│   │   │   │   │       │   │   ├── binary.md
│   │   │   │   │       │   │   ├── boolean.md
│   │   │   │   │       │   │   ├── change.md
│   │   │   │   │       │   │   ├── changecolumn.md
│   │   │   │   │       │   │   ├── changetable.md
│   │   │   │   │       │   │   ├── char.md
│   │   │   │   │       │   │   ├── column.md
│   │   │   │   │       │   │   ├── create.md
│   │   │   │   │       │   │   ├── createmigration.md
│   │   │   │   │       │   │   ├── createtable.md
│   │   │   │   │       │   │   ├── createview.md
│   │   │   │   │       │   │   ├── date.md
│   │   │   │   │       │   │   ├── datetime.md
│   │   │   │   │       │   │   ├── decimal.md
│   │   │   │   │       │   │   ├── down.md
│   │   │   │   │       │   │   ├── dropforeignkey.md
│   │   │   │   │       │   │   ├── dropreference.md
│   │   │   │   │       │   │   ├── droptable.md
│   │   │   │   │       │   │   ├── dropview.md
│   │   │   │   │       │   │   ├── execute.md
│   │   │   │   │       │   │   ├── float.md
│   │   │   │   │       │   │   ├── getavailablemigrations.md
│   │   │   │   │       │   │   ├── getcurrentmigrationversion.md
│   │   │   │   │       │   │   ├── index.md
│   │   │   │   │       │   │   ├── integer.md
│   │   │   │   │       │   │   ├── migrateto.md
│   │   │   │   │       │   │   ├── migratetolatest.md
│   │   │   │   │       │   │   ├── primarykey.md
│   │   │   │   │       │   │   ├── redomigration.md
│   │   │   │   │       │   │   ├── references.md
│   │   │   │   │       │   │   ├── removecolumn.md
│   │   │   │   │       │   │   ├── removeindex.md
│   │   │   │   │       │   │   ├── removerecord.md
│   │   │   │   │       │   │   ├── renamecolumn.md
│   │   │   │   │       │   │   ├── renametable.md
│   │   │   │   │       │   │   ├── string.md
│   │   │   │   │       │   │   ├── text.md
│   │   │   │   │       │   │   ├── time.md
│   │   │   │   │       │   │   ├── timestamp.md
│   │   │   │   │       │   │   ├── timestamps.md
│   │   │   │   │       │   │   ├── uniqueidentifier.md
│   │   │   │   │       │   │   ├── up.md
│   │   │   │   │       │   │   └── updaterecord.md
│   │   │   │   │       │   ├── miscellaneous/
│   │   │   │   │       │   │   ├── announce.md
│   │   │   │   │       │   │   └── index.md
│   │   │   │   │       │   ├── model-class/
│   │   │   │   │       │   │   ├── average.md
│   │   │   │   │       │   │   ├── columndataforproperty.md
│   │   │   │   │       │   │   ├── columnforproperty.md
│   │   │   │   │       │   │   ├── columnnames.md
│   │   │   │   │       │   │   ├── columns.md
│   │   │   │   │       │   │   ├── count.md
│   │   │   │   │       │   │   ├── create.md
│   │   │   │   │       │   │   ├── deleteall.md
│   │   │   │   │       │   │   ├── deletebykey.md
│   │   │   │   │       │   │   ├── deleteone.md
│   │   │   │   │       │   │   ├── exists.md
│   │   │   │   │       │   │   ├── findall.md
│   │   │   │   │       │   │   ├── findallkeys.md
│   │   │   │   │       │   │   ├── findbykey.md
│   │   │   │   │       │   │   ├── findfirst.md
│   │   │   │   │       │   │   ├── findlastone.md
│   │   │   │   │       │   │   ├── findone.md
│   │   │   │   │       │   │   ├── gettablenameprefix.md
│   │   │   │   │       │   │   ├── index.md
│   │   │   │   │       │   │   ├── invokewithtransaction.md
│   │   │   │   │       │   │   ├── isclass.md
│   │   │   │   │       │   │   ├── isinstance.md
│   │   │   │   │       │   │   ├── maximum.md
│   │   │   │   │       │   │   ├── minimum.md
│   │   │   │   │       │   │   ├── new.md
│   │   │   │   │       │   │   ├── onmissingmethod.md
│   │   │   │   │       │   │   ├── primarykey.md
│   │   │   │   │       │   │   ├── primarykeys.md
│   │   │   │   │       │   │   ├── propertynames.md
│   │   │   │   │       │   │   ├── save.md
│   │   │   │   │       │   │   ├── sum.md
│   │   │   │   │       │   │   ├── tablename.md
│   │   │   │   │       │   │   ├── updateall.md
│   │   │   │   │       │   │   ├── updatebykey.md
│   │   │   │   │       │   │   ├── updateone.md
│   │   │   │   │       │   │   └── validationtypeforproperty.md
│   │   │   │   │       │   ├── model-configuration/
│   │   │   │   │       │   │   ├── accessibleproperties.md
│   │   │   │   │       │   │   ├── aftercreate.md
│   │   │   │   │       │   │   ├── afterdelete.md
│   │   │   │   │       │   │   ├── afterfind.md
│   │   │   │   │       │   │   ├── afterinitialization.md
│   │   │   │   │       │   │   ├── afternew.md
│   │   │   │   │       │   │   ├── aftersave.md
│   │   │   │   │       │   │   ├── afterupdate.md
│   │   │   │   │       │   │   ├── aftervalidation.md
│   │   │   │   │       │   │   ├── aftervalidationoncreate.md
│   │   │   │   │       │   │   ├── aftervalidationonupdate.md
│   │   │   │   │       │   │   ├── automaticvalidations.md
│   │   │   │   │       │   │   ├── beforecreate.md
│   │   │   │   │       │   │   ├── beforedelete.md
│   │   │   │   │       │   │   ├── beforesave.md
│   │   │   │   │       │   │   ├── beforeupdate.md
│   │   │   │   │       │   │   ├── beforevalidation.md
│   │   │   │   │       │   │   ├── beforevalidationoncreate.md
│   │   │   │   │       │   │   ├── beforevalidationonupdate.md
│   │   │   │   │       │   │   ├── belongsto.md
│   │   │   │   │       │   │   ├── datasource.md
│   │   │   │   │       │   │   ├── hasmany.md
│   │   │   │   │       │   │   ├── hasone.md
│   │   │   │   │       │   │   ├── index.md
│   │   │   │   │       │   │   ├── nestedproperties.md
│   │   │   │   │       │   │   ├── property.md
│   │   │   │   │       │   │   ├── protectedproperties.md
│   │   │   │   │       │   │   ├── setprimarykey.md
│   │   │   │   │       │   │   ├── setprimarykeys.md
│   │   │   │   │       │   │   ├── settablenameprefix.md
│   │   │   │   │       │   │   ├── table.md
│   │   │   │   │       │   │   ├── validate.md
│   │   │   │   │       │   │   ├── validateoncreate.md
│   │   │   │   │       │   │   ├── validateonupdate.md
│   │   │   │   │       │   │   ├── validatesconfirmationof.md
│   │   │   │   │       │   │   ├── validatesexclusionof.md
│   │   │   │   │       │   │   ├── validatesformatof.md
│   │   │   │   │       │   │   ├── validatesinclusionof.md
│   │   │   │   │       │   │   ├── validateslengthof.md
│   │   │   │   │       │   │   ├── validatesnumericalityof.md
│   │   │   │   │       │   │   ├── validatespresenceof.md
│   │   │   │   │       │   │   └── validatesuniquenessof.md
│   │   │   │   │       │   ├── model-object/
│   │   │   │   │       │   │   ├── adderror.md
│   │   │   │   │       │   │   ├── adderrortobase.md
│   │   │   │   │       │   │   ├── allchanges.md
│   │   │   │   │       │   │   ├── allerrors.md
│   │   │   │   │       │   │   ├── changedfrom.md
│   │   │   │   │       │   │   ├── changedproperties.md
│   │   │   │   │       │   │   ├── clearchangeinformation.md
│   │   │   │   │       │   │   ├── clearerrors.md
│   │   │   │   │       │   │   ├── compareto.md
│   │   │   │   │       │   │   ├── delete.md
│   │   │   │   │       │   │   ├── errorcount.md
│   │   │   │   │       │   │   ├── errorson.md
│   │   │   │   │       │   │   ├── errorsonbase.md
│   │   │   │   │       │   │   ├── haschanged.md
│   │   │   │   │       │   │   ├── haserrors.md
│   │   │   │   │       │   │   ├── hasproperty.md
│   │   │   │   │       │   │   ├── index.md
│   │   │   │   │       │   │   ├── isnew.md
│   │   │   │   │       │   │   ├── ispersisted.md
│   │   │   │   │       │   │   ├── key.md
│   │   │   │   │       │   │   ├── properties.md
│   │   │   │   │       │   │   ├── propertyisblank.md
│   │   │   │   │       │   │   ├── propertyispresent.md
│   │   │   │   │       │   │   ├── reload.md
│   │   │   │   │       │   │   ├── setproperties.md
│   │   │   │   │       │   │   ├── toggle.md
│   │   │   │   │       │   │   ├── update.md
│   │   │   │   │       │   │   ├── updateproperty.md
│   │   │   │   │       │   │   └── valid.md
│   │   │   │   │       │   └── view-helpers/
│   │   │   │   │       │       ├── authenticitytokenfield.md
│   │   │   │   │       │       ├── autolink.md
│   │   │   │   │       │       ├── buttontag.md
│   │   │   │   │       │       ├── buttonto.md
│   │   │   │   │       │       ├── checkbox.md
│   │   │   │   │       │       ├── checkboxtag.md
│   │   │   │   │       │       ├── contentfor.md
│   │   │   │   │       │       ├── contentforlayout.md
│   │   │   │   │       │       ├── csrfmetatags.md
│   │   │   │   │       │       ├── cycle.md
│   │   │   │   │       │       ├── dateselect.md
│   │   │   │   │       │       ├── dateselecttags.md
│   │   │   │   │       │       ├── datetimeselect.md
│   │   │   │   │       │       ├── datetimeselecttags.md
│   │   │   │   │       │       ├── dayselecttag.md
│   │   │   │   │       │       ├── endformtag.md
│   │   │   │   │       │       ├── errormessageon.md
│   │   │   │   │       │       ├── errormessagesfor.md
│   │   │   │   │       │       ├── filefield.md
│   │   │   │   │       │       ├── filefieldtag.md
│   │   │   │   │       │       ├── flashmessages.md
│   │   │   │   │       │       ├── hasmanycheckbox.md
│   │   │   │   │       │       ├── hasmanyradiobutton.md
│   │   │   │   │       │       ├── hiddenfield.md
│   │   │   │   │       │       ├── hiddenfieldtag.md
│   │   │   │   │       │       ├── highlight.md
│   │   │   │   │       │       ├── hourselecttag.md
│   │   │   │   │       │       ├── imagetag.md
│   │   │   │   │       │       ├── includecontent.md
│   │   │   │   │       │       ├── includedinobject.md
│   │   │   │   │       │       ├── includelayout.md
│   │   │   │   │       │       ├── includepartial.md
│   │   │   │   │       │       ├── index.md
│   │   │   │   │       │       ├── javascriptincludetag.md
│   │   │   │   │       │       ├── linkto.md
│   │   │   │   │       │       ├── mailto.md
│   │   │   │   │       │       ├── minuteselecttag.md
│   │   │   │   │       │       ├── monthselecttag.md
│   │   │   │   │       │       ├── paginationlinks.md
│   │   │   │   │       │       ├── passwordfield.md
│   │   │   │   │       │       ├── passwordfieldtag.md
│   │   │   │   │       │       ├── radiobutton.md
│   │   │   │   │       │       ├── radiobuttontag.md
│   │   │   │   │       │       ├── resetcycle.md
│   │   │   │   │       │       ├── secondselecttag.md
│   │   │   │   │       │       ├── select.md
│   │   │   │   │       │       ├── selecttag.md
│   │   │   │   │       │       ├── simpleformat.md
│   │   │   │   │       │       ├── startformtag.md
│   │   │   │   │       │       ├── striplinks.md
│   │   │   │   │       │       ├── striptags.md
│   │   │   │   │       │       ├── stylesheetlinktag.md
│   │   │   │   │       │       ├── submittag.md
│   │   │   │   │       │       ├── textarea.md
│   │   │   │   │       │       ├── textareatag.md
│   │   │   │   │       │       ├── textfield.md
│   │   │   │   │       │       ├── textfieldtag.md
│   │   │   │   │       │       ├── timeselect.md
│   │   │   │   │       │       ├── timeselecttags.md
│   │   │   │   │       │       └── yearselecttag.md
│   │   │   │   │       ├── v2-5-0/
│   │   │   │   │       │   ├── configuration/
│   │   │   │   │       │   │   ├── addformat.md
│   │   │   │   │       │   │   ├── collection.md
│   │   │   │   │       │   │   ├── constraints.md
│   │   │   │   │       │   │   ├── controller.md
│   │   │   │   │       │   │   ├── delete.md
│   │   │   │   │       │   │   ├── end.md
│   │   │   │   │       │   │   ├── get.md
│   │   │   │   │       │   │   ├── index.md
│   │   │   │   │       │   │   ├── mapper.md
│   │   │   │   │       │   │   ├── member.md
│   │   │   │   │       │   │   ├── namespace.md
│   │   │   │   │       │   │   ├── package.md
│   │   │   │   │       │   │   ├── patch.md
│   │   │   │   │       │   │   ├── post.md
│   │   │   │   │       │   │   ├── put.md
│   │   │   │   │       │   │   ├── resource.md
│   │   │   │   │       │   │   ├── resources.md
│   │   │   │   │       │   │   ├── root.md
│   │   │   │   │       │   │   ├── scope.md
│   │   │   │   │       │   │   ├── set.md
│   │   │   │   │       │   │   └── wildcard.md
│   │   │   │   │       │   ├── controller/
│   │   │   │   │       │   │   ├── authenticitytoken.md
│   │   │   │   │       │   │   ├── caches.md
│   │   │   │   │       │   │   ├── filterchain.md
│   │   │   │   │       │   │   ├── filters.md
│   │   │   │   │       │   │   ├── flash.md
│   │   │   │   │       │   │   ├── flashclear.md
│   │   │   │   │       │   │   ├── flashcount.md
│   │   │   │   │       │   │   ├── flashdelete.md
│   │   │   │   │       │   │   ├── flashinsert.md
│   │   │   │   │       │   │   ├── flashisempty.md
│   │   │   │   │       │   │   ├── flashkeep.md
│   │   │   │   │       │   │   ├── flashkeyexists.md
│   │   │   │   │       │   │   ├── getemails.md
│   │   │   │   │       │   │   ├── getfiles.md
│   │   │   │   │       │   │   ├── getredirect.md
│   │   │   │   │       │   │   ├── index.md
│   │   │   │   │       │   │   ├── isajax.md
│   │   │   │   │       │   │   ├── isdelete.md
│   │   │   │   │       │   │   ├── isget.md
│   │   │   │   │       │   │   ├── ishead.md
│   │   │   │   │       │   │   ├── isoptions.md
│   │   │   │   │       │   │   ├── ispatch.md
│   │   │   │   │       │   │   ├── ispost.md
│   │   │   │   │       │   │   ├── isput.md
│   │   │   │   │       │   │   ├── issecure.md
│   │   │   │   │       │   │   ├── onlyprovides.md
│   │   │   │   │       │   │   ├── pagination.md
│   │   │   │   │       │   │   ├── processaction.md
│   │   │   │   │       │   │   ├── processrequest.md
│   │   │   │   │       │   │   ├── protectsfromforgery.md
│   │   │   │   │       │   │   ├── provides.md
│   │   │   │   │       │   │   ├── redirectto.md
│   │   │   │   │       │   │   ├── rendernothing.md
│   │   │   │   │       │   │   ├── renderpartial.md
│   │   │   │   │       │   │   ├── rendertext.md
│   │   │   │   │       │   │   ├── renderview.md
│   │   │   │   │       │   │   ├── renderwith.md
│   │   │   │   │       │   │   ├── response.md
│   │   │   │   │       │   │   ├── sendemail.md
│   │   │   │   │       │   │   ├── sendfile.md
│   │   │   │   │       │   │   ├── setfilterchain.md
│   │   │   │   │       │   │   ├── setpagination.md
│   │   │   │   │       │   │   ├── setresponse.md
│   │   │   │   │       │   │   ├── setverificationchain.md
│   │   │   │   │       │   │   ├── useslayout.md
│   │   │   │   │       │   │   ├── verificationchain.md
│   │   │   │   │       │   │   └── verifies.md
│   │   │   │   │       │   ├── global-helpers/
│   │   │   │   │       │   │   ├── capitalize.md
│   │   │   │   │       │   │   ├── controller.md
│   │   │   │   │       │   │   ├── deobfuscateparam.md
│   │   │   │   │       │   │   ├── distanceoftimeinwords.md
│   │   │   │   │       │   │   ├── excerpt.md
│   │   │   │   │       │   │   ├── humanize.md
│   │   │   │   │       │   │   ├── hyphenize.md
│   │   │   │   │       │   │   ├── index.md
│   │   │   │   │       │   │   ├── mimetypes.md
│   │   │   │   │       │   │   ├── model.md
│   │   │   │   │       │   │   ├── obfuscateparam.md
│   │   │   │   │       │   │   ├── pluginnames.md
│   │   │   │   │       │   │   ├── pluralize.md
│   │   │   │   │       │   │   ├── singularize.md
│   │   │   │   │       │   │   ├── timeagoinwords.md
│   │   │   │   │       │   │   ├── timeuntilinwords.md
│   │   │   │   │       │   │   ├── titleize.md
│   │   │   │   │       │   │   ├── truncate.md
│   │   │   │   │       │   │   ├── urlfor.md
│   │   │   │   │       │   │   └── wordtruncate.md
│   │   │   │   │       │   ├── index.md
│   │   │   │   │       │   ├── migrator/
│   │   │   │   │       │   │   ├── addcolumn.md
│   │   │   │   │       │   │   ├── addforeignkey.md
│   │   │   │   │       │   │   ├── addindex.md
│   │   │   │   │       │   │   ├── addrecord.md
│   │   │   │   │       │   │   ├── addreference.md
│   │   │   │   │       │   │   ├── biginteger.md
│   │   │   │   │       │   │   ├── binary.md
│   │   │   │   │       │   │   ├── boolean.md
│   │   │   │   │       │   │   ├── change.md
│   │   │   │   │       │   │   ├── changecolumn.md
│   │   │   │   │       │   │   ├── changetable.md
│   │   │   │   │       │   │   ├── char.md
│   │   │   │   │       │   │   ├── column.md
│   │   │   │   │       │   │   ├── create.md
│   │   │   │   │       │   │   ├── createmigration.md
│   │   │   │   │       │   │   ├── createtable.md
│   │   │   │   │       │   │   ├── createview.md
│   │   │   │   │       │   │   ├── date.md
│   │   │   │   │       │   │   ├── datetime.md
│   │   │   │   │       │   │   ├── decimal.md
│   │   │   │   │       │   │   ├── down.md
│   │   │   │   │       │   │   ├── dropforeignkey.md
│   │   │   │   │       │   │   ├── dropreference.md
│   │   │   │   │       │   │   ├── droptable.md
│   │   │   │   │       │   │   ├── dropview.md
│   │   │   │   │       │   │   ├── execute.md
│   │   │   │   │       │   │   ├── float.md
│   │   │   │   │       │   │   ├── getavailablemigrations.md
│   │   │   │   │       │   │   ├── getcurrentmigrationversion.md
│   │   │   │   │       │   │   ├── index.md
│   │   │   │   │       │   │   ├── integer.md
│   │   │   │   │       │   │   ├── migrateto.md
│   │   │   │   │       │   │   ├── migratetolatest.md
│   │   │   │   │       │   │   ├── primarykey.md
│   │   │   │   │       │   │   ├── redomigration.md
│   │   │   │   │       │   │   ├── references.md
│   │   │   │   │       │   │   ├── removecolumn.md
│   │   │   │   │       │   │   ├── removeindex.md
│   │   │   │   │       │   │   ├── removerecord.md
│   │   │   │   │       │   │   ├── renamecolumn.md
│   │   │   │   │       │   │   ├── renametable.md
│   │   │   │   │       │   │   ├── string.md
│   │   │   │   │       │   │   ├── text.md
│   │   │   │   │       │   │   ├── time.md
│   │   │   │   │       │   │   ├── timestamp.md
│   │   │   │   │       │   │   ├── timestamps.md
│   │   │   │   │       │   │   ├── uniqueidentifier.md
│   │   │   │   │       │   │   ├── up.md
│   │   │   │   │       │   │   └── updaterecord.md
│   │   │   │   │       │   ├── miscellaneous/
│   │   │   │   │       │   │   ├── announce.md
│   │   │   │   │       │   │   ├── assert.md
│   │   │   │   │       │   │   ├── fail.md
│   │   │   │   │       │   │   ├── index.md
│   │   │   │   │       │   │   └── testexample.md
│   │   │   │   │       │   ├── model-class/
│   │   │   │   │       │   │   ├── average.md
│   │   │   │   │       │   │   ├── columndataforproperty.md
│   │   │   │   │       │   │   ├── columnforproperty.md
│   │   │   │   │       │   │   ├── columnnames.md
│   │   │   │   │       │   │   ├── columns.md
│   │   │   │   │       │   │   ├── count.md
│   │   │   │   │       │   │   ├── create.md
│   │   │   │   │       │   │   ├── deleteall.md
│   │   │   │   │       │   │   ├── deletebykey.md
│   │   │   │   │       │   │   ├── deleteone.md
│   │   │   │   │       │   │   ├── exists.md
│   │   │   │   │       │   │   ├── findall.md
│   │   │   │   │       │   │   ├── findallkeys.md
│   │   │   │   │       │   │   ├── findbykey.md
│   │   │   │   │       │   │   ├── findfirst.md
│   │   │   │   │       │   │   ├── findlastone.md
│   │   │   │   │       │   │   ├── findone.md
│   │   │   │   │       │   │   ├── gettablenameprefix.md
│   │   │   │   │       │   │   ├── index.md
│   │   │   │   │       │   │   ├── invokewithtransaction.md
│   │   │   │   │       │   │   ├── isclass.md
│   │   │   │   │       │   │   ├── isinstance.md
│   │   │   │   │       │   │   ├── maximum.md
│   │   │   │   │       │   │   ├── minimum.md
│   │   │   │   │       │   │   ├── new.md
│   │   │   │   │       │   │   ├── onmissingmethod.md
│   │   │   │   │       │   │   ├── primarykey.md
│   │   │   │   │       │   │   ├── primarykeys.md
│   │   │   │   │       │   │   ├── propertynames.md
│   │   │   │   │       │   │   ├── save.md
│   │   │   │   │       │   │   ├── sum.md
│   │   │   │   │       │   │   ├── tablename.md
│   │   │   │   │       │   │   ├── updateall.md
│   │   │   │   │       │   │   ├── updatebykey.md
│   │   │   │   │       │   │   ├── updateone.md
│   │   │   │   │       │   │   └── validationtypeforproperty.md
│   │   │   │   │       │   ├── model-configuration/
│   │   │   │   │       │   │   ├── accessibleproperties.md
│   │   │   │   │       │   │   ├── aftercreate.md
│   │   │   │   │       │   │   ├── afterdelete.md
│   │   │   │   │       │   │   ├── afterfind.md
│   │   │   │   │       │   │   ├── afterinitialization.md
│   │   │   │   │       │   │   ├── afternew.md
│   │   │   │   │       │   │   ├── aftersave.md
│   │   │   │   │       │   │   ├── afterupdate.md
│   │   │   │   │       │   │   ├── aftervalidation.md
│   │   │   │   │       │   │   ├── aftervalidationoncreate.md
│   │   │   │   │       │   │   ├── aftervalidationonupdate.md
│   │   │   │   │       │   │   ├── automaticvalidations.md
│   │   │   │   │       │   │   ├── beforecreate.md
│   │   │   │   │       │   │   ├── beforedelete.md
│   │   │   │   │       │   │   ├── beforesave.md
│   │   │   │   │       │   │   ├── beforeupdate.md
│   │   │   │   │       │   │   ├── beforevalidation.md
│   │   │   │   │       │   │   ├── beforevalidationoncreate.md
│   │   │   │   │       │   │   ├── beforevalidationonupdate.md
│   │   │   │   │       │   │   ├── belongsto.md
│   │   │   │   │       │   │   ├── datasource.md
│   │   │   │   │       │   │   ├── hasmany.md
│   │   │   │   │       │   │   ├── hasone.md
│   │   │   │   │       │   │   ├── index.md
│   │   │   │   │       │   │   ├── nestedproperties.md
│   │   │   │   │       │   │   ├── property.md
│   │   │   │   │       │   │   ├── protectedproperties.md
│   │   │   │   │       │   │   ├── setprimarykey.md
│   │   │   │   │       │   │   ├── setprimarykeys.md
│   │   │   │   │       │   │   ├── settablenameprefix.md
│   │   │   │   │       │   │   ├── table.md
│   │   │   │   │       │   │   ├── validate.md
│   │   │   │   │       │   │   ├── validateoncreate.md
│   │   │   │   │       │   │   ├── validateonupdate.md
│   │   │   │   │       │   │   ├── validatesconfirmationof.md
│   │   │   │   │       │   │   ├── validatesexclusionof.md
│   │   │   │   │       │   │   ├── validatesformatof.md
│   │   │   │   │       │   │   ├── validatesinclusionof.md
│   │   │   │   │       │   │   ├── validateslengthof.md
│   │   │   │   │       │   │   ├── validatesnumericalityof.md
│   │   │   │   │       │   │   ├── validatespresenceof.md
│   │   │   │   │       │   │   └── validatesuniquenessof.md
│   │   │   │   │       │   ├── model-object/
│   │   │   │   │       │   │   ├── adderror.md
│   │   │   │   │       │   │   ├── adderrortobase.md
│   │   │   │   │       │   │   ├── allchanges.md
│   │   │   │   │       │   │   ├── allerrors.md
│   │   │   │   │       │   │   ├── changedfrom.md
│   │   │   │   │       │   │   ├── changedproperties.md
│   │   │   │   │       │   │   ├── clearchangeinformation.md
│   │   │   │   │       │   │   ├── clearerrors.md
│   │   │   │   │       │   │   ├── compareto.md
│   │   │   │   │       │   │   ├── delete.md
│   │   │   │   │       │   │   ├── errorcount.md
│   │   │   │   │       │   │   ├── errorson.md
│   │   │   │   │       │   │   ├── errorsonbase.md
│   │   │   │   │       │   │   ├── haschanged.md
│   │   │   │   │       │   │   ├── haserrors.md
│   │   │   │   │       │   │   ├── hasproperty.md
│   │   │   │   │       │   │   ├── index.md
│   │   │   │   │       │   │   ├── isnew.md
│   │   │   │   │       │   │   ├── ispersisted.md
│   │   │   │   │       │   │   ├── key.md
│   │   │   │   │       │   │   ├── properties.md
│   │   │   │   │       │   │   ├── propertyisblank.md
│   │   │   │   │       │   │   ├── propertyispresent.md
│   │   │   │   │       │   │   ├── reload.md
│   │   │   │   │       │   │   ├── setproperties.md
│   │   │   │   │       │   │   ├── toggle.md
│   │   │   │   │       │   │   ├── update.md
│   │   │   │   │       │   │   ├── updateproperty.md
│   │   │   │   │       │   │   └── valid.md
│   │   │   │   │       │   ├── test-model/
│   │   │   │   │       │   │   ├── debug.md
│   │   │   │   │       │   │   ├── index.md
│   │   │   │   │       │   │   └── raised.md
│   │   │   │   │       │   ├── test-model-configuration/
│   │   │   │   │       │   │   ├── afterall.md
│   │   │   │   │       │   │   ├── beforeall.md
│   │   │   │   │       │   │   ├── index.md
│   │   │   │   │       │   │   ├── packagesetup.md
│   │   │   │   │       │   │   ├── packageteardown.md
│   │   │   │   │       │   │   ├── setup.md
│   │   │   │   │       │   │   └── teardown.md
│   │   │   │   │       │   └── view-helpers/
│   │   │   │   │       │       ├── authenticitytokenfield.md
│   │   │   │   │       │       ├── autolink.md
│   │   │   │   │       │       ├── buttontag.md
│   │   │   │   │       │       ├── buttonto.md
│   │   │   │   │       │       ├── checkbox.md
│   │   │   │   │       │       ├── checkboxtag.md
│   │   │   │   │       │       ├── contentfor.md
│   │   │   │   │       │       ├── contentforlayout.md
│   │   │   │   │       │       ├── csrfmetatags.md
│   │   │   │   │       │       ├── cycle.md
│   │   │   │   │       │       ├── dateselect.md
│   │   │   │   │       │       ├── dateselecttags.md
│   │   │   │   │       │       ├── datetimeselect.md
│   │   │   │   │       │       ├── datetimeselecttags.md
│   │   │   │   │       │       ├── dayselecttag.md
│   │   │   │   │       │       ├── endformtag.md
│   │   │   │   │       │       ├── errormessageon.md
│   │   │   │   │       │       ├── errormessagesfor.md
│   │   │   │   │       │       ├── filefield.md
│   │   │   │   │       │       ├── filefieldtag.md
│   │   │   │   │       │       ├── flashmessages.md
│   │   │   │   │       │       ├── hasmanycheckbox.md
│   │   │   │   │       │       ├── hasmanyradiobutton.md
│   │   │   │   │       │       ├── hiddenfield.md
│   │   │   │   │       │       ├── hiddenfieldtag.md
│   │   │   │   │       │       ├── highlight.md
│   │   │   │   │       │       ├── hourselecttag.md
│   │   │   │   │       │       ├── imagetag.md
│   │   │   │   │       │       ├── includecontent.md
│   │   │   │   │       │       ├── includedinobject.md
│   │   │   │   │       │       ├── includelayout.md
│   │   │   │   │       │       ├── includepartial.md
│   │   │   │   │       │       ├── index.md
│   │   │   │   │       │       ├── javascriptincludetag.md
│   │   │   │   │       │       ├── linkto.md
│   │   │   │   │       │       ├── mailto.md
│   │   │   │   │       │       ├── minuteselecttag.md
│   │   │   │   │       │       ├── monthselecttag.md
│   │   │   │   │       │       ├── paginationlinks.md
│   │   │   │   │       │       ├── passwordfield.md
│   │   │   │   │       │       ├── passwordfieldtag.md
│   │   │   │   │       │       ├── radiobutton.md
│   │   │   │   │       │       ├── radiobuttontag.md
│   │   │   │   │       │       ├── resetcycle.md
│   │   │   │   │       │       ├── secondselecttag.md
│   │   │   │   │       │       ├── select.md
│   │   │   │   │       │       ├── selecttag.md
│   │   │   │   │       │       ├── simpleformat.md
│   │   │   │   │       │       ├── startformtag.md
│   │   │   │   │       │       ├── striplinks.md
│   │   │   │   │       │       ├── striptags.md
│   │   │   │   │       │       ├── stylesheetlinktag.md
│   │   │   │   │       │       ├── submittag.md
│   │   │   │   │       │       ├── textarea.md
│   │   │   │   │       │       ├── textareatag.md
│   │   │   │   │       │       ├── textfield.md
│   │   │   │   │       │       ├── textfieldtag.md
│   │   │   │   │       │       ├── timeselect.md
│   │   │   │   │       │       ├── timeselecttags.md
│   │   │   │   │       │       └── yearselecttag.md
│   │   │   │   │       ├── v3-0-0/
│   │   │   │   │       │   ├── configuration/
│   │   │   │   │       │   │   ├── addformat.md
│   │   │   │   │       │   │   ├── collection.md
│   │   │   │   │       │   │   ├── constraints.md
│   │   │   │   │       │   │   ├── controller.md
│   │   │   │   │       │   │   ├── delete.md
│   │   │   │   │       │   │   ├── end.md
│   │   │   │   │       │   │   ├── get.md
│   │   │   │   │       │   │   ├── index.md
│   │   │   │   │       │   │   ├── mapper.md
│   │   │   │   │       │   │   ├── member.md
│   │   │   │   │       │   │   ├── namespace.md
│   │   │   │   │       │   │   ├── package.md
│   │   │   │   │       │   │   ├── patch.md
│   │   │   │   │       │   │   ├── post.md
│   │   │   │   │       │   │   ├── put.md
│   │   │   │   │       │   │   ├── resource.md
│   │   │   │   │       │   │   ├── resources.md
│   │   │   │   │       │   │   ├── root.md
│   │   │   │   │       │   │   ├── scope.md
│   │   │   │   │       │   │   ├── set.md
│   │   │   │   │       │   │   └── wildcard.md
│   │   │   │   │       │   ├── controller/
│   │   │   │   │       │   │   ├── authenticitytoken.md
│   │   │   │   │       │   │   ├── caches.md
│   │   │   │   │       │   │   ├── clearcachableactions.md
│   │   │   │   │       │   │   ├── filterchain.md
│   │   │   │   │       │   │   ├── filters.md
│   │   │   │   │       │   │   ├── flash.md
│   │   │   │   │       │   │   ├── flashclear.md
│   │   │   │   │       │   │   ├── flashcount.md
│   │   │   │   │       │   │   ├── flashdelete.md
│   │   │   │   │       │   │   ├── flashinsert.md
│   │   │   │   │       │   │   ├── flashisempty.md
│   │   │   │   │       │   │   ├── flashkeep.md
│   │   │   │   │       │   │   ├── flashkeyexists.md
│   │   │   │   │       │   │   ├── getemails.md
│   │   │   │   │       │   │   ├── getfiles.md
│   │   │   │   │       │   │   ├── getredirect.md
│   │   │   │   │       │   │   ├── index.md
│   │   │   │   │       │   │   ├── isajax.md
│   │   │   │   │       │   │   ├── isdelete.md
│   │   │   │   │       │   │   ├── isget.md
│   │   │   │   │       │   │   ├── ishead.md
│   │   │   │   │       │   │   ├── isoptions.md
│   │   │   │   │       │   │   ├── ispatch.md
│   │   │   │   │       │   │   ├── ispost.md
│   │   │   │   │       │   │   ├── isput.md
│   │   │   │   │       │   │   ├── issecure.md
│   │   │   │   │       │   │   ├── onlyprovides.md
│   │   │   │   │       │   │   ├── pagination.md
│   │   │   │   │       │   │   ├── processaction.md
│   │   │   │   │       │   │   ├── processrequest.md
│   │   │   │   │       │   │   ├── protectsfromforgery.md
│   │   │   │   │       │   │   ├── provides.md
│   │   │   │   │       │   │   ├── redirectto.md
│   │   │   │   │       │   │   ├── rendernothing.md
│   │   │   │   │       │   │   ├── renderpartial.md
│   │   │   │   │       │   │   ├── rendertext.md
│   │   │   │   │       │   │   ├── renderview.md
│   │   │   │   │       │   │   ├── renderwith.md
│   │   │   │   │       │   │   ├── response.md
│   │   │   │   │       │   │   ├── sendemail.md
│   │   │   │   │       │   │   ├── sendfile.md
│   │   │   │   │       │   │   ├── setfilterchain.md
│   │   │   │   │       │   │   ├── setflashstorage.md
│   │   │   │   │       │   │   ├── setpagination.md
│   │   │   │   │       │   │   ├── setresponse.md
│   │   │   │   │       │   │   ├── setverificationchain.md
│   │   │   │   │       │   │   ├── useslayout.md
│   │   │   │   │       │   │   ├── verificationchain.md
│   │   │   │   │       │   │   └── verifies.md
│   │   │   │   │       │   ├── global-helpers/
│   │   │   │   │       │   │   ├── capitalize.md
│   │   │   │   │       │   │   ├── controller.md
│   │   │   │   │       │   │   ├── deobfuscateparam.md
│   │   │   │   │       │   │   ├── distanceoftimeinwords.md
│   │   │   │   │       │   │   ├── excerpt.md
│   │   │   │   │       │   │   ├── humanize.md
│   │   │   │   │       │   │   ├── hyphenize.md
│   │   │   │   │       │   │   ├── index.md
│   │   │   │   │       │   │   ├── mimetypes.md
│   │   │   │   │       │   │   ├── model.md
│   │   │   │   │       │   │   ├── obfuscateparam.md
│   │   │   │   │       │   │   ├── pluginnames.md
│   │   │   │   │       │   │   ├── pluralize.md
│   │   │   │   │       │   │   ├── singularize.md
│   │   │   │   │       │   │   ├── timeagoinwords.md
│   │   │   │   │       │   │   ├── timeuntilinwords.md
│   │   │   │   │       │   │   ├── titleize.md
│   │   │   │   │       │   │   ├── truncate.md
│   │   │   │   │       │   │   ├── urlfor.md
│   │   │   │   │       │   │   └── wordtruncate.md
│   │   │   │   │       │   ├── index.md
│   │   │   │   │       │   ├── migrator/
│   │   │   │   │       │   │   ├── addcolumn.md
│   │   │   │   │       │   │   ├── addforeignkey.md
│   │   │   │   │       │   │   ├── addindex.md
│   │   │   │   │       │   │   ├── addrecord.md
│   │   │   │   │       │   │   ├── addreference.md
│   │   │   │   │       │   │   ├── biginteger.md
│   │   │   │   │       │   │   ├── binary.md
│   │   │   │   │       │   │   ├── boolean.md
│   │   │   │   │       │   │   ├── change.md
│   │   │   │   │       │   │   ├── changecolumn.md
│   │   │   │   │       │   │   ├── changetable.md
│   │   │   │   │       │   │   ├── char.md
│   │   │   │   │       │   │   ├── column.md
│   │   │   │   │       │   │   ├── create.md
│   │   │   │   │       │   │   ├── createmigration.md
│   │   │   │   │       │   │   ├── createtable.md
│   │   │   │   │       │   │   ├── createview.md
│   │   │   │   │       │   │   ├── date.md
│   │   │   │   │       │   │   ├── datetime.md
│   │   │   │   │       │   │   ├── decimal.md
│   │   │   │   │       │   │   ├── down.md
│   │   │   │   │       │   │   ├── dropforeignkey.md
│   │   │   │   │       │   │   ├── dropreference.md
│   │   │   │   │       │   │   ├── droptable.md
│   │   │   │   │       │   │   ├── dropview.md
│   │   │   │   │       │   │   ├── execute.md
│   │   │   │   │       │   │   ├── float.md
│   │   │   │   │       │   │   ├── getavailablemigrations.md
│   │   │   │   │       │   │   ├── getcurrentmigrationversion.md
│   │   │   │   │       │   │   ├── index.md
│   │   │   │   │       │   │   ├── integer.md
│   │   │   │   │       │   │   ├── migrateto.md
│   │   │   │   │       │   │   ├── migratetolatest.md
│   │   │   │   │       │   │   ├── primarykey.md
│   │   │   │   │       │   │   ├── redomigration.md
│   │   │   │   │       │   │   ├── references.md
│   │   │   │   │       │   │   ├── removecolumn.md
│   │   │   │   │       │   │   ├── removeindex.md
│   │   │   │   │       │   │   ├── removerecord.md
│   │   │   │   │       │   │   ├── renamecolumn.md
│   │   │   │   │       │   │   ├── renametable.md
│   │   │   │   │       │   │   ├── string.md
│   │   │   │   │       │   │   ├── text.md
│   │   │   │   │       │   │   ├── time.md
│   │   │   │   │       │   │   ├── timestamp.md
│   │   │   │   │       │   │   ├── timestamps.md
│   │   │   │   │       │   │   ├── uniqueidentifier.md
│   │   │   │   │       │   │   ├── up.md
│   │   │   │   │       │   │   └── updaterecord.md
│   │   │   │   │       │   ├── miscellaneous/
│   │   │   │   │       │   │   ├── announce.md
│   │   │   │   │       │   │   ├── assert.md
│   │   │   │   │       │   │   ├── fail.md
│   │   │   │   │       │   │   ├── getroutes.md
│   │   │   │   │       │   │   └── index.md
│   │   │   │   │       │   ├── model-class/
│   │   │   │   │       │   │   ├── average.md
│   │   │   │   │       │   │   ├── columndataforproperty.md
│   │   │   │   │       │   │   ├── columnforproperty.md
│   │   │   │   │       │   │   ├── columnnames.md
│   │   │   │   │       │   │   ├── columns.md
│   │   │   │   │       │   │   ├── count.md
│   │   │   │   │       │   │   ├── create.md
│   │   │   │   │       │   │   ├── deleteall.md
│   │   │   │   │       │   │   ├── deletebykey.md
│   │   │   │   │       │   │   ├── deleteone.md
│   │   │   │   │       │   │   ├── exists.md
│   │   │   │   │       │   │   ├── findall.md
│   │   │   │   │       │   │   ├── findallkeys.md
│   │   │   │   │       │   │   ├── findbykey.md
│   │   │   │   │       │   │   ├── findfirst.md
│   │   │   │   │       │   │   ├── findlastone.md
│   │   │   │   │       │   │   ├── findone.md
│   │   │   │   │       │   │   ├── gettablenameprefix.md
│   │   │   │   │       │   │   ├── index.md
│   │   │   │   │       │   │   ├── invokewithtransaction.md
│   │   │   │   │       │   │   ├── isclass.md
│   │   │   │   │       │   │   ├── isinstance.md
│   │   │   │   │       │   │   ├── maximum.md
│   │   │   │   │       │   │   ├── minimum.md
│   │   │   │   │       │   │   ├── new.md
│   │   │   │   │       │   │   ├── onmissingmethod.md
│   │   │   │   │       │   │   ├── primarykey.md
│   │   │   │   │       │   │   ├── primarykeys.md
│   │   │   │   │       │   │   ├── propertynames.md
│   │   │   │   │       │   │   ├── save.md
│   │   │   │   │       │   │   ├── sum.md
│   │   │   │   │       │   │   ├── tablename.md
│   │   │   │   │       │   │   ├── updateall.md
│   │   │   │   │       │   │   ├── updatebykey.md
│   │   │   │   │       │   │   ├── updateone.md
│   │   │   │   │       │   │   └── validationtypeforproperty.md
│   │   │   │   │       │   ├── model-configuration/
│   │   │   │   │       │   │   ├── accessibleproperties.md
│   │   │   │   │       │   │   ├── aftercreate.md
│   │   │   │   │       │   │   ├── afterdelete.md
│   │   │   │   │       │   │   ├── afterfind.md
│   │   │   │   │       │   │   ├── afterinitialization.md
│   │   │   │   │       │   │   ├── afternew.md
│   │   │   │   │       │   │   ├── aftersave.md
│   │   │   │   │       │   │   ├── afterupdate.md
│   │   │   │   │       │   │   ├── aftervalidation.md
│   │   │   │   │       │   │   ├── aftervalidationoncreate.md
│   │   │   │   │       │   │   ├── aftervalidationonupdate.md
│   │   │   │   │       │   │   ├── automaticvalidations.md
│   │   │   │   │       │   │   ├── beforecreate.md
│   │   │   │   │       │   │   ├── beforedelete.md
│   │   │   │   │       │   │   ├── beforesave.md
│   │   │   │   │       │   │   ├── beforeupdate.md
│   │   │   │   │       │   │   ├── beforevalidation.md
│   │   │   │   │       │   │   ├── beforevalidationoncreate.md
│   │   │   │   │       │   │   ├── beforevalidationonupdate.md
│   │   │   │   │       │   │   ├── belongsto.md
│   │   │   │   │       │   │   ├── datasource.md
│   │   │   │   │       │   │   ├── hasmany.md
│   │   │   │   │       │   │   ├── hasone.md
│   │   │   │   │       │   │   ├── index.md
│   │   │   │   │       │   │   ├── nestedproperties.md
│   │   │   │   │       │   │   ├── property.md
│   │   │   │   │       │   │   ├── protectedproperties.md
│   │   │   │   │       │   │   ├── setprimarykey.md
│   │   │   │   │       │   │   ├── setprimarykeys.md
│   │   │   │   │       │   │   ├── settablenameprefix.md
│   │   │   │   │       │   │   ├── table.md
│   │   │   │   │       │   │   ├── validate.md
│   │   │   │   │       │   │   ├── validateoncreate.md
│   │   │   │   │       │   │   ├── validateonupdate.md
│   │   │   │   │       │   │   ├── validatesconfirmationof.md
│   │   │   │   │       │   │   ├── validatesexclusionof.md
│   │   │   │   │       │   │   ├── validatesformatof.md
│   │   │   │   │       │   │   ├── validatesinclusionof.md
│   │   │   │   │       │   │   ├── vali
Download .txt
SYMBOL INDEX (455 symbols across 57 files)

FILE: examples/starter-app/public/javascripts/custom.js
  function syntaxHighlight (line 16) | function syntaxHighlight(json) {

FILE: tools/deploy-dry-run-normalize.py
  function normalize_line (line 37) | def normalize_line(raw: str) -> str | None:
  function main (line 57) | def main() -> int:

FILE: tools/distribution-drafts/homebrew/wheels-be.rb
  class WheelsBe (line 22) | class WheelsBe < Formula
    method install (line 68) | def install

FILE: tools/distribution-drafts/scoop/build-manifests.py
  function cmd_wrapper (line 43) | def cmd_wrapper(channel: str) -> list[str]:
  function ps_quote_for_addcontent (line 129) | def ps_quote_for_addcontent(line: str) -> str:
  function build_pre_install (line 137) | def build_pre_install(channel: str) -> list[str]:
  function manifest_be (line 155) | def manifest_be() -> dict:
  function manifest_stable (line 219) | def manifest_stable() -> dict:
  function serialize (line 282) | def serialize(data: dict) -> str:
  function write_manifest (line 286) | def write_manifest(name: str, data: dict) -> bool:
  function check_manifest (line 299) | def check_manifest(name: str, data: dict) -> bool:
  function main (line 310) | def main() -> None:

FILE: tools/distribution-drafts/scoop/validate.py
  function fail (line 36) | def fail(msg: str) -> None:
  function warn (line 41) | def warn(msg: str) -> None:
  function info (line 45) | def info(msg: str) -> None:
  function extract_cmd_lines (line 49) | def extract_cmd_lines(manifest: dict) -> list[str]:
  function check_required_fields (line 61) | def check_required_fields(name: str, m: dict) -> None:
  function check_arch_arrays (line 69) | def check_arch_arrays(name: str, m: dict) -> None:
  function check_url_reachable (line 87) | def check_url_reachable(url: str, name: str) -> None:
  function check_wrapper (line 107) | def check_wrapper(name: str, m: dict) -> None:
  function check_bin_shim_collision (line 154) | def check_bin_shim_collision(manifests: dict[str, dict]) -> None:
  function check_channel_tag (line 169) | def check_channel_tag(name: str, m: dict, expected: str) -> None:
  function main (line 178) | def main() -> int:

FILE: tools/distribution-drafts/winget/validate.py
  function fail (line 31) | def fail(msg: str) -> None:
  function warn (line 36) | def warn(msg: str) -> None:
  function info (line 41) | def info(msg: str) -> None:
  function parse_yaml_lite (line 45) | def parse_yaml_lite(path: Path) -> dict[str, str]:
  function validate_package (line 64) | def validate_package(pkg_dir: Path, expected_id: str) -> None:
  function validate_version (line 70) | def validate_version(version_dir: Path, expected_id: str) -> None:
  function main (line 133) | def main() -> int:

FILE: tools/docker/testui/src/env.d.ts
  type ImportMetaEnv (line 3) | interface ImportMetaEnv {
  type ImportMeta (line 8) | interface ImportMeta {

FILE: tools/docker/testui/src/services/docker.service.ts
  class DockerService (line 13) | class DockerService {
    method usingMockData (line 23) | get usingMockData(): boolean {
    method getContainers (line 31) | async getContainers(forceRefresh: boolean = false): Promise<Container[...
    method processContainers (line 110) | private processContainers(apiContainers: any[]): Container[] {
    method determineContainerType (line 168) | private determineContainerType(container: any): 'engine' | 'database' ...
    method mapContainerStatus (line 211) | private mapContainerStatus(state: string, statusDetail: string): 'runn...
    method extractHealthStatus (line 234) | private extractHealthStatus(container: any): 'healthy' | 'unhealthy' |...
    method extractContainerPorts (line 256) | private extractContainerPorts(container: any): Record<string, string> {
    method calculateUptime (line 273) | private calculateUptime(status: string, statusDetail?: string): string...
    method updateEngineAndDatabaseCaches (line 283) | private updateEngineAndDatabaseCaches(containers: Container[]): void {
    method getEngineContainer (line 323) | async getEngineContainer(engine: CfmlEngineType | CfmlEngine): Promise...
    method getDatabaseContainer (line 343) | async getDatabaseContainer(database: DatabaseType | Database): Promise...
    method startContainer (line 382) | async startContainer(id: string): Promise<void> {
    method startService (line 390) | async startService(profile: string | null, service?: string): Promise<...
    method stopContainer (line 397) | async stopContainer(id: string): Promise<void> {
    method restartContainer (line 419) | async restartContainer(id: string): Promise<void> {
    method getContainerLogs (line 441) | async getContainerLogs(id: string, tail: number = 100): Promise<string...
    method checkPortAvailable (line 479) | async checkPortAvailable(port: number): Promise<boolean> {
    method getContainerProfiles (line 505) | async getContainerProfiles(): Promise<string[]> {
    method startProfile (line 552) | async startProfile(profile: string): Promise<void> {
    method getDockerInfo (line 575) | async getDockerInfo(): Promise<any> {
    method getMockContainers (line 594) | private getMockContainers(): Container[] {

FILE: tools/docker/testui/src/services/preflight.service.ts
  class PreflightService (line 5) | class PreflightService {
    method createPreflight (line 9) | async createPreflight(engineId: string, databaseId: string): Promise<P...
    method runPreflight (line 59) | async runPreflight(preflight: Preflight): Promise<Preflight> {
    method canRunStep (line 118) | private canRunStep(step: PreflightStep, allSteps: PreflightStep[]): bo...
    method cancelPreflight (line 131) | async cancelPreflight(preflight: Preflight): Promise<Preflight> {

FILE: tools/docker/testui/src/services/test.service.ts
  class TestService (line 6) | class TestService {
    method getTestBundles (line 12) | async getTestBundles(): Promise<TestBundle[]> {
    method getTestSpecs (line 59) | async getTestSpecs(bundleId: string): Promise<TestSpec[]> {
    method runTests (line 88) | async runTests(engine: CfmlEngine, database: Database, bundle: TestBun...
    method generateRealisticTestName (line 331) | private generateRealisticTestName(bundleId: string, index: number): st...
    method generateRealisticErrorMessage (line 464) | private generateRealisticErrorMessage(dbType: string, status: TestStat...
    method processTestResults (line 497) | private processTestResults(testRun: TestRun, testData: any): TestRun {
    method generateRealisticErrorDetail (line 650) | private generateRealisticErrorDetail(bundleId: string): string {
    method generateRandomTestName (line 664) | private generateRandomTestName(): string {
    method stopTests (line 688) | async stopTests(runId: string): Promise<void> {
    method getEnginePort (line 699) | private getEnginePort(engine: CfmlEngine): number {
    method getEngineApiName (line 716) | private getEngineApiName(engine: CfmlEngine): string | null {
    method getDatabaseConfig (line 732) | private getDatabaseConfig(database: Database): Record<string, string |...

FILE: tools/docker/testui/src/stores/databaseStore.ts
  function updateDatabaseStatus (line 94) | function updateDatabaseStatus(id: string, status: ContainerStatus, healt...
  function refreshDatabases (line 104) | async function refreshDatabases() {
  function startDatabase (line 111) | async function startDatabase(id: string) {
  function stopDatabase (line 122) | async function stopDatabase(id: string) {
  function restartDatabase (line 133) | async function restartDatabase(id: string) {

FILE: tools/docker/testui/src/stores/engineStore.ts
  function updateEngineStatus (line 68) | function updateEngineStatus(id: string, status: ContainerStatus, health?...
  function refreshEngines (line 78) | async function refreshEngines() {
  function startEngine (line 85) | async function startEngine(id: string) {
  function stopEngine (line 96) | async function stopEngine(id: string) {
  function restartEngine (line 107) | async function restartEngine(id: string) {

FILE: tools/docker/testui/src/stores/testStore.ts
  function addToQueue (line 95) | function addToQueue(engineId: string, databaseId: string, bundleId: stri...
  function clearQueue (line 113) | function clearQueue() {
  function removeFromQueue (line 120) | function removeFromQueue(index: number) {
  function startTests (line 126) | async function startTests() {
  function runNextTest (line 137) | async function runNextTest() {
  function simulateTestRun (line 190) | async function simulateTestRun(testRun: TestRun) {
  function generateRandomTestName (line 245) | function generateRandomTestName() {
  function stopTests (line 269) | function stopTests() {
  function clearResults (line 284) | function clearResults() {

FILE: tools/docker/testui/src/stores/themeStore.ts
  function setTheme (line 11) | function setTheme(newTheme: Theme) {
  function toggleCurrentTheme (line 17) | function toggleCurrentTheme() {

FILE: tools/docker/testui/src/types.ts
  type Container (line 2) | interface Container {
  type TestStatus (line 21) | enum TestStatus {
  type CfmlEngineType (line 30) | type CfmlEngineType = 'lucee5' | 'lucee6' | 'lucee7' | 'adobe2018' | 'ad...
  type CfmlEngine (line 33) | interface CfmlEngine {
  type DatabaseType (line 43) | type DatabaseType = 'h2' | 'mysql' | 'postgres' | 'sqlserver' | 'oracle';
  type Database (line 46) | interface Database {
  type TestBundle (line 56) | interface TestBundle {
  type TestSpec (line 64) | interface TestSpec {
  type TestResult (line 72) | interface TestResult {
  type TestRun (line 92) | interface TestRun {
  type TestQueueItem (line 114) | interface TestQueueItem {

FILE: tools/docker/testui/src/types/index.ts
  type CfmlEngine (line 2) | interface CfmlEngine {
  type Database (line 16) | interface Database {
  type ContainerStatus (line 34) | enum ContainerStatus {
  type ContainerHealth (line 43) | enum ContainerHealth {
  type Container (line 50) | interface Container {
  type ContainerProfile (line 62) | interface ContainerProfile {
  type TestBundle (line 73) | interface TestBundle {
  type TestSpec (line 80) | interface TestSpec {
  type TestStatus (line 87) | enum TestStatus {
  type TestResult (line 96) | interface TestResult {
  type TestRun (line 109) | interface TestRun {
  type TestQueue (line 129) | interface TestQueue {
  type TestQueueItem (line 135) | interface TestQueueItem {
  type PreflightStepStatus (line 145) | enum PreflightStepStatus {
  type PreflightStep (line 153) | interface PreflightStep {
  type Preflight (line 162) | interface Preflight {

FILE: tools/docker/testui/src/utils/api.ts
  constant API_BASE (line 7) | const API_BASE = import.meta.env.VITE_API_BASE || '/api';
  constant MOCK_API (line 8) | const MOCK_API = import.meta.env.VITE_MOCK_API === 'true';
  constant DEBUG_API (line 9) | const DEBUG_API = true;
  type ApiResponse (line 12) | interface ApiResponse<T> {
  type RetryConfig (line 21) | interface RetryConfig {
  function apiRequest (line 38) | async function apiRequest<T>(
  function mockApiResponse (line 206) | async function mockApiResponse<T>(
  method get (line 237) | async get<T>(endpoint: string, options: RequestInit = {}): Promise<ApiRe...
  method post (line 241) | async post<T>(endpoint: string, data?: any, options: RequestInit = {}): ...
  method put (line 249) | async put<T>(endpoint: string, data?: any, options: RequestInit = {}): P...
  method delete (line 257) | async delete<T>(endpoint: string, options: RequestInit = {}): Promise<Ap...
  method cfml (line 262) | async cfml<T>(engine: string, path: string, options: RequestInit = {}): ...

FILE: tools/docker/testui/src/utils/theme.ts
  type Theme (line 5) | type Theme = 'light' | 'dark';
  function getInitialTheme (line 8) | function getInitialTheme(): Theme {
  function toggleTheme (line 24) | function toggleTheme(currentTheme: Theme): Theme {
  function setupThemeListener (line 31) | function setupThemeListener(callback: (theme: Theme) => void): () => void {

FILE: tools/docs-validation/lib/agent.mjs
  constant PROMPT_PATH_API (line 9) | const PROMPT_PATH_API = resolve(new URL('../agent/prompt.md', import.met...
  constant PROMPT_PATH_GUIDE (line 10) | const PROMPT_PATH_GUIDE = resolve(new URL('../agent/prompt-guide.md', im...
  constant DEFAULT_MODEL (line 12) | const DEFAULT_MODEL = process.env.WHEELS_DOCS_MODEL ?? 'claude-sonnet-4-6';
  constant MAX_TURNS (line 13) | const MAX_TURNS = Number(process.env.WHEELS_DOCS_MAX_TURNS ?? 16);
  constant MAX_TOKENS (line 14) | const MAX_TOKENS = Number(process.env.WHEELS_DOCS_MAX_TOKENS ?? 8192);
  constant PROMPT_CACHE (line 16) | const PROMPT_CACHE = {};
  function getPrompt (line 17) | async function getPrompt(path) {
  function userPayload (line 22) | async function userPayload(fn) {
  function guidePayload (line 81) | async function guidePayload(relPath) {
  function runAgentForGuidePage (line 121) | async function runAgentForGuidePage(relPath, { logger = console.log } = ...
  function runAgentForFunction (line 132) | async function runAgentForFunction(fn, { logger = console.log } = {}) {
  function runAgentLoop (line 143) | async function runAgentLoop({ client, system, outcome, runState, exec, m...
  function truncate (line 226) | function truncate(s, n) {

FILE: tools/docs-validation/lib/guides.mjs
  constant REPO_ROOT (line 5) | const REPO_ROOT = resolve(new URL('../../..', import.meta.url).pathname);
  constant GUIDES_ROOT (line 6) | const GUIDES_ROOT = `${REPO_ROOT}/web/sites/guides/src/content/docs/v4-0...
  constant MDX_RE (line 8) | const MDX_RE = /\.(mdx?|md)$/i;
  constant FRONTMATTER_RE (line 9) | const FRONTMATTER_RE = /^---\n([\s\S]*?)\n---\n/;
  constant CODE_BLOCK_RE (line 10) | const CODE_BLOCK_RE = /```([a-zA-Z0-9_+-]*)([^\n]*)\n([\s\S]*?)```/g;
  constant TEST_META_RE (line 11) | const TEST_META_RE = /\{test:([^}]+)\}/;
  function relativeToGuidesRoot (line 13) | function relativeToGuidesRoot(absPath) {
  function listDirectories (line 17) | async function listDirectories() {
  function listPagesInDirectory (line 22) | async function listPagesInDirectory(dirName) {
  function collectPages (line 30) | async function collectPages(dir, out) {
  function loadGuidePage (line 40) | async function loadGuidePage(relPath) {
  function parseFrontmatter (line 54) | function parseFrontmatter(content) {
  function extractCodeBlocks (line 66) | function extractCodeBlocks(content) {
  function summarizeBlocks (line 90) | function summarizeBlocks(blocks) {

FILE: tools/docs-validation/lib/reference-store.mjs
  constant REPO_ROOT (line 5) | const REPO_ROOT = resolve(new URL('../../..', import.meta.url).pathname);
  constant REF_ROOT (line 6) | const REF_ROOT = `${REPO_ROOT}/vendor/wheels/public/docs/reference`;
  function slugFor (line 8) | function slugFor(scope, fnName) {
  function referencePath (line 12) | function referencePath(scope, fnName) {
  function readReference (line 16) | async function readReference(scope, fnName) {
  function readReferenceAnyScope (line 22) | async function readReferenceAnyScope(fnName, availableIn = []) {
  function writeReference (line 30) | async function writeReference(scope, fnName, body) {

FILE: tools/docs-validation/lib/snapshot.mjs
  constant REPO_ROOT (line 4) | const REPO_ROOT = resolve(new URL('../../..', import.meta.url).pathname);
  constant DEFAULT_SNAPSHOT (line 5) | const DEFAULT_SNAPSHOT = `${REPO_ROOT}/docs/api/v4.0.0.json`;
  function loadSnapshot (line 7) | async function loadSnapshot(path = DEFAULT_SNAPSHOT) {
  function listSections (line 16) | function listSections(snap) {
  function functionsInSection (line 20) | function functionsInSection(snap, sectionName) {
  function findFunction (line 24) | function findFunction(snap, name) {

FILE: tools/docs-validation/lib/source-map.mjs
  constant REPO_ROOT (line 5) | const REPO_ROOT = resolve(new URL('../../..', import.meta.url).pathname);
  constant VENDOR (line 6) | const VENDOR = `${REPO_ROOT}/vendor/wheels`;
  constant CACHE (line 7) | const CACHE = resolve(new URL('./', import.meta.url).pathname, '../sourc...
  constant SCAN_DIRS (line 9) | const SCAN_DIRS = ['model', 'controller', 'mapper', 'migrator', 'view', ...
  constant FN_RE (line 10) | const FN_RE = /^\s*(public|private|package|remote)?\s*(?:[A-Za-z][\w.]*\...
  function walk (line 12) | async function walk(dir) {
  function buildIndex (line 22) | async function buildIndex() {
  function getIndex (line 49) | async function getIndex({ refresh = false } = {}) {
  function locateFunction (line 62) | async function locateFunction(name) {

FILE: tools/docs-validation/lib/state.mjs
  constant STATE_FILE (line 5) | const STATE_FILE = resolve(new URL('../', import.meta.url).pathname, 'st...
  constant STATUSES (line 7) | const STATUSES = ['pending', 'in_progress', 'done', 'failed', 'needs_hum...
  function loadState (line 9) | async function loadState(path = STATE_FILE) {
  function saveState (line 14) | async function saveState(state, path = STATE_FILE) {
  function itemKey (line 19) | function itemKey(kind, id) {
  function getItem (line 23) | function getItem(state, kind, id) {
  function setItem (line 27) | function setItem(state, kind, id, patch) {
  function shouldAttempt (line 41) | function shouldAttempt(state, kind, id) {
  function summary (line 47) | function summary(state) {

FILE: tools/docs-validation/lib/tools.mjs
  constant REPO_ROOT (line 6) | const REPO_ROOT = resolve(new URL('../../..', import.meta.url).pathname);
  constant READ_ROOTS (line 8) | const READ_ROOTS = [
  constant WRITE_GLOBS (line 21) | const WRITE_GLOBS = [
  constant EDIT_GLOBS (line 26) | const EDIT_GLOBS = [
  function withinRoot (line 31) | function withinRoot(absPath) {
  function readAllowed (line 38) | function readAllowed(rel) {
  function writeAllowed (line 42) | function writeAllowed(rel) {
  function editAllowed (line 46) | function editAllowed(rel) {
  function resolveRel (line 50) | function resolveRel(path) {
  constant TOOLS (line 57) | const TOOLS = [
  function makeExecutor (line 127) | function makeExecutor({ outcome, runState }) {
  function doRead (line 157) | async function doRead(path) {
  function doWrite (line 171) | async function doWrite(path, content) {
  function doEdit (line 183) | async function doEdit(path, oldStr, newStr) {
  function doBash (line 200) | function doBash(command, timeoutSeconds = 60) {

FILE: tools/docs-validation/orchestrate.mjs
  constant USAGE (line 7) | const USAGE = `Usage:
  function runApiMode (line 69) | async function runApiMode() {
  function runGuideMode (line 160) | async function runGuideMode() {

FILE: tools/issue-resolver/lib/config.ts
  constant ENV_LOCAL (line 8) | const ENV_LOCAL = join(__dirname, "..", ".env.local");
  function required (line 14) | function required(name: string): string {
  type Config (line 41) | type Config = typeof config;

FILE: tools/issue-resolver/lib/github.ts
  constant BASE (line 3) | const BASE = "https://api.github.com";
  function gh (line 5) | async function gh<T>(path: string, init?: RequestInit): Promise<T> {
  type Issue (line 26) | interface Issue {
  type PullRequest (line 34) | interface PullRequest {
  type CheckRun (line 44) | interface CheckRun {
  function listOpenIssues (line 59) | async function listOpenIssues(): Promise<Issue[]> {
  function findExistingPrForBranch (line 69) | async function findExistingPrForBranch(
  function createDraftPr (line 78) | async function createDraftPr(args: {
  function postPrReview (line 95) | async function postPrReview(args: {
  function markPrReadyForReview (line 111) | async function markPrReadyForReview(prNodeId: string): Promise<void> {
  function getCheckRuns (line 137) | async function getCheckRuns(sha: string): Promise<CheckRun[]> {
  type CiStatus (line 144) | interface CiStatus {
  function summarizeChecks (line 150) | function summarizeChecks(checks: CheckRun[]): CiStatus {

FILE: tools/issue-resolver/lib/session.ts
  type AnyEvent (line 3) | type AnyEvent = { id: string; type: string; [k: string]: unknown };
  type RunTurnResult (line 5) | interface RunTurnResult {
  function runTurn (line 24) | async function runTurn(
  function waitForSessionToSettle (line 102) | async function waitForSessionToSettle(

FILE: tools/issue-resolver/run.ts
  type ReviewerVerdict (line 17) | interface ReviewerVerdict {
  function main (line 25) | async function main(): Promise<void> {
  function processIssue (line 76) | async function processIssue(issue: Issue, branch: string): Promise<strin...
  function reviewPr (line 236) | async function reviewPr(
  function waitForCiAndFix (line 290) | async function waitForCiAndFix(
  function pollCiUntilDone (line 363) | async function pollCiUntilDone(sha: string): Promise<ReturnType<typeof s...
  function extractVerdict (line 382) | function extractVerdict(text: string): ReviewerVerdict | null {
  function buildPrBody (line 403) | function buildPrBody(issue: Issue, fixerSummary: string): string {

FILE: tools/issue-resolver/setup.ts
  constant ENV_FILE (line 8) | const ENV_FILE = join(__dirname, ".env.local");
  constant FIXER_MODEL (line 10) | const FIXER_MODEL = process.env.FIXER_MODEL || "claude-opus-4-7";
  constant REVIEWER_MODEL (line 11) | const REVIEWER_MODEL = process.env.REVIEWER_MODEL || "claude-sonnet-4-6";
  constant FIXER_SYSTEM (line 13) | const FIXER_SYSTEM = `You are a Wheels framework engineer resolving GitH...
  constant REVIEWER_SYSTEM (line 34) | const REVIEWER_SYSTEM = `You are a senior code reviewer for Wheels (CFML...
  constant SEED_CONVENTIONS (line 56) | const SEED_CONVENTIONS = `# Wheels Conventions Cheat Sheet
  constant SEED_ISSUES_COMPLETED (line 71) | const SEED_ISSUES_COMPLETED = `# Completed Issues
  constant SEED_GOTCHAS (line 82) | const SEED_GOTCHAS = `# Recurring Gotchas
  constant SEED_REVIEW_PATTERNS (line 93) | const SEED_REVIEW_PATTERNS = `# Reviewer Patterns
  function main (line 103) | async function main() {

FILE: tools/vscode-ext/src/extension.js
  class WheelsCompletionProvider (line 8) | class WheelsCompletionProvider {
    method constructor (line 9) | constructor() {
    method provideCompletionItems (line 15) | provideCompletionItems(document, position) {
    method getSnippetContent (line 49) | getSnippetContent(snippetName) {
    method getDetailedDescription (line 88) | getDetailedDescription(snippetName) {
    method getComprehensiveDocumentation (line 99) | getComprehensiveDocumentation(snippetName) {
  class WheelsParameterTypoDetector (line 158) | class WheelsParameterTypoDetector {
    method constructor (line 159) | constructor() {
    method validateDocument (line 165) | validateDocument(document) {
    method checkParameterTypos (line 177) | checkParameterTypos(text, document, diagnostics) {
    method parseNamedParameters (line 223) | parseNamedParameters(parametersString) {
    method skipParameterValue (line 296) | skipParameterValue(parametersString, startIndex) {
    method isValidParameter (line 335) | isValidParameter(functionName, parameterName) {
    method suggestParameter (line 358) | suggestParameter(functionName, parameterName) {
    method calculateSimilarity (line 391) | calculateSimilarity(str1, str2) {
    method levenshteinDistance (line 402) | levenshteinDistance(str1, str2) {
    method pluralizeParameter (line 434) | pluralizeParameter(word) {
    method singularizeParameter (line 467) | singularizeParameter(word) {
    method loadWheelsParameters (line 506) | loadWheelsParameters() {
    method dispose (line 549) | dispose() {
  class WheelsParameterCompletionProvider (line 558) | class WheelsParameterCompletionProvider {
    method constructor (line 559) | constructor() {
    method provideCompletionItems (line 564) | provideCompletionItems(document, position, token, context) {
    method findCurrentFunctionCall (line 632) | findCurrentFunctionCall(lineText) {
    method getCurrentPartialParameter (line 673) | getCurrentPartialParameter(lineText, paramStart) {
    method loadWheelsParameters (line 688) | loadWheelsParameters() {
  class WheelsDefinitionProvider (line 735) | class WheelsDefinitionProvider {
    method constructor (line 736) | constructor() {
    method provideDefinition (line 740) | provideDefinition(document, position, token) {
    method findModelDefinition (line 768) | findModelDefinition(line, word, position, document) {
    method findControllerDefinition (line 789) | findControllerDefinition(line, word, position, document) {
    method findRouteDefinition (line 815) | findRouteDefinition(line, word, position, document) {
    method findViewDefinition (line 834) | findViewDefinition(line, word, position, document) {
    method createModelLocation (line 871) | createModelLocation(modelName) {
    method createControllerLocation (line 900) | createControllerLocation(controllerName, actionName = null) {
    method findControllerInSubdirectories (line 964) | findControllerInSubdirectories(basePath, controllerName) {
    method createRouteLocation (line 1000) | createRouteLocation(routeName) {
    method createViewLocation (line 1050) | createViewLocation(viewPath) {
    method findFunctionInFile (line 1083) | findFunctionInFile(filePath, functionName) {
    method capitalize (line 1112) | capitalize(str) {
  class WheelsSignatureHelpProvider (line 1124) | class WheelsSignatureHelpProvider {
    method constructor (line 1125) | constructor() {
    method provideSignatureHelp (line 1130) | provideSignatureHelp(document, position, token, context) {
    method findFunctionCall (line 1175) | findFunctionCall(linePrefix) {
    method countCommasInCall (line 1196) | countCommasInCall(linePrefix, startIndex) {
    method findActiveParameter (line 1238) | findActiveParameter(linePrefix, startIndex, parameters) {
    method findNextAvailableParameter (line 1295) | findNextAvailableParameter(parameters, providedParamNames) {
    method parseParameters (line 1309) | parseParameters(callContent) {
    method findParameterAtPosition (line 1393) | findParameterAtPosition(callContent, cursorPos) {
    method loadWheelsSignatures (line 1450) | loadWheelsSignatures() {
    method cleanParameterDescription (line 1521) | cleanParameterDescription(hint) {
    method cleanDescription (line 1538) | cleanDescription(hint) {
  class WheelsHoverProvider (line 1566) | class WheelsHoverProvider {
    method constructor (line 1567) | constructor() {
    method loadAllFunctions (line 1574) | loadAllFunctions() {
    method cleanDescription (line 1612) | cleanDescription(hint) {
    method parseParameters (line 1640) | parseParameters(params) {
    method getCategory (line 1652) | getCategory(func) {
    method provideHover (line 1663) | provideHover(document, position, token) {
    method isFunctionCall (line 1691) | isFunctionCall(document, range) {
    method isInStringOrComment (line 1752) | isInStringOrComment(document, position) {
    method isCommentLine (line 1802) | isCommentLine(lineText) {
    method createProfessionalHover (line 1814) | createProfessionalHover(func) {
    method buildSignature (line 1871) | buildSignature(func) {
    method buildExample (line 1884) | buildExample(func) {
    method getExampleValue (line 1902) | getExampleValue(param) {
    method getKeyParameters (line 1928) | getKeyParameters(func, limit = 4) {
    method getParameterDescription (line 1952) | getParameterDescription(param) {
  function createNewFileWithTemplate (line 2007) | async function createNewFileWithTemplate() {
  function getTemplateContentForSnippet (line 2069) | function getTemplateContentForSnippet(templateType) {
  function getDefaultTemplateData (line 2093) | function getDefaultTemplateData(templateType) {
  function createWheelsFile (line 2132) | async function createWheelsFile(type, uri) {
  function getTemplateData (line 2278) | function getTemplateData(type, fileName, targetDir) {
  function detectActionFromViewPath (line 2335) | function detectActionFromViewPath(fileName) {
  function getTemplateContentFromFiles (line 2357) | function getTemplateContentFromFiles(type, templateData) {
  function createBasicTemplate (line 2395) | function createBasicTemplate(type, templateData) {
  function replacePlaceholders (line 2425) | function replacePlaceholders(template, data) {
  function escapeRegExp (line 2439) | function escapeRegExp(string) {
  function capitalize (line 2446) | function capitalize(str) {
  function pluralize (line 2453) | function pluralize(str) {
  function activate (line 2501) | function activate(context) {
  function deactivate (line 2649) | function deactivate() {}

FILE: web/packages/ui/src/data/versions.ts
  type VersionStatus (line 13) | type VersionStatus = 'current' | 'snapshot' | 'archived';
  type VersionMeta (line 15) | interface VersionMeta {
  constant GUIDES_VERSIONS (line 33) | const GUIDES_VERSIONS: VersionMeta[] = [
  constant API_VERSIONS (line 41) | const API_VERSIONS: VersionMeta[] = [
  function versionsForHostname (line 58) | function versionsForHostname(hostname: string | undefined): VersionMeta[] {
  function findEquivalentPath (line 77) | function findEquivalentPath(
  type VersionOption (line 114) | interface VersionOption extends VersionMeta {
  type CollectionEntry (line 119) | interface CollectionEntry {
  function computeVersionOptions (line 136) | function computeVersionOptions(

FILE: web/scripts/generate-api-docs.mjs
  constant REPO_ROOT (line 15) | const REPO_ROOT = resolve(__dirname, '../..');
  function slugify (line 46) | function slugify(str) {
  function escapeYaml (line 53) | function escapeYaml(str) {
  function renderParameters (line 59) | function renderParameters(params) {
  function renderExtended (line 89) | function renderExtended(extended) {

FILE: web/scripts/recover-blog-images.mjs
  constant REPO_ROOT (line 24) | const REPO_ROOT = resolve(__dirname, '../..');
  constant POSTS_DIR (line 26) | const POSTS_DIR = join(REPO_ROOT, 'web/content/blog/posts');
  constant IMAGES_DIR (line 27) | const IMAGES_DIR = join(REPO_ROOT, 'web/sites/blog/public/blog-images');
  constant LOG_PATH (line 28) | const LOG_PATH = join(REPO_ROOT, 'web/scripts/.wayback-log.json');
  constant DRY_RUN (line 30) | const DRY_RUN = process.argv.includes('--dry-run');
  constant REQUEST_DELAY_MS (line 31) | const REQUEST_DELAY_MS = 1100;
  function urlToFilename (line 33) | function urlToFilename(url) {
  function getWaybackSnapshot (line 45) | async function getWaybackSnapshot(url) {
  function downloadImage (line 53) | async function downloadImage(snapshotUrl, outPath) {

FILE: web/scripts/visual-regression.mjs
  constant WEB_ROOT (line 29) | const WEB_ROOT = resolve(__dirname, '..');
  constant BASELINE_DIR (line 30) | const BASELINE_DIR = resolve(WEB_ROOT, 'tests/visual-baselines');
  constant DIFF_DIR (line 31) | const DIFF_DIR = resolve(WEB_ROOT, 'tests/visual-diffs');
  constant VIEWPORT (line 32) | const VIEWPORT = { width: 1280, height: 800 };
  constant FAIL_THRESHOLD_PIXELS (line 40) | const FAIL_THRESHOLD_PIXELS = 300;
  constant SITES (line 43) | const SITES = [
  constant MIME (line 68) | const MIME = {
  function startStaticServer (line 87) | async function startStaticServer(distDir) {
  function stopServer (line 131) | async function stopServer(server) {
  function fileExists (line 135) | async function fileExists(path) {
  function ensureBaselineDir (line 144) | async function ensureBaselineDir() {
  function ensureDiffDir (line 148) | async function ensureDiffDir() {
  function captureScreenshot (line 153) | async function captureScreenshot(browser, site) {
  function decodePng (line 184) | function decodePng(buffer) {
  function encodePng (line 188) | function encodePng(png) {
  function diffScreenshots (line 193) | function diffScreenshots(expectedBuf, actualBuf) {
  function runCheck (line 215) | async function runCheck({ update, siteFilter }) {

FILE: web/sites/blog/scripts/check-no-body-h1.mjs
  function bodyH1Count (line 25) | function bodyH1Count(text) {

FILE: web/sites/blog/src/pages/rss.xml.js
  function GET (line 4) | async function GET(context) {

FILE: web/sites/blog/src/utils/posts.ts
  type Post (line 3) | type Post = CollectionEntry<'posts'>;
  function getAllPosts (line 5) | async function getAllPosts(): Promise<Post[]> {
  function getAllTags (line 10) | async function getAllTags(): Promise<Map<string, number>> {
  function getPostsByTag (line 21) | async function getPostsByTag(tag: string): Promise<Post[]> {
  function formatDate (line 26) | function formatDate(d: Date): string {

FILE: web/sites/guides/astro.config.mjs
  function loadSidebar (line 10) | function loadSidebar(version) {
  function normalizeItem (line 25) | function normalizeItem(item) {
  function buildSidebarForVersion (line 44) | function buildSidebarForVersion(version) {

FILE: web/sites/guides/scripts/verify-docs/drivers/cli.mjs
  constant TRANSIENT_PATTERNS (line 22) | const TRANSIENT_PATTERNS = [
  function isTransient (line 30) | function isTransient(result) {
  function runCli (line 36) | async function runCli(example) {

FILE: web/sites/guides/scripts/verify-docs/drivers/compile.mjs
  function detectMode (line 7) | function detectMode() {
  function balanced (line 14) | function balanced(body) {
  function runNative (line 49) | async function runNative(body) {
  function runFallback (line 58) | function runFallback(body) {
  function runCompile (line 65) | async function runCompile(example) {

FILE: web/sites/guides/scripts/verify-docs/drivers/tutorial.mjs
  function findFreePort (line 14) | function findFreePort() {
  function rewriteLuceePorts (line 26) | async function rewriteLuceePorts(port, shutdownPort) {
  constant HTTP_ASSERT_RE (line 44) | const HTTP_ASSERT_RE = /^(GET|POST|PUT|PATCH|DELETE)\s+(\S+)\s*(?:→|->)\...
  function parseHttpAssert (line 46) | function parseHttpAssert(spec) {
  function fetchFromFixture (line 62) | async function fetchFromFixture(server, { method, path }) {
  class TutorialSession (line 69) | class TutorialSession {
    method constructor (line 70) | constructor() {
    method ensureInitialised (line 75) | async ensureInitialised() {
    method ensureServer (line 81) | async ensureServer() {
    method stopServer (line 109) | async stopServer() {
    method applyTutorialExample (line 116) | async applyTutorialExample(ex) {
    method applyCliExample (line 154) | async applyCliExample(ex) {
  function runCliInFixture (line 160) | async function runCliInFixture(ex) {
  function countRows (line 171) | async function countRows(table) {
  function waitForListening (line 180) | async function waitForListening(port, timeoutMs) {

FILE: web/sites/guides/scripts/verify-docs/lib/cli-assert.mjs
  function assertCliResult (line 13) | function assertCliResult(result, attrs) {

FILE: web/sites/guides/scripts/verify-docs/lib/exec.mjs
  function resolveWheels (line 14) | function resolveWheels() {
  constant RESOLVED_WHEELS (line 29) | const RESOLVED_WHEELS = resolveWheels();
  function runExec (line 40) | function runExec(program, args = [], opts = {}) {
  function tokenize (line 76) | function tokenize(command) {

FILE: web/sites/guides/scripts/verify-docs/lib/extract.mjs
  constant FENCE_RE (line 7) | const FENCE_RE = /^([ \t]*)```(\w+)([^\n]*)\n([\s\S]*?)\n\1```$/gm;
  function parseMeta (line 9) | function parseMeta(meta) {
  function lineAt (line 27) | function lineAt(content, offset) {
  function stripIndent (line 40) | function stripIndent(body, indent) {
  function extractExamples (line 48) | async function extractExamples(files) {

FILE: web/sites/guides/scripts/verify-docs/lib/fixtures.mjs
  function createFixture (line 14) | async function createFixture(name = 'fixture') {
  function destroyFixture (line 80) | async function destroyFixture(fixturePath) {

FILE: web/sites/guides/scripts/verify-docs/lib/orchestrator.mjs
  constant FM_RE (line 3) | const FM_RE = /^---\n([\s\S]*?)\n---/;
  constant ORDER_RE (line 4) | const ORDER_RE = /sidebar:\s*\n\s*order:\s*(\d+)/;
  function readSidebarOrder (line 6) | async function readSidebarOrder(file) {
  function enrichWithSidebarOrder (line 20) | async function enrichWithSidebarOrder(examples) {
  function partitionAndOrder (line 31) | function partitionAndOrder(examples) {

FILE: web/sites/guides/scripts/verify-docs/lib/report.mjs
  function printReport (line 5) | function printReport(results) {

FILE: web/sites/guides/scripts/verify-docs/lib/tutorial-fixture.mjs
  constant ROOT (line 7) | const ROOT = resolve(join(here, '..', 'fixtures', 'blog-tutorial'));
  constant PARENT (line 8) | const PARENT = dirname(ROOT);
  constant APP_NAME (line 9) | const APP_NAME = 'blog-tutorial';
  function fixturePath (line 11) | function fixturePath() {
  function resolveInside (line 15) | function resolveInside(relPath) {
  function resetFixture (line 27) | async function resetFixture() {
  function writeFixtureFile (line 42) | async function writeFixtureFile(relPath, body) {
  function appendFixtureFile (line 48) | async function appendFixtureFile(relPath, body) {
  function readFixtureFile (line 54) | async function readFixtureFile(relPath) {
  function runInFixture (line 59) | async function runInFixture(args, opts = {}) {

FILE: web/sites/guides/scripts/verify-docs/test/cli.test.mjs
  constant TIMEOUT (line 5) | const TIMEOUT = 120_000;

FILE: web/sites/guides/scripts/verify-docs/test/compile.test.mjs
  constant TIMEOUT (line 5) | const TIMEOUT = 60_000;

FILE: web/sites/guides/scripts/verify-docs/test/orchestrator.test.mjs
  function runEntry (line 13) | function runEntry(args) {

FILE: web/sites/guides/scripts/verify-docs/test/tutorial.test.mjs
  constant TIMEOUT (line 8) | const TIMEOUT = 180_000;
  constant ROOT (line 10) | const ROOT = join(here, '..', 'fixtures', 'blog-tutorial');

FILE: web/sites/guides/scripts/verify-docs/verify-docs.mjs
  constant DEFAULT_TARGET (line 11) | const DEFAULT_TARGET = 'src/content/docs/v4-0-1-snapshot';
  function collectMdx (line 13) | async function collectMdx(target) {
  function main (line 30) | async function main() {

FILE: web/sites/packages/src/lib/markdown.ts
  function renderMarkdown (line 23) | async function renderMarkdown(src: string): Promise<string> {

FILE: web/sites/packages/src/lib/registry.ts
  type ManifestVersion (line 1) | interface ManifestVersion {
  type Manifest (line 10) | interface Manifest {
  type PackageSummary (line 18) | interface PackageSummary {
  constant REPO (line 27) | const REPO = process.env.WHEELS_PACKAGES_REGISTRY ?? 'wheels-dev/wheels-...
  constant BRANCH (line 28) | const BRANCH = 'main';
  function getJson (line 31) | async function getJson(url: string): Promise<unknown> {
  function getText (line 39) | async function getText(url: string): Promise<string> {
  function listPackageNames (line 47) | async function listPackageNames(): Promise<string[]> {
  function fetchReadme (line 53) | async function fetchReadme(name: string): Promise<string> {
  function fetchManifest (line 58) | async function fetchManifest(name: string): Promise<Manifest> {
  function listAll (line 73) | async function listAll(): Promise<PackageSummary[]> {
Copy disabled (too large) Download .json
Condensed preview — 5263 files, each showing path, character count, and a content snippet. Download the .json file for the full structured content (28,268K chars).
[
  {
    "path": ".ai/README.md",
    "chars": 1651,
    "preview": "# Wheels Framework Reference Docs\n\nSearchable reference for CFML language and Wheels framework patterns.\n\n## CFML Langua"
  },
  {
    "path": ".ai/cfml/README.md",
    "chars": 2600,
    "preview": "# CFML Language Documentation\n\nThis section contains documentation for core CFML (ColdFusion Markup Language) concepts, "
  },
  {
    "path": ".ai/cfml/advanced/closures.md",
    "chars": 6020,
    "preview": "# Closures\n\n## Overview\nClosures in CFML are functions that have access to variables in their lexical environment. They "
  },
  {
    "path": ".ai/cfml/best-practices/modern-patterns.md",
    "chars": 10601,
    "preview": "# Modern CFML Patterns\n\n## Overview\nModern CFML development emphasizes script syntax, functional programming patterns, c"
  },
  {
    "path": ".ai/cfml/best-practices/performance.md",
    "chars": 10450,
    "preview": "# Performance Best Practices\n\n## Overview\nCFML performance optimization involves proper variable scoping, efficient data"
  },
  {
    "path": ".ai/cfml/components/component-basics.md",
    "chars": 4032,
    "preview": "# Component Basics\n\n## Overview\nComponents (CFCs) are CFML's object-oriented constructs that combine data (properties) a"
  },
  {
    "path": ".ai/cfml/components/functions.md",
    "chars": 6536,
    "preview": "# Component Functions\n\n## Overview\nFunctions (methods) in CFML components define the behavior and actions objects can pe"
  },
  {
    "path": ".ai/cfml/components/properties.md",
    "chars": 5199,
    "preview": "# Component Properties\n\n## Overview\nProperties in CFML components define the data/attributes that objects can hold. With"
  },
  {
    "path": ".ai/cfml/control-flow/conditionals.md",
    "chars": 5061,
    "preview": "# Conditionals\n\n## Overview\nConditionals in CFML allow you to execute different code paths based on boolean conditions. "
  },
  {
    "path": ".ai/cfml/control-flow/exception-handling.md",
    "chars": 7433,
    "preview": "# Exception Handling\n\n## Overview\nCFML provides comprehensive exception handling through try/catch/finally blocks, custo"
  },
  {
    "path": ".ai/cfml/control-flow/loops.md",
    "chars": 9526,
    "preview": "# Loops in CFML\n\n## Overview\nCFML provides several loop constructs for iterating over data and executing repetitive task"
  },
  {
    "path": ".ai/cfml/data-types/arrays/array-creation.md",
    "chars": 2505,
    "preview": "# Array Creation\n\n## Overview\nCFML arrays are dynamic, 1-indexed collections that can grow and shrink at runtime. They c"
  },
  {
    "path": ".ai/cfml/data-types/arrays/array-iteration.md",
    "chars": 4269,
    "preview": "# Array Iteration\n\n## Overview\nCFML provides multiple ways to iterate over arrays: traditional for loops, modern for-in "
  },
  {
    "path": ".ai/cfml/data-types/arrays/array-methods.md",
    "chars": 4265,
    "preview": "# Array Methods\n\n## Overview\nCFML provides extensive array manipulation capabilities through both traditional functions "
  },
  {
    "path": ".ai/cfml/data-types/numbers/numeric-basics.md",
    "chars": 3090,
    "preview": "# Numeric Basics\n\n## Overview\nCFML supports two primary numeric types: integers (whole numbers) and floats (decimal numb"
  },
  {
    "path": ".ai/cfml/data-types/scopes/variables-scope.md",
    "chars": 8904,
    "preview": "# Variables Scope in CFML\n\n## Overview\nThe `variables` scope is the default scope in CFML. Variables declared without an"
  },
  {
    "path": ".ai/cfml/data-types/strings/string-functions.md",
    "chars": 3137,
    "preview": "# String Functions\n\n## Overview\nCFML provides extensive built-in functions for string manipulation, including length cal"
  },
  {
    "path": ".ai/cfml/data-types/strings/string-interpolation.md",
    "chars": 2824,
    "preview": "# String Interpolation\n\n## Overview\nString interpolation in CFML allows embedding variable values and expressions direct"
  },
  {
    "path": ".ai/cfml/data-types/strings/string-literals.md",
    "chars": 1797,
    "preview": "# String Literals\n\n## Overview\nStrings in CFML store collections of characters and are backed by Java's immutable String"
  },
  {
    "path": ".ai/cfml/data-types/structures/struct-creation.md",
    "chars": 9071,
    "preview": "# Struct Creation in CFML\n\n## Overview\nCFML structures (similar to objects/dictionaries in other languages) are key-valu"
  },
  {
    "path": ".ai/cfml/data-types/structures/structure-basics.md",
    "chars": 2845,
    "preview": "# Structure Basics\n\n## Overview\nStructures in CFML are unordered collections of key-value pairs, similar to dictionaries"
  },
  {
    "path": ".ai/cfml/data-types/variable-scopes.md",
    "chars": 2589,
    "preview": "# Variable Scopes\n\n## Overview\nCFML organizes variables into different scopes based on context and persistence requireme"
  },
  {
    "path": ".ai/cfml/data-types/variables.md",
    "chars": 1774,
    "preview": "# Variables\n\n## Overview\nCFML variables are dynamic pointers to data that can hold any value type. They don't require ty"
  },
  {
    "path": ".ai/cfml/database/query-basics.md",
    "chars": 5553,
    "preview": "# Query Basics\n\n## Overview\nCFML provides simple yet powerful database querying capabilities through cfquery tags and qu"
  },
  {
    "path": ".ai/cfml/syntax/basic-syntax.md",
    "chars": 1422,
    "preview": "# Basic CFML Syntax\n\n## Overview\nCFML supports two syntax styles: tag-based syntax (for views/templates) and script synt"
  },
  {
    "path": ".ai/cfml/syntax/cfscript-vs-tags.md",
    "chars": 1663,
    "preview": "# CFScript vs Tags\n\n## Overview\nCFML offers two syntactic approaches: traditional tag-based syntax and modern script syn"
  },
  {
    "path": ".ai/cfml/syntax/comments.md",
    "chars": 2161,
    "preview": "# CFML Comments\n\n## Overview\nCFML supports multiple comment styles for different contexts: tag comments, script comments"
  },
  {
    "path": ".ai/cfml/syntax/hash-escaping.md",
    "chars": 7505,
    "preview": "# Hash/Pound Sign Escaping in CFML\n\n## Overview\nIn CFML, the hash symbol (#) has special meaning for variable interpolat"
  },
  {
    "path": ".ai/wheels/channels/channels.md",
    "chars": 9031,
    "preview": "# Channels — Pub/Sub for SSE\n\nChannels add a pub/sub abstraction on top of Wheels' existing Server-Sent Events (SSE) sup"
  },
  {
    "path": ".ai/wheels/controllers/api.md",
    "chars": 20790,
    "preview": "# API Controllers\n\n## Description\nComprehensive guide to building JSON and XML APIs with Wheels controllers, including R"
  },
  {
    "path": ".ai/wheels/cross-engine-compatibility.md",
    "chars": 24990,
    "preview": "# Cross-Engine Compatibility Guide\n\nWheels runs on multiple CFML engines (Lucee 5/6/7, Adobe CF 2018-2025, BoxLang) and "
  },
  {
    "path": ".ai/wheels/deploy.md",
    "chars": 7759,
    "preview": "# Deploy Reference\n\n`wheels deploy` ships a Dockerized Wheels app to production Linux servers via SSH. Ported from Basec"
  },
  {
    "path": ".ai/wheels/security/https-detection.md",
    "chars": 5056,
    "preview": "# HTTPS Detection\n\n## Description\nDetect whether the current request is using secure HTTPS protocol for implementing sec"
  },
  {
    "path": ".ai/wheels/snippets/controller-snippets.md",
    "chars": 5525,
    "preview": "# Controller Code Snippets\n\n## Description\nCommon controller patterns and code snippets for Wheels applications.\n\n## Bas"
  },
  {
    "path": ".ai/wheels/snippets/model-snippets.md",
    "chars": 3801,
    "preview": "# Model Code Snippets\n\n## Description\nCommon model patterns and code snippets for Wheels applications.\n\n## Basic Model S"
  },
  {
    "path": ".ai/wheels/testing/browser-testing.md",
    "chars": 3984,
    "preview": "# Browser Testing\n\nShipped in v4.0 across PRs #2113, #2115, #2116. Specs extend `wheels.wheelstest.BrowserTest` and driv"
  },
  {
    "path": ".ai/wheels/testing/onboarding-harness.md",
    "chars": 8569,
    "preview": "# Local Onboarding Harness\n\n`tools/test-onboarding.sh` is a local fresh-install simulator. It exercises\nthe same `wheels"
  },
  {
    "path": ".ai/wheels/troubleshooting/common-errors.md",
    "chars": 15095,
    "preview": "# Common Errors and Solutions\n\n## Description\nFrequent issues encountered when developing Wheels applications and their "
  },
  {
    "path": ".ai/wheels/troubleshooting/form-helper-errors.md",
    "chars": 4742,
    "preview": "# Wheels Form Helper Common Errors\n\n## Critical Anti-Pattern: submitTag Parameter Issues\n\n### ❌ **The Problem**\n```cfm\n<"
  },
  {
    "path": ".ai/wheels/views/query-association-patterns.md",
    "chars": 7014,
    "preview": "# Wheels Query vs Association Handling Patterns\n\n## Critical Anti-Pattern: Association Query Confusion\n\n### ❌ **The Prob"
  },
  {
    "path": ".ai/wheels/wheels-bot.md",
    "chars": 3170,
    "preview": "# Wheels Bot\n\n`wheels-bot[bot]` is a custom GitHub App that runs Claude-powered automation on issues and PRs in `wheels-"
  },
  {
    "path": ".cfformat.json",
    "chars": 2686,
    "preview": "{\n\t\"alignment.consecutive.assignments\": false,\n\t\"alignment.consecutive.params\": false,\n\t\"alignment.consecutive.propertie"
  },
  {
    "path": ".claude/.devcontainer/devcontainer.json",
    "chars": 371,
    "preview": "{\n  \"name\": \"CFML Development\",\n  \"image\": \"mcr.microsoft.com/devcontainers/universal:2-ubuntu\",\n  \"postCreateCommand\": "
  },
  {
    "path": ".claude/commands/_shared-rails.md",
    "chars": 4751,
    "preview": "# Shared Rails (paste verbatim into every wheels-bot command)\n\nThese rails apply to every wheels-bot slash command. The "
  },
  {
    "path": ".claude/commands/address-review.md",
    "chars": 6232,
    "preview": "# /address-review\n\nImplementer for the convergence loop. After Reviewer A and Reviewer B\nhave aligned on a \"changes need"
  },
  {
    "path": ".claude/commands/advise-on-deadlock.md",
    "chars": 6515,
    "preview": "# /advise-on-deadlock\n\nSenior advisor for the wheels-bot review chain. Fires only when\nReviewer A and Reviewer B fail to"
  },
  {
    "path": ".claude/commands/auto-close-stale-triage.md",
    "chars": 2178,
    "preview": "# /auto-close-stale-triage\n\nClose issues that the bot triaged but couldn't reproduce, when nobody has\nfollowed up after "
  },
  {
    "path": ".claude/commands/propose-fix.md",
    "chars": 7933,
    "preview": "# /propose-fix\n\nPropose a fix for a triaged issue, in a TDD-mandatory draft PR.\n\n## Rails\n\nRead `.claude/commands/_share"
  },
  {
    "path": ".claude/commands/research-frameworks.md",
    "chars": 7344,
    "preview": "# /research-frameworks\n\nCross-framework research synthesis for a `framework-design` issue. Compare\nhow Rails, Laravel, D"
  },
  {
    "path": ".claude/commands/respond-to-critique.md",
    "chars": 4674,
    "preview": "# /respond-to-critique\n\nReviewer A — response mode. Engage with Reviewer B's critique on a PR\nthat you previously review"
  },
  {
    "path": ".claude/commands/review-pr.md",
    "chars": 6487,
    "preview": "# /review-pr\n\nReviewer A. Review the given pull request as a senior Wheels maintainer would.\n\n## Rails\n\nRead `.claude/co"
  },
  {
    "path": ".claude/commands/review-the-review.md",
    "chars": 7865,
    "preview": "# /review-the-review\n\nReviewer B. Critique Reviewer A's review of a PR. The goal is to catch\nsycophancy, false positives"
  },
  {
    "path": ".claude/commands/triage-issue.md",
    "chars": 8968,
    "preview": "# /triage-issue\n\nClassify a freshly-opened GitHub issue, identify the affected layer if it's\na bug, and post a routing c"
  },
  {
    "path": ".claude/commands/update-docs.md",
    "chars": 5342,
    "preview": "# /update-docs\n\nRead a PR's implementation diff and add follow-up doc commits (MDX user\nguides, `.ai/wheels/<layer>/`, `"
  },
  {
    "path": ".claude/commands/write-docs.md",
    "chars": 7203,
    "preview": "# /write-docs\n\nCreate a new documentation PR from a docs-request triaged issue. Writes\nMDX guide pages, `.ai/wheels/` re"
  },
  {
    "path": ".dockerignore",
    "chars": 429,
    "preview": "# Git\n.git\n.gitignore\n\n# IDE / editor\n.project\n.settings\n.classpath\n.vscode\n.idea\n.claude\n\n# CommandBox artifacts (rebui"
  },
  {
    "path": ".editorconfig",
    "chars": 286,
    "preview": "root = true\n\n[*]\ncharset = utf-8\nend_of_line = lf\nindent_style = tab\ninsert_final_newline = true\nindent_size = 2\ntrim_tr"
  },
  {
    "path": ".gitattributes",
    "chars": 639,
    "preview": "# Mark vendor/wheels/ as framework source code (not a third-party dependency)\nvendor/wheels/** linguist-vendored=false\n\n"
  },
  {
    "path": ".gitbook.yaml",
    "chars": 125,
    "preview": "root: ./guides\n\n​structure:\n    readme: introduction/getting-started/getting-started.md\n    summary: SUMMARY.md​\n\nredire"
  },
  {
    "path": ".github/FUNDING.yml",
    "chars": 765,
    "preview": "# These are supported funding model platforms\n\ngithub: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [u"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.md",
    "chars": 834,
    "preview": "---\nname: Bug report\nabout: Create a report to help us improve\ntitle: ''\nlabels: ''\nassignees: ''\n\n---\n\n**Describe the b"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature_request.md",
    "chars": 595,
    "preview": "---\nname: Feature request\nabout: Suggest an idea for this project\ntitle: ''\nlabels: ''\nassignees: ''\n\n---\n\n**Is your fea"
  },
  {
    "path": ".github/RELEASE_PLAYBOOK.md",
    "chars": 8245,
    "preview": "# Release Playbook\n\nOperational runbook for cutting Wheels releases. The high-level architecture\nand rationale lives in "
  },
  {
    "path": ".github/actions/publish_forgebox_package/Dockerfile",
    "chars": 133,
    "preview": "FROM pixl8/docker-commandbox-lite:v2-rc\nCOPY entrypoint.sh /entrypoint.sh\nRUN chmod +x /entrypoint.sh\n\nENTRYPOINT [\"/ent"
  },
  {
    "path": ".github/actions/publish_forgebox_package/action.yml",
    "chars": 452,
    "preview": "name: publish-forgebox-package\ndescription: This is an action to publish your package to forgebox\nauthor: Peter Amiri\nbr"
  },
  {
    "path": ".github/actions/publish_forgebox_package/entrypoint.sh",
    "chars": 1048,
    "preview": "#!/bin/sh\n\nBOXJSON_DIR=${BOXJSON_DIR:-\"\"}\nFULL_DIR=\"${GITHUB_WORKSPACE}${BOXJSON_DIR}\"\nBOX_JSON_FILE=\"${FULL_DIR}/box.js"
  },
  {
    "path": ".github/actions/setup-wheels-test-env/action.yml",
    "chars": 5547,
    "preview": "name: Set up Wheels test environment\ndescription: |\n  Brings up the canonical Wheels test stack on the runner: JDK 21, L"
  },
  {
    "path": ".github/actions/wheels-bot-skip-check/action.yml",
    "chars": 3625,
    "preview": "name: Wheels Bot — skip check\ndescription: |\n  Centralised gate for every wheels-bot workflow. Sets `outputs.skip` to \"t"
  },
  {
    "path": ".github/labeler.yml",
    "chars": 620,
    "preview": "# Configuration for actions/labeler v5\n# Automatically labels PRs based on changed file paths and branch names\n\nenhancem"
  },
  {
    "path": ".github/pull_request_template.md",
    "chars": 1252,
    "preview": "## Summary\n\n<!-- Brief description of what this PR does -->\n\n## Related Issue\n\nCloses #\n\n## Type of Change\n\n- [ ] Bug fi"
  },
  {
    "path": ".github/slack.yml",
    "chars": 1664,
    "preview": "username: GitHub-CI\nicon_url: https://octodex.github.com/images/mona-the-rivetertocat.png\n\npretext: Triggered via {{even"
  },
  {
    "path": ".github/workflows/bot-address-review.yml",
    "chars": 5140,
    "preview": "name: Wheels Bot — Address Review\n\n# Fires when Reviewer B posts a converged-changes verdict, signaling that\n# A and B h"
  },
  {
    "path": ".github/workflows/bot-advisor.yml",
    "chars": 4124,
    "preview": "name: Wheels Bot — Senior Advisor\n\n# Fires when Reviewer A and Reviewer B fail to converge after the\n# inner-loop cap (B"
  },
  {
    "path": ".github/workflows/bot-auto-close.yml",
    "chars": 1449,
    "preview": "name: Wheels Bot — Auto-close stale triage\n\non:\n  schedule:\n    - cron: '0 6 * * *'\n  workflow_dispatch: {}\n\npermissions"
  },
  {
    "path": ".github/workflows/bot-propose-fix.yml",
    "chars": 5193,
    "preview": "name: Wheels Bot — Propose Fix\n\non:\n  issue_comment:\n    types: [created]\n  workflow_dispatch:\n    inputs:\n      issue-n"
  },
  {
    "path": ".github/workflows/bot-research.yml",
    "chars": 2751,
    "preview": "name: Wheels Bot — Cross-Framework Research\n\non:\n  issue_comment:\n    types: [created]\n  workflow_dispatch:\n    inputs:\n"
  },
  {
    "path": ".github/workflows/bot-review-a.yml",
    "chars": 9397,
    "preview": "name: Wheels Bot — Reviewer A\n\n# Two trigger paths into this workflow:\n# 1. pull_request — the standard path (PR opens, "
  },
  {
    "path": ".github/workflows/bot-review-b.yml",
    "chars": 2675,
    "preview": "name: Wheels Bot — Reviewer B\n\non:\n  pull_request_review:\n    types: [submitted]\n\npermissions:\n  contents: read\n\nconcurr"
  },
  {
    "path": ".github/workflows/bot-tdd-gate.yml",
    "chars": 3546,
    "preview": "name: Wheels Bot — TDD Gate\n\non:\n  pull_request:\n    types: [opened, synchronize, reopened]\n    branches: [develop]\n\nper"
  },
  {
    "path": ".github/workflows/bot-triage.yml",
    "chars": 2956,
    "preview": "name: Wheels Bot — Triage\n\non:\n  issues:\n    types: [opened, reopened]\n  workflow_dispatch:\n    inputs:\n      issue_numb"
  },
  {
    "path": ".github/workflows/bot-update-docs.yml",
    "chars": 4242,
    "preview": "name: Wheels Bot — Update Docs\n\n# Phase 4 (auto-fire): runs on pull_request opened from wheels-bot[bot]\n# head refs (aft"
  },
  {
    "path": ".github/workflows/bot-write-docs.yml",
    "chars": 4798,
    "preview": "name: Wheels Bot — Write Docs\n\n# Phase 4 (auto-fire): runs from wheels-bot[bot] comments containing\n# `wheels-bot:docs-c"
  },
  {
    "path": ".github/workflows/bump-develop-version.yml",
    "chars": 5618,
    "preview": "# Auto-bumps wheels.json's version on develop after a GA release lands on main.\n#\n# Workflow:\n#   1. Maintainer cuts v4."
  },
  {
    "path": ".github/workflows/compat-matrix.yml",
    "chars": 28261,
    "preview": "# Compatibility matrix: runs all engines x databases on a weekly schedule\n# and on manual dispatch. Non-blocking — infor"
  },
  {
    "path": ".github/workflows/deploy-ci.yml",
    "chars": 4048,
    "preview": "# Deploy subsystem CI gate\n#\n# Runs the CLI test suite plus the deploy-specific harness scripts on any\n# PR/push that to"
  },
  {
    "path": ".github/workflows/docs-validation.yml",
    "chars": 8467,
    "preview": "name: Docs validation (agent)\n\non:\n  workflow_dispatch:\n    inputs:\n      mode:\n        description: 'Validation mode'\n "
  },
  {
    "path": ".github/workflows/docs-verify.yml",
    "chars": 4410,
    "preview": "name: Verify docs\n\non:\n  pull_request:\n    branches: [develop]\n    paths:\n      - 'web/sites/guides/src/content/docs/v4-"
  },
  {
    "path": ".github/workflows/generate-changelog.yml",
    "chars": 3452,
    "preview": "# Generate Changelog Workflow\n# Generates changelog entries from merged PRs since the last release tag.\n# Can be run man"
  },
  {
    "path": ".github/workflows/label.yml",
    "chars": 689,
    "preview": "name: Auto-Label PR\n\n# Uses pull_request_target so fork PRs receive a write-scoped GITHUB_TOKEN.\n# Safe: this workflow n"
  },
  {
    "path": ".github/workflows/pr.yml",
    "chars": 6621,
    "preview": "name: Wheels Pull Requests\n\non:\n  pull_request:\n    branches:\n      - develop\n\npermissions:\n  contents: read\n  checks: w"
  },
  {
    "path": ".github/workflows/publish-chocolatey.yml",
    "chars": 2627,
    "preview": "name: Publish Chocolatey Package\n\non:\n  workflow_dispatch:\n    inputs:\n      version:\n        description: 'LuCLI versio"
  },
  {
    "path": ".github/workflows/refresh-packages-baseline.yml",
    "chars": 6225,
    "preview": "name: Refresh packages-index baseline\n\n# Fires only on the registry-updated repository_dispatch that\n# wheels-dev/wheels"
  },
  {
    "path": ".github/workflows/refresh-visual-baselines.yml",
    "chars": 8847,
    "preview": "name: Refresh visual baselines\n\n# Manually-triggered baseline refresh for web/tests/visual-baselines/*.png.\n#\n# Use this"
  },
  {
    "path": ".github/workflows/release-candidate.yml",
    "chars": 11442,
    "preview": "# Release Candidate Workflow\n# This workflow builds and publishes Release Candidates for testing before final releases\n#"
  },
  {
    "path": ".github/workflows/release.yml",
    "chars": 38996,
    "preview": "# This workflow is used to release master releases and also by the snapshot workflow\n# to release snapshots.\nname: Wheel"
  },
  {
    "path": ".github/workflows/snapshot.yml",
    "chars": 10987,
    "preview": "name: Wheels Snapshots\n\non:\n  push:\n    branches:\n      - develop\n\npermissions:\n  contents: write\n  checks: write\n  pull"
  },
  {
    "path": ".github/workflows/version-bump.yml",
    "chars": 3456,
    "preview": "# Version Bump Workflow\n# This workflow helps automate version bumping after a release\n# It can be manually triggered to"
  },
  {
    "path": ".github/workflows/web-deploy.yml",
    "chars": 15188,
    "preview": "name: Deploy static sites\n\non:\n  push:\n    branches: [develop]\n    paths:\n      - 'web/**'\n      - '.github/workflows/we"
  },
  {
    "path": ".gitignore",
    "chars": 1890,
    "preview": ".project\n.CommandBox\n.settings\n.classpath\n.engine\n\nCFIDE\ncfide\nWEB-INF\nMETA-INF\n\n/target\n/temp/\n/manual/\n/bin/\n/migrator"
  },
  {
    "path": ".husky/commit-msg",
    "chars": 40,
    "preview": "npx --no-install commitlint --edit \"$1\"\n"
  },
  {
    "path": ".husky/pre-commit",
    "chars": 830,
    "preview": "# Check formatting of staged CFML files only (not the entire project)\n# Use POSIX-compatible redirect: husky invokes hoo"
  },
  {
    "path": ".nvmrc",
    "chars": 3,
    "preview": "22\n"
  },
  {
    "path": ".vscode/launch.json",
    "chars": 394,
    "preview": "{\n  // Use IntelliSense to learn about possible attributes.\n  // Hover to view descriptions of existing attributes.\n  //"
  },
  {
    "path": ".vscode/wheels-test.code-snippets",
    "chars": 7736,
    "preview": "{\n\t// TestBox BDD Specs\n\t\"TestBox Spec\": {\n\t\t\"prefix\": \"tbspec\",\n\t\t\"body\": [\n\t\t\t\"component extends=\\\"wheels.WheelsTest\\\""
  },
  {
    "path": ".vscode/wheels.code-snippets",
    "chars": 13884,
    "preview": "{\n\t// Controller Snippets\n\t\"Wheels Controller\": {\n\t\t\"prefix\": \"wcontroller\",\n\t\t\"body\": [\n\t\t\t\"component extends=\\\"Control"
  },
  {
    "path": "CFConfig.json",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "CHANGELOG.md",
    "chars": 209327,
    "preview": "# Changelog\n\nAll notable changes to this project will be summarized in this file.\n\nThe format is based on [Keep a Change"
  },
  {
    "path": "CLAUDE.md",
    "chars": 36365,
    "preview": "# Wheels Framework\n\nCFML MVC framework with ActiveRecord ORM. The framework itself lives in `vendor/wheels/` (NOT a depe"
  },
  {
    "path": "CODE_OF_CONDUCT.md",
    "chars": 5220,
    "preview": "# Contributor Covenant Code of Conduct\n\n## Our Pledge\n\nWe as members, contributors, and leaders pledge to make participa"
  },
  {
    "path": "CONTRIBUTING.md",
    "chars": 12986,
    "preview": "# Contributing to Wheels\n\nA warm welcome and a huge thank you for considering contributing to Wheels!\nIt's the people in"
  },
  {
    "path": "Dockerfile.dev",
    "chars": 1322,
    "preview": "# Wheels Development Dockerfile\n# Optimized for local development with hot-reload via volume mounts.\n# Usage: docker com"
  },
  {
    "path": "LICENSE",
    "chars": 11357,
    "preview": "                                 Apache License\n                           Version 2.0, January 2004\n                   "
  },
  {
    "path": "NOTICE",
    "chars": 1178,
    "preview": "Wheels Framework\nCopyright 2006-2026 The Wheels Framework Authors\n\nThis product includes software developed by:\n\n  - Per"
  },
  {
    "path": "README.md",
    "chars": 7282,
    "preview": "![GitHub Workflow Status (with event)](https://img.shields.io/github/actions/workflow/status/wheels-dev/wheels/snapshot."
  },
  {
    "path": "RELEASE-CANDIDATE.md",
    "chars": 7453,
    "preview": "# Release Candidate Guide\n\nThis guide explains how to create and manage Release Candidates (RC) for Wheels before publis"
  },
  {
    "path": "SECURITY.md",
    "chars": 5440,
    "preview": "# Security Policy\n\n## Reporting Security Issues\n\n**Do not report security vulnerabilities through public GitHub issues.*"
  },
  {
    "path": "app/controllers/Controller.cfc",
    "chars": 769,
    "preview": "/**\n * This is the parent controller file that all your controllers should extend.\n * You can add functions to this file"
  },
  {
    "path": "app/events/onabort.cfm",
    "chars": 90,
    "preview": "<cfscript>\n// Place code here that should be executed on the \"onAbort\" event.\n</cfscript>\n"
  },
  {
    "path": "app/events/onapplicationend.cfm",
    "chars": 99,
    "preview": "<cfscript>\n// Place code here that should be executed on the \"onApplicationEnd\" event.\n</cfscript>\n"
  },
  {
    "path": "app/events/onapplicationstart.cfm",
    "chars": 101,
    "preview": "<cfscript>\n// Place code here that should be executed on the \"onApplicationStart\" event.\n</cfscript>\n"
  },
  {
    "path": "app/events/onerror.cfm",
    "chars": 1506,
    "preview": "<cfscript>\n\t// Log the error to stderr so it appears in server logs / container output.\n\t// The exception struct is pass"
  },
  {
    "path": "app/events/onerror.json.cfm",
    "chars": 419,
    "preview": "<cfsilent>\n\t<!--- Place JSON error response here that should be displayed when an error is encountered while running in "
  },
  {
    "path": "app/events/onerror.xml.cfm",
    "chars": 451,
    "preview": "<cfsilent>\n\t<!--- Place XML error response here that should be displayed when an error is encountered while running in \""
  },
  {
    "path": "app/events/onmaintenance.cfm",
    "chars": 214,
    "preview": "<!--- Place HTML here that should be displayed when the application is running in \"maintenance\" mode. --->\n\n<h1>Maintena"
  },
  {
    "path": "app/events/onmissingtemplate.cfm",
    "chars": 232,
    "preview": "<!--- Place HTML here that should be displayed when a file is not found while running in \"production\" mode. --->\n\n<h1>Fi"
  },
  {
    "path": "app/events/onrequestend.cfm",
    "chars": 95,
    "preview": "<cfscript>\n// Place code here that should be executed on the \"onRequestEnd\" event.\n</cfscript>\n"
  },
  {
    "path": "app/events/onrequeststart.cfm",
    "chars": 97,
    "preview": "<cfscript>\n// Place code here that should be executed on the \"onRequestStart\" event.\n</cfscript>\n"
  },
  {
    "path": "app/events/onsessionend.cfm",
    "chars": 95,
    "preview": "<cfscript>\n// Place code here that should be executed on the \"onSessionEnd\" event.\n</cfscript>\n"
  },
  {
    "path": "app/events/onsessionstart.cfm",
    "chars": 97,
    "preview": "<cfscript>\n// Place code here that should be executed on the \"onSessionStart\" event.\n</cfscript>\n"
  },
  {
    "path": "app/global/functions.cfm",
    "chars": 102,
    "preview": "<cfscript>\n// Place functions here that should be available globally in your application.\n</cfscript>\n"
  },
  {
    "path": "app/jobs/ProcessOrdersJob.cfc",
    "chars": 1274,
    "preview": "/**\n * ProcessOrdersJob\n *\n * Example background job demonstrating the Wheels job queue system.\n * Processes pending ord"
  },
  {
    "path": "app/lib/.keep",
    "chars": 1,
    "preview": "\n"
  },
  {
    "path": "app/migrator/.keep",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "app/migrator/migrations/.keep",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "app/models/Model.cfc",
    "chars": 225,
    "preview": "/**\n * This is the parent model file that all your models should extend.\n * You can add functions to this file to make t"
  },
  {
    "path": "app/snippets/ActionContent.txt",
    "chars": 60,
    "preview": "\n\t/**\n\t* |ActionHint| Action\n\t**/\n\tfunction |Action|() {\n\n\t}"
  },
  {
    "path": "app/snippets/ApiControllerContent.txt",
    "chars": 2721,
    "preview": "|DescriptionComment|component extends=\"wheels.Controller\" {\n\n    function config() {\n        provides(\"json\");\n\t\t\t\tfilte"
  },
  {
    "path": "app/snippets/BoxJSON.txt",
    "chars": 1263,
    "preview": "{\n    \"name\":\"|appName|\",\n    \"version\":\"1.0.0\",\n    \"author\":\"Wheels Core Team and Community, repackaged by Peter Amiri"
  },
  {
    "path": "app/snippets/CRUDContent.txt",
    "chars": 1795,
    "preview": "|DescriptionComment|component extends=\"Controller\" {\n\n\tfunction config() {\n\t\tverifies(except=\"index,new,create\", params="
  },
  {
    "path": "app/snippets/ConfigAppContent.txt",
    "chars": 268,
    "preview": "<cfscript>\n\t/*\n\t\tPlace settings that should go in the Application.cfc's \"this\" scope here.\n\n\t\tExamples:\n\t\tthis.name = \"M"
  },
  {
    "path": "app/snippets/ConfigDataSourceH2Content.txt",
    "chars": 899,
    "preview": "<cfscript>\n\t/*\n\t\tIf you leave these settings commented out, Wheels will set the data source name to the same name as the"
  },
  {
    "path": "app/snippets/ConfigReloadPasswordContent.txt",
    "chars": 899,
    "preview": "<cfscript>\n\t/*\n\t\tIf you leave these settings commented out, Wheels will set the data source name to the same name as the"
  },
  {
    "path": "app/snippets/ConfigRoutes.txt",
    "chars": 816,
    "preview": "<cfscript>\n\n\t// Use this file to add routes to your application and point the root route to a controller action.\n\t// Don"
  },
  {
    "path": "app/snippets/ControllerContent.txt",
    "chars": 132,
    "preview": "|DescriptionComment|component extends=\"Controller\" {\n\n  /**\n\t* Controller config settings\n\t**/\n\tfunction config() {\n\n\t}\n"
  },
  {
    "path": "app/snippets/DBMigrate.txt",
    "chars": 785,
    "preview": "component extends=\"wheels.migrator.Migration\" hint=\"|DBMigrateHINT|\" {\n\n\tfunction up() {\n\t\ttransaction {\n\t\t\ttry {\n\t\t\t\t|D"
  },
  {
    "path": "app/snippets/McpConfig.json",
    "chars": 215,
    "preview": "{\n  \"mcpServers\": {\n    \"wheels\": {\n      \"command\": \"wheels\",\n      \"args\": [\"mcp\", \"wheels\"]\n    },\n    \"browsermcp\": "
  },
  {
    "path": "app/snippets/ModelContent.txt",
    "chars": 189,
    "preview": "|DescriptionComment|component extends=\"Model\" {\n\n\tfunction config() {\n\t\t|TableName|\n\t\t{{belongsToRelationships}}\n\t\t{{has"
  },
  {
    "path": "app/snippets/OpenCodeConfig.json",
    "chars": 325,
    "preview": "{\n  \"$schema\": \"https://opencode.ai/config.json\",\n  \"mcp\": {\n    \"wheels\": {\n      \"type\": \"local\",\n      \"command\": [\"w"
  },
  {
    "path": "app/snippets/ServerJSON.txt",
    "chars": 342,
    "preview": "{\n    \"name\": \"|appName|\",\n    \"web\": {\n        \"host\":\"localhost\",\n        \"webroot\": \"public\",\n        \"rewrites\": {\n "
  },
  {
    "path": "app/snippets/ViewContent.txt",
    "chars": 51,
    "preview": "<cfoutput>\n<!--- CLI-Appends-Here --->\n</cfoutput>\n"
  },
  {
    "path": "app/snippets/WheelsBoxJSON.txt",
    "chars": 68,
    "preview": "{\n    \"VERSION\":\"|version|\",\n    \"SLUG\":\"wheels\",\n    \"TYPE\":\"mvc\"\n}"
  },
  {
    "path": "app/snippets/bootstrap/layout.cfm",
    "chars": 2911,
    "preview": "<cfoutput>\n<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n  \t<meta charset=\"utf-8\">\n    <meta http-equiv=\"X-UA-Compatible\" co"
  },
  {
    "path": "app/snippets/bootstrap/settings.cfm",
    "chars": 1423,
    "preview": "// Bootstrap form settings\nset(functionName=\"submitTag\", class=\"btn btn-primary\", value=\"Save Changes\");\nset(functionNam"
  },
  {
    "path": "app/snippets/crud/_form.txt",
    "chars": 110,
    "preview": "<!--- |ObjectNameSingularC| Form Contents --->\n<cfoutput>\n|FormFields|\n<!--- CLI-Appends-Here --->\n</cfoutput>"
  },
  {
    "path": "app/snippets/crud/edit.txt",
    "chars": 388,
    "preview": "<!--- |ObjectNameSingularC| Edit Form --->\n<cfparam name=\"|ObjectNameSingular|\">\n<cfoutput>\n<h1>Edit |ObjectNameSingular"
  },
  {
    "path": "app/snippets/crud/index.txt",
    "chars": 1166,
    "preview": "<!--- |ObjectNameSingularC| Index --->\n<cfparam name=\"|ObjectNamePlural|\">\n<cfoutput>\n\t<h1>|ObjectNamePluralC| index</h1"
  },
  {
    "path": "app/snippets/crud/new.txt",
    "chars": 350,
    "preview": "<!--- |ObjectNameSingularC| Creation Form --->\n<cfparam name=\"|ObjectNameSingular|\">\n<cfoutput>\n<h1>Create New |ObjectNa"
  },
  {
    "path": "app/snippets/crud/show.txt",
    "chars": 162,
    "preview": "<!--- |ObjectNameSingularC| Show --->\n<cfparam name=\"|ObjectNameSingular|\">\n<cfoutput>\n<h1>View |ObjectNameSingularC|</h"
  },
  {
    "path": "app/snippets/dbmigrate/announce.txt",
    "chars": 150,
    "preview": "component extends=\"|DBMigrateExtends|\" hint=\"|DBMigrateDescription|\" {\n\n\tfunction up() {\n\t\tannounce('');\n\t}\n\n\tfunction d"
  },
  {
    "path": "app/snippets/dbmigrate/blank.txt",
    "chars": 816,
    "preview": "component extends=\"|DBMigrateExtends|\" hint=\"|DBMigrateDescription|\" {\n\n\tfunction up() {\n\t\ttransaction {\n\t\t\ttry {\n\t\t\t\t//"
  },
  {
    "path": "app/snippets/dbmigrate/change-column.txt",
    "chars": 3887,
    "preview": "/*\n  |------------------------------------------------------------------------------------------------------------------"
  },
  {
    "path": "app/snippets/dbmigrate/change-table.txt",
    "chars": 1534,
    "preview": "/*\n  |----------------------------------------------------------------------------------------------|\n\t| Parameter  | Re"
  },
  {
    "path": "app/snippets/dbmigrate/create-column.txt",
    "chars": 3672,
    "preview": "/*\n  |------------------------------------------------------------------------------------------------------------------"
  },
  {
    "path": "app/snippets/dbmigrate/create-index.txt",
    "chars": 2014,
    "preview": "/*\n  |------------------------------------------------------------------------------------------------------------------"
  },
  {
    "path": "app/snippets/dbmigrate/create-record.txt",
    "chars": 1541,
    "preview": "/*\n  |-------------------------------------------------------------------------------------------|\n\t| Parameter     | Re"
  },
  {
    "path": "app/snippets/dbmigrate/create-table.txt",
    "chars": 2752,
    "preview": "/*\n  |----------------------------------------------------------------------------------------------|\n\t| Parameter  | Re"
  },
  {
    "path": "app/snippets/dbmigrate/execute.txt",
    "chars": 796,
    "preview": "component extends=\"|DBMigrateExtends|\" hint=\"|DBMigrateDescription|\" {\n\n\tfunction up() {\n\t\ttransaction {\n\t\t\ttry {\n\t\t\t\tex"
  },
  {
    "path": "app/snippets/dbmigrate/remove-column.txt",
    "chars": 1731,
    "preview": "/*\n  |-------------------------------------------------------------------------------------------------|\n\t| Parameter   "
  },
  {
    "path": "app/snippets/dbmigrate/remove-index.txt",
    "chars": 1466,
    "preview": "/*\n  |----------------------------------------------------------------------------|\n\t| Parameter     | Required | Type  "
  },
  {
    "path": "app/snippets/dbmigrate/remove-record.txt",
    "chars": 1508,
    "preview": "/*\n  |-------------------------------------------------------------------------------------------|\n\t| Parameter     | Re"
  },
  {
    "path": "app/snippets/dbmigrate/remove-table.txt",
    "chars": 1432,
    "preview": "/*\n    |----------------------------------------------------------------------------------------------|\n\t| Parameter  | "
  },
  {
    "path": "app/snippets/dbmigrate/rename-column.txt",
    "chars": 1581,
    "preview": "/*\n  |----------------------------------------------------------------------|\n\t| Parameter     | Required | Type    | De"
  },
  {
    "path": "app/snippets/dbmigrate/rename-table.txt",
    "chars": 1518,
    "preview": "/*\n  |----------------------------------------------------------------------------------------------|\n\t| Parameter  | Re"
  },
  {
    "path": "app/snippets/dbmigrate/update-record.txt",
    "chars": 1692,
    "preview": "/*\n  |-----------------------------------------------------------------------------------------------------|\n\t| Paramete"
  },
  {
    "path": "app/snippets/mcp-server.js.txt",
    "chars": 12973,
    "preview": "#!/usr/bin/env node\n\n/**\n * MCP Server for Wheels Framework\n *\n * This server provides documentation and tools for Wheel"
  },
  {
    "path": "app/snippets/tests/controller.txt",
    "chars": 734,
    "preview": "component extends=\"wheels.WheelsTest\" {\n\n\tfunction beforeAll() {\n\t\t// Setup test data once for all tests in this compone"
  },
  {
    "path": "app/snippets/tests/model.txt",
    "chars": 796,
    "preview": "component extends=\"wheels.WheelsTest\" {\n\n\tfunction beforeAll() {\n\t\t// Setup test data once for all tests in this compone"
  },
  {
    "path": "app/snippets/tests/view.txt",
    "chars": 829,
    "preview": "component extends=\"wheels.WheelsTest\" {\n\n\tfunction beforeAll() {\n\t\t// Setup test data once for all tests in this compone"
  },
  {
    "path": "app/views/helpers.cfm",
    "chars": 126,
    "preview": "<cfscript>\n// Place helper functions here that should be available for use in all view pages of your application.\n</cfsc"
  },
  {
    "path": "app/views/layout.cfm",
    "chars": 619,
    "preview": "<!--- Place HTML here that should be used as the default layout of your application. --->\n<!--- This condition prevents "
  },
  {
    "path": "cli/.gitignore",
    "chars": 24,
    "preview": "\nbox.json\n.cfformat.json"
  },
  {
    "path": "cli/CHANGELOG",
    "chars": 1888,
    "preview": "------------------------------------------------------------------------------------------------------------------------"
  },
  {
    "path": "cli/CLAUDE.md",
    "chars": 3245,
    "preview": "# CLAUDE.md\n\nThis file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.\n\n## "
  },
  {
    "path": "cli/LICENSE",
    "chars": 11357,
    "preview": "                                 Apache License\n                           Version 2.0, January 2004\n                   "
  },
  {
    "path": "cli/PR-INSTRUCTIONS.md",
    "chars": 1982,
    "preview": "# Pull Request Instructions\n\n## Pull Request Title\nImplement CLI improvements from CLI-IMPROVEMENTS.md\n\n## Pull Request "
  },
  {
    "path": "cli/README.md",
    "chars": 1433,
    "preview": "# Wheels CLI\n\nThe `wheels` command is a Rails-inspired CLI for scaffolding and running Wheels applications. In 4.0 it is"
  },
  {
    "path": "cli/WHEELS-CLI-ROADMAP.md",
    "chars": 12986,
    "preview": "# Wheels CLI Roadmap - Modern Framework Commands\n\nThis document outlines the CLI commands that a modern Wheels framework"
  },
  {
    "path": "cli/docs/CONFIG-COMMANDS.md",
    "chars": 5821,
    "preview": "# Wheels CLI Configuration Commands\n\nThis document describes the configuration and security commands implemented for the"
  },
  {
    "path": "cli/lucli/ARCHITECTURE.md",
    "chars": 7507,
    "preview": "# Wheels CLI Architecture\n\nHow `wheels <command>` reaches our code, and where we can intercept.\n\n## The three layers\n\n``"
  },
  {
    "path": "cli/lucli/Module.cfc",
    "chars": 209639,
    "preview": "/**\n * Wheels CLI Module for LuCLI\n *\n * Provides code generation, migrations, testing, and server management\n * for Whe"
  },
  {
    "path": "cli/lucli/PLAN.md",
    "chars": 11272,
    "preview": "# Wheels LuCLI Module — Implementation Plan\n\n## Status\n\n**Phase 1: Complete** — Binary name detection PR ([cybersonic/Lu"
  },
  {
    "path": "cli/lucli/lib/deploy/README.md",
    "chars": 903,
    "preview": "# Deploy JARs\n\nBundled third-party JARs used by `wheels deploy`. Loaded via URLClassLoader\nisolation (`cli/lucli/service"
  },
  {
    "path": "cli/lucli/lib/deploy/manifest.json",
    "chars": 1213,
    "preview": "{\n  \"version\": 1,\n  \"generated\": \"2026-04-21\",\n  \"jars\": [\n    {\"name\": \"jmustache-1.16.jar\", \"sha256\": \"3d4b984abd66908"
  },
  {
    "path": "cli/lucli/module.json",
    "chars": 464,
    "preview": "{\n  \"name\": \"wheels\",\n  \"version\": \"@build.version@\",\n  \"description\": \"Wheels CLI - Code generation, migrations, testin"
  },
  {
    "path": "cli/lucli/services/Admin.cfc",
    "chars": 10233,
    "preview": "/**\n * Admin CRUD generation service.\n *\n * Introspects a model via the running Wheels server to get column types\n * and"
  },
  {
    "path": "cli/lucli/services/Analysis.cfc",
    "chars": 19206,
    "preview": "/**\n * Code analysis service for detecting anti-patterns and quality issues.\n *\n * Scans app/models/, app/controllers/, "
  },
  {
    "path": "cli/lucli/services/BundleStager.cfc",
    "chars": 6107,
    "preview": "/**\n * Datasource-bundle staging helpers for `wheels start`.\n *\n * Lucee 7's stock Express distribution ships JDBC drive"
  },
  {
    "path": "cli/lucli/services/CfclassesPurger.cfc",
    "chars": 2167,
    "preview": "/**\n * Compiled-class cache purge helper for `wheels reload`.\n *\n * Lucee's default `inspectTemplate=once` setting compi"
  },
  {
    "path": "cli/lucli/services/CodeGen.cfc",
    "chars": 11080,
    "preview": "/**\n * Code generation service for models, controllers, views, and tests.\n *\n * Orchestrates file generation by preparin"
  },
  {
    "path": "cli/lucli/services/Destroy.cfc",
    "chars": 11423,
    "preview": "/**\n * Service for destroying (removing) generated Wheels components.\n *\n * Handles file deletion, route cleanup, and mi"
  }
]

// ... and 5063 more files (download for full content)

About this extraction

This page contains the full source code of the cfwheels/cfwheels GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 5263 files (93.4 MB), approximately 6.9M tokens, and a symbol index with 455 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!