Skip to content
Merged
Show file tree
Hide file tree
Changes from 250 commits
Commits
Show all changes
429 commits
Select commit Hold shift + click to select a range
3104648
style: fix all RuboCop offenses from new plugins
aaronlippold Feb 14, 2026
6493d08
fix: resolve flaky satisfaction test and shared example warning
aaronlippold Feb 15, 2026
254f5a0
fix: derive srg_id from association in non-member component view
aaronlippold Feb 15, 2026
0ab2311
fix: display SRG IDs in all satisfaction and rule views
aaronlippold Feb 15, 2026
abfedfa
refactor: remove dead satisfaction modal from RuleEditorHeader
aaronlippold Feb 15, 2026
821f24e
feat: add keyboard navigation and satisfaction display to BenchmarkVi…
aaronlippold Feb 15, 2026
3de1d22
test: add and update tests for SRG ID display and keyboard nav
aaronlippold Feb 15, 2026
7b1cec1
style: apply ESLint auto-formatting from pre-commit hooks
aaronlippold Feb 15, 2026
68a1d9e
test: use deterministic factory sequences and fix fixture path
aaronlippold Feb 16, 2026
a5e71bb
test: add satisfaction modal and RuleSatisfactions srg_id tests
aaronlippold Feb 16, 2026
1c97ab4
chore: add @vitest/coverage-v8 for test coverage reporting
aaronlippold Feb 16, 2026
927e1be
chore: add safety-net rules to block destructive commands
aaronlippold Feb 16, 2026
044cc12
feat: add migration to strip satisfaction text from vendor_comments
aaronlippold Feb 16, 2026
d5bb5ae
test: add backend coverage for seed classification, settings, and ind…
aaronlippold Feb 16, 2026
07be317
feat: add PasswordField component with show/hide toggle
aaronlippold Feb 16, 2026
6d80b76
feat: replace all password fields with PasswordField component
aaronlippold Feb 16, 2026
e76a960
style: condense multi-line skip guards to single-line in settings spec
aaronlippold Feb 16, 2026
ac11a66
fix: add null guards and missing validations to 4 models
aaronlippold Feb 16, 2026
2d9111b
chore: add shoulda-matchers 7.0 for model validation testing
aaronlippold Feb 16, 2026
6b203ec
test: add validation contract specs for all core models
aaronlippold Feb 16, 2026
6e56650
test: add required name and title fields to Component.create calls
aaronlippold Feb 16, 2026
7798318
fix: add null guards for name/email in search filters across 6 Vue co…
aaronlippold Feb 16, 2026
d49d7c1
test: add frontend test coverage for mixins, modals, and utilities
aaronlippold Feb 16, 2026
755fb09
style: apply ESLint auto-formatting to Vue components and specs
aaronlippold Feb 16, 2026
e00300f
feat: add export service foundation (Registry, Base, ExportableRule, …
aaronlippold Feb 17, 2026
998e867
feat: add VendorSubmission mode for DISA-compliant exports
aaronlippold Feb 17, 2026
330dde3
feat: add ExcelFormatter for multi-sheet workbook exports
aaronlippold Feb 17, 2026
891d8b7
feat: wire export service into controllers, add bulk_export route
aaronlippold Feb 17, 2026
b2363a1
fix: respect component_ids selection for XCCDF and InSpec exports
aaronlippold Feb 17, 2026
8b081f3
style: fix RuboCop offenses in export service specs
aaronlippold Feb 17, 2026
fd528de
feat: add PublishedStig and Backup export modes
aaronlippold Feb 17, 2026
dd622f5
feat: add XCCDF and InSpec formatters with component-based pipeline
aaronlippold Feb 17, 2026
bece127
refactor: wire XCCDF/InSpec exports through export service
aaronlippold Feb 17, 2026
f4eb12c
feat: add export mode constants for mode-first UX
aaronlippold Feb 17, 2026
1d4e543
feat: enhance ExportModal with mode-first progressive disclosure
aaronlippold Feb 17, 2026
b7b7634
feat: wire mode-aware exports into Project and controller
aaronlippold Feb 17, 2026
79c56e8
feat: add JSON archive backup export with full-fidelity serializer
aaronlippold Feb 17, 2026
5d236cd
feat: add JSON archive backup import with dry-run support
aaronlippold Feb 17, 2026
db0b160
test: add backup round-trip integration and export request specs
aaronlippold Feb 17, 2026
e4d517e
feat: export modal two-panel layout and STIG-Ready rename
aaronlippold Feb 17, 2026
64f82e3
docs: add data management user stories for backup/restore
aaronlippold Feb 17, 2026
cfcd492
style: fix RuboCop offenses in export spec files
aaronlippold Feb 17, 2026
7b45a44
ci: rewrite CI pipeline for 4-job parallelism and faster execution
aaronlippold Feb 17, 2026
630bf0c
fix: update faraday and uri gems for security vulnerabilities
aaronlippold Feb 17, 2026
99aece5
chore: fix GitGuardian and SonarCloud false positives
aaronlippold Feb 18, 2026
11f4a8e
ci: add SonarCloud CI-based analysis workflow
aaronlippold Feb 18, 2026
4ef0f4d
fix: add JS build step and LDAP/OIDC config to SonarCloud workflow
aaronlippold Feb 18, 2026
d52a52d
fix: remove duplicate test execution from SonarCloud workflow
aaronlippold Feb 18, 2026
8543bb5
ci: consolidate 7 workflows into 4 DRY files
aaronlippold Feb 18, 2026
e0da8dd
ci: Docker release-only with Build Cloud multi-arch
aaronlippold Feb 18, 2026
b946a14
docs: update release process and Docker deployment for new CI/CD
aaronlippold Feb 18, 2026
60e88d3
ci: remove sonarcloud CI job (automatic analysis handles it)
aaronlippold Feb 18, 2026
fec3fc6
fix: restore .sonarcloud.properties deleted in consolidation
aaronlippold Feb 18, 2026
3a53e4e
chore: trigger SonarCloud re-scan
aaronlippold Feb 18, 2026
1d9a388
fix: resolve ~102 SonarCloud code quality issues on PR #706
aaronlippold Feb 18, 2026
a3d9f22
fix: resolve additional SonarCloud issues from round 2
aaronlippold Feb 18, 2026
ed61d17
fix: move permissions from workflow level to job level
aaronlippold Feb 18, 2026
8893478
fix: use ENV.fetch with defaults for env variable access
aaronlippold Feb 18, 2026
f194bfa
chore: remove archive references from sonarcloud config
aaronlippold Feb 18, 2026
569de01
fix: replace table with div for accessible listbox in RuleList
aaronlippold Feb 18, 2026
064d071
chore: remove archive directory from repo
aaronlippold Feb 18, 2026
0f6c48f
chore: set sonar.python.version to suppress warning
aaronlippold Feb 18, 2026
f9decc1
chore: add downloads/ to gitignore
aaronlippold Feb 18, 2026
1e2c0a8
chore: replace overcommit with lefthook for git hooks
aaronlippold Feb 18, 2026
03a2860
feat: add membership backup/restore and restore UI integration
aaronlippold Feb 18, 2026
80e22c2
feat: component filtering, per-component detail, and title fallback
aaronlippold Feb 18, 2026
0190334
feat: POST /projects/create_from_backup endpoint
aaronlippold Feb 18, 2026
6b93075
feat: enhanced RestoreBackupModal with component picker
aaronlippold Feb 18, 2026
4a4831c
feat: new project from backup modal + split dropdown
aaronlippold Feb 18, 2026
dcc3471
chore: UX polish and test infrastructure improvements
aaronlippold Feb 18, 2026
bdf9ac5
fix: update ProjectsTable tests for alphabetical sort order
aaronlippold Feb 18, 2026
d19d6ff
fix: use ruby-version instead of ruby-version-file in CI
aaronlippold Feb 18, 2026
7091c62
fix: resolve SonarCloud issues across backup/restore code
aaronlippold Feb 18, 2026
78425cb
fix: prevent provider hijacking on existing accounts
aaronlippold Feb 18, 2026
d243730
test: update auth specs for provider conflict protection
aaronlippold Feb 18, 2026
8d0e51f
feat: add status_counts to Component serialization
aaronlippold Feb 18, 2026
88173f1
feat: export pre-flight warning for NYD-only components
aaronlippold Feb 18, 2026
dc7e1d8
chore: increase CI backend shards from 4 to 6
aaronlippold Feb 18, 2026
eb5a80f
docs: add backup & restore documentation
aaronlippold Feb 18, 2026
ee978ae
docs: add data management overview page
aaronlippold Feb 18, 2026
4b21bc7
docs: nest import/export and backup/restore under data management
aaronlippold Feb 18, 2026
a3410f4
docs: move data management docs into subdirectory
aaronlippold Feb 18, 2026
7ae0b9f
feat: embed SRGs in JSON archive backup for cross-system portability
aaronlippold Feb 19, 2026
98676a1
refactor: extract shared BackupPreview component
aaronlippold Feb 19, 2026
f5a1fd1
feat: add exclude-satisfied-by toggle for Excel/CSV exports
aaronlippold Feb 19, 2026
f87ea7f
refactor: fix test infrastructure for speed and isolation
aaronlippold Feb 19, 2026
381618c
perf: convert 36 spec files to let_it_be for 65% faster suite
aaronlippold Feb 19, 2026
814320b
fix: lefthook yaml-syntax hook fails on YAML anchors
aaronlippold Feb 19, 2026
10d7fc2
feat: add classification banner and consent modal
aaronlippold Feb 19, 2026
9b172f6
test: add banner and consent modal tests
aaronlippold Feb 19, 2026
a97ea77
docs: add banner and consent modal configuration guides
aaronlippold Feb 19, 2026
a16195d
feat: add configurable password complexity policy (DoD 2222)
aaronlippold Feb 20, 2026
c580d5f
feat: add admin user management (create, edit, password tools)
aaronlippold Feb 20, 2026
6a344bb
fix: DRY Devise views with shared card layout and SMTP guards
aaronlippold Feb 20, 2026
0511a84
test: add admin user management and password policy tests
aaronlippold Feb 20, 2026
e81f01c
docs: add user management guide and fix broken symlinks
aaronlippold Feb 20, 2026
5d4466d
fix: add body padding offset for fixed classification banner
aaronlippold Feb 20, 2026
0d51dce
fix: increase banner padding offset for better clearance
aaronlippold Feb 20, 2026
1b1227d
docs: update security docs for v2.3.1 features
aaronlippold Feb 20, 2026
b3f4c43
feat: add account lockout settings infrastructure (STIG AC-07)
aaronlippold Feb 20, 2026
1c62c57
feat: enable Devise :lockable module for account lockout
aaronlippold Feb 20, 2026
3fd620d
feat: add lock/unlock endpoints and navbar notifications
aaronlippold Feb 20, 2026
bf7d172
feat: lockout UI — navbar notifications, modal lock/unlock, auto-open
aaronlippold Feb 20, 2026
a6256e8
test: add account lockout specs (settings, model, endpoints, frontend)
aaronlippold Feb 20, 2026
5e5d28d
docs: document account lockout feature and admin controls
aaronlippold Feb 20, 2026
d08db98
feat: add shared notification event bus utility
aaronlippold Feb 20, 2026
9a31730
refactor: DRY notification dispatch in EditUserModal and Navbar
aaronlippold Feb 20, 2026
69d4bf7
feat: migrate access request reject to axios with navbar reactivity
aaronlippold Feb 20, 2026
bd5ac4c
feat: History show-all, sidebar scroll lock, lock/unlock audit trail
aaronlippold Feb 20, 2026
356ca3f
fix: lower banner z-index so sidebars render above it
aaronlippold Feb 20, 2026
c98cb9e
fix: prevent SMTP dependency in lockout specs (CI failure)
aaronlippold Feb 20, 2026
634be89
chore: pin devise to ~> 4.9 to prevent accidental v5 upgrade
aaronlippold Feb 20, 2026
fa941fa
chore: add pre-push hook for rubocop, eslint, brakeman
aaronlippold Feb 20, 2026
4724cbd
fix: exclude downloads/ from RuboCop (generated exports)
aaronlippold Feb 20, 2026
ef7800b
feat: add RuleFormGroup shared component for DRY form fields
aaronlippold Feb 20, 2026
d7d6d06
feat: add per-section rule locking backend
aaronlippold Feb 20, 2026
bed5be2
feat: add per-section locking UI and migrate forms to RuleFormGroup
aaronlippold Feb 20, 2026
11b4490
refactor: replace dead Stig components with RuleFormGroup
aaronlippold Feb 20, 2026
e2da842
test: section locking and mitigations XOR toggle tests
aaronlippold Feb 20, 2026
d4ba308
docs: section locks, authoring rules, deployment guide
aaronlippold Feb 20, 2026
086986d
feat: authentication security hardening (PBKDF2, sessions, Devise audit)
aaronlippold Feb 22, 2026
dc05b9e
fix: input security hardening (XXE, uploads, rate limiting)
aaronlippold Feb 22, 2026
30dd879
feat: frontend form validation composable
aaronlippold Feb 22, 2026
f20e942
docs: security controls, configuration, and v2.3.1 release notes
aaronlippold Feb 22, 2026
aa8a502
fix: avoid cleartext password storage during bcrypt→PBKDF2 migration
aaronlippold Feb 22, 2026
d62639c
fix: resolve SonarCloud security hotspots (ReDoS, PRNG)
aaronlippold Feb 22, 2026
1096e64
fix: resolve SonarCloud code issues (S7816, S7764, S7773, S1128, S7721)
aaronlippold Feb 22, 2026
e26440b
fix: resolve SonarCloud code issues (S7816, S7764, S7773, S1128, S7721)
aaronlippold Feb 22, 2026
4ab4fbb
feat: swap FastExcel for caxlsx + Source column + per-cell lock styling
aaronlippold Feb 23, 2026
6633a76
feat: Rule#field_editable? abstraction + spreadsheet reimport guards
aaronlippold Feb 23, 2026
83fe2d5
feat: Update from Spreadsheet modal with word-diff preview
aaronlippold Feb 23, 2026
82c8c0e
feat: input length limits, CSP headers, and detailed import errors
aaronlippold Feb 23, 2026
a2f8d75
feat: make input length limits configurable via Settings
aaronlippold Feb 23, 2026
4f00e15
test: Settings-driven limit tests + 35 new configurable limits specs
aaronlippold Feb 23, 2026
6acd1b1
fix: CSP unsafe-eval for Vue 2 + rack-attack flaky test isolation
aaronlippold Feb 23, 2026
7b38b17
fix: correct stale claims in architecture docs
aaronlippold Feb 23, 2026
cf71b26
chore: remove empty vue3-migration placeholder
aaronlippold Feb 23, 2026
b0011b7
docs: sync all docs with v2.3.1 codebase
aaronlippold Feb 23, 2026
60270c6
chore: upgrade PostgreSQL from 12/16 to 18
aaronlippold Feb 23, 2026
5d57fa4
docs: sync env vars, fix CSV headers, add oidc keys to example
aaronlippold Feb 23, 2026
72da91b
docs: standardize PostgreSQL 18 across all docs
aaronlippold Feb 23, 2026
94e9687
chore: Docker build infrastructure
aaronlippold Feb 28, 2026
1f32286
chore: Docker compose standardization
aaronlippold Feb 28, 2026
e5675f8
fix: database.yml DRY defaults, session_store SSL, CI env
aaronlippold Feb 28, 2026
9409fda
feat: SRG auto-detect from spreadsheet import
aaronlippold Feb 28, 2026
e8cd8b9
docs: update docs for Docker standardization
aaronlippold Feb 28, 2026
9d03488
test: SRG auto-detect backend specs + port registry doc
aaronlippold Feb 28, 2026
4ef3d1f
fix: remove explicit secure cookie flag, let Rails handle it
aaronlippold Mar 1, 2026
56bde62
feat: VULCAN_SEED_DEMO_DATA guard for production seeding
aaronlippold Mar 1, 2026
2163a73
docs: document database setup for dev, test, and production
aaronlippold Mar 2, 2026
81359fa
feat: enable banner and consent modal on review apps
aaronlippold Mar 2, 2026
14a1d7c
feat: AC-8 server-side consent tracking with configurable TTL
aaronlippold Mar 2, 2026
7ce46a0
docs: update AC-8 consent docs and add VULCAN_CONSENT_TTL
aaronlippold Mar 2, 2026
ffe7cdf
fix: skip consent modal on login page (require authentication first)
aaronlippold Mar 2, 2026
7a7aedf
fix: consent modal must show before login, not after (AC-8)
aaronlippold Mar 2, 2026
0770c0d
docs: clarify AC-8 per-session intent with NIST references
aaronlippold Mar 2, 2026
d9e6c50
test: add config validation specs and DRY helper
aaronlippold Mar 2, 2026
3fa33dd
fix: config ENV var parsing, pool mismatch, and dead keys
aaronlippold Mar 2, 2026
eb5b020
fix: remove redundant ENV fallbacks, UserMailer default from override
aaronlippold Mar 2, 2026
d75fe86
docs: fix GitHub OAuth var names, add OIDC structure test
aaronlippold Mar 2, 2026
87cd184
test: add deployment blocker regression specs
aaronlippold Mar 2, 2026
ff04809
fix: pin devise-security to git SHA for reproducible builds
aaronlippold Mar 2, 2026
faed3cb
fix: add Devise Lockable migration for existing deployments
aaronlippold Mar 2, 2026
1852de9
fix: use CONCURRENTLY for GIN and composite index migrations
aaronlippold Mar 2, 2026
7b8917c
test: add security regression specs for Wave 2 fixes
aaronlippold Mar 2, 2026
c9c01e6
fix: replace thread-unsafe @@components_to_export with session
aaronlippold Mar 2, 2026
a1211fb
fix: upload validation, consent crash, irreversible migration
aaronlippold Mar 2, 2026
fde2e72
test: add config verification specs and drop orphaned settings table
aaronlippold Mar 2, 2026
74c06af
fix: Vue component bugs — severity reactivity, delete reset, modal IDs
aaronlippold Mar 2, 2026
a2deb88
docs: add parallel:prepare requirement after migrations
aaronlippold Mar 2, 2026
708f296
fix: security review P0 fixes — auth scoping, input validation, XXE
aaronlippold Mar 2, 2026
a6e7bb1
fix: frontend review P0 fixes — reactivity, form.submit, memoization
aaronlippold Mar 2, 2026
9c7cd07
fix: backend P1 hardening — JSON safety, password shuffle, query limits
aaronlippold Mar 2, 2026
7484f3c
chore: add frozen_string_literal to all migration files
aaronlippold Mar 2, 2026
1dbe8d2
refactor: frontend cleanup — dead code, URL encoding, CSRF
aaronlippold Mar 2, 2026
ad550c7
fix: idempotent seeds, CSP for OIDC, auto parallel:prepare
aaronlippold Mar 2, 2026
1b620bb
chore: update dependencies for v2.3.1 release
aaronlippold Mar 2, 2026
b00d316
feat: NYD tooltip guidance and section lock disable
aaronlippold Mar 2, 2026
bb786ac
fix: P2 cleanup — use @component/@project, docs, parallel stability
aaronlippold Mar 2, 2026
398b2cf
feat: centralized version infrastructure + parallel stability
aaronlippold Mar 2, 2026
36ab29a
feat: add GET /api/version endpoint
aaronlippold Mar 2, 2026
483e053
feat: release-please automation + rake spec:parallel
aaronlippold Mar 2, 2026
9c75195
feat: tag-triggered releases with git-cliff changelog
aaronlippold Mar 2, 2026
75457b3
docs: update release process, API docs, testing, release notes
aaronlippold Mar 2, 2026
bfa4652
docs: fix 18 inaccuracies found by doc review agents
aaronlippold Mar 3, 2026
08fa436
chore: upgrade to Node.js 24 LTS
aaronlippold Mar 3, 2026
d0420a8
chore: use standard Keep a Changelog sections in cliff.toml
aaronlippold Mar 3, 2026
563783e
fix: harden CI/CD workflows after 3-round agent review
aaronlippold Mar 3, 2026
895562a
fix: skip parallel DB sync in CI (fixes shard failures)
aaronlippold Mar 3, 2026
f721229
docs: update CHANGELOG.md with curated v2.3.1 entries
aaronlippold Mar 3, 2026
38cb6ce
fix: bundle FA4 and codicon fonts locally for CSP
aaronlippold Mar 5, 2026
033f4cf
feat: lock icons always visible, disabled when inactive
aaronlippold Mar 5, 2026
9d9d8a6
fix: UI label changes from PR #706 review
aaronlippold Mar 5, 2026
7722601
fix: DiffViewer 500 error, dropdown order, theme, icons
aaronlippold Mar 5, 2026
b5ef3d9
fix: nest satisfies spacer only when parents exist
aaronlippold Mar 5, 2026
d8ced84
refactor: decouple DISA export from positional indices
aaronlippold Mar 5, 2026
f5643c5
fix: nil SRG guard in seeds and component as_json
aaronlippold Mar 5, 2026
c66c97a
feat: VulcanAuditable concern + auto-audit locks
aaronlippold Mar 5, 2026
1b72bc4
feat: activity reactivity + project histories API
aaronlippold Mar 5, 2026
0197111
fix: Actions toolbar visible on all editor tabs
aaronlippold Mar 5, 2026
bacfd8a
fix: duplicate component counter_cache + double-click
aaronlippold Mar 5, 2026
e92daf9
fix: Rails 8 bind params in duplicate_reviews_and_history
aaronlippold Mar 5, 2026
7b1483b
perf: bulk SQL for duplicate_reviews_and_history
aaronlippold Mar 5, 2026
2825377
feat: loading feedback + bulk delete for components
aaronlippold Mar 5, 2026
95a211f
perf: suppress auditing during component duplication
aaronlippold Mar 5, 2026
257a2aa
refactor: replace vue-simple-suggest with vue-multiselect
aaronlippold Mar 6, 2026
b216c62
fix: brakeman SQL injection false positives
aaronlippold Mar 6, 2026
f7c2b14
fix: advanced fields toggle, documentable tooltip, DISA guide
aaronlippold Mar 6, 2026
6e10266
fix: under-review grays out form, no per-field highlight
aaronlippold Mar 6, 2026
3139eab
fix: lock all warns about NYD rules instead of blocking
aaronlippold Mar 6, 2026
71151a7
feat: search components by metadata tags (F2)
aaronlippold Mar 6, 2026
c089e73
feat: autosave toggle with debounced save (F3)
aaronlippold Mar 6, 2026
809c642
fix: DISA Guide button links to VitePress docs
aaronlippold Mar 6, 2026
7eac745
fix: brakeman ignore for metadata search query
aaronlippold Mar 6, 2026
fe9a812
fix: button consistency and rule deletion hardening (B2, C3, C5)
wdower Mar 30, 2026
54fb1d4
fix: Vue 2 reactivity for component updates and params.expect 400 errors
wdower Mar 30, 2026
c182c88
fix: wire up memberships-updated event for reactive member list
wdower Mar 31, 2026
328430c
fix: raise navbar collapse breakpoint from lg to xl (B6)
wdower Mar 31, 2026
59292e5
feat: in-app DISA guide with downloadable attachments (B7)
wdower Mar 31, 2026
ea6e325
fix: autosave now triggers on all rule field changes (B8)
wdower Mar 31, 2026
7e7557c
fix: remove redundant form previews from revert modal (C4)
wdower Mar 31, 2026
7fd74ae
fix: InSpec export stubs for NYD rules and component card buttons (B1…
wdower Mar 31, 2026
bf5ebce
fix: remove per-field gray indicators on whole-locked rules (C3)
wdower Apr 2, 2026
81d1414
refactor: remove component-level membership UI for v2.3.1
wdower Apr 2, 2026
a2472c9
Merge remote-tracking branch 'origin/master' into v2.3.1
wdower Apr 2, 2026
e3c60b7
fix: resolve RuboCop lint offenses from CI
wdower Apr 2, 2026
7a5c615
fix: additional questions defensive init and autosave/history improve…
wdower Apr 2, 2026
0825f60
fix: clarity fixes and InSpec export mode (C1, C2, C6, C7)
wdower Apr 2, 2026
a8f8779
feat: InSpec NYD stubs in legacy export and auto-seed control body (B12)
wdower Apr 2, 2026
6da5f43
fix: convert membership role/remove to AJAX for reactivity (B4)
wdower Apr 2, 2026
3874918
chore: add commonmarker gem, auto-detect port, Procfile update
wdower Apr 2, 2026
b85dc69
fix: RuboCop offenses in rule.rb InSpec stub
wdower Apr 2, 2026
9bde600
fix: ESLint/Prettier formatting in Vue components
wdower Apr 2, 2026
1dfaad9
fix: resolve Brakeman file access, auth coverage, and bulk import see…
wdower Apr 2, 2026
3e9445d
chore: add Brakeman ignore for File.basename false positive
wdower Apr 2, 2026
77ee5e0
fix: resolve 4 CVEs by updating gem dependencies
wdower Apr 3, 2026
9bfb262
test: fill coverage gaps for B1, B4, C4
wdower Apr 3, 2026
b563c7a
fix: restore InSpec stub test to use individual Rule.create!
wdower Apr 3, 2026
3190e7f
fix: move seed admin password to env var to silence GitGuardian
wdower Apr 3, 2026
1ead0fc
fix: export_helper_spec method name and zip entry assertions
wdower Apr 3, 2026
7eb2a27
fix: update registry spec and auth coverage for working_copy + inspec
wdower Apr 3, 2026
8ca40cb
fix: move workflow permissions to job level in docs.yml
wdower Apr 3, 2026
a12f7c3
fix: resolve SonarCloud security hotspots
wdower Apr 3, 2026
a464f7f
fix: resolve SonarCloud maintainability issues in source files
wdower Apr 3, 2026
5161254
chore: optimize Docker image and rename compose files
wdower Apr 3, 2026
894740c
fix: make Docker host port configurable via VULCAN_PORT
wdower Apr 3, 2026
8e86b91
fix: default RAILS_FORCE_SSL to false in docker-compose.yml
wdower Apr 3, 2026
3a98ef4
fix: add authorize_viewer_project to projects#histories
wdower Apr 3, 2026
391e242
fix: update seed_idempotency_spec for refactored seed_component
wdower Apr 3, 2026
5873990
fix: address Copilot review feedback
wdower Apr 3, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
99 changes: 98 additions & 1 deletion .dockerignore
Original file line number Diff line number Diff line change
@@ -1 +1,98 @@
spec
# See https://docs.docker.com/engine/reference/builder/#dockerignore-file for more about ignoring files.

# Ignore git directory.
/.git/
/.gitignore

# Ignore bundler config.
/.bundle

# Ignore all environment files.
/.env*

# Ignore all default key files.
/config/master.key
/config/credentials/*.key

# Ignore all logfiles and tempfiles.
/log/*
/tmp/*
!/log/.keep
!/tmp/.keep

# Ignore pidfiles, but keep the directory.
/tmp/pids/*
!/tmp/pids/.keep

# Ignore storage (uploaded files in development and any SQLite databases).
/storage/*
!/storage/.keep
/tmp/storage/*
!/tmp/storage/.keep

# Ignore assets.
/node_modules/
/app/assets/builds/*
!/app/assets/builds/.keep
/public/assets

# Ignore CI service files.
/.github

# Ignore development files
/.devcontainer

# Ignore Docker-related files
/.dockerignore
/Dockerfile*

# Ignore test files
/spec

# Ignore documentation site (has its own node_modules)
/docs

# Ignore development downloads and test artifacts
/downloads
/coverage

# Ignore development-only files
/.beads
/.overcommit.yml
/lefthook.yml
/.rubocop.yml
/.eslintrc.js
/.prettierrc
/vitest.config.js
/babel.config.js
/jsconfig.json
/sonar-project.properties
/postcss.config.js

# Ignore non-Linux binaries
/bin/vulcan

# Ignore compose and bake files (not needed inside image)
/docker-compose*.yml
/docker-bake.hcl
/Caddyfile*
/nginx.conf*
/setup-docker-secrets.sh

# Ignore markdown files not needed at runtime
/CHANGELOG.md
/CODE_OF_CONDUCT.md
/CONTRIBUTING.md
/LICENSE.md
/NOTICE.md
/README.md
/RELEASE_NOTES.md
/SECURITY.md
/ROADMAP.md
/BENCHMARK-VIEWER-DESIGN.md
/AGENT-STATUS
/ENVIRONMENT_VARIABLES.md
/CLAUDE.md
/_config.yml
/CNAME
/create_admin.rb
111 changes: 99 additions & 12 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,23 @@
# =============================================================================
# DATABASE
# =============================================================================
# Development database URL (for local Rails development)
# DATABASE_URL commented out - let database.yml handle dev/test separation
# DATABASE_URL=postgres://postgres:postgres@127.0.0.1:5432/vulcan_vue_development
# Defaults (port 5432, host 127.0.0.1) work for single-project development.
# Running multiple projects simultaneously? Assign unique ports per project.
# See docs/development/port-registry.md for recommended port assignments.
#
# DATABASE_PORT=5432
# DATABASE_HOST=127.0.0.1
# POSTGRES_PORT=5432
#
# macOS with Kerberos/GSSAPI connection errors (corporate networks):
# DATABASE_GSSENCMODE=disable
#
# Worktree isolation: suffix appended to database names in database.yml
# Each worktree gets its own database (e.g., vulcan_vue_development_v2)
# DB_SUFFIX=_v2
#
# App server port (Puma):
# PORT=3000

# Docker database password (used by docker-compose)
POSTGRES_PASSWORD=postgres
Expand All @@ -22,15 +36,27 @@ SECRET_KEY_BASE=development_secret_key_base_not_for_production_use
CIPHER_PASSWORD=development_cipher_password_not_for_production_use
CIPHER_SALT=development_cipher_salt_not_for_production_use

# =============================================================================
# SSL/TLS CONFIGURATION
# =============================================================================
# Force HTTPS redirects. Defaults to true (secure by default).
# Set to false ONLY for Docker quickstart without SSL termination or local testing.
# When behind a reverse proxy (nginx, traefik), the proxy handles SSL termination
# and sets X-Forwarded-Proto header, so keep this true.
# RAILS_FORCE_SSL=true
# For local Docker testing without SSL:
# RAILS_FORCE_SSL=false

# =============================================================================
# TEST OKTA CONFIGURATION (Development/Testing)
# =============================================================================
# This is a test Okta instance for development
VULCAN_ENABLE_OIDC=true
VULCAN_OIDC_PROVIDER_TITLE=Okta (Test)
VULCAN_OIDC_ISSUER_URL=https://trial-8371755.okta.com
VULCAN_OIDC_CLIENT_ID=0oas3uve5k2VeT8KV697
VULCAN_OIDC_CLIENT_SECRET=aqfejOc97hxqtp5xZmn46yZ-m00Mx_xs3KIOzrlJuSM_UY_qx8BwhSaWYhvuOEnH
# OIDC authentication (Okta, Auth0, Keycloak, Azure AD)
# See docs/deployment/auth/ for provider-specific setup guides
VULCAN_ENABLE_OIDC=false
VULCAN_OIDC_PROVIDER_TITLE=Okta
VULCAN_OIDC_ISSUER_URL=https://your-domain.okta.com
VULCAN_OIDC_CLIENT_ID=your_oidc_client_id
VULCAN_OIDC_CLIENT_SECRET=your_oidc_client_secret
VULCAN_OIDC_REDIRECT_URI=http://localhost:3000/users/auth/oidc/callback

# With auto-discovery enabled (default), these endpoints are discovered automatically
Expand All @@ -43,7 +69,21 @@ VULCAN_OIDC_REDIRECT_URI=http://localhost:3000/users/auth/oidc/callback
# Enable local username/password login (useful for development)
VULCAN_ENABLE_LOCAL_LOGIN=true
VULCAN_ENABLE_USER_REGISTRATION=true
VULCAN_SESSION_TIMEOUT=60
# Session timeout: plain seconds (900), or with suffix: 30s, 15m, 1h
# Plain numbers: 1-9=hours, 10-299=minutes, 300+=seconds
# Default: 3600 (1 hour). DoD standard: 900 (15 min)
VULCAN_SESSION_TIMEOUT=1h
# Remember Me: keep user logged in across browser restarts
# When enabled + checked, session persists for remember_me_duration instead of session_timeout
VULCAN_ENABLE_REMEMBER_ME=true
# VULCAN_REMEMBER_ME_DURATION=8h

# Admin Bootstrap (choose one method):
# Method 1: First user becomes admin (default, great for dev)
VULCAN_FIRST_USER_ADMIN=true
# Method 2: Create specific admin from env vars (runs on db:prepare)
# VULCAN_ADMIN_EMAIL=admin@example.com
# VULCAN_ADMIN_PASSWORD=SecurePassword123!

# LDAP (disabled by default)
VULCAN_ENABLE_LDAP=false
Expand All @@ -61,7 +101,7 @@ VULCAN_CONTACT_EMAIL=admin@example.com
VULCAN_WELCOME_TEXT=Welcome to Vulcan Development

# Project permissions
VULCAN_PROJECT_CREATE_PERMISSION_ENABLED=false
VULCAN_PROJECT_CREATE_PERMISSION_ENABLED=true

# =============================================================================
# EMAIL/SMTP (Optional)
Expand All @@ -73,6 +113,52 @@ VULCAN_ENABLE_SMTP=false
# VULCAN_SMTP_SERVER_USERNAME=notifications@example.com # Defaults to VULCAN_CONTACT_EMAIL if not set
# VULCAN_SMTP_SERVER_PASSWORD=smtp_password

# =============================================================================
# ACCOUNT LOCKOUT (STIG AC-07 — enabled by default)
# =============================================================================
# Lock accounts after consecutive failed login attempts.
# Accounts auto-unlock after unlock_in_minutes OR via admin unlock on Users page.
# Set VULCAN_LOCKOUT_ENABLED=false to disable entirely.
# unlock_strategy: email (sends unlock email), time (auto-unlock), both (default)
# VULCAN_LOCKOUT_ENABLED=true
# VULCAN_LOCKOUT_MAX_ATTEMPTS=3
# VULCAN_LOCKOUT_UNLOCK_IN_MINUTES=15
# VULCAN_LOCKOUT_UNLOCK_STRATEGY=both
# VULCAN_LOCKOUT_LAST_ATTEMPT_WARNING=true

# =============================================================================
# CLASSIFICATION BANNER & CONSENT (Optional)
# =============================================================================
# Display a colored classification banner at top and bottom of every page
# DoD standard colors: UNCLASSIFIED=#007a33, CUI=#502b85, CONFIDENTIAL=#0033a0,
# SECRET=#c8102e, TOP SECRET=#ff671f, TS/SCI=#f7ea48 (text: #000000)
VULCAN_BANNER_ENABLED=false
# VULCAN_BANNER_TEXT=UNCLASSIFIED
# VULCAN_BANNER_BACKGROUND_COLOR=#007a33
# VULCAN_BANNER_TEXT_COLOR=#ffffff

# Consent/terms-of-use modal — blocks access until user clicks "I Agree"
# Acknowledgment is tracked server-side in the Rails session (AC-8 compliant).
# Increment VULCAN_CONSENT_VERSION to re-prompt all users.
# Content supports Markdown formatting (bold, lists, links, etc.)
VULCAN_CONSENT_ENABLED=false
# VULCAN_CONSENT_VERSION=1
# VULCAN_CONSENT_TITLE=Terms of Use
# VULCAN_CONSENT_CONTENT=By using this system you agree to the **acceptable use policy**.
# How long consent remains valid: 0 = per-session (DoD default), or e.g. 24h, 12h, 30m
VULCAN_CONSENT_TTL=0

# =============================================================================
# PASSWORD POLICY (Optional — DoD-aligned defaults)
# =============================================================================
# All settings default to DoD "2222" values when unset (15 chars, 2 of each type).
# Set any count to 0 to disable that requirement.
# VULCAN_PASSWORD_MIN_LENGTH=15
# VULCAN_PASSWORD_MIN_UPPERCASE=2
# VULCAN_PASSWORD_MIN_LOWERCASE=2
# VULCAN_PASSWORD_MIN_NUMBER=2
# VULCAN_PASSWORD_MIN_SPECIAL=2

# =============================================================================
# SLACK INTEGRATION (Optional)
# =============================================================================
Expand All @@ -83,6 +169,7 @@ VULCAN_ENABLE_SLACK_COMMS=false
# =============================================================================
# DEVELOPMENT NOTES
# =============================================================================
# Default admin login (after seeding): admin@example.com / 1234567ab!
# Default admin login (after seeding): admin@example.com with default password
# Override seed password: VULCAN_SEED_ADMIN_PASSWORD=YourPassword123!
# To seed the database: bundle exec rake db:seed
# To reset and reseed: bundle exec rake db:reset
66 changes: 63 additions & 3 deletions .env.production.example
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,22 @@ VULCAN_ENABLE_LDAP=false
# --- Option 3: Local Login (Not recommended for production) ---
VULCAN_ENABLE_LOCAL_LOGIN=false
VULCAN_ENABLE_USER_REGISTRATION=false
VULCAN_SESSION_TIMEOUT=60
# Session timeout: plain seconds (900), or with suffix: 30s, 15m, 1h
# Plain numbers: 1-9=hours, 10-299=minutes, 300+=seconds
# DoD standard: 900 (15 min) for non-privileged, 600 (10 min) for admin
VULCAN_SESSION_TIMEOUT=15m
# Remember Me: keep user logged in across browser restarts
# Disable for DoD/high-security environments
VULCAN_ENABLE_REMEMBER_ME=false
# VULCAN_REMEMBER_ME_DURATION=8h

# --- Admin Bootstrap (Production) ---
# Disable first-user-admin for production (security best practice)
VULCAN_FIRST_USER_ADMIN=false
# Create admin via environment variables instead (recommended):
# VULCAN_ADMIN_EMAIL=admin@your-org.com
# VULCAN_ADMIN_PASSWORD=your_secure_password_here
# If password is omitted, a secure random password will be generated and logged

# =============================================================================
# REQUIRED: Application Settings
Expand All @@ -74,6 +89,48 @@ VULCAN_SMTP_SERVER_PASSWORD=secure_smtp_password
# Optional: Email confirmation for new users
VULCAN_ENABLE_EMAIL_CONFIRMATION=false

# =============================================================================
# OPTIONAL: Account Lockout (STIG AC-07 — enabled by default)
# =============================================================================
# Lock accounts after consecutive failed login attempts.
# Defaults are STIG AC-07 compliant (3 attempts, 15 min unlock).
# VULCAN_LOCKOUT_ENABLED=true
# VULCAN_LOCKOUT_MAX_ATTEMPTS=3
# VULCAN_LOCKOUT_UNLOCK_IN_MINUTES=15
# VULCAN_LOCKOUT_UNLOCK_STRATEGY=both
# VULCAN_LOCKOUT_LAST_ATTEMPT_WARNING=true

# =============================================================================
# OPTIONAL: Classification Banner & Consent
# =============================================================================
# Display a colored classification banner at top and bottom of every page
# DoD standard colors: UNCLASSIFIED=#007a33, CUI=#502b85, CONFIDENTIAL=#0033a0,
# SECRET=#c8102e, TOP SECRET=#ff671f, TS/SCI=#f7ea48 (text: #000000)
VULCAN_BANNER_ENABLED=false
# VULCAN_BANNER_TEXT=UNCLASSIFIED
# VULCAN_BANNER_BACKGROUND_COLOR=#007a33
# VULCAN_BANNER_TEXT_COLOR=#ffffff

# Consent/terms-of-use modal — blocks access until user clicks "I Agree"
# Acknowledgment is tracked server-side in the Rails session (AC-8 compliant).
# Increment VULCAN_CONSENT_VERSION to re-prompt all users.
# Content supports Markdown formatting (bold, lists, links, etc.)
VULCAN_CONSENT_ENABLED=false
# VULCAN_CONSENT_VERSION=1
# VULCAN_CONSENT_TITLE=Terms of Use
# VULCAN_CONSENT_CONTENT=By using this system you agree to the **acceptable use policy**.
# How long consent remains valid: 0 = per-session (DoD default), or e.g. 24h, 12h, 30m
VULCAN_CONSENT_TTL=0

# =============================================================================
# OPTIONAL: Password Policy (DoD-aligned defaults — usually no changes needed)
# =============================================================================
# VULCAN_PASSWORD_MIN_LENGTH=15
# VULCAN_PASSWORD_MIN_UPPERCASE=2
# VULCAN_PASSWORD_MIN_LOWERCASE=2
# VULCAN_PASSWORD_MIN_NUMBER=2
# VULCAN_PASSWORD_MIN_SPECIAL=2

# =============================================================================
# OPTIONAL: Slack Integration
# =============================================================================
Expand All @@ -95,8 +152,11 @@ STRUCTURED_LOGGING=true
RAILS_MAX_THREADS=5
WEB_CONCURRENCY=2

# Force SSL in production
FORCE_SSL=true
# Force HTTPS redirects. Defaults to true (secure by default).
# Set to false ONLY for Docker quickstart without SSL termination.
# When behind a reverse proxy (nginx, traefik), keep this true as the
# proxy handles SSL termination and sets X-Forwarded-Proto header.
RAILS_FORCE_SSL=true

# Serve static files (required for Docker)
RAILS_SERVE_STATIC_FILES=true
Expand Down
1 change: 1 addition & 0 deletions .foreman
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
port: 3000
18 changes: 18 additions & 0 deletions .gitguardian.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# GitGuardian Configuration
# https://docs.gitguardian.com/ggshield-docs/configuration
version: 2

secret:
# Exclude backup/archive files from scanning
ignored_paths:
- '**/*.backup'
- 'archive/**'

# Known non-secret test credentials
# GoodNewsEveryone is the documented public default password for rroemhild/test-openldap
# See: https://github.com/rroemhild/docker-test-openldap
ignored_matches:
- name: rroemhild/test-openldap public default LDAP admin password
match: GoodNewsEveryone
- name: Dev seed admin default password (overridable via VULCAN_SEED_ADMIN_PASSWORD)
match: 12qwaszx!@QWASZX
Loading
Loading