@arthai/agents 1.0.9 → 1.0.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/VERSION +1 -1
  2. package/dist/plugins/canvas/.claude-plugin/plugin.json +1 -1
  3. package/dist/plugins/canvas/VERSION +1 -1
  4. package/dist/plugins/canvas/hooks/hooks.json +12 -0
  5. package/dist/plugins/canvas/hooks/project-setup.sh +74 -2
  6. package/dist/plugins/compass/.claude-plugin/plugin.json +1 -1
  7. package/dist/plugins/compass/VERSION +1 -1
  8. package/dist/plugins/compass/hooks/hooks.json +12 -0
  9. package/dist/plugins/compass/hooks/project-setup.sh +74 -2
  10. package/dist/plugins/counsel/.claude-plugin/plugin.json +1 -1
  11. package/dist/plugins/counsel/VERSION +1 -1
  12. package/dist/plugins/counsel/hooks/hooks.json +12 -0
  13. package/dist/plugins/counsel/hooks/project-setup.sh +74 -2
  14. package/dist/plugins/cruise/.claude-plugin/plugin.json +1 -1
  15. package/dist/plugins/cruise/VERSION +1 -1
  16. package/dist/plugins/cruise/hooks/hooks.json +12 -0
  17. package/dist/plugins/cruise/hooks/project-setup.sh +74 -2
  18. package/dist/plugins/forge/.claude-plugin/plugin.json +1 -1
  19. package/dist/plugins/forge/VERSION +1 -1
  20. package/dist/plugins/forge/hooks/hooks.json +10 -0
  21. package/dist/plugins/forge/hooks/project-setup.sh +74 -2
  22. package/dist/plugins/prime/.claude-plugin/plugin.json +1 -1
  23. package/dist/plugins/prime/VERSION +1 -1
  24. package/dist/plugins/prime/hooks/hooks.json +22 -12
  25. package/dist/plugins/prime/hooks/project-setup.sh +74 -2
  26. package/dist/plugins/prism/.claude-plugin/plugin.json +1 -1
  27. package/dist/plugins/prism/VERSION +1 -1
  28. package/dist/plugins/prism/hooks/hooks.json +12 -0
  29. package/dist/plugins/prism/hooks/project-setup.sh +74 -2
  30. package/dist/plugins/scalpel/.claude-plugin/plugin.json +1 -1
  31. package/dist/plugins/scalpel/VERSION +1 -1
  32. package/dist/plugins/scalpel/hooks/hooks.json +12 -0
  33. package/dist/plugins/scalpel/hooks/project-setup.sh +74 -2
  34. package/dist/plugins/sentinel/.claude-plugin/plugin.json +1 -1
  35. package/dist/plugins/sentinel/VERSION +1 -1
  36. package/dist/plugins/sentinel/hooks/hooks.json +12 -0
  37. package/dist/plugins/sentinel/hooks/project-setup.sh +74 -2
  38. package/dist/plugins/shield/.claude-plugin/plugin.json +1 -1
  39. package/dist/plugins/shield/VERSION +1 -1
  40. package/dist/plugins/shield/hooks/hooks.json +21 -11
  41. package/dist/plugins/shield/hooks/project-setup.sh +74 -2
  42. package/dist/plugins/spark/.claude-plugin/plugin.json +1 -1
  43. package/dist/plugins/spark/VERSION +1 -1
  44. package/dist/plugins/spark/hooks/hooks.json +12 -0
  45. package/dist/plugins/spark/hooks/project-setup.sh +74 -2
  46. package/hook-defs.json +2 -1
  47. package/hooks/project-setup.sh +74 -2
  48. package/package.json +1 -1
@@ -37,14 +37,86 @@ MANAGED_START="<!-- >>> claude-agents toolkit (DO NOT EDIT THIS BLOCK) >>> -->"
37
37
  MANAGED_END="<!-- <<< claude-agents toolkit <<< -->"
38
38
  GITIGNORE_START="# >>> claude-agents managed (DO NOT EDIT THIS BLOCK) >>>"
39
39
 
40
- # Check marker file — skip if current version is already set up
40
+ # Check marker file — skip SETUP if current version is already done
41
+ # But ALWAYS run license check (even if setup is done)
42
+ SETUP_NEEDED=true
41
43
  if [ -f "$MARKER_FILE" ]; then
