ariadna 1.2.1 → 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 (115) hide show
  1. checksums.yaml +4 -4
  2. data/data/agents/ariadna-backend-executor.md +5 -5
  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 +5 -5
  6. data/data/agents/ariadna-frontend-executor.md +5 -5
  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 +5 -5
  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/tdd.md +2 -2
  22. data/data/ariadna/templates/DEBUG.md +2 -2
  23. data/data/ariadna/templates/UAT.md +3 -3
  24. data/data/ariadna/templates/codebase/architecture.md +1 -1
  25. data/data/ariadna/templates/codebase/concerns.md +1 -1
  26. data/data/ariadna/templates/codebase/conventions.md +1 -1
  27. data/data/ariadna/templates/codebase/integrations.md +1 -1
  28. data/data/ariadna/templates/codebase/stack.md +1 -1
  29. data/data/ariadna/templates/codebase/structure.md +1 -1
  30. data/data/ariadna/templates/codebase/testing.md +1 -1
  31. data/data/ariadna/templates/context.md +2 -2
  32. data/data/ariadna/templates/continue-here.md +1 -1
  33. data/data/ariadna/templates/debug-subagent-prompt.md +2 -2
  34. data/data/ariadna/templates/discovery.md +2 -2
  35. data/data/ariadna/templates/milestone-archive.md +4 -4
  36. data/data/ariadna/templates/milestone.md +1 -1
  37. data/data/ariadna/templates/phase-prompt.md +19 -19
  38. data/data/ariadna/templates/planner-subagent-prompt.md +9 -9
  39. data/data/ariadna/templates/project.md +2 -2
  40. data/data/ariadna/templates/requirements.md +1 -1
  41. data/data/ariadna/templates/research-project/ARCHITECTURE.md +1 -1
  42. data/data/ariadna/templates/research-project/FEATURES.md +1 -1
  43. data/data/ariadna/templates/research-project/PITFALLS.md +1 -1
  44. data/data/ariadna/templates/research-project/STACK.md +1 -1
  45. data/data/ariadna/templates/research-project/SUMMARY.md +1 -1
  46. data/data/ariadna/templates/research.md +2 -2
  47. data/data/ariadna/templates/roadmap.md +1 -1
  48. data/data/ariadna/templates/state.md +4 -4
  49. data/data/ariadna/templates/summary.md +1 -1
  50. data/data/ariadna/templates/user-setup.md +2 -2
  51. data/data/ariadna/templates/verification-report.md +1 -1
  52. data/data/ariadna/workflows/add-phase.md +5 -5
  53. data/data/ariadna/workflows/add-todo.md +7 -7
  54. data/data/ariadna/workflows/audit-milestone.md +7 -7
  55. data/data/ariadna/workflows/check-todos.md +4 -4
  56. data/data/ariadna/workflows/complete-milestone.md +18 -18
  57. data/data/ariadna/workflows/diagnose-issues.md +4 -4
  58. data/data/ariadna/workflows/discovery-phase.md +4 -4
  59. data/data/ariadna/workflows/discuss-phase.md +2 -2
  60. data/data/ariadna/workflows/execute-phase.md +4 -4
  61. data/data/ariadna/workflows/execute-plan.md +19 -19
  62. data/data/ariadna/workflows/help.md +18 -18
  63. data/data/ariadna/workflows/insert-phase.md +6 -6
  64. data/data/ariadna/workflows/list-phase-assumptions.md +1 -1
  65. data/data/ariadna/workflows/map-codebase.md +22 -22
  66. data/data/ariadna/workflows/new-milestone.md +16 -16
  67. data/data/ariadna/workflows/new-project.md +39 -39
  68. data/data/ariadna/workflows/pause-work.md +4 -4
  69. data/data/ariadna/workflows/plan-milestone-gaps.md +4 -4
  70. data/data/ariadna/workflows/plan-phase.md +3 -3
  71. data/data/ariadna/workflows/progress.md +6 -6
  72. data/data/ariadna/workflows/quick.md +6 -6
  73. data/data/ariadna/workflows/remove-phase.md +3 -3
  74. data/data/ariadna/workflows/research-phase.md +4 -4
  75. data/data/ariadna/workflows/resume-project.md +9 -9
  76. data/data/ariadna/workflows/set-profile.md +2 -2
  77. data/data/ariadna/workflows/settings.md +4 -4
  78. data/data/ariadna/workflows/transition.md +11 -11
  79. data/data/ariadna/workflows/verify-phase.md +2 -2
  80. data/data/ariadna/workflows/verify-work.md +8 -8
  81. data/data/commands/ariadna/add-phase.md +2 -2
  82. data/data/commands/ariadna/add-todo.md +1 -1
  83. data/data/commands/ariadna/audit-milestone.md +6 -6
  84. data/data/commands/ariadna/check-todos.md +2 -2
  85. data/data/commands/ariadna/complete-milestone.md +11 -11
  86. data/data/commands/ariadna/debug.md +3 -3
  87. data/data/commands/ariadna/discuss-phase.md +2 -2
  88. data/data/commands/ariadna/execute-phase.md +2 -2
  89. data/data/commands/ariadna/insert-phase.md +2 -2
  90. data/data/commands/ariadna/list-phase-assumptions.md +2 -2
  91. data/data/commands/ariadna/map-codebase.md +7 -7
  92. data/data/commands/ariadna/new-milestone.md +10 -10
  93. data/data/commands/ariadna/new-project.md +6 -6
  94. data/data/commands/ariadna/pause-work.md +1 -1
  95. data/data/commands/ariadna/plan-milestone-gaps.md +5 -5
  96. data/data/commands/ariadna/quick.md +2 -2
  97. data/data/commands/ariadna/remove-phase.md +2 -2
  98. data/data/commands/ariadna/research-phase.md +6 -6
  99. data/data/commands/ariadna/verify-work.md +2 -2
  100. data/data/statusline/ariadna-statusline.sh +47 -0
  101. data/data/templates.md +1 -1
  102. data/exe/ariadna +2 -1
  103. data/lib/ariadna/installer.rb +30 -1
  104. data/lib/ariadna/tools/config_manager.rb +5 -5
  105. data/lib/ariadna/tools/git_integration.rb +2 -2
  106. data/lib/ariadna/tools/init.rb +61 -61
  107. data/lib/ariadna/tools/phase_manager.rb +11 -11
  108. data/lib/ariadna/tools/roadmap_analyzer.rb +5 -5
  109. data/lib/ariadna/tools/state_manager.rb +14 -14
  110. data/lib/ariadna/tools/template_filler.rb +5 -5
  111. data/lib/ariadna/tools/utilities.rb +4 -4
  112. data/lib/ariadna/tools/verification.rb +4 -4
  113. data/lib/ariadna/uninstaller.rb +17 -0
  114. data/lib/ariadna/version.rb +1 -1
  115. metadata +2 -1
