@arthai/agents 1.0.9 → 1.0.10

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 (36) 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/project-setup.sh +66 -0
  5. package/dist/plugins/compass/.claude-plugin/plugin.json +1 -1
  6. package/dist/plugins/compass/VERSION +1 -1
  7. package/dist/plugins/compass/hooks/project-setup.sh +66 -0
  8. package/dist/plugins/counsel/.claude-plugin/plugin.json +1 -1
  9. package/dist/plugins/counsel/VERSION +1 -1
  10. package/dist/plugins/counsel/hooks/project-setup.sh +66 -0
  11. package/dist/plugins/cruise/.claude-plugin/plugin.json +1 -1
  12. package/dist/plugins/cruise/VERSION +1 -1
  13. package/dist/plugins/cruise/hooks/project-setup.sh +66 -0
  14. package/dist/plugins/forge/.claude-plugin/plugin.json +1 -1
  15. package/dist/plugins/forge/VERSION +1 -1
  16. package/dist/plugins/forge/hooks/project-setup.sh +66 -0
  17. package/dist/plugins/prime/.claude-plugin/plugin.json +1 -1
  18. package/dist/plugins/prime/VERSION +1 -1
  19. package/dist/plugins/prime/hooks/project-setup.sh +66 -0
  20. package/dist/plugins/prism/.claude-plugin/plugin.json +1 -1
  21. package/dist/plugins/prism/VERSION +1 -1
  22. package/dist/plugins/prism/hooks/project-setup.sh +66 -0
  23. package/dist/plugins/scalpel/.claude-plugin/plugin.json +1 -1
  24. package/dist/plugins/scalpel/VERSION +1 -1
  25. package/dist/plugins/scalpel/hooks/project-setup.sh +66 -0
  26. package/dist/plugins/sentinel/.claude-plugin/plugin.json +1 -1
  27. package/dist/plugins/sentinel/VERSION +1 -1
  28. package/dist/plugins/sentinel/hooks/project-setup.sh +66 -0
  29. package/dist/plugins/shield/.claude-plugin/plugin.json +1 -1
  30. package/dist/plugins/shield/VERSION +1 -1
  31. package/dist/plugins/shield/hooks/project-setup.sh +66 -0
  32. package/dist/plugins/spark/.claude-plugin/plugin.json +1 -1
  33. package/dist/plugins/spark/VERSION +1 -1
  34. package/dist/plugins/spark/hooks/project-setup.sh +66 -0
  35. package/hooks/project-setup.sh +66 -0
  36. package/package.json +1 -1
package/VERSION CHANGED
@@ -1 +1 @@
1
- 1.0.9
1
+ 1.0.10
@@ -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.10",
5
5
  "author": {
6
6
  "name": "Arth AI"
7
7
  }
@@ -1 +1 @@
1
- 1.0.9
1
+ 1.0.10
@@ -45,6 +45,72 @@ if [ -f "$MARKER_FILE" ]; then
45
45
  fi
46
46
  fi
47
47
 
48
+ # ---------------------------------------------------------------------------
49
+ # License validation (marketplace gate)
50
+ # ---------------------------------------------------------------------------
51
+ # Check key: ARTHAI_LICENSE_KEY env → ~/.claude-agents/.license → ~/.arthai/license
52
+ WORKER_URL="https://license-worker.muddassar-shaikh.workers.dev"
53
+ KEY_FORMAT='^ARTH-[A-Z0-9]{4}-[A-Z0-9]{4}-[A-Z0-9]{4}-[A-Z0-9]{4}$'
54
+ LICENSE_CACHE="$PROJECT_DIR/.claude/.license-validated"
55
+ CACHE_TTL=86400
56
+
57
+ REAL_HOME=$(eval echo ~"$(id -un)")
58
+ LICENSE_KEY="${ARTHAI_LICENSE_KEY:-}"
59
+ [ -z "$LICENSE_KEY" ] && [ -f "$REAL_HOME/.claude-agents/.license" ] && LICENSE_KEY=$(cat "$REAL_HOME/.claude-agents/.license" 2>/dev/null | tr -d '[:space:]')
60
+ [ -z "$LICENSE_KEY" ] && [ -f "$REAL_HOME/.arthai/license" ] && LICENSE_KEY=$(cat "$REAL_HOME/.arthai/license" 2>/dev/null | tr -d '[:space:]')
61
+
62
+ if [ -z "$LICENSE_KEY" ]; then
63
+ echo "LICENSE REQUIRED — No license key found for marketplace plugin."
64
+ echo "Run: npx @arthai/agents activate ARTH-XXXX-XXXX-XXXX-XXXX"
65
+ echo "Get a key: productive@getarth.ai"
66
+ exit 0
67
+ fi
68
+
69
+ # Validate format
70
+ if ! echo "$LICENSE_KEY" | grep -qE "$KEY_FORMAT"; then
71
+ echo "LICENSE INVALID — Key format incorrect."
72
+ exit 0
73
+ fi
74
+
75
+ # Check cache (24h TTL)
76
+ LICENSE_VALID=false
77
+ NOW=$(date +%s)
78
+ if [ -f "$LICENSE_CACHE" ]; then
79
+ CACHED_TIME=$(cat "$LICENSE_CACHE" 2>/dev/null | tr -d '[:space:]' || echo "0")
80
+ ELAPSED=$((NOW - CACHED_TIME))
81
+ if [ "$ELAPSED" -ge 0 ] && [ "$ELAPSED" -lt "$CACHE_TTL" ]; then
82
+ LICENSE_VALID=true
83
+ fi
84
+ fi
85
+
86
+ if ! $LICENSE_VALID; then
87
+ # Call Worker — same logic as sync-agents.sh
88
+ PAYLOAD=$(printf '{"key":"%s"}' "$LICENSE_KEY")
89
+ RESPONSE=$(printf '%s' "$PAYLOAD" | curl -sf -m 5 -X POST "$WORKER_URL/validate" \
90
+ -H "Content-Type: application/json" --data "@-" 2>/dev/null) || RESPONSE=""
91
+
92
+ if [ -n "$RESPONSE" ]; then
93
+ VALID=$(echo "$RESPONSE" | python3 -c "import json,sys; print(json.load(sys.stdin).get('valid',False))" 2>/dev/null) || VALID="False"
94
+ if [ "$VALID" = "True" ]; then
95
+ LICENSE_VALID=true
96
+ mkdir -p "$PROJECT_DIR/.claude"
97
+ echo "$NOW" > "$LICENSE_CACHE"
98
+ else
99
+ # Definitive invalid — no fallback
100
+ echo "LICENSE INVALID — Key not recognized."
101
+ echo "Check your key or get one at productive@getarth.ai"
102
+ exit 0
103
+ fi
104
+ else
105
+ # Network error — allow gracefully (don't block on Worker outage)
106
+ LICENSE_VALID=true
107
+ fi
108
+ fi
109
+
110
+ # ---------------------------------------------------------------------------
111
+ # Project setup (only runs if license is valid)
112
+ # ---------------------------------------------------------------------------
113
+
48
114
  CLAUDE_MD="$PROJECT_DIR/CLAUDE.md"
49
115
  GITIGNORE="$PROJECT_DIR/.gitignore"
50
116
 
@@ -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.10",
5
5
  "author": {
6
6
  "name": "Arth AI"
7
7
  }