42
44
  STORED_VERSION=$(cat "$MARKER_FILE" 2>/dev/null | tr -d '[:space:]' || echo "")
43
45
  if [ "$STORED_VERSION" = "$TOOLKIT_VERSION" ]; then
44
- exit 0
46
+ SETUP_NEEDED=false
45
47
  fi
46
48
  fi
47
49
 
50
+ # ---------------------------------------------------------------------------
51
+ # License validation (marketplace gate)
52
+ # ---------------------------------------------------------------------------
53
+ # Check key: ARTHAI_LICENSE_KEY env → ~/.claude-agents/.license → ~/.arthai/license
54
+ WORKER_URL="https://license-worker.muddassar-shaikh.workers.dev"
55
+ KEY_FORMAT='^ARTH-[A-Z0-9]{4}-[A-Z0-9]{4}-[A-Z0-9]{4}-[A-Z0-9]{4}$'
56
+ LICENSE_CACHE="$PROJECT_DIR/.claude/.license-validated"
57
+ CACHE_TTL=86400
58
+
59
+ REAL_HOME=$(eval echo ~"$(id -un)")
60
+ LICENSE_KEY="${ARTHAI_LICENSE_KEY:-}"
61
+ [ -z "$LICENSE_KEY" ] && [ -f "$REAL_HOME/.claude-agents/.license" ] && LICENSE_KEY=$(cat "$REAL_HOME/.claude-agents/.license" 2>/dev/null | tr -d '[:space:]')
62
+ [ -z "$LICENSE_KEY" ] && [ -f "$REAL_HOME/.arthai/license" ] && LICENSE_KEY=$(cat "$REAL_HOME/.arthai/license" 2>/dev/null | tr -d '[:space:]')
63
+
64
+ if [ -z "$LICENSE_KEY" ]; then
65
+ echo "LICENSE REQUIRED — No license key found for marketplace plugin."
66
+ echo "Run: npx @arthai/agents activate ARTH-XXXX-XXXX-XXXX-XXXX"
67
+ echo "Get a key: productive@getarth.ai"
68
+ exit 0
69
+ fi
70
+
71
+ # Validate format
72
+ if ! echo "$LICENSE_KEY" | grep -qE "$KEY_FORMAT"; then
73
+ echo "LICENSE INVALID — Key format incorrect."
74
+ exit 0
75
+ fi
76
+
77
+ # Check cache (24h TTL)
78
+ LICENSE_VALID=false
79
+ NOW=$(date +%s)
80
+ if [ -f "$LICENSE_CACHE" ]; then
81
+ CACHED_TIME=$(cat "$LICENSE_CACHE" 2>/dev/null | tr -d '[:space:]' || echo "0")
82
+ ELAPSED=$((NOW - CACHED_TIME))
83
+ if [ "$ELAPSED" -ge 0 ] && [ "$ELAPSED" -lt "$CACHE_TTL" ]; then
84
+ LICENSE_VALID=true
85
+ fi
86
+ fi
87
+
88
+ if ! $LICENSE_VALID; then
89
+ # Call Worker — same logic as sync-agents.sh
90
+ PAYLOAD=$(printf '{"key":"%s"}' "$LICENSE_KEY")
91
+ RESPONSE=$(printf '%s' "$PAYLOAD" | curl -sf -m 5 -X POST "$WORKER_URL/validate" \
92
+ -H "Content-Type: application/json" --data "@-" 2>/dev/null) || RESPONSE=""
93
+
94
+ if [ -n "$RESPONSE" ]; then
95
+ VALID=$(echo "$RESPONSE" | python3 -c "import json,sys; print(json.load(sys.stdin).get('valid',False))" 2>/dev/null) || VALID="False"
96
+ if [ "$VALID" = "True" ]; then
97
+ LICENSE_VALID=true
98
+ mkdir -p "$PROJECT_DIR/.claude"
99
+ echo "$NOW" > "$LICENSE_CACHE"
100
+ else
101
+ # Definitive invalid — no fallback
102
+ echo "LICENSE INVALID — Key not recognized."
103
+ echo "Check your key or get one at productive@getarth.ai"
104
+ exit 0
105
+ fi
106
+ else
107
+ # Network error — allow gracefully (don't block on Worker outage)
108
+ LICENSE_VALID=true
109
+ fi
110
+ fi
111
+
112
+ # ---------------------------------------------------------------------------
113
+ # Project setup (only runs if license is valid AND setup is needed)
114
+ # ---------------------------------------------------------------------------
115
+
116
+ if ! $SETUP_NEEDED; then
117
+ exit 0
118
+ fi
119
+
48
120
  CLAUDE_MD="$PROJECT_DIR/CLAUDE.md"