@@ -88,14 +88,14 @@ module Ariadna
88
88
  backend_executor_model: resolve_model(cwd, "ariadna-backend-executor"),
89
89
  frontend_executor_model: resolve_model(cwd, "ariadna-frontend-executor"),
90
90
  test_executor_model: resolve_model(cwd, "ariadna-test-executor"),
91
- state_exists: path_exists?(cwd, ".planning/STATE.md"),
92
- roadmap_exists: path_exists?(cwd, ".planning/ROADMAP.md"),
93
- config_exists: path_exists?(cwd, ".planning/config.json")
91
+ state_exists: path_exists?(cwd, ".ariadna_planning/STATE.md"),
92
+ roadmap_exists: path_exists?(cwd, ".ariadna_planning/ROADMAP.md"),
93
+ config_exists: path_exists?(cwd, ".ariadna_planning/config.json")
94
94
  }
95
95
 
96
- result[:state_content] = safe_read_file(File.join(cwd, ".planning", "STATE.md")) if includes.include?("state")
97
- result[:config_content] = safe_read_file(File.join(cwd, ".planning", "config.json")) if includes.include?("config")
98
- result[:roadmap_content] = safe_read_file(File.join(cwd, ".planning", "ROADMAP.md")) if includes.include?("roadmap")
96
+ result[:state_content] = safe_read_file(File.join(cwd, ".ariadna_planning", "STATE.md")) if includes.include?("state")
97
+ result[:config_content] = safe_read_file(File.join(cwd, ".ariadna_planning", "config.json")) if includes.include?("config")
98
+ result[:roadmap_content] = safe_read_file(File.join(cwd, ".ariadna_planning", "ROADMAP.md")) if includes.include?("roadmap")
99
99
 
100
100
  Output.json(result, raw: raw)
101
101
  end
@@ -124,13 +124,13 @@ module Ariadna
124
124
  has_context: phase_info&.dig(:has_context) || false,
