@arthai/agents 1.0.8 → 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.
- package/README.md +36 -8
- package/VERSION +1 -1
- package/bin/cli.js +3 -3
- package/dist/plugins/canvas/.claude-plugin/plugin.json +1 -1
- package/dist/plugins/canvas/VERSION +1 -1
- package/dist/plugins/canvas/hooks/project-setup.sh +66 -0
- package/dist/plugins/compass/.claude-plugin/plugin.json +1 -1
- package/dist/plugins/compass/VERSION +1 -1
- package/dist/plugins/compass/hooks/project-setup.sh +66 -0
- package/dist/plugins/counsel/.claude-plugin/plugin.json +1 -1
- package/dist/plugins/counsel/VERSION +1 -1
- package/dist/plugins/counsel/hooks/project-setup.sh +66 -0
- package/dist/plugins/cruise/.claude-plugin/plugin.json +1 -1
- package/dist/plugins/cruise/VERSION +1 -1
- package/dist/plugins/cruise/hooks/project-setup.sh +66 -0
- package/dist/plugins/forge/.claude-plugin/plugin.json +1 -1
- package/dist/plugins/forge/VERSION +1 -1
- package/dist/plugins/forge/hooks/project-setup.sh +66 -0
- package/dist/plugins/prime/.claude-plugin/plugin.json +1 -1
- package/dist/plugins/prime/VERSION +1 -1
- package/dist/plugins/prime/hooks/project-setup.sh +66 -0
- package/dist/plugins/prime/hooks/sync-agents.sh +1 -1
- package/dist/plugins/prism/.claude-plugin/plugin.json +1 -1
- package/dist/plugins/prism/VERSION +1 -1
- package/dist/plugins/prism/hooks/project-setup.sh +66 -0
- package/dist/plugins/scalpel/.claude-plugin/plugin.json +1 -1
- package/dist/plugins/scalpel/VERSION +1 -1
- package/dist/plugins/scalpel/hooks/project-setup.sh +66 -0
- package/dist/plugins/sentinel/.claude-plugin/plugin.json +1 -1
- package/dist/plugins/sentinel/VERSION +1 -1
- package/dist/plugins/sentinel/hooks/project-setup.sh +66 -0
- package/dist/plugins/shield/.claude-plugin/plugin.json +1 -1
- package/dist/plugins/shield/VERSION +1 -1
- package/dist/plugins/shield/hooks/project-setup.sh +66 -0
- package/dist/plugins/spark/.claude-plugin/plugin.json +1 -1
- package/dist/plugins/spark/VERSION +1 -1
- package/dist/plugins/spark/hooks/project-setup.sh +66 -0
- package/hooks/project-setup.sh +66 -0
- package/hooks/sync-agents.sh +1 -1
- package/package.json +1 -1
- package/skills/license/SKILL.md +1 -1
package/README.md
CHANGED
|
@@ -5,18 +5,22 @@ AI development toolkit for Claude Code — agents, skills, and hooks organized i
|
|
|
5
5
|
## Quick Start
|
|
6
6
|
|
|
7
7
|
```bash
|
|
8
|
-
# 1.
|
|
8
|
+
# 1. Get a license key (email productive@getarth.ai)
|
|
9
|
+
|
|
10
|
+
# 2. Activate your license (one time)
|
|
9
11
|
npx @arthai/agents activate ARTH-XXXX-XXXX-XXXX-XXXX
|
|
10
12
|
|
|
11
|
-
#
|
|
13
|
+
# 3. Install a bundle into your project
|
|
12
14
|
npx @arthai/agents install forge .
|
|
13
15
|
|
|
14
|
-
#
|
|
16
|
+
# 4. Open Claude Code — skills are ready
|
|
15
17
|
/calibrate # auto-configure for your codebase
|
|
16
18
|
/planning my-feature # start building
|
|
17
19
|
```
|
|
18
20
|
|
|
19
|
-
Don't have a key?
|
|
21
|
+
Don't have a key? Email **productive@getarth.ai** to get one.
|
|
22
|
+
|
|
23
|
+
Already have the toolkit cloned at `~/.claude-agents/`? You don't need to activate — your existing key works automatically.
|
|
20
24
|
|
|
21
25
|
## Explore Before Installing
|
|
22
26
|
|
|
@@ -185,11 +189,35 @@ npx @arthai/agents@latest install forge .
|
|
|
185
189
|
# Remove a specific bundle
|
|
186
190
|
npx @arthai/agents uninstall forge .
|
|
187
191
|
|
|
188
|
-
# Remove
|
|
189
|
-
|
|
192
|
+
# Remove all bundles at once
|
|
193
|
+
npx @arthai/agents uninstall prime .
|
|
190
194
|
```
|
|
191
195
|
|
|
192
|
-
|
|
196
|
+
This removes skills and agents (63 files for prime). To fully clean up including hooks:
|
|
197
|
+
|
|
198
|
+
```bash
|
|
199
|
+
# 1. Remove hook scripts
|
|
200
|
+
rm -rf .claude/hooks
|
|
201
|
+
|
|
202
|
+
# 2. Remove hook entries from settings.json
|
|
203
|
+
python3 -c "
|
|
204
|
+
import json
|
|
205
|
+
with open('.claude/settings.json') as f: s = json.load(f)
|
|
206
|
+
s.pop('hooks', None)
|
|
207
|
+
with open('.claude/settings.json', 'w') as f: json.dump(s, f, indent=2)
|
|
208
|
+
"
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
**What uninstall removes vs keeps:**
|
|
212
|
+
|
|
213
|
+
| Removed | Kept (never deleted) |
|
|
214
|
+
|---------|------|
|
|
215
|
+
| `.claude/skills/` | `CLAUDE.md` (your project context) |
|
|
216
|
+
| `.claude/agents/` | `.claude/project-profile.md` (calibration data) |
|
|
217
|
+
| | `.claude/knowledge/` (project knowledge base) |
|
|
218
|
+
| | `.claude/settings.json` (hook entries — clean manually) |
|
|
219
|
+
| | `.claude/hooks/` (script files — `rm -rf` manually) |
|
|
220
|
+
| | `~/.arthai/license` (license key — per-machine) |
|
|
193
221
|
|
|
194
222
|
## License Activation
|
|
195
223
|
|
|
@@ -245,4 +273,4 @@ npx @arthai/agents activate ARTH-XXXX-XXXX-XXXX-XXXX
|
|
|
245
273
|
|
|
246
274
|
- [Claude Code CLI](https://docs.anthropic.com/en/docs/claude-code)
|
|
247
275
|
- Node.js 18+
|
|
248
|
-
- License key (get one at
|
|
276
|
+
- License key (get one at productive@getarth.ai)
|
package/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
1.0.
|
|
1
|
+
1.0.10
|
package/bin/cli.js
CHANGED
|
@@ -107,7 +107,7 @@ function handleInstall(rawArgs) {
|
|
|
107
107
|
const licenseKey = readLicenseKey(rawArgs);
|
|
108
108
|
if (!licenseKey) {
|
|
109
109
|
console.error('License required. Run: npx @arthai/agents activate ARTH-XXXX-XXXX-XXXX-XXXX');
|
|
110
|
-
console.error('Get a license at
|
|
110
|
+
console.error('Get a license at productive@getarth.ai');
|
|
111
111
|
process.exit(1);
|
|
112
112
|
}
|
|
113
113
|
const licenseResult = validateWithWorker(licenseKey);
|
|
@@ -116,7 +116,7 @@ function handleInstall(rawArgs) {
|
|
|
116
116
|
console.error('License server unavailable. Cannot install without a validated license.');
|
|
117
117
|
console.error('Check your internet connection and try again.');
|
|
118
118
|
} else {
|
|
119
|
-
console.error('Invalid license key. Check your key or get one at
|
|
119
|
+
console.error('Invalid license key. Check your key or get one at productive@getarth.ai');
|
|
120
120
|
}
|
|
121
121
|
process.exit(1);
|
|
122
122
|
}
|
|
@@ -273,7 +273,7 @@ function handleActivate(key) {
|
|
|
273
273
|
if (!result.valid) {
|
|
274
274
|
const reason = result.reason === 'revoked'
|
|
275
275
|
? 'This license key has been revoked.'
|
|
276
|
-
: 'Invalid license key. Check your key or get one at
|
|
276
|
+
: 'Invalid license key. Check your key or get one at productive@getarth.ai';
|
|
277
277
|
console.error(`Activation failed: ${reason}`);
|
|
278
278
|
process.exit(1);
|
|
279
279
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
1.0.
|
|
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 +1 @@
|
|
|
1
|
-
1.0.
|
|
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 +1 @@
|
|
|
1
|
-
1.0.
|
|
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 +1 @@
|
|
|
1
|
-
1.0.
|
|
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 +1 @@
|
|
|
1
|
-
1.0.
|
|
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 +1 @@
|
|
|
1
|
-
1.0.
|
|
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
|
|
|
@@ -306,7 +306,7 @@ if ! $LICENSE_VALID; then
|
|
|
306
306
|
fi
|
|
307
307
|
|
|
308
308
|
echo "Invalid license key. Toolkit has been disabled for this project."
|
|
309
|
-
echo " Check your key or get one at
|
|
309
|
+
echo " Check your key or get one at productive@getarth.ai"
|
|
310
310
|
exit 0
|
|
311
311
|
fi
|
|
312
312
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
1.0.
|
|
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 +1 @@
|
|
|
1
|
-
1.0.
|
|
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 +1 @@
|
|
|
1
|
-
1.0.
|
|
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 +1 @@
|
|
|
1
|
-
1.0.
|
|
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 +1 @@
|
|
|
1
|
-
1.0.
|
|
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
|
|
package/hooks/project-setup.sh
CHANGED
|
@@ -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/hooks/sync-agents.sh
CHANGED
|
@@ -306,7 +306,7 @@ if ! $LICENSE_VALID; then
|
|
|
306
306
|
fi
|
|
307
307
|
|
|
308
308
|
echo "Invalid license key. Toolkit has been disabled for this project."
|
|
309
|
-
echo " Check your key or get one at
|
|
309
|
+
echo " Check your key or get one at productive@getarth.ai"
|
|
310
310
|
exit 0
|
|
311
311
|
fi
|
|
312
312
|
|
package/package.json
CHANGED
package/skills/license/SKILL.md
CHANGED
|
@@ -128,7 +128,7 @@ Returns:
|
|
|
128
128
|
NEW USER ONBOARDING:
|
|
129
129
|
1. User finds toolkit (npm, marketplace, docs)
|
|
130
130
|
2. User tries: npx @arthai/agents install forge .
|
|
131
|
-
→ "License required. Get a key at
|
|
131
|
+
→ "License required. Get a key at productive@getarth.ai"
|
|
132
132
|
3. User contacts you
|
|
133
133
|
4. You run: /license issue customer-name
|
|
134
134
|
5. You send them the key
|