irl-wisdom 2.0.0__tar.gz

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.
@@ -0,0 +1,52 @@
1
+ Metadata-Version: 2.4
2
+ Name: irl-wisdom
3
+ Version: 2.0.0
4
+ Summary: A massive CLI for daily wisdom, mental models, power laws, and more.
5
+ Author-email: Antigravity <antigravity@example.com>
6
+ Classifier: Programming Language :: Python :: 3
7
+ Classifier: License :: OSI Approved :: MIT License
8
+ Classifier: Operating System :: OS Independent
9
+ Requires-Python: >=3.8
10
+ Description-Content-Type: text/markdown
11
+ Requires-Dist: rich>=13.0.0
12
+ Requires-Dist: questionary>=2.0.0
13
+ Requires-Dist: pyperclip>=1.8.0
14
+ Requires-Dist: typer>=0.9.0
15
+
16
+ # IRL Wisdom CLI 🗿
17
+
18
+ A massive, feature-rich Terminal User Interface (TUI) for daily wisdom, mental models, cognitive biases, 48 laws of power, and hardcore discipline quotes.
19
+
20
+ ## Features
21
+ - **Interactive Dashboard:** Beautiful, keyboard-navigable interactive menu.
22
+ - **Huge Datasets:** Hundreds of items spanning Stoic wisdom, Moai vibes, powerful facts, and more.
23
+ - **Favorites System:** Save your favorite quotes to a local favorites list.
24
+ - **Copy to Clipboard:** Instantly copy text to your clipboard.
25
+ - **Daily Streak Tracker:** Tracks your daily streak every time you open the app.
26
+
27
+ ## Installation
28
+ ```bash
29
+ pip install irl-wisdom
30
+ ```
31
+
32
+ ## Usage
33
+ Simply run the interactive dashboard:
34
+ ```bash
35
+ irl-wisdom
36
+ ```
37
+
38
+ Or run specific commands:
39
+ ```bash
40
+ irl-wisdom daily
41
+ irl-wisdom moai
42
+ irl-wisdom power
43
+ irl-wisdom models
44
+ irl-wisdom biases
45
+ irl-wisdom discipline
46
+ irl-wisdom fact
47
+ ```
48
+
49
+ Add the `--copy` flag to copy the output to your clipboard instantly:
50
+ ```bash
51
+ irl-wisdom power --copy
52
+ ```
@@ -0,0 +1,37 @@
1
+ # IRL Wisdom CLI 🗿
2
+
3
+ A massive, feature-rich Terminal User Interface (TUI) for daily wisdom, mental models, cognitive biases, 48 laws of power, and hardcore discipline quotes.
4
+
5
+ ## Features
6
+ - **Interactive Dashboard:** Beautiful, keyboard-navigable interactive menu.
7
+ - **Huge Datasets:** Hundreds of items spanning Stoic wisdom, Moai vibes, powerful facts, and more.
8
+ - **Favorites System:** Save your favorite quotes to a local favorites list.
9
+ - **Copy to Clipboard:** Instantly copy text to your clipboard.
10
+ - **Daily Streak Tracker:** Tracks your daily streak every time you open the app.
11
+
12
+ ## Installation
13
+ ```bash
14
+ pip install irl-wisdom
15
+ ```
16
+
17
+ ## Usage
18
+ Simply run the interactive dashboard:
19
+ ```bash
20
+ irl-wisdom
21
+ ```
22
+
23
+ Or run specific commands:
24
+ ```bash
25
+ irl-wisdom daily
26
+ irl-wisdom moai
27
+ irl-wisdom power
28
+ irl-wisdom models
29
+ irl-wisdom biases
30
+ irl-wisdom discipline
31
+ irl-wisdom fact
32
+ ```
33
+
34
+ Add the `--copy` flag to copy the output to your clipboard instantly:
35
+ ```bash
36
+ irl-wisdom power --copy
37
+ ```
@@ -0,0 +1 @@
1
+ # IRL Wisdom CLI
@@ -0,0 +1,194 @@
1
+ [
2
+ {
3
+ "law": "Law 1: Never Outshine the Master",
4
+ "description": "Refer to Robert Greene's 48 Laws of Power for the full text."
5
+ },
6
+ {
7
+ "law": "Law 2: Never Put Too Much Trust in Friends, Learn How to Use Enemies",
8
+ "description": "Refer to Robert Greene's 48 Laws of Power for the full text."
9
+ },
10
+ {
11
+ "law": "Law 3: Conceal Your Intentions",
12
+ "description": "Refer to Robert Greene's 48 Laws of Power for the full text."
13
+ },
14
+ {
15
+ "law": "Law 4: Always Say Less Than Necessary",
16
+ "description": "Refer to Robert Greene's 48 Laws of Power for the full text."
17
+ },
18
+ {
19
+ "law": "Law 5: So Much Depends on Reputation – Guard It with Your Life",
20
+ "description": "Refer to Robert Greene's 48 Laws of Power for the full text."
21
+ },
22
+ {
23
+ "law": "Law 6: Court Attention at All Costs",
24
+ "description": "Refer to Robert Greene's 48 Laws of Power for the full text."
25
+ },
26
+ {
27
+ "law": "Law 7: Get Others to Do the Work for You, but Always Take the Credit",
28
+ "description": "Refer to Robert Greene's 48 Laws of Power for the full text."
29
+ },
30
+ {
31
+ "law": "Law 8: Make Other People Come to You – Use Bait If Necessary",
32
+ "description": "Refer to Robert Greene's 48 Laws of Power for the full text."
33
+ },
34
+ {
35
+ "law": "Law 9: Win Through Your Actions, Never Through Argument",
36
+ "description": "Refer to Robert Greene's 48 Laws of Power for the full text."
37
+ },
38
+ {
39
+ "law": "Law 10: Infection: Avoid the Unhappy and Unlucky",
40
+ "description": "Refer to Robert Greene's 48 Laws of Power for the full text."
41
+ },
42
+ {
43
+ "law": "Law 11: Learn to Keep People Dependent on You",
44
+ "description": "Refer to Robert Greene's 48 Laws of Power for the full text."
45
+ },
46
+ {
47
+ "law": "Law 12: Use Selective Honesty and Generosity to Disarm Your Victim",
48
+ "description": "Refer to Robert Greene's 48 Laws of Power for the full text."
49
+ },
50
+ {
51
+ "law": "Law 13: When Asking for Help, Appeal to People's Self-Interest",
52
+ "description": "Refer to Robert Greene's 48 Laws of Power for the full text."
53
+ },
54
+ {
55
+ "law": "Law 14: Pose as a Friend, Work as a Spy",
56
+ "description": "Refer to Robert Greene's 48 Laws of Power for the full text."
57
+ },
58
+ {
59
+ "law": "Law 15: Crush Your Enemy Totally",
60
+ "description": "Refer to Robert Greene's 48 Laws of Power for the full text."
61
+ },
62
+ {
63
+ "law": "Law 16: Use Absence to Increase Respect and Honor",
64
+ "description": "Refer to Robert Greene's 48 Laws of Power for the full text."
65
+ },
66
+ {
67
+ "law": "Law 17: Keep Others in Suspended Terror: Cultivate an Air of Unpredictability",
68
+ "description": "Refer to Robert Greene's 48 Laws of Power for the full text."
69
+ },
70
+ {
71
+ "law": "Law 18: Do Not Build Fortresses to Protect Yourself – Isolation is Dangerous",
72
+ "description": "Refer to Robert Greene's 48 Laws of Power for the full text."
73
+ },
74
+ {
75
+ "law": "Law 19: Know Who You're Dealing With – Do Not Offend the Wrong Person",
76
+ "description": "Refer to Robert Greene's 48 Laws of Power for the full text."
77
+ },
78
+ {
79
+ "law": "Law 20: Do Not Commit to Anyone",
80
+ "description": "Refer to Robert Greene's 48 Laws of Power for the full text."
81
+ },
82
+ {
83
+ "law": "Law 21: Play a Sucker to Catch a Sucker – Seem Dumber Than Your Mark",
84
+ "description": "Refer to Robert Greene's 48 Laws of Power for the full text."
85
+ },
86
+ {
87
+ "law": "Law 22: Use the Surrender Tactic: Transform Weakness into Power",
88
+ "description": "Refer to Robert Greene's 48 Laws of Power for the full text."
89
+ },
90
+ {
91
+ "law": "Law 23: Concentrate Your Forces",
92
+ "description": "Refer to Robert Greene's 48 Laws of Power for the full text."
93
+ },
94
+ {
95
+ "law": "Law 24: Play the Perfect Courtier",
96
+ "description": "Refer to Robert Greene's 48 Laws of Power for the full text."
97
+ },
98
+ {
99
+ "law": "Law 25: Re-Create Yourself",
100
+ "description": "Refer to Robert Greene's 48 Laws of Power for the full text."
101
+ },
102
+ {
103
+ "law": "Law 26: Keep Your Hands Clean",
104
+ "description": "Refer to Robert Greene's 48 Laws of Power for the full text."
105
+ },
106
+ {
107
+ "law": "Law 27: Play on People's Need to Believe to Create a Cultlike Following",
108
+ "description": "Refer to Robert Greene's 48 Laws of Power for the full text."
109
+ },
110
+ {
111
+ "law": "Law 28: Enter Action with Boldness",
112
+ "description": "Refer to Robert Greene's 48 Laws of Power for the full text."
113
+ },
114
+ {
115
+ "law": "Law 29: Plan All the Way to the End",
116
+ "description": "Refer to Robert Greene's 48 Laws of Power for the full text."
117
+ },
118
+ {
119
+ "law": "Law 30: Make Your Accomplishments Seem Effortless",
120
+ "description": "Refer to Robert Greene's 48 Laws of Power for the full text."
121
+ },
122
+ {
123
+ "law": "Law 31: Control the Options: Get Others to Play with the Cards You Deal",
124
+ "description": "Refer to Robert Greene's 48 Laws of Power for the full text."
125
+ },
126
+ {
127
+ "law": "Law 32: Play to People's Fantasies",
128
+ "description": "Refer to Robert Greene's 48 Laws of Power for the full text."
129
+ },
130
+ {
131
+ "law": "Law 33: Discover Each Man's Thumbscrew",
132
+ "description": "Refer to Robert Greene's 48 Laws of Power for the full text."
133
+ },
134
+ {
135
+ "law": "Law 34: Be Royal in Your Own Fashion: Act Like a King to Be Treated Like One",
136
+ "description": "Refer to Robert Greene's 48 Laws of Power for the full text."
137
+ },
138
+ {
139
+ "law": "Law 35: Master the Art of Timing",
140
+ "description": "Refer to Robert Greene's 48 Laws of Power for the full text."
141
+ },
142
+ {
143
+ "law": "Law 36: Disdain Things You Cannot Have: Ignoring Them is the Best Revenge",
144
+ "description": "Refer to Robert Greene's 48 Laws of Power for the full text."
145
+ },
146
+ {
147
+ "law": "Law 37: Create Compelling Spectacles",
148
+ "description": "Refer to Robert Greene's 48 Laws of Power for the full text."
149
+ },
150
+ {
151
+ "law": "Law 38: Think as You Like but Behave Like Others",
152
+ "description": "Refer to Robert Greene's 48 Laws of Power for the full text."
153
+ },
154
+ {
155
+ "law": "Law 39: Stir Up Waters to Catch Fish",
156
+ "description": "Refer to Robert Greene's 48 Laws of Power for the full text."
157
+ },
158
+ {
159
+ "law": "Law 40: Despise the Free Lunch",
160
+ "description": "Refer to Robert Greene's 48 Laws of Power for the full text."
161
+ },
162
+ {
163
+ "law": "Law 41: Avoid Stepping into a Great Man's Shoes",
164
+ "description": "Refer to Robert Greene's 48 Laws of Power for the full text."
165
+ },
166
+ {
167
+ "law": "Law 42: Strike the Shepherd and the Sheep Will Scatter",
168
+ "description": "Refer to Robert Greene's 48 Laws of Power for the full text."
169
+ },
170
+ {
171
+ "law": "Law 43: Work on the Hearts and Minds of Others",
172
+ "description": "Refer to Robert Greene's 48 Laws of Power for the full text."
173
+ },
174
+ {
175
+ "law": "Law 44: Disarm and Infuriate with the Mirror Effect",
176
+ "description": "Refer to Robert Greene's 48 Laws of Power for the full text."
177
+ },
178
+ {
179
+ "law": "Law 45: Preach the Need for Change, but Never Reform Too Much at Once",
180
+ "description": "Refer to Robert Greene's 48 Laws of Power for the full text."
181
+ },
182
+ {
183
+ "law": "Law 46: Never Appear Too Perfect",
184
+ "description": "Refer to Robert Greene's 48 Laws of Power for the full text."
185
+ },
186
+ {
187
+ "law": "Law 47: Do Not Go Past the Mark You Aimed For; In Victory, Learn When to Stop",
188
+ "description": "Refer to Robert Greene's 48 Laws of Power for the full text."
189
+ },
190
+ {
191
+ "law": "Law 48: Assume Formlessness",
192
+ "description": "Refer to Robert Greene's 48 Laws of Power for the full text."
193
+ }
194
+ ]
@@ -0,0 +1,42 @@
1
+ [
2
+ {
3
+ "name": "Confirmation Bias",
4
+ "description": "The tendency to search for, interpret, favor, and recall information in a way that confirms one's preexisting beliefs or hypotheses."
5
+ },
6
+ {
7
+ "name": "Dunning-Kruger Effect",
8
+ "description": "A cognitive bias in which people with low ability at a task overestimate their ability."
9
+ },
10
+ {
11
+ "name": "Sunk Cost Fallacy",
12
+ "description": "The phenomenon whereby a person is reluctant to abandon a strategy or course of action because they have invested heavily in it."
13
+ },
14
+ {
15
+ "name": "Survivorship Bias",
16
+ "description": "The logical error of concentrating on the people or things that made it past some selection process and overlooking those that did not."
17
+ },
18
+ {
19
+ "name": "Anchoring Bias",
20
+ "description": "The tendency to rely too heavily, or 'anchor', on one trait or piece of information when making decisions."
21
+ },
22
+ {
23
+ "name": "Availability Heuristic",
24
+ "description": "A mental shortcut that relies on immediate examples that come to a given person's mind when evaluating a specific topic."
25
+ },
26
+ {
27
+ "name": "Fundamental Attribution Error",
28
+ "description": "The tendency for people to under-emphasize situational explanations for an individual's observed behavior while over-emphasizing dispositional and personality-based explanations."
29
+ },
30
+ {
31
+ "name": "Halo Effect",
32
+ "description": "The tendency for positive impressions of a person, company, brand or product in one area to positively influence one's opinion or feelings in other areas."
33
+ },
34
+ {
35
+ "name": "Hindsight Bias",
36
+ "description": "The common tendency for people to perceive past events as having been more predictable than they actually were."
37
+ },
38
+ {
39
+ "name": "Bandwagon Effect",
40
+ "description": "The tendency to do (or believe) things because many other people do (or believe) the same."
41
+ }
42
+ ]
@@ -0,0 +1,17 @@
1
+ [
2
+ "They don't know you, son. Keep grinding.",
3
+ "Stay hard.",
4
+ "Motivation is crap. Motivation comes and goes. When you're driven, whatever is in front of you will get destroyed.",
5
+ "Discipline equals freedom.",
6
+ "Good.",
7
+ "You don't have to love it. You just have to believe it's worth it.",
8
+ "Suffering is a test. That's all it is.",
9
+ "We all have a voice in our mind that tells us to quit. You must learn to ignore it.",
10
+ "Do something that sucks every single day.",
11
+ "The only way to overcome the pain is to embrace it.",
12
+ "Embrace the suck.",
13
+ "There is no shortcut. There is only the path.",
14
+ "Don't negotiate with your own mind.",
15
+ "The obstacle is the way.",
16
+ "Pain is weakness leaving the body."
17
+ ]
@@ -0,0 +1,27 @@
1
+ [
2
+ "The Roman Colosseum was sometimes flooded to host naval battles.",
3
+ "Sharks existed before trees. Sharks have been around for over 400 million years.",
4
+ "Cleopatra lived closer in time to the Moon landing than to the construction of the Great Pyramid of Giza.",
5
+ "Oxford University is older than the Aztec Empire.",
6
+ "Honey never spoils. Archaeologists have found pots of honey in ancient Egyptian tombs that are over 3,000 years old and still perfectly edible.",
7
+ "There are more possible iterations of a game of chess than there are atoms in the observable universe.",
8
+ "A day on Venus is longer than a year on Venus.",
9
+ "The shortest commercial flight in the world takes just 53 seconds between two Scottish islands.",
10
+ "Water makes up about 60% of the adult human body, and the brain is 73% water.",
11
+ "Wombat poop is cube-shaped to stop it from rolling away.",
12
+ "The entire world's population could fit inside Los Angeles.",
13
+ "More people visit France than any other country in the world.",
14
+ "The world's most densely populated island is the size of two soccer fields.",
15
+ "The Canary Islands are named after dogs, not birds.",
16
+ "There's only one country in the world that doesn't have a rectangular flag: Nepal.",
17
+ "Mount Everest is bigger now than the last time it was measured.",
18
+ "Climate change is causing flowers to change color.",
19
+ "The longest place name on the planet is 85 letters long.",
20
+ "A jiffy is an actual unit of time. It's 1/100th of a second.",
21
+ "Japan has one vending machine for every 40 people.",
22
+ "Lemons float, but limes sink.",
23
+ "A crocodile cannot stick its tongue out.",
24
+ "Pigs can't look up into the sky.",
25
+ "The unicorn is the national animal of Scotland.",
26
+ "A day on Earth was only 19 hours long 1.4 billion years ago."
27
+ ]
@@ -0,0 +1,42 @@
1
+ [
2
+ {
3
+ "name": "Inversion",
4
+ "description": "Approaching a situation from the opposite end. Instead of asking how to succeed, ask how to fail and avoid that."
5
+ },
6
+ {
7
+ "name": "First Principles Thinking",
8
+ "description": "Breaking down a problem into its fundamental building blocks, its basic truths, and reasoning up from there."
9
+ },
10
+ {
11
+ "name": "Occam's Razor",
12
+ "description": "The simplest explanation is usually the correct one. Don't multiply entities beyond necessity."
13
+ },
14
+ {
15
+ "name": "Hanlon's Razor",
16
+ "description": "Never attribute to malice that which is adequately explained by stupidity."
17
+ },
18
+ {
19
+ "name": "Pareto Principle (80/20 Rule)",
20
+ "description": "For many events, roughly 80% of the effects come from 20% of the causes."
21
+ },
22
+ {
23
+ "name": "Compounding",
24
+ "description": "The process in which an asset's earnings, from either capital gains or interest, are reinvested to generate additional earnings over time."
25
+ },
26
+ {
27
+ "name": "Opportunity Cost",
28
+ "description": "The loss of potential gain from other alternatives when one alternative is chosen."
29
+ },
30
+ {
31
+ "name": "Margin of Safety",
32
+ "description": "Building a buffer into your plans to accommodate for errors, unexpected events, or bad luck."
33
+ },
34
+ {
35
+ "name": "The Map is Not the Territory",
36
+ "description": "Models and abstractions are not reality. They are useful simplifications but always have limitations."
37
+ },
38
+ {
39
+ "name": "Second-Order Thinking",
40
+ "description": "Thinking past the immediate consequences of an action to consider the subsequent consequences."
41
+ }
42
+ ]
@@ -0,0 +1,27 @@
1
+ [
2
+ "Observe. Don't react. 🗿",
3
+ "Let them talk. You keep building. 🗿",
4
+ "Your silence is your loudest answer. 🗿",
5
+ "Stand firm, like a rock against the crashing waves. 🗿",
6
+ "Unbothered. Focused. Immovable. 🗿",
7
+ "A lion does not turn when a small dog barks. 🗿",
8
+ "Master your emotions, or they will master you. 🗿",
9
+ "Discipline over motivation. Every single time. 🗿",
10
+ "Speak only when your words are more beautiful than silence. 🗿",
11
+ "Stay solid. The storm will pass. 🗿",
12
+ "Grind in silence. Let the results make the noise. 🗿",
13
+ "The less you respond to negative people, the more peaceful your life will become. 🗿",
14
+ "A tree with strong roots laughs at storms. 🗿",
15
+ "Do not let the behavior of others destroy your inner peace. 🗿",
16
+ "Walk like a king, or walk like you don't care who the king is. 🗿",
17
+ "Be a man of few words, but immense action. 🗿",
18
+ "Sometimes you must hurt in order to know, fall in order to grow, lose in order to gain. 🗿",
19
+ "They watch your actions, not your words. 🗿",
20
+ "Embrace the struggle. It is forging your character. 🗿",
21
+ "Be water, my friend. Formless, shapeless. 🗿",
22
+ "The calmest person in the room is usually the most powerful. 🗿",
23
+ "Protect your energy. Not everything deserves your reaction. 🗿",
24
+ "Do what is right, not what is easy. 🗿",
25
+ "You are the architect of your own reality. 🗿",
26
+ "Patience is not the ability to wait, but the ability to keep a good attitude while waiting. 🗿"
27
+ ]
@@ -0,0 +1,29 @@
1
+ [
2
+ "The happiness of your life depends upon the quality of your thoughts. - Marcus Aurelius",
3
+ "He who has a why to live for can bear almost any how. - Friedrich Nietzsche",
4
+ "We suffer more often in imagination than in reality. - Seneca",
5
+ "Waste no more time arguing what a good man should be. Be one. - Marcus Aurelius",
6
+ "The only true wisdom is in knowing you know nothing. - Socrates",
7
+ "It is not death that a man should fear, but he should fear never beginning to live. - Marcus Aurelius",
8
+ "No man is free who is not master of himself. - Epictetus",
9
+ "If it is not right do not do it; if it is not true do not say it. - Marcus Aurelius",
10
+ "The soul becomes dyed with the colour of its thoughts. - Marcus Aurelius",
11
+ "Wealth consists not in having great possessions, but in having few wants. - Epictetus",
12
+ "A room without books is like a body without a soul. - Marcus Tullius Cicero",
13
+ "You have power over your mind - not outside events. Realize this, and you will find strength. - Marcus Aurelius",
14
+ "Dwell on the beauty of life. Watch the stars, and see yourself running with them. - Marcus Aurelius",
15
+ "The best revenge is to be unlike him who performed the injury. - Marcus Aurelius",
16
+ "Accept the things to which fate binds you, and love the people with whom fate brings you together, but do so with all your heart. - Marcus Aurelius",
17
+ "Sometimes even to live is an act of courage. - Seneca",
18
+ "Luck is what happens when preparation meets opportunity. - Seneca",
19
+ "To be everywhere is to be nowhere. - Seneca",
20
+ "Ignorance is the cause of fear. - Seneca",
21
+ "First say to yourself what you would be; and then do what you have to do. - Epictetus",
22
+ "There is only one way to happiness and that is to cease worrying about things which are beyond the power of our will. - Epictetus",
23
+ "He is a wise man who does not grieve for the things which he has not, but rejoices for those which he has. - Epictetus",
24
+ "Don't explain your philosophy. Embody it. - Epictetus",
25
+ "The unexamined life is not worth living. - Socrates",
26
+ "I cannot teach anybody anything. I can only make them think. - Socrates",
27
+ "Wonder is the beginning of wisdom. - Socrates",
28
+ "To find yourself, think for yourself. - Socrates"
29
+ ]
@@ -0,0 +1,248 @@
1
+ import os
2
+ import json
3
+ import random
4
+ import datetime
5
+ from pathlib import Path
6
+
7
+ import typer
8
+ import questionary
9
+ import pyperclip
10
+ from rich.console import Console
11
+ from rich.panel import Panel
12
+ from rich.text import Text
13
+ from rich import print as rprint
14
+
15
+ app = typer.Typer(help="A massive CLI for daily wisdom, mental models, power laws, and more.")
16
+ console = Console()
17
+
18
+ DATA_DIR = Path(__file__).parent / "data"
19
+ CONFIG_FILE = Path.home() / ".irl_wisdom_config.json"
20
+
21
+ def load_config():
22
+ if CONFIG_FILE.exists():
23
+ with open(CONFIG_FILE, "r", encoding="utf-8") as f:
24
+ return json.load(f)
25
+ return {"favorites": [], "streak_date": "", "streak_count": 0}
26
+
27
+ def save_config(config):
28
+ with open(CONFIG_FILE, "w", encoding="utf-8") as f:
29
+ json.dump(config, f, indent=2)
30
+
31
+ def load_data(filename):
32
+ path = DATA_DIR / filename
33
+ if path.exists():
34
+ with open(path, "r", encoding="utf-8") as f:
35
+ return json.load(f)
36
+ return []
37
+
38
+ datasets = {
39
+ "wisdom": load_data("wisdom.json"),
40
+ "moai": load_data("moai.json"),
41
+ "power": load_data("48laws.json"),
42
+ "facts": load_data("facts.json"),
43
+ "mental_models": load_data("mental_models.json"),
44
+ "biases": load_data("biases.json"),
45
+ "discipline": load_data("discipline.json"),
46
+ }
47
+
48
+ def get_random_item(array):
49
+ return random.choice(array) if array else None
50
+
51
+ def get_daily_item(array):
52
+ if not array: return None
53
+ now = datetime.datetime.now()
54
+ day_of_year = now.timetuple().tm_yday
55
+ return array[day_of_year % len(array)]
56
+
57
+ def handle_direct_command(text, copy):
58
+ if copy:
59
+ pyperclip.copy(text)
60
+ rprint("[bold green]✔ Copied to clipboard![/bold green]")
61
+
62
+ def handle_copy_and_save(text, raw_data):
63
+ action = questionary.select(
64
+ "What would you like to do with this?",
65
+ choices=[
66
+ questionary.Choice("Copy to clipboard", value="copy"),
67
+ questionary.Choice("Save to Favorites", value="save"),
68
+ questionary.Choice("Return to Menu", value="menu"),
69
+ questionary.Choice("Exit", value="exit"),
70
+ ]
71
+ ).ask()
72
+
73
+ if action == "copy":
74
+ pyperclip.copy(text)
75
+ rprint("[bold green]✔ Copied to clipboard![/bold green]")
76
+ handle_copy_and_save(text, raw_data)
77
+ elif action == "save":
78
+ config = load_config()
79
+ config["favorites"].append(raw_data)
80
+ save_config(config)
81
+ rprint("[bold green]✔ Saved to favorites![/bold green]")
82
+ handle_copy_and_save(text, raw_data)
83
+ elif action == "menu":
84
+ interactive_menu()
85
+ else:
86
+ raise typer.Exit()
87
+
88
+ def print_header():
89
+ console.clear()
90
+ title = Text("IRL WISDOM", style="bold cyan on black", justify="center")
91
+ console.print(Panel(title, border_style="cyan"))
92
+
93
+ config = load_config()
94
+ today = datetime.datetime.now().strftime("%Y-%m-%d")
95
+ streak_date = config.get("streak_date")
96
+ streak_count = config.get("streak_count", 0)
97
+
98
+ if streak_date != today:
99
+ yesterday = (datetime.datetime.now() - datetime.timedelta(days=1)).strftime("%Y-%m-%d")
100
+ if streak_date == yesterday:
101
+ streak_count += 1
102
+ else:
103
+ streak_count = 1
104
+ config["streak_date"] = today
105
+ config["streak_count"] = streak_count
106
+ save_config(config)
107
+
108
+ rprint(f"[bold yellow] 🔥 Daily Streak: {streak_count} days[/bold yellow]\n")
109
+
110
+ @app.command()
111
+ def daily(copy: bool = typer.Option(False, "--copy", "-c", help="Copy output to clipboard")):
112
+ """Get your daily dose of wisdom"""
113
+ item = get_daily_item(datasets["wisdom"])
114
+ rprint(Panel(f"[italic cyan]{item}[/italic cyan]", title="Daily Wisdom", border_style="cyan"))
115
+ handle_direct_command(item, copy)
116
+
117
+ @app.command()
118
+ def moai(copy: bool = typer.Option(False, "--copy", "-c")):
119
+ """Get some solid moai vibes 🗿"""
120
+ item = get_random_item(datasets["moai"])
121
+ rprint(Panel(f"[bold white]{item}[/bold white]", title="Moai Vibes 🗿", border_style="white"))
122
+ handle_direct_command(item, copy)
123
+
124
+ @app.command()
125
+ def power(copy: bool = typer.Option(False, "--copy", "-c")):
126
+ """Learn a law of power"""
127
+ item = get_random_item(datasets["power"])
128
+ text = f"[bold red]{item['law']}[/bold red]\n\n{item['description']}"
129
+ copy_text = f"{item['law']}\n{item['description']}"
130
+ rprint(Panel(text, title="48 Laws of Power", border_style="red"))
131
+ handle_direct_command(copy_text, copy)
132
+
133
+ @app.command()
134
+ def fact(copy: bool = typer.Option(False, "--copy", "-c")):
135
+ """Get a powerful fact"""
136
+ item = get_random_item(datasets["facts"])
137
+ rprint(Panel(f"[yellow]{item}[/yellow]", title="Powerful Fact", border_style="yellow"))
138
+ handle_direct_command(item, copy)
139
+
140
+ @app.command()
141
+ def models(copy: bool = typer.Option(False, "--copy", "-c")):
142
+ """Learn a mental model"""
143
+ item = get_random_item(datasets["mental_models"])
144
+ text = f"[bold blue]{item['name']}[/bold blue]\n\n{item['description']}"
145
+ copy_text = f"{item['name']}: {item['description']}"
146
+ rprint(Panel(text, title="Mental Model", border_style="blue"))
147
+ handle_direct_command(copy_text, copy)
148
+
149
+ @app.command()
150
+ def biases(copy: bool = typer.Option(False, "--copy", "-c")):
151
+ """Learn a cognitive bias"""
152
+ item = get_random_item(datasets["biases"])
153
+ text = f"[bold magenta]{item['name']}[/bold magenta]\n\n{item['description']}"
154
+ copy_text = f"{item['name']}: {item['description']}"
155
+ rprint(Panel(text, title="Cognitive Bias", border_style="magenta"))
156
+ handle_direct_command(copy_text, copy)
157
+
158
+ @app.command()
159
+ def discipline(copy: bool = typer.Option(False, "--copy", "-c")):
160
+ """Stay hard."""
161
+ item = get_random_item(datasets["discipline"])
162
+ rprint(Panel(f"[bold white]{item}[/bold white]", title="Discipline", border_style="white"))
163
+ handle_direct_command(item, copy)
164
+
165
+ def show_favorites():
166
+ config = load_config()
167
+ favs = config.get("favorites", [])
168
+ if not favs:
169
+ rprint("[yellow]No favorites saved yet.[/yellow]")
170
+ else:
171
+ for i, fav in enumerate(favs):
172
+ rprint(f"[green][{i+1}] {fav['type'].upper()}:[/green] {fav['text'].splitlines()[0]}")
173
+
174
+ action = questionary.select(
175
+ "What next?",
176
+ choices=["Clear Favorites", "Return to Menu"]
177
+ ).ask()
178
+
179
+ if action == "Clear Favorites":
180
+ config["favorites"] = []
181
+ save_config(config)
182
+ rprint("[bold green]Favorites cleared![/bold green]")
183
+
184
+ interactive_menu()
185
+
186
+ @app.callback(invoke_without_command=True)
187
+ def interactive_menu(ctx: typer.Context):
188
+ """Interactive Menu"""
189
+ if ctx.invoked_subcommand is not None:
190
+ return
191
+
192
+ print_header()
193
+ answer = questionary.select(
194
+ "What knowledge do you seek today?",
195
+ choices=[
196
+ questionary.Choice("🌟 Daily Wisdom", value="daily"),
197
+ questionary.Choice("🗿 Moai Vibes", value="moai"),
198
+ questionary.Choice("👑 48 Laws of Power", value="power"),
199
+ questionary.Choice("🧠 Mental Models", value="models"),
200
+ questionary.Choice("⚠️ Cognitive Biases", value="biases"),
201
+ questionary.Choice("⚔️ Discipline / Stay Hard", value="discipline"),
202
+ questionary.Choice("💡 Powerful Fact", value="fact"),
203
+ questionary.Choice("⭐ View Favorites", value="favorites"),
204
+ questionary.Choice("❌ Exit", value="exit"),
205
+ ]
206
+ ).ask()
207
+
208
+ if answer == "daily":
209
+ item = get_daily_item(datasets["wisdom"])
210
+ rprint(Panel(f"[italic cyan]{item}[/italic cyan]", title="Daily Wisdom", border_style="cyan"))
211
+ handle_copy_and_save(item, {"type": "wisdom", "text": item})
212
+ elif answer == "moai":
213
+ item = get_random_item(datasets["moai"])
214
+ rprint(Panel(f"[bold white]{item}[/bold white]", title="Moai Vibes 🗿", border_style="white"))
215
+ handle_copy_and_save(item, {"type": "moai", "text": item})
216
+ elif answer == "power":
217
+ item = get_random_item(datasets["power"])
218
+ text = f"[bold red]{item['law']}[/bold red]\n\n{item['description']}"
219
+ copy_text = f"{item['law']}\n{item['description']}"
220
+ rprint(Panel(text, title="48 Laws of Power", border_style="red"))
221
+ handle_copy_and_save(copy_text, {"type": "power", "text": copy_text})
222
+ elif answer == "models":
223
+ item = get_random_item(datasets["mental_models"])
224
+ text = f"[bold blue]{item['name']}[/bold blue]\n\n{item['description']}"
225
+ copy_text = f"{item['name']}: {item['description']}"
226
+ rprint(Panel(text, title="Mental Model", border_style="blue"))
227
+ handle_copy_and_save(copy_text, {"type": "mental_model", "text": copy_text})
228
+ elif answer == "biases":
229
+ item = get_random_item(datasets["biases"])
230
+ text = f"[bold magenta]{item['name']}[/bold magenta]\n\n{item['description']}"
231
+ copy_text = f"{item['name']}: {item['description']}"
232
+ rprint(Panel(text, title="Cognitive Bias", border_style="magenta"))
233
+ handle_copy_and_save(copy_text, {"type": "bias", "text": copy_text})
234
+ elif answer == "discipline":
235
+ item = get_random_item(datasets["discipline"])
236
+ rprint(Panel(f"[bold white]{item}[/bold white]", title="Discipline", border_style="white"))
237
+ handle_copy_and_save(item, {"type": "discipline", "text": item})
238
+ elif answer == "fact":
239
+ item = get_random_item(datasets["facts"])
240
+ rprint(Panel(f"[yellow]{item}[/yellow]", title="Powerful Fact", border_style="yellow"))
241
+ handle_copy_and_save(item, {"type": "fact", "text": item})
242
+ elif answer == "favorites":
243
+ show_favorites()
244
+ elif answer == "exit":
245
+ raise typer.Exit()
246
+
247
+ if __name__ == "__main__":
248
+ app()
@@ -0,0 +1,52 @@
1
+ Metadata-Version: 2.4
2
+ Name: irl-wisdom
3
+ Version: 2.0.0
4
+ Summary: A massive CLI for daily wisdom, mental models, power laws, and more.
5
+ Author-email: Antigravity <antigravity@example.com>
6
+ Classifier: Programming Language :: Python :: 3
7
+ Classifier: License :: OSI Approved :: MIT License
8
+ Classifier: Operating System :: OS Independent
9
+ Requires-Python: >=3.8
10
+ Description-Content-Type: text/markdown
11
+ Requires-Dist: rich>=13.0.0
12
+ Requires-Dist: questionary>=2.0.0
13
+ Requires-Dist: pyperclip>=1.8.0
14
+ Requires-Dist: typer>=0.9.0
15
+
16
+ # IRL Wisdom CLI 🗿
17
+
18
+ A massive, feature-rich Terminal User Interface (TUI) for daily wisdom, mental models, cognitive biases, 48 laws of power, and hardcore discipline quotes.
19
+
20
+ ## Features
21
+ - **Interactive Dashboard:** Beautiful, keyboard-navigable interactive menu.
22
+ - **Huge Datasets:** Hundreds of items spanning Stoic wisdom, Moai vibes, powerful facts, and more.
23
+ - **Favorites System:** Save your favorite quotes to a local favorites list.
24
+ - **Copy to Clipboard:** Instantly copy text to your clipboard.
25
+ - **Daily Streak Tracker:** Tracks your daily streak every time you open the app.
26
+
27
+ ## Installation
28
+ ```bash
29
+ pip install irl-wisdom
30
+ ```
31
+
32
+ ## Usage
33
+ Simply run the interactive dashboard:
34
+ ```bash
35
+ irl-wisdom
36
+ ```
37
+
38
+ Or run specific commands:
39
+ ```bash
40
+ irl-wisdom daily
41
+ irl-wisdom moai
42
+ irl-wisdom power
43
+ irl-wisdom models
44
+ irl-wisdom biases
45
+ irl-wisdom discipline
46
+ irl-wisdom fact
47
+ ```
48
+
49
+ Add the `--copy` flag to copy the output to your clipboard instantly:
50
+ ```bash
51
+ irl-wisdom power --copy
52
+ ```
@@ -0,0 +1,17 @@
1
+ README.md
2
+ pyproject.toml
3
+ irl_wisdom/__init__.py
4
+ irl_wisdom/main.py
5
+ irl_wisdom.egg-info/PKG-INFO
6
+ irl_wisdom.egg-info/SOURCES.txt
7
+ irl_wisdom.egg-info/dependency_links.txt
8
+ irl_wisdom.egg-info/entry_points.txt
9
+ irl_wisdom.egg-info/requires.txt
10
+ irl_wisdom.egg-info/top_level.txt
11
+ irl_wisdom/data/48laws.json
12
+ irl_wisdom/data/biases.json
13
+ irl_wisdom/data/discipline.json
14
+ irl_wisdom/data/facts.json
15
+ irl_wisdom/data/mental_models.json
16
+ irl_wisdom/data/moai.json
17
+ irl_wisdom/data/wisdom.json
@@ -0,0 +1,2 @@
1
+ [console_scripts]
2
+ irl-wisdom = irl_wisdom.main:app
@@ -0,0 +1,4 @@
1
+ rich>=13.0.0
2
+ questionary>=2.0.0
3
+ pyperclip>=1.8.0
4
+ typer>=0.9.0
@@ -0,0 +1 @@
1
+ irl_wisdom
@@ -0,0 +1,30 @@
1
+ [build-system]
2
+ requires = ["setuptools>=61.0"]
3
+ build-backend = "setuptools.build_meta"
4
+
5
+ [project]
6
+ name = "irl-wisdom"
7
+ version = "2.0.0"
8
+ authors = [
9
+ { name="Antigravity", email="antigravity@example.com" },
10
+ ]
11
+ description = "A massive CLI for daily wisdom, mental models, power laws, and more."
12
+ readme = "README.md"
13
+ requires-python = ">=3.8"
14
+ dependencies = [
15
+ "rich>=13.0.0",
16
+ "questionary>=2.0.0",
17
+ "pyperclip>=1.8.0",
18
+ "typer>=0.9.0"
19
+ ]
20
+ classifiers = [
21
+ "Programming Language :: Python :: 3",
22
+ "License :: OSI Approved :: MIT License",
23
+ "Operating System :: OS Independent",
24
+ ]
25
+
26
+ [project.scripts]
27
+ irl-wisdom = "irl_wisdom.main:app"
28
+
29
+ [tool.setuptools.package-data]
30
+ irl_wisdom = ["data/*.json"]
@@ -0,0 +1,4 @@
1
+ [egg_info]
2
+ tag_build =
3
+ tag_date = 0
4
+