@timecell/engine 0.1.2 → 0.2.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.
- package/dist/action-plan.d.ts +17 -0
- package/dist/action-plan.d.ts.map +1 -0
- package/dist/action-plan.js +121 -0
- package/dist/action-plan.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export interface ActionPlanInput {
|
|
2
|
+
btcPercentage: number;
|
|
3
|
+
ruinTestPassed: boolean;
|
|
4
|
+
runwayMonths: number;
|
|
5
|
+
temperatureScore: number;
|
|
6
|
+
liquidReserveUsd: number;
|
|
7
|
+
monthlyBurnUsd: number;
|
|
8
|
+
totalValueUsd: number;
|
|
9
|
+
}
|
|
10
|
+
export type ActionSeverity = "red" | "amber" | "green";
|
|
11
|
+
export interface ActionItem {
|
|
12
|
+
severity: ActionSeverity;
|
|
13
|
+
message: string;
|
|
14
|
+
rule: string;
|
|
15
|
+
}
|
|
16
|
+
export declare function generateActionPlan(input: ActionPlanInput): ActionItem[];
|
|
17
|
+
//# sourceMappingURL=action-plan.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"action-plan.d.ts","sourceRoot":"","sources":["../src/action-plan.ts"],"names":[],"mappings":"AAUA,MAAM,WAAW,eAAe;IAC/B,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,OAAO,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,MAAM,cAAc,GAAG,KAAK,GAAG,OAAO,GAAG,OAAO,CAAC;AAEvD,MAAM,WAAW,UAAU;IAC1B,QAAQ,EAAE,cAAc,CAAC;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;CACb;AAgBD,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,eAAe,GAAG,UAAU,EAAE,CAsIvE"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
// =============================================================================
|
|
2
|
+
// Action Plan Engine (Framework-Driven Priorities)
|
|
3
|
+
// =============================================================================
|
|
4
|
+
// Evaluates portfolio state against the Bitcoin Investing Framework rules and
|
|
5
|
+
// returns a prioritised list of actionable items (red / amber / green).
|
|
6
|
+
// ---------------------------------------------------------------------------
|
|
7
|
+
// Severity sort order
|
|
8
|
+
// ---------------------------------------------------------------------------
|
|
9
|
+
const SEVERITY_ORDER = {
|
|
10
|
+
red: 0,
|
|
11
|
+
amber: 1,
|
|
12
|
+
green: 2,
|
|
13
|
+
};
|
|
14
|
+
// ---------------------------------------------------------------------------
|
|
15
|
+
// Rule evaluator
|
|
16
|
+
// ---------------------------------------------------------------------------
|
|
17
|
+
export function generateActionPlan(input) {
|
|
18
|
+
const { btcPercentage, ruinTestPassed, runwayMonths, temperatureScore, liquidReserveUsd, } = input;
|
|
19
|
+
const items = [];
|
|
20
|
+
// ---- Red (act now) ----
|
|
21
|
+
if (!ruinTestPassed) {
|
|
22
|
+
items.push({
|
|
23
|
+
severity: "red",
|
|
24
|
+
message: "Reduce BTC allocation until ruin test passes. Your portfolio does not survive an 80% crash.",
|
|
25
|
+
rule: "ruin-test",
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
if (temperatureScore > 75) {
|
|
29
|
+
items.push({
|
|
30
|
+
severity: "red",
|
|
31
|
+
message: "Extreme greed zone. Stop buying. Consider activating selling rules.",
|
|
32
|
+
rule: "temperature-extreme-greed",
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
if (liquidReserveUsd <= 0) {
|
|
36
|
+
items.push({
|
|
37
|
+
severity: "red",
|
|
38
|
+
message: "No liquid reserve. Build a safety net: 2+ years of expenses outside BTC.",
|
|
39
|
+
rule: "no-reserve",
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
if (runwayMonths < 18) {
|
|
43
|
+
items.push({
|
|
44
|
+
severity: "red",
|
|
45
|
+
message: `Insufficient runway (${runwayMonths === Infinity ? "unlimited" : Math.round(runwayMonths)} months). Need 18+ months. Increase liquid reserve or reduce BTC allocation.`,
|
|
46
|
+
rule: "insufficient-runway",
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
// ---- Amber (consider) ----
|
|
50
|
+
if (btcPercentage >= 25) {
|
|
51
|
+
items.push({
|
|
52
|
+
severity: "amber",
|
|
53
|
+
message: `At ${btcPercentage}% BTC, conviction gates should be checked: multi-cycle experience, 2yr expenses outside BTC, no forced-sale liabilities.`,
|
|
54
|
+
rule: "conviction-gates",
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
if (btcPercentage >= 50) {
|
|
58
|
+
items.push({
|
|
59
|
+
severity: "amber",
|
|
60
|
+
message: `Downside insurance recommended at ${btcPercentage}% allocation (Framework Part 6).`,
|
|
61
|
+
rule: "insurance-needed",
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
if (temperatureScore < 20) {
|
|
65
|
+
items.push({
|
|
66
|
+
severity: "amber",
|
|
67
|
+
message: "Extreme fear zone. Historically the best time to accumulate. Consider lump sum if conviction is high.",
|
|
68
|
+
rule: "temperature-extreme-fear",
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
if (temperatureScore >= 60 && temperatureScore <= 75) {
|
|
72
|
+
items.push({
|
|
73
|
+
severity: "amber",
|
|
74
|
+
message: "Greed zone. Slow down buying. Review your risk management and de-risk triggers.",
|
|
75
|
+
rule: "temperature-greed",
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
// ---- Green (on track) ----
|
|
79
|
+
if (ruinTestPassed && runwayMonths >= 18) {
|
|
80
|
+
items.push({
|
|
81
|
+
severity: "green",
|
|
82
|
+
message: `Ruin test passed. You survive the worst-case crash with ${runwayMonths === Infinity ? "unlimited" : Math.round(runwayMonths)} months runway.`,
|
|
83
|
+
rule: "ruin-test-passed",
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
if (temperatureScore >= 20 && temperatureScore < 40) {
|
|
87
|
+
items.push({
|
|
88
|
+
severity: "green",
|
|
89
|
+
message: "Fear zone. Good time to DCA aggressively.",
|
|
90
|
+
rule: "temperature-fear",
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
if (temperatureScore >= 40 && temperatureScore < 60) {
|
|
94
|
+
items.push({
|
|
95
|
+
severity: "green",
|
|
96
|
+
message: "Neutral zone. Continue DCA at normal pace.",
|
|
97
|
+
rule: "temperature-neutral",
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
// ---- Sort: red first, then amber, then green ----
|
|
101
|
+
items.sort((a, b) => SEVERITY_ORDER[a.severity] - SEVERITY_ORDER[b.severity]);
|
|
102
|
+
// ---- Limit to 5 items (truncate greens first, then ambers) ----
|
|
103
|
+
if (items.length > 5) {
|
|
104
|
+
// Count by severity
|
|
105
|
+
const reds = items.filter((i) => i.severity === "red");
|
|
106
|
+
const ambers = items.filter((i) => i.severity === "amber");
|
|
107
|
+
const greens = items.filter((i) => i.severity === "green");
|
|
108
|
+
// Trim greens first, then ambers if still over
|
|
109
|
+
const budget = 5;
|
|
110
|
+
const redCount = reds.length;
|
|
111
|
+
const amberBudget = Math.min(ambers.length, budget - redCount);
|
|
112
|
+
const greenBudget = Math.min(greens.length, budget - redCount - amberBudget);
|
|
113
|
+
return [
|
|
114
|
+
...reds.slice(0, budget),
|
|
115
|
+
...ambers.slice(0, amberBudget),
|
|
116
|
+
...greens.slice(0, greenBudget),
|
|
117
|
+
].slice(0, 5);
|
|
118
|
+
}
|
|
119
|
+
return items;
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=action-plan.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"action-plan.js","sourceRoot":"","sources":["../src/action-plan.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -8,4 +8,6 @@ export type { TemperatureResult } from "./temperature.js";
|
|
|
8
8
|
export { calculateTemperature, scoreToZone } from "./temperature.js";
|
|
9
9
|
export { calculatePositionSizing, getConvictionRung, } from "./position-sizing.js";
|
|
10
10
|
export type { PositionSizingInput, PositionSizingResult } from "./position-sizing.js";
|
|
11
|
+
export { generateActionPlan } from "./action-plan.js";
|
|
12
|
+
export type { ActionPlanInput, ActionItem, ActionSeverity } from "./action-plan.js";
|
|
11
13
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAIA,YAAY,EACX,cAAc,EACd,aAAa,EACb,aAAa,EACb,cAAc,EACd,mBAAmB,EACnB,mBAAmB,GACnB,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,sBAAsB,EAAE,uBAAuB,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACtG,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,0BAA0B,EAAE,2BAA2B,EAAE,MAAM,qBAAqB,CAAC;AAC9F,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AACpG,YAAY,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAE,oBAAoB,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACrE,OAAO,EACN,uBAAuB,EACvB,iBAAiB,GACjB,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAIA,YAAY,EACX,cAAc,EACd,aAAa,EACb,aAAa,EACb,cAAc,EACd,mBAAmB,EACnB,mBAAmB,GACnB,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,sBAAsB,EAAE,uBAAuB,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACtG,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,0BAA0B,EAAE,2BAA2B,EAAE,MAAM,qBAAqB,CAAC;AAC9F,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AACpG,YAAY,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAE,oBAAoB,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACrE,OAAO,EACN,uBAAuB,EACvB,iBAAiB,GACjB,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AACtF,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,YAAY,EAAE,eAAe,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -8,4 +8,5 @@ export { calculateGeometricMeanCAGR, calculateGeometricBreakeven } from "./geome
|
|
|
8
8
|
export { DEMO_PORTFOLIO, DEMO_HEDGE_POSITIONS, DEMO_BTC_PRICE } from "./fixtures/demo-portfolio.js";
|
|
9
9
|
export { calculateTemperature, scoreToZone } from "./temperature.js";
|
|
10
10
|
export { calculatePositionSizing, getConvictionRung, } from "./position-sizing.js";
|
|
11
|
+
export { generateActionPlan } from "./action-plan.js";
|
|
11
12
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,gCAAgC;AAChC,gFAAgF;AAWhF,OAAO,EAAE,sBAAsB,EAAE,uBAAuB,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACtG,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,0BAA0B,EAAE,2BAA2B,EAAE,MAAM,qBAAqB,CAAC;AAC9F,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAEpG,OAAO,EAAE,oBAAoB,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACrE,OAAO,EACN,uBAAuB,EACvB,iBAAiB,GACjB,MAAM,sBAAsB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,gCAAgC;AAChC,gFAAgF;AAWhF,OAAO,EAAE,sBAAsB,EAAE,uBAAuB,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACtG,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,0BAA0B,EAAE,2BAA2B,EAAE,MAAM,qBAAqB,CAAC;AAC9F,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAEpG,OAAO,EAAE,oBAAoB,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACrE,OAAO,EACN,uBAAuB,EACvB,iBAAiB,GACjB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC"}
|