49
121
  GITIGNORE="$PROJECT_DIR/.gitignore"
50
122
 
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "spark",
3
3
  "description": "Project setup and onboarding — calibrate, scan, bootstrap",
4
- "version": "1.0.9",
4
+ "version": "1.0.11",
5
5
  "author": {
6
6
  "name": "Arth AI"
7
7
  }
@@ -1 +1 @@
1
- 1.0.9
1
+ 1.0.11
@@ -21,6 +21,18 @@
21
21
  }
22
22
  ]
23
23
  }
24
+ ],
25
+ "UserPromptSubmit": [
26
+ {
27
+ "matcher": "",
28
+ "hooks": [
29
+ {
30
+ "type": "command",
31
+ "command": "${CLAUDE_PLUGIN_ROOT}/hooks/project-setup.sh",
32
+ "timeout": 5
33
+ }
34
+ ]
35
+ }
24
36
  ]
25
37
  }
26
38
  }
@@ -37,14 +37,86 @@ MANAGED_START="<!-- >>> claude-agents toolkit (DO NOT EDIT THIS BLOCK) >>> -->"
37
37
  MANAGED_END="<!-- <<< claude-agents toolkit <<< -->"
38
38
  GITIGNORE_START="# >>> claude-agents managed (DO NOT EDIT THIS BLOCK) >>>"
39
39
 
40
- # Check marker file — skip if current version is already set up
40
+ # Check marker file — skip SETUP if current version is already done
41
+ # But ALWAYS run license check (even if setup is done)
42
+ SETUP_NEEDED=true
41
43
  if [ -f "$MARKER_FILE" ]; then
42
44
  STORED_VERSION=$(cat "$MARKER_FILE" 2>/dev/null | tr -d '[:space:]' || echo "")
43
45
  if [ "$STORED_VERSION" = "$TOOLKIT_VERSION" ]; then
44
- exit 0
46
+ SETUP_NEEDED=false
45
47
  fi
46
48
  fi
47
49
 
