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

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -9,3 +9,6 @@ test/dummy/storage/

test/dummy/tmp/
*.gem

# Each developer's setup record, written by the setup command.
/.dev_onboarder.json
3 changes: 3 additions & 0 deletions Gemfile
Original file line number Diff line number Diff line change
Expand Up @@ -18,3 +18,6 @@ gem "rubocop-rails-omakase", require: false

# Start debugger with binding.b [https://github.com/ruby/debug]
# gem "debug", ">= 1.0.0"

# One setup command that checks and fixes what a developer needs [https://github.com/DYB-Development/dev_onboarder]
gem "dev_onboarder", github: "DYB-Development/dev_onboarder", tag: "v0.6.0", require: false
8 changes: 8 additions & 0 deletions Gemfile.lock
Original file line number Diff line number Diff line change
@@ -1,3 +1,10 @@
GIT
remote: https://github.com/DYB-Development/dev_onboarder.git
revision: 39131d3f492527196fdf650363432a05a64d787b
tag: v0.6.0
specs:
dev_onboarder (0.6.0)

PATH
remote: .
specs:
Expand Down Expand Up @@ -332,6 +339,7 @@ PLATFORMS
DEPENDENCIES
capybara
dash_kit!
dev_onboarder!
minitest (~> 5.0)
propshaft
puma
Expand Down
13 changes: 13 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -168,3 +168,16 @@ end
## Design Philosophy

DashKit avoids data semantics by design. It treats datasets as opaque structures that can be rendered consistently, allowing teams to replace or evolve backends without rewriting dashboards. This deliberate decoupling keeps DashKit focused, composable, and stable over time.

## Setting up to work on DashKit

After cloning, install the bundle and run the setup command:

```
bundle install
bundle exec dev_onboarder
```

It runs the test suite and checks the Claude Code tooling the repo expects, and records what it found
in `.dev_onboarder.json`, which git ignores. `bundle exec dev_onboarder status` lists what the repo
requires now that it did not at your last run. The requirements are declared in `Setupfile`.
12 changes: 12 additions & 0 deletions Setupfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
requirement :test_suite, group: :repo_setup,
purpose: "The test suite passes on this machine",
check: "bundle exec rake test"

requirement :symphony, group: :claude_tooling,
purpose: "The Symphony rules and scribes are installed for Claude Code",
check: %(test -L "${CLAUDE_CONFIG_DIR:-$HOME/.claude}/rules" || grep -q '"symphony@' "${CLAUDE_CONFIG_DIR:-$HOME/.claude}/settings.json"),
instruction: "Clone https://github.com/tylercschneider/symphony and run its install.sh."

requirement :locals, group: :claude_tooling,
purpose: "The Claude subagents the bundle provides are installed",
check: "bundle exec the_local install"
34 changes: 34 additions & 0 deletions test/setupfile_test.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
# frozen_string_literal: true

require "test_helper"
require "dev_onboarder/requirements"

class SetupfileTest < ActiveSupport::TestCase
ROOT = File.expand_path("..", __dir__)

test "the setup file requires the test suite to pass" do
assert_equal "bundle exec rake test", check_of(:test_suite)
end

test "the setup file requires the Symphony rules and scribes to be installed for Claude Code" do
assert_includes requirements.map(&:key), :symphony
end

test "the setup file installs the Claude subagents the bundle provides" do
assert_equal "bundle exec the_local install", check_of(:locals)
end

test "git ignores a developer's setup record" do
assert system("git", "check-ignore", "--quiet", ".dev_onboarder.json", chdir: ROOT)
end

private

def check_of(key)
requirements.find { |requirement| requirement.key == key }&.check
end

def requirements
DevOnboarder::Requirements.load(File.join(ROOT, "Setupfile"))
end
end
Loading