cardinal-ai 0.2.14 → 0.2.17

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/stylesheets/cardinal.css +83 -4
  3. data/app/controllers/asana_controller.rb +31 -0
  4. data/app/controllers/boards_controller.rb +25 -1
  5. data/app/controllers/cards_controller.rb +21 -1
  6. data/app/controllers/messages_controller.rb +16 -1
  7. data/app/helpers/application_helper.rb +54 -0
  8. data/app/javascript/controllers/archive_drop_controller.js +41 -0
  9. data/app/javascript/controllers/attach_controller.js +80 -0
  10. data/app/javascript/controllers/board_column_controller.js +6 -0
  11. data/app/jobs/compact_job.rb +12 -0
  12. data/app/jobs/resume_run_job.rb +8 -0
  13. data/app/jobs/summary_job.rb +9 -0
  14. data/app/models/board.rb +10 -0
  15. data/app/models/card.rb +19 -0
  16. data/app/models/column.rb +3 -3
  17. data/app/services/agent/runner.rb +18 -3
  18. data/app/services/asana.rb +73 -0
  19. data/app/services/github_issues.rb +49 -0
  20. data/app/views/asana/new_card.html.erb +59 -0
  21. data/app/views/boards/archive.html.erb +56 -0
  22. data/app/views/boards/issues.html.erb +41 -0
  23. data/app/views/boards/show.html.erb +8 -0
  24. data/app/views/cards/_card.html.erb +6 -2
  25. data/app/views/cards/_compact_panel.html.erb +5 -3
  26. data/app/views/cards/_detail.html.erb +16 -5
  27. data/app/views/cards/_summary_panel.html.erb +5 -3
  28. data/app/views/cards/new.html.erb +3 -0
  29. data/app/views/columns/_column.html.erb +8 -1
  30. data/app/views/events/_event.html.erb +2 -1
  31. data/config/routes.rb +10 -0
  32. data/db/cable_schema.rb +15 -3
  33. data/db/migrate/20260705120001_add_issue_number_to_cards.rb +5 -0
  34. data/db/migrate/20260705193935_add_settings_to_boards.rb +6 -0
  35. data/db/migrate/20260705225451_add_asana_url_to_cards.rb +5 -0
  36. data/db/queue_schema.rb +74 -62
  37. data/lib/cardinal/version.rb +1 -1
  38. metadata +12 -1
data/db/queue_schema.rb CHANGED
@@ -1,123 +1,135 @@
1
- ActiveRecord::Schema[7.1].define(version: 1) do
1
+ # This file is auto-generated from the current state of the database. Instead
2
+ # of editing this file, please use the migrations feature of Active Record to
3
+ # incrementally modify your database, and then regenerate this schema definition.
4
+ #
5
+ # This file is the source Rails uses to define your schema when running `bin/rails
6
+ # db:schema:load`. When creating a new database, `bin/rails db:schema:load` tends to
7
+ # be faster and is potentially less error prone than running all of your
8
+ # migrations from scratch. Old migrations may fail to apply correctly if those
9
+ # migrations use external dependencies or application code.
10
+ #
11
+ # It's strongly recommended that you check this file into your version control system.
12
+
13
+ ActiveRecord::Schema[8.1].define(version: 1) do
2
14
  create_table "solid_queue_blocked_executions", force: :cascade do |t|
3
- t.bigint "job_id", null: false
4
- t.string "queue_name", null: false
5
- t.integer "priority", default: 0, null: false
6
15
  t.string "concurrency_key", null: false
7
- t.datetime "expires_at", null: false
8
16
  t.datetime "created_at", null: false
9
- t.index [ "concurrency_key", "priority", "job_id" ], name: "index_solid_queue_blocked_executions_for_release"
10
- t.index [ "expires_at", "concurrency_key" ], name: "index_solid_queue_blocked_executions_for_maintenance"
11
- t.index [ "job_id" ], name: "index_solid_queue_blocked_executions_on_job_id", unique: true
17
+ t.datetime "expires_at", null: false
18
+ t.bigint "job_id", null: false
19
+ t.integer "priority", default: 0, null: false
20
+ t.string "queue_name", null: false
21
+ t.index ["concurrency_key", "priority", "job_id"], name: "index_solid_queue_blocked_executions_for_release"
22
+ t.index ["expires_at", "concurrency_key"], name: "index_solid_queue_blocked_executions_for_maintenance"
23
+ t.index ["job_id"], name: "index_solid_queue_blocked_executions_on_job_id", unique: true
12
24
  end
