@drico2008/fincli 0.1.0

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.
Files changed (69) hide show
  1. package/README.md +644 -0
  2. package/fincli/__init__.py +3 -0
  3. package/fincli/app/__init__.py +1 -0
  4. package/fincli/app/analysis/__init__.py +1 -0
  5. package/fincli/app/analysis/ai_prompts.py +33 -0
  6. package/fincli/app/analysis/analyzer.py +119 -0
  7. package/fincli/app/analysis/assistant_context.py +161 -0
  8. package/fincli/app/analysis/indicators.py +143 -0
  9. package/fincli/app/analysis/market_structure.py +106 -0
  10. package/fincli/app/analysis/technical_debate.py +251 -0
  11. package/fincli/app/analysis/technical_signal.py +203 -0
  12. package/fincli/app/cli/__init__.py +1 -0
  13. package/fincli/app/cli/autocomplete.py +17 -0
  14. package/fincli/app/cli/commands.py +82 -0
  15. package/fincli/app/cli/router.py +1257 -0
  16. package/fincli/app/main.py +16 -0
  17. package/fincli/app/modules/__init__.py +1 -0
  18. package/fincli/app/modules/economic_calendar.py +139 -0
  19. package/fincli/app/modules/exporter.py +51 -0
  20. package/fincli/app/modules/journal.py +65 -0
  21. package/fincli/app/modules/journal_analytics.py +70 -0
  22. package/fincli/app/modules/portfolio.py +34 -0
  23. package/fincli/app/modules/scanner.py +105 -0
  24. package/fincli/app/modules/transactions.py +84 -0
  25. package/fincli/app/modules/watchlist.py +25 -0
  26. package/fincli/app/providers/__init__.py +1 -0
  27. package/fincli/app/providers/ai/__init__.py +1 -0
  28. package/fincli/app/providers/ai/anthropic_provider.py +11 -0
  29. package/fincli/app/providers/ai/base.py +29 -0
  30. package/fincli/app/providers/ai/gemini_provider.py +11 -0
  31. package/fincli/app/providers/ai/groq_provider.py +11 -0
  32. package/fincli/app/providers/ai/http_provider.py +145 -0
  33. package/fincli/app/providers/ai/huggingface_provider.py +11 -0
  34. package/fincli/app/providers/ai/manager.py +60 -0
  35. package/fincli/app/providers/ai/openai_provider.py +11 -0
  36. package/fincli/app/providers/ai/openrouter_provider.py +11 -0
  37. package/fincli/app/providers/ai/together_provider.py +11 -0
  38. package/fincli/app/providers/market/__init__.py +1 -0
  39. package/fincli/app/providers/market/base.py +77 -0
  40. package/fincli/app/providers/market/custom_provider.py +169 -0
  41. package/fincli/app/providers/market/finnhub_provider.py +187 -0
  42. package/fincli/app/providers/market/manager.py +123 -0
  43. package/fincli/app/providers/market/news_provider.py +28 -0
  44. package/fincli/app/providers/market/symbols.py +182 -0
  45. package/fincli/app/providers/market/twelvedata_provider.py +167 -0
  46. package/fincli/app/providers/market/yfinance_provider.py +447 -0
  47. package/fincli/app/services/__init__.py +1 -0
  48. package/fincli/app/services/market_data.py +203 -0
  49. package/fincli/app/services/market_overview.py +111 -0
  50. package/fincli/app/storage/__init__.py +1 -0
  51. package/fincli/app/storage/cache.py +38 -0
  52. package/fincli/app/storage/config.py +114 -0
  53. package/fincli/app/storage/database.py +101 -0
  54. package/fincli/app/storage/market_cache.py +92 -0
  55. package/fincli/app/tui/__init__.py +1 -0
  56. package/fincli/app/tui/components.py +55 -0
  57. package/fincli/app/tui/layout.py +261 -0
  58. package/fincli/app/tui/market_provider_selector.py +267 -0
  59. package/fincli/app/tui/model_selector.py +412 -0
  60. package/fincli/app/tui/theme.py +157 -0
  61. package/fincli/app/utils/__init__.py +1 -0
  62. package/fincli/app/utils/errors.py +33 -0
  63. package/fincli/app/utils/formatting.py +17 -0
  64. package/fincli/app/utils/logger.py +19 -0
  65. package/npm/bin/fincli.js +35 -0
  66. package/npm/postinstall.js +72 -0
  67. package/package.json +23 -0
  68. package/pyproject.toml +31 -0
  69. package/requirements.txt +9 -0