50
+ # ---------------------------------------------------------------------------
51
+ # License validation (marketplace gate)
52
+ # ---------------------------------------------------------------------------
53
+ # Check key: ARTHAI_LICENSE_KEY env → ~/.claude-agents/.license → ~/.arthai/license
54
+ WORKER_URL="https://license-worker.muddassar-shaikh.workers.dev"
55
+ KEY_FORMAT='^ARTH-[A-Z0-9]{4}-[A-Z0-9]{4}-[A-Z0-9]{4}-[A-Z0-9]{4}$'
56
+ LICENSE_CACHE="$PROJECT_DIR/.claude/.license-validated"
57
+ CACHE_TTL=86400
58
+
59
+ REAL_HOME=$(eval echo ~"$(id -un)")
60
+ LICENSE_KEY="${ARTHAI_LICENSE_KEY:-}"
61
+ [ -z "$LICENSE_KEY" ] && [ -f "$REAL_HOME/.claude-agents/.license" ] && LICENSE_KEY=$(cat "$REAL_HOME/.claude-agents/.license" 2>/dev/null | tr -d '[:space:]')
62
+ [ -z "$LICENSE_KEY" ] && [ -f "$REAL_HOME/.arthai/license" ] && LICENSE_KEY=$(cat "$REAL_HOME/.arthai/license" 2>/dev/null | tr -d '[:space:]')
63
+
64
+ if [ -z "$LICENSE_KEY" ]; then
65
+ echo "LICENSE REQUIRED — No license key found for marketplace plugin."
66
+ echo "Run: npx @arthai/agents activate ARTH-XXXX-XXXX-XXXX-XXXX"
67
+ echo "Get a key: productive@getarth.ai"
68
+ exit 0
69
+ fi
70
+
71
+ # Validate format
72
+ if ! echo "$LICENSE_KEY" | grep -qE "$KEY_FORMAT"; then
73
+ echo "LICENSE INVALID — Key format incorrect."
74
+ exit 0
75
+ fi
76
+
77
+ # Check cache (24h TTL)
78
+ LICENSE_VALID=false
79
+ NOW=$(date +%s)
80
+ if [ -f "$LICENSE_CACHE" ]; then
81
+ CACHED_TIME=$(cat "$LICENSE_CACHE" 2>/dev/null | tr -d '[:space:]' || echo "0")
82
+ ELAPSED=$((NOW - CACHED_TIME))
83
+ if [ "$ELAPSED" -ge 0 ] && [ "$ELAPSED" -lt "$CACHE_TTL" ]; then
84
+ LICENSE_VALID=true
85
+ fi
86
+ fi
87
+
88
+ if ! $LICENSE_VALID; then
89
+ # Call Worker — same logic as sync-agents.sh
90
+ PAYLOAD=$(printf '{"key":"%s"}' "$LICENSE_KEY")
91
+ RESPONSE=$(printf '%s' "$PAYLOAD" | curl -sf -m 5 -X POST "$WORKER_URL/validate" \
92
+ -H "Content-Type: application/json" --data "@-" 2>/dev/null) || RESPONSE=""
93
+
94
+ if [ -n "$RESPONSE" ]; then
95
+ VALID=$(echo "$RESPONSE" | python3 -c "import json,sys; print(json.load(sys.stdin).get('valid',False))" 2>/dev/null) || VALID="False"
96
+ if [ "$VALID" = "True" ]; then
97
+ LICENSE_VALID=true
98
+ mkdir -p "$PROJECT_DIR/.claude"
99
+ echo "$NOW" > "$LICENSE_CACHE"
100
+ else
101
+ # Definitive invalid — no fallback
102
+ echo "LICENSE INVALID — Key not recognized."
103
+ echo "Check your key or get one at productive@getarth.ai"
104
+ exit 0
105
+ fi
106
+ else
107
+ # Network error — allow gracefully (don't block on Worker outage)
108
+ LICENSE_VALID=true
109
+ fi
110
+ fi
111
+
112
+ # ---------------------------------------------------------------------------
113
+ # Project setup (only runs if license is valid AND setup is needed)
114
+ # ---------------------------------------------------------------------------
115
+
116
+ if ! $SETUP_NEEDED; then
117
+ exit 0
118
+ fi
119
+
48
120
  CLAUDE_MD="$PROJECT_DIR/CLAUDE.md"
49
121
  GITIGNORE="$PROJECT_DIR/.gitignore"
50
122
 
package/hook-defs.json CHANGED
@@ -123,7 +123,8 @@
123
123
  "project-setup": {
124
124
  "script": "project-setup.sh",
125
125
  "entries": [
126
- {"event": "SessionStart", "matcher": "", "timeout": 10}
126
+ {"event": "SessionStart", "matcher": "", "timeout": 10},
127
+ {"event": "UserPromptSubmit", "matcher": "", "timeout": 5}
127
128
  ]
128
129
  },
