@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
package/VERSION CHANGED
@@ -1 +1 @@
1
- 1.0.9
1
+ 1.0.11
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "canvas",
3
3
  "description": "Design-driven development — adversarial design critique + frontend",
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
@@ -11,6 +11,18 @@
11
11
  }
12
12
  ]
13
13
  }
14
+ ],
15
+ "UserPromptSubmit": [
16
+ {
17
+ "matcher": "",
18
+ "hooks": [
19
+ {
20
+ "type": "command",
21
+ "command": "${CLAUDE_PLUGIN_ROOT}/hooks/project-setup.sh",
22
+ "timeout": 5
23
+ }
24
+ ]
25
+ }
14
26
  ]
15
27
  }
16
28
  }
@@ -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": "compass",
3
3
  "description": "Product strategy — PM, GTM, user research, content strategy",
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
@@ -11,6 +11,18 @@
11
11
  }
12
12
  ]
13
13
  }
14
+ ],
15
+ "UserPromptSubmit": [
16
+ {
17
+ "matcher": "",
18
+ "hooks": [
19
+ {
20
+ "type": "command",
21
+ "command": "${CLAUDE_PLUGIN_ROOT}/hooks/project-setup.sh",
22
+ "timeout": 5
23
+ }
24
+ ]
25
+ }
14
26
  ]
15
27
  }
16
28
  }
@@ -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": "counsel",
3
3
  "description": "AI consulting toolkit — client discovery, proposals, deliverables",
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
@@ -22,6 +22,18 @@
22
22
  ]
23
23
  }
24
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
+ }
36
+ ],
25
37
  "PostToolUse": [
26
38
  {
27
39
  "matcher": "Bash",
@@ -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": "cruise",
3
3
  "description": "Autopilot mode — autonomous task execution (requires forge+scalpel+sentinel)",
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
@@ -11,6 +11,18 @@
11
11
  }
12
12
  ]
13
13
  }
14
+ ],
15
+ "UserPromptSubmit": [
16
+ {
17
+ "matcher": "",
18
+ "hooks": [
19
+ {
20
+ "type": "command",
21
+ "command": "${CLAUDE_PLUGIN_ROOT}/hooks/project-setup.sh",
22
+ "timeout": 5
23
+ }
24
+ ]
25
+ }
14
26
  ]
15
27
  }
16
28
  }
@@ -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": "forge",
3
3
  "description": "Full development workflow — plan, build, test, ship",
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
@@ -13,6 +13,16 @@
13
13
  }
14
14
  ],
15
15
  "UserPromptSubmit": [
16
+ {
17
+ "matcher": "",
18
+ "hooks": [
19
+ {
20
+ "type": "command",
21
+ "command": "${CLAUDE_PLUGIN_ROOT}/hooks/project-setup.sh",
22
+ "timeout": 5
23
+ }
24
+ ]
25
+ },
16
26
  {
17
27
  "matcher": "",
18
28
  "hooks": [
@@ -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": "prime",
3
3
  "description": "Everything — all agents, skills, and hooks in one plugin",
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