@@ -0,0 +1,35 @@
1
+ #!/usr/bin/env node
2
+
3
+ const fs = require("fs");
4
+ const path = require("path");
5
+ const { spawn } = require("child_process");
6
+
7
+ const packageRoot = path.resolve(__dirname, "..", "..");
8
+ const venvDir = path.join(packageRoot, ".npm-python");
9
+ const pythonBin = process.platform === "win32"
10
+ ? path.join(venvDir, "Scripts", "python.exe")
11
+ : path.join(venvDir, "bin", "python");
12
+
13
+ function run() {
14
+ if (!fs.existsSync(pythonBin)) {
15
+ console.error("FinCLI Python runtime is missing.");
16
+ console.error("Try reinstalling with: npm install -g fincli");
17
+ console.error("Python 3.11+ must be available during npm install.");
18
+ process.exit(1);
19
+ }
20
+
21
+ const child = spawn(pythonBin, ["-m", "fincli.app.main", ...process.argv.slice(2)], {
22
+ cwd: packageRoot,
23
+ stdio: "inherit"
24
+ });
25
+
26
+ child.on("exit", (code, signal) => {
27
+ if (signal) {
28
+ process.kill(process.pid, signal);
29
+ return;
30
+ }
31
+ process.exit(code ?? 0);
32
+ });
33
+ }
34
+
35
+ run();
@@ -0,0 +1,72 @@
1
+ #!/usr/bin/env node
2
+
3
+ const fs = require("fs");
4
+ const path = require("path");
5
+ const { spawnSync } = require("child_process");
6
+
7
+ const packageRoot = path.resolve(__dirname, "..");
8
+ const venvDir = path.join(packageRoot, ".npm-python");
9
+
10
+ function candidates() {
11
+ if (process.env.PYTHON) {
12
+ return [{ command: process.env.PYTHON, args: [] }];
13
+ }
14
+ if (process.platform === "win32") {
15
+ return [
16
+ { command: "py", args: ["-3"] },
17
+ { command: "python", args: [] }
18
+ ];
19
+ }
20
+ return [
21
+ { command: "python3", args: [] },
22
+ { command: "python", args: [] }
23
+ ];
24
+ }
25
+
26
+ function findPython() {
27
+ for (const candidate of candidates()) {
28
+ const result = spawnSync(candidate.command, [...candidate.args, "--version"], {
29
+ encoding: "utf8",
30
+ stdio: ["ignore", "pipe", "pipe"]
31
+ });
32
+ if (result.status === 0) {
33
+ return candidate;
34
+ }
35
+ }
36
+ return null;
37
+ }
38
+
39
+ function venvPython() {
40
+ return process.platform === "win32"
41
+ ? path.join(venvDir, "Scripts", "python.exe")
42
+ : path.join(venvDir, "bin", "python");
43
+ }
44
+
45
+ function run(command, args, options = {}) {
46
+ const result = spawnSync(command, args, {
47
+ cwd: packageRoot,
48
+ stdio: "inherit",
49
+ ...options
50
+ });
51
+ if (result.status !== 0) {
52
+ throw new Error(`${command} ${args.join(" ")} failed`);
53
+ }
54
+ }
55
+
56
+ function main() {
57
+ const python = findPython();
58
+ if (!python) {
59
+ console.error("FinCLI requires Python 3.11+ during npm install.");
60
+ console.error("Install Python, then rerun: npm install -g fincli");
61
+ process.exit(1);
62
+ }
63
+
64
+ if (!fs.existsSync(venvPython())) {
65
+ run(python.command, [...python.args, "-m", "venv", venvDir]);
66
+ }
67
+
68
+ run(venvPython(), ["-m", "pip", "install", "--upgrade", "pip"]);
69
+ run(venvPython(), ["-m", "pip", "install", "."]);
70
+ }
71
+
72
+ main();
package/package.json ADDED
@@ -0,0 +1,23 @@
1
+ {
2
+ "name": "@drico2008/fincli",
3
+ "version": "0.1.0",
4
+ "description": "Modern financial CLI/TUI terminal for market monitoring and analysis.",
5
+ "license": "MIT",
6
+ "bin": {
7
+ "fincli": "npm/bin/fincli.js"
8
+ },
9
+ "scripts": {
10
+ "postinstall": "node npm/postinstall.js",
11
+ "check": "node --check npm/bin/fincli.js && node --check npm/postinstall.js"
12
+ },
13
+ "files": [
14
+ "fincli/**/*.py",
15
+ "npm",
16
+ "pyproject.toml",
17
+ "README.md",
18
+ "requirements.txt"
19
+ ],
20
+ "engines": {
21
+ "node": ">=18"
22
+ }
23
+ }
package/pyproject.toml ADDED
@@ -0,0 +1,31 @@
1
+ [build-system]
2
+ requires = ["setuptools>=68", "wheel"]
3
+ build-backend = "setuptools.build_meta"
4
+
5
+ [project]
6
+ name = "fincli"
7
+ version = "0.1.0"
8
+ description = "Modern financial CLI/TUI terminal for market monitoring and analysis."
9
+ readme = "README.md"
10
+ requires-python = ">=3.11"
11
+ dependencies = [
12
+ "textual>=0.86.0",
13
+ "rich>=13.9.0",
14
+ "python-dotenv>=1.0.1",
15
+ "httpx>=0.27.2",
16
+ "pydantic>=2.9.2",
17
+ "yfinance>=0.2.50",
18
+ "pandas>=2.2.3",
19
+ "numpy>=2.1.0",
20
+ ]
21
+
22
+ [project.optional-dependencies]
23
+ dev = ["pytest>=8.3.3"]
24
+ market = ["yfinance>=0.2.50", "pandas>=2.2.3", "numpy>=2.1.0"]
25
+
26
+ [project.scripts]
27
+ fincli = "fincli.app.main:main"
28
+
29
+ [tool.pytest.ini_options]
30
+ testpaths = ["tests"]
31
+ pythonpath = ["."]
@@ -0,0 +1,9 @@
1
+ textual>=0.86.0
2
+ rich>=13.9.0
3
+ python-dotenv>=1.0.1
4
+ httpx>=0.27.2
5
+ pydantic>=2.9.2
6
+ yfinance>=0.2.50
7
+ pandas>=2.2.3
8
+ numpy>=2.1.0
9
+ pytest>=8.3.3