@misterhuydo/sentinel 1.5.18 → 1.5.20
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/.cairn/.hint-lock +1 -1
- package/.cairn/session.json +6 -3
- package/package.json +1 -1
- package/python/sentinel/__init__.py +1 -1
- package/python/sentinel/dev_watcher.py +7 -1
- package/python/sentinel/main.py +45 -14
- package/python/sentinel/sentinel_boss.py +1 -0
- package/python/tests/test_config_loader.py +3 -5
package/.cairn/.hint-lock
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
2026-04-
|
|
1
|
+
2026-04-08T16:10:00.639Z
|
package/.cairn/session.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
|
-
"message": "Auto-checkpoint at 2026-04-
|
|
3
|
-
"checkpoint_at": "2026-04-
|
|
2
|
+
"message": "Auto-checkpoint at 2026-04-08T16:14:09.624Z",
|
|
3
|
+
"checkpoint_at": "2026-04-08T16:14:09.729Z",
|
|
4
4
|
"active_files": [
|
|
5
5
|
"J:\\Projects\\Sentinel\\cli\\bin\\sentinel.js",
|
|
6
6
|
"J:\\Projects\\Sentinel\\cli\\lib\\test.js",
|
|
@@ -28,7 +28,10 @@
|
|
|
28
28
|
"[2026-04-08] git-snapshot: .cairn/session.json | 29 ++++-\n .claude/settings.local.json | 47 ++++++-\n cli/.cairn/.hint-lock | 2 +-\n cli/.cairn/minify-map.json | 8 +-\n cli/.cairn/session.json | 37 +++++-\n cli/.cairn/views/62a614_bundle.js | 6 +-\n cli/lib/.cairn/minify-map.json | 6 +\n cli/lib/.cairn/views/fb78ac_upgrade.js | 37 +++++-\n cli/lib/.cairn/views/fc4a1a_add.js | 215 +++++++++++++++++++++++++--------\n cli/package.json | 2 +-\n sentinel/config_loader.py | 1 +\n 11 files changed, 323 insertions(+), 67 deletions(-) | status: M ../.cairn/session.json\n M ../.claude/settings.local.json\n M .cairn/.hint-lock\n M .cairn/minify-map.json\n M .cairn/session.json\n M .cairn/views/62a614_bundle.js\n M lib/.cairn/minify-map.json\n M lib/.cairn/views/fb78ac_upgrade.js\n M lib/.cairn/views/fc4a1a_add.js\n M package.json\n M ../sentinel/config_loader.py\n?? ../.cairn/.cairn-project\n?? ../.cairn/memory/\n?? ../.cairn/minify-map.json\n?? ../.cairn/views/\n?? .cairn/views/23edf4_sentinel_boss.py\n?? .cairn/views/7802b9_cicd_trigger.py\n?? .cairn/views/ac3df4_repo_task_engine.py\n?? lib/.cairn/views/2a85cc_init.js\n?? lib/.cairn/views/e26996_slack-setup.js\n?? ../scripts/fix_ask_codebase_context.py\n?? ../scripts/fix_ask_codebase_stdin.py\n?? ../scripts/fix_chain_slack.py\n?? ../scripts/fix_fstring.py\n?? ../scripts/fix_knowledge_cache.py\n?? ../scripts/fix_knowledge_cache_staleness.py\n?? ../scripts/fix_merge_confirm.py\n?? ../scripts/fix_permission_messages.py\n?? ../scripts/fix_pr_check_head_detect.py\n?? ../scripts/fix_pr_msg_newlines.py\n?? ../scripts/fix_pr_tracking_boss.py\n?? ../scripts/fix_pr_tracking_db.py\n?? ../scripts/fix_pr_tracking_main.py\n?? ../scripts/fix_project_isolation.py\n?? ../scripts/fix_system_prompt.py\n?? ../scripts/fix_two_bugs.py\n?? ../scripts/patch_chain_release.py",
|
|
29
29
|
"[2026-04-08] git-snapshot: .cairn/session.json | 29 ++++-\n .claude/settings.local.json | 47 ++++++-\n cli/.cairn/.hint-lock | 2 +-\n cli/.cairn/minify-map.json | 8 +-\n cli/.cairn/session.json | 38 +++++-\n cli/.cairn/views/62a614_bundle.js | 6 +-\n cli/lib/.cairn/minify-map.json | 6 +\n cli/lib/.cairn/views/fb78ac_upgrade.js | 37 +++++-\n cli/lib/.cairn/views/fc4a1a_add.js | 215 +++++++++++++++++++++++++--------\n cli/package.json | 2 +-\n sentinel/config_loader.py | 42 +++++--\n sentinel/dependency_manager.py | 4 +-\n sentinel/git_manager.py | 22 ++--\n sentinel/main.py | 48 +++++---\n sentinel/repo_task_engine.py | 18 ++-\n sentinel/sentinel_boss.py | 43 ++++---\n sentinel/state_store.py | 37 ++++++\n 17 files changed, 474 insertions(+), 130 deletions(-) | status: M ../.cairn/session.json\n M ../.claude/settings.local.json\n M .cairn/.hint-lock\n M .cairn/minify-map.json\n M .cairn/session.json\n M .cairn/views/62a614_bundle.js\n M lib/.cairn/minify-map.json\n M lib/.cairn/views/fb78ac_upgrade.js\n M lib/.cairn/views/fc4a1a_add.js\n M package.json\n M ../sentinel/config_loader.py\n M ../sentinel/dependency_manager.py\n M ../sentinel/git_manager.py\n M ../sentinel/main.py\n M ../sentinel/repo_task_engine.py\n M ../sentinel/sentinel_boss.py\n M ../sentinel/state_store.py\n?? ../.cairn/.cairn-project\n?? ../.cairn/memory/\n?? ../.cairn/minify-map.json\n?? ../.cairn/views/\n?? .cairn/views/23edf4_sentinel_boss.py\n?? .cairn/views/7802b9_cicd_trigger.py\n?? .cairn/views/ac3df4_repo_task_engine.py\n?? lib/.cairn/views/2a85cc_init.js\n?? lib/.cairn/views/e26996_slack-setup.js\n?? ../scripts/fix_ask_codebase_context.py\n?? ../scripts/fix_ask_codebase_stdin.py\n?? ../scripts/fix_chain_slack.py\n?? ../scripts/fix_fstring.py\n?? ../scripts/fix_knowledge_cache.py\n?? ../scripts/fix_knowledge_cache_staleness.py\n?? ../scripts/fix_merge_confirm.py\n?? ../scripts/fix_permission_messages.py\n?? ../scripts/fix_pr_check_head_detect.py\n?? ../scripts/fix_pr_msg_newlines.py\n?? ../scripts/fix_pr_tracking_boss.py\n?? ../scripts/fix_pr_tracking_db.py\n?? ../scripts/fix_pr_tracking_main.py\n?? ../scripts/fix_project_isolation.py\n?? ../scripts/fix_system_prompt.py\n?? ../scripts/fix_two_bugs.py\n?? ../scripts/patch_chain_release.py",
|
|
30
30
|
"[2026-04-08] git-snapshot: .cairn/session.json | 29 ++++-\n .claude/settings.local.json | 47 ++++++-\n cli/.cairn/.hint-lock | 2 +-\n cli/.cairn/minify-map.json | 8 +-\n cli/.cairn/session.json | 39 +++++-\n cli/.cairn/views/62a614_bundle.js | 6 +-\n cli/lib/.cairn/minify-map.json | 6 +\n cli/lib/.cairn/views/fb78ac_upgrade.js | 37 +++++-\n cli/lib/.cairn/views/fc4a1a_add.js | 215 +++++++++++++++++++++++++--------\n cli/package.json | 2 +-\n sentinel/config_loader.py | 42 +++++--\n sentinel/dependency_manager.py | 4 +-\n sentinel/git_manager.py | 22 ++--\n sentinel/main.py | 48 +++++---\n sentinel/repo_task_engine.py | 18 ++-\n sentinel/sentinel_boss.py | 43 ++++---\n sentinel/state_store.py | 37 ++++++\n 17 files changed, 475 insertions(+), 130 deletions(-) | status: M ../.cairn/session.json\n M ../.claude/settings.local.json\n M .cairn/.hint-lock\n M .cairn/minify-map.json\n M .cairn/session.json\n M .cairn/views/62a614_bundle.js\n M lib/.cairn/minify-map.json\n M lib/.cairn/views/fb78ac_upgrade.js\n M lib/.cairn/views/fc4a1a_add.js\n M package.json\n M ../sentinel/config_loader.py\n M ../sentinel/dependency_manager.py\n M ../sentinel/git_manager.py\n M ../sentinel/main.py\n M ../sentinel/repo_task_engine.py\n M ../sentinel/sentinel_boss.py\n M ../sentinel/state_store.py\n?? ../.cairn/.cairn-project\n?? ../.cairn/memory/\n?? ../.cairn/minify-map.json\n?? ../.cairn/views/\n?? .cairn/views/23edf4_sentinel_boss.py\n?? .cairn/views/7802b9_cicd_trigger.py\n?? .cairn/views/ac3df4_repo_task_engine.py\n?? lib/.cairn/views/2a85cc_init.js\n?? lib/.cairn/views/e26996_slack-setup.js\n?? ../scripts/fix_ask_codebase_context.py\n?? ../scripts/fix_ask_codebase_stdin.py\n?? ../scripts/fix_chain_slack.py\n?? ../scripts/fix_fstring.py\n?? ../scripts/fix_knowledge_cache.py\n?? ../scripts/fix_knowledge_cache_staleness.py\n?? ../scripts/fix_merge_confirm.py\n?? ../scripts/fix_permission_messages.py\n?? ../scripts/fix_pr_check_head_detect.py\n?? ../scripts/fix_pr_msg_newlines.py\n?? ../scripts/fix_pr_tracking_boss.py\n?? ../scripts/fix_pr_tracking_db.py\n?? ../scripts/fix_pr_tracking_main.py\n?? ../scripts/fix_project_isolation.py\n?? ../scripts/fix_system_prompt.py\n?? ../scripts/fix_two_bugs.py\n?? ../scripts/patch_chain_release.py",
|
|
31
|
-
"[2026-04-08] git-snapshot: .cairn/session.json | 29 ++++-\n .claude/settings.local.json | 47 ++++++-\n cli/.cairn/.hint-lock | 2 +-\n cli/.cairn/minify-map.json | 8 +-\n cli/.cairn/session.json | 40 +++++-\n cli/.cairn/views/62a614_bundle.js | 6 +-\n cli/lib/.cairn/minify-map.json | 6 +\n cli/lib/.cairn/views/fb78ac_upgrade.js | 37 +++++-\n cli/lib/.cairn/views/fc4a1a_add.js | 215 +++++++++++++++++++++++++--------\n cli/package.json | 2 +-\n sentinel/config_loader.py | 42 +++++--\n sentinel/dependency_manager.py | 4 +-\n sentinel/git_manager.py | 22 ++--\n sentinel/main.py | 48 +++++---\n sentinel/repo_task_engine.py | 18 ++-\n sentinel/sentinel_boss.py | 43 ++++---\n sentinel/state_store.py | 37 ++++++\n 17 files changed, 476 insertions(+), 130 deletions(-) | status: M ../.cairn/session.json\n M ../.claude/settings.local.json\n M .cairn/.hint-lock\n M .cairn/minify-map.json\n M .cairn/session.json\n M .cairn/views/62a614_bundle.js\n M lib/.cairn/minify-map.json\n M lib/.cairn/views/fb78ac_upgrade.js\n M lib/.cairn/views/fc4a1a_add.js\n M package.json\n M ../sentinel/config_loader.py\n M ../sentinel/dependency_manager.py\n M ../sentinel/git_manager.py\n M ../sentinel/main.py\n M ../sentinel/repo_task_engine.py\n M ../sentinel/sentinel_boss.py\n M ../sentinel/state_store.py\n?? ../.cairn/.cairn-project\n?? ../.cairn/memory/\n?? ../.cairn/minify-map.json\n?? ../.cairn/views/\n?? .cairn/views/23edf4_sentinel_boss.py\n?? .cairn/views/7802b9_cicd_trigger.py\n?? .cairn/views/ac3df4_repo_task_engine.py\n?? lib/.cairn/views/2a85cc_init.js\n?? lib/.cairn/views/e26996_slack-setup.js\n?? ../scripts/fix_ask_codebase_context.py\n?? ../scripts/fix_ask_codebase_stdin.py\n?? ../scripts/fix_chain_slack.py\n?? ../scripts/fix_fstring.py\n?? ../scripts/fix_knowledge_cache.py\n?? ../scripts/fix_knowledge_cache_staleness.py\n?? ../scripts/fix_merge_confirm.py\n?? ../scripts/fix_permission_messages.py\n?? ../scripts/fix_pr_check_head_detect.py\n?? ../scripts/fix_pr_msg_newlines.py\n?? ../scripts/fix_pr_tracking_boss.py\n?? ../scripts/fix_pr_tracking_db.py\n?? ../scripts/fix_pr_tracking_main.py\n?? ../scripts/fix_project_isolation.py\n?? ../scripts/fix_system_prompt.py\n?? ../scripts/fix_two_bugs.py\n?? ../scripts/patch_chain_release.py"
|
|
31
|
+
"[2026-04-08] git-snapshot: .cairn/session.json | 29 ++++-\n .claude/settings.local.json | 47 ++++++-\n cli/.cairn/.hint-lock | 2 +-\n cli/.cairn/minify-map.json | 8 +-\n cli/.cairn/session.json | 40 +++++-\n cli/.cairn/views/62a614_bundle.js | 6 +-\n cli/lib/.cairn/minify-map.json | 6 +\n cli/lib/.cairn/views/fb78ac_upgrade.js | 37 +++++-\n cli/lib/.cairn/views/fc4a1a_add.js | 215 +++++++++++++++++++++++++--------\n cli/package.json | 2 +-\n sentinel/config_loader.py | 42 +++++--\n sentinel/dependency_manager.py | 4 +-\n sentinel/git_manager.py | 22 ++--\n sentinel/main.py | 48 +++++---\n sentinel/repo_task_engine.py | 18 ++-\n sentinel/sentinel_boss.py | 43 ++++---\n sentinel/state_store.py | 37 ++++++\n 17 files changed, 476 insertions(+), 130 deletions(-) | status: M ../.cairn/session.json\n M ../.claude/settings.local.json\n M .cairn/.hint-lock\n M .cairn/minify-map.json\n M .cairn/session.json\n M .cairn/views/62a614_bundle.js\n M lib/.cairn/minify-map.json\n M lib/.cairn/views/fb78ac_upgrade.js\n M lib/.cairn/views/fc4a1a_add.js\n M package.json\n M ../sentinel/config_loader.py\n M ../sentinel/dependency_manager.py\n M ../sentinel/git_manager.py\n M ../sentinel/main.py\n M ../sentinel/repo_task_engine.py\n M ../sentinel/sentinel_boss.py\n M ../sentinel/state_store.py\n?? ../.cairn/.cairn-project\n?? ../.cairn/memory/\n?? ../.cairn/minify-map.json\n?? ../.cairn/views/\n?? .cairn/views/23edf4_sentinel_boss.py\n?? .cairn/views/7802b9_cicd_trigger.py\n?? .cairn/views/ac3df4_repo_task_engine.py\n?? lib/.cairn/views/2a85cc_init.js\n?? lib/.cairn/views/e26996_slack-setup.js\n?? ../scripts/fix_ask_codebase_context.py\n?? ../scripts/fix_ask_codebase_stdin.py\n?? ../scripts/fix_chain_slack.py\n?? ../scripts/fix_fstring.py\n?? ../scripts/fix_knowledge_cache.py\n?? ../scripts/fix_knowledge_cache_staleness.py\n?? ../scripts/fix_merge_confirm.py\n?? ../scripts/fix_permission_messages.py\n?? ../scripts/fix_pr_check_head_detect.py\n?? ../scripts/fix_pr_msg_newlines.py\n?? ../scripts/fix_pr_tracking_boss.py\n?? ../scripts/fix_pr_tracking_db.py\n?? ../scripts/fix_pr_tracking_main.py\n?? ../scripts/fix_project_isolation.py\n?? ../scripts/fix_system_prompt.py\n?? ../scripts/fix_two_bugs.py\n?? ../scripts/patch_chain_release.py",
|
|
32
|
+
"[2026-04-08] git-snapshot: .cairn/session.json | 29 ++++-\n .claude/settings.local.json | 47 ++++++-\n cli/.cairn/.hint-lock | 2 +-\n cli/.cairn/minify-map.json | 8 +-\n cli/.cairn/session.json | 41 ++++++-\n cli/.cairn/views/62a614_bundle.js | 6 +-\n cli/lib/.cairn/minify-map.json | 6 +\n cli/lib/.cairn/views/fb78ac_upgrade.js | 37 +++++-\n cli/lib/.cairn/views/fc4a1a_add.js | 215 +++++++++++++++++++++++++--------\n cli/package.json | 2 +-\n sentinel/config_loader.py | 83 ++++++++++---\n sentinel/dependency_manager.py | 4 +-\n sentinel/git_manager.py | 22 ++--\n sentinel/main.py | 48 +++++---\n sentinel/repo_task_engine.py | 18 ++-\n sentinel/sentinel_boss.py | 43 ++++---\n sentinel/state_store.py | 37 ++++++\n 17 files changed, 517 insertions(+), 131 deletions(-) | status: M ../.cairn/session.json\n M ../.claude/settings.local.json\n M .cairn/.hint-lock\n M .cairn/minify-map.json\n M .cairn/session.json\n M .cairn/views/62a614_bundle.js\n M lib/.cairn/minify-map.json\n M lib/.cairn/views/fb78ac_upgrade.js\n M lib/.cairn/views/fc4a1a_add.js\n M package.json\n M ../sentinel/config_loader.py\n M ../sentinel/dependency_manager.py\n M ../sentinel/git_manager.py\n M ../sentinel/main.py\n M ../sentinel/repo_task_engine.py\n M ../sentinel/sentinel_boss.py\n M ../sentinel/state_store.py\n?? ../.cairn/.cairn-project\n?? ../.cairn/memory/\n?? ../.cairn/minify-map.json\n?? ../.cairn/views/\n?? .cairn/views/23edf4_sentinel_boss.py\n?? .cairn/views/7802b9_cicd_trigger.py\n?? .cairn/views/ac3df4_repo_task_engine.py\n?? lib/.cairn/views/2a85cc_init.js\n?? lib/.cairn/views/e26996_slack-setup.js\n?? ../scripts/fix_ask_codebase_context.py\n?? ../scripts/fix_ask_codebase_stdin.py\n?? ../scripts/fix_chain_slack.py\n?? ../scripts/fix_fstring.py\n?? ../scripts/fix_knowledge_cache.py\n?? ../scripts/fix_knowledge_cache_staleness.py\n?? ../scripts/fix_merge_confirm.py\n?? ../scripts/fix_permission_messages.py\n?? ../scripts/fix_pr_check_head_detect.py\n?? ../scripts/fix_pr_msg_newlines.py\n?? ../scripts/fix_pr_tracking_boss.py\n?? ../scripts/fix_pr_tracking_db.py\n?? ../scripts/fix_pr_tracking_main.py\n?? ../scripts/fix_project_isolation.py\n?? ../scripts/fix_system_prompt.py\n?? ../scripts/fix_two_bugs.py\n?? ../scripts/patch_chain_release.py",
|
|
33
|
+
"[2026-04-08] git-snapshot: .cairn/session.json | 29 ++++-\n .claude/settings.local.json | 47 ++++++-\n cli/.cairn/.hint-lock | 2 +-\n cli/.cairn/minify-map.json | 8 +-\n cli/.cairn/session.json | 42 ++++++-\n cli/.cairn/views/62a614_bundle.js | 6 +-\n cli/lib/.cairn/minify-map.json | 6 +\n cli/lib/.cairn/views/fb78ac_upgrade.js | 37 +++++-\n cli/lib/.cairn/views/fc4a1a_add.js | 215 +++++++++++++++++++++++++--------\n cli/package.json | 2 +-\n sentinel/config_loader.py | 83 ++++++++++---\n sentinel/dependency_manager.py | 4 +-\n sentinel/git_manager.py | 22 ++--\n sentinel/main.py | 48 +++++---\n sentinel/repo_task_engine.py | 18 ++-\n sentinel/sentinel_boss.py | 43 ++++---\n sentinel/state_store.py | 37 ++++++\n 17 files changed, 518 insertions(+), 131 deletions(-) | status: M ../.cairn/session.json\n M ../.claude/settings.local.json\n M .cairn/.hint-lock\n M .cairn/minify-map.json\n M .cairn/session.json\n M .cairn/views/62a614_bundle.js\n M lib/.cairn/minify-map.json\n M lib/.cairn/views/fb78ac_upgrade.js\n M lib/.cairn/views/fc4a1a_add.js\n M package.json\n M ../sentinel/config_loader.py\n M ../sentinel/dependency_manager.py\n M ../sentinel/git_manager.py\n M ../sentinel/main.py\n M ../sentinel/repo_task_engine.py\n M ../sentinel/sentinel_boss.py\n M ../sentinel/state_store.py\n?? ../.cairn/.cairn-project\n?? ../.cairn/memory/\n?? ../.cairn/minify-map.json\n?? ../.cairn/views/\n?? .cairn/views/23edf4_sentinel_boss.py\n?? .cairn/views/7802b9_cicd_trigger.py\n?? .cairn/views/ac3df4_repo_task_engine.py\n?? lib/.cairn/views/2a85cc_init.js\n?? lib/.cairn/views/e26996_slack-setup.js\n?? ../scripts/fix_ask_codebase_context.py\n?? ../scripts/fix_ask_codebase_stdin.py\n?? ../scripts/fix_chain_slack.py\n?? ../scripts/fix_fstring.py\n?? ../scripts/fix_knowledge_cache.py\n?? ../scripts/fix_knowledge_cache_staleness.py\n?? ../scripts/fix_merge_confirm.py\n?? ../scripts/fix_permission_messages.py\n?? ../scripts/fix_pr_check_head_detect.py\n?? ../scripts/fix_pr_msg_newlines.py\n?? ../scripts/fix_pr_tracking_boss.py\n?? ../scripts/fix_pr_tracking_db.py\n?? ../scripts/fix_pr_tracking_main.py\n?? ../scripts/fix_project_isolation.py\n?? ../scripts/fix_system_prompt.py\n?? ../scripts/fix_two_bugs.py\n?? ../scripts/patch_chain_release.py",
|
|
34
|
+
"[2026-04-08] git-snapshot: .cairn/session.json | 29 ++++-\n .claude/settings.local.json | 47 ++++++-\n cli/.cairn/.hint-lock | 2 +-\n cli/.cairn/minify-map.json | 8 +-\n cli/.cairn/session.json | 43 ++++++-\n cli/.cairn/views/62a614_bundle.js | 6 +-\n cli/lib/.cairn/minify-map.json | 6 +\n cli/lib/.cairn/views/fb78ac_upgrade.js | 37 +++++-\n cli/lib/.cairn/views/fc4a1a_add.js | 215 +++++++++++++++++++++++++--------\n cli/package.json | 2 +-\n sentinel/config_loader.py | 83 ++++++++++---\n sentinel/dependency_manager.py | 4 +-\n sentinel/dev_watcher.py | 8 +-\n sentinel/git_manager.py | 22 ++--\n sentinel/main.py | 67 ++++++----\n sentinel/repo_task_engine.py | 18 ++-\n sentinel/sentinel_boss.py | 44 ++++---\n sentinel/state_store.py | 37 ++++++\n tests/test_config_loader.py | 8 +-\n 19 files changed, 540 insertions(+), 146 deletions(-) | status: M ../.cairn/session.json\n M ../.claude/settings.local.json\n M .cairn/.hint-lock\n M .cairn/minify-map.json\n M .cairn/session.json\n M .cairn/views/62a614_bundle.js\n M lib/.cairn/minify-map.json\n M lib/.cairn/views/fb78ac_upgrade.js\n M lib/.cairn/views/fc4a1a_add.js\n M package.json\n M ../sentinel/config_loader.py\n M ../sentinel/dependency_manager.py\n M ../sentinel/dev_watcher.py\n M ../sentinel/git_manager.py\n M ../sentinel/main.py\n M ../sentinel/repo_task_engine.py\n M ../sentinel/sentinel_boss.py\n M ../sentinel/state_store.py\n M ../tests/test_config_loader.py\n?? ../.cairn/.cairn-project\n?? ../.cairn/memory/\n?? ../.cairn/minify-map.json\n?? ../.cairn/views/\n?? .cairn/views/23edf4_sentinel_boss.py\n?? .cairn/views/7802b9_cicd_trigger.py\n?? .cairn/views/ac3df4_repo_task_engine.py\n?? lib/.cairn/views/2a85cc_init.js\n?? lib/.cairn/views/e26996_slack-setup.js\n?? ../scripts/fix_ask_codebase_context.py\n?? ../scripts/fix_ask_codebase_stdin.py\n?? ../scripts/fix_chain_slack.py\n?? ../scripts/fix_fstring.py\n?? ../scripts/fix_knowledge_cache.py\n?? ../scripts/fix_knowledge_cache_staleness.py\n?? ../scripts/fix_merge_confirm.py\n?? ../scripts/fix_permission_messages.py\n?? ../scripts/fix_pr_check_head_detect.py\n?? ../scripts/fix_pr_msg_newlines.py\n?? ../scripts/fix_pr_tracking_boss.py\n?? ../scripts/fix_pr_tracking_db.py\n?? ../scripts/fix_pr_tracking_main.py\n?? ../scripts/fix_project_isolation.py\n?? ../scripts/fix_system_prompt.py\n?? ../scripts/fix_two_bugs.py\n?? ../scripts/patch_chain_release.py"
|
|
32
35
|
],
|
|
33
36
|
"mtime_snapshot": {
|
|
34
37
|
"J:\\Projects\\Sentinel\\cli\\bin\\sentinel.js": 1774252515044.4768,
|
package/package.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
__version__ = "1.5.
|
|
1
|
+
__version__ = "1.5.20"
|
|
@@ -31,7 +31,7 @@ import re
|
|
|
31
31
|
|
|
32
32
|
logger = logging.getLogger(__name__)
|
|
33
33
|
|
|
34
|
-
_META_PREFIXES = ("TYPE:", "SUBMITTED_BY:", "SOURCE:", "SOURCE_FINGERPRINT:", "SUBMITTED_AT:", "NOTIFY:")
|
|
34
|
+
_META_PREFIXES = ("TYPE:", "SUBMITTED_BY:", "SOURCE:", "SOURCE_FINGERPRINT:", "SUBMITTED_AT:", "NOTIFY:", "ORIGIN_CHANNEL:")
|
|
35
35
|
|
|
36
36
|
|
|
37
37
|
@dataclass
|
|
@@ -46,6 +46,7 @@ class DevTask:
|
|
|
46
46
|
submitter_user_id: str = ""
|
|
47
47
|
source_fingerprint: str = "" # error fingerprint if from BOSS_ESCALATE
|
|
48
48
|
notify_user_ids: list = field(default_factory=list) # extra users to ping on completion
|
|
49
|
+
origin_channel: str = "" # Slack channel/DM where the task was submitted
|
|
49
50
|
|
|
50
51
|
def __post_init__(self):
|
|
51
52
|
if not self.fingerprint:
|
|
@@ -91,6 +92,7 @@ def scan_dev_tasks(project_dir: Path) -> list[DevTask]:
|
|
|
91
92
|
task_type = "feature"
|
|
92
93
|
source_fingerprint = ""
|
|
93
94
|
submitter_user_id = ""
|
|
95
|
+
origin_channel = ""
|
|
94
96
|
notify_user_ids: list = []
|
|
95
97
|
body_start = 0
|
|
96
98
|
|
|
@@ -113,6 +115,9 @@ def scan_dev_tasks(project_dir: Path) -> list[DevTask]:
|
|
|
113
115
|
raw_ids = stripped[7:].strip()
|
|
114
116
|
notify_user_ids = [u.strip() for u in raw_ids.split(",") if u.strip()]
|
|
115
117
|
body_start = i + 1
|
|
118
|
+
elif upper.startswith("ORIGIN_CHANNEL:"):
|
|
119
|
+
origin_channel = stripped[15:].strip()
|
|
120
|
+
body_start = i + 1
|
|
116
121
|
elif any(upper.startswith(p) for p in _META_PREFIXES) or not stripped:
|
|
117
122
|
body_start = i + 1
|
|
118
123
|
else:
|
|
@@ -130,6 +135,7 @@ def scan_dev_tasks(project_dir: Path) -> list[DevTask]:
|
|
|
130
135
|
submitter_user_id=submitter_user_id,
|
|
131
136
|
source_fingerprint=source_fingerprint,
|
|
132
137
|
notify_user_ids=notify_user_ids,
|
|
138
|
+
origin_channel=origin_channel,
|
|
133
139
|
))
|
|
134
140
|
logger.info("Found dev task: %s (type=%s)", f.name, task_type)
|
|
135
141
|
|
package/python/sentinel/main.py
CHANGED
|
@@ -1177,16 +1177,17 @@ async def _handle_dev_task(task, cfg_loader: ConfigLoader, store: StateStore):
|
|
|
1177
1177
|
from .notify import slack_alert as _slack_alert, slack_thread_reply as _slack_reply
|
|
1178
1178
|
|
|
1179
1179
|
sentinel = cfg_loader.sentinel
|
|
1180
|
+
_origin_channel = getattr(task, "origin_channel", "") or sentinel.slack_channel
|
|
1180
1181
|
_submitter = task.submitter_user_id
|
|
1181
1182
|
_started_msg = (
|
|
1182
1183
|
f":wrench: Patch working on *<@{_submitter}>*'s request\n_{task.message[:120]}_"
|
|
1183
1184
|
) if _submitter else (
|
|
1184
1185
|
f":wrench: Patch working on dev task\n_{task.message[:120]}_"
|
|
1185
1186
|
)
|
|
1186
|
-
_thread_ts = _slack_alert(sentinel.slack_bot_token,
|
|
1187
|
+
_thread_ts = _slack_alert(sentinel.slack_bot_token, _origin_channel, _started_msg)
|
|
1187
1188
|
|
|
1188
1189
|
def _progress(msg: str) -> None:
|
|
1189
|
-
_slack_reply(sentinel.slack_bot_token,
|
|
1190
|
+
_slack_reply(sentinel.slack_bot_token, _origin_channel, _thread_ts, msg)
|
|
1190
1191
|
|
|
1191
1192
|
_loop = asyncio.get_event_loop()
|
|
1192
1193
|
try:
|
|
@@ -1214,7 +1215,7 @@ async def _handle_dev_task(task, cfg_loader: ConfigLoader, store: StateStore):
|
|
|
1214
1215
|
|
|
1215
1216
|
if status == "done":
|
|
1216
1217
|
_slack_alert(
|
|
1217
|
-
sentinel.slack_bot_token,
|
|
1218
|
+
sentinel.slack_bot_token, _origin_channel,
|
|
1218
1219
|
f"{mentions}:white_check_mark: *Patch finished* — running tests before restart...",
|
|
1219
1220
|
)
|
|
1220
1221
|
# Run test suite before restarting — revert if tests fail.
|
|
@@ -1233,7 +1234,7 @@ async def _handle_dev_task(task, cfg_loader: ConfigLoader, store: StateStore):
|
|
|
1233
1234
|
)
|
|
1234
1235
|
except Exception as _e:
|
|
1235
1236
|
_slack_alert(
|
|
1236
|
-
sentinel.slack_bot_token,
|
|
1237
|
+
sentinel.slack_bot_token, _origin_channel,
|
|
1237
1238
|
f"{mentions}:warning: *Patch* — could not run tests: {_e}. Restarting anyway.",
|
|
1238
1239
|
)
|
|
1239
1240
|
_test_result = None
|
|
@@ -1250,7 +1251,7 @@ async def _handle_dev_task(task, cfg_loader: ConfigLoader, store: StateStore):
|
|
|
1250
1251
|
_revert_ok = _revert.returncode == 0
|
|
1251
1252
|
_test_summary = (_test_result.stdout + _test_result.stderr)[-800:]
|
|
1252
1253
|
_slack_alert(
|
|
1253
|
-
sentinel.slack_bot_token,
|
|
1254
|
+
sentinel.slack_bot_token, _origin_channel,
|
|
1254
1255
|
f"{mentions}:x: *Patch tests failed* — fix reverted{'✓' if _revert_ok else ' (revert failed — check manually)'}.\n```{_test_summary}```",
|
|
1255
1256
|
)
|
|
1256
1257
|
logger.error("Patch tests failed — reverted. Output:\n%s", _test_summary)
|
|
@@ -1260,7 +1261,7 @@ async def _handle_dev_task(task, cfg_loader: ConfigLoader, store: StateStore):
|
|
|
1260
1261
|
_lines = _test_result.stdout.strip().splitlines()
|
|
1261
1262
|
_summary = f" ({_lines[-1]})" if _lines else ""
|
|
1262
1263
|
_slack_alert(
|
|
1263
|
-
sentinel.slack_bot_token,
|
|
1264
|
+
sentinel.slack_bot_token, _origin_channel,
|
|
1264
1265
|
f"{mentions}:white_check_mark: *Patch applied* — tests passed{_summary}. Restarting...",
|
|
1265
1266
|
)
|
|
1266
1267
|
logger.info("Patch tests passed — restarting Sentinel (execv)")
|
|
@@ -1286,18 +1287,18 @@ async def _handle_dev_task(task, cfg_loader: ConfigLoader, store: StateStore):
|
|
|
1286
1287
|
# Boss qualifies the raw Patch explanation before surfacing to users
|
|
1287
1288
|
qualified = _boss_qualify_dev_reason(detail, sentinel)
|
|
1288
1289
|
_slack_alert(
|
|
1289
|
-
sentinel.slack_bot_token,
|
|
1290
|
+
sentinel.slack_bot_token, _origin_channel,
|
|
1290
1291
|
f"{mentions}:warning: *Dev task needs human input*\n{qualified}",
|
|
1291
1292
|
)
|
|
1292
1293
|
elif status == "skip":
|
|
1293
1294
|
qualified = _boss_qualify_dev_reason(detail, sentinel)
|
|
1294
1295
|
_slack_alert(
|
|
1295
|
-
sentinel.slack_bot_token,
|
|
1296
|
+
sentinel.slack_bot_token, _origin_channel,
|
|
1296
1297
|
f"{mentions}:fast_forward: *Dev task skipped* — {qualified}",
|
|
1297
1298
|
)
|
|
1298
1299
|
else:
|
|
1299
1300
|
_slack_alert(
|
|
1300
|
-
sentinel.slack_bot_token,
|
|
1301
|
+
sentinel.slack_bot_token, _origin_channel,
|
|
1301
1302
|
f"{mentions}:x: *Patch error* on task `{task.fingerprint[:8]}` — {detail[:200]}",
|
|
1302
1303
|
)
|
|
1303
1304
|
|
|
@@ -1315,7 +1316,8 @@ async def _dev_poll_loop(cfg_loader: ConfigLoader, store: StateStore):
|
|
|
1315
1316
|
# Tracks fingerprints already queued this session (in-memory dedup across polls)
|
|
1316
1317
|
_seen_self_fps: set = set()
|
|
1317
1318
|
|
|
1318
|
-
# Pre-populate from existing done/cancelled tasks so we don't re-queue on restart
|
|
1319
|
+
# Pre-populate from existing done/cancelled tasks so we don't re-queue on restart.
|
|
1320
|
+
# Read the full fingerprint from SOURCE_FINGERPRINT: header inside the file.
|
|
1319
1321
|
project_dir = Path(".")
|
|
1320
1322
|
for done_dir in [
|
|
1321
1323
|
project_dir / "dev-tasks" / ".done",
|
|
@@ -1323,10 +1325,22 @@ async def _dev_poll_loop(cfg_loader: ConfigLoader, store: StateStore):
|
|
|
1323
1325
|
]:
|
|
1324
1326
|
if done_dir.exists():
|
|
1325
1327
|
for f in done_dir.iterdir():
|
|
1326
|
-
if f.stem.startswith("self-"):
|
|
1327
|
-
|
|
1328
|
-
|
|
1329
|
-
|
|
1328
|
+
if not f.stem.startswith("self-"):
|
|
1329
|
+
continue
|
|
1330
|
+
try:
|
|
1331
|
+
for line in f.read_text(encoding="utf-8", errors="replace").splitlines():
|
|
1332
|
+
if line.upper().startswith("SOURCE_FINGERPRINT:"):
|
|
1333
|
+
fp_val = line.split(":", 1)[1].strip()
|
|
1334
|
+
if fp_val:
|
|
1335
|
+
_seen_self_fps.add(fp_val)
|
|
1336
|
+
break
|
|
1337
|
+
else:
|
|
1338
|
+
# Fallback: use 8-char prefix from filename
|
|
1339
|
+
parts = f.stem.split("-")
|
|
1340
|
+
if len(parts) >= 2:
|
|
1341
|
+
_seen_self_fps.add(parts[1])
|
|
1342
|
+
except OSError:
|
|
1343
|
+
pass
|
|
1330
1344
|
|
|
1331
1345
|
# Wait a bit so the main loop and Boss are fully up first
|
|
1332
1346
|
await asyncio.sleep(15)
|
|
@@ -1339,7 +1353,24 @@ async def _dev_poll_loop(cfg_loader: ConfigLoader, store: StateStore):
|
|
|
1339
1353
|
# ── Self-repair: scan Sentinel's own log for new errors ────────
|
|
1340
1354
|
log_path = project_dir / "logs" / "sentinel.log"
|
|
1341
1355
|
new_errors = scan_sentinel_errors(log_path, seen_fps=_seen_self_fps)
|
|
1356
|
+
# Don't re-queue if a self-repair task for the same fp is already pending
|
|
1357
|
+
_queued_fps: set[str] = set()
|
|
1358
|
+
_dt = project_dir / "dev-tasks"
|
|
1359
|
+
if _dt.exists():
|
|
1360
|
+
for _f in _dt.iterdir():
|
|
1361
|
+
if not _f.is_file() or not _f.stem.startswith("self-"):
|
|
1362
|
+
continue
|
|
1363
|
+
try:
|
|
1364
|
+
for _line in _f.read_text(encoding="utf-8", errors="replace").splitlines():
|
|
1365
|
+
if _line.upper().startswith("SOURCE_FINGERPRINT:"):
|
|
1366
|
+
_queued_fps.add(_line.split(":", 1)[1].strip())
|
|
1367
|
+
break
|
|
1368
|
+
except OSError:
|
|
1369
|
+
pass
|
|
1342
1370
|
for fp, task_body in new_errors:
|
|
1371
|
+
if fp in _queued_fps:
|
|
1372
|
+
logger.debug("Dev agent: self-repair %s already pending — skipping", fp[:8])
|
|
1373
|
+
continue
|
|
1343
1374
|
logger.info("Dev agent: self-repair task queued for error %s", fp[:8])
|
|
1344
1375
|
drop_self_repair_task(project_dir, fp, task_body)
|
|
1345
1376
|
|
|
@@ -2404,6 +2404,7 @@ async def _run_tool(name: str, inputs: dict, cfg_loader, store, slack_client=Non
|
|
|
2404
2404
|
f"SUBMITTED_BY: <@{user_id}> ({user_id})",
|
|
2405
2405
|
f"SOURCE: boss",
|
|
2406
2406
|
f"SUBMITTED_AT: {_dt.now(_tz.utc).isoformat()}",
|
|
2407
|
+
f"ORIGIN_CHANNEL: {channel}",
|
|
2407
2408
|
]
|
|
2408
2409
|
if notify_ids:
|
|
2409
2410
|
lines.append(f"NOTIFY: {','.join(notify_ids)}")
|
|
@@ -46,8 +46,7 @@ def config_dir(tmp_path):
|
|
|
46
46
|
(tmp_path / "repo-configs" / "elprint-salescore.properties").write_text(textwrap.dedent("""\
|
|
47
47
|
REPO_URL=git@github.com:org/elprint-salescore.git
|
|
48
48
|
LOCAL_PATH=/repos/elprint-salescore
|
|
49
|
-
|
|
50
|
-
AUTO_PUBLISH=false
|
|
49
|
+
AUTO_COMMIT=true
|
|
51
50
|
CICD_TYPE=jenkins
|
|
52
51
|
CICD_JOB_URL=https://jenkins.quadim.ai/job/elprint-salescore
|
|
53
52
|
CICD_TOKEN=tok123
|
|
@@ -57,8 +56,6 @@ def config_dir(tmp_path):
|
|
|
57
56
|
(tmp_path / "repo-configs" / "elprint-commons.properties").write_text(textwrap.dedent("""\
|
|
58
57
|
REPO_URL=git@github.com:org/elprint-commons.git
|
|
59
58
|
LOCAL_PATH=/repos/elprint-commons
|
|
60
|
-
BRANCH=main
|
|
61
|
-
AUTO_PUBLISH=false
|
|
62
59
|
CICD_TYPE=
|
|
63
60
|
CICD_JOB_URL=
|
|
64
61
|
CICD_TOKEN=
|
|
@@ -100,7 +97,8 @@ def test_repos(config_dir):
|
|
|
100
97
|
|
|
101
98
|
r = loader.repos["elprint-salescore"]
|
|
102
99
|
assert r.repo_name == "elprint-salescore" # derived from stem
|
|
103
|
-
assert r.
|
|
100
|
+
assert r.auto_commit is True # explicitly set in config
|
|
101
|
+
assert r.auto_release is None # not set → inherits project default
|
|
104
102
|
assert r.cicd_job_url == "https://jenkins.quadim.ai/job/elprint-salescore"
|
|
105
103
|
assert r.cicd_token == "tok123"
|
|
106
104
|
|