@@ -1 +1 @@
1
- 1.0.9
1
+ 1.0.10
@@ -45,6 +45,72 @@ if [ -f "$MARKER_FILE" ]; then
45
45
  fi
46
46
  fi
47
47
 
48
+ # ---------------------------------------------------------------------------
49
+ # License validation (marketplace gate)
50
+ # ---------------------------------------------------------------------------
51
+ # Check key: ARTHAI_LICENSE_KEY env → ~/.claude-agents/.license → ~/.arthai/license
52
+ WORKER_URL="https://license-worker.muddassar-shaikh.workers.dev"
53
+ KEY_FORMAT='^ARTH-[A-Z0-9]{4}-[A-Z0-9]{4}-[A-Z0-9]{4}-[A-Z0-9]{4}$'
54
+ LICENSE_CACHE="$PROJECT_DIR/.claude/.license-validated"
55
+ CACHE_TTL=86400
56
+
57
+ REAL_HOME=$(eval echo ~"$(id -un)")
58
+ LICENSE_KEY="${ARTHAI_LICENSE_KEY:-}"
59
+ [ -z "$LICENSE_KEY" ] && [ -f "$REAL_HOME/.claude-agents/.license" ] && LICENSE_KEY=$(cat "$REAL_HOME/.claude-agents/.license" 2>/dev/null | tr -d '[:space:]')
60
+ [ -z "$LICENSE_KEY" ] && [ -f "$REAL_HOME/.arthai/license" ] && LICENSE_KEY=$(cat "$REAL_HOME/.arthai/license" 2>/dev/null | tr -d '[:space:]')
61
+
62
+ if [ -z "$LICENSE_KEY" ]; then
63
+ echo "LICENSE REQUIRED — No license key found for marketplace plugin."
64
+ echo "Run: npx @arthai/agents activate ARTH-XXXX-XXXX-XXXX-XXXX"
65
+ echo "Get a key: productive@getarth.ai"
66
+ exit 0
67
+ fi
68
+
69
+ # Validate format
70
+ if ! echo "$LICENSE_KEY" | grep -qE "$KEY_FORMAT"; then
71
+ echo "LICENSE INVALID — Key format incorrect."
72
+ exit 0
73
+ fi
74
+
75
+ # Check cache (24h TTL)
76
+ LICENSE_VALID=false
77
+ NOW=$(date +%s)
78
+ if [ -f "$LICENSE_CACHE" ]; then
79
+ CACHED_TIME=$(cat "$LICENSE_CACHE" 2>/dev/null | tr -d '[:space:]' || echo "0")
80
+ ELAPSED=$((NOW - CACHED_TIME))
81
+ if [ "$ELAPSED" -ge 0 ] && [ "$ELAPSED" -lt "$CACHE_TTL" ]; then
82
+ LICENSE_VALID=true
83
+ fi
84
+ fi
85
+
86
+ if ! $LICENSE_VALID; then
87
+ # Call Worker — same logic as sync-agents.sh
88
+ PAYLOAD=$(printf '{"key":"%s"}' "$LICENSE_KEY")
89
+ RESPONSE=$(printf '%s' "$PAYLOAD" | curl -sf -m 5 -X POST "$WORKER_URL/validate" \
90
+ -H "Content-Type: application/json" --data "@-" 2>/dev/null) || RESPONSE=""
91
+
92
+ if [ -n "$RESPONSE" ]; then
93
+ VALID=$(echo "$RESPONSE" | python3 -c "import json,sys; print(json.load(sys.stdin).get('valid',False))" 2>/dev/null) || VALID="False"
94
+ if [ "$VALID" = "True" ]; then
95
+ LICENSE_VALID=true
96
+ mkdir -p "$PROJECT_DIR/.claude"
97
+ echo "$NOW" > "$LICENSE_CACHE"
98
+ else
99
+ # Definitive invalid — no fallback
100
+ echo "LICENSE INVALID — Key not recognized."
101
+ echo "Check your key or get one at productive@getarth.ai"
102
+ exit 0
103
+ fi
104
+ else
105
+ # Network error — allow gracefully (don't block on Worker outage)
106
+ LICENSE_VALID=true
107
+ fi
108
+ fi
109
+
110
+ # ---------------------------------------------------------------------------
111
+ # Project setup (only runs if license is valid)
112
+ # ---------------------------------------------------------------------------
113
+
48
114
  CLAUDE_MD="$PROJECT_DIR/CLAUDE.md"
49
115
  GITIGNORE="$PROJECT_DIR/.gitignore"
50
116
 
@@ -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.10",
5
5
  "author": {
6
6
  "name": "Arth AI"
7
7
  }
@@ -1 +1 @@
1
- 1.0.9
1
+ 1.0.10
@@ -45,6 +45,72 @@ if [ -f "$MARKER_FILE" ]; then
45
45
  fi
46
46
  fi
47
47
 
48
+ # ---------------------------------------------------------------------------
49
+ # License validation (marketplace gate)
50
+ # ---------------------------------------------------------------------------
51
+ # Check key: ARTHAI_LICENSE_KEY env → ~/.claude-agents/.license → ~/.arthai/license
52
+ WORKER_URL="https://license-worker.muddassar-shaikh.workers.dev"
53
+ KEY_FORMAT='^ARTH-[A-Z0-9]{4}-[A-Z0-9]{4}-[A-Z0-9]{4}-[A-Z0-9]{4}$'
54
+ LICENSE_CACHE="$PROJECT_DIR/.claude/.license-validated"
55
+ CACHE_TTL=86400
56
+
57
+ REAL_HOME=$(eval echo ~"$(id -un)")
58
+ LICENSE_KEY="${ARTHAI_LICENSE_KEY:-}"
59
+ [ -z "$LICENSE_KEY" ] && [ -f "$REAL_HOME/.claude-agents/.license" ] && LICENSE_KEY=$(cat "$REAL_HOME/.claude-agents/.license" 2>/dev/null | tr -d '[:space:]')
60
+ [ -z "$LICENSE_KEY" ] && [ -f "$REAL_HOME/.arthai/license" ] && LICENSE_KEY=$(cat "$REAL_HOME/.arthai/license" 2>/dev/null | tr -d '[:space:]')
61
+
62
+ if [ -z "$LICENSE_KEY" ]; then
63
+ echo "LICENSE REQUIRED — No license key found for marketplace plugin."
64
+ echo "Run: npx @arthai/agents activate ARTH-XXXX-XXXX-XXXX-XXXX"
65
+ echo "Get a key: productive@getarth.ai"
66
+ exit 0
67
+ fi
68
+
69
+ # Validate format
70
+ if ! echo "$LICENSE_KEY" | grep -qE "$KEY_FORMAT"; then
71
+ echo "LICENSE INVALID — Key format incorrect."
72
+ exit 0
73
+ fi
74
+
75
+ # Check cache (24h TTL)
76
+ LICENSE_VALID=false
77
+ NOW=$(date +%s)
78
+ if [ -f "$LICENSE_CACHE" ]; then
79
+ CACHED_TIME=$(cat "$LICENSE_CACHE" 2>/dev/null | tr -d '[:space:]' || echo "0")
80
+ ELAPSED=$((NOW - CACHED_TIME))
81
+ if [ "$ELAPSED" -ge 0 ] && [ "$ELAPSED" -lt "$CACHE_TTL" ]; then
82
+ LICENSE_VALID=true
83
+ fi
84
+ fi
85
+
86
+ if ! $LICENSE_VALID; then
87
+ # Call Worker — same logic as sync-agents.sh
88
+ PAYLOAD=$(printf '{"key":"%s"}' "$LICENSE_KEY")
89
+ RESPONSE=$(printf '%s' "$PAYLOAD" | curl -sf -m 5 -X POST "$WORKER_URL/validate" \
90
+ -H "Content-Type: application/json" --data "@-" 2>/dev/null) || RESPONSE=""
91
+
92
+ if [ -n "$RESPONSE" ]; then
93
+ VALID=$(echo "$RESPONSE" | python3 -c "import json,sys; print(json.load(sys.stdin).get('valid',False))" 2>/dev/null) || VALID="False"
94
+ if [ "$VALID" = "True" ]; then
95
+ LICENSE_VALID=true
96
+ mkdir -p "$PROJECT_DIR/.claude"
97
+ echo "$NOW" > "$LICENSE_CACHE"
98
+ else
99
+ # Definitive invalid — no fallback
100
+ echo "LICENSE INVALID — Key not recognized."
101
+ echo "Check your key or get one at productive@getarth.ai"
102
+ exit 0
103
+ fi
104
+ else
105
+ # Network error — allow gracefully (don't block on Worker outage)
106
+ LICENSE_VALID=true
107
+ fi
108
+ fi
109
+
110
+ # ---------------------------------------------------------------------------
111
+ # Project setup (only runs if license is valid)
112
+ # ---------------------------------------------------------------------------
113
+
48
114
  CLAUDE_MD="$PROJECT_DIR/CLAUDE.md"