125
125
  has_plans: (phase_info&.dig(:plans)&.length || 0) > 0,
126
126
  plan_count: phase_info&.dig(:plans)&.length || 0,
127
- planning_exists: path_exists?(cwd, ".planning"),
128
- roadmap_exists: path_exists?(cwd, ".planning/ROADMAP.md")
127
+ planning_exists: path_exists?(cwd, ".ariadna_planning"),
128
+ roadmap_exists: path_exists?(cwd, ".ariadna_planning/ROADMAP.md")
129
129
  }
130
130
 
131
- result[:state_content] = safe_read_file(File.join(cwd, ".planning", "STATE.md")) if includes.include?("state")
132
- result[:roadmap_content] = safe_read_file(File.join(cwd, ".planning", "ROADMAP.md")) if includes.include?("roadmap")
133
- result[:requirements_content] = safe_read_file(File.join(cwd, ".planning", "REQUIREMENTS.md")) if includes.include?("requirements")
131
+ result[:state_content] = safe_read_file(File.join(cwd, ".ariadna_planning", "STATE.md")) if includes.include?("state")
132
+ result[:roadmap_content] = safe_read_file(File.join(cwd, ".ariadna_planning", "ROADMAP.md")) if includes.include?("roadmap")
133
+ result[:requirements_content] = safe_read_file(File.join(cwd, ".ariadna_planning", "REQUIREMENTS.md")) if includes.include?("requirements")
134
134
 
135
135
  if includes.include?("context") && phase_info&.dig(:directory)
136
136
  phase_dir_full = File.join(cwd, phase_info[:directory])
@@ -181,13 +181,13 @@ module Ariadna
181
181
  synthesizer_model: resolve_model(cwd, "ariadna-research-synthesizer"),
182
182
  roadmapper_model: resolve_model(cwd, "ariadna-roadmapper"),
183
183
  commit_docs: config["commit_docs"],
184
- project_exists: path_exists?(cwd, ".planning/PROJECT.md"),
185
- has_codebase_map: path_exists?(cwd, ".planning/codebase"),
186
- planning_exists: path_exists?(cwd, ".planning"),
184
+ project_exists: path_exists?(cwd, ".ariadna_planning/PROJECT.md"),
185
+ has_codebase_map: path_exists?(cwd, ".ariadna_planning/codebase"),
186
+ planning_exists: path_exists?(cwd, ".ariadna_planning"),
187
187
  has_existing_code: has_code,
188
188
  has_package_file: has_package_file,
189
189
  is_brownfield: has_code || has_package_file,
190
- needs_codebase_map: (has_code || has_package_file) && !path_exists?(cwd, ".planning/codebase"),
190
+ needs_codebase_map: (has_code || has_package_file) && !path_exists?(cwd, ".ariadna_planning/codebase"),
191
191
  has_git: path_exists?(cwd, ".git")
192
192
  }
193
193
 
@@ -207,9 +207,9 @@ module Ariadna
207
207
  research_enabled: config["research"],
208
208
  current_milestone: milestone[:version],
209
209
  current_milestone_name: milestone[:name],
210
- project_exists: path_exists?(cwd, ".planning/PROJECT.md"),
211
- roadmap_exists: path_exists?(cwd, ".planning/ROADMAP.md"),
212
- state_exists: path_exists?(cwd, ".planning/STATE.md")
210
+ project_exists: path_exists?(cwd, ".ariadna_planning/PROJECT.md"),
211
+ roadmap_exists: path_exists?(cwd, ".ariadna_planning/ROADMAP.md"),
212
+ state_exists: path_exists?(cwd, ".ariadna_planning/STATE.md")
213
213
  }
214
214
 
215
215
  Output.json(result, raw: raw)
@@ -221,7 +221,7 @@ module Ariadna
221
221
  now = Time.now.utc
222
222
  slug = description && !description.empty? ? generate_slug(description)&.slice(0, 40) : nil
223
223
 
224
- quick_dir = File.join(cwd, ".planning", "quick")
224
+ quick_dir = File.join(cwd, ".ariadna_planning", "quick")
225
225
  next_num = 1
226
226
  if File.directory?(quick_dir)
227
227
  existing = Dir.children(quick_dir)
@@ -238,10 +238,10 @@ module Ariadna
238
238
  description: description && !description.empty? ? description : nil,
