ariadna 1.2.0 → 1.2.2

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 (117) hide show
  1. checksums.yaml +4 -4
  2. data/data/agents/ariadna-backend-executor.md +9 -6
  3. data/data/agents/ariadna-codebase-mapper.md +5 -5
  4. data/data/agents/ariadna-debugger.md +13 -13
  5. data/data/agents/ariadna-executor.md +9 -6
  6. data/data/agents/ariadna-frontend-executor.md +9 -6
  7. data/data/agents/ariadna-integration-checker.md +1 -1
  8. data/data/agents/ariadna-phase-researcher.md +1 -1
  9. data/data/agents/ariadna-planner.md +17 -17
  10. data/data/agents/ariadna-project-researcher.md +10 -10
  11. data/data/agents/ariadna-research-synthesizer.md +11 -11
  12. data/data/agents/ariadna-roadmapper.md +8 -8
  13. data/data/agents/ariadna-test-executor.md +9 -6
  14. data/data/agents/ariadna-verifier.md +4 -4
  15. data/data/ariadna/references/decimal-phase-calculation.md +2 -2
  16. data/data/ariadna/references/git-integration.md +4 -4
  17. data/data/ariadna/references/git-planning-commit.md +7 -7
  18. data/data/ariadna/references/model-profile-resolution.md +1 -1
  19. data/data/ariadna/references/model-profiles.md +2 -2
  20. data/data/ariadna/references/planning-config.md +13 -13
  21. data/data/ariadna/references/rails-conventions.md +9 -2
  22. data/data/ariadna/references/tdd.md +2 -2
  23. data/data/ariadna/templates/DEBUG.md +2 -2
  24. data/data/ariadna/templates/UAT.md +3 -3
  25. data/data/ariadna/templates/codebase/architecture.md +1 -1
  26. data/data/ariadna/templates/codebase/concerns.md +1 -1
  27. data/data/ariadna/templates/codebase/conventions.md +1 -1
  28. data/data/ariadna/templates/codebase/integrations.md +1 -1
  29. data/data/ariadna/templates/codebase/stack.md +1 -1
  30. data/data/ariadna/templates/codebase/structure.md +1 -1
  31. data/data/ariadna/templates/codebase/testing.md +1 -1
  32. data/data/ariadna/templates/context.md +2 -2
  33. data/data/ariadna/templates/continue-here.md +1 -1
  34. data/data/ariadna/templates/debug-subagent-prompt.md +2 -2
  35. data/data/ariadna/templates/discovery.md +2 -2
  36. data/data/ariadna/templates/milestone-archive.md +4 -4
  37. data/data/ariadna/templates/milestone.md +1 -1
  38. data/data/ariadna/templates/phase-prompt.md +19 -19
  39. data/data/ariadna/templates/planner-subagent-prompt.md +9 -9
  40. data/data/ariadna/templates/project.md +2 -2
  41. data/data/ariadna/templates/requirements.md +1 -1
  42. data/data/ariadna/templates/research-project/ARCHITECTURE.md +1 -1
  43. data/data/ariadna/templates/research-project/FEATURES.md +1 -1
  44. data/data/ariadna/templates/research-project/PITFALLS.md +1 -1
  45. data/data/ariadna/templates/research-project/STACK.md +1 -1
  46. data/data/ariadna/templates/research-project/SUMMARY.md +1 -1
  47. data/data/ariadna/templates/research.md +2 -2
  48. data/data/ariadna/templates/roadmap.md +1 -1
  49. data/data/ariadna/templates/state.md +4 -4
  50. data/data/ariadna/templates/summary.md +12 -1
  51. data/data/ariadna/templates/user-setup.md +2 -2
  52. data/data/ariadna/templates/verification-report.md +1 -1
  53. data/data/ariadna/workflows/add-phase.md +5 -5
  54. data/data/ariadna/workflows/add-todo.md +7 -7
  55. data/data/ariadna/workflows/audit-milestone.md +7 -7
  56. data/data/ariadna/workflows/check-todos.md +4 -4
  57. data/data/ariadna/workflows/complete-milestone.md +18 -18
  58. data/data/ariadna/workflows/diagnose-issues.md +4 -4
  59. data/data/ariadna/workflows/discovery-phase.md +4 -4
  60. data/data/ariadna/workflows/discuss-phase.md +2 -2
  61. data/data/ariadna/workflows/execute-phase.md +97 -9
  62. data/data/ariadna/workflows/execute-plan.md +30 -19
  63. data/data/ariadna/workflows/help.md +18 -18
  64. data/data/ariadna/workflows/insert-phase.md +6 -6
  65. data/data/ariadna/workflows/list-phase-assumptions.md +1 -1
  66. data/data/ariadna/workflows/map-codebase.md +22 -22
  67. data/data/ariadna/workflows/new-milestone.md +16 -16
  68. data/data/ariadna/workflows/new-project.md +39 -39
  69. data/data/ariadna/workflows/pause-work.md +4 -4
  70. data/data/ariadna/workflows/plan-milestone-gaps.md +4 -4
  71. data/data/ariadna/workflows/plan-phase.md +43 -19
  72. data/data/ariadna/workflows/progress.md +6 -6
  73. data/data/ariadna/workflows/quick.md +6 -6
  74. data/data/ariadna/workflows/remove-phase.md +3 -3
  75. data/data/ariadna/workflows/research-phase.md +4 -4
  76. data/data/ariadna/workflows/resume-project.md +9 -9
  77. data/data/ariadna/workflows/set-profile.md +2 -2
  78. data/data/ariadna/workflows/settings.md +4 -4
  79. data/data/ariadna/workflows/transition.md +11 -11
  80. data/data/ariadna/workflows/verify-phase.md +2 -2
  81. data/data/ariadna/workflows/verify-work.md +8 -8
  82. data/data/commands/ariadna/add-phase.md +2 -2
  83. data/data/commands/ariadna/add-todo.md +1 -1
  84. data/data/commands/ariadna/audit-milestone.md +6 -6
  85. data/data/commands/ariadna/check-todos.md +2 -2
  86. data/data/commands/ariadna/complete-milestone.md +11 -11
  87. data/data/commands/ariadna/debug.md +3 -3
  88. data/data/commands/ariadna/discuss-phase.md +2 -2
  89. data/data/commands/ariadna/execute-phase.md +6 -5
  90. data/data/commands/ariadna/insert-phase.md +2 -2
  91. data/data/commands/ariadna/list-phase-assumptions.md +2 -2
  92. data/data/commands/ariadna/map-codebase.md +7 -7
  93. data/data/commands/ariadna/new-milestone.md +10 -10
  94. data/data/commands/ariadna/new-project.md +6 -6
  95. data/data/commands/ariadna/pause-work.md +1 -1
  96. data/data/commands/ariadna/plan-milestone-gaps.md +5 -5
  97. data/data/commands/ariadna/quick.md +2 -2
  98. data/data/commands/ariadna/remove-phase.md +2 -2
  99. data/data/commands/ariadna/research-phase.md +6 -6
  100. data/data/commands/ariadna/verify-work.md +2 -2
  101. data/data/guides/frontend.md +1044 -9
  102. data/data/statusline/ariadna-statusline.sh +47 -0
  103. data/data/templates.md +1 -1
  104. data/exe/ariadna +2 -1
  105. data/lib/ariadna/installer.rb +30 -1
  106. data/lib/ariadna/tools/config_manager.rb +12 -6
  107. data/lib/ariadna/tools/git_integration.rb +2 -2
  108. data/lib/ariadna/tools/init.rb +66 -61
  109. data/lib/ariadna/tools/phase_manager.rb +31 -13
  110. data/lib/ariadna/tools/roadmap_analyzer.rb +5 -5
  111. data/lib/ariadna/tools/state_manager.rb +14 -14
  112. data/lib/ariadna/tools/template_filler.rb +5 -5
  113. data/lib/ariadna/tools/utilities.rb +4 -4
  114. data/lib/ariadna/tools/verification.rb +4 -4
  115. data/lib/ariadna/uninstaller.rb +17 -0
  116. data/lib/ariadna/version.rb +1 -1
  117. metadata +2 -1