49
115
  GITIGNORE="$PROJECT_DIR/.gitignore"
50
116
 
@@ -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.10",
5
5
  "author": {
6
6
  "name": "Arth AI"
7
7
  }
@@ -1 +1 @@
1
- 1.0.9
1
+ 1.0.10
@@ -45,6 +45,72 @@ if [ -f "$MARKER_FILE" ]; then
45
45
  fi
46
46
  fi
47
47
 
48
+ # ---------------------------------------------------------------------------
49
+ # License validation (marketplace gate)
50
+ # ---------------------------------------------------------------------------
51
+ # Check key: ARTHAI_LICENSE_KEY env → ~/.claude-agents/.license → ~/.arthai/license
52
+ WORKER_URL="https://license-worker.muddassar-shaikh.workers.dev"
53
+ KEY_FORMAT='^ARTH-[A-Z0-9]{4}-[A-Z0-9]{4}-[A-Z0-9]{4}-[A-Z0-9]{4}$'
54
+ LICENSE_CACHE="$PROJECT_DIR/.claude/.license-validated"
55
+ CACHE_TTL=86400
56
+
57
+ REAL_HOME=$(eval echo ~"$(id -un)")
58
+ LICENSE_KEY="${ARTHAI_LICENSE_KEY:-}"
59
+ [ -z "$LICENSE_KEY" ] && [ -f "$REAL_HOME/.claude-agents/.license" ] && LICENSE_KEY=$(cat "$REAL_HOME/.claude-agents/.license" 2>/dev/null | tr -d '[:space:]')
60
+ [ -z "$LICENSE_KEY" ] && [ -f "$REAL_HOME/.arthai/license" ] && LICENSE_KEY=$(cat "$REAL_HOME/.arthai/license" 2>/dev/null | tr -d '[:space:]')
61
+
62
+ if [ -z "$LICENSE_KEY" ]; then
63
+ echo "LICENSE REQUIRED — No license key found for marketplace plugin."
64
+ echo "Run: npx @arthai/agents activate ARTH-XXXX-XXXX-XXXX-XXXX"
65
+ echo "Get a key: productive@getarth.ai"
66
+ exit 0
67
+ fi
68
+
69
+ # Validate format
70
+ if ! echo "$LICENSE_KEY" | grep -qE "$KEY_FORMAT"; then
71
+ echo "LICENSE INVALID — Key format incorrect."
72
+ exit 0
73
+ fi
74
+
75
+ # Check cache (24h TTL)
76
+ LICENSE_VALID=false
77
+ NOW=$(date +%s)
78
+ if [ -f "$LICENSE_CACHE" ]; then
79
+ CACHED_TIME=$(cat "$LICENSE_CACHE" 2>/dev/null | tr -d '[:space:]' || echo "0")
80
+ ELAPSED=$((NOW - CACHED_TIME))
81
+ if [ "$ELAPSED" -ge 0 ] && [ "$ELAPSED" -lt "$CACHE_TTL" ]; then
82
+ LICENSE_VALID=true
83
+ fi
84
+ fi
85
+
86
+ if ! $LICENSE_VALID; then
87
+ # Call Worker — same logic as sync-agents.sh
88
+ PAYLOAD=$(printf '{"key":"%s"}' "$LICENSE_KEY")
89
+ RESPONSE=$(printf '%s' "$PAYLOAD" | curl -sf -m 5 -X POST "$WORKER_URL/validate" \
90
+ -H "Content-Type: application/json" --data "@-" 2>/dev/null) || RESPONSE=""
91
+
92
+ if [ -n "$RESPONSE" ]; then
93
+ VALID=$(echo "$RESPONSE" | python3 -c "import json,sys; print(json.load(sys.stdin).get('valid',False))" 2>/dev/null) || VALID="False"
94
+ if [ "$VALID" = "True" ]; then
95
+ LICENSE_VALID=true
96
+ mkdir -p "$PROJECT_DIR/.claude"
97
+ echo "$NOW" > "$LICENSE_CACHE"
98
+ else
99
+ # Definitive invalid — no fallback
100
+ echo "LICENSE INVALID — Key not recognized."
101
+ echo "Check your key or get one at productive@getarth.ai"
102
+ exit 0
103
+ fi
104
+ else
105
+ # Network error — allow gracefully (don't block on Worker outage)
106
+ LICENSE_VALID=true
107
+ fi
108
+ fi
109
+
110
+ # ---------------------------------------------------------------------------
111
+ # Project setup (only runs if license is valid)
112
+ # ---------------------------------------------------------------------------
113
+
48
114
  CLAUDE_MD="$PROJECT_DIR/CLAUDE.md"
49
115
  GITIGNORE="$PROJECT_DIR/.gitignore"
50
116
 
@@ -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.10",
5
5
  "author": {
6
6
  "name": "Arth AI"
7
7
  }
@@ -1 +1 @@
1
- 1.0.9
1
+ 1.0.10
@@ -45,6 +45,72 @@ if [ -f "$MARKER_FILE" ]; then
45
45
  fi
46
46
  fi
47
47
 