239
239
  date: now.strftime("%Y-%m-%d"),
240
240
  timestamp: now.iso8601,
241
- quick_dir: ".planning/quick",
242
- task_dir: slug ? ".planning/quick/#{next_num}-#{slug}" : nil,
243
- roadmap_exists: path_exists?(cwd, ".planning/ROADMAP.md"),
244
- planning_exists: path_exists?(cwd, ".planning")
241
+ quick_dir: ".ariadna_planning/quick",
242
+ task_dir: slug ? ".ariadna_planning/quick/#{next_num}-#{slug}" : nil,
243
+ roadmap_exists: path_exists?(cwd, ".ariadna_planning/ROADMAP.md"),
244
+ planning_exists: path_exists?(cwd, ".ariadna_planning")
245
245
  }
246
246
 
247
247
  Output.json(result, raw: raw)
@@ -252,14 +252,14 @@ module Ariadna
252
252
  config = ConfigManager.load_config(cwd)
253
253
 
254
254
  interrupted_agent_id = nil
255
- agent_file = File.join(cwd, ".planning", "current-agent-id.txt")
255
+ agent_file = File.join(cwd, ".ariadna_planning", "current-agent-id.txt")
256
256
  interrupted_agent_id = File.read(agent_file).strip if File.exist?(agent_file)
257
257
 
258
258
  result = {
259
- state_exists: path_exists?(cwd, ".planning/STATE.md"),
260
- roadmap_exists: path_exists?(cwd, ".planning/ROADMAP.md"),
261
- project_exists: path_exists?(cwd, ".planning/PROJECT.md"),
262
- planning_exists: path_exists?(cwd, ".planning"),
259
+ state_exists: path_exists?(cwd, ".ariadna_planning/STATE.md"),
260
+ roadmap_exists: path_exists?(cwd, ".ariadna_planning/ROADMAP.md"),
261
+ project_exists: path_exists?(cwd, ".ariadna_planning/PROJECT.md"),
262
+ planning_exists: path_exists?(cwd, ".ariadna_planning"),
263
263
  has_interrupted_agent: !interrupted_agent_id.nil?,
264
264
  interrupted_agent_id: interrupted_agent_id,
265
265
  commit_docs: config["commit_docs"]
@@ -307,8 +307,8 @@ module Ariadna
307
307
  has_plans: (phase_info&.dig(:plans)&.length || 0) > 0,
308
308
  has_verification: phase_info&.dig(:has_verification) || false,
309
309
  plan_count: phase_info&.dig(:plans)&.length || 0,
310
- roadmap_exists: path_exists?(cwd, ".planning/ROADMAP.md"),
311
- planning_exists: path_exists?(cwd, ".planning")
310
+ roadmap_exists: path_exists?(cwd, ".ariadna_planning/ROADMAP.md"),
311
+ planning_exists: path_exists?(cwd, ".ariadna_planning")
312
312
  }
313
313
 
314
314
  Output.json(result, raw: raw)
@@ -319,7 +319,7 @@ module Ariadna
319
319
  config = ConfigManager.load_config(cwd)
320
320
  now = Time.now.utc
321
321
 
322
- pending_dir = File.join(cwd, ".planning", "todos", "pending")
322
+ pending_dir = File.join(cwd, ".ariadna_planning", "todos", "pending")
323
323
  count = 0
324
324
  todo_list = []
325
325
 
@@ -335,7 +335,7 @@ module Ariadna
335
335
  count += 1
336
336
  todo_list << {
337
337
  file: File.basename(file), created: created, title: title, area: todo_area,
338
- path: File.join(".planning", "todos", "pending", File.basename(file))
338
+ path: File.join(".ariadna_planning", "todos", "pending", File.basename(file))
339
339
  }
340
340
  end
341
341
  end
@@ -347,11 +347,11 @@ module Ariadna
347
347
  todo_count: count,
348
348
  todos: todo_list,
349
349
  area_filter: area,
350
- pending_dir: ".planning/todos/pending",
351
- completed_dir: ".planning/todos/completed",
352
- planning_exists: path_exists?(cwd, ".planning"),
353
- todos_dir_exists: path_exists?(cwd, ".planning/todos"),
354
- pending_dir_exists: path_exists?(cwd, ".planning/todos/pending")
350
+ pending_dir: ".ariadna_planning/todos/pending",
351
+ completed_dir: ".ariadna_planning/todos/completed",
352
+ planning_exists: path_exists?(cwd, ".ariadna_planning"),
353
+ todos_dir_exists: path_exists?(cwd, ".ariadna_planning/todos"),
354
+ pending_dir_exists: path_exists?(cwd, ".ariadna_planning/todos/pending")
355
355
  }
