thumbgate 1.4.3 → 1.4.4
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/.claude-plugin/marketplace.json +2 -2
- package/.claude-plugin/plugin.json +1 -1
- package/.well-known/mcp/server-card.json +1 -1
- package/adapters/README.md +1 -1
- package/adapters/claude/.mcp.json +2 -2
- package/adapters/codex/config.toml +2 -2
- package/adapters/mcp/server-stdio.js +1 -1
- package/adapters/opencode/opencode.json +1 -1
- package/package.json +157 -9
- package/scripts/statusline.sh +1 -0
- package/src/api/server.js +113 -16
- package/src/index.js +3 -0
- package/.claude-plugin/bundle/icon.png +0 -0
- package/.claude-plugin/bundle/icon.svg +0 -18
- package/.claude-plugin/bundle/server/index.js +0 -24
- package/adapters/chatgpt/INSTALL.md +0 -158
- package/adapters/perplexity/.mcp.json +0 -36
- package/adapters/perplexity/config.toml +0 -16
- package/adapters/perplexity/opencode.json +0 -29
- package/bin/memory.sh +0 -64
- package/bin/obsidian-sync.sh +0 -20
- package/plugins/amp-skill/INSTALL.md +0 -52
- package/plugins/amp-skill/SKILL.md +0 -64
- package/plugins/claude-codex-bridge/.claude-plugin/plugin.json +0 -22
- package/plugins/claude-codex-bridge/.mcp.json +0 -14
- package/plugins/claude-codex-bridge/INSTALL.md +0 -43
- package/plugins/claude-codex-bridge/README.md +0 -46
- package/plugins/claude-codex-bridge/scripts/codex-bridge.js +0 -286
- package/plugins/claude-codex-bridge/skills/adversarial-review/SKILL.md +0 -24
- package/plugins/claude-codex-bridge/skills/result/SKILL.md +0 -22
- package/plugins/claude-codex-bridge/skills/review/SKILL.md +0 -28
- package/plugins/claude-codex-bridge/skills/second-pass/SKILL.md +0 -27
- package/plugins/claude-codex-bridge/skills/setup/SKILL.md +0 -21
- package/plugins/claude-codex-bridge/skills/status/SKILL.md +0 -19
- package/plugins/claude-skill/INSTALL.md +0 -55
- package/plugins/claude-skill/SKILL.md +0 -46
- package/plugins/codex-profile/.codex-plugin/plugin.json +0 -43
- package/plugins/codex-profile/.mcp.json +0 -14
- package/plugins/codex-profile/AGENTS.md +0 -20
- package/plugins/codex-profile/INSTALL.md +0 -89
- package/plugins/codex-profile/README.md +0 -61
- package/plugins/cursor-marketplace/.cursor-plugin/plugin.json +0 -23
- package/plugins/cursor-marketplace/CHANGELOG.md +0 -30
- package/plugins/cursor-marketplace/LICENSE +0 -21
- package/plugins/cursor-marketplace/README.md +0 -124
- package/plugins/cursor-marketplace/agents/reliability-reviewer.md +0 -31
- package/plugins/cursor-marketplace/assets/logo-400x400.png +0 -0
- package/plugins/cursor-marketplace/commands/capture-feedback.md +0 -33
- package/plugins/cursor-marketplace/commands/check-gates.md +0 -25
- package/plugins/cursor-marketplace/commands/show-lessons.md +0 -27
- package/plugins/cursor-marketplace/hooks/hooks.json +0 -10
- package/plugins/cursor-marketplace/mcp.json +0 -14
- package/plugins/cursor-marketplace/rules/feedback-capture.mdc +0 -34
- package/plugins/cursor-marketplace/rules/pre-action-gates.mdc +0 -30
- package/plugins/cursor-marketplace/rules/session-continuity.mdc +0 -28
- package/plugins/cursor-marketplace/scripts/gate-check.sh +0 -21
- package/plugins/cursor-marketplace/skills/capture-feedback/SKILL.md +0 -48
- package/plugins/cursor-marketplace/skills/prevention-rules/SKILL.md +0 -31
- package/plugins/cursor-marketplace/skills/recall-context/SKILL.md +0 -30
- package/plugins/cursor-marketplace/skills/search-lessons/SKILL.md +0 -33
- package/plugins/gemini-extension/INSTALL.md +0 -92
- package/plugins/gemini-extension/gemini_prompt.txt +0 -14
- package/plugins/gemini-extension/tool_contract.json +0 -45
- package/plugins/opencode-profile/INSTALL.md +0 -57
- package/public/assets/instagram-card.png +0 -0
- package/public/assets/tiktok-agent-memory.mp4 +0 -0
- package/public/blog.html +0 -474
- package/public/compare/mem0.html +0 -189
- package/public/compare/speclock.html +0 -180
- package/public/compare.html +0 -310
- package/public/dashboard.html +0 -1100
- package/public/guide.html +0 -317
- package/public/guides/claude-code-prevent-repeated-mistakes.html +0 -161
- package/public/guides/codex-cli-guardrails.html +0 -158
- package/public/guides/cursor-prevent-repeated-mistakes.html +0 -161
- package/public/guides/pre-action-gates.html +0 -162
- package/public/guides/stop-repeated-ai-agent-mistakes.html +0 -159
- package/public/index.html +0 -1225
- package/public/js/buyer-intent.js +0 -252
- package/public/learn/agent-harness-pattern.html +0 -180
- package/public/learn/ai-agent-persistent-memory.html +0 -203
- package/public/learn/learn.css +0 -45
- package/public/learn/mcp-pre-action-gates-explained.html +0 -172
- package/public/learn/stop-ai-agent-force-push.html +0 -134
- package/public/learn/vibe-coding-safety-net.html +0 -142
- package/public/learn.html +0 -274
- package/public/lessons.html +0 -967
- package/public/llm-context.md +0 -156
- package/public/pro.html +0 -1087
- package/public/vercel.json +0 -8
- package/scripts/a2ui-engine.js +0 -73
- package/scripts/adk-consolidator.js +0 -274
- package/scripts/agent-security-hardening.js +0 -225
- package/scripts/ai-search-visibility.js +0 -116
- package/scripts/autonomous-sales-agent.js +0 -39
- package/scripts/autoresearch-runner.js +0 -216
- package/scripts/background-agent-governance.js +0 -229
- package/scripts/behavioral-extraction.js +0 -93
- package/scripts/budget-enforcer.js +0 -173
- package/scripts/budget-guard.js +0 -173
- package/scripts/build-claude-mcpb.js +0 -255
- package/scripts/build-codex-plugin.js +0 -152
- package/scripts/capture-railway-diagnostics.sh +0 -97
- package/scripts/changeset-check.js +0 -372
- package/scripts/check-congruence.js +0 -443
- package/scripts/computer-use-firewall.js +0 -280
- package/scripts/content-engine/linkedin-content-generator.js +0 -154
- package/scripts/content-engine/output/linkedin-memento-validation.md +0 -17
- package/scripts/content-engine/output/linkedin-posts-2026-04-09.md +0 -175
- package/scripts/content-engine/reddit-thread-finder.js +0 -154
- package/scripts/context-engine.js +0 -710
- package/scripts/daily-digest.js +0 -11
- package/scripts/data-governance.js +0 -173
- package/scripts/deploy-gcp.sh +0 -44
- package/scripts/deploy-policy.js +0 -249
- package/scripts/disagreement-mining.js +0 -315
- package/scripts/dpo-optimizer.js +0 -206
- package/scripts/ensure-repo-bootstrap.js +0 -130
- package/scripts/ephemeral-agent-store.js +0 -212
- package/scripts/eval-harness.js +0 -56
- package/scripts/export-kto-pairs.js +0 -309
- package/scripts/export-training.js +0 -446
- package/scripts/feedback-fallback.js +0 -111
- package/scripts/feedback-inbox-read.js +0 -162
- package/scripts/feedback-root-consolidator.js +0 -233
- package/scripts/feedback-to-memory.js +0 -185
- package/scripts/gate-satisfy.js +0 -42
- package/scripts/generate-paperbanana-diagrams.sh +0 -99
- package/scripts/generate-pretool-hook.sh +0 -40
- package/scripts/github-about.js +0 -430
- package/scripts/github-outreach.js +0 -65
- package/scripts/gtm-revenue-loop.js +0 -535
- package/scripts/hallucination-detector.js +0 -226
- package/scripts/hf-papers.js +0 -317
- package/scripts/hook-auto-capture.sh +0 -100
- package/scripts/hook-stop-pr-thread-check.sh +0 -68
- package/scripts/hook-stop-self-score.sh +0 -51
- package/scripts/hook-stop-verify-deploy.sh +0 -31
- package/scripts/hook-verify-before-done.sh +0 -20
- package/scripts/managed-dpo-export.js +0 -91
- package/scripts/markdown-escape.js +0 -12
- package/scripts/marketing-experiment.js +0 -657
- package/scripts/memalign-recall.js +0 -111
- package/scripts/memory-migration.js +0 -296
- package/scripts/meta-policy.js +0 -190
- package/scripts/metered-billing.js +0 -16
- package/scripts/model-tier-router.js +0 -310
- package/scripts/money-watcher.js +0 -218
- package/scripts/multi-hop-recall.js +0 -240
- package/scripts/per-step-scoring.js +0 -163
- package/scripts/perplexity-command-center.js +0 -644
- package/scripts/perplexity-marketing.js +0 -454
- package/scripts/pii-scanner.js +0 -153
- package/scripts/plan-gate.js +0 -154
- package/scripts/post-everywhere.js +0 -341
- package/scripts/post-to-x-retry.sh +0 -22
- package/scripts/post-to-x.js +0 -369
- package/scripts/pr-manager.js +0 -421
- package/scripts/principle-extractor.js +0 -162
- package/scripts/pro-features.js +0 -41
- package/scripts/prompt-dlp.js +0 -222
- package/scripts/prove-adapters.js +0 -860
- package/scripts/prove-attribution.js +0 -361
- package/scripts/prove-automation.js +0 -651
- package/scripts/prove-autoresearch.js +0 -304
- package/scripts/prove-claim-verification.js +0 -277
- package/scripts/prove-cloudflare-sandbox.js +0 -161
- package/scripts/prove-data-pipeline.js +0 -408
- package/scripts/prove-data-quality.js +0 -227
- package/scripts/prove-evolution.js +0 -352
- package/scripts/prove-harnesses.js +0 -287
- package/scripts/prove-intelligence.js +0 -257
- package/scripts/prove-lancedb.js +0 -425
- package/scripts/prove-local-intelligence.js +0 -340
- package/scripts/prove-loop-closure.js +0 -263
- package/scripts/prove-packaged-runtime.js +0 -327
- package/scripts/prove-predictive-insights.js +0 -355
- package/scripts/prove-runtime.js +0 -363
- package/scripts/prove-seo-gsd.js +0 -234
- package/scripts/prove-settings.js +0 -279
- package/scripts/prove-subway-upgrades.js +0 -277
- package/scripts/prove-tessl.js +0 -229
- package/scripts/prove-training-export.js +0 -325
- package/scripts/prove-workflow-contract.js +0 -112
- package/scripts/prove-xmemory.js +0 -332
- package/scripts/publish-decision.js +0 -159
- package/scripts/ralph-loop.js +0 -376
- package/scripts/ralph-mode-ci.js +0 -434
- package/scripts/reddit-dm-outreach.js +0 -192
- package/scripts/reddit-monitor-cron.sh +0 -26
- package/scripts/reminder-engine.js +0 -132
- package/scripts/revenue-status.js +0 -472
- package/scripts/rotate-stripe-webhook-secret.js +0 -314
- package/scripts/schedule-manager.js +0 -249
- package/scripts/self-healing-check.js +0 -193
- package/scripts/session-analyzer.js +0 -533
- package/scripts/shieldcortex-memory-firewall-runner.mjs +0 -53
- package/scripts/skill-exporter.js +0 -260
- package/scripts/skill-materializer.js +0 -134
- package/scripts/skill-packs.js +0 -136
- package/scripts/skill-proposer.js +0 -99
- package/scripts/skill-quality-tracker.js +0 -282
- package/scripts/slow-loop.js +0 -72
- package/scripts/social-analytics/db/marketing-db.js +0 -179
- package/scripts/social-analytics/db/schema.sql +0 -55
- package/scripts/social-analytics/digest.js +0 -256
- package/scripts/social-analytics/engagement-audit.js +0 -185
- package/scripts/social-analytics/generate-instagram-card.js +0 -123
- package/scripts/social-analytics/generate-slides.js +0 -268
- package/scripts/social-analytics/instagram-thumbgate-post.js +0 -111
- package/scripts/social-analytics/install-growth-automation.js +0 -114
- package/scripts/social-analytics/load-env.js +0 -77
- package/scripts/social-analytics/mcp-server.js +0 -289
- package/scripts/social-analytics/normalizer.js +0 -580
- package/scripts/social-analytics/notify.js +0 -162
- package/scripts/social-analytics/poll-all.js +0 -107
- package/scripts/social-analytics/pollers/github.js +0 -195
- package/scripts/social-analytics/pollers/instagram.js +0 -253
- package/scripts/social-analytics/pollers/linkedin.js +0 -340
- package/scripts/social-analytics/pollers/plausible.js +0 -245
- package/scripts/social-analytics/pollers/reddit.js +0 -306
- package/scripts/social-analytics/pollers/threads.js +0 -233
- package/scripts/social-analytics/pollers/tiktok.js +0 -203
- package/scripts/social-analytics/pollers/x.js +0 -227
- package/scripts/social-analytics/pollers/youtube.js +0 -304
- package/scripts/social-analytics/pollers/zernio.js +0 -183
- package/scripts/social-analytics/post-video.js +0 -316
- package/scripts/social-analytics/publish-instagram-thumbgate.js +0 -104
- package/scripts/social-analytics/publish-thumbgate-launch.js +0 -322
- package/scripts/social-analytics/publishers/devto.js +0 -122
- package/scripts/social-analytics/publishers/instagram.js +0 -317
- package/scripts/social-analytics/publishers/linkedin.js +0 -294
- package/scripts/social-analytics/publishers/reddit.js +0 -385
- package/scripts/social-analytics/publishers/threads.js +0 -275
- package/scripts/social-analytics/publishers/tiktok.js +0 -217
- package/scripts/social-analytics/publishers/x.js +0 -259
- package/scripts/social-analytics/publishers/youtube.js +0 -223
- package/scripts/social-analytics/publishers/zernio.js +0 -568
- package/scripts/social-analytics/reconcile-thumbgate-campaign.js +0 -165
- package/scripts/social-analytics/run-digest.js +0 -34
- package/scripts/social-analytics/schedule-thumbgate-campaign.js +0 -275
- package/scripts/social-analytics/store.js +0 -455
- package/scripts/social-analytics/sync-launch-assets.js +0 -185
- package/scripts/social-analytics/utm.js +0 -143
- package/scripts/social-pipeline.js +0 -2626
- package/scripts/social-post-hourly.js +0 -228
- package/scripts/social-quality-gate.js +0 -134
- package/scripts/social-reply-monitor.js +0 -592
- package/scripts/status-dashboard.js +0 -155
- package/scripts/stripe-live-status.js +0 -115
- package/scripts/subagent-profiles.js +0 -79
- package/scripts/sync-branch-protection.js +0 -340
- package/scripts/sync-gh-secrets-from-env.sh +0 -70
- package/scripts/sync-github-about.js +0 -55
- package/scripts/sync-version.js +0 -479
- package/scripts/synthetic-dpo.js +0 -234
- package/scripts/tessl-export.js +0 -369
- package/scripts/test-coverage.js +0 -128
- package/scripts/thumbgate-bench.js +0 -494
- package/scripts/thumbgate_session_start.sh +0 -32
- package/scripts/train_from_feedback.py +0 -929
- package/scripts/validate-feedback.js +0 -581
- package/scripts/verify-obsidian-setup.sh +0 -269
- package/scripts/verify-run.js +0 -269
- package/scripts/weekly-auto-post.js +0 -124
- package/scripts/x-autonomous-marketing.js +0 -139
|
@@ -1,68 +0,0 @@
|
|
|
1
|
-
#!/bin/bash
|
|
2
|
-
# Stop hook — blocks "done/pushed/resolved" claims without PR thread evidence
|
|
3
|
-
# Inspects the assistant response for completion signals and requires proof
|
|
4
|
-
# that all PR review threads are resolved before allowing the claim.
|
|
5
|
-
#
|
|
6
|
-
# Environment variables (Stop hooks):
|
|
7
|
-
# CLAUDE_RESPONSE — the assistant's last response text
|
|
8
|
-
#
|
|
9
|
-
# Returns JSON with decision: "block" + message, or passes through silently.
|
|
10
|
-
|
|
11
|
-
set -euo pipefail
|
|
12
|
-
|
|
13
|
-
RESPONSE="${CLAUDE_RESPONSE:-}"
|
|
14
|
-
|
|
15
|
-
# If no response, nothing to check
|
|
16
|
-
if [ -z "$RESPONSE" ]; then
|
|
17
|
-
exit 0
|
|
18
|
-
fi
|
|
19
|
-
|
|
20
|
-
node -e '
|
|
21
|
-
"use strict";
|
|
22
|
-
|
|
23
|
-
const response = process.env.CLAUDE_RESPONSE || "";
|
|
24
|
-
|
|
25
|
-
// 1. Detect completion/done signals
|
|
26
|
-
const doneSignal = /\b(done|pushed|resolved|ready for review|all comments addressed|merged|ship it|completed|fixed and pushed)\b/i.test(response);
|
|
27
|
-
if (!doneSignal) {
|
|
28
|
-
// No completion claim — pass through silently
|
|
29
|
-
process.exit(0);
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
// 2. Check for PR thread evidence in the response
|
|
33
|
-
const threadEvidence =
|
|
34
|
-
/\b(0 unresolved|all threads resolved|no open threads|no unresolved|all comments resolved)\b/i.test(response) ||
|
|
35
|
-
/gh pr view.*review/i.test(response) ||
|
|
36
|
-
/reviewDecision.*APPROVED/i.test(response) ||
|
|
37
|
-
/comments.*:\s*0\b/i.test(response) ||
|
|
38
|
-
/unresolved.*:\s*0\b/i.test(response);
|
|
39
|
-
|
|
40
|
-
if (threadEvidence) {
|
|
41
|
-
// Evidence present — allow
|
|
42
|
-
process.exit(0);
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
// 3. Check if we are actually in a PR context (has a branch that is not main/master)
|
|
46
|
-
const { execSync } = require("child_process");
|
|
47
|
-
let branch = "";
|
|
48
|
-
try {
|
|
49
|
-
branch = execSync("git rev-parse --abbrev-ref HEAD", { encoding: "utf-8" }).trim();
|
|
50
|
-
} catch {
|
|
51
|
-
// Not in a git repo — skip check
|
|
52
|
-
process.exit(0);
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
if (branch === "main" || branch === "master") {
|
|
56
|
-
// Not on a feature branch — no PR to check
|
|
57
|
-
process.exit(0);
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
// 4. Block: completion claim on a feature branch without thread evidence
|
|
61
|
-
const output = {
|
|
62
|
-
decision: "block",
|
|
63
|
-
reason: "MANDATORY: Before declaring done, run `gh pr view --json reviewDecision,comments` and confirm 0 unresolved threads. Show the output in your response."
|
|
64
|
-
};
|
|
65
|
-
process.stdout.write(JSON.stringify(output));
|
|
66
|
-
' 2>/dev/null || true
|
|
67
|
-
|
|
68
|
-
exit 0
|
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
#!/bin/bash
|
|
2
|
-
# Claude Code / Amp Stop hook — autonomous self-scoring after every agent turn
|
|
3
|
-
# Fires after the agent completes a response. Runs selfAuditAndLog to produce
|
|
4
|
-
# a RLAIF self-score entry in self-score-log.jsonl.
|
|
5
|
-
#
|
|
6
|
-
# Environment variables available in Stop hooks:
|
|
7
|
-
# CLAUDE_STOP_REASON — why the agent stopped (e.g., "end_turn", "tool_use")
|
|
8
|
-
# CLAUDE_TOOL_OUTPUT — last tool output (if any)
|
|
9
|
-
#
|
|
10
|
-
# This hook is NON-BLOCKING — it exits 0 regardless of errors.
|
|
11
|
-
|
|
12
|
-
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
|
13
|
-
THUMBGATE_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
|
|
14
|
-
|
|
15
|
-
# Run the self-score via Node.js — sync, no API calls, ~5ms
|
|
16
|
-
node -e '
|
|
17
|
-
"use strict";
|
|
18
|
-
const path = require("path");
|
|
19
|
-
|
|
20
|
-
// Resolve modules relative to ThumbGate package root
|
|
21
|
-
const thumbgateRoot = process.env.THUMBGATE_ROOT;
|
|
22
|
-
const { selfAuditAndLog } = require(path.join(thumbgateRoot, "scripts", "rlaif-self-audit"));
|
|
23
|
-
const { getFeedbackPaths } = require(path.join(thumbgateRoot, "scripts", "feedback-loop"));
|
|
24
|
-
|
|
25
|
-
const stopReason = process.env.CLAUDE_STOP_REASON || "unknown";
|
|
26
|
-
|
|
27
|
-
// Build a minimal feedback event for self-scoring
|
|
28
|
-
const feedbackEvent = {
|
|
29
|
-
id: `stop_${Date.now()}_${Math.random().toString(36).slice(2, 6)}`,
|
|
30
|
-
signal: "positive",
|
|
31
|
-
context: `Agent turn completed (stop_reason: ${stopReason}). Autonomous self-score checkpoint.`,
|
|
32
|
-
tags: ["stop-hook", "auto-score"],
|
|
33
|
-
whatWorked: null,
|
|
34
|
-
whatWentWrong: null,
|
|
35
|
-
whatToChange: null,
|
|
36
|
-
rubric: null,
|
|
37
|
-
};
|
|
38
|
-
|
|
39
|
-
const paths = getFeedbackPaths();
|
|
40
|
-
const result = selfAuditAndLog(feedbackEvent, paths);
|
|
41
|
-
|
|
42
|
-
// Output minimal JSON for hook response (non-blocking)
|
|
43
|
-
process.stdout.write(JSON.stringify({
|
|
44
|
-
hookSpecificOutput: {
|
|
45
|
-
hookEventName: "Stop",
|
|
46
|
-
additionalContext: `Self-score: ${result.score} (${result.constraints.filter(c => c.passed).length}/${result.constraints.length} constraints passed)`
|
|
47
|
-
}
|
|
48
|
-
}));
|
|
49
|
-
' 2>/dev/null || true
|
|
50
|
-
|
|
51
|
-
exit 0
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
# Hook: Stop
|
|
3
|
-
#
|
|
4
|
-
# When it fires: After Claude finishes responding (every turn).
|
|
5
|
-
# What it does: Checks if a curl to production happened this session.
|
|
6
|
-
# If not, prints a warning reminding the CTO to verify.
|
|
7
|
-
# Why: Prevents saying "deployed" without proof.
|
|
8
|
-
# Env vars:
|
|
9
|
-
# CLAUDE_STOP_REASON — why the agent stopped (set by Claude Code)
|
|
10
|
-
# Marker file:
|
|
11
|
-
# /tmp/.thumbgate-last-deploy-verify — written by hook-verify-before-done.sh
|
|
12
|
-
# Exit code: Always 0 (informational only).
|
|
13
|
-
|
|
14
|
-
PROD_URL="thumbgate-production.up.railway.app"
|
|
15
|
-
VERIFICATION_MARKER="/tmp/.thumbgate-last-deploy-verify"
|
|
16
|
-
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
17
|
-
REPO_ROOT="$(cd "${SCRIPT_DIR}/.." && pwd)"
|
|
18
|
-
EXPECTED_VERSION="$(node -e "console.log(require(process.argv[1]).version)" "${REPO_ROOT}/package.json")"
|
|
19
|
-
|
|
20
|
-
if [ -f "$VERIFICATION_MARKER" ]; then
|
|
21
|
-
VERIFY_TIME=$(cat "$VERIFICATION_MARKER")
|
|
22
|
-
echo "✅ Last deployment verification: $VERIFY_TIME"
|
|
23
|
-
else
|
|
24
|
-
echo "⚠️ WARNING: No deployment verification found this session."
|
|
25
|
-
echo " If you deployed to Railway, run:"
|
|
26
|
-
echo " curl -s https://${PROD_URL}/health | grep '\"version\":\"${EXPECTED_VERSION}\"'"
|
|
27
|
-
echo " curl -s https://${PROD_URL}/dashboard | grep 'ThumbGate Dashboard'"
|
|
28
|
-
echo " before claiming done."
|
|
29
|
-
fi
|
|
30
|
-
|
|
31
|
-
exit 0
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
# Hook: PreToolUse (matcher: Bash)
|
|
3
|
-
#
|
|
4
|
-
# When it fires: Before every Bash tool call in Claude Code.
|
|
5
|
-
# What it does: If the Bash command contains a curl to production,
|
|
6
|
-
# records the timestamp to a marker file.
|
|
7
|
-
# Why: The Stop hook (hook-stop-verify-deploy.sh) checks this
|
|
8
|
-
# marker to warn if no prod verification happened.
|
|
9
|
-
# Env vars:
|
|
10
|
-
# CLAUDE_TOOL_INPUT — the Bash command about to execute (set by Claude Code)
|
|
11
|
-
# Exit code: Always 0 (never blocks tool calls).
|
|
12
|
-
|
|
13
|
-
PROD_URL="thumbgate-production.up.railway.app"
|
|
14
|
-
VERIFICATION_MARKER="/tmp/.thumbgate-last-deploy-verify"
|
|
15
|
-
|
|
16
|
-
if echo "${CLAUDE_TOOL_INPUT:-}" | grep -q "curl.*${PROD_URL}"; then
|
|
17
|
-
date -u +"%Y-%m-%dT%H:%M:%SZ" > "$VERIFICATION_MARKER"
|
|
18
|
-
fi
|
|
19
|
-
|
|
20
|
-
exit 0
|
|
@@ -1,91 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
'use strict';
|
|
3
|
-
|
|
4
|
-
const fs = require('fs');
|
|
5
|
-
const path = require('path');
|
|
6
|
-
|
|
7
|
-
const {
|
|
8
|
-
readJSONL,
|
|
9
|
-
exportDpoFromMemories,
|
|
10
|
-
DEFAULT_LOCAL_MEMORY_LOG,
|
|
11
|
-
} = require('./export-dpo-pairs');
|
|
12
|
-
|
|
13
|
-
function parseArgs(argv) {
|
|
14
|
-
const args = {};
|
|
15
|
-
for (let index = 0; index < argv.length; index += 1) {
|
|
16
|
-
const token = argv[index];
|
|
17
|
-
if (!token.startsWith('--')) continue;
|
|
18
|
-
|
|
19
|
-
const trimmed = token.slice(2);
|
|
20
|
-
const separatorIndex = trimmed.indexOf('=');
|
|
21
|
-
if (separatorIndex !== -1) {
|
|
22
|
-
const key = trimmed.slice(0, separatorIndex);
|
|
23
|
-
args[key] = trimmed.slice(separatorIndex + 1);
|
|
24
|
-
continue;
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
const next = argv[index + 1];
|
|
28
|
-
if (next && !next.startsWith('--')) {
|
|
29
|
-
args[trimmed] = next;
|
|
30
|
-
index += 1;
|
|
31
|
-
continue;
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
args[trimmed] = true;
|
|
35
|
-
}
|
|
36
|
-
if (args['input-path'] && !args.inputPath) args.inputPath = args['input-path'];
|
|
37
|
-
if (args['memory-log-path'] && !args.memoryLogPath) args.memoryLogPath = args['memory-log-path'];
|
|
38
|
-
if (args['output-path'] && !args.outputPath) args.outputPath = args['output-path'];
|
|
39
|
-
return args;
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
function loadMemories(args) {
|
|
43
|
-
if (args.inputPath) {
|
|
44
|
-
const raw = fs.readFileSync(path.resolve(args.inputPath), 'utf8');
|
|
45
|
-
const parsed = JSON.parse(raw);
|
|
46
|
-
return Array.isArray(parsed) ? parsed : parsed.memories || [];
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
const memoryLogPath = args.memoryLogPath
|
|
50
|
-
? path.resolve(args.memoryLogPath)
|
|
51
|
-
: DEFAULT_LOCAL_MEMORY_LOG;
|
|
52
|
-
return readJSONL(memoryLogPath);
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
function run(argv = process.argv.slice(2)) {
|
|
56
|
-
const args = parseArgs(argv);
|
|
57
|
-
const memories = loadMemories(args);
|
|
58
|
-
const result = exportDpoFromMemories(memories);
|
|
59
|
-
|
|
60
|
-
let outputPath = null;
|
|
61
|
-
if (args.outputPath) {
|
|
62
|
-
outputPath = path.resolve(args.outputPath);
|
|
63
|
-
fs.mkdirSync(path.dirname(outputPath), { recursive: true });
|
|
64
|
-
fs.writeFileSync(outputPath, result.jsonl, 'utf8');
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
const summary = {
|
|
68
|
-
pairs: result.pairs.length,
|
|
69
|
-
errors: result.errors.length,
|
|
70
|
-
learnings: result.learnings.length,
|
|
71
|
-
unpairedErrors: result.unpairedErrors.length,
|
|
72
|
-
unpairedLearnings: result.unpairedLearnings.length,
|
|
73
|
-
outputPath,
|
|
74
|
-
};
|
|
75
|
-
process.stdout.write(JSON.stringify(summary, null, 2) + '\n');
|
|
76
|
-
return summary;
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
if (require.main === module) {
|
|
80
|
-
try {
|
|
81
|
-
run();
|
|
82
|
-
} catch (error) {
|
|
83
|
-
console.error(error && error.message ? error.message : 'managed DPO export failed');
|
|
84
|
-
process.exit(1);
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
module.exports = {
|
|
89
|
-
parseArgs,
|
|
90
|
-
run,
|
|
91
|
-
};
|