48
+ # ---------------------------------------------------------------------------
49
+ # License validation (marketplace gate)
50
+ # ---------------------------------------------------------------------------
51
+ # Check key: ARTHAI_LICENSE_KEY env → ~/.claude-agents/.license → ~/.arthai/license
52
+ WORKER_URL="https://license-worker.muddassar-shaikh.workers.dev"
53
+ KEY_FORMAT='^ARTH-[A-Z0-9]{4}-[A-Z0-9]{4}-[A-Z0-9]{4}-[A-Z0-9]{4}$'
54
+ LICENSE_CACHE="$PROJECT_DIR/.claude/.license-validated"
55
+ CACHE_TTL=86400
56
+
57
+ REAL_HOME=$(eval echo ~"$(id -un)")
58
+ LICENSE_KEY="${ARTHAI_LICENSE_KEY:-}"
59
+ [ -z "$LICENSE_KEY" ] && [ -f "$REAL_HOME/.claude-agents/.license" ] && LICENSE_KEY=$(cat "$REAL_HOME/.claude-agents/.license" 2>/dev/null | tr -d '[:space:]')
60
+ [ -z "$LICENSE_KEY" ] && [ -f "$REAL_HOME/.arthai/license" ] && LICENSE_KEY=$(cat "$REAL_HOME/.arthai/license" 2>/dev/null | tr -d '[:space:]')
61
+
62
+ if [ -z "$LICENSE_KEY" ]; then
63
+ echo "LICENSE REQUIRED — No license key found for marketplace plugin."
64
+ echo "Run: npx @arthai/agents activate ARTH-XXXX-XXXX-XXXX-XXXX"
65
+ echo "Get a key: productive@getarth.ai"
66
+ exit 0
67
+ fi
68
+
69
+ # Validate format
70
+ if ! echo "$LICENSE_KEY" | grep -qE "$KEY_FORMAT"; then
71
+ echo "LICENSE INVALID — Key format incorrect."
72
+ exit 0
73
+ fi
74
+
75
+ # Check cache (24h TTL)
76
+ LICENSE_VALID=false
77
+ NOW=$(date +%s)
78
+ if [ -f "$LICENSE_CACHE" ]; then
79
+ CACHED_TIME=$(cat "$LICENSE_CACHE" 2>/dev/null | tr -d '[:space:]' || echo "0")
80
+ ELAPSED=$((NOW - CACHED_TIME))
81
+ if [ "$ELAPSED" -ge 0 ] && [ "$ELAPSED" -lt "$CACHE_TTL" ]; then
82
+ LICENSE_VALID=true
83
+ fi
84
+ fi
85
+
86
+ if ! $LICENSE_VALID; then
87
+ # Call Worker — same logic as sync-agents.sh
88
+ PAYLOAD=$(printf '{"key":"%s"}' "$LICENSE_KEY")
89
+ RESPONSE=$(printf '%s' "$PAYLOAD" | curl -sf -m 5 -X POST "$WORKER_URL/validate" \
90
+ -H "Content-Type: application/json" --data "@-" 2>/dev/null) || RESPONSE=""
91
+
92
+ if [ -n "$RESPONSE" ]; then
93
+ VALID=$(echo "$RESPONSE" | python3 -c "import json,sys; print(json.load(sys.stdin).get('valid',False))" 2>/dev/null) || VALID="False"
94
+ if [ "$VALID" = "True" ]; then
95
+ LICENSE_VALID=true
96
+ mkdir -p "$PROJECT_DIR/.claude"
97
+ echo "$NOW" > "$LICENSE_CACHE"
98
+ else
99
+ # Definitive invalid — no fallback
100
+ echo "LICENSE INVALID — Key not recognized."
101
+ echo "Check your key or get one at productive@getarth.ai"
102
+ exit 0
103
+ fi
104
+ else
105
+ # Network error — allow gracefully (don't block on Worker outage)
106
+ LICENSE_VALID=true
107
+ fi
108
+ fi
109
+
110
+ # ---------------------------------------------------------------------------
111
+ # Project setup (only runs if license is valid)
112
+ # ---------------------------------------------------------------------------
113
+
48
114
  CLAUDE_MD="$PROJECT_DIR/CLAUDE.md"
49
115
  GITIGNORE="$PROJECT_DIR/.gitignore"
50
116
 
@@ -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.10",
5
5
  "author": {
6
6
  "name": "Arth AI"
7
7
  }
@@ -1 +1 @@
1
- 1.0.9
1
+ 1.0.10
@@ -45,6 +45,72 @@ if [ -f "$MARKER_FILE" ]; then
45
45
  fi
46
46
  fi
47
47
 
48
+ # ---------------------------------------------------------------------------
49
+ # License validation (marketplace gate)
50
+ # ---------------------------------------------------------------------------
51
+ # Check key: ARTHAI_LICENSE_KEY env → ~/.claude-agents/.license → ~/.arthai/license
52
+ WORKER_URL="https://license-worker.muddassar-shaikh.workers.dev"
53
+ KEY_FORMAT='^ARTH-[A-Z0-9]{4}-[A-Z0-9]{4}-[A-Z0-9]{4}-[A-Z0-9]{4}$'
54
+ LICENSE_CACHE="$PROJECT_DIR/.claude/.license-validated"
55
+ CACHE_TTL=86400
56
+
57
+ REAL_HOME=$(eval echo ~"$(id -un)")
58
+ LICENSE_KEY="${ARTHAI_LICENSE_KEY:-}"
59
+ [ -z "$LICENSE_KEY" ] && [ -f "$REAL_HOME/.claude-agents/.license" ] && LICENSE_KEY=$(cat "$REAL_HOME/.claude-agents/.license" 2>/dev/null | tr -d '[:space:]')
60
+ [ -z "$LICENSE_KEY" ] && [ -f "$REAL_HOME/.arthai/license" ] && LICENSE_KEY=$(cat "$REAL_HOME/.arthai/license" 2>/dev/null | tr -d '[:space:]')
61
+
62
+ if [ -z "$LICENSE_KEY" ]; then
63
+ echo "LICENSE REQUIRED — No license key found for marketplace plugin."
64
+ echo "Run: npx @arthai/agents activate ARTH-XXXX-XXXX-XXXX-XXXX"
65
+ echo "Get a key: productive@getarth.ai"
66
+ exit 0
67
+ fi
68
+
69
+ # Validate format
70
+ if ! echo "$LICENSE_KEY" | grep -qE "$KEY_FORMAT"; then
71
+ echo "LICENSE INVALID — Key format incorrect."
72
+ exit 0
73
+ fi
74
+
75
+ # Check cache (24h TTL)
76
+ LICENSE_VALID=false
77
+ NOW=$(date +%s)
78
+ if [ -f "$LICENSE_CACHE" ]; then
79
+ CACHED_TIME=$(cat "$LICENSE_CACHE" 2>/dev/null | tr -d '[:space:]' || echo "0")
80
+ ELAPSED=$((NOW - CACHED_TIME))
81
+ if [ "$ELAPSED" -ge 0 ] && [ "$ELAPSED" -lt "$CACHE_TTL" ]; then
82
+ LICENSE_VALID=true
83
+ fi
84
+ fi
85
+
86
+ if ! $LICENSE_VALID; then
87
+ # Call Worker — same logic as sync-agents.sh
88
+ PAYLOAD=$(printf '{"key":"%s"}' "$LICENSE_KEY")
89
+ RESPONSE=$(printf '%s' "$PAYLOAD" | curl -sf -m 5 -X POST "$WORKER_URL/validate" \
90
+ -H "Content-Type: application/json" --data "@-" 2>/dev/null) || RESPONSE=""
91
+
92
+ if [ -n "$RESPONSE" ]; then
93
+ VALID=$(echo "$RESPONSE" | python3 -c "import json,sys; print(json.load(sys.stdin).get('valid',False))" 2>/dev/null) || VALID="False"
94
+ if [ "$VALID" = "True" ]; then
95
+ LICENSE_VALID=true
96
+ mkdir -p "$PROJECT_DIR/.claude"
97
+ echo "$NOW" > "$LICENSE_CACHE"
98
+ else
99
+ # Definitive invalid — no fallback
100
+ echo "LICENSE INVALID — Key not recognized."
101
+ echo "Check your key or get one at productive@getarth.ai"
102
+ exit 0
103
+ fi
104
+ else
105
+ # Network error — allow gracefully (don't block on Worker outage)
106
+ LICENSE_VALID=true
107
+ fi
108
+ fi
109
+
110
+ # ---------------------------------------------------------------------------
111
+ # Project setup (only runs if license is valid)
112
+ # ---------------------------------------------------------------------------
113
+
48
114
  CLAUDE_MD="$PROJECT_DIR/CLAUDE.md"
