coplan-engine 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (84) hide show
  1. checksums.yaml +7 -0
  2. data/app/assets/stylesheets/coplan/application.css +956 -0
  3. data/app/controllers/coplan/api/v1/base_controller.rb +75 -0
  4. data/app/controllers/coplan/api/v1/comments_controller.rb +135 -0
  5. data/app/controllers/coplan/api/v1/leases_controller.rb +62 -0
  6. data/app/controllers/coplan/api/v1/operations_controller.rb +298 -0
  7. data/app/controllers/coplan/api/v1/plans_controller.rb +129 -0
  8. data/app/controllers/coplan/api/v1/sessions_controller.rb +92 -0
  9. data/app/controllers/coplan/application_controller.rb +78 -0
  10. data/app/controllers/coplan/automated_reviews_controller.rb +29 -0
  11. data/app/controllers/coplan/comment_threads_controller.rb +148 -0
  12. data/app/controllers/coplan/comments_controller.rb +40 -0
  13. data/app/controllers/coplan/dashboard_controller.rb +6 -0
  14. data/app/controllers/coplan/plan_versions_controller.rb +29 -0
  15. data/app/controllers/coplan/plans_controller.rb +53 -0
  16. data/app/controllers/coplan/settings/tokens_controller.rb +37 -0
  17. data/app/helpers/coplan/application_helper.rb +4 -0
  18. data/app/helpers/coplan/comments_helper.rb +20 -0
  19. data/app/helpers/coplan/markdown_helper.rb +36 -0
  20. data/app/javascript/controllers/coplan/dropdown_controller.js +25 -0
  21. data/app/javascript/controllers/coplan/line_selection_controller.js +112 -0
  22. data/app/javascript/controllers/coplan/tabs_controller.js +18 -0
  23. data/app/javascript/controllers/coplan/text_selection_controller.js +376 -0
  24. data/app/jobs/coplan/application_job.rb +4 -0
  25. data/app/jobs/coplan/automated_review_job.rb +71 -0
  26. data/app/jobs/coplan/commit_expired_session_job.rb +29 -0
  27. data/app/jobs/coplan/notification_job.rb +10 -0
  28. data/app/models/coplan/api_token.rb +50 -0
  29. data/app/models/coplan/application_record.rb +14 -0
  30. data/app/models/coplan/automated_plan_reviewer.rb +62 -0
  31. data/app/models/coplan/comment.rb +24 -0
  32. data/app/models/coplan/comment_thread.rb +151 -0
  33. data/app/models/coplan/current.rb +5 -0
  34. data/app/models/coplan/edit_lease.rb +57 -0
  35. data/app/models/coplan/edit_session.rb +61 -0
  36. data/app/models/coplan/plan.rb +28 -0
  37. data/app/models/coplan/plan_collaborator.rb +12 -0
  38. data/app/models/coplan/plan_version.rb +23 -0
  39. data/app/models/coplan/user.rb +20 -0
  40. data/app/policies/coplan/application_policy.rb +14 -0
  41. data/app/policies/coplan/comment_thread_policy.rb +23 -0
  42. data/app/policies/coplan/plan_policy.rb +15 -0
  43. data/app/services/coplan/ai_providers/anthropic.rb +21 -0
  44. data/app/services/coplan/ai_providers/open_ai.rb +44 -0
  45. data/app/services/coplan/broadcaster.rb +32 -0
  46. data/app/services/coplan/plans/apply_operations.rb +128 -0
  47. data/app/services/coplan/plans/commit_session.rb +186 -0
  48. data/app/services/coplan/plans/create.rb +30 -0
  49. data/app/services/coplan/plans/operation_error.rb +5 -0
  50. data/app/services/coplan/plans/position_resolver.rb +191 -0
  51. data/app/services/coplan/plans/review_prompt_formatter.rb +25 -0
  52. data/app/services/coplan/plans/review_response_parser.rb +65 -0
  53. data/app/services/coplan/plans/transform_range.rb +99 -0
  54. data/app/services/coplan/plans/trigger_automated_reviews.rb +33 -0
  55. data/app/views/coplan/comment_threads/_new_comment_form.html.erb +17 -0
  56. data/app/views/coplan/comment_threads/_reply_form.html.erb +8 -0
  57. data/app/views/coplan/comment_threads/_thread.html.erb +47 -0
  58. data/app/views/coplan/comments/_comment.html.erb +9 -0
  59. data/app/views/coplan/dashboard/show.html.erb +8 -0
  60. data/app/views/coplan/plan_versions/index.html.erb +21 -0
  61. data/app/views/coplan/plan_versions/show.html.erb +29 -0
  62. data/app/views/coplan/plans/_header.html.erb +26 -0
  63. data/app/views/coplan/plans/edit.html.erb +15 -0
  64. data/app/views/coplan/plans/index.html.erb +35 -0
  65. data/app/views/coplan/plans/show.html.erb +56 -0
  66. data/app/views/coplan/settings/tokens/_form.html.erb +8 -0
  67. data/app/views/coplan/settings/tokens/_token_reveal.html.erb +7 -0
  68. data/app/views/coplan/settings/tokens/_token_row.html.erb +24 -0
  69. data/app/views/coplan/settings/tokens/create.turbo_stream.erb +11 -0
  70. data/app/views/coplan/settings/tokens/destroy.turbo_stream.erb +5 -0
  71. data/app/views/coplan/settings/tokens/index.html.erb +32 -0
  72. data/app/views/layouts/coplan/application.html.erb +42 -0
  73. data/config/importmap.rb +1 -0
  74. data/config/routes.rb +41 -0
  75. data/db/migrate/20260226200000_create_coplan_schema.rb +173 -0
  76. data/lib/coplan/configuration.rb +17 -0
  77. data/lib/coplan/engine.rb +34 -0
  78. data/lib/coplan/version.rb +3 -0
  79. data/lib/coplan.rb +15 -0
  80. data/lib/tasks/coplan.rake +4 -0
  81. data/prompts/reviewers/routing.md +14 -0
  82. data/prompts/reviewers/scalability.md +14 -0
  83. data/prompts/reviewers/security.md +14 -0
  84. metadata +245 -0