13
25
 
14
26
  create_table "solid_queue_claimed_executions", force: :cascade do |t|
27
+ t.datetime "created_at", null: false
15
28
  t.bigint "job_id", null: false
16
29
  t.bigint "process_id"
17
- t.datetime "created_at", null: false
18
- t.index [ "job_id" ], name: "index_solid_queue_claimed_executions_on_job_id", unique: true
19
- t.index [ "process_id", "job_id" ], name: "index_solid_queue_claimed_executions_on_process_id_and_job_id"
30
+ t.index ["job_id"], name: "index_solid_queue_claimed_executions_on_job_id", unique: true
31
+ t.index ["process_id", "job_id"], name: "index_solid_queue_claimed_executions_on_process_id_and_job_id"
20
32
  end
21
33
 
22
34
  create_table "solid_queue_failed_executions", force: :cascade do |t|
23
- t.bigint "job_id", null: false
24
- t.text "error"
25
35
  t.datetime "created_at", null: false
26
- t.index [ "job_id" ], name: "index_solid_queue_failed_executions_on_job_id", unique: true
36
+ t.text "error"
37
+ t.bigint "job_id", null: false
38
+ t.index ["job_id"], name: "index_solid_queue_failed_executions_on_job_id", unique: true
27
39
  end
28
40
 
29
41
  create_table "solid_queue_jobs", force: :cascade do |t|
30
- t.string "queue_name", null: false
31
- t.string "class_name", null: false
32
- t.text "arguments"
33
- t.integer "priority", default: 0, null: false
34
42
  t.string "active_job_id"
35
- t.datetime "scheduled_at"
36
- t.datetime "finished_at"
43
+ t.text "arguments"
44
+ t.string "class_name", null: false
37
45
  t.string "concurrency_key"
38
46
  t.datetime "created_at", null: false
47
+ t.datetime "finished_at"
48
+ t.integer "priority", default: 0, null: false
49
+ t.string "queue_name", null: false
50
+ t.datetime "scheduled_at"
39
51
  t.datetime "updated_at", null: false
40
- t.index [ "active_job_id" ], name: "index_solid_queue_jobs_on_active_job_id"
41
- t.index [ "class_name" ], name: "index_solid_queue_jobs_on_class_name"
42
- t.index [ "finished_at" ], name: "index_solid_queue_jobs_on_finished_at"
43
- t.index [ "queue_name", "finished_at" ], name: "index_solid_queue_jobs_for_filtering"
44
- t.index [ "scheduled_at", "finished_at" ], name: "index_solid_queue_jobs_for_alerting"
52
+ t.index ["active_job_id"], name: "index_solid_queue_jobs_on_active_job_id"
53
+ t.index ["class_name"], name: "index_solid_queue_jobs_on_class_name"
54
+ t.index ["finished_at"], name: "index_solid_queue_jobs_on_finished_at"
55
+ t.index ["queue_name", "finished_at"], name: "index_solid_queue_jobs_for_filtering"
56
+ t.index ["scheduled_at", "finished_at"], name: "index_solid_queue_jobs_for_alerting"
45
57
  end
46
58
 
47
59
  create_table "solid_queue_pauses", force: :cascade do |t|
48
- t.string "queue_name", null: false
49
60
  t.datetime "created_at", null: false
50
- t.index [ "queue_name" ], name: "index_solid_queue_pauses_on_queue_name", unique: true
61
+ t.string "queue_name", null: false
62
+ t.index ["queue_name"], name: "index_solid_queue_pauses_on_queue_name", unique: true
51
63
  end
52
64
 
53
65
  create_table "solid_queue_processes", force: :cascade do |t|
66
+ t.datetime "created_at", null: false
67
+ t.string "hostname"
54
68
  t.string "kind", null: false
55
69
  t.datetime "last_heartbeat_at", null: false
56
- t.bigint "supervisor_id"
57
- t.integer "pid", null: false
58
- t.string "hostname"
59
70
  t.text "metadata"
60
- t.datetime "created_at", null: false
61
71
  t.string "name", null: false