49
115
  GITIGNORE="$PROJECT_DIR/.gitignore"
50
116
 
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "prism",
3
3
  "description": "Deep QA — multi-agent testing, baseline tracking, incident analysis",
4
- "version": "1.0.9",
4
+ "version": "1.0.10",
5
5
  "author": {
6
6
  "name": "Arth AI"
7
7
  }
@@ -1 +1 @@
1
- 1.0.9
1
+ 1.0.10
@@ -45,6 +45,72 @@ if [ -f "$MARKER_FILE" ]; then
45
45
  fi
46
46
  fi
47
47
 
48
+ # ---------------------------------------------------------------------------
49
+ # License validation (marketplace gate)
50
+ # ---------------------------------------------------------------------------
51
+ # Check key: ARTHAI_LICENSE_KEY env → ~/.claude-agents/.license → ~/.arthai/license
52
+ WORKER_URL="https://license-worker.muddassar-shaikh.workers.dev"
53
+ KEY_FORMAT='^ARTH-[A-Z0-9]{4}-[A-Z0-9]{4}-[A-Z0-9]{4}-[A-Z0-9]{4}$'
54
+ LICENSE_CACHE="$PROJECT_DIR/.claude/.license-validated"
55
+ CACHE_TTL=86400
56
+
57
+ REAL_HOME=$(eval echo ~"$(id -un)")
58
+ LICENSE_KEY="${ARTHAI_LICENSE_KEY:-}"
59
+ [ -z "$LICENSE_KEY" ] && [ -f "$REAL_HOME/.claude-agents/.license" ] && LICENSE_KEY=$(cat "$REAL_HOME/.claude-agents/.license" 2>/dev/null | tr -d '[:space:]')
60
+ [ -z "$LICENSE_KEY" ] && [ -f "$REAL_HOME/.arthai/license" ] && LICENSE_KEY=$(cat "$REAL_HOME/.arthai/license" 2>/dev/null | tr -d '[:space:]')
61
+
62
+ if [ -z "$LICENSE_KEY" ]; then
63
+ echo "LICENSE REQUIRED — No license key found for marketplace plugin."
64
+ echo "Run: npx @arthai/agents activate ARTH-XXXX-XXXX-XXXX-XXXX"
65
+ echo "Get a key: productive@getarth.ai"
66
+ exit 0
67
+ fi
68
+
69
+ # Validate format
70
+ if ! echo "$LICENSE_KEY" | grep -qE "$KEY_FORMAT"; then
71
+ echo "LICENSE INVALID — Key format incorrect."
72
+ exit 0
73
+ fi
74
+
75
+ # Check cache (24h TTL)
76
+ LICENSE_VALID=false
77
+ NOW=$(date +%s)
78
+ if [ -f "$LICENSE_CACHE" ]; then
79
+ CACHED_TIME=$(cat "$LICENSE_CACHE" 2>/dev/null | tr -d '[:space:]' || echo "0")
80
+ ELAPSED=$((NOW - CACHED_TIME))
81
+ if [ "$ELAPSED" -ge 0 ] && [ "$ELAPSED" -lt "$CACHE_TTL" ]; then
82
+ LICENSE_VALID=true
83
+ fi
84
+ fi
85
+
86
+ if ! $LICENSE_VALID; then
87
+ # Call Worker — same logic as sync-agents.sh
88
+ PAYLOAD=$(printf '{"key":"%s"}' "$LICENSE_KEY")
89
+ RESPONSE=$(printf '%s' "$PAYLOAD" | curl -sf -m 5 -X POST "$WORKER_URL/validate" \
90
+ -H "Content-Type: application/json" --data "@-" 2>/dev/null) || RESPONSE=""
91
+
92
+ if [ -n "$RESPONSE" ]; then
93
+ VALID=$(echo "$RESPONSE" | python3 -c "import json,sys; print(json.load(sys.stdin).get('valid',False))" 2>/dev/null) || VALID="False"
94
+ if [ "$VALID" = "True" ]; then
95
+ LICENSE_VALID=true
96
+ mkdir -p "$PROJECT_DIR/.claude"
97
+ echo "$NOW" > "$LICENSE_CACHE"
98
+ else
99
+ # Definitive invalid — no fallback
100
+ echo "LICENSE INVALID — Key not recognized."
101
+ echo "Check your key or get one at productive@getarth.ai"
102
+ exit 0
103
+ fi
104
+ else
105
+ # Network error — allow gracefully (don't block on Worker outage)
106
+ LICENSE_VALID=true
107
+ fi
108
+ fi
109
+
110
+ # ---------------------------------------------------------------------------
111
+ # Project setup (only runs if license is valid)
112
+ # ---------------------------------------------------------------------------
113
+
48
114
  CLAUDE_MD="$PROJECT_DIR/CLAUDE.md"
49
115
  GITIGNORE="$PROJECT_DIR/.gitignore"
50
116
 
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "scalpel",
3
3
  "description": "Surgical bug fixing — targeted fixes, CI repair, issue triage",
4
- "version": "1.0.9",
4
+ "version": "1.0.10",
5
5
  "author": {
6
6
  "name": "Arth AI"
7
7
  }
@@ -1 +1 @@
1
- 1.0.9
1
+ 1.0.10
@@ -45,6 +45,72 @@ if [ -f "$MARKER_FILE" ]; then
45
45
  fi
46
46
  fi
47
47
 