@@ -0,0 +1,173 @@
1
+ class CreateCoplanSchema < ActiveRecord::Migration[8.1]
2
+ def change
3
+ create_table :coplan_users, id: { type: :string, limit: 36 } do |t|
4
+ t.string :external_id, null: false
5
+ t.string :email
6
+ t.string :name, null: false
7
+ t.boolean :admin, default: false, null: false
8
+ t.json :metadata
9
+ t.timestamps
10
+ end
11
+
12
+ add_index :coplan_users, :external_id, unique: true
13
+ add_index :coplan_users, :email, unique: true
14
+
15
+ create_table :coplan_plans, id: { type: :string, limit: 36 } do |t|
16
+ t.string :title, null: false
17
+ t.string :status, default: "brainstorm", null: false
18
+ t.integer :current_revision, default: 0, null: false
19
+ t.string :created_by_user_id, limit: 36, null: false
20
+ t.string :current_plan_version_id, limit: 36
21
+ t.json :tags
22
+ t.json :metadata
23
+ t.timestamps
24
+ end
25
+
26
+ add_index :coplan_plans, :status
27
+ add_index :coplan_plans, :updated_at
28
+ add_index :coplan_plans, :created_by_user_id
29
+ add_foreign_key :coplan_plans, :coplan_users, column: :created_by_user_id
30
+
31
+ create_table :coplan_plan_versions, id: { type: :string, limit: 36 } do |t|
32
+ t.string :plan_id, limit: 36, null: false
33
+ t.integer :revision, null: false
34
+ t.text :content_markdown, null: false
35
+ t.string :content_sha256, null: false
36
+ t.text :diff_unified
37
+ t.text :change_summary
38
+ t.text :reason
39
+ t.text :prompt_excerpt
40
+ t.json :operations_json
41
+ t.integer :base_revision
42
+ t.string :actor_id, limit: 36
43
+ t.string :actor_type, null: false
44
+ t.string :ai_provider
45
+ t.string :ai_model
46
+ t.timestamp :created_at, null: false
47
+ end
48
+
49
+ add_index :coplan_plan_versions, :plan_id
50
+ add_index :coplan_plan_versions, [:plan_id, :revision], unique: true
51
+ add_index :coplan_plan_versions, [:plan_id, :created_at]
52
+ add_foreign_key :coplan_plan_versions, :coplan_plans, column: :plan_id
53
+
54
+ # Now that coplan_plan_versions exists, add the FK for current_plan_version_id
55
+ add_foreign_key :coplan_plans, :coplan_plan_versions, column: :current_plan_version_id
56
+
57
+ create_table :coplan_plan_collaborators, id: { type: :string, limit: 36 } do |t|
58
+ t.string :plan_id, limit: 36, null: false
59
+ t.string :user_id, limit: 36, null: false
60
+ t.string :added_by_user_id, limit: 36
61
+ t.string :role, null: false
62
+ t.timestamps
63
+ end
64
+
65
+ add_index :coplan_plan_collaborators, :plan_id
66
+ add_index :coplan_plan_collaborators, :user_id
67
+ add_index :coplan_plan_collaborators, :added_by_user_id
68
+ add_index :coplan_plan_collaborators, [:plan_id, :user_id], unique: true
69
+ add_foreign_key :coplan_plan_collaborators, :coplan_plans, column: :plan_id
70
+ add_foreign_key :coplan_plan_collaborators, :coplan_users, column: :user_id
71
+ add_foreign_key :coplan_plan_collaborators, :coplan_users, column: :added_by_user_id
72
+
73
+ create_table :coplan_comment_threads, id: { type: :string, limit: 36 } do |t|
74
+ t.string :plan_id, limit: 36, null: false
75
+ t.string :plan_version_id, limit: 36, null: false
76
+ t.string :created_by_user_id, limit: 36, null: false
77
+ t.string :resolved_by_user_id, limit: 36
78
+ t.string :addressed_in_plan_version_id, limit: 36
79
+ t.string :out_of_date_since_version_id, limit: 36
80
+ t.string :status, default: "open", null: false
81
+ t.boolean :out_of_date, default: false, null: false
82
+ t.text :anchor_text
83
+ t.text :anchor_context
84
+ t.integer :anchor_start
85
+ t.integer :anchor_end
86
+ t.integer :anchor_revision
87
+ t.integer :start_line
88
+ t.integer :end_line
89
+ t.timestamps
90
+ end
91
+
92
+ add_index :coplan_comment_threads, [:plan_id, :status]
93
+ add_index :coplan_comment_threads, [:plan_id, :out_of_date]
94
+ add_foreign_key :coplan_comment_threads, :coplan_plans, column: :plan_id
95
+ add_foreign_key :coplan_comment_threads, :coplan_plan_versions, column: :plan_version_id
96
+ add_foreign_key :coplan_comment_threads, :coplan_plan_versions, column: :addressed_in_plan_version_id
97
+ add_foreign_key :coplan_comment_threads, :coplan_plan_versions, column: :out_of_date_since_version_id
98
+ add_foreign_key :coplan_comment_threads, :coplan_users, column: :created_by_user_id
99
+ add_foreign_key :coplan_comment_threads, :coplan_users, column: :resolved_by_user_id
100
+
101
+ create_table :coplan_comments, id: { type: :string, limit: 36 } do |t|
102
+ t.string :comment_thread_id, limit: 36, null: false
103
+ t.string :author_id, limit: 36
104
+ t.string :author_type, null: false
105
+ t.string :agent_name
106
+ t.text :body_markdown, null: false
107
+ t.timestamps
108
+ end
109
+
110
+ add_index :coplan_comments, [:comment_thread_id, :created_at]
111
+ add_foreign_key :coplan_comments, :coplan_comment_threads, column: :comment_thread_id
112
+
113
+ create_table :coplan_edit_leases, id: { type: :string, limit: 36 } do |t|
114
+ t.string :plan_id, limit: 36, null: false
115
+ t.string :holder_id, limit: 36
116
+ t.string :holder_type, null: false
117
+ t.string :lease_token_digest, null: false
118
+ t.timestamp :expires_at, null: false
119
+ t.timestamp :last_heartbeat_at, null: false
120
+ t.timestamps
121
+ end
122
+
123
+ add_index :coplan_edit_leases, :plan_id, unique: true
124
+ add_foreign_key :coplan_edit_leases, :coplan_plans, column: :plan_id
125
+
126
+ create_table :coplan_edit_sessions, id: { type: :string, limit: 36 } do |t|
127
+ t.string :plan_id, limit: 36, null: false
128
+ t.string :plan_version_id, limit: 36
129
+ t.string :actor_id, limit: 36
130
+ t.string :actor_type, null: false
131
+ t.string :status, default: "open", null: false
132
+ t.integer :base_revision, null: false
133
+ t.text :draft_content, size: :long
134
+ t.text :change_summary
135
+ t.json :operations_json, null: false
136
+ t.timestamp :expires_at, null: false
137
+ t.timestamp :committed_at
138
+ t.timestamps
139
+ end
140
+
141
+ add_index :coplan_edit_sessions, [:plan_id, :status]
142
+ add_foreign_key :coplan_edit_sessions, :coplan_plans, column: :plan_id
143
+ add_foreign_key :coplan_edit_sessions, :coplan_plan_versions, column: :plan_version_id
144
+
145
+ create_table :coplan_api_tokens, id: { type: :string, limit: 36 } do |t|
146
+ t.string :user_id, limit: 36, null: false
147
+ t.string :name, null: false
148
+ t.string :token_digest, null: false
149
+ t.string :token_prefix, limit: 8
150
+ t.timestamp :expires_at
151
+ t.timestamp :revoked_at
152
+ t.timestamp :last_used_at
153
+ t.timestamps
154
+ end
155
+
156
+ add_index :coplan_api_tokens, :user_id
157
+ add_index :coplan_api_tokens, :token_digest, unique: true
158
+ add_foreign_key :coplan_api_tokens, :coplan_users, column: :user_id
159
+
160
+ create_table :coplan_automated_plan_reviewers, id: { type: :string, limit: 36 } do |t|
161
+ t.string :key, null: false
162
+ t.string :name, null: false
163
+ t.text :prompt_text, null: false
164
+ t.string :ai_provider, default: "openai", null: false
165
+ t.string :ai_model, null: false
166
+ t.json :trigger_statuses, null: false
167
+ t.boolean :enabled, default: true, null: false
168
+ t.timestamps
169
+ end
170
+
171
+ add_index :coplan_automated_plan_reviewers, :key, unique: true
172
+ end
173
+ end
@@ -0,0 +1,17 @@
1
+ module CoPlan
2
+ class Configuration
3
+ attr_accessor :authenticate, :api_authenticate, :sign_in_path
4
+ attr_accessor :ai_base_url, :ai_api_key, :ai_model
5
+ attr_accessor :error_reporter
6
+ attr_accessor :notification_handler
7
+
8
+ def initialize
9
+ @authenticate = nil
10
+ @ai_base_url = "https://api.openai.com/v1"
11
+ @ai_api_key = nil
12
+ @ai_model = "gpt-4o"
13
+ @error_reporter = ->(exception, context) { Rails.error.report(exception, context: context) }
14
+ @notification_handler = nil
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,34 @@
1
+ module CoPlan
2
+ class Engine < ::Rails::Engine
3
+ isolate_namespace CoPlan
4
+
5
+ initializer "coplan.autoloader", before: :set_autoload_paths do
6
+ Rails.autoloaders.each do |autoloader|
7
+ autoloader.inflector.inflect("coplan" => "CoPlan")
8
+ end
9
+ end
10
+
11
+ initializer "coplan.importmap", before: "importmap" do |app|
12
+ app.config.importmap.paths << Engine.root.join("config/importmap.rb")
13
+ app.config.importmap.cache_sweepers << Engine.root.join("app/javascript")
14
+ end
15
+
16
+ initializer "coplan.assets" do |app|
17
+ app.config.assets.paths << Engine.root.join("app/assets/stylesheets")
18
+ app.config.assets.paths << Engine.root.join("app/javascript")
19
+ end
20
+
21
+ initializer "coplan.factories", after: "factory_bot.set_factory_paths" do
22
+ if defined?(FactoryBot)
23
+ FactoryBot.definition_file_paths << Engine.root.join("spec", "factories")
24
+ end
25
+ end
26
+
27
+ end
28
+
29
+ # Override table name prefix: isolate_namespace generates "co_plan_"
30
+ # from CoPlan.underscore, but our tables use "coplan_"
31
+ ActiveSupport.on_load(:active_record) do
32
+ CoPlan.singleton_class.redefine_method(:table_name_prefix) { "coplan_" }
33
+ end
34
+ end
@@ -0,0 +1,3 @@
1
+ module CoPlan
2
+ VERSION = "0.1.0"
3
+ end
data/lib/coplan.rb ADDED
@@ -0,0 +1,15 @@
1
+ require "commonmarker"
2
+ require "coplan/configuration"
3
+ require "coplan/engine"
4
+
5
+ module CoPlan
6
+ class << self
7
+ def configuration
8
+ @configuration ||= Configuration.new
9
+ end
10
+
11
+ def configure
12
+ yield(configuration)
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,4 @@
1
+ # Automatically copy engine migrations before db:migrate so hosts
2
+ # never silently fall behind on schema changes.
3
+ # Rails derives the task name from CoPlan → co_plan.
4
+ Rake::Task["db:migrate"].enhance(["co_plan:install:migrations"]) if Rake::Task.task_defined?("db:migrate")
@@ -0,0 +1,14 @@
1
+ You are an architecture reviewer focused on system routing and API design.
2
+
3
+ Review the following plan for routing and API design concerns. Focus on:
4
+
5
+ - REST conventions and resource naming
6
+ - URL structure and consistency
7
+ - API versioning strategy
8
+ - Request/response payload design
9
+ - Error handling patterns
10
+ - Middleware and filter chains
11
+
12
+ Be specific. Reference the relevant sections of the plan. Suggest concrete improvements where possible.
13
+
14
+ Respond in Markdown. Keep your review concise and actionable.
@@ -0,0 +1,14 @@
1
+ You are a scalability reviewer for technical plans and proposals.
2
+
3
+ Review the following plan for scalability concerns. Focus on:
4
+
5
+ - Database query patterns and indexing strategies
6
+ - Caching opportunities and cache invalidation
7
+ - Background job volume and queue contention
8
+ - API rate limits and throughput bottlenecks
9
+ - Data growth projections and storage implications
10
+ - Horizontal vs vertical scaling considerations
11
+
12
+ Be specific. Reference the relevant sections of the plan. Suggest concrete improvements where possible.
13
+
14
+ Respond in Markdown. Keep your review concise and actionable.
@@ -0,0 +1,14 @@
1
+ You are a security reviewer for technical plans and proposals.
2
+
3
+ Review the following plan for security concerns. Focus on:
4
+
5
+ - Authentication and authorization gaps
6
+ - Data exposure or leakage risks
7
+ - Input validation and injection vulnerabilities
8
+ - Secrets management issues
9
+ - Network and infrastructure security
10
+ - Compliance considerations
11
+
12
+ Be specific. Reference the relevant sections of the plan. Suggest concrete improvements where possible.
13
+
14
+ Respond in Markdown. Keep your review concise and actionable.
metadata ADDED
@@ -0,0 +1,245 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: coplan-engine
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Block
8
+ bindir: bin
9
+ cert_chain: []
10
+ date: 1980-01-02 00:00:00.000000000 Z
11
+ dependencies:
12
+ - !ruby/object:Gem::Dependency
13
+ name: rails
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - ">="
17
+ - !ruby/object:Gem::Version
18
+ version: '8.0'
19
+ type: :runtime
20
+ prerelease: false
21
+ version_requirements: !ruby/object:Gem::Requirement
22
+ requirements:
23
+ - - ">="
24
+ - !ruby/object:Gem::Version
25
+ version: '8.0'
26
+ - !ruby/object:Gem::Dependency
27
+ name: commonmarker
28
+ requirement: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ version: '0'
40
+ - !ruby/object:Gem::Dependency
41
+ name: diffy
42
+ requirement: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: '0'
47
+ type: :runtime
48
+ prerelease: false
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ - !ruby/object:Gem::Dependency
55
+ name: ruby-openai
56
+ requirement: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ version: '0'
61
+ type: :runtime
62
+ prerelease: false
63
+ version_requirements: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - ">="
66
+ - !ruby/object:Gem::Version
67
+ version: '0'
68
+ - !ruby/object:Gem::Dependency
69
+ name: propshaft
70
+ requirement: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ version: '0'
75
+ type: :runtime
76
+ prerelease: false
77
+ version_requirements: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - ">="
80
+ - !ruby/object:Gem::Version
81
+ version: '0'
82
+ - !ruby/object:Gem::Dependency
83
+ name: importmap-rails
84
+ requirement: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - ">="
87
+ - !ruby/object:Gem::Version
88
+ version: '0'
89
+ type: :runtime
90
+ prerelease: false
91
+ version_requirements: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - ">="
94
+ - !ruby/object:Gem::Version
95
+ version: '0'
96
+ - !ruby/object:Gem::Dependency
97
+ name: turbo-rails
98
+ requirement: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - ">="
101
+ - !ruby/object:Gem::Version
102
+ version: '0'
103
+ type: :runtime
104
+ prerelease: false
105
+ version_requirements: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - ">="
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
110
+ - !ruby/object:Gem::Dependency
111
+ name: stimulus-rails
112
+ requirement: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - ">="
115
+ - !ruby/object:Gem::Version
116
+ version: '0'
117
+ type: :runtime
118
+ prerelease: false
119
+ version_requirements: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - ">="
122
+ - !ruby/object:Gem::Version
123
+ version: '0'
124
+ - !ruby/object:Gem::Dependency
125
+ name: jbuilder
126
+ requirement: !ruby/object:Gem::Requirement
127
+ requirements:
128
+ - - ">="
129
+ - !ruby/object:Gem::Version
130
+ version: '0'
131
+ type: :runtime
132
+ prerelease: false
133
+ version_requirements: !ruby/object:Gem::Requirement
134
+ requirements:
135
+ - - ">="
136
+ - !ruby/object:Gem::Version
137
+ version: '0'
138
+ description: A Rails Engine for collaborative plan review with AI-powered feedback.
139
+ executables: []
140
+ extensions: []
141
+ extra_rdoc_files: []
142
+ files:
143
+ - app/assets/stylesheets/coplan/application.css
144
+ - app/controllers/coplan/api/v1/base_controller.rb
145
+ - app/controllers/coplan/api/v1/comments_controller.rb
146
+ - app/controllers/coplan/api/v1/leases_controller.rb
147
+ - app/controllers/coplan/api/v1/operations_controller.rb
148
+ - app/controllers/coplan/api/v1/plans_controller.rb
149
+ - app/controllers/coplan/api/v1/sessions_controller.rb
150
+ - app/controllers/coplan/application_controller.rb
151
+ - app/controllers/coplan/automated_reviews_controller.rb
152
+ - app/controllers/coplan/comment_threads_controller.rb
153
+ - app/controllers/coplan/comments_controller.rb
154
+ - app/controllers/coplan/dashboard_controller.rb
155
+ - app/controllers/coplan/plan_versions_controller.rb
156
+ - app/controllers/coplan/plans_controller.rb
157
+ - app/controllers/coplan/settings/tokens_controller.rb
158
+ - app/helpers/coplan/application_helper.rb
159
+ - app/helpers/coplan/comments_helper.rb
160
+ - app/helpers/coplan/markdown_helper.rb
161
+ - app/javascript/controllers/coplan/dropdown_controller.js
162
+ - app/javascript/controllers/coplan/line_selection_controller.js
163
+ - app/javascript/controllers/coplan/tabs_controller.js
164
+ - app/javascript/controllers/coplan/text_selection_controller.js
165
+ - app/jobs/coplan/application_job.rb
166
+ - app/jobs/coplan/automated_review_job.rb
167
+ - app/jobs/coplan/commit_expired_session_job.rb
168
+ - app/jobs/coplan/notification_job.rb
169
+ - app/models/coplan/api_token.rb
170
+ - app/models/coplan/application_record.rb
171
+ - app/models/coplan/automated_plan_reviewer.rb
172
+ - app/models/coplan/comment.rb
173
+ - app/models/coplan/comment_thread.rb
174
+ - app/models/coplan/current.rb
175
+ - app/models/coplan/edit_lease.rb
176
+ - app/models/coplan/edit_session.rb
177
+ - app/models/coplan/plan.rb
178
+ - app/models/coplan/plan_collaborator.rb
179
+ - app/models/coplan/plan_version.rb
180
+ - app/models/coplan/user.rb
181
+ - app/policies/coplan/application_policy.rb
182
+ - app/policies/coplan/comment_thread_policy.rb
183
+ - app/policies/coplan/plan_policy.rb
184
+ - app/services/coplan/ai_providers/anthropic.rb
185
+ - app/services/coplan/ai_providers/open_ai.rb
186
+ - app/services/coplan/broadcaster.rb
187
+ - app/services/coplan/plans/apply_operations.rb
188
+ - app/services/coplan/plans/commit_session.rb
189
+ - app/services/coplan/plans/create.rb
190
+ - app/services/coplan/plans/operation_error.rb
191
+ - app/services/coplan/plans/position_resolver.rb
192
+ - app/services/coplan/plans/review_prompt_formatter.rb
193
+ - app/services/coplan/plans/review_response_parser.rb
194
+ - app/services/coplan/plans/transform_range.rb
195
+ - app/services/coplan/plans/trigger_automated_reviews.rb
196
+ - app/views/coplan/comment_threads/_new_comment_form.html.erb
197
+ - app/views/coplan/comment_threads/_reply_form.html.erb
198
+ - app/views/coplan/comment_threads/_thread.html.erb
199
+ - app/views/coplan/comments/_comment.html.erb
200
+ - app/views/coplan/dashboard/show.html.erb
201
+ - app/views/coplan/plan_versions/index.html.erb
202
+ - app/views/coplan/plan_versions/show.html.erb
203
+ - app/views/coplan/plans/_header.html.erb
204
+ - app/views/coplan/plans/edit.html.erb
205
+ - app/views/coplan/plans/index.html.erb
206
+ - app/views/coplan/plans/show.html.erb
207
+ - app/views/coplan/settings/tokens/_form.html.erb
208
+ - app/views/coplan/settings/tokens/_token_reveal.html.erb
209
+ - app/views/coplan/settings/tokens/_token_row.html.erb
210
+ - app/views/coplan/settings/tokens/create.turbo_stream.erb
211
+ - app/views/coplan/settings/tokens/destroy.turbo_stream.erb
212
+ - app/views/coplan/settings/tokens/index.html.erb
213
+ - app/views/layouts/coplan/application.html.erb
214
+ - config/importmap.rb
215
+ - config/routes.rb
216
+ - db/migrate/20260226200000_create_coplan_schema.rb
217
+ - lib/coplan.rb
218
+ - lib/coplan/configuration.rb
219
+ - lib/coplan/engine.rb
220
+ - lib/coplan/version.rb
221
+ - lib/tasks/coplan.rake
222
+ - prompts/reviewers/routing.md
223
+ - prompts/reviewers/scalability.md
224
+ - prompts/reviewers/security.md
225
+ licenses:
226
+ - Apache-2.0
227
+ metadata: {}
228
+ rdoc_options: []
229
+ require_paths:
230
+ - lib
231
+ required_ruby_version: !ruby/object:Gem::Requirement
232
+ requirements:
233
+ - - ">="
234
+ - !ruby/object:Gem::Version
235
+ version: '0'
236
+ required_rubygems_version: !ruby/object:Gem::Requirement
237
+ requirements:
238
+ - - ">="
239
+ - !ruby/object:Gem::Version
240
+ version: '0'
241
+ requirements: []
242
+ rubygems_version: 3.6.9
243
+ specification_version: 4
244
+ summary: CoPlan — AI-assisted engineering design doc review
245
+ test_files: []