@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.
- package/VERSION +1 -1
- package/dist/plugins/canvas/.claude-plugin/plugin.json +1 -1
- package/dist/plugins/canvas/VERSION +1 -1
- package/dist/plugins/canvas/hooks/hooks.json +12 -0
- package/dist/plugins/canvas/hooks/project-setup.sh +74 -2
- package/dist/plugins/compass/.claude-plugin/plugin.json +1 -1
- package/dist/plugins/compass/VERSION +1 -1
- package/dist/plugins/compass/hooks/hooks.json +12 -0
- package/dist/plugins/compass/hooks/project-setup.sh +74 -2
- package/dist/plugins/counsel/.claude-plugin/plugin.json +1 -1
- package/dist/plugins/counsel/VERSION +1 -1
- package/dist/plugins/counsel/hooks/hooks.json +12 -0
- package/dist/plugins/counsel/hooks/project-setup.sh +74 -2
- package/dist/plugins/cruise/.claude-plugin/plugin.json +1 -1
- package/dist/plugins/cruise/VERSION +1 -1
- package/dist/plugins/cruise/hooks/hooks.json +12 -0
- package/dist/plugins/cruise/hooks/project-setup.sh +74 -2
- package/dist/plugins/forge/.claude-plugin/plugin.json +1 -1
- package/dist/plugins/forge/VERSION +1 -1
- package/dist/plugins/forge/hooks/hooks.json +10 -0
- package/dist/plugins/forge/hooks/project-setup.sh +74 -2
- package/dist/plugins/prime/.claude-plugin/plugin.json +1 -1
- package/dist/plugins/prime/VERSION +1 -1
- package/dist/plugins/prime/hooks/hooks.json +22 -12
- package/dist/plugins/prime/hooks/project-setup.sh +74 -2
- package/dist/plugins/prism/.claude-plugin/plugin.json +1 -1
- package/dist/plugins/prism/VERSION +1 -1
- package/dist/plugins/prism/hooks/hooks.json +12 -0
- package/dist/plugins/prism/hooks/project-setup.sh +74 -2
- package/dist/plugins/scalpel/.claude-plugin/plugin.json +1 -1
- package/dist/plugins/scalpel/VERSION +1 -1
- package/dist/plugins/scalpel/hooks/hooks.json +12 -0
- package/dist/plugins/scalpel/hooks/project-setup.sh +74 -2
- package/dist/plugins/sentinel/.claude-plugin/plugin.json +1 -1
- package/dist/plugins/sentinel/VERSION +1 -1
- package/dist/plugins/sentinel/hooks/hooks.json +12 -0
- package/dist/plugins/sentinel/hooks/project-setup.sh +74 -2
- package/dist/plugins/shield/.claude-plugin/plugin.json +1 -1
- package/dist/plugins/shield/VERSION +1 -1
- package/dist/plugins/shield/hooks/hooks.json +21 -11
- package/dist/plugins/shield/hooks/project-setup.sh +74 -2
- package/dist/plugins/spark/.claude-plugin/plugin.json +1 -1
- package/dist/plugins/spark/VERSION +1 -1
- package/dist/plugins/spark/hooks/hooks.json +12 -0
- package/dist/plugins/spark/hooks/project-setup.sh +74 -2
- package/hook-defs.json +2 -1
- package/hooks/project-setup.sh +74 -2
- package/package.json +1 -1
package/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
1.0.
|
|
1
|
+
1.0.11
|
|
@@ -1 +1 @@
|
|
|
1
|
-
1.0.
|
|
1
|
+
1.0.11
|
|
@@ -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
|
|
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
|
-
|
|
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 +1 @@
|
|
|
1
|
-
1.0.
|
|
1
|
+
1.0.11
|
|
@@ -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
|
|
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
|
-
|
|
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 +1 @@
|
|
|
1
|
-
1.0.
|
|
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
|
|
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
|
-
|
|
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 +1 @@
|
|
|
1
|
-
1.0.
|
|
1
|
+
1.0.11
|
|
@@ -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
|
|
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
|
-
|
|
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 +1 @@
|
|
|
1
|
-
1.0.
|
|
1
|
+
1.0.11
|
|
@@ -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
|
|
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
|
-
|
|
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 +1 @@
|
|
|
1
|
-
1.0.
|
|
1
|
+
1.0.11
|