48
+ # ---------------------------------------------------------------------------
49
+ # License validation (marketplace gate)
50
+ # ---------------------------------------------------------------------------
51
+ # Check key: ARTHAI_LICENSE_KEY env → ~/.claude-agents/.license → ~/.arthai/license
52
+ WORKER_URL="https://license-worker.muddassar-shaikh.workers.dev"
53
+ KEY_FORMAT='^ARTH-[A-Z0-9]{4}-[A-Z0-9]{4}-[A-Z0-9]{4}-[A-Z0-9]{4}$'
54
+ LICENSE_CACHE="$PROJECT_DIR/.claude/.license-validated"
55
+ CACHE_TTL=86400
56
+
57
+ REAL_HOME=$(eval echo ~"$(id -un)")
58
+ LICENSE_KEY="${ARTHAI_LICENSE_KEY:-}"
59
+ [ -z "$LICENSE_KEY" ] && [ -f "$REAL_HOME/.claude-agents/.license" ] && LICENSE_KEY=$(cat "$REAL_HOME/.claude-agents/.license" 2>/dev/null | tr -d '[:space:]')
60
+ [ -z "$LICENSE_KEY" ] && [ -f "$REAL_HOME/.arthai/license" ] && LICENSE_KEY=$(cat "$REAL_HOME/.arthai/license" 2>/dev/null | tr -d '[:space:]')
61
+
62
+ if [ -z "$LICENSE_KEY" ]; then
63
+ echo "LICENSE REQUIRED — No license key found for marketplace plugin."
64
+ echo "Run: npx @arthai/agents activate ARTH-XXXX-XXXX-XXXX-XXXX"
65
+ echo "Get a key: productive@getarth.ai"
66
+ exit 0
67
+ fi
68
+
69
+ # Validate format
70
+ if ! echo "$LICENSE_KEY" | grep -qE "$KEY_FORMAT"; then
71
+ echo "LICENSE INVALID — Key format incorrect."
72
+ exit 0
73
+ fi
74
+
75
+ # Check cache (24h TTL)
76
+ LICENSE_VALID=false
77
+ NOW=$(date +%s)
78
+ if [ -f "$LICENSE_CACHE" ]; then
79
+ CACHED_TIME=$(cat "$LICENSE_CACHE" 2>/dev/null | tr -d '[:space:]' || echo "0")
80
+ ELAPSED=$((NOW - CACHED_TIME))
81
+ if [ "$ELAPSED" -ge 0 ] && [ "$ELAPSED" -lt "$CACHE_TTL" ]; then
82
+ LICENSE_VALID=true
83
+ fi
84
+ fi
85
+
86
+ if ! $LICENSE_VALID; then
87
+ # Call Worker — same logic as sync-agents.sh
88
+ PAYLOAD=$(printf '{"key":"%s"}' "$LICENSE_KEY")
89
+ RESPONSE=$(printf '%s' "$PAYLOAD" | curl -sf -m 5 -X POST "$WORKER_URL/validate" \
90
+ -H "Content-Type: application/json" --data "@-" 2>/dev/null) || RESPONSE=""
91
+
92
+ if [ -n "$RESPONSE" ]; then
93
+ VALID=$(echo "$RESPONSE" | python3 -c "import json,sys; print(json.load(sys.stdin).get('valid',False))" 2>/dev/null) || VALID="False"
94
+ if [ "$VALID" = "True" ]; then
95
+ LICENSE_VALID=true
96
+ mkdir -p "$PROJECT_DIR/.claude"
97
+ echo "$NOW" > "$LICENSE_CACHE"
98
+ else
99
+ # Definitive invalid — no fallback
100
+ echo "LICENSE INVALID — Key not recognized."
101
+ echo "Check your key or get one at productive@getarth.ai"
102
+ exit 0
103
+ fi
104
+ else
105
+ # Network error — allow gracefully (don't block on Worker outage)
106
+ LICENSE_VALID=true
107
+ fi
108
+ fi
109
+
110
+ # ---------------------------------------------------------------------------
111
+ # Project setup (only runs if license is valid)
112
+ # ---------------------------------------------------------------------------
113
+
48
114
  CLAUDE_MD="$PROJECT_DIR/CLAUDE.md"
49
115
  GITIGNORE="$PROJECT_DIR/.gitignore"
50
116
 
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "sentinel",
3
3
  "description": "Operations and reliability — SRE, incidents, deploy monitoring",
4
- "version": "1.0.9",
4
+ "version": "1.0.10",
5
5
  "author": {
6
6
  "name": "Arth AI"
7
7
  }
@@ -1 +1 @@
1
- 1.0.9
1
+ 1.0.10
@@ -45,6 +45,72 @@ if [ -f "$MARKER_FILE" ]; then
45
45
  fi
46
46
  fi
47
47
 
48
+ # ---------------------------------------------------------------------------
49
+ # License validation (marketplace gate)
50
+ # ---------------------------------------------------------------------------
51
+ # Check key: ARTHAI_LICENSE_KEY env → ~/.claude-agents/.license → ~/.arthai/license
52
+ WORKER_URL="https://license-worker.muddassar-shaikh.workers.dev"
53
+ KEY_FORMAT='^ARTH-[A-Z0-9]{4}-[A-Z0-9]{4}-[A-Z0-9]{4}-[A-Z0-9]{4}$'
54
+ LICENSE_CACHE="$PROJECT_DIR/.claude/.license-validated"
55
+ CACHE_TTL=86400
56
+
57
+ REAL_HOME=$(eval echo ~"$(id -un)")
58
+ LICENSE_KEY="${ARTHAI_LICENSE_KEY:-}"
59
+ [ -z "$LICENSE_KEY" ] && [ -f "$REAL_HOME/.claude-agents/.license" ] && LICENSE_KEY=$(cat "$REAL_HOME/.claude-agents/.license" 2>/dev/null | tr -d '[:space:]')
60
+ [ -z "$LICENSE_KEY" ] && [ -f "$REAL_HOME/.arthai/license" ] && LICENSE_KEY=$(cat "$REAL_HOME/.arthai/license" 2>/dev/null | tr -d '[:space:]')
61
+
62
+ if [ -z "$LICENSE_KEY" ]; then
63
+ echo "LICENSE REQUIRED — No license key found for marketplace plugin."
64
+ echo "Run: npx @arthai/agents activate ARTH-XXXX-XXXX-XXXX-XXXX"
65
+ echo "Get a key: productive@getarth.ai"
66
+ exit 0
67
+ fi
68
+
69
+ # Validate format
70
+ if ! echo "$LICENSE_KEY" | grep -qE "$KEY_FORMAT"; then
71
+ echo "LICENSE INVALID — Key format incorrect."
72
+ exit 0
73
+ fi
74
+
75
+ # Check cache (24h TTL)
76
+ LICENSE_VALID=false
77
+ NOW=$(date +%s)
78
+ if [ -f "$LICENSE_CACHE" ]; then
79
+ CACHED_TIME=$(cat "$LICENSE_CACHE" 2>/dev/null | tr -d '[:space:]' || echo "0")
80
+ ELAPSED=$((NOW - CACHED_TIME))
81
+ if [ "$ELAPSED" -ge 0 ] && [ "$ELAPSED" -lt "$CACHE_TTL" ]; then
82
+ LICENSE_VALID=true
83
+ fi
84
+ fi
85
+
86
+ if ! $LICENSE_VALID; then
87
+ # Call Worker — same logic as sync-agents.sh
88
+ PAYLOAD=$(printf '{"key":"%s"}' "$LICENSE_KEY")
89
+ RESPONSE=$(printf '%s' "$PAYLOAD" | curl -sf -m 5 -X POST "$WORKER_URL/validate" \
90
+ -H "Content-Type: application/json" --data "@-" 2>/dev/null) || RESPONSE=""
91
+
92
+ if [ -n "$RESPONSE" ]; then
93
+ VALID=$(echo "$RESPONSE" | python3 -c "import json,sys; print(json.load(sys.stdin).get('valid',False))" 2>/dev/null) || VALID="False"
94
+ if [ "$VALID" = "True" ]; then
95
+ LICENSE_VALID=true
96
+ mkdir -p "$PROJECT_DIR/.claude"
97
+ echo "$NOW" > "$LICENSE_CACHE"
98
+ else
99
+ # Definitive invalid — no fallback
100
+ echo "LICENSE INVALID — Key not recognized."
101
+ echo "Check your key or get one at productive@getarth.ai"
102
+ exit 0
103
+ fi
104
+ else
105
+ # Network error — allow gracefully (don't block on Worker outage)
106
+ LICENSE_VALID=true
107
+ fi
108
+ fi
109
+
110
+ # ---------------------------------------------------------------------------
111
+ # Project setup (only runs if license is valid)
112
+ # ---------------------------------------------------------------------------
113
+
48
114
  CLAUDE_MD="$PROJECT_DIR/CLAUDE.md"