@@ -25,7 +25,7 @@ module Ariadna
25
25
  Output.error("phase number required") unless phase_num
26
26
 
27
27
  cwd = Dir.pwd
28
- roadmap_path = File.join(cwd, ".planning", "ROADMAP.md")
28
+ roadmap_path = File.join(cwd, ".ariadna_planning", "ROADMAP.md")
29
29
 
30
30
  unless File.exist?(roadmap_path)
31
31
  Output.json({ found: false, error: "ROADMAP.md not found" }, raw: raw, raw_value: "")
@@ -63,7 +63,7 @@ module Ariadna
63
63
 
64
64
  def self.analyze(raw: false)
65
65
  cwd = Dir.pwd
66
- roadmap_path = File.join(cwd, ".planning", "ROADMAP.md")
66
+ roadmap_path = File.join(cwd, ".ariadna_planning", "ROADMAP.md")
67
67
 
68
68
  unless File.exist?(roadmap_path)
69
69
  Output.json({ error: "ROADMAP.md not found", milestones: [], phases: [], current_phase: nil }, raw: raw)
@@ -71,7 +71,7 @@ module Ariadna
71
71
  end
72
72
 
73
73
  content = File.read(roadmap_path)
74
- phases_dir = File.join(cwd, ".planning", "phases")
74
+ phases_dir = File.join(cwd, ".ariadna_planning", "phases")
75
75
 
