@misterhuydo/sentinel 1.5.27 → 1.5.29
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/config_loader.py +3 -0
- package/python/sentinel/main.py +47 -2
- package/python/sentinel/notify.py +1 -0
- package/python/sentinel/sentinel_boss.py +1 -1
- package/python/sentinel/state_store.py +15 -0
package/.cairn/.hint-lock
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
2026-04-
|
|
1
|
+
2026-04-09T12:20:24.982Z
|
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-09T12:46:01.683Z",
|
|
3
|
+
"checkpoint_at": "2026-04-09T12:46:01.832Z",
|
|
4
4
|
"active_files": [
|
|
5
5
|
"J:\\Projects\\Sentinel\\cli\\bin\\sentinel.js",
|
|
6
6
|
"J:\\Projects\\Sentinel\\cli\\lib\\test.js",
|
|
@@ -47,7 +47,10 @@
|
|
|
47
47
|
"[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 | 56 ++++++++-\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/lib/generate.js | 6 +-\n cli/package.json | 2 +-\n sentinel/config_loader.py | 83 ++++++++++---\n sentinel/dependency_manager.py | 4 +-\n sentinel/dev_watcher.py | 11 +-\n sentinel/git_manager.py | 22 ++--\n sentinel/main.py | 107 +++++++++++-----\n sentinel/repo_task_engine.py | 18 ++-\n sentinel/sentinel_boss.py | 44 ++++---\n sentinel/slack_bot.py | 139 +++++++++++++++++++++\n sentinel/state_store.py | 37 ++++++\n tests/test_config_loader.py | 8 +-\n 21 files changed, 734 insertions(+), 153 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 lib/generate.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/slack_bot.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",
|
|
48
48
|
"[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 | 57 ++++++++-\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/lib/generate.js | 6 +-\n cli/package.json | 2 +-\n sentinel/config_loader.py | 83 ++++++++++---\n sentinel/dependency_manager.py | 4 +-\n sentinel/dev_watcher.py | 11 +-\n sentinel/git_manager.py | 22 ++--\n sentinel/main.py | 107 +++++++++++-----\n sentinel/repo_task_engine.py | 18 ++-\n sentinel/sentinel_boss.py | 44 ++++---\n sentinel/slack_bot.py | 139 +++++++++++++++++++++\n sentinel/state_store.py | 37 ++++++\n tests/test_config_loader.py | 8 +-\n 21 files changed, 735 insertions(+), 153 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 lib/generate.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/slack_bot.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",
|
|
49
49
|
"[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 | 58 ++++++++-\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/lib/generate.js | 6 +-\n cli/package.json | 2 +-\n sentinel/config_loader.py | 83 ++++++++++---\n sentinel/dependency_manager.py | 12 +-\n sentinel/dev_watcher.py | 11 +-\n sentinel/git_manager.py | 53 +++++---\n sentinel/main.py | 107 +++++++++++-----\n sentinel/repo_task_engine.py | 18 ++-\n sentinel/sentinel_boss.py | 51 +++++---\n sentinel/slack_bot.py | 139 +++++++++++++++++++++\n sentinel/state_store.py | 37 ++++++\n tests/test_config_loader.py | 8 +-\n 21 files changed, 774 insertions(+), 161 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 lib/generate.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/slack_bot.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",
|
|
50
|
-
"[2026-04-08] git-snapshot: .cairn/session.json | 30 ++++-\n .claude/settings.local.json | 47 ++++++-\n cli/.cairn/.hint-lock | 2 +-\n cli/.cairn/minify-map.json | 8 +-\n cli/.cairn/session.json | 59 ++++++++-\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/lib/generate.js | 6 +-\n cli/package.json | 2 +-\n sentinel/config_loader.py | 83 ++++++++++---\n sentinel/dependency_manager.py | 12 +-\n sentinel/dev_watcher.py | 11 +-\n sentinel/git_manager.py | 53 +++++---\n sentinel/main.py | 107 +++++++++++-----\n sentinel/repo_task_engine.py | 18 ++-\n sentinel/sentinel_boss.py | 51 +++++---\n sentinel/slack_bot.py | 139 +++++++++++++++++++++\n sentinel/state_store.py | 37 ++++++\n tests/test_config_loader.py | 8 +-\n 21 files changed, 776 insertions(+), 161 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 lib/generate.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/slack_bot.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"
|
|
50
|
+
"[2026-04-08] git-snapshot: .cairn/session.json | 30 ++++-\n .claude/settings.local.json | 47 ++++++-\n cli/.cairn/.hint-lock | 2 +-\n cli/.cairn/minify-map.json | 8 +-\n cli/.cairn/session.json | 59 ++++++++-\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/lib/generate.js | 6 +-\n cli/package.json | 2 +-\n sentinel/config_loader.py | 83 ++++++++++---\n sentinel/dependency_manager.py | 12 +-\n sentinel/dev_watcher.py | 11 +-\n sentinel/git_manager.py | 53 +++++---\n sentinel/main.py | 107 +++++++++++-----\n sentinel/repo_task_engine.py | 18 ++-\n sentinel/sentinel_boss.py | 51 +++++---\n sentinel/slack_bot.py | 139 +++++++++++++++++++++\n sentinel/state_store.py | 37 ++++++\n tests/test_config_loader.py | 8 +-\n 21 files changed, 776 insertions(+), 161 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 lib/generate.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/slack_bot.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",
|
|
51
|
+
"[2026-04-09] git-snapshot: .cairn/session.json | 17 ++-\n .claude/settings.local.json | 47 ++++++-\n cli/.cairn/.hint-lock | 2 +-\n cli/.cairn/minify-map.json | 8 +-\n cli/.cairn/session.json | 60 ++++++++-\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/lib/generate.js | 6 +-\n cli/package-lock.json | 4 +-\n cli/package.json | 2 +-\n sentinel/config_loader.py | 83 ++++++++++---\n sentinel/dependency_manager.py | 12 +-\n sentinel/dev_watcher.py | 11 +-\n sentinel/git_manager.py | 53 +++++---\n sentinel/main.py | 107 +++++++++++-----\n sentinel/repo_task_engine.py | 18 ++-\n sentinel/sentinel_boss.py | 53 +++++---\n sentinel/slack_bot.py | 143 ++++++++++++++++++++++\n sentinel/state_store.py | 37 ++++++\n tests/test_config_loader.py | 8 +-\n 22 files changed, 771 insertions(+), 164 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 lib/generate.js\n M package-lock.json\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/slack_bot.py\n M ../sentinel/state_store.py\n M ../tests/test_config_loader.py\n?? ../.cairn/.cairn-project\n?? ../.cairn/bundles/\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",
|
|
52
|
+
"[2026-04-09] git-snapshot: .cairn/session.json | 17 ++-\n .claude/settings.local.json | 47 ++++++-\n cli/.cairn/.hint-lock | 2 +-\n cli/.cairn/minify-map.json | 8 +-\n cli/.cairn/session.json | 61 +++++++++-\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/lib/generate.js | 6 +-\n cli/package-lock.json | 4 +-\n cli/package.json | 2 +-\n sentinel/config_loader.py | 83 ++++++++++---\n sentinel/dependency_manager.py | 12 +-\n sentinel/dev_watcher.py | 11 +-\n sentinel/git_manager.py | 53 +++++---\n sentinel/main.py | 107 +++++++++++-----\n sentinel/repo_task_engine.py | 18 ++-\n sentinel/sentinel_boss.py | 55 ++++++---\n sentinel/slack_bot.py | 143 ++++++++++++++++++++++\n sentinel/state_store.py | 40 ++++++\n tests/test_config_loader.py | 8 +-\n 22 files changed, 776 insertions(+), 165 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 lib/generate.js\n M package-lock.json\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/slack_bot.py\n M ../sentinel/state_store.py\n M ../tests/test_config_loader.py\n?? ../.cairn/.cairn-project\n?? ../.cairn/bundles/\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",
|
|
53
|
+
"[2026-04-09] git-snapshot: .cairn/session.json | 17 ++-\n .claude/settings.local.json | 47 ++++++-\n cli/.cairn/.hint-lock | 2 +-\n cli/.cairn/minify-map.json | 8 +-\n cli/.cairn/session.json | 62 +++++++++-\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/lib/generate.js | 6 +-\n cli/package-lock.json | 4 +-\n cli/package.json | 2 +-\n sentinel/config_loader.py | 83 ++++++++++---\n sentinel/dependency_manager.py | 12 +-\n sentinel/dev_watcher.py | 11 +-\n sentinel/git_manager.py | 53 +++++---\n sentinel/main.py | 107 +++++++++++-----\n sentinel/repo_task_engine.py | 18 ++-\n sentinel/sentinel_boss.py | 55 ++++++---\n sentinel/slack_bot.py | 143 ++++++++++++++++++++++\n sentinel/state_store.py | 40 ++++++\n tests/test_config_loader.py | 8 +-\n 22 files changed, 777 insertions(+), 165 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 lib/generate.js\n M package-lock.json\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/slack_bot.py\n M ../sentinel/state_store.py\n M ../tests/test_config_loader.py\n?? ../.cairn/.cairn-project\n?? ../.cairn/bundles/\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"
|
|
51
54
|
],
|
|
52
55
|
"mtime_snapshot": {
|
|
53
56
|
"J:\\Projects\\Sentinel\\cli\\bin\\sentinel.js": 1774252515044.4768,
|
package/package.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
__version__ = "1.5.
|
|
1
|
+
__version__ = "1.5.29"
|
|
@@ -84,6 +84,7 @@ class SentinelConfig:
|
|
|
84
84
|
sentinel_dev_auto_publish: bool = False # if True, auto-publish to npm after clean soak
|
|
85
85
|
auto_commit: bool = False # project-level default: push directly to main (no PR); repos can override
|
|
86
86
|
auto_release: bool = False # project-level default: trigger CI/CD pipeline after push; repos can override
|
|
87
|
+
auto_raise_issues: bool = False # if True, auto-fix detected log errors without waiting for human to raise an issue
|
|
87
88
|
|
|
88
89
|
|
|
89
90
|
@dataclass
|
|
@@ -279,6 +280,8 @@ class ConfigLoader:
|
|
|
279
280
|
c.auto_commit = d["AUTO_COMMIT"].lower() == "true"
|
|
280
281
|
if "AUTO_RELEASE" in d:
|
|
281
282
|
c.auto_release = d["AUTO_RELEASE"].lower() == "true"
|
|
283
|
+
if "AUTO_RAISE_ISSUES" in d:
|
|
284
|
+
c.auto_raise_issues = d["AUTO_RAISE_ISSUES"].lower() == "true"
|
|
282
285
|
self.sentinel = c
|
|
283
286
|
|
|
284
287
|
def _load_log_sources(self):
|
package/python/sentinel/main.py
CHANGED
|
@@ -181,6 +181,19 @@ async def _handle_error(event: ErrorEvent, cfg_loader: ConfigLoader, store: Stat
|
|
|
181
181
|
|
|
182
182
|
repo = route(event, cfg_loader.repos)
|
|
183
183
|
if not repo:
|
|
184
|
+
from .notify import slack_alert as _slack_alert
|
|
185
|
+
severity_icon = {"CRITICAL": ":rotating_light:", "ERROR": ":red_circle:"}.get(
|
|
186
|
+
event.severity.upper(), ":large_yellow_circle:"
|
|
187
|
+
)
|
|
188
|
+
_slack_alert(
|
|
189
|
+
sentinel.slack_bot_token,
|
|
190
|
+
sentinel.slack_channel,
|
|
191
|
+
f"{severity_icon} *{event.severity.upper()} detected — no repo match* (`{event.source}`)\n"
|
|
192
|
+
f"`{event.message[:200]}`\n"
|
|
193
|
+
f":no_entry_sign: Could not route to any managed repo — manual review needed.\n"
|
|
194
|
+
f"Fingerprint: `{event.fingerprint[:8]}`",
|
|
195
|
+
)
|
|
196
|
+
logger.warning("No repo route for %s (%s) — alerted channel", event.fingerprint[:8], event.source)
|
|
184
197
|
return
|
|
185
198
|
|
|
186
199
|
auto_commit = resolve_auto_commit(repo, sentinel)
|
|
@@ -195,9 +208,21 @@ async def _handle_error(event: ErrorEvent, cfg_loader: ConfigLoader, store: Stat
|
|
|
195
208
|
logger.info("SENTINEL_PAUSE present — fix activity halted")
|
|
196
209
|
return
|
|
197
210
|
|
|
211
|
+
# ── Suppress repeat notifications for same error (notified within 4h) ───────
|
|
212
|
+
if store.was_notified_recently(event.fingerprint):
|
|
213
|
+
logger.debug("Error %s already notified recently — suppressing repeat", event.fingerprint[:8])
|
|
214
|
+
return
|
|
215
|
+
|
|
198
216
|
# ── Determine what we can do before alerting ──────────────────────────────
|
|
199
217
|
cannot_fix = event.is_infra_issue or (event.severity == "CRITICAL" and auto_commit)
|
|
200
|
-
|
|
218
|
+
if cannot_fix:
|
|
219
|
+
fix_status = "cannot_fix"
|
|
220
|
+
elif not sentinel.auto_raise_issues:
|
|
221
|
+
fix_status = "raise_to_fix"
|
|
222
|
+
elif not auto_commit:
|
|
223
|
+
fix_status = "will_fix_pr"
|
|
224
|
+
else:
|
|
225
|
+
fix_status = "attempting"
|
|
201
226
|
|
|
202
227
|
stack_lines = getattr(event, "stack_trace", None)
|
|
203
228
|
stack_preview = ""
|
|
@@ -235,6 +260,11 @@ async def _handle_error(event: ErrorEvent, cfg_loader: ConfigLoader, store: Stat
|
|
|
235
260
|
store.record_fix(event.fingerprint, "skipped", repo_name=repo.repo_name)
|
|
236
261
|
return
|
|
237
262
|
|
|
263
|
+
if not sentinel.auto_raise_issues:
|
|
264
|
+
logger.info("AUTO_RAISE_ISSUES=false — notified channel, awaiting human to raise issue for %s", event.fingerprint[:8])
|
|
265
|
+
store.record_fix(event.fingerprint, "notified", repo_name=repo.repo_name)
|
|
266
|
+
return
|
|
267
|
+
|
|
238
268
|
if store.fix_attempted_recently(event.fingerprint, hours=24):
|
|
239
269
|
logger.debug("Fix already attempted recently for %s", event.fingerprint)
|
|
240
270
|
return
|
|
@@ -364,12 +394,21 @@ async def _handle_issue(event: IssueEvent, cfg_loader: ConfigLoader, store: Stat
|
|
|
364
394
|
mark_done(event.issue_file)
|
|
365
395
|
return
|
|
366
396
|
|
|
367
|
-
# Route: explicit TARGET_REPO in file > single-repo shortcut > warn and
|
|
397
|
+
# Route: explicit TARGET_REPO in file > single-repo shortcut > warn and notify
|
|
398
|
+
from .notify import slack_alert as _route_alert
|
|
399
|
+
_submitter_id = getattr(event, "submitter_user_id", "")
|
|
400
|
+
_origin_ch = getattr(event, "origin_channel", "") or sentinel.slack_channel
|
|
368
401
|
if event.target_repo:
|
|
369
402
|
repo = cfg_loader.repos.get(event.target_repo)
|
|
370
403
|
if not repo:
|
|
371
404
|
logger.warning("TARGET_REPO %r not found in config -- leaving %s for admin",
|
|
372
405
|
event.target_repo, event.source)
|
|
406
|
+
_route_alert(
|
|
407
|
+
sentinel.slack_bot_token, _origin_ch,
|
|
408
|
+
f":warning: *Issue routing failed*{' — ' + '<@' + _submitter_id + '>' if _submitter_id else ''}\n"
|
|
409
|
+
f"Repo `{event.target_repo}` is not in Sentinel's config.\n"
|
|
410
|
+
f"_{event.message[:120]}_",
|
|
411
|
+
)
|
|
373
412
|
return
|
|
374
413
|
elif len(cfg_loader.repos) == 1:
|
|
375
414
|
repo = next(iter(cfg_loader.repos.values()))
|
|
@@ -378,6 +417,12 @@ async def _handle_issue(event: IssueEvent, cfg_loader: ConfigLoader, store: Stat
|
|
|
378
417
|
"Cannot auto-route %s -- add 'TARGET_REPO: <repo>' as first line in the file",
|
|
379
418
|
event.source,
|
|
380
419
|
)
|
|
420
|
+
_route_alert(
|
|
421
|
+
sentinel.slack_bot_token, _origin_ch,
|
|
422
|
+
f":warning: *Issue routing failed*{' — ' + '<@' + _submitter_id + '>' if _submitter_id else ''}\n"
|
|
423
|
+
f"Multiple repos configured — add `TARGET_REPO: <repo-name>` to the issue.\n"
|
|
424
|
+
f"_{event.message[:120]}_",
|
|
425
|
+
)
|
|
381
426
|
return # Leave the file so admin can add the header
|
|
382
427
|
|
|
383
428
|
auto_commit = resolve_auto_commit(repo, sentinel)
|
|
@@ -262,6 +262,7 @@ def notify_error_detected(
|
|
|
262
262
|
"attempting": ":hammer: Sentinel is attempting a fix...",
|
|
263
263
|
"will_fix_pr": ":hammer: Sentinel is preparing a fix PR...",
|
|
264
264
|
"cannot_fix": ":no_entry_sign: Sentinel cannot auto-fix this (infra/CRITICAL — human review needed).",
|
|
265
|
+
"raise_to_fix": ":eyes: Sentinel detected this issue. Set `AUTO_RAISE_ISSUES=true` or ask Boss to fix it.",
|
|
265
266
|
}.get(fix_status, f":information_source: {fix_status}")
|
|
266
267
|
|
|
267
268
|
lines = [
|
|
@@ -4739,7 +4739,7 @@ async def _handle_with_cli(
|
|
|
4739
4739
|
([cfg.claude_code_bin, "--dangerously-skip-permissions", "--bare", "--print", prompt]
|
|
4740
4740
|
if os.getuid() != 0 else
|
|
4741
4741
|
[cfg.claude_code_bin, "--bare", "--print", prompt]),
|
|
4742
|
-
capture_output=True, text=True, timeout=
|
|
4742
|
+
capture_output=True, text=True, timeout=300, env=env, stdin=subprocess.DEVNULL,
|
|
4743
4743
|
)
|
|
4744
4744
|
output = (result.stdout or "").strip()
|
|
4745
4745
|
if result.returncode != 0 or not output:
|
|
@@ -101,6 +101,9 @@ class StateStore:
|
|
|
101
101
|
("add_watched_bots_project", "ALTER TABLE watched_bots ADD COLUMN project_name TEXT"),
|
|
102
102
|
("add_alert_thread_ts", "ALTER TABLE errors ADD COLUMN alert_thread_ts TEXT"),
|
|
103
103
|
("add_alert_channel", "ALTER TABLE errors ADD COLUMN alert_channel TEXT"),
|
|
104
|
+
# knowledge_cache was originally created with a 'cached_at' column; rebuilt with 'expires_at'
|
|
105
|
+
("rebuild_knowledge_cache_expires_at",
|
|
106
|
+
"DROP TABLE IF EXISTS knowledge_cache"),
|
|
104
107
|
]
|
|
105
108
|
with self._conn() as conn:
|
|
106
109
|
done = {r[0] for r in conn.execute("SELECT name FROM _sentinel_migrations").fetchall()}
|
|
@@ -252,9 +255,21 @@ class StateStore:
|
|
|
252
255
|
return [dict(r) for r in rows]
|
|
253
256
|
|
|
254
257
|
def fix_attempted_recently(self, fingerprint: str, hours: int = 24) -> bool:
|
|
258
|
+
# "notified" and "skipped" don't block a future fix attempt
|
|
255
259
|
with self._conn() as conn:
|
|
256
260
|
row = conn.execute(
|
|
257
261
|
"SELECT id FROM fixes WHERE fingerprint=? "
|
|
262
|
+
"AND status NOT IN ('notified', 'skipped') "
|
|
263
|
+
"AND timestamp >= datetime('now', ? || ' hours')",
|
|
264
|
+
(fingerprint, f"-{hours}"),
|
|
265
|
+
).fetchone()
|
|
266
|
+
return row is not None
|
|
267
|
+
|
|
268
|
+
def was_notified_recently(self, fingerprint: str, hours: int = 4) -> bool:
|
|
269
|
+
"""Return True if this error was recorded as 'notified' within the last N hours (spam suppression)."""
|
|
270
|
+
with self._conn() as conn:
|
|
271
|
+
row = conn.execute(
|
|
272
|
+
"SELECT id FROM fixes WHERE fingerprint=? AND status='notified' "
|
|
258
273
|
"AND timestamp >= datetime('now', ? || ' hours')",
|
|
259
274
|
(fingerprint, f"-{hours}"),
|
|
260
275
|
).fetchone()
|