thumbgate 0.9.9 → 0.9.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/.claude-plugin/README.md +4 -4
- package/.claude-plugin/marketplace.json +4 -2
- package/.claude-plugin/plugin.json +1 -1
- package/.well-known/mcp/server-card.json +1 -1
- package/README.md +115 -312
- package/adapters/README.md +2 -2
- package/adapters/amp/skills/{rlhf-feedback → thumbgate-feedback}/SKILL.md +1 -1
- package/adapters/chatgpt/openapi.yaml +2 -2
- package/adapters/claude/.mcp.json +3 -3
- package/adapters/codex/config.toml +4 -4
- package/adapters/gemini/function-declarations.json +1 -1
- package/adapters/mcp/server-stdio.js +66 -6
- package/adapters/opencode/opencode.json +4 -2
- package/bin/cli.js +188 -39
- package/config/e2e-critical-flows.json +4 -0
- package/config/gates/default.json +74 -2
- package/config/github-about.json +1 -1
- package/config/mcp-allowlists.json +33 -6
- package/config/skill-packs/react-testing.json +1 -1
- package/config/tessl-tiles.json +3 -3
- package/openapi/openapi.yaml +2 -2
- package/package.json +23 -9
- package/plugins/amp-skill/INSTALL.md +3 -2
- package/plugins/amp-skill/SKILL.md +1 -0
- package/plugins/claude-codex-bridge/.claude-plugin/plugin.json +1 -1
- package/plugins/claude-codex-bridge/.mcp.json +5 -3
- package/plugins/claude-codex-bridge/README.md +1 -1
- package/plugins/claude-codex-bridge/skills/setup/SKILL.md +1 -1
- package/plugins/claude-skill/INSTALL.md +4 -3
- package/plugins/claude-skill/SKILL.md +1 -1
- package/plugins/codex-profile/.codex-plugin/plugin.json +1 -1
- package/plugins/codex-profile/.mcp.json +5 -3
- package/plugins/codex-profile/INSTALL.md +2 -2
- package/plugins/codex-profile/README.md +1 -1
- package/plugins/cursor-marketplace/.cursor-plugin/plugin.json +1 -1
- package/plugins/cursor-marketplace/README.md +5 -5
- package/plugins/cursor-marketplace/mcp.json +4 -2
- package/plugins/cursor-marketplace/rules/pre-action-gates.mdc +1 -1
- package/plugins/cursor-marketplace/scripts/gate-check.sh +15 -5
- package/plugins/gemini-extension/INSTALL.md +4 -4
- package/plugins/opencode-profile/INSTALL.md +5 -5
- package/public/dashboard.html +15 -8
- package/public/index.html +134 -375
- package/public/js/buyer-intent.js +252 -0
- package/public/pro.html +1085 -0
- package/scripts/__pycache__/train_from_feedback.cpython-312.pyc +0 -0
- package/scripts/adk-consolidator.js +17 -5
- package/scripts/agent-readiness.js +3 -1
- package/scripts/agent-security-hardening.js +4 -4
- package/scripts/auto-promote-gates.js +8 -0
- package/scripts/auto-wire-hooks.js +105 -21
- package/scripts/billing.js +111 -7
- package/scripts/build-metadata.js +14 -0
- package/scripts/check-congruence.js +1 -1
- package/scripts/context-engine.js +2 -1
- package/scripts/daemon-manager.js +2 -2
- package/scripts/dashboard.js +2 -2
- package/scripts/data-governance.js +1 -1
- package/scripts/deploy-gcp.sh +1 -1
- package/scripts/deploy-policy.js +22 -4
- package/scripts/dispatch-brief.js +1 -1
- package/scripts/ensure-repo-bootstrap.js +1 -1
- package/scripts/feedback-attribution.js +22 -10
- package/scripts/feedback-fallback.js +3 -2
- package/scripts/feedback-inbox-read.js +1 -1
- package/scripts/feedback-loop.js +41 -3
- package/scripts/feedback-paths.js +8 -8
- package/scripts/feedback-schema.js +1 -1
- package/scripts/feedback-to-memory.js +2 -2
- package/scripts/filesystem-search.js +2 -2
- package/scripts/gates-engine.js +765 -34
- package/scripts/generate-paperbanana-diagrams.sh +3 -3
- package/scripts/github-about.js +1 -1
- package/scripts/gtm-revenue-loop.js +20 -1
- package/scripts/hook-runtime.js +89 -0
- package/scripts/hook-stop-self-score.sh +3 -3
- package/scripts/hook-thumbgate-cache-updater.js +98 -37
- package/scripts/hosted-config.js +12 -10
- package/scripts/hybrid-feedback-context.js +54 -13
- package/scripts/install-mcp.js +14 -1
- package/scripts/intent-router.js +1 -1
- package/scripts/internal-agent-bootstrap.js +1 -1
- package/scripts/lesson-inference.js +6 -1
- package/scripts/license.js +54 -16
- package/scripts/mcp-config.js +69 -7
- package/scripts/memory-migration.js +1 -1
- package/scripts/money-watcher.js +166 -16
- package/scripts/operational-integrity.js +480 -0
- package/scripts/optimize-context.js +1 -1
- package/scripts/perplexity-marketing.js +1 -1
- package/scripts/post-everywhere.js +7 -12
- package/scripts/post-to-x.js +1 -1
- package/scripts/pr-manager.js +14 -11
- package/scripts/problem-detail.js +10 -10
- package/scripts/profile-router.js +2 -0
- package/scripts/prompt-dlp.js +1 -0
- package/scripts/prove-adapters.js +6 -6
- package/scripts/prove-automation.js +1 -1
- package/scripts/prove-autoresearch.js +1 -1
- package/scripts/prove-claim-verification.js +3 -3
- package/scripts/prove-data-pipeline.js +5 -5
- package/scripts/prove-data-quality.js +1 -1
- package/scripts/prove-evolution.js +7 -7
- package/scripts/prove-harnesses.js +2 -2
- package/scripts/prove-lancedb.js +2 -2
- package/scripts/prove-local-intelligence.js +1 -1
- package/scripts/prove-loop-closure.js +1 -1
- package/scripts/prove-predictive-insights.js +2 -2
- package/scripts/prove-runtime.js +6 -6
- package/scripts/prove-seo-gsd.js +1 -1
- package/scripts/prove-settings.js +4 -4
- package/scripts/prove-subway-upgrades.js +1 -1
- package/scripts/prove-tessl.js +2 -2
- package/scripts/prove-xmemory.js +2 -2
- package/scripts/publish-decision.js +10 -0
- package/scripts/published-cli.js +34 -0
- package/scripts/rate-limiter.js +2 -2
- package/scripts/reddit-monitor-cron.sh +2 -2
- package/scripts/reminder-engine.js +1 -1
- package/scripts/schedule-manager.js +3 -3
- package/scripts/self-healing-check.js +1 -1
- package/scripts/shieldcortex-memory-firewall-runner.mjs +1 -1
- package/scripts/skill-quality-tracker.js +1 -1
- package/scripts/social-analytics/db/social-analytics.db-shm +0 -0
- package/scripts/social-analytics/db/social-analytics.db-wal +0 -0
- package/scripts/social-analytics/engagement-audit.js +202 -0
- package/scripts/social-analytics/generate-instagram-card.js +1 -1
- package/scripts/social-analytics/instagram-thumbgate-post.js +5 -1
- package/scripts/social-analytics/install-growth-automation.js +114 -0
- package/scripts/social-analytics/publish-instagram-thumbgate.js +8 -2
- package/scripts/social-analytics/publish-thumbgate-launch.js +1 -1
- package/scripts/social-analytics/publishers/reddit.js +7 -12
- package/scripts/social-analytics/publishers/zernio.js +19 -0
- package/scripts/social-analytics/reconcile-thumbgate-campaign.js +165 -0
- package/scripts/social-analytics/schedule-thumbgate-campaign.js +275 -0
- package/scripts/social-analytics/sync-launch-assets.js +185 -0
- package/scripts/social-pipeline.js +2 -2
- package/scripts/social-post-hourly.js +185 -0
- package/scripts/social-quality-gate.js +119 -3
- package/scripts/social-reply-monitor.js +150 -34
- package/scripts/statusline-cache-path.js +27 -0
- package/scripts/statusline-meta.js +22 -0
- package/scripts/statusline.sh +24 -32
- package/scripts/sync-version.js +24 -12
- package/scripts/telemetry-analytics.js +4 -4
- package/scripts/tessl-export.js +1 -1
- package/scripts/test-coverage.js +20 -13
- package/scripts/thumbgate-search.js +2 -2
- package/scripts/tool-registry.js +98 -1
- package/scripts/train_from_feedback.py +1 -1
- package/scripts/user-profile.js +4 -4
- package/scripts/validate-feedback.js +1 -1
- package/scripts/vector-store.js +1 -1
- package/scripts/verification-loop.js +1 -1
- package/scripts/verify-run.js +1 -1
- package/scripts/weekly-auto-post.js +1 -1
- package/skills/{rlhf-feedback → thumbgate-feedback}/SKILL.md +1 -1
- package/src/api/server.js +291 -41
- package/scripts/__pycache__/train_from_feedback.cpython-314.pyc +0 -0
- package/scripts/social-analytics/db/social-analytics.db +0 -0
|
@@ -10,7 +10,7 @@ const {
|
|
|
10
10
|
} = require('./analytics-window');
|
|
11
11
|
const {
|
|
12
12
|
getLegacyFeedbackDir,
|
|
13
|
-
|
|
13
|
+
getFallbackFeedbackDir,
|
|
14
14
|
resolveFallbackArtifactPath,
|
|
15
15
|
} = require('./feedback-paths');
|
|
16
16
|
|
|
@@ -20,8 +20,8 @@ function shouldIncludeLegacyTelemetry() {
|
|
|
20
20
|
if (
|
|
21
21
|
process.env._TEST_LEGACY_FEEDBACK_DIR ||
|
|
22
22
|
process.env.THUMBGATE_LEGACY_FEEDBACK_DIR ||
|
|
23
|
-
process.env.
|
|
24
|
-
process.env.
|
|
23
|
+
process.env._TEST_THUMBGATE_FALLBACK_FEEDBACK_DIR ||
|
|
24
|
+
process.env.THUMBGATE_FALLBACK_FEEDBACK_DIR
|
|
25
25
|
) {
|
|
26
26
|
return true;
|
|
27
27
|
}
|
|
@@ -121,7 +121,7 @@ function getTelemetrySourceDiagnostics(feedbackDir) {
|
|
|
121
121
|
fileName: TELEMETRY_FILE_NAME,
|
|
122
122
|
primaryPath,
|
|
123
123
|
legacyPath,
|
|
124
|
-
|
|
124
|
+
fallbackPath: path.join(getFallbackFeedbackDir({ feedbackDir }), TELEMETRY_FILE_NAME),
|
|
125
125
|
legacyFeedbackPath: path.join(getLegacyFeedbackDir({ feedbackDir }), TELEMETRY_FILE_NAME),
|
|
126
126
|
primaryExists,
|
|
127
127
|
legacyExists,
|
package/scripts/tessl-export.js
CHANGED
|
@@ -235,7 +235,7 @@ function exportTiles({
|
|
|
235
235
|
}
|
|
236
236
|
|
|
237
237
|
function verifyTiles(options = {}) {
|
|
238
|
-
const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), '
|
|
238
|
+
const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'thumbgate-tessl-verify-'));
|
|
239
239
|
|
|
240
240
|
try {
|
|
241
241
|
const results = exportTiles({
|
package/scripts/test-coverage.js
CHANGED
|
@@ -16,6 +16,7 @@ const COVERAGE_INCLUDE_GLOBS = [
|
|
|
16
16
|
const COVERAGE_EXCLUDE_GLOBS = [
|
|
17
17
|
'tests/**/*.js',
|
|
18
18
|
];
|
|
19
|
+
let cachedCoverageFilterSupport;
|
|
19
20
|
|
|
20
21
|
function findCoverageTestFiles({
|
|
21
22
|
dir = TESTS_DIR,
|
|
@@ -39,29 +40,35 @@ function findCoverageTestFiles({
|
|
|
39
40
|
return files.sort();
|
|
40
41
|
}
|
|
41
42
|
|
|
42
|
-
function
|
|
43
|
-
spawn
|
|
44
|
-
|
|
43
|
+
function detectCoverageFilterSupport({ spawn = spawnSync } = {}) {
|
|
44
|
+
if (spawn === spawnSync && cachedCoverageFilterSupport !== undefined) {
|
|
45
|
+
return cachedCoverageFilterSupport;
|
|
46
|
+
}
|
|
47
|
+
|
|
45
48
|
const result = spawn(process.execPath, ['--help'], {
|
|
46
49
|
encoding: 'utf8',
|
|
47
50
|
});
|
|
51
|
+
const helpText = `${result.stdout || ''}\n${result.stderr || ''}`;
|
|
52
|
+
const supported = helpText.includes('--test-coverage-include') && helpText.includes('--test-coverage-exclude');
|
|
48
53
|
|
|
49
|
-
if (
|
|
50
|
-
|
|
54
|
+
if (spawn === spawnSync) {
|
|
55
|
+
cachedCoverageFilterSupport = supported;
|
|
51
56
|
}
|
|
52
57
|
|
|
53
|
-
|
|
54
|
-
return help.includes('--test-coverage-include') && help.includes('--test-coverage-exclude');
|
|
58
|
+
return supported;
|
|
55
59
|
}
|
|
56
60
|
|
|
57
|
-
function buildCoverageArgs(files, {
|
|
61
|
+
function buildCoverageArgs(files, { spawn = spawnSync, supportsFilters } = {}) {
|
|
58
62
|
const args = [
|
|
59
63
|
'--test',
|
|
60
64
|
'--test-concurrency=1',
|
|
61
65
|
'--experimental-test-coverage',
|
|
62
66
|
];
|
|
63
67
|
|
|
64
|
-
|
|
68
|
+
const useFilterFlags = supportsFilters === undefined
|
|
69
|
+
? detectCoverageFilterSupport({ spawn })
|
|
70
|
+
: supportsFilters;
|
|
71
|
+
if (useFilterFlags) {
|
|
65
72
|
args.push(
|
|
66
73
|
...COVERAGE_INCLUDE_GLOBS.flatMap((pattern) => ['--test-coverage-include', pattern]),
|
|
67
74
|
...COVERAGE_EXCLUDE_GLOBS.flatMap((pattern) => ['--test-coverage-exclude', pattern]),
|
|
@@ -76,17 +83,17 @@ function runCoverage({
|
|
|
76
83
|
files = findCoverageTestFiles(),
|
|
77
84
|
cwd = PROJECT_ROOT,
|
|
78
85
|
spawn = spawnSync,
|
|
79
|
-
|
|
86
|
+
supportsFilters,
|
|
80
87
|
} = {}) {
|
|
81
88
|
if (files.length === 0) {
|
|
82
89
|
return {
|
|
83
90
|
exitCode: 1,
|
|
84
91
|
error: 'No test files found for coverage run.',
|
|
85
|
-
args: buildCoverageArgs(files, {
|
|
92
|
+
args: buildCoverageArgs(files, { spawn, supportsFilters }),
|
|
86
93
|
};
|
|
87
94
|
}
|
|
88
95
|
|
|
89
|
-
const args = buildCoverageArgs(files, {
|
|
96
|
+
const args = buildCoverageArgs(files, { spawn, supportsFilters });
|
|
90
97
|
const result = spawn(process.execPath, args, {
|
|
91
98
|
cwd,
|
|
92
99
|
env: process.env,
|
|
@@ -113,8 +120,8 @@ module.exports = {
|
|
|
113
120
|
COVERAGE_INCLUDE_GLOBS,
|
|
114
121
|
PROJECT_ROOT,
|
|
115
122
|
TESTS_DIR,
|
|
123
|
+
detectCoverageFilterSupport,
|
|
116
124
|
findCoverageTestFiles,
|
|
117
125
|
buildCoverageArgs,
|
|
118
126
|
runCoverage,
|
|
119
|
-
supportsCoveragePatternFlags,
|
|
120
127
|
};
|
|
@@ -144,7 +144,7 @@ function getRuleResults(query, limit) {
|
|
|
144
144
|
return searchPreventionRulesSync(query, limit).map(mapRuleResult);
|
|
145
145
|
}
|
|
146
146
|
|
|
147
|
-
function
|
|
147
|
+
function searchThumbgate({ query, source = 'all', limit = 10, signal = null } = {}) {
|
|
148
148
|
const trimmedQuery = String(query || '').trim();
|
|
149
149
|
if (!trimmedQuery) {
|
|
150
150
|
throw new Error('query is required');
|
|
@@ -185,5 +185,5 @@ module.exports = {
|
|
|
185
185
|
VALID_SOURCES,
|
|
186
186
|
normalizeSearchSource: normalizeSource,
|
|
187
187
|
normalizeSearchSignal: normalizeSignal,
|
|
188
|
-
|
|
188
|
+
searchThumbgate,
|
|
189
189
|
};
|
package/scripts/tool-registry.js
CHANGED
|
@@ -121,7 +121,7 @@ const TOOLS = [
|
|
|
121
121
|
},
|
|
122
122
|
}),
|
|
123
123
|
readOnlyTool({
|
|
124
|
-
name: '
|
|
124
|
+
name: 'search_thumbgate',
|
|
125
125
|
description: 'Search raw ThumbGate state across feedback logs, ContextFS memory, and prevention rules.',
|
|
126
126
|
inputSchema: {
|
|
127
127
|
type: 'object',
|
|
@@ -512,6 +512,89 @@ const TOOLS = [
|
|
|
512
512
|
},
|
|
513
513
|
},
|
|
514
514
|
}),
|
|
515
|
+
destructiveTool({
|
|
516
|
+
name: 'set_task_scope',
|
|
517
|
+
description: 'Declare or clear the current task scope so ThumbGate can compare affected files and diffs against the approved path set.',
|
|
518
|
+
inputSchema: {
|
|
519
|
+
type: 'object',
|
|
520
|
+
properties: {
|
|
521
|
+
taskId: { type: 'string', description: 'Optional stable task identifier (ticket, issue, or work item id)' },
|
|
522
|
+
summary: { type: 'string', description: 'Short summary of the task being worked' },
|
|
523
|
+
allowedPaths: {
|
|
524
|
+
type: 'array',
|
|
525
|
+
items: { type: 'string' },
|
|
526
|
+
description: 'Glob patterns that define the allowed file scope for this task',
|
|
527
|
+
},
|
|
528
|
+
protectedPaths: {
|
|
529
|
+
type: 'array',
|
|
530
|
+
items: { type: 'string' },
|
|
531
|
+
description: 'Optional protected-file globs that require explicit approval before editing or publishing',
|
|
532
|
+
},
|
|
533
|
+
repoPath: { type: 'string', description: 'Optional repo root used when evaluating git diff scope' },
|
|
534
|
+
localOnly: { type: 'boolean', description: 'When true, also marks the task as local-only' },
|
|
535
|
+
clear: { type: 'boolean', description: 'Clear the current task scope instead of setting one' },
|
|
536
|
+
},
|
|
537
|
+
},
|
|
538
|
+
}),
|
|
539
|
+
readOnlyTool({
|
|
540
|
+
name: 'get_scope_state',
|
|
541
|
+
description: 'Return the active task scope and any unexpired protected-file approvals.',
|
|
542
|
+
inputSchema: {
|
|
543
|
+
type: 'object',
|
|
544
|
+
properties: {},
|
|
545
|
+
},
|
|
546
|
+
}),
|
|
547
|
+
destructiveTool({
|
|
548
|
+
name: 'set_branch_governance',
|
|
549
|
+
description: 'Declare or clear branch and release governance so PR, merge, release, and publish actions can be evaluated against explicit workflow state.',
|
|
550
|
+
inputSchema: {
|
|
551
|
+
type: 'object',
|
|
552
|
+
properties: {
|
|
553
|
+
branchName: { type: 'string', description: 'Optional branch name the governance applies to' },
|
|
554
|
+
baseBranch: { type: 'string', description: 'Protected base branch for merge and release operations (defaults to main)' },
|
|
555
|
+
prRequired: { type: 'boolean', description: 'Whether this lane must go through a pull request (defaults to true)' },
|
|
556
|
+
prNumber: { type: 'string', description: 'Optional pull request number once a PR exists' },
|
|
557
|
+
prUrl: { type: 'string', description: 'Optional pull request URL once a PR exists' },
|
|
558
|
+
queueRequired: { type: 'boolean', description: 'Whether the target branch requires a merge queue' },
|
|
559
|
+
localOnly: { type: 'boolean', description: 'When true, PR, merge, release, and publish actions are blocked for this lane' },
|
|
560
|
+
releaseVersion: { type: 'string', description: 'Expected package version for release or publish actions' },
|
|
561
|
+
releaseEvidence: { type: 'string', description: 'Optional evidence or release plan note for the governed version' },
|
|
562
|
+
releaseSensitiveGlobs: {
|
|
563
|
+
type: 'array',
|
|
564
|
+
items: { type: 'string' },
|
|
565
|
+
description: 'Optional custom globs that define release-sensitive files for this branch lane',
|
|
566
|
+
},
|
|
567
|
+
clear: { type: 'boolean', description: 'Clear the current branch governance state instead of setting it' },
|
|
568
|
+
},
|
|
569
|
+
},
|
|
570
|
+
}),
|
|
571
|
+
readOnlyTool({
|
|
572
|
+
name: 'get_branch_governance',
|
|
573
|
+
description: 'Return the active branch and release governance state.',
|
|
574
|
+
inputSchema: {
|
|
575
|
+
type: 'object',
|
|
576
|
+
properties: {},
|
|
577
|
+
},
|
|
578
|
+
}),
|
|
579
|
+
destructiveTool({
|
|
580
|
+
name: 'approve_protected_action',
|
|
581
|
+
description: 'Grant a time-limited approval for edits or publish actions that touch protected files.',
|
|
582
|
+
inputSchema: {
|
|
583
|
+
type: 'object',
|
|
584
|
+
required: ['pathGlobs', 'reason'],
|
|
585
|
+
properties: {
|
|
586
|
+
pathGlobs: {
|
|
587
|
+
type: 'array',
|
|
588
|
+
items: { type: 'string' },
|
|
589
|
+
description: 'Protected-file globs covered by this approval',
|
|
590
|
+
},
|
|
591
|
+
reason: { type: 'string', description: 'Why this protected-file action is approved' },
|
|
592
|
+
evidence: { type: 'string', description: 'Optional supporting evidence or approval note' },
|
|
593
|
+
taskId: { type: 'string', description: 'Optional task id this approval is tied to' },
|
|
594
|
+
ttlMs: { type: 'number', description: 'Optional approval lifetime in milliseconds (defaults to 1 hour, max 24 hours)' },
|
|
595
|
+
},
|
|
596
|
+
},
|
|
597
|
+
}),
|
|
515
598
|
destructiveTool({
|
|
516
599
|
name: 'track_action',
|
|
517
600
|
description: 'Record a verification action in the current session (for example figma_verified or tests_passed). Session actions expire after one hour.',
|
|
@@ -535,6 +618,20 @@ const TOOLS = [
|
|
|
535
618
|
},
|
|
536
619
|
},
|
|
537
620
|
}),
|
|
621
|
+
readOnlyTool({
|
|
622
|
+
name: 'check_operational_integrity',
|
|
623
|
+
description: 'Evaluate whether the current repo state is safe for PR, merge, release, and publish operations.',
|
|
624
|
+
inputSchema: {
|
|
625
|
+
type: 'object',
|
|
626
|
+
properties: {
|
|
627
|
+
repoPath: { type: 'string', description: 'Optional repository path to inspect' },
|
|
628
|
+
baseBranch: { type: 'string', description: 'Protected base branch to compare against (defaults to main)' },
|
|
629
|
+
command: { type: 'string', description: 'Optional git, PR, or publish command to evaluate against the current governance state' },
|
|
630
|
+
requirePrForReleaseSensitive: { type: 'boolean', description: 'When true, release-sensitive changes on non-base branches require an open PR' },
|
|
631
|
+
requireVersionNotBehindBase: { type: 'boolean', description: 'When true, release-sensitive changes cannot lag behind the base branch package version' },
|
|
632
|
+
},
|
|
633
|
+
},
|
|
634
|
+
}),
|
|
538
635
|
destructiveTool({
|
|
539
636
|
name: 'register_claim_gate',
|
|
540
637
|
description: 'Register a custom claim verification rule in local runtime state without editing tracked repo config.',
|
|
@@ -246,7 +246,7 @@ def is_positive(entry: Dict) -> bool:
|
|
|
246
246
|
"""Determine if a feedback entry is positive."""
|
|
247
247
|
if entry.get("reward", 0) > 0:
|
|
248
248
|
return True
|
|
249
|
-
#
|
|
249
|
+
# ThumbGate uses signal field: 'positive' or 'negative'
|
|
250
250
|
signal = entry.get("signal", "").lower()
|
|
251
251
|
if signal in ("positive", "up", "thumbsup"):
|
|
252
252
|
return True
|
package/scripts/user-profile.js
CHANGED
|
@@ -12,11 +12,11 @@ function getProfilePath() {
|
|
|
12
12
|
if (process.env.THUMBGATE_FEEDBACK_DIR) {
|
|
13
13
|
return path.join(process.env.THUMBGATE_FEEDBACK_DIR, PROFILE_FILENAME);
|
|
14
14
|
}
|
|
15
|
-
const
|
|
16
|
-
if (fs.existsSync(
|
|
17
|
-
return path.join(
|
|
15
|
+
const localFallback = path.join(process.cwd(), '.thumbgate');
|
|
16
|
+
if (fs.existsSync(localFallback)) {
|
|
17
|
+
return path.join(localFallback, PROFILE_FILENAME);
|
|
18
18
|
}
|
|
19
|
-
return path.join(os.homedir(), '.
|
|
19
|
+
return path.join(os.homedir(), '.thumbgate', PROFILE_FILENAME);
|
|
20
20
|
}
|
|
21
21
|
|
|
22
22
|
function loadProfile() {
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
* 3. Anomaly detection (suspicious patterns, sensitive data)
|
|
9
9
|
* 4. Self-correction (auto-correct fixable errors)
|
|
10
10
|
*
|
|
11
|
-
* Ported from Subway_RN_Demo with
|
|
11
|
+
* Ported from Subway_RN_Demo with ThumbGate schema adaptations:
|
|
12
12
|
* - Uses 'signal' (not 'feedback') with values 'positive'/'negative'
|
|
13
13
|
* - Uses 'id' as required field (not 'source')
|
|
14
14
|
* - THUMBGATE_FEEDBACK_DIR env var for path resolution
|
package/scripts/vector-store.js
CHANGED
|
@@ -18,7 +18,7 @@ let _lancedbLoader = null;
|
|
|
18
18
|
const _pipelineCache = new Map();
|
|
19
19
|
let _lastEmbeddingProfile = null;
|
|
20
20
|
let _pipelineLoader = null;
|
|
21
|
-
const TABLE_NAME = '
|
|
21
|
+
const TABLE_NAME = 'thumbgate_memories';
|
|
22
22
|
|
|
23
23
|
async function getLanceDB() {
|
|
24
24
|
if (!_lancedb) {
|
|
@@ -17,7 +17,7 @@ const {
|
|
|
17
17
|
const { getEffectiveSetting } = require('./evolution-state');
|
|
18
18
|
|
|
19
19
|
const MAX_RETRIES = 3;
|
|
20
|
-
const DEFAULT_MODEL_PATH = path.join(__dirname, '..', '.
|
|
20
|
+
const DEFAULT_MODEL_PATH = path.join(__dirname, '..', '.thumbgate', 'verification-model.json');
|
|
21
21
|
|
|
22
22
|
/**
|
|
23
23
|
* Run a single verification step against prevention rules.
|
package/scripts/verify-run.js
CHANGED
|
@@ -230,7 +230,7 @@ function recordVerifyWorkflowRun(mode = 'quick', cwd = process.cwd(), feedbackDi
|
|
|
230
230
|
}
|
|
231
231
|
|
|
232
232
|
function runVerify(mode = 'quick', baseEnv = process.env, cwd = process.cwd()) {
|
|
233
|
-
const tempRoot = fs.mkdtempSync(path.join(os.tmpdir(), '
|
|
233
|
+
const tempRoot = fs.mkdtempSync(path.join(os.tmpdir(), 'thumbgate-verify-'));
|
|
234
234
|
const env = {
|
|
235
235
|
...baseEnv,
|
|
236
236
|
THUMBGATE_PROOF_DIR: path.join(tempRoot, 'proof-adapters'),
|
|
@@ -15,7 +15,7 @@ const os = require('os');
|
|
|
15
15
|
const { generateWeeklyStatsPost } = require('./daily-digest');
|
|
16
16
|
const { createSchedule } = require('./schedule-manager');
|
|
17
17
|
|
|
18
|
-
const POSTS_DIR = path.join(os.homedir(), '.
|
|
18
|
+
const POSTS_DIR = path.join(os.homedir(), '.thumbgate', 'weekly-posts');
|
|
19
19
|
|
|
20
20
|
function ensureDir(p) { if (!fs.existsSync(p)) fs.mkdirSync(p, { recursive: true }); }
|
|
21
21
|
|