49
115
  GITIGNORE="$PROJECT_DIR/.gitignore"
50
116
 
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "shield",
3
3
  "description": "Safety guardrails — bash guards, edit protection, session bootstrap",
4
- "version": "1.0.9",
4
+ "version": "1.0.10",
5
5
  "author": {
6
6
  "name": "Arth AI"
7
7
  }
@@ -1 +1 @@
1
- 1.0.9
1
+ 1.0.10
@@ -45,6 +45,72 @@ if [ -f "$MARKER_FILE" ]; then
45
45
  fi
46
46
  fi
47
47
 
48
+ # ---------------------------------------------------------------------------
49
+ # License validation (marketplace gate)
50
+ # ---------------------------------------------------------------------------
51
+ # Check key: ARTHAI_LICENSE_KEY env → ~/.claude-agents/.license → ~/.arthai/license
52
+ WORKER_URL="https://license-worker.muddassar-shaikh.workers.dev"
53
+ KEY_FORMAT='^ARTH-[A-Z0-9]{4}-[A-Z0-9]{4}-[A-Z0-9]{4}-[A-Z0-9]{4}$'
54
+ LICENSE_CACHE="$PROJECT_DIR/.claude/.license-validated"
55
+ CACHE_TTL=86400
56
+
57
+ REAL_HOME=$(eval echo ~"$(id -un)")
58
+ LICENSE_KEY="${ARTHAI_LICENSE_KEY:-}"
59
+ [ -z "$LICENSE_KEY" ] && [ -f "$REAL_HOME/.claude-agents/.license" ] && LICENSE_KEY=$(cat "$REAL_HOME/.claude-agents/.license" 2>/dev/null | tr -d '[:space:]')
60
+ [ -z "$LICENSE_KEY" ] && [ -f "$REAL_HOME/.arthai/license" ] && LICENSE_KEY=$(cat "$REAL_HOME/.arthai/license" 2>/dev/null | tr -d '[:space:]')
61
+
62
+ if [ -z "$LICENSE_KEY" ]; then
63
+ echo "LICENSE REQUIRED — No license key found for marketplace plugin."
64
+ echo "Run: npx @arthai/agents activate ARTH-XXXX-XXXX-XXXX-XXXX"
65
+ echo "Get a key: productive@getarth.ai"
66
+ exit 0
67
+ fi
68
+
69
+ # Validate format
70
+ if ! echo "$LICENSE_KEY" | grep -qE "$KEY_FORMAT"; then
71
+ echo "LICENSE INVALID — Key format incorrect."
72
+ exit 0
73
+ fi
74
+
75
+ # Check cache (24h TTL)
76
+ LICENSE_VALID=false
77
+ NOW=$(date +%s)
78
+ if [ -f "$LICENSE_CACHE" ]; then
79
+ CACHED_TIME=$(cat "$LICENSE_CACHE" 2>/dev/null | tr -d '[:space:]' || echo "0")
80
+ ELAPSED=$((NOW - CACHED_TIME))
81
+ if [ "$ELAPSED" -ge 0 ] && [ "$ELAPSED" -lt "$CACHE_TTL" ]; then
82
+ LICENSE_VALID=true
83
+ fi
84
+ fi
85
+
86
+ if ! $LICENSE_VALID; then
87
+ # Call Worker — same logic as sync-agents.sh
88
+ PAYLOAD=$(printf '{"key":"%s"}' "$LICENSE_KEY")
89
+ RESPONSE=$(printf '%s' "$PAYLOAD" | curl -sf -m 5 -X POST "$WORKER_URL/validate" \
90
+ -H "Content-Type: application/json" --data "@-" 2>/dev/null) || RESPONSE=""
91
+
92
+ if [ -n "$RESPONSE" ]; then
93
+ VALID=$(echo "$RESPONSE" | python3 -c "import json,sys; print(json.load(sys.stdin).get('valid',False))" 2>/dev/null) || VALID="False"
94
+ if [ "$VALID" = "True" ]; then
95
+ LICENSE_VALID=true
96
+ mkdir -p "$PROJECT_DIR/.claude"
97
+ echo "$NOW" > "$LICENSE_CACHE"
98
+ else
99
+ # Definitive invalid — no fallback
100
+ echo "LICENSE INVALID — Key not recognized."
101
+ echo "Check your key or get one at productive@getarth.ai"
102
+ exit 0
103
+ fi
104
+ else
105
+ # Network error — allow gracefully (don't block on Worker outage)
106
+ LICENSE_VALID=true
107
+ fi
108
+ fi
109
+
110
+ # ---------------------------------------------------------------------------
111
+ # Project setup (only runs if license is valid)
112
+ # ---------------------------------------------------------------------------
113
+
48
114
  CLAUDE_MD="$PROJECT_DIR/CLAUDE.md"
49
115
  GITIGNORE="$PROJECT_DIR/.gitignore"
50
116
 
@@ -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.10",
5
5
  "author": {
6
6
  "name": "Arth AI"
7
7
  }
@@ -1 +1 @@
1
- 1.0.9
1
+ 1.0.10
@@ -45,6 +45,72 @@ if [ -f "$MARKER_FILE" ]; then
45
45
  fi
46
46
  fi
47
47
 