356
356
 
357
357
  Output.json(result, raw: raw)
@@ -362,7 +362,7 @@ module Ariadna
362
362
  config = ConfigManager.load_config(cwd)
363
363
  milestone = get_milestone_info(cwd)
364
364
 
365
- phases_dir = File.join(cwd, ".planning", "phases")
365
+ phases_dir = File.join(cwd, ".ariadna_planning", "phases")
366
366
  phase_count = 0
367
367
  completed_phases = 0
368
368
 
@@ -375,7 +375,7 @@ module Ariadna
375
375
  end
376
376
  end
377
377
 
378
- archive_dir = File.join(cwd, ".planning", "archive")
378
+ archive_dir = File.join(cwd, ".ariadna_planning", "archive")
379
379
  archived_milestones = []
380
380
  if File.directory?(archive_dir)
381
381
  archived_milestones = Dir.children(archive_dir).select { |e| File.directory?(File.join(archive_dir, e)) }
@@ -391,11 +391,11 @@ module Ariadna
391
391
  all_phases_complete: phase_count > 0 && phase_count == completed_phases,
392
392
  archived_milestones: archived_milestones,
393
393
  archive_count: archived_milestones.length,
394
- project_exists: path_exists?(cwd, ".planning/PROJECT.md"),
395
- roadmap_exists: path_exists?(cwd, ".planning/ROADMAP.md"),
396
- state_exists: path_exists?(cwd, ".planning/STATE.md"),
397
- archive_exists: path_exists?(cwd, ".planning/archive"),
398
- phases_dir_exists: path_exists?(cwd, ".planning/phases")
394
+ project_exists: path_exists?(cwd, ".ariadna_planning/PROJECT.md"),
395
+ roadmap_exists: path_exists?(cwd, ".ariadna_planning/ROADMAP.md"),
396
+ state_exists: path_exists?(cwd, ".ariadna_planning/STATE.md"),
397
+ archive_exists: path_exists?(cwd, ".ariadna_planning/archive"),
398
+ phases_dir_exists: path_exists?(cwd, ".ariadna_planning/phases")
399
399
  }
400
400
 
401
401
  Output.json(result, raw: raw)
@@ -405,7 +405,7 @@ module Ariadna
405
405
  cwd = Dir.pwd
406
406
  config = ConfigManager.load_config(cwd)
407
407
 
408
- codebase_dir = File.join(cwd, ".planning", "codebase")
408
+ codebase_dir = File.join(cwd, ".ariadna_planning", "codebase")
409
409
  existing_maps = []
410
410
  existing_maps = Dir.children(codebase_dir).select { |f| f.end_with?(".md") } if File.directory?(codebase_dir)
411
411
 
@@ -414,11 +414,11 @@ module Ariadna
414
414
  commit_docs: config["commit_docs"],
415
415
  search_gitignored: config["search_gitignored"],
416
416
  parallelization: config["parallelization"],
417
- codebase_dir: ".planning/codebase",
417
+ codebase_dir: ".ariadna_planning/codebase",
418
418
  existing_maps: existing_maps,
419
419
  has_maps: existing_maps.any?,
420
- planning_exists: path_exists?(cwd, ".planning"),
421
- codebase_dir_exists: path_exists?(cwd, ".planning/codebase")
420
+ planning_exists: path_exists?(cwd, ".ariadna_planning"),
421
+ codebase_dir_exists: path_exists?(cwd, ".ariadna_planning/codebase")
422
422
  }
423
423
 
424
424
  Output.json(result, raw: raw)
@@ -429,7 +429,7 @@ module Ariadna
429
429
  config = ConfigManager.load_config(cwd)
430
430
  milestone = get_milestone_info(cwd)
431
431
 
432
- phases_dir = File.join(cwd, ".planning", "phases")
432
+ phases_dir = File.join(cwd, ".ariadna_planning", "phases")
433
433
  phases = []
434
434
  current_phase = nil
435
435
  next_phase = nil
@@ -463,7 +463,7 @@ module Ariadna
463
463
 