62
- t.index [ "last_heartbeat_at" ], name: "index_solid_queue_processes_on_last_heartbeat_at"
63
- t.index [ "name", "supervisor_id" ], name: "index_solid_queue_processes_on_name_and_supervisor_id", unique: true
64
- t.index [ "supervisor_id" ], name: "index_solid_queue_processes_on_supervisor_id"
72
+ t.integer "pid", null: false
73
+ t.bigint "supervisor_id"
74
+ t.index ["last_heartbeat_at"], name: "index_solid_queue_processes_on_last_heartbeat_at"
75
+ t.index ["name", "supervisor_id"], name: "index_solid_queue_processes_on_name_and_supervisor_id", unique: true
76
+ t.index ["supervisor_id"], name: "index_solid_queue_processes_on_supervisor_id"
65
77
  end
66
78
 
67
79
  create_table "solid_queue_ready_executions", force: :cascade do |t|
80
+ t.datetime "created_at", null: false
68
81
  t.bigint "job_id", null: false
69
- t.string "queue_name", null: false
70
82
  t.integer "priority", default: 0, null: false
71
- t.datetime "created_at", null: false
72
- t.index [ "job_id" ], name: "index_solid_queue_ready_executions_on_job_id", unique: true
73
- t.index [ "priority", "job_id" ], name: "index_solid_queue_poll_all"
74
- t.index [ "queue_name", "priority", "job_id" ], name: "index_solid_queue_poll_by_queue"
83
+ t.string "queue_name", null: false
84
+ t.index ["job_id"], name: "index_solid_queue_ready_executions_on_job_id", unique: true
85
+ t.index ["priority", "job_id"], name: "index_solid_queue_poll_all"
86
+ t.index ["queue_name", "priority", "job_id"], name: "index_solid_queue_poll_by_queue"
75
87
  end
76
88
 
77
89
  create_table "solid_queue_recurring_executions", force: :cascade do |t|
90
+ t.datetime "created_at", null: false
78
91
  t.bigint "job_id", null: false
79
- t.string "task_key", null: false
80
92
  t.datetime "run_at", null: false
81
- t.datetime "created_at", null: false
82
- t.index [ "job_id" ], name: "index_solid_queue_recurring_executions_on_job_id", unique: true
83
- t.index [ "task_key", "run_at" ], name: "index_solid_queue_recurring_executions_on_task_key_and_run_at", unique: true
93
+ t.string "task_key", null: false
94
+ t.index ["job_id"], name: "index_solid_queue_recurring_executions_on_job_id", unique: true
95
+ t.index ["task_key", "run_at"], name: "index_solid_queue_recurring_executions_on_task_key_and_run_at", unique: true
84
96
  end
85
97
 
86
98
  create_table "solid_queue_recurring_tasks", force: :cascade do |t|
87
- t.string "key", null: false
88
- t.string "schedule", null: false
89
- t.string "command", limit: 2048
90
- t.string "class_name"
91
99
  t.text "arguments"
92
- t.string "queue_name"
100
+ t.string "class_name"
101
+ t.string "command", limit: 2048
102
+ t.datetime "created_at", null: false
103
+ t.text "description"
104
+ t.string "key", null: false
93
105
  t.integer "priority", default: 0
106
+ t.string "queue_name"
107
+ t.string "schedule", null: false
94
108
  t.boolean "static", default: true, null: false
95
- t.text "description"
96
- t.datetime "created_at", null: false
97
109
  t.datetime "updated_at", null: false
98
- t.index [ "key" ], name: "index_solid_queue_recurring_tasks_on_key", unique: true
99
- t.index [ "static" ], name: "index_solid_queue_recurring_tasks_on_static"
110
+ t.index ["key"], name: "index_solid_queue_recurring_tasks_on_key", unique: true
111
+ t.index ["static"], name: "index_solid_queue_recurring_tasks_on_static"
100
112
  end
101
113
 
102
114
  create_table "solid_queue_scheduled_executions", force: :cascade do |t|
115
+ t.datetime "created_at", null: false
103
116
  t.bigint "job_id", null: false
104
- t.string "queue_name", null: false
105
117
  t.integer "priority", default: 0, null: false
118
+ t.string "queue_name", null: false
106
119
  t.datetime "scheduled_at", null: false
