@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 CHANGED
@@ -1 +1 @@
1
- 2026-04-08T15:32:44.554Z
1
+ 2026-04-08T16:10:00.639Z
@@ -1,6 +1,6 @@
1
1
  {
2
- "message": "Auto-checkpoint at 2026-04-08T15:54:13.776Z",
3
- "checkpoint_at": "2026-04-08T15:54:13.872Z",
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,6 +1,6 @@
1
1
  {
2
2
  "name": "@misterhuydo/sentinel",
3
- "version": "1.5.18",
3
+ "version": "1.5.20",
4
4
  "description": "Sentinel — Autonomous DevOps Agent installer and manager",
5
5
  "bin": {
6
6
  "sentinel": "./bin/sentinel.js"
@@ -1 +1 @@
1
- __version__ = "1.5.18"
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
 
@@ -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, sentinel.slack_channel, _started_msg)
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, sentinel.slack_channel, _thread_ts, msg)
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, sentinel.slack_channel,
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, sentinel.slack_channel,
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, sentinel.slack_channel,
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, sentinel.slack_channel,
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, sentinel.slack_channel,
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, sentinel.slack_channel,
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, sentinel.slack_channel,
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
- parts = f.stem.split("-")
1328
- if len(parts) >= 2:
1329
- _seen_self_fps.add(parts[1])
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
- BRANCH=main
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.auto_publish is False
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