464
464
  phase_entry = {
465
465
  number: phase_number, name: phase_name,
466
- directory: File.join(".planning", "phases", dir),
466
+ directory: File.join(".ariadna_planning", "phases", dir),
467
467
  status: status, plan_count: plans.length,
468
468
  summary_count: summaries.length, has_research: has_research
469
469
  }
@@ -475,7 +475,7 @@ module Ariadna
475
475
  end
476
476
 
477
477
  paused_at = nil
478
- state_path = File.join(cwd, ".planning", "STATE.md")
478
+ state_path = File.join(cwd, ".ariadna_planning", "STATE.md")
479
479
  if File.exist?(state_path)
480
480
  state_content = File.read(state_path)
481
481
  pause_match = state_content.match(/\*\*Paused At:\*\*\s*(.+)/)
@@ -496,15 +496,15 @@ module Ariadna
496
496
  next_phase: next_phase,
497
497
  paused_at: paused_at,
498
498
  has_work_in_progress: !current_phase.nil?,
499
- project_exists: path_exists?(cwd, ".planning/PROJECT.md"),
500
- roadmap_exists: path_exists?(cwd, ".planning/ROADMAP.md"),
501
- state_exists: path_exists?(cwd, ".planning/STATE.md")
499
+ project_exists: path_exists?(cwd, ".ariadna_planning/PROJECT.md"),
500
+ roadmap_exists: path_exists?(cwd, ".ariadna_planning/ROADMAP.md"),
501
+ state_exists: path_exists?(cwd, ".ariadna_planning/STATE.md")
502
502
  }
503
503
 
504
- result[:state_content] = safe_read_file(File.join(cwd, ".planning", "STATE.md")) if includes.include?("state")
505
- result[:roadmap_content] = safe_read_file(File.join(cwd, ".planning", "ROADMAP.md")) if includes.include?("roadmap")
506
- result[:project_content] = safe_read_file(File.join(cwd, ".planning", "PROJECT.md")) if includes.include?("project")
507
- result[:config_content] = safe_read_file(File.join(cwd, ".planning", "config.json")) if includes.include?("config")
504
+ result[:state_content] = safe_read_file(File.join(cwd, ".ariadna_planning", "STATE.md")) if includes.include?("state")
505
+ result[:roadmap_content] = safe_read_file(File.join(cwd, ".ariadna_planning", "ROADMAP.md")) if includes.include?("roadmap")
506
+ result[:project_content] = safe_read_file(File.join(cwd, ".ariadna_planning", "PROJECT.md")) if includes.include?("project")
507
+ result[:config_content] = safe_read_file(File.join(cwd, ".ariadna_planning", "config.json")) if includes.include?("config")
508
508
 
509
509
  Output.json(result, raw: raw)
510
510
  end
@@ -514,7 +514,7 @@ module Ariadna
514
514
  def self.find_phase_internal(cwd, phase)
515
515
  return nil unless phase
516
516
 
517
- phases_dir = File.join(cwd, ".planning", "phases")
517
+ phases_dir = File.join(cwd, ".ariadna_planning", "phases")
518
518
  normalized = normalize_phase(phase)
519
519
 
520
520
  return nil unless File.directory?(phases_dir)
@@ -544,7 +544,7 @@ module Ariadna
544
544
  end
545
545
 