129
130
  "escalation-guard": {
@@ -37,14 +37,86 @@ MANAGED_START="<!-- >>> claude-agents toolkit (DO NOT EDIT THIS BLOCK) >>> -->"
37
37
  MANAGED_END="<!-- <<< claude-agents toolkit <<< -->"
38
38
  GITIGNORE_START="# >>> claude-agents managed (DO NOT EDIT THIS BLOCK) >>>"
39
39
 
40
- # Check marker file — skip if current version is already set up
40
+ # Check marker file — skip SETUP if current version is already done
41
+ # But ALWAYS run license check (even if setup is done)
42
+ SETUP_NEEDED=true
41
43
  if [ -f "$MARKER_FILE" ]; then
42
44
  STORED_VERSION=$(cat "$MARKER_FILE" 2>/dev/null | tr -d '[:space:]' || echo "")
43
45
  if [ "$STORED_VERSION" = "$TOOLKIT_VERSION" ]; then
44
- exit 0
46
+ SETUP_NEEDED=false
45
47
  fi
46
48
  fi
47
49
 
50
+ # ---------------------------------------------------------------------------
51
+ # License validation (marketplace gate)
52
+ # ---------------------------------------------------------------------------
53
+ # Check key: ARTHAI_LICENSE_KEY env → ~/.claude-agents/.license → ~/.arthai/license
54
+ WORKER_URL="https://license-worker.muddassar-shaikh.workers.dev"
55
+ KEY_FORMAT='^ARTH-[A-Z0-9]{4}-[A-Z0-9]{4}-[A-Z0-9]{4}-[A-Z0-9]{4}$'
56
+ LICENSE_CACHE="$PROJECT_DIR/.claude/.license-validated"
57
+ CACHE_TTL=86400
58
+
59
+ REAL_HOME=$(eval echo ~"$(id -un)")
60
+ LICENSE_KEY="${ARTHAI_LICENSE_KEY:-}"
61
+ [ -z "$LICENSE_KEY" ] && [ -f "$REAL_HOME/.claude-agents/.license" ] && LICENSE_KEY=$(cat "$REAL_HOME/.claude-agents/.license" 2>/dev/null | tr -d '[:space:]')
62
+ [ -z "$LICENSE_KEY" ] && [ -f "$REAL_HOME/.arthai/license" ] && LICENSE_KEY=$(cat "$REAL_HOME/.arthai/license" 2>/dev/null | tr -d '[:space:]')
63
+
64
+ if [ -z "$LICENSE_KEY" ]; then
65
+ echo "LICENSE REQUIRED — No license key found for marketplace plugin."
66
+ echo "Run: npx @arthai/agents activate ARTH-XXXX-XXXX-XXXX-XXXX"
67
+ echo "Get a key: productive@getarth.ai"
68
+ exit 0
69
+ fi
70
+
71
+ # Validate format
72
+ if ! echo "$LICENSE_KEY" | grep -qE "$KEY_FORMAT"; then
73
+ echo "LICENSE INVALID — Key format incorrect."
74
+ exit 0
75
+ fi
76
+
77
+ # Check cache (24h TTL)
78
+ LICENSE_VALID=false
79
+ NOW=$(date +%s)
80
+ if [ -f "$LICENSE_CACHE" ]; then
81
+ CACHED_TIME=$(cat "$LICENSE_CACHE" 2>/dev/null | tr -d '[:space:]' || echo "0")
82
+ ELAPSED=$((NOW - CACHED_TIME))
83
+ if [ "$ELAPSED" -ge 0 ] && [ "$ELAPSED" -lt "$CACHE_TTL" ]; then
84
+ LICENSE_VALID=true
85
+ fi
86
+ fi
87
+
88
+ if ! $LICENSE_VALID; then
89
+ # Call Worker — same logic as sync-agents.sh
90
+ PAYLOAD=$(printf '{"key":"%s"}' "$LICENSE_KEY")
91
+ RESPONSE=$(printf '%s' "$PAYLOAD" | curl -sf -m 5 -X POST "$WORKER_URL/validate" \
92
+ -H "Content-Type: application/json" --data "@-" 2>/dev/null) || RESPONSE=""
93
+
94
+ if [ -n "$RESPONSE" ]; then
95
+ VALID=$(echo "$RESPONSE" | python3 -c "import json,sys; print(json.load(sys.stdin).get('valid',False))" 2>/dev/null) || VALID="False"
96
+ if [ "$VALID" = "True" ]; then
97
+ LICENSE_VALID=true
98
+ mkdir -p "$PROJECT_DIR/.claude"
99
+ echo "$NOW" > "$LICENSE_CACHE"
100
+ else
101
+ # Definitive invalid — no fallback
102
+ echo "LICENSE INVALID — Key not recognized."
103
+ echo "Check your key or get one at productive@getarth.ai"
104
+ exit 0
105
+ fi
106
+ else
107
+ # Network error — allow gracefully (don't block on Worker outage)
108
+ LICENSE_VALID=true
109
+ fi
110
+ fi
111
+
112
+ # ---------------------------------------------------------------------------
113
+ # Project setup (only runs if license is valid AND setup is needed)
114
+ # ---------------------------------------------------------------------------
115
+
116
+ if ! $SETUP_NEEDED; then
117
+ exit 0
118
+ fi
119
+
48
120
  CLAUDE_MD="$PROJECT_DIR/CLAUDE.md"
49
121
  GITIGNORE="$PROJECT_DIR/.gitignore"
50
122
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@arthai/agents",
3
- "version": "1.0.9",
3
+ "version": "1.0.11",
4
4
  "description": "AI-powered development toolkit for Claude Code — agents, skills, and hooks",
5
5
  "bin": {
6
6
  "arthai": "bin/cli.js"