@kuandotdev/indicator 0.1.1 → 0.1.3
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 +2 -7
- package/package.json +4 -1
- package/project/.cursor/rules/agent-docs.mdc +16 -0
- package/project/.cursor/rules/api-credential-storage.mdc +16 -0
- package/project/.cursor/rules/pinescript-v6.mdc +16 -0
- package/project/.cursor/rules/stock-model-forecast.mdc +16 -0
- package/project/.cursor/rules/system-prompt-injection.mdc +16 -0
- package/project/.cursor/rules/system-prompt-updater.mdc +16 -0
- package/project/.cursor/rules/tradingview-stock-data.mdc +16 -0
- package/project/.env.example +44 -0
- package/project/.npm-packaged-project +1 -0
- package/project/.pi/APPEND_SYSTEM.md +338 -0
- package/project/.pi/settings.json +8 -0
- package/project/AGENTS.md +538 -0
- package/project/CLAUDE.md +538 -0
- package/project/GEMINI.md +538 -0
- package/project/Makefile +488 -0
- package/project/README.md +419 -0
- package/project/conda-env-active.sh +98 -0
- package/project/conda-env-deactive.sh +42 -0
- package/project/docs/agent-install.md +446 -0
- package/project/docs/agent-skill-directory.md +222 -0
- package/project/docs/integration.html +271 -0
- package/project/packages/indicator/README.md +39 -0
- package/project/packages/indicator/package.json +40 -0
- package/project/packages/indicator/scripts/build-project-snapshot.js +57 -0
- package/project/packages/indicator/src/cli.js +368 -0
- package/project/packages/tradingview-stock-data-skill/README.md +112 -0
- package/project/packages/tradingview-stock-data-skill/extensions/stock-prompt-injector.ts +121 -0
- package/project/packages/tradingview-stock-data-skill/package.json +35 -0
- package/project/packages/tradingview-stock-data-skill/scripts/postinstall.sh +73 -0
- package/project/packages/tradingview-stock-data-skill/skills/tradingview-stock-data/SKILL.md +241 -0
- package/project/pyproject.toml +68 -0
- package/project/screenshots/.gitkeep +0 -0
- package/project/scripts/indicators/example_rsi_bands.pine +27 -0
- package/project/scripts/indicators/tsla_levels.pine +57 -0
- package/project/skills/agent-docs/SKILL.md +56 -0
- package/project/skills/api-credential-storage/SKILL.md +83 -0
- package/project/skills/api-credential-storage/scripts/upsert_env.py +151 -0
- package/project/skills/pinescript-v6/SKILL.md +129 -0
- package/project/skills/pinescript-v6/reference/built-ins.md +219 -0
- package/project/skills/pinescript-v6/reference/templates/alert-webhook.pine +76 -0
- package/project/skills/pinescript-v6/reference/templates/indicator.pine +48 -0
- package/project/skills/pinescript-v6/reference/templates/strategy.pine +50 -0
- package/project/skills/pinescript-v6/reference/v5-to-v6-migration.md +102 -0
- package/project/skills/pinescript-v6/reference/v6-language.md +202 -0
- package/project/skills/stock-model-forecast/SKILL.md +192 -0
- package/project/skills/system-prompt-injection/CUSTOM_SYSTEM_PROMPT.md +333 -0
- package/project/skills/system-prompt-injection/DEFAULT_SYSTEM_PROMPT.md +327 -0
- package/project/skills/system-prompt-injection/SKILL.md +90 -0
- package/project/skills/system-prompt-injection/SYSTEM_PROMPT.md +23 -0
- package/project/skills/system-prompt-updater/SKILL.md +82 -0
- package/project/skills/system-prompt-updater/scripts/system_prompt_update.sh +106 -0
- package/project/skills/tradingview-stock-data/SKILL.md +272 -0
- package/project/src/tv_indicator/__init__.py +0 -0
- package/project/src/tv_indicator/browser/__init__.py +0 -0
- package/project/src/tv_indicator/browser/automation.py +541 -0
- package/project/src/tv_indicator/browser/selectors.py +70 -0
- package/project/src/tv_indicator/cli/__init__.py +0 -0
- package/project/src/tv_indicator/cli/browser_cmds.py +92 -0
- package/project/src/tv_indicator/cli/data_cmds.py +178 -0
- package/project/src/tv_indicator/cli/main.py +56 -0
- package/project/src/tv_indicator/cli/model_cmds.py +255 -0
- package/project/src/tv_indicator/cli/pine_cmds.py +140 -0
- package/project/src/tv_indicator/config.py +98 -0
- package/project/src/tv_indicator/data/__init__.py +0 -0
- package/project/src/tv_indicator/data/client.py +187 -0
- package/project/src/tv_indicator/data/screener.py +268 -0
- package/project/src/tv_indicator/mcp/__init__.py +0 -0
- package/project/src/tv_indicator/mcp/agent_server.py +398 -0
- package/project/src/tv_indicator/mcp/browser_server.py +133 -0
- package/project/src/tv_indicator/mcp/data_server.py +239 -0
- package/project/src/tv_indicator/model/__init__.py +19 -0
- package/project/src/tv_indicator/model/forecast.py +693 -0
- package/project/tools/import_agent_tools.sh +503 -0
- package/project/tools/install_skills.sh +673 -0
- package/project/tools/interactive_install.sh +917 -0
- package/project/tools/progress.sh +114 -0
- package/project/tools/uninstall_agent_tools.sh +373 -0
- package/src/cli.js +22 -25
|
@@ -0,0 +1,271 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="utf-8" />
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
6
|
+
<title>Indicator — Integration Guide</title>
|
|
7
|
+
<style>
|
|
8
|
+
:root {
|
|
9
|
+
color-scheme: dark;
|
|
10
|
+
--bg: #0b1020;
|
|
11
|
+
--panel: #111832;
|
|
12
|
+
--panel2: #172040;
|
|
13
|
+
--text: #e8ecff;
|
|
14
|
+
--muted: #aeb7d9;
|
|
15
|
+
--line: #2b3768;
|
|
16
|
+
--green: #29d398;
|
|
17
|
+
--blue: #6aa7ff;
|
|
18
|
+
--yellow: #ffd166;
|
|
19
|
+
--red: #ff6b6b;
|
|
20
|
+
--purple: #c084fc;
|
|
21
|
+
}
|
|
22
|
+
* { box-sizing: border-box; }
|
|
23
|
+
body {
|
|
24
|
+
margin: 0;
|
|
25
|
+
font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
|
|
26
|
+
background: radial-gradient(circle at top left, #1f2c58 0, var(--bg) 42%);
|
|
27
|
+
color: var(--text);
|
|
28
|
+
line-height: 1.55;
|
|
29
|
+
}
|
|
30
|
+
a { color: var(--blue); }
|
|
31
|
+
.wrap { max-width: 1180px; margin: 0 auto; padding: 38px 20px 70px; }
|
|
32
|
+
.hero {
|
|
33
|
+
display: grid;
|
|
34
|
+
grid-template-columns: 1.2fr .8fr;
|
|
35
|
+
gap: 20px;
|
|
36
|
+
align-items: stretch;
|
|
37
|
+
margin-bottom: 26px;
|
|
38
|
+
}
|
|
39
|
+
.card {
|
|
40
|
+
background: color-mix(in srgb, var(--panel) 92%, transparent);
|
|
41
|
+
border: 1px solid var(--line);
|
|
42
|
+
border-radius: 18px;
|
|
43
|
+
padding: 22px;
|
|
44
|
+
box-shadow: 0 20px 60px rgba(0,0,0,.25);
|
|
45
|
+
}
|
|
46
|
+
h1 { font-size: clamp(2rem, 5vw, 4rem); line-height: 1.02; margin: 0 0 12px; }
|
|
47
|
+
h2 { font-size: 1.35rem; margin: 0 0 14px; }
|
|
48
|
+
h3 { margin: 0 0 8px; font-size: 1.05rem; }
|
|
49
|
+
p { margin: 0 0 12px; color: var(--muted); }
|
|
50
|
+
code, pre { font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace; }
|
|
51
|
+
pre {
|
|
52
|
+
background: #070b18;
|
|
53
|
+
border: 1px solid #24305e;
|
|
54
|
+
border-radius: 12px;
|
|
55
|
+
padding: 14px;
|
|
56
|
+
overflow-x: auto;
|
|
57
|
+
color: #dce6ff;
|
|
58
|
+
margin: 10px 0 0;
|
|
59
|
+
}
|
|
60
|
+
.pillrow { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 16px; }
|
|
61
|
+
.pill {
|
|
62
|
+
display: inline-flex; align-items: center; gap: 6px;
|
|
63
|
+
border: 1px solid var(--line); border-radius: 999px;
|
|
64
|
+
padding: 6px 10px; color: var(--text); background: #111a39;
|
|
65
|
+
font-size: .9rem;
|
|
66
|
+
}
|
|
67
|
+
.ok { color: var(--green); } .warn { color: var(--yellow); } .danger { color: var(--red); }
|
|
68
|
+
.grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 16px; margin: 20px 0; }
|
|
69
|
+
.grid2 { display: grid; grid-template-columns: repeat(2, 1fr); gap: 16px; margin: 20px 0; }
|
|
70
|
+
.flow {
|
|
71
|
+
display: grid;
|
|
72
|
+
grid-template-columns: repeat(5, 1fr);
|
|
73
|
+
gap: 10px;
|
|
74
|
+
align-items: stretch;
|
|
75
|
+
margin-top: 14px;
|
|
76
|
+
}
|
|
77
|
+
.step {
|
|
78
|
+
border: 1px solid var(--line);
|
|
79
|
+
border-radius: 14px;
|
|
80
|
+
padding: 14px;
|
|
81
|
+
background: linear-gradient(180deg, var(--panel2), #111832);
|
|
82
|
+
position: relative;
|
|
83
|
+
min-height: 118px;
|
|
84
|
+
}
|
|
85
|
+
.step b { color: var(--text); display: block; margin-bottom: 6px; }
|
|
86
|
+
.step small { color: var(--muted); }
|
|
87
|
+
.num {
|
|
88
|
+
width: 28px; height: 28px; border-radius: 50%;
|
|
89
|
+
display: inline-grid; place-items: center;
|
|
90
|
+
background: var(--blue); color: #061027; font-weight: 800;
|
|
91
|
+
margin-bottom: 8px;
|
|
92
|
+
}
|
|
93
|
+
table { width: 100%; border-collapse: collapse; margin-top: 8px; overflow: hidden; border-radius: 12px; }
|
|
94
|
+
th, td { border-bottom: 1px solid var(--line); padding: 10px; text-align: left; vertical-align: top; }
|
|
95
|
+
th { color: var(--text); background: #151f42; }
|
|
96
|
+
td { color: var(--muted); }
|
|
97
|
+
.command { color: var(--green); }
|
|
98
|
+
.note {
|
|
99
|
+
border-left: 4px solid var(--yellow);
|
|
100
|
+
padding: 12px 14px;
|
|
101
|
+
background: rgba(255, 209, 102, .08);
|
|
102
|
+
border-radius: 10px;
|
|
103
|
+
color: var(--muted);
|
|
104
|
+
}
|
|
105
|
+
.kbd { color: var(--yellow); }
|
|
106
|
+
footer { color: var(--muted); margin-top: 24px; font-size: .9rem; }
|
|
107
|
+
@media (max-width: 920px) {
|
|
108
|
+
.hero, .grid, .grid2, .flow { grid-template-columns: 1fr; }
|
|
109
|
+
}
|
|
110
|
+
</style>
|
|
111
|
+
</head>
|
|
112
|
+
<body>
|
|
113
|
+
<main class="wrap">
|
|
114
|
+
<section class="hero">
|
|
115
|
+
<div class="card">
|
|
116
|
+
<h1>Indicator</h1>
|
|
117
|
+
<p>
|
|
118
|
+
A local Indicator for agents and terminal users to fetch TradingView-style market data,
|
|
119
|
+
write Pine Script v6, push scripts into TradingView's Pine Editor, and capture chart screenshots.
|
|
120
|
+
</p>
|
|
121
|
+
<div class="pillrow">
|
|
122
|
+
<span class="pill"><span class="ok">●</span> Conda + Make</span>
|
|
123
|
+
<span class="pill"><span class="ok">●</span> <code>tv</code> CLI</span>
|
|
124
|
+
<span class="pill"><span class="ok">●</span> Playwright browser profile</span>
|
|
125
|
+
<span class="pill"><span class="ok">●</span> MCP servers</span>
|
|
126
|
+
<span class="pill"><span class="ok">●</span> Pine v6 agent skill</span>
|
|
127
|
+
</div>
|
|
128
|
+
</div>
|
|
129
|
+
<div class="card">
|
|
130
|
+
<h2>Open this file locally</h2>
|
|
131
|
+
<p>From the project root:</p>
|
|
132
|
+
<pre><span class="command">open docs/integration.html</span></pre>
|
|
133
|
+
<p style="margin-top:12px">Start with the health checks:</p>
|
|
134
|
+
<pre><span class="command">make doctor
|
|
135
|
+
make session-check</span></pre>
|
|
136
|
+
</div>
|
|
137
|
+
</section>
|
|
138
|
+
|
|
139
|
+
<section class="card">
|
|
140
|
+
<h2>How the pieces connect</h2>
|
|
141
|
+
<div class="flow">
|
|
142
|
+
<div class="step"><span class="num">1</span><b>User / Agent</b><small>Asks for TSLA check, indicator creation, or chart screenshot.</small></div>
|
|
143
|
+
<div class="step"><span class="num">2</span><b>Make + CLI</b><small><code>make rating</code>, <code>make push</code>, or direct <code>tv ...</code> command.</small></div>
|
|
144
|
+
<div class="step"><span class="num">3</span><b>Data layer</b><small><code>tvdatafeed</code> for OHLCV and <code>tradingview-screener</code> for ratings/screeners.</small></div>
|
|
145
|
+
<div class="step"><span class="num">4</span><b>Pine skill</b><small>Agents use <code>skills/pinescript-v6</code> to author valid Pine v6 files.</small></div>
|
|
146
|
+
<div class="step"><span class="num">5</span><b>Browser layer</b><small>Playwright logs in, switches symbol, pastes Pine, applies script, screenshots.</small></div>
|
|
147
|
+
</div>
|
|
148
|
+
</section>
|
|
149
|
+
|
|
150
|
+
<section class="grid">
|
|
151
|
+
<div class="card">
|
|
152
|
+
<h2>1. Install</h2>
|
|
153
|
+
<p>Creates/updates the <code>tv-indicator</code> conda env and installs package deps.</p>
|
|
154
|
+
<pre><span class="command">make install
|
|
155
|
+
cp .env.example .env
|
|
156
|
+
make doctor</span></pre>
|
|
157
|
+
</div>
|
|
158
|
+
<div class="card">
|
|
159
|
+
<h2>2. Login</h2>
|
|
160
|
+
<p>Preferred: let Playwright save your TradingView browser session.</p>
|
|
161
|
+
<pre><span class="command">make login
|
|
162
|
+
make session-check</span></pre>
|
|
163
|
+
<p>Fallback: paste <code>TV_SESSIONID</code> into <code>.env</code>.</p>
|
|
164
|
+
</div>
|
|
165
|
+
<div class="card">
|
|
166
|
+
<h2>3. Use it</h2>
|
|
167
|
+
<p>Run through Make without activating conda.</p>
|
|
168
|
+
<pre><span class="command">make rating SYMBOL=NASDAQ:TSLA
|
|
169
|
+
make screenshot SYMBOL=NASDAQ:TSLA</span></pre>
|
|
170
|
+
</div>
|
|
171
|
+
</section>
|
|
172
|
+
|
|
173
|
+
<section class="grid2">
|
|
174
|
+
<div class="card">
|
|
175
|
+
<h2>Common terminal workflows</h2>
|
|
176
|
+
<table>
|
|
177
|
+
<thead><tr><th>Goal</th><th>Command</th></tr></thead>
|
|
178
|
+
<tbody>
|
|
179
|
+
<tr><td>Find a ticker</td><td><code>make search Q=tesla</code></td></tr>
|
|
180
|
+
<tr><td>Get OHLCV</td><td><code>make ohlcv SYMBOL=NASDAQ:TSLA INTERVAL=1D BARS=30</code></td></tr>
|
|
181
|
+
<tr><td>Get TV rating</td><td><code>make rating SYMBOL=NASDAQ:TSLA</code></td></tr>
|
|
182
|
+
<tr><td>Take screenshot</td><td><code>make screenshot SYMBOL=NASDAQ:TSLA</code></td></tr>
|
|
183
|
+
<tr><td>Create indicator template</td><td><code>make pine-new KIND=indicator NAME=my_indicator</code></td></tr>
|
|
184
|
+
<tr><td>Validate Pine locally</td><td><code>make pine-validate SCRIPT=scripts/indicators/my_indicator.pine</code></td></tr>
|
|
185
|
+
<tr><td>Push Pine to chart</td><td><code>make push SCRIPT=scripts/indicators/my_indicator.pine APPLY=NASDAQ:TSLA SHOT=1</code></td></tr>
|
|
186
|
+
</tbody>
|
|
187
|
+
</table>
|
|
188
|
+
</div>
|
|
189
|
+
<div class="card">
|
|
190
|
+
<h2>Direct <code>tv</code> CLI</h2>
|
|
191
|
+
<p>Activate the conda env if you prefer calling the CLI directly.</p>
|
|
192
|
+
<pre><span class="command">source conda-env-active.sh tv-indicator
|
|
193
|
+
|
|
194
|
+
tv data search "tesla"
|
|
195
|
+
tv data rating NASDAQ:TSLA
|
|
196
|
+
tv data ohlcv NASDAQ:TSLA --interval 1D --bars 50
|
|
197
|
+
tv browser screenshot --symbol NASDAQ:TSLA
|
|
198
|
+
tv browser push scripts/indicators/my_indicator.pine --apply NASDAQ:TSLA --screenshot</span></pre>
|
|
199
|
+
</div>
|
|
200
|
+
</section>
|
|
201
|
+
|
|
202
|
+
<section class="card">
|
|
203
|
+
<h2>Agent integration</h2>
|
|
204
|
+
<p>
|
|
205
|
+
The canonical Pine skill lives at <code>skills/pinescript-v6/SKILL.md</code>.
|
|
206
|
+
Project-local discovery files point to it for Claude Code, pi, Cursor, Gemini, and Codex-style agents.
|
|
207
|
+
</p>
|
|
208
|
+
<table>
|
|
209
|
+
<thead><tr><th>Agent/tool</th><th>Project path</th><th>Purpose</th></tr></thead>
|
|
210
|
+
<tbody>
|
|
211
|
+
<tr><td>pi</td><td><code>.pi/agent/skills/pinescript-v6</code></td><td>Project-local skill symlink.</td></tr>
|
|
212
|
+
<tr><td>Claude Code</td><td><code>.claude/skills/pinescript-v6</code></td><td>Project-local skill symlink.</td></tr>
|
|
213
|
+
<tr><td>Cursor</td><td><code>.cursor/rules/pinescript-v6.mdc</code></td><td>Thin rule pointing to the canonical skill.</td></tr>
|
|
214
|
+
<tr><td>Codex/OpenCode/Aider</td><td><code>AGENTS.md</code></td><td>Project agent instructions.</td></tr>
|
|
215
|
+
<tr><td>Gemini CLI</td><td><code>GEMINI.md</code></td><td>Project agent instructions.</td></tr>
|
|
216
|
+
</tbody>
|
|
217
|
+
</table>
|
|
218
|
+
<pre><span class="command">make install-skills
|
|
219
|
+
make check-skills
|
|
220
|
+
make update-skills</span></pre>
|
|
221
|
+
</section>
|
|
222
|
+
|
|
223
|
+
<section class="grid2">
|
|
224
|
+
<div class="card">
|
|
225
|
+
<h2>MCP integration</h2>
|
|
226
|
+
<p>Expose data and browser functions to MCP-capable agents.</p>
|
|
227
|
+
<pre><span class="command">make mcp-config-claude
|
|
228
|
+
make mcp-config-pi
|
|
229
|
+
make mcp-data
|
|
230
|
+
make mcp-browser</span></pre>
|
|
231
|
+
<p>MCP servers:</p>
|
|
232
|
+
<ul>
|
|
233
|
+
<li><code>tv-mcp-data</code>: OHLCV, search, screener, ratings</li>
|
|
234
|
+
<li><code>tv-mcp-browser</code>: session check, push script, screenshot</li>
|
|
235
|
+
</ul>
|
|
236
|
+
</div>
|
|
237
|
+
<div class="card">
|
|
238
|
+
<h2>Generated artifacts</h2>
|
|
239
|
+
<p class="note">
|
|
240
|
+
Screenshots are runtime output and are intentionally gitignored:
|
|
241
|
+
<code>screenshots/*</code> is ignored while <code>screenshots/.gitkeep</code> is tracked.
|
|
242
|
+
</p>
|
|
243
|
+
<p>Files you usually commit:</p>
|
|
244
|
+
<ul>
|
|
245
|
+
<li><code>scripts/indicators/*.pine</code> and <code>scripts/strategies/*.pine</code></li>
|
|
246
|
+
<li><code>skills/pinescript-v6/**</code></li>
|
|
247
|
+
<li><code>src/tv_indicator/**</code></li>
|
|
248
|
+
<li><code>Makefile</code>, <code>README.md</code>, <code>docs/integration.html</code></li>
|
|
249
|
+
</ul>
|
|
250
|
+
</div>
|
|
251
|
+
</section>
|
|
252
|
+
|
|
253
|
+
<section class="card">
|
|
254
|
+
<h2>Example: check TSLA end-to-end</h2>
|
|
255
|
+
<pre><span class="command">make search Q=tesla
|
|
256
|
+
make rating SYMBOL=NASDAQ:TSLA
|
|
257
|
+
make ohlcv SYMBOL=NASDAQ:TSLA INTERVAL=1D BARS=30
|
|
258
|
+
make screenshot SYMBOL=NASDAQ:TSLA
|
|
259
|
+
make push SCRIPT=scripts/indicators/tsla_levels.pine APPLY=NASDAQ:TSLA SHOT=1</span></pre>
|
|
260
|
+
<p>
|
|
261
|
+
This produces market context, a chart screenshot, and — if the Pine file exists — applies
|
|
262
|
+
the indicator to the TSLA chart. Screenshot PNGs stay local and are not committed.
|
|
263
|
+
</p>
|
|
264
|
+
</section>
|
|
265
|
+
|
|
266
|
+
<footer>
|
|
267
|
+
Local-only guide. No external assets or network calls are required to view this page.
|
|
268
|
+
</footer>
|
|
269
|
+
</main>
|
|
270
|
+
</body>
|
|
271
|
+
</html>
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# @kuandotdev/indicator
|
|
2
|
+
|
|
3
|
+
Node wrapper CLI for Indicator.
|
|
4
|
+
|
|
5
|
+
This package is a production-shaped bootstrapper: it does not replace the Python
|
|
6
|
+
runtime. It wraps the existing repo commands for install, uninstall, diagnostics,
|
|
7
|
+
MCP/agent import, market data, and model forecast checks.
|
|
8
|
+
The npm package includes the installable project files directly, so users do not
|
|
9
|
+
need GitHub repository access to install the tool.
|
|
10
|
+
|
|
11
|
+
## Local Development
|
|
12
|
+
|
|
13
|
+
Use the repo Makefile for local development installs and reinstalls:
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
make install
|
|
17
|
+
make uninstall
|
|
18
|
+
make install FORCE_INSTALL=1
|
|
19
|
+
make agent-import PLATFORM=auto
|
|
20
|
+
make check-skills
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
Use the wrapper directly only when testing the package itself:
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
node src/cli.js --help
|
|
27
|
+
node src/cli.js doctor
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
## Production Install
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
npx @kuandotdev/indicator install
|
|
34
|
+
npx @kuandotdev/indicator install --force
|
|
35
|
+
npx @kuandotdev/indicator uninstall --platform auto
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
For IP protection, keep proprietary prompts/model orchestration server-side and
|
|
39
|
+
ship this package as a thin local installer/client.
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@kuandotdev/indicator",
|
|
3
|
+
"version": "0.1.3",
|
|
4
|
+
"description": "Indicator CLI wrapper for install, uninstall, diagnostics, market data, and model forecast commands.",
|
|
5
|
+
"license": "UNLICENSED",
|
|
6
|
+
"private": false,
|
|
7
|
+
"type": "module",
|
|
8
|
+
"bin": {
|
|
9
|
+
"indicator": "src/cli.js"
|
|
10
|
+
},
|
|
11
|
+
"scripts": {
|
|
12
|
+
"prepack": "node scripts/build-project-snapshot.js",
|
|
13
|
+
"postpack": "node scripts/build-project-snapshot.js --clean",
|
|
14
|
+
"start": "node src/cli.js",
|
|
15
|
+
"check": "node --check src/cli.js",
|
|
16
|
+
"test-install-wrapper": "node src/cli.js install --skip-wizard",
|
|
17
|
+
"test-uninstall-wrapper": "node src/cli.js uninstall --dry-run",
|
|
18
|
+
"doctor": "node src/cli.js doctor"
|
|
19
|
+
},
|
|
20
|
+
"keywords": [
|
|
21
|
+
"tradingview",
|
|
22
|
+
"indicator",
|
|
23
|
+
"mcp",
|
|
24
|
+
"agent",
|
|
25
|
+
"cli",
|
|
26
|
+
"installer"
|
|
27
|
+
],
|
|
28
|
+
"engines": {
|
|
29
|
+
"node": ">=18"
|
|
30
|
+
},
|
|
31
|
+
"publishConfig": {
|
|
32
|
+
"access": "public"
|
|
33
|
+
},
|
|
34
|
+
"files": [
|
|
35
|
+
"project",
|
|
36
|
+
"src",
|
|
37
|
+
"README.md",
|
|
38
|
+
"package.json"
|
|
39
|
+
]
|
|
40
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { execFileSync } from "node:child_process";
|
|
3
|
+
import {
|
|
4
|
+
copyFileSync,
|
|
5
|
+
existsSync,
|
|
6
|
+
lstatSync,
|
|
7
|
+
mkdirSync,
|
|
8
|
+
readlinkSync,
|
|
9
|
+
rmSync,
|
|
10
|
+
statSync,
|
|
11
|
+
chmodSync,
|
|
12
|
+
symlinkSync,
|
|
13
|
+
writeFileSync,
|
|
14
|
+
} from "node:fs";
|
|
15
|
+
import { dirname, resolve } from "node:path";
|
|
16
|
+
import { fileURLToPath } from "node:url";
|
|
17
|
+
|
|
18
|
+
const packageRoot = resolve(dirname(fileURLToPath(import.meta.url)), "..");
|
|
19
|
+
const repoRoot = resolve(packageRoot, "..", "..");
|
|
20
|
+
const outputRoot = resolve(packageRoot, "project");
|
|
21
|
+
|
|
22
|
+
if (process.argv.includes("--clean")) {
|
|
23
|
+
rmSync(outputRoot, { recursive: true, force: true });
|
|
24
|
+
process.exit(0);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
rmSync(outputRoot, { recursive: true, force: true });
|
|
28
|
+
mkdirSync(outputRoot, { recursive: true });
|
|
29
|
+
|
|
30
|
+
const tracked = execFileSync("git", ["-C", repoRoot, "ls-files", "-z"], {
|
|
31
|
+
encoding: "utf8",
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
const files = tracked
|
|
35
|
+
.split("\0")
|
|
36
|
+
.filter(Boolean)
|
|
37
|
+
.filter((file) => !file.startsWith("packages/indicator/project/"));
|
|
38
|
+
|
|
39
|
+
for (const file of files) {
|
|
40
|
+
const source = resolve(repoRoot, file);
|
|
41
|
+
const target = resolve(outputRoot, file);
|
|
42
|
+
mkdirSync(dirname(target), { recursive: true });
|
|
43
|
+
const entry = lstatSync(source);
|
|
44
|
+
if (entry.isSymbolicLink()) {
|
|
45
|
+
symlinkSync(readlinkSync(source), target);
|
|
46
|
+
continue;
|
|
47
|
+
}
|
|
48
|
+
copyFileSync(source, target);
|
|
49
|
+
chmodSync(target, statSync(source).mode);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
writeFileSync(
|
|
53
|
+
resolve(outputRoot, ".npm-packaged-project"),
|
|
54
|
+
"This project snapshot was bundled into the @kuandotdev/indicator npm package.\n",
|
|
55
|
+
);
|
|
56
|
+
|
|
57
|
+
console.log(`Bundled ${files.length} project files into ${outputRoot}`);
|