546
546
  {
547
- directory: File.join(".planning", "phases", match),
547
+ directory: File.join(".ariadna_planning", "phases", match),
548
548
  phase_number: phase_number,
549
549
  phase_name: phase_name,
550
550
  phase_slug: phase_slug,
@@ -560,7 +560,7 @@ module Ariadna
560
560
  end
561
561
 
562
562
  def self.get_milestone_info(cwd)
563
- roadmap = File.read(File.join(cwd, ".planning", "ROADMAP.md"))
563
+ roadmap = File.read(File.join(cwd, ".ariadna_planning", "ROADMAP.md"))
564
564
  version_match = roadmap.match(/v(\d+\.\d+)/)
565
565
  name_match = roadmap.match(/## .*v\d+\.\d+[:\s]+([^\n(]+)/)
566
566
  {
@@ -60,7 +60,7 @@ module Ariadna
60
60
  Output.error("phase identifier required") unless phase
61
61
 
62
62
  cwd = Dir.pwd
63
- phases_dir = File.join(cwd, ".planning", "phases")
63
+ phases_dir = File.join(cwd, ".ariadna_planning", "phases")
64
64
  normalized = normalize_phase_name(phase)
65
65
  not_found = { found: false, directory: nil, phase_number: nil, phase_name: nil, plans: [], summaries: [] }
66
66
 
@@ -88,7 +88,7 @@ module Ariadna
88
88
 
89
89
  result = {
90
90
  found: true,
91
- directory: File.join(".planning", "phases", match),
91
+ directory: File.join(".ariadna_planning", "phases", match),
92
92
  phase_number: phase_number,
93
93
  phase_name: phase_name,
94
94
  plans: plans,
@@ -104,7 +104,7 @@ module Ariadna
104
104
  Output.error("phase required") unless phase
105
105
 
106
106
  cwd = Dir.pwd
107
- phases_dir = File.join(cwd, ".planning", "phases")
107
+ phases_dir = File.join(cwd, ".ariadna_planning", "phases")
108
108
  normalized = normalize_phase_name(phase)
109
109
 
110
110
  unless File.directory?(phases_dir)
@@ -154,7 +154,7 @@ module Ariadna
154
154
 
155
155
  def self.list(options, raw: false)
156
156
  cwd = Dir.pwd
157
- phases_dir = File.join(cwd, ".planning", "phases")
157
+ phases_dir = File.join(cwd, ".ariadna_planning", "phases")
158
158
 
159
159
  unless File.directory?(phases_dir)
160
160
  key = options[:type] ? :files : :directories
@@ -192,7 +192,7 @@ module Ariadna
192
192
  def self.next_decimal(base_phase, raw: false)
193
193
  Output.error("base phase required") unless base_phase
194
194
  cwd = Dir.pwd
195
- phases_dir = File.join(cwd, ".planning", "phases")
195
+ phases_dir = File.join(cwd, ".ariadna_planning", "phases")
196
196
  normalized = normalize_phase_name(base_phase)
197
197
 
198
198
  unless File.directory?(phases_dir)
@@ -222,8 +222,8 @@ module Ariadna
222
222
  def self.add(description, raw: false)
223
223
  Output.error("description required") unless description && !description.empty?
224
224
  cwd = Dir.pwd
225
- phases_dir = File.join(cwd, ".planning", "phases")
226
- roadmap_path = File.join(cwd, ".planning", "ROADMAP.md")
225
+ phases_dir = File.join(cwd, ".ariadna_planning", "phases")
226
+ roadmap_path = File.join(cwd, ".ariadna_planning", "ROADMAP.md")
227
227
 
228
228
  existing = if File.directory?(phases_dir)
229
229
  Dir.children(phases_dir)
@@ -252,7 +252,7 @@ module Ariadna
252
252
  def self.insert(after, description, raw: false)
253
253
  Output.error("after phase and description required") unless after && description && !description.empty?
254
254
  cwd = Dir.pwd
255
- phases_dir = File.join(cwd, ".planning", "phases")
255
+ phases_dir = File.join(cwd, ".ariadna_planning", "phases")
256
256
  normalized = normalize_phase_name(after)
257
257
 
258
258
  # Calculate next decimal
@@ -277,7 +277,7 @@ module Ariadna
277
277
  def self.remove(phase, force: false, raw: false)
278
278
  Output.error("phase required") unless phase
279
279
  cwd = Dir.pwd
280
- phases_dir = File.join(cwd, ".planning", "phases")
280
+ phases_dir = File.join(cwd, ".ariadna_planning", "phases")
281
281
  normalized = normalize_phase_name(phase)
282
282
 
283
283
  unless File.directory?(phases_dir)
@@ -308,7 +308,7 @@ module Ariadna
308
308
  def self.complete(phase, raw: false)
309
309
  Output.error("phase required") unless phase
310
310
  cwd = Dir.pwd
311
- roadmap_path = File.join(cwd, ".planning", "ROADMAP.md")
311
+ roadmap_path = File.join(cwd, ".ariadna_planning", "ROADMAP.md")
312
312
  normalized = normalize_phase_name(phase)
313
313
 
314
314
  # Mark in ROADMAP.md
@@ -327,7 +327,7 @@ module Ariadna
327
327
  cwd = Dir.pwd
328
328
 
329
329
  # Create milestone archive
330
- archive_dir = File.join(cwd, ".planning", "milestones")
330
+ archive_dir = File.join(cwd, ".ariadna_planning", "milestones")
331
331
  FileUtils.mkdir_p(archive_dir)
332
332
 
333
333
  milestone_name = name || "v#{version}"
@@ -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