48
+ # ---------------------------------------------------------------------------
49
+ # License validation (marketplace gate)
50
+ # ---------------------------------------------------------------------------
51
+ # Check key: ARTHAI_LICENSE_KEY env → ~/.claude-agents/.license → ~/.arthai/license
52
+ WORKER_URL="https://license-worker.muddassar-shaikh.workers.dev"
53
+ KEY_FORMAT='^ARTH-[A-Z0-9]{4}-[A-Z0-9]{4}-[A-Z0-9]{4}-[A-Z0-9]{4}$'
54
+ LICENSE_CACHE="$PROJECT_DIR/.claude/.license-validated"
55
+ CACHE_TTL=86400
56
+
57
+ REAL_HOME=$(eval echo ~"$(id -un)")
58
+ LICENSE_KEY="${ARTHAI_LICENSE_KEY:-}"
59
+ [ -z "$LICENSE_KEY" ] && [ -f "$REAL_HOME/.claude-agents/.license" ] && LICENSE_KEY=$(cat "$REAL_HOME/.claude-agents/.license" 2>/dev/null | tr -d '[:space:]')
60
+ [ -z "$LICENSE_KEY" ] && [ -f "$REAL_HOME/.arthai/license" ] && LICENSE_KEY=$(cat "$REAL_HOME/.arthai/license" 2>/dev/null | tr -d '[:space:]')
61
+
62
+ if [ -z "$LICENSE_KEY" ]; then
63
+ echo "LICENSE REQUIRED — No license key found for marketplace plugin."
64
+ echo "Run: npx @arthai/agents activate ARTH-XXXX-XXXX-XXXX-XXXX"
65
+ echo "Get a key: productive@getarth.ai"
66
+ exit 0
67
+ fi
68
+
69
+ # Validate format
70
+ if ! echo "$LICENSE_KEY" | grep -qE "$KEY_FORMAT"; then
71
+ echo "LICENSE INVALID — Key format incorrect."
72
+ exit 0
73
+ fi
74
+
75
+ # Check cache (24h TTL)
76
+ LICENSE_VALID=false
77
+ NOW=$(date +%s)
78
+ if [ -f "$LICENSE_CACHE" ]; then
79
+ CACHED_TIME=$(cat "$LICENSE_CACHE" 2>/dev/null | tr -d '[:space:]' || echo "0")
80
+ ELAPSED=$((NOW - CACHED_TIME))
81
+ if [ "$ELAPSED" -ge 0 ] && [ "$ELAPSED" -lt "$CACHE_TTL" ]; then
82
+ LICENSE_VALID=true
83
+ fi
84
+ fi
85
+
86
+ if ! $LICENSE_VALID; then
87
+ # Call Worker — same logic as sync-agents.sh
88
+ PAYLOAD=$(printf '{"key":"%s"}' "$LICENSE_KEY")
89
+ RESPONSE=$(printf '%s' "$PAYLOAD" | curl -sf -m 5 -X POST "$WORKER_URL/validate" \
90
+ -H "Content-Type: application/json" --data "@-" 2>/dev/null) || RESPONSE=""
91
+
92
+ if [ -n "$RESPONSE" ]; then
93
+ VALID=$(echo "$RESPONSE" | python3 -c "import json,sys; print(json.load(sys.stdin).get('valid',False))" 2>/dev/null) || VALID="False"
94
+ if [ "$VALID" = "True" ]; then
95
+ LICENSE_VALID=true
96
+ mkdir -p "$PROJECT_DIR/.claude"
97
+ echo "$NOW" > "$LICENSE_CACHE"
98
+ else
99
+ # Definitive invalid — no fallback
100
+ echo "LICENSE INVALID — Key not recognized."
101
+ echo "Check your key or get one at productive@getarth.ai"
102
+ exit 0
103
+ fi
104
+ else
105
+ # Network error — allow gracefully (don't block on Worker outage)
106
+ LICENSE_VALID=true
107
+ fi
108
+ fi
109
+
110
+ # ---------------------------------------------------------------------------
111
+ # Project setup (only runs if license is valid)
112
+ # ---------------------------------------------------------------------------
113
+
48
114
  CLAUDE_MD="$PROJECT_DIR/CLAUDE.md"
49
115
  GITIGNORE="$PROJECT_DIR/.gitignore"
50
116
 
@@ -45,6 +45,72 @@ if [ -f "$MARKER_FILE" ]; then
45
45
  fi
46
46
  fi
47
47
 
48
+ # ---------------------------------------------------------------------------
49
+ # License validation (marketplace gate)
50
+ # ---------------------------------------------------------------------------
51
+ # Check key: ARTHAI_LICENSE_KEY env → ~/.claude-agents/.license → ~/.arthai/license
52
+ WORKER_URL="https://license-worker.muddassar-shaikh.workers.dev"
53
+ KEY_FORMAT='^ARTH-[A-Z0-9]{4}-[A-Z0-9]{4}-[A-Z0-9]{4}-[A-Z0-9]{4}$'
54
+ LICENSE_CACHE="$PROJECT_DIR/.claude/.license-validated"
55
+ CACHE_TTL=86400
56
+
57
+ REAL_HOME=$(eval echo ~"$(id -un)")
58
+ LICENSE_KEY="${ARTHAI_LICENSE_KEY:-}"
59
+ [ -z "$LICENSE_KEY" ] && [ -f "$REAL_HOME/.claude-agents/.license" ] && LICENSE_KEY=$(cat "$REAL_HOME/.claude-agents/.license" 2>/dev/null | tr -d '[:space:]')
60
+ [ -z "$LICENSE_KEY" ] && [ -f "$REAL_HOME/.arthai/license" ] && LICENSE_KEY=$(cat "$REAL_HOME/.arthai/license" 2>/dev/null | tr -d '[:space:]')
61
+
62
+ if [ -z "$LICENSE_KEY" ]; then
63
+ echo "LICENSE REQUIRED — No license key found for marketplace plugin."
64
+ echo "Run: npx @arthai/agents activate ARTH-XXXX-XXXX-XXXX-XXXX"
65
+ echo "Get a key: productive@getarth.ai"
66
+ exit 0
67
+ fi
68
+
69
+ # Validate format
70
+ if ! echo "$LICENSE_KEY" | grep -qE "$KEY_FORMAT"; then
71
+ echo "LICENSE INVALID — Key format incorrect."
72
+ exit 0
73
+ fi
74
+
75
+ # Check cache (24h TTL)
76
+ LICENSE_VALID=false
77
+ NOW=$(date +%s)
78
+ if [ -f "$LICENSE_CACHE" ]; then
79
+ CACHED_TIME=$(cat "$LICENSE_CACHE" 2>/dev/null | tr -d '[:space:]' || echo "0")
80
+ ELAPSED=$((NOW - CACHED_TIME))
81
+ if [ "$ELAPSED" -ge 0 ] && [ "$ELAPSED" -lt "$CACHE_TTL" ]; then
82
+ LICENSE_VALID=true
83
+ fi
84
+ fi
85
+
86
+ if ! $LICENSE_VALID; then
87
+ # Call Worker — same logic as sync-agents.sh
88
+ PAYLOAD=$(printf '{"key":"%s"}' "$LICENSE_KEY")
89
+ RESPONSE=$(printf '%s' "$PAYLOAD" | curl -sf -m 5 -X POST "$WORKER_URL/validate" \
90
+ -H "Content-Type: application/json" --data "@-" 2>/dev/null) || RESPONSE=""
91
+
92
+ if [ -n "$RESPONSE" ]; then
93
+ VALID=$(echo "$RESPONSE" | python3 -c "import json,sys; print(json.load(sys.stdin).get('valid',False))" 2>/dev/null) || VALID="False"
94
+ if [ "$VALID" = "True" ]; then
95
+ LICENSE_VALID=true
96
+ mkdir -p "$PROJECT_DIR/.claude"
97
+ echo "$NOW" > "$LICENSE_CACHE"
98
+ else
99
+ # Definitive invalid — no fallback
100
+ echo "LICENSE INVALID — Key not recognized."
101
+ echo "Check your key or get one at productive@getarth.ai"
102
+ exit 0
103
+ fi
104
+ else
105
+ # Network error — allow gracefully (don't block on Worker outage)
106
+ LICENSE_VALID=true
107
+ fi
108
+ fi
109
+
110
+ # ---------------------------------------------------------------------------
111
+ # Project setup (only runs if license is valid)
112
+ # ---------------------------------------------------------------------------
113
+
48
114
  CLAUDE_MD="$PROJECT_DIR/CLAUDE.md"
49
115
  GITIGNORE="$PROJECT_DIR/.gitignore"
50
116
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@arthai/agents",
3
- "version": "1.0.9",
3
+ "version": "1.0.10",
4
4
  "description": "AI-powered development toolkit for Claude Code — agents, skills, and hooks",
5
5
  "bin": {
6
6
  "arthai": "bin/cli.js"