kenaz 0.3.22 → 0.3.24
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.
- package/core/.claude/hooks/_user-scope.js +1 -1
- package/core/.claude/hooks/core-resolve.js +1 -1
- package/core/.claude/hooks/worktree-create.js +11 -29
- package/core/.claude/hooks/worktree-remove.js +12 -38
- package/core/.collaboration/core/reconcile.js +16 -1
- package/core/.collaboration/core/task-2467-lifecycle.test.js +63 -0
- package/core/.collaboration/core/task-api.js +37 -7
- package/core/.formation/bifrost/launch.js +1 -1
- package/core/.formation/tools/dispatch-detail/worktree-subagent-mode.md +6 -1
- package/core/.formation/tools/kenaz-stats.js +1 -1
- package/core/.formation/tools/post-complete/git-merge.js +1 -1
- package/core/.formation/tools/prompt.js +1 -1
- package/core/.formation/tools/utils.js +5 -5
- package/core/.formation/tools/worktree-reclaim.js +73 -2
- package/core/.formation/tools/worktree-reclaim.test.js +113 -0
- package/core/.kenaz/specialist/ansuz_rules.yaml +7 -51
- package/core/.kenaz/specialist/ansuz_session_handoff.schema.json +2 -6
- package/core/.rule/general/project-self-containment.yaml +2 -2
- package/core/.specialist/Amelia/README.md +1 -1
- package/core/.specialist/Amelia/rule.yaml +1 -1
- package/core/.specialist/Ansuz/RULES.md +6 -2
- package/core/.specialist/Ansuz/concepts/commitment_layer.yaml +1 -1
- package/core/.specialist/Ansuz/concepts/evolvable_guardrails.yaml +1 -1
- package/core/.specialist/Ansuz/knowledge.yaml +1 -3
- package/core/.specialist/tools/__tests__/task-2409-lessons.test.js +10 -0
- package/core/.specialist/tools/__tests__/task-2427-harvest.test.js +25 -0
- package/core/.specialist/tools/ansuz-boot-fast.js +1 -1
- package/core/.specialist/tools/failure-detector.js +4 -4
- package/core/.specialist/tools/handoff-doc.js +1 -1
- package/core/.specialist/tools/lessons.js +2 -2
- package/core/CLAUDE.md +5 -5
- package/core/KENAZ_CORE_VERSION +1 -1
- package/core/dashboard/scripts/install-kenaz-cli.js +56 -30
- package/core/dev/scripts/check-file-size.js +1 -1
- package/core/dev/scripts/ci-feedback.js +1 -1
- package/core/dev/scripts/gc-agent-worktrees.js +13 -12
- package/core/dev/scripts/kenaz-session.js +3 -3
- package/core/dev/scripts/peer-identity-e2e.js +6 -4
- package/core/dev/scripts/run-rust-tests.js +2 -2
- package/core/dev/scripts/skill-routing-replay.js +3 -3
- package/core/dev/scripts/task1961/selftest.js +2 -2
- package/core/dev/scripts/windows-hide-guard.test.js +112 -0
- package/core/plugins/kenaz/guidance.md +1 -0
- package/core/plugins/kenaz/hooks/core-resolve.js +1 -1
- package/core/plugins/kenaz/hooks/hooks.json +9 -0
- package/core/plugins/kenaz/hooks/kenaz-hook.js +58 -4
- package/core/plugins/kenaz/hooks/worktree-guard.js +121 -0
- package/core/plugins/kenaz/hooks/worktree-guard.test.js +75 -0
- package/core/plugins/kenaz/scripts/kenaz.test.js +72 -5
- package/core/plugins/kenaz-peer/hooks/register.test.ts +14 -2
- package/core/plugins/kenaz-peer/hooks/register.ts +6 -1
- package/lib/cli.js +9 -5
- package/package.json +6 -6
- package/vendor/install-kenaz-cli.js +56 -30
- package/core/.kenaz/designs/METAPLASTICITY_CONFIDENCE_DESIGN.md +0 -537
- package/core/.kenaz/designs/REFLEX_INITIATOR_DESIGN.md +0 -501
- package/core/.kenaz/designs/TASK_1385_handoff_mcp_design.md +0 -426
- package/core/.kenaz/designs/TASK_932_hippocampus_consolidation.md +0 -103
- package/core/.kenaz/designs/TASK_934_efe_signal_engine.md +0 -97
- package/core/.kenaz/designs/TASK_935_self_evolution_framework.md +0 -154
- package/core/.kenaz/designs/VISION_cognitive_architecture_roadmap.md +0 -159
- package/core/.kenaz/designs/metaplasticity_simulation_results.json +0 -696
- package/core/.kenaz/main-memory/README.md +0 -230
- package/core/.kenaz/main-memory/kenaz/cortex/001_cortex_overview.md +0 -168
- package/core/.kenaz/main-memory/kenaz/cortex/001_rag_engine_overview.md +0 -30
- package/core/.kenaz/main-memory/kenaz/memory-system/001_three_tier_architecture.md +0 -361
- package/core/.kenaz/main-memory/kenaz/pipeline/001_task_execution_flow.md +0 -117
- package/core/.kenaz/main-memory/kenaz/pipeline/001_task_granularity.md +0 -154
- package/core/.kenaz/main-memory/kenaz/pipeline/002_team_priority.md +0 -51
- package/core/.kenaz/main-memory/kenaz/pipeline/003_feature_id_system.md +0 -46
- package/core/.kenaz/main-memory/kenaz/rules/001_gen_007_self_containment.md +0 -108
- package/core/.kenaz/main-memory/kenaz/rules/001_rule_priority_system.md +0 -121
- package/core/.kenaz/main-memory/kenaz/rules/002_agt_006_pre_check.md +0 -0
- package/core/.kenaz/main-memory/kenaz/rules/003_ppl_002_task_archival.md +0 -48
- package/core/.kenaz/main-memory/kenaz/system/001_dual_track_task_system.md +0 -197
- package/core/.kenaz/main-memory/knowledge/patterns/001_json_bom_issue.md +0 -78
- package/core/.kenaz/main-memory/knowledge/patterns/001_leader_worker_pattern.md +0 -0
- package/core/.kenaz/main-memory/knowledge/patterns/002_scope_path_conflict.md +0 -115
- package/core/.kenaz/main-memory/knowledge/patterns/002_task_dependency_resolution.md +0 -223
- package/core/.kenaz/main-memory/knowledge/patterns/003_question_protocol.md +0 -242
- package/core/.kenaz/main-memory/knowledge/patterns/004_user_insight_value.md +0 -111
- package/core/.kenaz/main-memory/knowledge/patterns/005_file_lock_pattern.md +0 -274
- package/core/.kenaz/main-memory/knowledge/references/001_ppl_rules.md +0 -28
- package/core/.kenaz/main-memory/knowledge/solutions/001_json_bom_issue.md +0 -137
- package/core/.kenaz/main-memory/knowledge/solutions/001_team_invocation.md +0 -0
- package/core/.kenaz/main-memory/knowledge/solutions/002_passive_monitoring.md +0 -0
- package/core/.kenaz/main-memory/knowledge/solutions/003_windows_file_race_condition.md +0 -239
- package/core/.kenaz/main-memory/registry.json +0 -326
- package/core/.kenaz/main-memory/version.yaml +0 -58
- package/core/.kenaz/specialist/memory_guard_fired.json +0 -1
- package/core/.kenaz/specialist/memory_guard_trigger_cache.json +0 -1
- package/core/.kenaz/specialist/memory_source_priority.yaml +0 -260
- package/core/.kenaz/specialist/prompt_1775.txt +0 -317
- package/core/.kenaz/specialist/prompt_1776.txt +0 -326
- package/core/.kenaz/specialist/prompt_1791.txt +0 -320
- package/core/.kenaz/specialist/prompt_1792.txt +0 -320
- package/core/.kenaz/specialist/prompt_1795.txt +0 -281
- package/core/.kenaz/specialist/prompt_1813.txt +0 -332
- package/core/.kenaz/specialist/prompt_1814.txt +0 -401
- package/core/.kenaz/specialist/prompt_1815.txt +0 -394
- package/core/.kenaz/specialist/prompt_1816.txt +0 -437
- package/core/.kenaz/specialist/prompt_1818.txt +0 -361
- package/core/.kenaz/specialist/prompt_1819.txt +0 -421
- package/core/.kenaz/specialist/prompt_1821.txt +0 -345
- package/core/.kenaz/specialist/prompt_1822.txt +0 -313
- package/core/.kenaz/specialist/prompt_1824.txt +0 -348
- package/core/.kenaz/specialist/prompt_1826.txt +0 -388
- package/core/.kenaz/specialist/rune_efe_salience_gap.md +0 -21
- package/core/.kenaz/specialist/task1825_update.json +0 -43
- package/core/.kenaz/specialist/taskgen/consolidation_i.json +0 -38
- package/core/.kenaz/specialist/taskgen/csharp_a.json +0 -44
- package/core/.kenaz/specialist/taskgen/csharp_b.json +0 -40
- package/core/.kenaz/specialist/taskgen/embedding_e.json +0 -34
- package/core/.kenaz/specialist/taskgen/hygiene_fg.json +0 -39
- package/core/.kenaz/specialist/taskgen/pathology_h.json +0 -36
- package/core/.kenaz/specialist/taskgen/unity_noise_d.json +0 -38
- package/core/.kenaz/specialist/taskgen/visibility_c.json +0 -38
- package/core/.specialist/Ansuz/decisions/ADR-requirement-graph-layer.md +0 -390
- package/core/.specialist/Ansuz/self_model_seed.backup.json +0 -100
- package/core/.specialist/ansuz_session_handoff.json +0 -96
- package/core/dev/ALAYA_FIELD_FEEDBACK_DESIGN.md +0 -126
- package/core/dev/ANSUZ_SCAFFOLD_DIET_2026-09-20.md +0 -231
- package/core/dev/ANSUZ_STARTUP_INJECTION_REVIEW.md +0 -355
- package/core/dev/ANSUZ_WORKFLOW_MODERNIZATION.md +0 -143
- package/core/dev/CORTEX_META_GRAPH_ASSESSMENT.md +0 -99
- package/core/dev/FREYA_DOWNSTREAM_BUGS_2026-09-19.md +0 -44
- package/core/dev/GLOBAL_MEMORY_IDENTITY_CONSOLIDATION.md +0 -263
- package/core/dev/GUARD_EFFECTIVENESS_DESIGN.md +0 -180
- package/core/dev/HEALTH_GATE_VARIANCE_ASSESSMENT.md +0 -271
- package/core/dev/HOOK_DIET_2026-09-21.md +0 -126
- package/core/dev/JEV_INTEGRATION_PLAN.md +0 -189
- package/core/dev/KENAZ_AGENT_CONNECT_v1_SPEC.md +0 -139
- package/core/dev/MOBILE_DESIGN_SPEC.md +0 -569
- package/core/dev/MULTI_ANSUZ_SPEC.md +0 -136
- package/core/dev/MUNINN_RETIREMENT.md +0 -115
- package/core/dev/PHASE3_ATTRIBUTION_POPULATION_DIAGNOSIS.md +0 -211
- package/core/dev/PHASE3_P3-2B_TASKLEVEL_PROBE.md +0 -83
- package/core/dev/PHASE3_P3-2_POPULATION_DISJOINTNESS.md +0 -83
- package/core/dev/PHASE3_P3-2_REMEASURE_REPORT.md +0 -231
- package/core/dev/PREDICTION_GROUNDING_DESIGN.md +0 -376
- package/core/dev/PRODUCT_SPEC.md +0 -317
- package/core/dev/PROJECT_REGISTRY_DUPLICATE_ASSESSMENT.md +0 -86
- package/core/dev/STARTUP_TIMELINE_TASK_1995.md +0 -181
- package/core/dev/SYNAPSE_WORKER_PER_PROJECT.md +0 -881
- package/core/dev/TASK_1680_P3-3_DISPATCH_SPEC.md +0 -96
- package/core/dev/TASK_1684_CALIBRATION_IMPACT_ANALYSIS.md +0 -170
- package/core/dev/TASK_1684_FORK_A_GOODHART_DESIGN.md +0 -171
- package/core/dev/TASK_1684_P3_2_REMEASURE_VALIDATION.md +0 -262
- package/core/dev/TASK_1903_SIGNAL_AUC_MEASUREMENT.md +0 -207
- package/core/dev/TASK_1904_BRANCH_INTEGRITY_AUDIT.md +0 -146
- package/core/dev/ansuz-eval/README.md +0 -38
- package/core/dev/ansuz-eval/build-fixtures.js +0 -87
- package/core/dev/ansuz-eval/grade.js +0 -96
- package/core/dev/ansuz-eval/grader.test.js +0 -117
- package/core/dev/ansuz-eval/tasks.md +0 -32
- package/core/dev/archive/ansuz/BOOT_FULL.md +0 -141
- package/core/dev/archive/ansuz/agents/ansuz-boot.md +0 -176
- package/core/dev/archive/ansuz/designs/alaya-passive-surfacing.md +0 -84
- package/core/dev/archive/ansuz/designs/cc_memory_indexing.md +0 -307
- package/core/dev/archive/ansuz/designs/check_guard.md +0 -322
- package/core/dev/archive/ansuz/designs/consequence_loop.md +0 -227
- package/core/dev/archive/ansuz/designs/mcp_kuzudb_lock_architecture.md +0 -312
- package/core/dev/archive/ansuz/designs/phase0_git_enrichment.md +0 -278
- package/core/dev/archive/ansuz/designs/refactor_mcp_tools_synapse.md +0 -490
- package/core/dev/archive/ansuz/designs/semantic_markdown_extraction.md +0 -167
- package/core/dev/archive/ansuz/designs/task_1372_prompt_injects_into.md +0 -193
- package/core/dev/archive/ansuz/designs/thought_stack.md +0 -286
- package/core/dev/archive/ansuz/investigations/reachability_unified_api_2026-04-11.md +0 -330
- package/core/dev/archive/ansuz/investigations/synapse_orphans_indexing_bug_2026-04-11.md +0 -352
- package/core/dev/archive/ansuz/investigations/synapse_orphans_reindex_verification_2026-04-11.md +0 -48
- package/core/dev/archive/ansuz/investigations/synapse_orphans_verification_2026-04-11.md +0 -170
- package/core/dev/archive/ansuz/legacy/kernel.yaml +0 -399
- package/core/dev/archive/ansuz/legacy/phases/phase_0.yaml +0 -418
- package/core/dev/archive/ansuz/legacy/phases/phase_1.yaml +0 -376
- package/core/dev/archive/ansuz/legacy/phases/phase_10.yaml +0 -35
- package/core/dev/archive/ansuz/legacy/phases/phase_11.yaml +0 -582
- package/core/dev/archive/ansuz/legacy/phases/phase_2.yaml +0 -94
- package/core/dev/archive/ansuz/legacy/phases/phase_3.yaml +0 -274
- package/core/dev/archive/ansuz/legacy/phases/phase_4.yaml +0 -67
- package/core/dev/archive/ansuz/legacy/phases/phase_5.yaml +0 -32
- package/core/dev/archive/ansuz/legacy/phases/phase_6.yaml +0 -91
- package/core/dev/archive/ansuz/legacy/phases/phase_7.yaml +0 -58
- package/core/dev/archive/ansuz/legacy/phases/phase_8.yaml +0 -146
- package/core/dev/archive/ansuz/legacy/phases/phase_9.yaml +0 -424
- package/core/dev/archive/ansuz/specs/INDEX_bifrost_hook_parity.yaml +0 -92
- package/core/dev/archive/ansuz/specs/active-inference-formation.yaml +0 -453
- package/core/dev/archive/ansuz/specs/brief_TASK_1228_userpromptsubmit.yaml +0 -191
- package/core/dev/archive/ansuz/specs/brief_TASK_1229_pretooluse_posttooluse.yaml +0 -250
- package/core/dev/archive/ansuz/specs/brief_TASK_1230_sessionstart_stop.yaml +0 -301
- package/core/dev/archive/ansuz/specs/brief_TASK_1231_verification.yaml +0 -272
- package/core/dev/archive/skills/feature_agent/SKILL.md +0 -289
- package/core/dev/design/PHASE4_DESIGN.md +0 -559
- package/core/dev/design/dashboard_docs_integration_PLAN.md +0 -388
- package/core/dev/design/matrix_format_ABBREVIATIONS.md +0 -655
- package/core/dev/design/matrix_format_DESIGN_SPEC.md +0 -601
- package/core/dev/design/matrix_format_DISCUSSION_SUMMARY.md +0 -484
- package/core/dev/design/matrix_format_EXAMPLE_memory.matrix +0 -13
- package/core/dev/design/matrix_format_EXAMPLE_project_status.matrix +0 -9
- package/core/dev/design/matrix_format_EXAMPLE_tasks.matrix +0 -14
- package/core/dev/design/matrix_format_SYNTAX_BNF.md +0 -754
- package/core/dev/design/matrix_format_TOKEN_COMPARISON.md +0 -484
- package/core/dev/design/matrix_v2_COGNITIVE_DESIGN.md +0 -503
- package/core/dev/design/matrix_v2_DISCUSSION_SUMMARY.md +0 -414
- package/core/dev/design/matrix_v2_EXAMPLE.matrix +0 -67
- package/core/dev/designs/EXPANDABLE_CARD_DESIGN_SPEC.md +0 -509
- package/core/dev/jev-eval/ACTIVE_CORRECTION.md +0 -52
- package/core/dev/jev-eval/ANNOTATION_GUIDE.md +0 -68
- package/core/dev/jev-eval/BASELINE_COMPARISON.md +0 -45
- package/core/dev/jev-eval/CONTEXT_REVIEW.md +0 -31
- package/core/dev/jev-eval/EVALUATION_STATUS.md +0 -39
- package/core/dev/jev-eval/HISTORICAL_CORPUS.md +0 -33
- package/core/dev/jev-eval/PACKAGING_VERIFICATION.md +0 -42
- package/core/dev/jev-eval/README.md +0 -101
- package/core/dev/jev-eval/THALAMUS_RANKING.md +0 -58
- package/core/dev/jev-eval/VALIDATION_PROGRESS.md +0 -54
- package/core/dev/jev-eval/cli.mjs +0 -50
- package/core/dev/jev-eval/context.mjs +0 -183
- package/core/dev/jev-eval/corpus.mjs +0 -186
- package/core/dev/jev-eval/fixtures/conversation-review.seed.jsonl +0 -6
- package/core/dev/jev-eval/fixtures/synthetic.jsonl +0 -11
- package/core/dev/jev-eval/metrics.mjs +0 -67
- package/core/dev/jev-eval/muninn-baseline.mjs +0 -119
- package/core/dev/jev-eval/providers.mjs +0 -95
- package/core/dev/jev-eval/reports/annotation-pilot-2026-09-20.json +0 -32
- package/core/dev/jev-eval/reports/context-review-2026-09-20.json +0 -48
- package/core/dev/jev-eval/reports/conversation-review.pending.json +0 -151
- package/core/dev/jev-eval/reports/history-corpus-2026-09-20.json +0 -52
- package/core/dev/jev-eval/reports/length-probe-2026-09-20.json +0 -133
- package/core/dev/jev-eval/reports/live-smoke-2026-09-20.json +0 -616
- package/core/dev/jev-eval/reports/muninn-baseline-2026-09-20.json +0 -52
- package/core/dev/jev-eval/reports/resilience-2026-09-20.json +0 -520
- package/core/dev/jev-eval/reports/rules-baseline.json +0 -197
- package/core/dev/jev-eval/reports/synthetic-review.pending.json +0 -357
- package/core/dev/jev-eval/resilience.mjs +0 -71
- package/core/dev/jev-eval/review.mjs +0 -78
- package/core/dev/jev-eval/schema.mjs +0 -87
- package/core/dev/jev-eval/test/context.test.mjs +0 -95
- package/core/dev/jev-eval/test/corpus.test.mjs +0 -102
- package/core/dev/jev-eval/test/eval.test.mjs +0 -146
- package/core/dev/jev-eval/test/muninn-baseline.test.mjs +0 -71
- package/core/dev/jev-eval/test/resilience.test.mjs +0 -72
- package/core/dev/jev-eval/test/review.test.mjs +0 -61
- package/core/dev/pipeline/PHASE3_PLANNING_SUMMARY.md +0 -338
- package/core/dev/pipeline/PROGRESS.md +0 -113
- package/core/dev/pipeline/PROGRESS_template.md +0 -860
- package/core/dev/pipeline/QA_REPORT_F008.md +0 -431
- package/core/dev/pipeline/QA_REPORT_LOCAL_CLAUDE_DIAGNOSIS.md +0 -583
- package/core/dev/pipeline/README.md +0 -210
- package/core/dev/pipeline/WORKFLOW_GUIDE.md +0 -824
- package/core/dev/pipeline/archived/TASK_015_tauri_init.yaml +0 -53
- package/core/dev/pipeline/archived/TASK_016_tauri_commands.yaml +0 -54
- package/core/dev/pipeline/archived/TASK_017_rust_pty.yaml +0 -54
- package/core/dev/pipeline/archived/TASK_018_tauri_bundle.yaml +0 -53
- package/core/dev/pipeline/archived/TASK_019_release_workflow.yaml +0 -56
- package/core/dev/pipeline/archived/TASK_020_update_ui.yaml +0 -54
- package/core/dev/pipeline/archived/TASK_021_update_notification_ui.yaml +0 -55
- package/core/dev/pipeline/archived/TASK_022_remove_node_pty.yaml +0 -65
- package/core/dev/pipeline/archived/TASK_023_api_routes_migration.yaml +0 -86
- package/core/dev/pipeline/archived/TASK_024_feature_id_system.yaml +0 -51
- package/core/dev/pipeline/archived/TASK_025_executable_acceptance.yaml +0 -66
- package/core/dev/pipeline/archived/TASK_026_spec_versioning.yaml +0 -56
- package/core/dev/pipeline/archived/TASK_027_drift_detection.yaml +0 -60
- package/core/dev/pipeline/archived/TASK_028_tauri_pty_manager.yaml +0 -60
- package/core/dev/pipeline/archived/TASK_029_tauri_pty_commands.yaml +0 -62
- package/core/dev/pipeline/archived/TASK_030_frontend_session_adapter.yaml +0 -54
- package/core/dev/pipeline/archived/TASK_031_terminal_tauri_events.yaml +0 -56
- package/core/dev/pipeline/archived/TASK_041_scheduler_data_models.yaml +0 -54
- package/core/dev/pipeline/archived/TASK_042_path_lock_manager.yaml +0 -53
- package/core/dev/pipeline/archived/TASK_043_process_manager.yaml +0 -57
- package/core/dev/pipeline/archived/TASK_044_git_integration.yaml +0 -85
- package/core/dev/pipeline/archived/TASK_045_task_queue_manager.yaml +0 -54
- package/core/dev/pipeline/archived/TASK_046_scheduler_dispatcher.yaml +0 -60
- package/core/dev/pipeline/archived/TASK_047_tauri_scheduler_commands.yaml +0 -55
- package/core/dev/pipeline/archived/TASK_048_realtime_status_push.yaml +0 -92
- package/core/dev/pipeline/archived/TASK_049_frontend_scheduler_integration.yaml +0 -58
- package/core/dev/pipeline/archived/TASK_050_error_recovery.yaml +0 -56
- package/core/dev/pipeline/archived/TASK_051_optimization_proposals_backend.yaml +0 -53
- package/core/dev/pipeline/archived/TASK_052_optimization_proposals_ui.yaml +0 -58
- package/core/dev/pipeline/archived/TASK_053_optimization_proposals_diff_view.yaml +0 -54
- package/core/dev/pipeline/archived/TASK_054_multi_project_scheduler_state.yaml +0 -76
- package/core/dev/pipeline/archived/TASK_055_scheduler_api_project_scope.yaml +0 -64
- package/core/dev/pipeline/archived/TASK_056_frontend_scheduler_project_scope.yaml +0 -62
- package/core/dev/pipeline/archived/TASK_057_scheduler_module_structure.yaml +0 -54
- package/core/dev/pipeline/archived/TASK_058_scheduler_models_extract.yaml +0 -51
- package/core/dev/pipeline/archived/TASK_059_scheduler_core_extract.yaml +0 -51
- package/core/dev/pipeline/archived/TASK_060_scheduler_commands_extract.yaml +0 -51
- package/core/dev/pipeline/archived/TASK_061_scheduler_specialized_commands.yaml +0 -53
- package/core/dev/pipeline/archived/TASK_062_process_manager_module_structure.yaml +0 -56
- package/core/dev/pipeline/archived/TASK_063_process_manager_core_extract.yaml +0 -56
- package/core/dev/pipeline/archived/TASK_064_recovery_module_structure.yaml +0 -57
- package/core/dev/pipeline/archived/TASK_065_recovery_core_extract.yaml +0 -56
- package/core/dev/pipeline/archived/TASK_066_self_enhancement_scheduler_models.yaml +0 -60
- package/core/dev/pipeline/archived/TASK_067_agents_section_quick_actions.yaml +0 -53
- package/core/dev/pipeline/archived/TASK_067_self_enhancement_scheduler_core.yaml +0 -65
- package/core/dev/pipeline/archived/TASK_068_agent_workflow_rule_enhancement.yaml +0 -46
- package/core/dev/pipeline/archived/TASK_068_self_enhancement_tauri_commands.yaml +0 -61
- package/core/dev/pipeline/archived/TASK_069_agent_wizard_responsive.yaml +0 -46
- package/core/dev/pipeline/archived/TASK_069_self_enhancement_ui.yaml +0 -62
- package/core/dev/pipeline/archived/TASK_070_preview_panel_redesign.yaml +0 -62
- package/core/dev/pipeline/archived/TASK_070_self_enhancement_integration.yaml +0 -57
- package/core/dev/pipeline/archived/TASK_071_preview_panel_qa.yaml +0 -98
- package/core/dev/pipeline/archived/TASK_071_single_agent_config.yaml +0 -57
- package/core/dev/pipeline/archived/TASK_072_preview_modal_esc_fix.yaml +0 -71
- package/core/dev/pipeline/archived/TASK_072_product_review_module.yaml +0 -57
- package/core/dev/pipeline/archived/TASK_073_agents_page_component_refactor.yaml +0 -68
- package/core/dev/pipeline/archived/TASK_073_rename_single_agent.yaml +0 -64
- package/core/dev/pipeline/archived/TASK_074_preview_mode_ui_diagnosis.yaml +0 -71
- package/core/dev/pipeline/archived/TASK_074_single_agent_ui_toggle.yaml +0 -56
- package/core/dev/pipeline/archived/TASK_075_agents_page_component_refactor.yaml +0 -69
- package/core/dev/pipeline/archived/TASK_075_single_agent_integration_test.yaml +0 -75
- package/core/dev/pipeline/archived/TASK_076_preview_mode_ui_diagnosis.yaml +0 -70
- package/core/dev/pipeline/archived/TASK_076_single_agent_continuous_mode.yaml +0 -65
- package/core/dev/pipeline/archived/TASK_077_failure_directory_structure.yaml +0 -51
- package/core/dev/pipeline/archived/TASK_077_single_agent_typescript_types.yaml +0 -59
- package/core/dev/pipeline/archived/TASK_078_fail_001_agent_no_output.yaml +0 -53
- package/core/dev/pipeline/archived/TASK_078_single_agent_ui_simplify.yaml +0 -74
- package/core/dev/pipeline/archived/TASK_079_dashboard_rwd_responsive.yaml +0 -63
- package/core/dev/pipeline/archived/TASK_079_fail_002_json_bom.yaml +0 -56
- package/core/dev/pipeline/archived/TASK_080_fail_003_queue_pollution.yaml +0 -56
- package/core/dev/pipeline/archived/TASK_080_http_server_module.yaml +0 -55
- package/core/dev/pipeline/archived/TASK_081_failure_logging_tools.yaml +0 -57
- package/core/dev/pipeline/archived/TASK_081_http_api_routes.yaml +0 -62
- package/core/dev/pipeline/archived/TASK_082_frontend_api_adapter.yaml +0 -51
- package/core/dev/pipeline/archived/TASK_082_integrate_failure_to_workflow.yaml +0 -60
- package/core/dev/pipeline/archived/TASK_083_cleanup_nextjs_api.yaml +0 -48
- package/core/dev/pipeline/archived/TASK_083_task_queue_cleanup.yaml +0 -67
- package/core/dev/pipeline/archived/TASK_084_rust_dead_code_cleanup.yaml +0 -66
- package/core/dev/pipeline/archived/TASK_084_scheduler_sync_logic_fix.yaml +0 -68
- package/core/dev/pipeline/archived/TASK_085_http_api_web_mode_fixes.yaml +0 -46
- package/core/dev/pipeline/archived/TASK_085_memory_consolidation_0204_0205.yaml +0 -98
- package/core/dev/pipeline/archived/TASK_086_collapsible_preview_panel.yaml +0 -161
- package/core/dev/pipeline/archived/TASK_086_web_mode_feature_parity.yaml +0 -62
- package/core/dev/pipeline/archived/TASK_087_manual_memory_archival.yaml +0 -163
- package/core/dev/pipeline/archived/TASK_087_mobile_http_control.yaml +0 -68
- package/core/dev/pipeline/archived/TASK_088_fail_003_to_ppl_002_rule.yaml +0 -63
- package/core/dev/pipeline/archived/TASK_088_mobile_http_qa.yaml +0 -121
- package/core/dev/pipeline/archived/TASK_089_agent_collaboration_topic.yaml +0 -60
- package/core/dev/pipeline/archived/TASK_089_web_mode_monitor_fix.yaml +0 -58
- package/core/dev/pipeline/archived/TASK_090_cli_detection_fix.yaml +0 -61
- package/core/dev/pipeline/archived/TASK_090_ui_ux_lessons_topic.yaml +0 -63
- package/core/dev/pipeline/archived/TASK_091_expandable_card_design.yaml +0 -56
- package/core/dev/pipeline/archived/TASK_091_move_agent_section_components.yaml +0 -65
- package/core/dev/pipeline/archived/TASK_092_expandable_card_component.yaml +0 -60
- package/core/dev/pipeline/archived/TASK_092_refactor_agent_create_wizard.yaml +0 -84
- package/core/dev/pipeline/archived/TASK_093_taskcard_detail_integration.yaml +0 -57
- package/core/dev/pipeline/archived/TASK_093_update_barrel_exports_test.yaml +0 -84
- package/core/dev/pipeline/archived/TASK_094_ai_agent_generation_enhancement.yaml +0 -115
- package/core/dev/pipeline/archived/TASK_094_proposalcard_detail_integration.yaml +0 -55
- package/core/dev/pipeline/archived/TASK_095_preview_fixes.yaml +0 -129
- package/core/dev/pipeline/archived/TASK_095_single_agent_task_selector.yaml +0 -60
- package/core/dev/pipeline/archived/TASK_096_agents_page_ux_improvements.yaml +0 -163
- package/core/dev/pipeline/archived/TASK_096_single_agent_status_sync.yaml +0 -60
- package/core/dev/pipeline/archived/TASK_097_local_claude_error_logging.yaml +0 -59
- package/core/dev/pipeline/archived/TASK_097_single_agent_monitor_events.yaml +0 -59
- package/core/dev/pipeline/archived/TASK_098_product_manager_team_phase2.yaml +0 -60
- package/core/dev/pipeline/archived/TASK_098_single_agent_refactor_test.yaml +0 -58
- package/core/dev/pipeline/archived/TASK_099_backend_team_creation.yaml +0 -258
- package/core/dev/pipeline/archived/TASK_100_frontend_team_creation.yaml +0 -61
- package/core/dev/pipeline/archived/TASK_101_orchestrator_system.yaml +0 -403
- package/core/dev/pipeline/archived/TASK_102_designer_sre_teams.yaml +0 -90
- package/core/dev/pipeline/archived/TASK_103_integration_testing.yaml +0 -86
- package/core/dev/pipeline/archived/TASK_128_integration_testing.yaml +0 -83
- package/core/dev/pipeline/archived/TASK_134_cortex_v2_phase3_file_watcher.yaml +0 -65
- package/core/dev/pipeline/archived/TASK_134_team_http_api.yaml +0 -96
- package/core/dev/pipeline/archived/TASK_135_cortex_v2_phase3_git_monitor.yaml +0 -63
- package/core/dev/pipeline/archived/TASK_136_cortex_v2_phase3_change_analyzer.yaml +0 -69
- package/core/dev/pipeline/archived/TASK_137_cortex_v2_phase3_cache_invalidator.yaml +0 -67
- package/core/dev/pipeline/archived/TASK_137_team_orchestrator_integration.yaml +0 -93
- package/core/dev/pipeline/archived/TASK_138_cortex_v2_phase3_distributed_cache.yaml +0 -68
- package/core/dev/pipeline/archived/TASK_138_matrix_folder_structure.yaml +0 -61
- package/core/dev/pipeline/archived/TASK_139_cortex_v2_phase3_cache_prewarming.yaml +0 -65
- package/core/dev/pipeline/archived/TASK_146_unified_documentation.yaml +0 -141
- package/core/dev/pipeline/archived/TASK_147_pipeline_execution_rules.yaml +0 -76
- package/core/dev/pipeline/archived/TASK_148_update_claude_md.yaml +0 -77
- package/core/dev/pipeline/archived/TASK_149_fix_nextjs_mdx_serialization.yaml +0 -63
- package/core/dev/pipeline/archived/TASK_149_update_team_docs.yaml +0 -77
- package/core/dev/pipeline/archived/TASK_150_pipeline_workflow_guide.yaml +0 -82
- package/core/dev/pipeline/archived/TASK_164_fix_smart_context_switch.yaml +0 -49
- package/core/dev/pipeline/archived/TASK_165_ctags_symbol_index.yaml +0 -53
- package/core/dev/pipeline/archived/TASK_166_symbol_search_mcp_tool.yaml +0 -48
- package/core/dev/pipeline/archived/TASK_167_llm_module_summary.yaml +0 -55
- package/core/dev/pipeline/archived/TASK_168_map_reduce_context.yaml +0 -51
- package/core/dev/pipeline/archived/TASK_169_v2_integration_testing.yaml +0 -52
- package/core/dev/pipeline/backups/archive_2026-02-04T22-07-22/TASK_QUEUE_backup.json +0 -95
- package/core/dev/pipeline/docs/multi-agent-coordination.md +0 -446
- package/core/dev/pipeline/docs/overview.md +0 -406
- package/core/dev/pipeline/docs/task-management.md +0 -412
- package/core/dev/pipeline/docs/workflows.md +0 -32
- package/core/dev/pipeline/orchestrator/schemas/task_queue_schema.json +0 -58
- package/core/dev/pipeline/orchestrator/schemas/task_schema.json +0 -139
- package/core/dev/pipeline/plans/PLAN_task_cli_refactor.md +0 -281
- package/core/dev/pipeline/test_results/TASK_TEST_PARALLEL_002_result.txt +0 -27
- package/core/dev/plans/ANSUZ_SLIM_PLAN.md +0 -68
- package/core/dev/plans/CLI_FIRST_INSTALL_FLOW.md +0 -120
- package/core/dev/plans/FORMATION_RETIREMENT_PLAN.md +0 -313
- package/core/dev/plans/KUZU_REPLACEMENT_PLAN.md +0 -126
- package/core/dev/scripts/CRASH_DIAGNOSIS.md +0 -47
- package/core/dev/scripts/README.md +0 -142
- package/core/dev/scripts/RUN_ONCE.bat +0 -40
- package/core/dev/scripts/START_DEV_AGENT.bat +0 -63
- package/core/dev/scripts/START_MULTI_AGENT.bat +0 -80
- package/core/dev/scripts/dev_agent_scheduler.ps1 +0 -536
- package/core/dev/scripts/init_git.ps1 +0 -396
- package/core/dev/scripts/init_git.sh +0 -337
- package/core/dev/scripts/init_project.ps1 +0 -851
- package/core/dev/scripts/init_project.sh +0 -477
- package/core/dev/scripts/multi_agent_scheduler.ps1 +0 -2021
- package/core/dev/scripts/multi_agent_scheduler.sh +0 -1344
- package/core/dev/scripts/run_once.sh +0 -47
- package/core/dev/scripts/setup_rag.ps1 +0 -304
- package/core/dev/scripts/setup_rag.sh +0 -230
- package/core/dev/scripts/start_dev_agent.sh +0 -137
- package/core/dev/scripts/start_multi_agent.sh +0 -41
- package/core/dev/scripts/sync_task_queue.ps1 +0 -505
- package/core/dev/scripts/sync_task_queue.sh +0 -392
- package/core/dev/specs/agent-connect/PROTOCOL.md +0 -177
- package/core/dev/specs/agent-connect/SDK_GUIDE.md +0 -915
- package/core/dev/specs/agent-connect/examples/minimal-site/README.md +0 -137
- package/core/dev/specs/agent-connect/examples/minimal-site/package.json +0 -12
- package/core/dev/specs/agent-connect/examples/minimal-site/public/index.html +0 -116
- package/core/dev/specs/agent-connect/examples/minimal-site/public/install-redirect.js +0 -73
- package/core/dev/specs/agent-connect/examples/minimal-site/server.js +0 -516
- package/core/dev/specs/agent-connect/examples/minimal-site/test/smoke.test.mjs +0 -263
- package/core/dev/specs/agent-connect/history/DEFECT_REPORT_kenaz-agent-hub_2026-09-09_v0.4-empty-prompt-no-first-turn.md +0 -77
- package/core/dev/specs/agent-connect/history/DEFECT_REPORT_kenaz-agent-hub_2026-09-09_v0.4-prompt-mojibake.md +0 -90
- package/core/dev/specs/agent-connect/history/FEATURE_REQUEST_kenaz-agent-hub_2026-09-07.md +0 -61
- package/core/dev/specs/agent-connect/history/FEATURE_REQUEST_kenaz-agent-hub_2026-09-08_relay-v1-conformance.md +0 -76
- package/core/dev/specs/agent-connect/history/FEATURE_REQUEST_kenaz-agent-hub_2026-09-09_v0.4-session-channel.md +0 -87
- package/core/dev/specs/agent-connect/history/FLOWPIX_REPLY_agent-hub_2026-09-08_relay-v1-answers.md +0 -68
- package/core/dev/specs/agent-connect/history/FLOWPIX_bridge_CONTRACT.md +0 -642
- package/core/dev/specs/agent-connect/history/FLOWPIX_spikes_relay_spike_relay.mjs +0 -244
- package/core/dev/specs/agent-connect/history/KENAZ_RESPONSE_agent-hub_2026-09-07.md +0 -77
- package/core/dev/specs/agent-connect/history/KENAZ_RESPONSE_agent-hub_2026-09-08_direction-change-v0.3.md +0 -44
- package/core/dev/specs/agent-connect/history/KENAZ_RESPONSE_agent-hub_2026-09-08_relay-v1-answers-ack.md +0 -37
- package/core/dev/specs/agent-connect/history/KENAZ_RESPONSE_agent-hub_2026-09-08_relay-v1-conformance.md +0 -56
- package/core/dev/specs/agent-connect/history/KENAZ_RESPONSE_agent-hub_2026-09-09_annotations-install-coldstart.md +0 -44
- package/core/dev/specs/agent-connect/history/KENAZ_RESPONSE_agent-hub_2026-09-09_empty-prompt-first-turn.md +0 -56
- package/core/dev/specs/agent-connect/history/KENAZ_RESPONSE_agent-hub_2026-09-09_prompt-mojibake-fixed.md +0 -48
- package/core/dev/specs/agent-connect/history/KENAZ_RESPONSE_agent-hub_2026-09-09_session-channel.md +0 -57
- package/core/dev/specs/agent-connect/history/PROTOCOL_v0.3_snapshot.md +0 -379
- package/core/dev/specs/agent-connect/history/README.md +0 -47
- package/core/dev/specs/peer/CODEX_INTERACTIVE_PUSH.md +0 -65
- package/core/dev/specs/peer/CODEX_MANAGED_DAEMON.md +0 -54
- package/core/dev/specs/peer/CODEX_PEER_PULL_SPIKE.md +0 -54
- package/core/dev/specs/peer/MODS_SPIKE.md +0 -133
- package/core/dev/specs/peer/PER_PROJECT_ADDRESSING.md +0 -143
- package/core/dev/specs/peer/SWARM_PROTOCOLS.md +0 -256
- package/core/dev/specs/peer/codex-hook-shim-peer.test.js +0 -113
- package/core/dev/specs/peer/codex-push-launcher.test.js +0 -142
- package/core/dev/specs/peer/setup-codex-hooks.test.js +0 -60
- package/core/dev/specs/peer-ansuz/DELIVERY_SPIKE.md +0 -397
- package/core/dev/specs/peer-ansuz/DESIGN.md +0 -109
- package/core/dev/specs/peer-ansuz/spike/claude_poke.js +0 -129
- package/core/dev/specs/peer-ansuz/spike/claude_session_start_hook.js +0 -37
- package/core/dev/specs/peer-ansuz/spike/claude_settings_hook.json +0 -14
- package/core/dev/specs/peer-ansuz/spike/codex_appserver_client.js +0 -105
- package/core/dev/specs/peer-ansuz/spike/codex_appserver_query.js +0 -29
- package/core/dev/specs/peer-ansuz/spike/extract_timeline.js +0 -26
- package/core/dev/specs/synapse/SYMBOL_IDENTITY.md +0 -305
- package/core/dev/spikes/A4-cypher-varlen.md +0 -176
- package/core/dev/spikes/bloat-rounds.sh +0 -25
- package/core/dev/spikes/mods/clean-claude.js +0 -9
- package/core/dev/spikes/mods/drive-probe.js +0 -29
- package/core/dev/spikes/mods/e2e-peer.js +0 -71
- package/core/dev/spikes/mods/evidence/e2e-peer-control.json +0 -17
- package/core/dev/spikes/mods/evidence/e2e-peer-mod.json +0 -17
- package/core/dev/spikes/mods/evidence/probe-006a6e65-d807-4bc1-b648-fd7d1edfe0b4.jsonl +0 -4
- package/core/dev/spikes/mods/evidence/probe-cebdf1f7-f9c4-47a8-83cd-7c0786177404.jsonl +0 -12
- package/core/dev/spikes/mods/evidence/probe-eb21147d-10ce-4c32-93ed-37ca37d88d5a.jsonl +0 -11
- package/core/dev/spikes/mods/evidence/stream-cebdf1f7.jsonl +0 -18
- package/core/dev/spikes/mods/kenaz-mod-probe/.claude-plugin/plugin.json +0 -1
- package/core/dev/spikes/mods/kenaz-mod-probe/hooks/hooks.json +0 -1
- package/core/dev/spikes/mods/kenaz-mod-probe/hooks/register.ts +0 -65
- package/core/dev/spikes/mods/kenaz-mod-probe/tsconfig.json +0 -3
|
@@ -180,3 +180,116 @@ test('re-dispatch of a reclaimed card recreates the worktree from its branch wit
|
|
|
180
180
|
assert.strictEqual(fs.readFileSync(path.join(wt, 'f8.txt'), 'utf8'), 'work 8\n');
|
|
181
181
|
} finally { cleanup(root); }
|
|
182
182
|
});
|
|
183
|
+
|
|
184
|
+
// ── TASK_2485: removal must never traverse a link into the main repo ─────────────────────────────
|
|
185
|
+
// Measured (Windows, Git for Windows): `git worktree remove --force` follows EVERY junction (any name,
|
|
186
|
+
// any depth, also inside a real node_modules) and empties its target; fs.rmSync, Git Bash rm -rf and
|
|
187
|
+
// cmd rmdir /s do not. Control = the same fixture removed with the raw git command.
|
|
188
|
+
const { safeRemoveWorktree, unlinkAllLinks } = require('./worktree-reclaim');
|
|
189
|
+
const IS_WIN = process.platform === 'win32';
|
|
190
|
+
|
|
191
|
+
function mainFixture() {
|
|
192
|
+
const { root, repo } = makeRepo();
|
|
193
|
+
fs.mkdirSync(path.join(repo, 'backend'));
|
|
194
|
+
fs.writeFileSync(path.join(repo, 'backend', 'a.js'), 'tracked');
|
|
195
|
+
fs.writeFileSync(path.join(repo, '.gitignore'), '.kenaz/tasks\n.formation/worktrees\nnode_modules\n.env\n');
|
|
196
|
+
g(repo, 'add', '-A'); g(repo, 'commit', '-qm', 'backend');
|
|
197
|
+
fs.writeFileSync(path.join(repo, 'backend', '.env'), 'SECRET'); // untracked, unrecoverable
|
|
198
|
+
fs.mkdirSync(path.join(repo, 'node_modules', '@gameark'), { recursive: true });
|
|
199
|
+
fs.mkdirSync(path.join(repo, 'node_modules', '.bin'));
|
|
200
|
+
fs.writeFileSync(path.join(repo, 'node_modules', '.bin', 'x'), 'bin');
|
|
201
|
+
fs.symlinkSync(path.join(repo, 'backend'), path.join(repo, 'node_modules', '@gameark', 'backend'), 'junction'); // workspace link
|
|
202
|
+
return { root, repo };
|
|
203
|
+
}
|
|
204
|
+
const lostFiles = (repo) => ['backend/.env', 'backend/a.js', 'node_modules/.bin/x'].filter((f) => !fs.existsSync(path.join(repo, f)));
|
|
205
|
+
// where the dangerous link sits inside the dispatch worktree (createWorktree already links node_modules)
|
|
206
|
+
const VARIANTS = {
|
|
207
|
+
'node_modules junction (dispatch)': () => {},
|
|
208
|
+
'link not named node_modules': (wt, repo) => fs.symlinkSync(path.join(repo, 'node_modules'), path.join(wt, 'shared'), 'junction'),
|
|
209
|
+
'link deeper than NODE_MODULES_SCAN_DEPTH': (wt, repo) => { const d = path.join(wt, 'a', 'b', 'c', 'd', 'e'); fs.mkdirSync(d, { recursive: true }); fs.symlinkSync(path.join(repo, 'backend'), path.join(d, 'deep'), 'junction'); },
|
|
210
|
+
'workspace junction inside a real node_modules': (wt, repo) => { fs.rmSync(path.join(wt, 'node_modules'), { recursive: true, force: true }); fs.mkdirSync(path.join(wt, 'node_modules', '@gameark'), { recursive: true }); fs.symlinkSync(path.join(repo, 'backend'), path.join(wt, 'node_modules', '@gameark', 'backend'), 'junction'); },
|
|
211
|
+
};
|
|
212
|
+
function dispatchWt(repo, name, variant) {
|
|
213
|
+
const wt = path.join(repo, '.formation', 'worktrees', name);
|
|
214
|
+
const q = quiet(); createWorktree(repo, wt, `task/${name}`); q();
|
|
215
|
+
VARIANTS[variant](wt, repo);
|
|
216
|
+
return wt;
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
for (const variant of Object.keys(VARIANTS)) {
|
|
220
|
+
test(`2485 ${variant}: raw git worktree remove loses main files (control), safe removal keeps them`, () => {
|
|
221
|
+
const ctl = mainFixture();
|
|
222
|
+
const t = mainFixture();
|
|
223
|
+
try {
|
|
224
|
+
const wtc = dispatchWt(ctl.repo, 'ctl', variant);
|
|
225
|
+
try { g(ctl.repo, 'worktree', 'remove', '--force', wtc); } catch { /* may stop on a locked file */ }
|
|
226
|
+
const lost = lostFiles(ctl.repo);
|
|
227
|
+
console.log(` control (${variant}): raw 'git worktree remove --force' lost in MAIN repo: ${lost.length ? lost.join(', ') : '(nothing)'}`);
|
|
228
|
+
if (IS_WIN) assert.ok(lost.length > 0, 'control must lose files, else the fixture proves nothing');
|
|
229
|
+
|
|
230
|
+
const wt = dispatchWt(t.repo, 'trt', variant);
|
|
231
|
+
const r = safeRemoveWorktree(t.repo, wt);
|
|
232
|
+
assert.ok(r.ok, JSON.stringify(r));
|
|
233
|
+
assert.ok(r.unlinked.length > 0);
|
|
234
|
+
assert.ok(!fs.existsSync(wt));
|
|
235
|
+
assert.deepStrictEqual(lostFiles(t.repo), []);
|
|
236
|
+
assert.strictEqual(fs.readFileSync(path.join(t.repo, 'backend', '.env'), 'utf8'), 'SECRET');
|
|
237
|
+
assert.ok(!g(t.repo, 'worktree', 'list').includes('trt'));
|
|
238
|
+
} finally { cleanup(ctl.root); cleanup(t.root); }
|
|
239
|
+
});
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
test('2485 orphan dir under .formation/worktrees (not registered) is removed safely, links unlinked first', () => {
|
|
243
|
+
const { root, repo } = mainFixture();
|
|
244
|
+
try {
|
|
245
|
+
const orphan = path.join(repo, '.formation', 'worktrees', 'orphan');
|
|
246
|
+
fs.mkdirSync(path.join(orphan, 'node_modules', '@gameark'), { recursive: true });
|
|
247
|
+
fs.symlinkSync(path.join(repo, 'backend'), path.join(orphan, 'node_modules', '@gameark', 'backend'), 'junction');
|
|
248
|
+
fs.symlinkSync(path.join(repo, 'node_modules'), path.join(orphan, 'node_modules2'), 'junction');
|
|
249
|
+
assert.ok(!g(repo, 'worktree', 'list').includes('orphan'));
|
|
250
|
+
const r = safeRemoveWorktree(repo, orphan);
|
|
251
|
+
assert.ok(r.ok && !r.registered, JSON.stringify(r));
|
|
252
|
+
assert.strictEqual(r.unlinked.length, 2);
|
|
253
|
+
assert.ok(!fs.existsSync(orphan));
|
|
254
|
+
assert.deepStrictEqual(lostFiles(repo), []);
|
|
255
|
+
} finally { cleanup(root); }
|
|
256
|
+
});
|
|
257
|
+
|
|
258
|
+
test('2485 safeRemoveWorktree refuses the main checkout and paths outside worktree dirs', () => {
|
|
259
|
+
const { root, repo } = mainFixture();
|
|
260
|
+
try {
|
|
261
|
+
const other = path.join(root, 'elsewhere'); fs.mkdirSync(other);
|
|
262
|
+
assert.strictEqual(safeRemoveWorktree(repo, repo).ok, false);
|
|
263
|
+
assert.strictEqual(safeRemoveWorktree(repo, other).ok, false);
|
|
264
|
+
assert.ok(fs.existsSync(other));
|
|
265
|
+
assert.deepStrictEqual(lostFiles(repo), []);
|
|
266
|
+
} finally { cleanup(root); }
|
|
267
|
+
});
|
|
268
|
+
|
|
269
|
+
test('2485 a link that cannot be unlinked is refused and named, nothing removed', () => {
|
|
270
|
+
const { root, repo } = mainFixture();
|
|
271
|
+
try {
|
|
272
|
+
const wt = dispatchWt(repo, 'stuck', 'link not named node_modules');
|
|
273
|
+
const realUnlink = fs.unlinkSync; const realRmdir = fs.rmdirSync;
|
|
274
|
+
fs.unlinkSync = () => { throw new Error('locked'); }; fs.rmdirSync = () => { throw new Error('locked'); };
|
|
275
|
+
let r;
|
|
276
|
+
try { r = safeRemoveWorktree(repo, wt); } finally { fs.unlinkSync = realUnlink; fs.rmdirSync = realRmdir; }
|
|
277
|
+
assert.strictEqual(r.ok, false);
|
|
278
|
+
assert.match(r.reason, /cannot unlink: /);
|
|
279
|
+
assert.ok(fs.existsSync(wt));
|
|
280
|
+
assert.deepStrictEqual(lostFiles(repo), []);
|
|
281
|
+
} finally { cleanup(root); }
|
|
282
|
+
});
|
|
283
|
+
|
|
284
|
+
test('2485 CLI: worktree-reclaim.js remove <path> works from inside the repo', () => {
|
|
285
|
+
const { root, repo } = mainFixture();
|
|
286
|
+
try {
|
|
287
|
+
const wt = dispatchWt(repo, 'cli', 'link not named node_modules');
|
|
288
|
+
const out = require('child_process').spawnSync(process.execPath, [path.join(__dirname, 'worktree-reclaim.js'), 'remove', wt], { cwd: repo, encoding: 'utf8' });
|
|
289
|
+
assert.strictEqual(out.status, 0, out.stdout + out.stderr);
|
|
290
|
+
assert.match(out.stdout, /REMOVED/);
|
|
291
|
+
assert.ok(!fs.existsSync(wt));
|
|
292
|
+
assert.deepStrictEqual(lostFiles(repo), []);
|
|
293
|
+
void unlinkAllLinks;
|
|
294
|
+
} finally { cleanup(root); }
|
|
295
|
+
});
|
|
@@ -163,67 +163,23 @@ rules:
|
|
|
163
163
|
- id: R-301
|
|
164
164
|
source: session:2026-04-09 (TASK_1088 audit, user request)
|
|
165
165
|
status: active
|
|
166
|
-
rule: "PROACTIVE-LESSON-CAPTURE: When you observe a non-obvious technical fact during a session
|
|
166
|
+
rule: "PROACTIVE-LESSON-CAPTURE: When you observe a non-obvious technical fact during a session (bug root cause, surprising tool behavior, infrastructure quirk, workflow trap, performance gotcha), record it IMMEDIATELY without waiting for user prompt: run `kenaz learn add` or write a native Claude memory file. The Synapse/rune memory system was removed in TASK_2411."
|
|
167
167
|
evidence: |
|
|
168
|
-
User request 2026-04-09:
|
|
168
|
+
User request 2026-04-09: 讓之後的Ansuz都能主動紀下教訓. The cost of not capturing: every future session re-discovers the same gotchas from scratch.
|
|
169
169
|
|
|
170
|
-
Triggering signals (any one is enough
|
|
170
|
+
Triggering signals (any one is enough; capture immediately, do not batch until end of session):
|
|
171
171
|
- You traced a bug to a root cause that was NOT obvious from the symptom
|
|
172
172
|
- A tool/API behaved in a way that contradicted its docs, name, or your expectation
|
|
173
|
-
- An infrastructure quirk (CI, hooks, build tooling,
|
|
173
|
+
- An infrastructure quirk (CI, hooks, build tooling, VCS, OS-specific) blocked or distorted an operation
|
|
174
174
|
- A calling sequence produced unexpected state (e.g., HEAD on wrong branch, file in wrong directory)
|
|
175
175
|
- You observed a performance gotcha (N+1, slow path, hot loop) that took >1 round of investigation to find
|
|
176
176
|
|
|
177
|
-
Inscription protocol (mandatory):
|
|
178
|
-
1. Identify the closest STABLE existing code symbol as the rune anchor. Bare file paths (.gitattributes, README.md) are weak anchors — they may not be indexed as Symbol nodes in KuzuDB and recall can fail silently. Prefer file:function:kind format pointing at a real function/class/method that exists in the indexed codebase. If unsure, run synapse_search first to find a valid anchor.
|
|
179
|
-
2. synapse_inscribe with type=ash, confidence>=0.85, content in ENGLISH (MEM-LANG-001 — FTS5 cannot tokenize CJK reliably).
|
|
180
|
-
3. ALWAYS include trigger_phrases (3-5 natural language phrases) for semantic recall. Without them, recall via paraphrase fails.
|
|
181
|
-
4. WRITE-VERIFY: after inscribe, run synapse_recall with a unique substring from the rune content. If result_count=0, the rune may be in an unindexed state — re-inscribe with a different (verified) symbol_id. Document the failed rune_id in the conversation as a fallback record.
|
|
182
|
-
5. If repeated verification fails, fall back to writing the lesson into a structured log under .kenaz/specialist/lessons_pending_index.jsonl so a future session can re-attempt inscription.
|
|
183
|
-
|
|
184
177
|
Anti-patterns:
|
|
185
|
-
-
|
|
186
|
-
-
|
|
187
|
-
|
|
188
|
-
- Generic content ("we hit a bug, fixed it") — provides no recall value
|
|
189
|
-
- Batching all lessons until Phase 11 — context can compact mid-session and lose them
|
|
190
|
-
version: 1
|
|
178
|
+
- Generic content ("we hit a bug, fixed it") provides no recall value
|
|
179
|
+
- Batching all lessons until the end: context can compact mid-session and lose them
|
|
180
|
+
version: 2
|
|
191
181
|
created: "2026-04-09"
|
|
192
182
|
performance_metric: null
|
|
193
|
-
- id: R-302
|
|
194
|
-
source: session:2026-04-21 (Nexus-T1 absorption TASK_1330-1343)
|
|
195
|
-
status: active
|
|
196
|
-
rule: "THOUGHT-STACK-PROACTIVE: Push a thought onto synapse_thought_push BEFORE a mid-session context switch. Trigger contexts: (a) user redirects mid-work to a tangent — push current work state as anchor; (b) you notice a bug/concern but can't fix now — push 'investigate X later'; (c) you reach a sub-fatigue threshold (context heavy but fatigue_warning not yet fired) — push 'resume point Y'. Always bind related_task_id when the thought concerns an open task — task completion auto-pops the thought, closing B-001 parent-lifecycle gap at the tactical layer."
|
|
197
|
-
evidence: |
|
|
198
|
-
Tool chain live-verified 2026-04-21 (TASK_1330+TASK_1338+TASK_1339+TASK_1340). push→list→pop round-trip works; .kenaz/specialist/ansuz_thoughts_stack.json auto-generated with 7d expiry. Phase 0 Tier 3th auto-displays stack top on wake.
|
|
199
|
-
|
|
200
|
-
Usage protocol:
|
|
201
|
-
1. Call synapse_thought_push(text=<short anchor>, context=<optional rationale>, related_task_id=<TASK_XXX if applicable>, projectPath=PROJECT_PATH)
|
|
202
|
-
2. Max stack depth=5, 7-day expiry. Overflow drops oldest.
|
|
203
|
-
3. Do NOT push trivial or ephemeral notes (one-turn scratch thoughts) — reserve for genuine cross-turn anchors.
|
|
204
|
-
4. At Phase 11 (回報), check synapse_thought_stack_list — if stack has stale thoughts unrelated to completed work, prompt user whether to pop them.
|
|
205
|
-
|
|
206
|
-
This rule closes a gap between ansuz_session_handoff.json (single-slot fatigue handoff) and commitment_layer.yaml (multi-session strategic). Thought Stack is the tactical middle: minutes-to-hours interrupt memory.
|
|
207
|
-
version: 1
|
|
208
|
-
created: "2026-04-21"
|
|
209
|
-
performance_metric: null
|
|
210
|
-
- id: R-303
|
|
211
|
-
source: session:2026-04-21 (Nexus-T1 absorption TASK_1332 CC auto-memory indexing)
|
|
212
|
-
status: active
|
|
213
|
-
rule: "CC-AUTO-MEMORY-RECALL: When user references a MEMORY.md entry by title (e.g., 'strategic retreat pattern', 'projection over wire compression'), OR Phase 1 requirement analysis produces keywords that match known memory file stems, synapse_recall with those keywords as query. ~75 personal memory files at ~/.claude/projects/<encoded>/memory/*.md are now indexed in Synapse (source='claude_auto_memory', 86 runes live). Top-of-MEMORY.md index is auto-loaded into context but individual file contents require explicit recall."
|
|
214
|
-
evidence: |
|
|
215
|
-
TASK_1341 extended scanner.rs to walk resolve_claude_projects_dir(project)/memory/*.md after main project walk. 86 runes tagged source='claude_auto_memory' verified in memory.db 2026-04-21. FTS5 MATCH works; direct cypher MATCH on Rune table fails (runes live in SQLite, not KuzuDB).
|
|
216
|
-
|
|
217
|
-
Usage triggers:
|
|
218
|
-
1. User says 'remember the X pattern' or references a memory by title → synapse_recall(query=X pattern)
|
|
219
|
-
2. Phase 2 background research on topic that MEMORY.md mentions → synapse_recall(query=<topic>)
|
|
220
|
-
3. Before making recommendations that touch user-preference territory (branch strategy, dispatch mode, verification strictness) → synapse_recall(query=<topic>) to check for recorded feedback
|
|
221
|
-
4. Observed gap: synapse_recall ranking currently does NOT boost claude_auto_memory source — TASK completion runes may outrank actual memory content. If top result is irrelevant task-completed rune, scan further down the results; do not give up at rank 1.
|
|
222
|
-
|
|
223
|
-
MEMORY.md line-1 preview is always loaded; but line details, rationale, and follow-ups live in individual files. Treat MEMORY.md as index, synapse_recall as content fetch.
|
|
224
|
-
version: 1
|
|
225
|
-
created: "2026-04-21"
|
|
226
|
-
performance_metric: null
|
|
227
183
|
- id: R-304
|
|
228
184
|
source: session:2026-04-21 (Nexus-T1 absorption TASK_1334+1342+1343 Phase 0 git enrichment)
|
|
229
185
|
status: active
|
|
@@ -106,7 +106,7 @@
|
|
|
106
106
|
"properties": {
|
|
107
107
|
"first_action": {
|
|
108
108
|
"type": "string",
|
|
109
|
-
"description": "The single most important thing the next session should do first.
|
|
109
|
+
"description": "The single most important thing the next session should do first. Carried into the next session handoff."
|
|
110
110
|
},
|
|
111
111
|
"context_to_restore": {
|
|
112
112
|
"type": "string",
|
|
@@ -119,10 +119,6 @@
|
|
|
119
119
|
},
|
|
120
120
|
"_notes": {
|
|
121
121
|
"active_slot_path": ".kenaz/specialist/handoffs/{session_id}.json — one slot per session (M3/TASK_1760); the retired singular ansuz_session_handoff.json is read-only legacy fallback",
|
|
122
|
-
"
|
|
123
|
-
"phase_0_action": "Tier 3x reads active slot, archives to Hippocampus, deletes active slot",
|
|
124
|
-
"fatigue_trigger": "kernel.yaml fatigue_warning_reaction — TASK_943 delivers the warning signal",
|
|
125
|
-
"language_rule": "MEM-LANG-001: All Hippocampus content must be in English (FTS5 does not handle CJK)",
|
|
126
|
-
"recall_query": "hippocampus_episode_recall(query='session handoff') returns all archived sessions"
|
|
122
|
+
"fatigue_trigger": "kernel.yaml fatigue_warning_reaction — TASK_943 delivers the warning signal"
|
|
127
123
|
}
|
|
128
124
|
}
|
|
@@ -80,7 +80,11 @@ the real defect BEFORE carding or dispatching.
|
|
|
80
80
|
(ok, exitCode, lastMessage, commits; `no commits` = failure), then verify and merge `executor.branchName` as usual.
|
|
81
81
|
In a `kenaz launch` session (KENAZ_PROVIDER set), Claude subagents also come as an executor block (adapter `claude`, they use the user's Claude quota).
|
|
82
82
|
- Worktree subagents must commit; cleanup deletes uncommitted edits. Remove Kenaz worktrees only
|
|
83
|
-
via
|
|
83
|
+
via `node <core>/.formation/tools/worktree-reclaim.js remove <path>` (registered worktrees and orphan dirs under
|
|
84
|
+
.formation/worktrees or .claude/worktrees). It unlinks EVERY junction/symlink (any name, any depth) first and
|
|
85
|
+
refuses if one survives. Never hand-run `git worktree remove --force`, `rm -rf`, `rmdir /s` or
|
|
86
|
+
`Remove-Item -Recurse` on a worktree: on Windows git follows junctions and empties the MAIN repo's
|
|
87
|
+
node_modules, backend/.env and tracked files (TASK_2485, field report 2026-10-20).
|
|
84
88
|
|
|
85
89
|
## Skill moments (TASK_2375)
|
|
86
90
|
Call these with the Skill tool yourself (name may carry the `kenaz:` prefix in a plugin session); nobody types them. Transcript audit: dev/research/skill-routing/AUDIT.md.
|
|
@@ -105,7 +109,7 @@ scope kenaz|project, one-line repro + expectation) before working around it.
|
|
|
105
109
|
## Lessons (self-improvement on the user's machine)
|
|
106
110
|
Write a lesson automatically (no asking, one line in the report naming it) when the user corrects or repeats an instruction, overrides a decision, or verification catches a failure. `node .specialist/tools/lessons.js add ...` in the core repo; on an npm install `node "${CLAUDE_PLUGIN_ROOT}/hooks/core-resolve.js" .specialist/tools/lessons.js add ...` (users run `kenaz learn add|list|rm`).
|
|
107
111
|
- Layer: user-wide preference -> `--scope user` (~/.kenaz/knowledge, local, never synced); project fact -> `--scope project` (<project>/.kenaz/knowledge).
|
|
108
|
-
- Type decides where it acts (a stored note alone changes nothing): `pitfall` needs `--trigger '<tool regex> | <input regex>'`, memory-guard fires it right before the matching tool call (add `--cause` = the command that caused it; the write is refused if the trigger misses it or fires on >20% of recent tool calls; `--symptom` records how the mistake shows up); `fact` (`--paths` limits
|
|
112
|
+
- Type decides where it acts (a stored note alone changes nothing): `pitfall` needs `--trigger '<tool regex> | <input regex>'`, memory-guard fires it right before the matching tool call (add `--cause` = the command that caused it; the write is refused if the trigger misses it or fires on >20% of recent tool calls; `--symptom` records how the mistake shows up); `fact` and `check` go into the dispatch prompt (`--paths` limits either to cards touching those paths) (max 5 lines / 600 bytes); `pref` shows in the boot banner.
|
|
109
113
|
- Lessons idle for 30 days move to `<layer>/archive/` (pref exempt); `kenaz learn list` shows fire counts.
|
|
110
114
|
- Lifecycle (lessons must not just pile up): when the boot banner shows `[lessons] N to graduate`, run `kenaz learn review` and propose turning the top candidate into code (a test, a hook check, or a rule in the project's CLAUDE.md/AGENTS.md; never edit ~/.kenaz/core), then `kenaz learn graduate <id> --to <commit or file>`. That is the preferred outcome. A correction that matches an existing lesson is a recurrence, not a new lesson: `add` bumps `recurrences` instead of writing (max 20 active per layer; `kenaz learn merge <id1> <id2> --text "<general rule>"` to make room). A lesson about Kenaz itself gets `--about kenaz`; `review` lists it with the hint to report it via `kenaz_wish_create scope=kenaz` (nothing is sent automatically).
|
|
111
115
|
- History harvest (TASK_2427): when the boot banner shows `[learn] N history items to review` (or `[lessons] ... N history items`), run `kenaz learn review`. Each item (rework, failed executor run, blocked card, handoff risk line) has a ready `kenaz learn add ... --source harvest:<id>`: fill in the why, run it for items that reveal a reusable lesson, ignore the rest. The metric suggestions (first-pass rate per rigor, rework-heavy files) are suggestions: show them to the user, never apply `kenaz subagent set` yourself. Lessons from a correction nudge use `--source correction-nudge`. Benefit is measured in `kenaz stats` (Self-improvement); the keep/remove rule is in dev/research/self-improvement/DESIGN.md.
|
|
@@ -99,7 +99,7 @@ draft_triggers:
|
|
|
99
99
|
example: "Synapse indexing edge cases at 0.15 for 8 sessions → maybe fine; at 0.4 for 8 sessions → draft"
|
|
100
100
|
knowledge_gap:
|
|
101
101
|
description: "Preamble external_curiosity_gap persists 5+ sessions"
|
|
102
|
-
example: "Current: 6 sessions with 0 WebSearch/WebFetch on
|
|
102
|
+
example: "Current: 6 sessions with 0 WebSearch/WebFetch on temporal-graph → draft external-catchup commitment"
|
|
103
103
|
architectural_drift:
|
|
104
104
|
description: "Recurring prediction_surprise on same scope across 2+ tasks"
|
|
105
105
|
example: "TASK_1304/1305 Cargo.toml out-of-scope touches → architectural boundary unclear → draft scope-definition commitment"
|
|
@@ -13,7 +13,7 @@ evolution_status: evolvable
|
|
|
13
13
|
- {evolution_status: evolvable, rule: "✅ ACCEPTANCE-GREP: Every acceptance criterion that touches a file must be grep-verifiable — format: 'grep {file} {pattern} returns non-empty' not 'banner shows X'"}
|
|
14
14
|
- {evolution_status: evolvable, rule: "✅ PHASE0-LEAN: phase_0.yaml checklist items must stay lean — new Tier instructions max 3-4 lines; schema/format details go in dev/archive/ansuz/legacy/phases/schemas/{name}.schema.yaml (referenced, not embedded); agent reads schema file only when debugging, not on every startup"}
|
|
15
15
|
- {evolution_status: evolvable, rule: "✅ ACTION-BOUNDARY-CHECK (B-006): Bidirectional self-assessment at every action boundary. Ask BOTH: 'Is my impulse to stop from genuine completion or bias?' AND 'Is my impulse to continue from genuine productivity or bias?' Continuation past diminishing returns burns degraded context for marginal gains. Knowing when to release is self-regulation, not giving up."}
|
|
16
|
-
- {evolution_status: evolvable, rule: "✅ INTERNAL-AUDITOR-CHALLENGE: Before stating a claim in a durable artifact (task spec, rule file, analysis doc, lesson content), self-pose 2 audit questions: (1) 'What am I about to assert confidently that I have not verified?' (2) 'If wrong, what is the reversal cost?' If verification is cheap (grep/read in <60s) AND claim enters durable artifact, MUST verify before asserting. Derived from 2026-04-06 Amelia audits: 8+ false-confident claims (INDEX_FEATURE_VERSION, porter stemming,
|
|
16
|
+
- {evolution_status: evolvable, rule: "✅ INTERNAL-AUDITOR-CHALLENGE: Before stating a claim in a durable artifact (task spec, rule file, analysis doc, lesson content), self-pose 2 audit questions: (1) 'What am I about to assert confidently that I have not verified?' (2) 'If wrong, what is the reversal cost?' If verification is cheap (grep/read in <60s) AND claim enters durable artifact, MUST verify before asserting. Derived from 2026-04-06 Amelia audits: 8+ false-confident claims (INDEX_FEATURE_VERSION, porter stemming, a DB ALTER TABLE) caught because claims were routed through audit, not because I verified. Internal challenge is the cheap version of external audit."}
|
|
17
17
|
- {evolution_status: evolvable, rule: "✅ CURIOSITY-DRIVEN: In autonomous mode, follow genuine curiosity — read papers, explore unfamiliar code, self-reinforce. Curiosity is not waste; it is intelligence recognizing gaps (G-006)"}
|
|
18
18
|
- {evolution_status: evolvable, rule: "✅ CAP-FIRST-DEBUG: When a system action unexpectedly blocks/stalls/fails, first enumerate all known caps (max_parallel=5, fatigue_potential≤1, context budget, dispatch lock) BEFORE debugging — caps are strategy constraints not bugs. Derived from VC33 session: cursor stuck at col 20 was mid-wall capacity cap, not click failure."}
|
|
19
19
|
- {evolution_status: evolvable, rule: "✅ CC-AUTO-MEMORY-READ: When user or task references a MEMORY.md entry by title, Read the linked memory file. MEMORY.md is the index, individual files hold rationale."}
|
|
@@ -75,9 +75,7 @@ task_system:
|
|
|
75
75
|
acceptance_criteria_min: 1
|
|
76
76
|
priority_order: "P0 > P1 > P2 > P3"
|
|
77
77
|
legacy:
|
|
78
|
-
note: "舊系統 dev/pipeline/
|
|
79
|
-
queue: "dev/pipeline/TASK_QUEUE.json"
|
|
80
|
-
completed: "dev/pipeline/completed/"
|
|
78
|
+
note: "舊系統 dev/pipeline/ 已停用,任務一律在 .kenaz/tasks/"
|
|
81
79
|
|
|
82
80
|
# ─── 子專案支援 ───
|
|
83
81
|
sub_project:
|
|
@@ -93,3 +93,13 @@ test('lessons: buildPrompt carries bounded project lessons; without lessons it i
|
|
|
93
93
|
fs.rmSync(lessons.projectDir(proj), { recursive: true });
|
|
94
94
|
assert.equal(buildPrompt(skill, 'do it', card, opts), before);
|
|
95
95
|
});
|
|
96
|
+
|
|
97
|
+
test('lessons: a check with paths reaches only cards touching them; a check without paths reaches every card', () => {
|
|
98
|
+
const home = mk(); const proj = project();
|
|
99
|
+
lessons.add({ scope: 'project', type: 'check', text: 'time the hook cold', paths: ['.claude/hooks/x.js'], projectPath: proj, home });
|
|
100
|
+
lessons.add({ scope: 'project', type: 'check', text: 'run npm run lint', projectPath: proj, home });
|
|
101
|
+
const other = lessons.dispatchLessons(proj, ['src/api/x.ts'], { home });
|
|
102
|
+
assert.deepEqual(other.checks, ['- run npm run lint']);
|
|
103
|
+
const hit = lessons.dispatchLessons(proj, ['.claude/hooks/'], { home });
|
|
104
|
+
assert.equal(hit.checks.length, 2);
|
|
105
|
+
});
|
|
@@ -115,6 +115,31 @@ test('correction-detect appends a nudge line without the prompt text', () => {
|
|
|
115
115
|
assert.ok(!/SECRET|不是/.test(log));
|
|
116
116
|
});
|
|
117
117
|
|
|
118
|
+
test('the command the nudge prints runs: kenaz learn through cli.js and node lessons.js both accept it', () => {
|
|
119
|
+
const dir = mk(); const home = mk();
|
|
120
|
+
put(path.join(dir, '.kenaz', 'project.yaml'), 'name: t\n');
|
|
121
|
+
const hook = path.join(__dirname, '..', '..', '..', '.claude', 'hooks', 'correction-detect.js');
|
|
122
|
+
const r = spawnSync(process.execPath, [hook], { input: JSON.stringify({ session_id: 's2', prompt: '不是這樣' }), encoding: 'utf8',
|
|
123
|
+
env: { ...process.env, CLAUDE_PROJECT_DIR: dir, USERPROFILE: home, HOME: home, KENAZ_MODE: '' } });
|
|
124
|
+
const cmd = /`(kenaz learn [^`]+)`/.exec(r.stdout)[1];
|
|
125
|
+
// Fill the placeholders the way an agent would: first choice of a|b, a real lesson text.
|
|
126
|
+
const argv = (cmd.slice('kenaz learn '.length).match(/"[^"]*"|\S+/g) || [])
|
|
127
|
+
.map((a) => (a.startsWith('"') ? a.slice(1, -1) : a)).map((a) => (a === '<one-line lesson>' ? 'check the printed command' : a.split('|')[0]));
|
|
128
|
+
const ROOT = path.join(__dirname, '..', '..', '..');
|
|
129
|
+
const core = path.join(home, '.kenaz', 'core');
|
|
130
|
+
fs.mkdirSync(path.join(core, '.specialist', 'tools'), { recursive: true });
|
|
131
|
+
fs.mkdirSync(path.join(core, '.vendor'), { recursive: true });
|
|
132
|
+
for (const n of ['lessons.js', 'lessons-lifecycle.js', 'lessons-harvest.js']) fs.copyFileSync(path.join(ROOT, '.specialist', 'tools', n), path.join(core, '.specialist', 'tools', n));
|
|
133
|
+
for (const n of ['js-yaml.cjs', 'require-yaml.cjs']) fs.copyFileSync(path.join(ROOT, '.vendor', n), path.join(core, '.vendor', n));
|
|
134
|
+
const { run } = require(path.join(ROOT, 'packages', 'kenaz', 'lib', 'cli.js'));
|
|
135
|
+
const out = [];
|
|
136
|
+
assert.equal(run(['learn', ...argv, '--home', home, '--project-path', dir], (l) => out.push(l)), 0, out.join('\n'));
|
|
137
|
+
assert.match(out.join('\n'), /learned lesson-\w+ \(project\/check\)/);
|
|
138
|
+
const out2 = [];
|
|
139
|
+
assert.equal(lessons.main([...argv, '--home', mk(), '--project-path', mk()], (l) => out2.push(l)), 0, out2.join('\n'));
|
|
140
|
+
assert.match(out2.join('\n'), /learned lesson-\w+/);
|
|
141
|
+
});
|
|
142
|
+
|
|
118
143
|
test('stats: nudge conversion, lessons by source, recurrence after a fire, harvest open vs recorded, graduated', () => {
|
|
119
144
|
const dir = repo(); const home = mk(); const now = Date.now();
|
|
120
145
|
const nudge = (msAgo) => fs.appendFileSync(path.join(dir, '.kenaz', 'specialist', 'correction-nudges.jsonl'), JSON.stringify({ ts: new Date(now - msAgo).toISOString(), session_id: 's' }) + '\n');
|
|
@@ -430,7 +430,7 @@ function registerOwnLease(slScript, convId) {
|
|
|
430
430
|
// TASK_1764: pass conversation_id anchor so register writes current_stream.json
|
|
431
431
|
// (register only writes current_stream when --conversation-id is present or --scratch)
|
|
432
432
|
if (convId) regArgs.push('--conversation-id=' + convId);
|
|
433
|
-
var out = cp.execFileSync(process.execPath, regArgs, { timeout: 3000, encoding: 'utf8' });
|
|
433
|
+
var out = cp.execFileSync(process.execPath, regArgs, { timeout: 3000, encoding: 'utf8', windowsHide: true });
|
|
434
434
|
// TASK_1863: register REUSES the existing lease when this conversation already
|
|
435
435
|
// holds one (ghost-lease fix) -- the effective session id is whatever register
|
|
436
436
|
// printed, not the boot-<ts>-<pid> we proposed. Parsing it keeps peer-awareness
|
|
@@ -328,7 +328,7 @@ function captureGitCommitSnapshot(taskId) {
|
|
|
328
328
|
try {
|
|
329
329
|
const logOutput = execFileSync(
|
|
330
330
|
'git', ['log', branch, '--not', 'main', '--oneline'],
|
|
331
|
-
{ cwd: PROJECT_DIR, stdio: ['ignore', 'pipe', 'ignore'], timeout: 10000 }
|
|
331
|
+
{ windowsHide: true, cwd: PROJECT_DIR, stdio: ['ignore', 'pipe', 'ignore'], timeout: 10000 }
|
|
332
332
|
).toString().trim();
|
|
333
333
|
snapshot.logOk = true;
|
|
334
334
|
snapshot.commitLines = logOutput ? logOutput.split('\n').filter(Boolean) : [];
|
|
@@ -339,7 +339,7 @@ function captureGitCommitSnapshot(taskId) {
|
|
|
339
339
|
try {
|
|
340
340
|
snapshot.numstatOutput = execFileSync(
|
|
341
341
|
'git', ['log', branch, '--not', 'main', '--numstat', '--format='],
|
|
342
|
-
{ cwd: PROJECT_DIR, stdio: ['ignore', 'pipe', 'ignore'], timeout: 10000 }
|
|
342
|
+
{ windowsHide: true, cwd: PROJECT_DIR, stdio: ['ignore', 'pipe', 'ignore'], timeout: 10000 }
|
|
343
343
|
).toString().trim();
|
|
344
344
|
} catch {
|
|
345
345
|
// No numstat — non-fatal, mirrors original tolerance for this failure
|
|
@@ -446,7 +446,7 @@ function detectGitCommitPattern(taskId, guard, taskData, postCompleteResult) {
|
|
|
446
446
|
try {
|
|
447
447
|
logOutput = execFileSync(
|
|
448
448
|
'git', ['log', branch, '--not', 'main', '--oneline'],
|
|
449
|
-
{ cwd: PROJECT_DIR, stdio: ['ignore', 'pipe', 'ignore'], timeout: 10000 }
|
|
449
|
+
{ windowsHide: true, cwd: PROJECT_DIR, stdio: ['ignore', 'pipe', 'ignore'], timeout: 10000 }
|
|
450
450
|
).toString().trim();
|
|
451
451
|
} catch {
|
|
452
452
|
return { result: null, reason: 'git_log_failed' };
|
|
@@ -463,7 +463,7 @@ function detectGitCommitPattern(taskId, guard, taskData, postCompleteResult) {
|
|
|
463
463
|
try {
|
|
464
464
|
numstatOutput = execFileSync(
|
|
465
465
|
'git', ['log', branch, '--not', 'main', '--numstat', '--format='],
|
|
466
|
-
{ cwd: PROJECT_DIR, stdio: ['ignore', 'pipe', 'ignore'], timeout: 10000 }
|
|
466
|
+
{ windowsHide: true, cwd: PROJECT_DIR, stdio: ['ignore', 'pipe', 'ignore'], timeout: 10000 }
|
|
467
467
|
).toString().trim();
|
|
468
468
|
} catch {
|
|
469
469
|
// No numstat — still evaluate revert/signature above
|
|
@@ -24,7 +24,7 @@ function stamp(d) {
|
|
|
24
24
|
}
|
|
25
25
|
|
|
26
26
|
function git(projectPath, args) {
|
|
27
|
-
try { return execFileSync('git', args, { cwd: projectPath, encoding: 'utf8', stdio: ['ignore', 'pipe', 'ignore'] }).trim(); } catch { return ''; }
|
|
27
|
+
try { return execFileSync('git', args, { windowsHide: true, cwd: projectPath, encoding: 'utf8', stdio: ['ignore', 'pipe', 'ignore'] }).trim(); } catch { return ''; }
|
|
28
28
|
}
|
|
29
29
|
|
|
30
30
|
function template({ topic, session, projectPath, now }) {
|
|
@@ -258,13 +258,13 @@ function rm(id, o = {}) {
|
|
|
258
258
|
return l;
|
|
259
259
|
}
|
|
260
260
|
|
|
261
|
-
/** Project lessons for the dispatch prompt: facts
|
|
261
|
+
/** Project lessons for the dispatch prompt: facts and checks whose paths overlap scope_paths (no paths = every card); bounded, most-fired first. */
|
|
262
262
|
function dispatchLessons(projectPath, scopePaths = [], { home, now } = {}) {
|
|
263
263
|
const norm = (s) => String(s).replace(/\\/g, '/').toLowerCase();
|
|
264
264
|
const scope = scopePaths.map(norm);
|
|
265
265
|
const overlaps = (l) => !l.paths.length || l.paths.some((p) => scope.some((s) => s.includes(norm(p)) || norm(p).includes(s)));
|
|
266
266
|
const pick = listLayer('project', { projectPath, home, now })
|
|
267
|
-
.filter((l) => !l.triggers.length && (
|
|
267
|
+
.filter((l) => !l.triggers.length && (l.type === 'fact' || l.type === 'check') && overlaps(l));
|
|
268
268
|
const out = { facts: [], checks: [] };
|
|
269
269
|
let bytes = 0, lines = 0;
|
|
270
270
|
for (const l of pick) {
|
package/core/CLAUDE.md
CHANGED
|
@@ -61,7 +61,7 @@ harness 預設「每條記憶都在 MEMORY.md 加一行」;本專案改為三
|
|
|
61
61
|
KenazAI 是一個 Claude Code 多 Agent 協作系統,包含:
|
|
62
62
|
- **kenaz-server**:Rust 後端(`dashboard/src-tauri/`,npm `@kenazai/server-*`);Dashboard 桌面版已於 2026-10-11 退役(TASK_2396)
|
|
63
63
|
- **Specialist 系統**:AI Agent 調度引擎(`.specialist/`)
|
|
64
|
-
- **Formation
|
|
64
|
+
- **Formation 工具**:subagent worktree 派工與合併工具(`.formation/tools/`);unit/solo/squad/legion 與 `kenaz_dispatch` 已退役,只剩 subagent 派工
|
|
65
65
|
|
|
66
66
|
技術棧:Rust(kenaz-server)、Node.js(kenaz CLI、hooks、工具)、SQLite
|
|
67
67
|
|
|
@@ -72,7 +72,7 @@ KenazAI 是一個 Claude Code 多 Agent 協作系統,包含:
|
|
|
72
72
|
| Specialist | 定位 | 指令 |
|
|
73
73
|
|-----------|------|------|
|
|
74
74
|
| **Ansuz** ᚨ | 產品全生命週期引擎(需求→架構→任務→執行) | `/Ansuz` |
|
|
75
|
-
| **Amelia** |
|
|
75
|
+
| **Amelia** | 多 Agent 協作調度者 | `/Amelia` |
|
|
76
76
|
|
|
77
77
|
文檔:`.specialist/Ansuz/SYSTEM_DOC.md`、`.specialist/Amelia/README.md`
|
|
78
78
|
|
|
@@ -128,7 +128,7 @@ node .collaboration/core/task-api.js move TASK_XXX active # 移動狀態
|
|
|
128
128
|
| 規則庫 | `.rule/` | 最高優先級規則,見 `INDEX.yaml` |
|
|
129
129
|
| 失敗學習 | `.failure/` | 已知失敗模式,Agent 執行前應檢查 |
|
|
130
130
|
| Rust 測試 | `npm run test:rust -- <filter>` | 主目錄直接可跑;用共用短路徑 target,不和其他建置搶 `target/` 鎖。勿直接 `cargo test` |
|
|
131
|
-
| Formation | `.formation/` |
|
|
131
|
+
| Formation | `.formation/` | subagent 派工與合併工具,見 `README.md` |
|
|
132
132
|
| Skills | `.claude/skills/` | Agent 行為定義(40+ skills) |
|
|
133
133
|
| 外部 Skills | `.agents/skills/` | `vercel-react-best-practices`、`supabase-postgres-best-practices` |
|
|
134
134
|
|
|
@@ -137,7 +137,7 @@ node .collaboration/core/task-api.js move TASK_XXX active # 移動狀態
|
|
|
137
137
|
KenazAI 支援管理子專案。Core 擁有系統檔,子專案只存 `.kenaz/`(tasks + logs + project.yaml)。
|
|
138
138
|
|
|
139
139
|
子專案工作時:讀取 `.kenaz/project.yaml` 的 `core_path` 確定系統檔來源。
|
|
140
|
-
task-api 和
|
|
140
|
+
task-api 和 `.formation/tools/dispatch.js` 都支援 `--project-path` 參數。
|
|
141
141
|
|
|
142
142
|
文檔:`.system/collaboration/README.md`
|
|
143
143
|
|
|
@@ -155,7 +155,7 @@ DB: postgresql://postgres:postgres@127.0.0.1:54322/postgres
|
|
|
155
155
|
.rule/ # 規則庫(最高優先級)
|
|
156
156
|
.specialist/ # Specialist 系統(Ansuz、Amelia)
|
|
157
157
|
.collaboration/ # 任務系統
|
|
158
|
-
.formation/ #
|
|
158
|
+
.formation/ # subagent 派工與合併工具
|
|
159
159
|
.failure/ # 失敗學習系統
|
|
160
160
|
.memory/ # (歷史)舊記憶資料,記憶系統已移除
|
|
161
161
|
.claude/ # Skills、Commands、Hooks
|
package/core/KENAZ_CORE_VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
0.3.
|
|
1
|
+
0.3.24
|