76
76
  phases = []
77
77
  phase_pattern = /###\s*Phase\s+(\d+(?:\.\d+)?)\s*:\s*([^\n]+)/i
@@ -168,7 +168,7 @@ module Ariadna
168
168
 
169
169
  def self.render_progress(format, raw: false)
170
170
  cwd = Dir.pwd
171
- phases_dir = File.join(cwd, ".planning", "phases")
171
+ phases_dir = File.join(cwd, ".ariadna_planning", "phases")
172
172
  milestone = get_milestone_info(cwd)
173
173
 
174
174
  phases = []
@@ -231,7 +231,7 @@ module Ariadna
231
231
  end
232
232
 
233
233
  def self.get_milestone_info(cwd)
234
- roadmap = File.read(File.join(cwd, ".planning", "ROADMAP.md"))
234
+ roadmap = File.read(File.join(cwd, ".ariadna_planning", "ROADMAP.md"))
235
235
  version_match = roadmap.match(/v(\d+\.\d+)/)
236
236
  name_match = roadmap.match(/## .*v\d+\.\d+[:\s]+([^\n(]+)/)
237
237
  {
@@ -44,7 +44,7 @@ module Ariadna
44
44
 
45
45
  def self.history_digest(_argv, raw: false)
46
46
  cwd = Dir.pwd
47
- phases_dir = File.join(cwd, ".planning", "phases")
47
+ phases_dir = File.join(cwd, ".ariadna_planning", "phases")
48
48
  digest = { phases: {}, decisions: [], tech_stack: [] }
49
49
 
50
50
  unless File.directory?(phases_dir)
@@ -107,7 +107,7 @@ module Ariadna
107
107
 
108
108
  def self.snapshot(_argv, raw: false)
109
109
  cwd = Dir.pwd
110
- state_path = File.join(cwd, ".planning", "STATE.md")
110
+ state_path = File.join(cwd, ".ariadna_planning", "STATE.md")
111
111
  Output.error("STATE.md not found") unless File.exist?(state_path)
112
112
 
113
113
  content = File.read(state_path)
@@ -122,7 +122,7 @@ module Ariadna
122
122
  def self.load_state(raw: false)
123
123
  cwd = Dir.pwd
124
124
  config = ConfigManager.load_config(cwd)
125
- planning_dir = File.join(cwd, ".planning")
125
+ planning_dir = File.join(cwd, ".ariadna_planning")
126
126
 
127
127
  state_raw = begin
128
128
  File.read(File.join(planning_dir, "STATE.md"))
@@ -152,7 +152,7 @@ module Ariadna
152
152
 
153
153
  def self.get(section, raw: false)
154
154
  cwd = Dir.pwd
155
- state_path = File.join(cwd, ".planning", "STATE.md")
155
+ state_path = File.join(cwd, ".ariadna_planning", "STATE.md")
156
156
  content = File.read(state_path)
157
157
 
158
158
  unless section
@@ -183,7 +183,7 @@ module Ariadna
183
183
  Output.error("field and value required for state update") unless field && value
184
184
 
185
185
  cwd = Dir.pwd
186
- state_path = File.join(cwd, ".planning", "STATE.md")
186
+ state_path = File.join(cwd, ".ariadna_planning", "STATE.md")
187
187
  content = File.read(state_path)
188
188
 
189
189
  new_content = replace_field(content, field, value)
@@ -199,7 +199,7 @@ module Ariadna
199
199
 
200
200
  def self.patch(patches, raw: false)
201
201
  cwd = Dir.pwd
202
- state_path = File.join(cwd, ".planning", "STATE.md")
202
+ state_path = File.join(cwd, ".ariadna_planning", "STATE.md")
203
203
  content = File.read(state_path)
204
204
 
205
205
  results = { updated: [], failed: [] }
@@ -221,7 +221,7 @@ module Ariadna
221
221
 
222
222
  def self.advance_plan(raw: false)
223
223
  cwd = Dir.pwd
224
- state_path = File.join(cwd, ".planning", "STATE.md")
224
+ state_path = File.join(cwd, ".ariadna_planning", "STATE.md")
225
225
  unless File.exist?(state_path)
226
226
  Output.json({ error: "STATE.md not found" }, raw: raw)
227
227
  return
@@ -254,7 +254,7 @@ module Ariadna
254
254
 
255
255
  def self.record_metric(options, raw: false)
256
256
  cwd = Dir.pwd
257
- state_path = File.join(cwd, ".planning", "STATE.md")
257
+ state_path = File.join(cwd, ".ariadna_planning", "STATE.md")
258
258
  unless File.exist?(state_path)
259
259
  Output.json({ error: "STATE.md not found" }, raw: raw)
260
260
  return
@@ -282,14 +282,14 @@ module Ariadna
282
282
 
283
283
  def self.update_progress(raw: false)
284
284
  cwd = Dir.pwd
285
- state_path = File.join(cwd, ".planning", "STATE.md")
285
+ state_path = File.join(cwd, ".ariadna_planning", "STATE.md")
286
286
  unless File.exist?(state_path)
287
287
  Output.json({ error: "STATE.md not found" }, raw: raw)
288
288
  return
289
289
  end
290
290
 
291
291
  content = File.read(state_path)
292
- phases_dir = File.join(cwd, ".planning", "phases")
292
+ phases_dir = File.join(cwd, ".ariadna_planning", "phases")
293
293
  total_plans = 0
294
294
  total_summaries = 0
295
295
 
@@ -321,7 +321,7 @@ module Ariadna
321
321
 
322
322
  def self.add_decision(options, raw: false)
323
323
  cwd = Dir.pwd
324
- state_path = File.join(cwd, ".planning", "STATE.md")
324
+ state_path = File.join(cwd, ".ariadna_planning", "STATE.md")
325
325
  unless File.exist?(state_path)
326
326
  Output.json({ error: "STATE.md not found" }, raw: raw)
327
327
  return
@@ -350,7 +350,7 @@ module Ariadna
350
350
 
351
351
  def self.add_blocker(text, raw: false)
352
352
  cwd = Dir.pwd
353
- state_path = File.join(cwd, ".planning", "STATE.md")
353
+ state_path = File.join(cwd, ".ariadna_planning", "STATE.md")
354
354
  unless File.exist?(state_path)
355
355
  Output.json({ error: "STATE.md not found" }, raw: raw)
356
356
  return
@@ -374,7 +374,7 @@ module Ariadna
374
374
 
375
375
  def self.resolve_blocker(text, raw: false)
376
376
  cwd = Dir.pwd
377
- state_path = File.join(cwd, ".planning", "STATE.md")
377
+ state_path = File.join(cwd, ".ariadna_planning", "STATE.md")
378
378
  unless File.exist?(state_path)
379
379
  Output.json({ error: "STATE.md not found" }, raw: raw)
380
380
  return
@@ -399,7 +399,7 @@ module Ariadna
399
399
 
400
400
  def self.record_session(options, raw: false)
401
401
  cwd = Dir.pwd
402
- state_path = File.join(cwd, ".planning", "STATE.md")
402
+ state_path = File.join(cwd, ".ariadna_planning", "STATE.md")
403
403
  unless File.exist?(state_path)
404
404
  Output.json({ error: "STATE.md not found" }, raw: raw)
405
405
  return
@@ -135,7 +135,7 @@ module Ariadna
135
135
  "- **Why:** [Why it matters for the phase goal]",
136
136
  "- **Output:** [Concrete deliverable]", "",
137
137
  "## Context",
138
- "@.planning/PROJECT.md", "@.planning/ROADMAP.md", "@.planning/STATE.md", "",
138
+ "@.ariadna_planning/PROJECT.md", "@.ariadna_planning/ROADMAP.md", "@.ariadna_planning/STATE.md", "",
139
139
  "## Tasks", "",
140
140
  "<task type=\"code\">",
141
141
  " <name>[Task name]</name>",
@@ -227,11 +227,11 @@ module Ariadna
227
227
  Output.error("phase and name required for phase-dir scaffold") unless phase && name
228
228
  slug = generate_slug(name)
229
229
  dir_name = "#{padded}-#{slug}"
230
- phases_parent = File.join(cwd, ".planning", "phases")
230
+ phases_parent = File.join(cwd, ".ariadna_planning", "phases")
231
231
  FileUtils.mkdir_p(phases_parent)
232
232
  dir_path = File.join(phases_parent, dir_name)
233
233
  FileUtils.mkdir_p(dir_path)
234
- Output.json({ created: true, directory: ".planning/phases/#{dir_name}", path: dir_path }, raw: raw, raw_value: dir_path)
234
+ Output.json({ created: true, directory: ".ariadna_planning/phases/#{dir_name}", path: dir_path }, raw: raw, raw_value: dir_path)
235
235
  return
236
236
  else
237
237
  Output.error("Unknown scaffold type: #{type}. Available: context, uat, verification, phase-dir")
@@ -250,7 +250,7 @@ module Ariadna
250
250
  # --- Private helpers ---
251
251
 
252
252
  def self.find_phase_internal(cwd, phase)
253
- phases_dir = File.join(cwd, ".planning", "phases")
253
+ phases_dir = File.join(cwd, ".ariadna_planning", "phases")
254
254
  normalized = normalize_phase(phase)
255
255
 
256
256
  return nil unless File.directory?(phases_dir)
@@ -264,7 +264,7 @@ module Ariadna
264
264
  phase_name = dir_match && !dir_match[2].empty? ? dir_match[2] : nil
265
265
  phase_slug = phase_name ? phase_name.downcase.gsub(/[^a-z0-9]+/, "-").gsub(/\A-+|-+\z/, "") : nil
266
266
 
267
- { directory: File.join(".planning", "phases", match), phase_number: phase_number, phase_name: phase_name, phase_slug: phase_slug }
267
+ { directory: File.join(".ariadna_planning", "phases", match), phase_number: phase_number, phase_name: phase_name, phase_slug: phase_slug }
268
268
  rescue StandardError
269
269
  nil
270
270
  end
@@ -31,7 +31,7 @@ module Ariadna
31
31
  def self.list_todos(argv, raw: false)
32
32
  area = argv.first
33
33
  cwd = Dir.pwd
34
- pending_dir = File.join(cwd, ".planning", "todos", "pending")
34
+ pending_dir = File.join(cwd, ".ariadna_planning", "todos", "pending")
35
35
 
36
36
  count = 0
37
37
  todos = []
@@ -51,7 +51,7 @@ module Ariadna
51
51
  created: created,
52
52
  title: title,
53
53
  area: todo_area,
54
- path: File.join(".planning", "todos", "pending", File.basename(file))
54
+ path: File.join(".ariadna_planning", "todos", "pending", File.basename(file))
55
55
  }
56
56
  end
57
57
  end
@@ -87,8 +87,8 @@ module Ariadna
87
87
  def self.todo_complete(filename, raw: false)
88
88
  Output.error("filename required") unless filename
89
89
  cwd = Dir.pwd
90
- pending = File.join(cwd, ".planning", "todos", "pending", filename)
91
- completed_dir = File.join(cwd, ".planning", "todos", "completed")
90
+ pending = File.join(cwd, ".ariadna_planning", "todos", "pending", filename)
91
+ completed_dir = File.join(cwd, ".ariadna_planning", "todos", "completed")
92
92
 
93
93
  unless File.exist?(pending)
94
94
  Output.json({ completed: false, reason: "not_found" }, raw: raw, raw_value: "false")
@@ -406,8 +406,8 @@ module Ariadna
406
406
 
407
407
  def self.validate_consistency(raw: false)
408
408
  cwd = Dir.pwd
409
- roadmap_path = File.join(cwd, ".planning", "ROADMAP.md")
410
- phases_dir = File.join(cwd, ".planning", "phases")
409
+ roadmap_path = File.join(cwd, ".ariadna_planning", "ROADMAP.md")
410
+ phases_dir = File.join(cwd, ".ariadna_planning", "phases")
411
411
  errors = []
412
412
  warnings = []
413
413
 
@@ -499,7 +499,7 @@ module Ariadna
499
499
  # --- Private helpers ---
500
500
 
501
501
  def self.find_phase_internal(cwd, phase)
502
- phases_dir = File.join(cwd, ".planning", "phases")
502
+ phases_dir = File.join(cwd, ".ariadna_planning", "phases")
503
503
  normalized = normalize_phase(phase)
504
504
 
505
505
  return nil unless File.directory?(phases_dir)
@@ -512,7 +512,7 @@ module Ariadna
512
512
  phase_number = dir_match ? dir_match[1] : normalized
513
513
  phase_name = dir_match && !dir_match[2].empty? ? dir_match[2] : nil
514
514
 
515
- { directory: File.join(".planning", "phases", match), phase_number: phase_number, phase_name: phase_name }
515
+ { directory: File.join(".ariadna_planning", "phases", match), phase_number: phase_number, phase_name: phase_name }
516
516
  rescue StandardError
517
517
  nil
518
518
  end
@@ -14,6 +14,7 @@ module Ariadna
14
14
  remove_commands
15
15
  remove_agents
16
16
  remove_content
17
+ remove_statusline
17
18
  remove_patches
18
19
  remove_manifest
19
20
 
@@ -58,6 +59,22 @@ module Ariadna
58
59
  end
59
60
  end
60
61
 
62
+ def remove_statusline
63
+ script_path = File.join(@target_dir, "ariadna-statusline.sh")
64
+ FileUtils.rm_f(script_path)
65
+
66
+ settings_path = File.join(@target_dir, "settings.json")
67
+ if File.exist?(settings_path)
68
+ settings = JSON.parse(File.read(settings_path))
69
+ if settings.dig("statusLine", "command")&.include?("ariadna-statusline.sh")
70
+ settings.delete("statusLine")
71
+ File.write(settings_path, JSON.pretty_generate(settings))
72
+ end
73
+ end
74
+
75
+ puts " \u2713 Removed statusline"
76
+ end
77
+
61
78
  def remove_patches
62
79
  dir = File.join(@target_dir, Installer::PATCHES_DIR)
63
80
  if File.directory?(dir)
@@ -1,3 +1,3 @@
1
1
  module Ariadna
2
- VERSION = "1.2.0"
2
+ VERSION = "1.2.2"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ariadna
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.0
4
+ version: 1.2.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jorge Alvarez
@@ -146,6 +146,7 @@ files:
146
146
  - data/guides/security.md
147
147
  - data/guides/style-guide.md
148
148
  - data/guides/testing.md
149
+ - data/statusline/ariadna-statusline.sh
149
150
  - data/templates.md
150
151
  - exe/ariadna
151
152
  - exe/ariadna-tools