107
- t.datetime "created_at", null: false
108
- t.index [ "job_id" ], name: "index_solid_queue_scheduled_executions_on_job_id", unique: true
109
- t.index [ "scheduled_at", "priority", "job_id" ], name: "index_solid_queue_dispatch_all"
120
+ t.index ["job_id"], name: "index_solid_queue_scheduled_executions_on_job_id", unique: true
121
+ t.index ["scheduled_at", "priority", "job_id"], name: "index_solid_queue_dispatch_all"
110
122
  end
111
123
 
112
124
  create_table "solid_queue_semaphores", force: :cascade do |t|
113
- t.string "key", null: false
114
- t.integer "value", default: 1, null: false
115
- t.datetime "expires_at", null: false
116
125
  t.datetime "created_at", null: false
126
+ t.datetime "expires_at", null: false
127
+ t.string "key", null: false
117
128
  t.datetime "updated_at", null: false
118
- t.index [ "expires_at" ], name: "index_solid_queue_semaphores_on_expires_at"
119
- t.index [ "key", "value" ], name: "index_solid_queue_semaphores_on_key_and_value"
120
- t.index [ "key" ], name: "index_solid_queue_semaphores_on_key", unique: true
129
+ t.integer "value", default: 1, null: false
130
+ t.index ["expires_at"], name: "index_solid_queue_semaphores_on_expires_at"
131
+ t.index ["key", "value"], name: "index_solid_queue_semaphores_on_key_and_value"
132
+ t.index ["key"], name: "index_solid_queue_semaphores_on_key", unique: true
121
133
  end
122
134
 
123
135
  add_foreign_key "solid_queue_blocked_executions", "solid_queue_jobs", column: "job_id", on_delete: :cascade
@@ -1,3 +1,3 @@
1
1
  module Cardinal
2
- VERSION = "0.2.14"
2
+ VERSION = "0.2.17"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cardinal-ai
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.14
4
+ version: 0.2.17
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jason Ellis
@@ -163,6 +163,7 @@ files:
163
163
  - app/assets/stylesheets/application.css
164
164
  - app/assets/stylesheets/cardinal.css
165
165
  - app/controllers/application_controller.rb
166
+ - app/controllers/asana_controller.rb
166
167
  - app/controllers/boards_controller.rb
167
168
  - app/controllers/cards_controller.rb
168
169
  - app/controllers/columns_controller.rb
@@ -171,6 +172,8 @@ files:
171
172
  - app/helpers/application_helper.rb
172
173
  - app/javascript/application.js
173
174
  - app/javascript/controllers/application.js
175
+ - app/javascript/controllers/archive_drop_controller.js
176
+ - app/javascript/controllers/attach_controller.js
174
177
  - app/javascript/controllers/autosave_controller.js
175
178
  - app/javascript/controllers/board_column_controller.js
176
179
  - app/javascript/controllers/clipboard_controller.js
@@ -207,13 +210,18 @@ files:
207
210
  - app/models/run.rb
208
211
  - app/services/agent/runner.rb
209
212
  - app/services/agent/workspace.rb
213
+ - app/services/asana.rb
210
214
  - app/services/card_transition.rb
211
215
  - app/services/claude_cli.rb
216
+ - app/services/github_issues.rb
212
217
  - app/services/rules.rb
213
218
  - app/services/rules/compiler.rb
214
219
  - app/services/run_sweeper.rb
220
+ - app/views/asana/new_card.html.erb
221
+ - app/views/boards/archive.html.erb
215
222
  - app/views/boards/brief.html.erb
216
223
  - app/views/boards/edit.html.erb
224
+ - app/views/boards/issues.html.erb
217
225
  - app/views/boards/show.html.erb
218
226
  - app/views/cards/_card.html.erb
219
227
  - app/views/cards/_compact_panel.html.erb
@@ -269,6 +277,9 @@ files:
269
277
  - db/migrate/20260704140000_add_compact_to_cards.rb
270
278
  - db/migrate/20260704231436_add_model_and_effort_to_cards.rb
271
279
  - db/migrate/20260705120000_create_ai_calls.rb
280
+ - db/migrate/20260705120001_add_issue_number_to_cards.rb
281
+ - db/migrate/20260705193935_add_settings_to_boards.rb
282
+ - db/migrate/20260705225451_add_asana_url_to_cards.rb
272
283
  - db/queue_schema.rb
273
284
  - db/seeds.rb
274
285
  - docker/agent/Dockerfile