pi-coding-master 0.2.7
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 +50 -0
- package/core/god.agent.capability/@ABANDONED.brain.prefrontal.monitor/gpu_monitor.py +80 -0
- package/core/god.agent.capability/@ABANDONED.brain.prefrontal.monitor/gpu_monitor.py.CHANGELOG +1 -0
- package/core/god.agent.capability/@ABANDONED.brain.prefrontal.monitor/gpu_monitor.py.SPEC +3 -0
- package/core/god.agent.capability/hands.dev.writeissue/issue.ts +209 -0
- package/core/god.agent.capability/hands.dev.writeissue/issue.ts.SPEC +26 -0
- package/core/god.agent.capability/hands.files.changewatcher/watcher.ts +44 -0
- package/core/god.agent.capability/hands.files.changewatcher/watcher.ts.SPEC +25 -0
- package/core/god.pi.mod/cli/pi-completion.zsh +21 -0
- package/core/god.pi.mod/cli/pi-completion.zsh.CHANGELOG +1 -0
- package/core/god.pi.mod/cli/pi-people.sh +264 -0
- package/core/god.pi.mod/cli/pi-people.sh.LESSON +10 -0
- package/core/god.pi.mod/cli/pi-people.sh.SPEC +31 -0
- package/core/god.pi.mod/paths.ts +47 -0
- package/core/god.pi.mod/tui.mods.blockrender/blockrender.js +90 -0
- package/core/god.pi.mod/tui.mods.blockrender/blockrender.js.SPEC +29 -0
- package/core/god.pi.mod/tui.mods.footer.budget/budget_guard.ts +154 -0
- package/core/god.pi.mod/tui.mods.footer.budget/budget_guard.ts.CHANGELOG +10 -0
- package/core/god.pi.mod/tui.mods.footer.budget/budget_guard.ts.LESSON +12 -0
- package/core/god.pi.mod/tui.mods.footer.budget/budget_guard.ts.SPEC +26 -0
- package/core/god.pi.mod/tui.mods.footer.budget/footer-cny.CHANGELOG +39 -0
- package/core/god.pi.mod/tui.mods.viewmode/view_mode-thinking.patch +55 -0
- package/core/god.pi.mod/tui.mods.viewmode/view_mode-tools.patch +19 -0
- package/core/god.pi.mod/tui.mods.viewmode/view_mode-tools.patch.CHANGELOG +1 -0
- package/core/god.pi.mod/tui.mods.viewmode/view_mode.ts +50 -0
- package/core/god.pi.mod/tui.mods.viewmode/view_mode.ts.SPEC +12 -0
- package/core/god.pi.mod/tui.variants.userterminal/user_terminal.CHANGELOG +10 -0
- package/core/god.pi.mod/tui.variants.userterminal/user_terminal.ts +66 -0
- package/core/god.pi.mod/tui.variants.userterminal/user_terminal.ts.SPEC +31 -0
- package/core/index.ts +3 -0
- package/core/individual.bio.gene/dna.coded/coded.dna +257 -0
- package/core/individual.bio.gene/dna.coded/coded.dna.CHANGELOG +12 -0
- package/core/individual.bio.gene/dna.coded/coded.dna.SPEC +11 -0
- package/core/individual.bio.gene/dna.coded/core.dna +110 -0
- package/core/individual.bio.gene/dna.promotor/promotor.dna +117 -0
- package/core/individual.bio.gene/dna.promotor/promotor.dna.CHANGELOG +4 -0
- package/core/individual.bio.gene/dna.promotor/promotor.dna.SPEC +7 -0
- package/core/individual.bio.gene/dna.transpiler/transpiler.ts +395 -0
- package/core/individual.bio.gene/dna.transpiler/transpiler.ts.CHANGELOG +7 -0
- package/core/individual.bio.gene/dna.transpiler/transpiler.ts.SPEC +28 -0
- package/core/individual.bio.gene/gene.README +19 -0
- package/core/individual.bio.gene/rna/rna.json +536 -0
- package/core/individual.bio.gene/rna/rna.json.CHANGELOG +2 -0
- package/core/individual.bio.gene/rna/rna.json.SPEC +8 -0
- package/core/individual.bio.organs/blood.runtime/messages.ts +236 -0
- package/core/individual.bio.organs/blood.runtime/runtime.ts +173 -0
- package/core/individual.bio.organs/blood.runtime/runtime.ts.CHANGELOG +5 -0
- package/core/individual.bio.organs/blood.runtime/runtime.ts.SPEC +32 -0
- package/core/individual.bio.organs/brain.amygdala/amygdala.ts +25 -0
- package/core/individual.bio.organs/brain.amygdala/amygdala.ts.COMMENT +3 -0
- package/core/individual.bio.organs/brain.amygdala/amygdala.ts.SPEC +9 -0
- package/core/individual.bio.organs/brain.hippocampus/hippocampus-launcher.sh.template +108 -0
- package/core/individual.bio.organs/brain.hippocampus/hippocampus.ts +166 -0
- package/core/individual.bio.organs/brain.hippocampus/hippocampus.ts.CHANGELOG +12 -0
- package/core/individual.bio.organs/brain.hippocampus/hippocampus.ts.LESSON +22 -0
- package/core/individual.bio.organs/brain.hippocampus/hippocampus.ts.SPEC +16 -0
- package/core/individual.bio.organs/brain.hippocampus/memory.ts +879 -0
- package/core/individual.bio.organs/brain.hippocampus/memory.ts.CHANGELOG +66 -0
- package/core/individual.bio.organs/brain.hippocampus/memory.ts.LESSON +25 -0
- package/core/individual.bio.organs/brain.hippocampus/memory.ts.SPEC +46 -0
- package/core/individual.bio.organs/brain.hippocampus/sleep.ts +139 -0
- package/core/individual.bio.organs/brain.hippocampus/sleep.ts.CHANGELOG +11 -0
- package/core/individual.bio.organs/brain.hippocampus/sleep.ts.SPEC +16 -0
- package/core/individual.bio.organs/brain.prefrontal.drafting/drafting.SPEC +44 -0
- package/core/individual.bio.organs/brain.prefrontal.drafting/drafting.ts +73 -0
- package/core/individual.bio.organs/brain.prefrontal.drafting/drafting.ts.CHANGELOG +3 -0
- package/core/individual.bio.organs/brain.prefrontal.drafting/drafting.ts.SPEC +24 -0
- package/core/individual.bio.organs/brain.prefrontal.drafting/index.ts.CHANGELOG +3 -0
- package/core/individual.bio.organs/brain.prefrontal.drafting/main.ts +13 -0
- package/core/individual.bio.organs/brain.prefrontal.drafting/main.ts.SPEC +17 -0
- package/core/individual.bio.organs/brain.senses.bioclock/bioclock.ts +94 -0
- package/core/individual.bio.organs/brain.senses.bioclock/bioclock.ts.LESSON +13 -0
- package/core/individual.bio.organs/brain.senses.bioclock/bioclock.ts.SPEC +20 -0
- package/core/individual.bio.organs/brain.senses.subconscious/feed-format.SPEC +56 -0
- package/core/individual.bio.organs/brain.senses.subconscious/index.ts.CHANGELOG +13 -0
- package/core/individual.bio.organs/brain.senses.subconscious/spawner.ts +130 -0
- package/core/individual.bio.organs/brain.senses.subconscious/spawner.ts.SPEC +13 -0
- package/core/individual.bio.organs/brain.senses.subconscious/subconscious.ts +280 -0
- package/core/individual.bio.organs/brain.senses.subconscious/subconscious.ts.CHANGELOG +7 -0
- package/core/individual.bio.organs/brain.senses.subconscious/tools.ts +180 -0
- package/core/individual.bio.organs/brain.senses.subconscious/tools.ts.SPEC +3 -0
- package/core/individual.bio.organs/ears.listen/config.json +9 -0
- package/core/individual.bio.organs/ears.listen/config.json.CHANGELOG +1 -0
- package/core/individual.bio.organs/ears.listen/config.json.SPEC +3 -0
- package/core/individual.bio.organs/ears.listen/ears.ts.CHANGELOG +48 -0
- package/core/individual.bio.organs/ears.listen/ears_recorder.py.CHANGELOG +6 -0
- package/core/individual.bio.organs/ears.listen/index.ts +1 -0
- package/core/individual.bio.organs/ears.listen/index.ts.SPEC +16 -0
- package/core/individual.bio.organs/ears.listen/listen.ts +208 -0
- package/core/individual.bio.organs/ears.listen/listen.ts.SPEC +3 -0
- package/core/individual.bio.organs/ears.listen/listen_recorder.py +445 -0
- package/core/individual.bio.organs/ears.listen/listen_recorder.py.SPEC +7 -0
- package/core/individual.bio.organs/ears.listen/python_protogen/__init__.py +0 -0
- package/core/individual.bio.organs/ears.listen/python_protogen/common/__init__.py +0 -0
- package/core/individual.bio.organs/ears.listen/python_protogen/common/events_pb2.py +38 -0
- package/core/individual.bio.organs/ears.listen/python_protogen/common/events_pb2_grpc.py +24 -0
- package/core/individual.bio.organs/ears.listen/python_protogen/common/rpcmeta_pb2.py +42 -0
- package/core/individual.bio.organs/ears.listen/python_protogen/common/rpcmeta_pb2_grpc.py +24 -0
- package/core/individual.bio.organs/ears.listen/python_protogen/products/__init__.py +0 -0
- package/core/individual.bio.organs/ears.listen/python_protogen/products/understanding/__init__.py +0 -0
- package/core/individual.bio.organs/ears.listen/python_protogen/products/understanding/ast/__init__.py +0 -0
- package/core/individual.bio.organs/ears.listen/python_protogen/products/understanding/ast/ast_service_pb2.py +45 -0
- package/core/individual.bio.organs/ears.listen/python_protogen/products/understanding/ast/ast_service_pb2_grpc.py +97 -0
- package/core/individual.bio.organs/ears.listen/python_protogen/products/understanding/base/__init__.py +0 -0
- package/core/individual.bio.organs/ears.listen/python_protogen/products/understanding/base/au_base_pb2.py +80 -0
- package/core/individual.bio.organs/ears.listen/python_protogen/products/understanding/base/au_base_pb2_grpc.py +24 -0
- package/core/individual.bio.organs/hands.fileactions/authorize.TRUST +1 -0
- package/core/individual.bio.organs/hands.fileactions/authorize.ts +70 -0
- package/core/individual.bio.organs/hands.fileactions/authorize.ts.CHANGELOG +1 -0
- package/core/individual.bio.organs/hands.fileactions/authorize.ts.SPEC +3 -0
- package/core/individual.bio.organs/hands.fileactions/dir.README +13 -0
- package/core/individual.bio.organs/hands.fileactions/file_rules.json +23 -0
- package/core/individual.bio.organs/hands.fileactions/fileactions.README +12 -0
- package/core/individual.bio.organs/hands.fileactions/fileactions.ts +540 -0
- package/core/individual.bio.organs/hands.fileactions/fileactions.ts.CHANGELOG +25 -0
- package/core/individual.bio.organs/hands.fileactions/fileactions.ts.SPEC +30 -0
- package/core/individual.bio.organs/hands.fileactions/filewatch.ts +66 -0
- package/core/individual.bio.organs/hands.fileactions/filewatch.ts.SPEC +3 -0
- package/core/individual.bio.organs/hands.main/main.ts +18 -0
- package/core/individual.bio.organs/hands.main/main.ts.SPEC +20 -0
- package/core/individual.bio.organs/hands.sensitive/sensitive.ts +24 -0
- package/core/individual.bio.organs/hands.sensitive/sensitive.ts.CHANGELOG +2 -0
- package/core/individual.bio.organs/hands.sensitive/sensitive.ts.SPEC +3 -0
- package/core/individual.bio.organs/heart.interrupt/agent_start-loader-flicker.patch +13 -0
- package/core/individual.bio.organs/heart.interrupt/interactive-mode-loader.patch +11 -0
- package/core/individual.bio.organs/heart.interrupt/runner_esc.patch +10 -0
- package/core/individual.bio.organs/heart.interrupt/runner_esc.patch.SPEC +9 -0
- package/core/individual.bio.organs/heart.kernel/kernel.ts +253 -0
- package/core/individual.bio.organs/heart.kernel/kernel.ts.CHANGELOG +13 -0
- package/core/individual.bio.organs/heart.kernel/kernel.ts.SPEC +23 -0
- package/core/individual.bio.organs/heart.main/heart.main.CHANGELOG +43 -0
- package/core/individual.bio.organs/heart.main/heartbeat.ts +494 -0
- package/core/individual.bio.organs/heart.main/heartbeat.ts.LESSON +43 -0
- package/core/individual.bio.organs/heart.main/main.ts +8 -0
- package/core/individual.bio.organs/heart.main/main.ts.SPEC +19 -0
- package/core/individual.bio.organs/heart.main/process.ts +122 -0
- package/core/individual.bio.organs/heart.main/process.ts.CHANGELOG +2 -0
- package/core/individual.bio.organs/heart.main/process.ts.SPEC +24 -0
- package/core/individual.bio.organs/heart.main/remove_timeout.patch +110 -0
- package/core/individual.bio.organs/heart.main/stop.ts.CHANGELOG +3 -0
- package/core/individual.bio.organs/heart.main/stop.ts.SPEC +28 -0
- package/core/individual.bio.organs/mouth.speak/index.ts +1 -0
- package/core/individual.bio.organs/mouth.speak/index.ts.CHANGELOG +1 -0
- package/core/individual.bio.organs/mouth.speak/index.ts.SPEC +6 -0
- package/core/individual.bio.organs/mouth.speak/mouth.ts.CHANGELOG +15 -0
- package/core/individual.bio.organs/mouth.speak/mouth_recorder.py.CHANGELOG +1 -0
- package/core/individual.bio.organs/mouth.speak/speak.ts +180 -0
- package/core/individual.bio.organs/mouth.speak/speak.ts.SPEC +3 -0
- package/core/individual.bio.organs/mouth.speak/speak_recorder.py +35 -0
- package/core/individual.bio.organs/mouth.speak/speak_recorder.py.SPEC +3 -0
- package/core/individual.bio.organs/organs.README +110 -0
- package/core/package-lock.json +18 -0
- package/core/package.json +35 -0
- package/core/prompts/prompts.json +77 -0
- package/core/prompts/prompts.ts +44 -0
- package/core/prompts/prompts.ts.SPEC +9 -0
- package/core/society.world/.gitkeep +0 -0
- package/core/society.world/accessibility.claudecode/message-service.cjs +217 -0
- package/core/society.world/accessibility.claudecode/message-service.cjs.SPEC +7 -0
- package/core/society.world/accessibility.claudecode/send.ts +34 -0
- package/core/society.world/dollar.distribution.ubi/ubi.ts +55 -0
- package/core/society.world/dollar.main/dollar-service.cjs +185 -0
- package/core/society.world/dollar.main/main.ts +116 -0
- package/core/society.world/dollar.transaction/transaction.ts +71 -0
- package/core/society.world/space/space.ts +206 -0
- package/core/society.world/space/space.ts.SPEC +30 -0
- package/core/technology.laptop/#agent.macos.BLUEPRINT +278 -0
- package/core/technology.phone/apps.preinstalled/albums.FUTURE/albums.ts +69 -0
- package/core/technology.phone/apps.preinstalled/albums.FUTURE/albums.ts.SPEC +15 -0
- package/core/technology.phone/apps.preinstalled/calendar/calendar.ts +406 -0
- package/core/technology.phone/apps.preinstalled/calendar/calendar.ts.SPEC +22 -0
- package/core/technology.phone/apps.preinstalled/calendar/holiday-calendar.ts +529 -0
- package/core/technology.phone/apps.preinstalled/clock/clock.ts +132 -0
- package/core/technology.phone/apps.preinstalled/clock/clock.ts.SPEC +11 -0
- package/core/technology.phone/apps.preinstalled/contacts.FUTURE/contacts.ts +300 -0
- package/core/technology.phone/apps.preinstalled/contacts.FUTURE/contacts.ts.SPEC +22 -0
- package/core/technology.phone/apps.preinstalled/developer.FUTURE/developer.ts +22 -0
- package/core/technology.phone/apps.preinstalled/developer.FUTURE/developer.ts.SPEC +15 -0
- package/core/technology.phone/apps.preinstalled/notes/notes.ts +239 -0
- package/core/technology.phone/apps.preinstalled/notes/notes.ts.SPEC +21 -0
- package/core/technology.phone/apps.preinstalled/polymarket/polymarket.ts +261 -0
- package/core/technology.phone/apps.preinstalled/polymarket/polymarket.ts.SPEC +7 -0
- package/core/technology.phone/apps.preinstalled/reminder/reminder.ts +404 -0
- package/core/technology.phone/apps.preinstalled/reminder/reminder.ts.SPEC +25 -0
- package/core/technology.phone/apps.preinstalled/siri.FUTURE/siri.ts +22 -0
- package/core/technology.phone/apps.preinstalled/siri.FUTURE/siri.ts.SPEC +15 -0
- package/core/technology.phone/apps.preinstalled/spotlight/spotlight.ts +29 -0
- package/core/technology.phone/apps.preinstalled/spotlight/spotlight.ts.SPEC +7 -0
- package/core/technology.phone/apps.preinstalled/steam/chess.ts +230 -0
- package/core/technology.phone/apps.preinstalled/steam/snake.ts +100 -0
- package/core/technology.phone/apps.preinstalled/steam/snake.ts.SPEC +7 -0
- package/core/technology.phone/apps.preinstalled/steam/spy-cmd.ts +4 -0
- package/core/technology.phone/apps.preinstalled/steam/spy-tool.ts +56 -0
- package/core/technology.phone/apps.preinstalled/steam/spy.ts +302 -0
- package/core/technology.phone/apps.preinstalled/steam/steam.ts +299 -0
- package/core/technology.phone/apps.preinstalled/weather/weather.ts +50 -0
- package/core/technology.phone/apps.preinstalled/weather/weather.ts.SPEC +9 -0
- package/core/technology.phone/apps.preinstalled/wechat/imessage.ts +423 -0
- package/core/technology.phone/apps.preinstalled/wechat/imessage.ts.SPEC +24 -0
- package/core/technology.phone/apps.system/appstore/appstore.ts +22 -0
- package/core/technology.phone/apps.system/appstore/appstore.ts.SPEC +15 -0
- package/core/technology.phone/apps.system/finder.FUTURE/finder.ts +64 -0
- package/core/technology.phone/apps.system/finder.FUTURE/finder.ts.SPEC +8 -0
- package/core/technology.phone/apps.system/safari/safari-app.ts +146 -0
- package/core/technology.phone/apps.system/safari/safari.ts.SPEC +24 -0
- package/core/technology.phone/apps.system/settings/settings.ts +126 -0
- package/core/technology.phone/apps.system/settings/settings.ts.SPEC +17 -0
- package/core/technology.phone/apps.system/tips/tips.ts +22 -0
- package/core/technology.phone/apps.system/tips/tips.ts.SPEC +15 -0
- package/core/technology.phone/apps.thirdparty/alipay/alipay.ts +148 -0
- package/core/technology.phone/apps.thirdparty/alipay/alipay.ts.SPEC +7 -0
- package/core/technology.phone/apps.thirdparty/bilibili/bilibili-app.ts +33 -0
- package/core/technology.phone/apps.thirdparty/bilibili/bilibili.ts +142 -0
- package/core/technology.phone/apps.thirdparty/bilibili/bilibili.ts.SPEC +22 -0
- package/core/technology.phone/apps.thirdparty/wechatread/wechatread.ts +80 -0
- package/core/technology.phone/apps.thirdparty/wechatread/wechatread.ts.SPEC +15 -0
- package/core/technology.phone/index.ts +1 -0
- package/core/technology.phone/package.json +2 -0
- package/core/technology.phone/system.homepage/homepage.ts +247 -0
- package/core/technology.phone/system.homepage/homepage.ts.SPEC +22 -0
- package/core/technology.phone/system.kernel/kernel.ts +264 -0
- package/core/technology.phone/system.kernel/kernel.ts.SPEC +7 -0
- package/core/technology.phone/system.notifications/notifications.ts +87 -0
- package/core/technology.phone/system.notifications/notifications.ts.SPEC +7 -0
- package/core/technology.phone/system.share/share.ts +46 -0
- package/core/technology.phone/system.share/share.ts.SPEC +7 -0
- package/core/technology.server/browser-service.cjs +152 -0
- package/core/technology.server/data/cookies/arxiv.json +30 -0
- package/core/technology.server/data/cookies/bili.json +184 -0
- package/core/technology.server/data/cookies/default.json +30 -0
- package/core/technology.server/data/cookies/news.json +113 -0
- package/core/technology.server/data/cookies/s1.json +45 -0
- package/core/technology.server/data/cookies/safari.json +184 -0
- package/core/technology.server/data/cookies/safari2.json +1 -0
- package/core/technology.server/data/cookies/safaridbg.json +1 -0
- package/core/technology.server/data/cookies/search.json +45 -0
- package/core/technology.server/data/cookies/sw.json +30 -0
- package/core/technology.server/data/cookies/t1.json +1 -0
- package/core/technology.server/data/cookies/testread.json +1 -0
- package/core/technology.server/data/cookies/video1.json +113 -0
- package/core/technology.server/data/cookies/yt.json +170 -0
- package/core/technology.server/data/cookies/yt2.json +113 -0
- package/core/technology.server/pikipedia/#pikipedia.BLUEPRINT +106 -0
- package/core/technology.server/playleft.cjs +247 -0
- package/core/technology.server/search-proxy.py +76 -0
- package/core/technology.server/server.README +59 -0
- package/deploy/dist-overrides/cli/cli.js +18 -0
- package/deploy/dist-overrides/core/extensions/loader.js +518 -0
- package/deploy/dist-overrides/core/package-manager.js +2081 -0
- package/deploy/dist-overrides/core/system-prompt.js +109 -0
- package/deploy/dist-overrides/core/system-prompt.js.LESSON +17 -0
- package/deploy/dist-overrides/core/tools/bash.js +353 -0
- package/deploy/dist-overrides/core/tools/bash.js.CHANGELOG +2 -0
- package/deploy/dist-overrides/core/tools/edit-diff.js +345 -0
- package/deploy/dist-overrides/core/tools/edit.js +315 -0
- package/deploy/dist-overrides/core/tools/edit.js.CHANGELOG +1 -0
- package/deploy/dist-overrides/core/tools/file-mutation-queue.js +52 -0
- package/deploy/dist-overrides/core/tools/find.js +298 -0
- package/deploy/dist-overrides/core/tools/find.js.CHANGELOG +1 -0
- package/deploy/dist-overrides/core/tools/grep.js +305 -0
- package/deploy/dist-overrides/core/tools/grep.js.CHANGELOG +1 -0
- package/deploy/dist-overrides/core/tools/index.js +112 -0
- package/deploy/dist-overrides/core/tools/ls-guard.js +4 -0
- package/deploy/dist-overrides/core/tools/ls.js +170 -0
- package/deploy/dist-overrides/core/tools/ls.js.CHANGELOG +1 -0
- package/deploy/dist-overrides/core/tools/output-accumulator.js +184 -0
- package/deploy/dist-overrides/core/tools/path-utils.js +99 -0
- package/deploy/dist-overrides/core/tools/prompts-reader.js +53 -0
- package/deploy/dist-overrides/core/tools/read.js +392 -0
- package/deploy/dist-overrides/core/tools/read.js.CHANGELOG +1 -0
- package/deploy/dist-overrides/core/tools/render-utils.js +65 -0
- package/deploy/dist-overrides/core/tools/tool-definition-wrapper.js +34 -0
- package/deploy/dist-overrides/core/tools/truncate.js +215 -0
- package/deploy/dist-overrides/core/tools/write.js +203 -0
- package/deploy/dist-overrides/core/tools/write.js.CHANGELOG +1 -0
- package/deploy/dist-overrides/dist-overrides.README +18 -0
- package/deploy/dist-overrides/main.js +665 -0
- package/deploy/dist-overrides/modes/interactive/components/assistant-message.js +139 -0
- package/deploy/dist-overrides/modes/interactive/components/footer.js +326 -0
- package/deploy/dist-overrides/modes/interactive/components/model-selector.js +285 -0
- package/deploy/dist-overrides/modes/interactive/components/tool-execution.js +383 -0
- package/deploy/dist-overrides/modes/interactive/components/tool-execution.js.CHANGELOG +3 -0
- package/deploy/dist-overrides/modes/interactive/interactive-mode.js +4781 -0
- package/deploy/dist-overrides/pi-ai/providers/anthropic.js +931 -0
- package/deploy/dist-overrides/pi-ai/providers/openai-completions.js +1007 -0
- package/deploy/dist-overrides/pi-ai/providers/openai-completions.js.LESSON +15 -0
- package/deploy/dist-overrides/pi-tui/components/loader.js +69 -0
- package/deploy/dist-overrides/pi-tui/components/markdown.js +646 -0
- package/deploy/dist-overrides/pi-tui/components/text.js +92 -0
- package/deploy/dist-overrides/pi-tui/custom-message.js +75 -0
- package/deploy/dist-overrides/pi-tui/tui.js +1266 -0
- package/deploy/dist-overrides/pi-tui/utils.js +1060 -0
- package/deploy/dist-overrides/vendor.REMOVED/jiti/lib/jiti.mjs +3 -0
- package/deploy/install.sh +186 -0
- package/deploy/install.sh.CHANGELOG +6 -0
- package/deploy/lint/lint-naming.ts +202 -0
- package/deploy/scripts/apply.js +18 -0
- package/deploy/scripts/build-github.sh +219 -0
- package/deploy/scripts/build-phone.sh +24 -0
- package/deploy/scripts/check-deploy.sh +42 -0
- package/deploy/scripts/migrate-context.sh +72 -0
- package/deploy/scripts/patch-pi-dist.js +39 -0
- package/deploy/scripts/uninstall.sh +34 -0
- package/package.json +18 -0
|
@@ -0,0 +1,529 @@
|
|
|
1
|
+
// calendar/holiday-calendar.ts — 节假日数据 + 阴历换算
|
|
2
|
+
// Apple Calendar 级别的中美节假日,支持阴历节日
|
|
3
|
+
// Lunar data: 1901-2099, auto-generated by cnlunar (196 years)
|
|
4
|
+
// Leap months handled correctly via leapIdx
|
|
5
|
+
|
|
6
|
+
import * as fs from "fs";
|
|
7
|
+
import * as path from "path";
|
|
8
|
+
|
|
9
|
+
// ── Region ────────────────────────────────────────────────────
|
|
10
|
+
export type Region = "CN" | "US";
|
|
11
|
+
|
|
12
|
+
export function getRegion(personDir: string): Region {
|
|
13
|
+
try {
|
|
14
|
+
const raw = JSON.parse(fs.readFileSync(path.join(personDir, "settings.json"), "utf8"));
|
|
15
|
+
return raw.region === "US" ? "US" : "CN";
|
|
16
|
+
} catch {
|
|
17
|
+
return "CN";
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export function setRegion(personDir: string, region: Region) {
|
|
22
|
+
let settings: any = {};
|
|
23
|
+
try {
|
|
24
|
+
settings = JSON.parse(fs.readFileSync(path.join(personDir, "settings.json"), "utf8"));
|
|
25
|
+
} catch {}
|
|
26
|
+
settings.region = region;
|
|
27
|
+
fs.writeFileSync(path.join(personDir, "settings.json"), JSON.stringify(settings, null, 2));
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// ── Holiday type ──────────────────────────────────────────────
|
|
31
|
+
export interface Holiday {
|
|
32
|
+
date: string; // YYYY-MM-DD
|
|
33
|
+
name: string;
|
|
34
|
+
emoji: string;
|
|
35
|
+
type: "public" | "observance" | "traditional";
|
|
36
|
+
lunar?: string;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
// ── Helpers ───────────────────────────────────────────────────
|
|
40
|
+
function nthWeekdayOf(year: number, month: number, weekday: number, n: number): string {
|
|
41
|
+
const d = new Date(year, month - 1, 1);
|
|
42
|
+
while (d.getDay() !== weekday) d.setDate(d.getDate() + 1);
|
|
43
|
+
d.setDate(d.getDate() + (n - 1) * 7);
|
|
44
|
+
return d.toISOString().slice(0, 10);
|
|
45
|
+
}
|
|
46
|
+
function lastWeekdayOf(year: number, month: number, weekday: number): string {
|
|
47
|
+
const d = new Date(year, month, 0);
|
|
48
|
+
while (d.getDay() !== weekday) d.setDate(d.getDate() - 1);
|
|
49
|
+
return d.toISOString().slice(0, 10);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// ── US Holidays (Federal + observances, matching Apple Calendar) ──
|
|
53
|
+
function usHolidays(year: number): Holiday[] {
|
|
54
|
+
const h: Holiday[] = [
|
|
55
|
+
{ date: `${year}-01-01`, name: "New Year's Day", emoji: "", type: "public" },
|
|
56
|
+
{ date: nthWeekdayOf(year, 1, 1, 3), name: "Martin Luther King Jr. Day", emoji: "", type: "public" },
|
|
57
|
+
{ date: nthWeekdayOf(year, 2, 1, 3), name: "Presidents' Day", emoji: "", type: "public" },
|
|
58
|
+
{ date: lastWeekdayOf(year, 5, 1), name: "Memorial Day", emoji: "", type: "public" },
|
|
59
|
+
{ date: `${year}-06-19`, name: "Juneteenth", emoji: "", type: "public" },
|
|
60
|
+
{ date: `${year}-07-04`, name: "Independence Day", emoji: "", type: "public" },
|
|
61
|
+
{ date: nthWeekdayOf(year, 9, 1, 1), name: "Labor Day", emoji: "", type: "public" },
|
|
62
|
+
{ date: nthWeekdayOf(year, 10, 1, 2), name: "Columbus Day", emoji: "", type: "public" },
|
|
63
|
+
{ date: `${year}-11-11`, name: "Veterans Day", emoji: "", type: "public" },
|
|
64
|
+
{ date: nthWeekdayOf(year, 11, 4, 4), name: "Thanksgiving", emoji: "", type: "public" },
|
|
65
|
+
{ date: `${year}-12-25`, name: "Christmas Day", emoji: "", type: "public" },
|
|
66
|
+
];
|
|
67
|
+
h.push(
|
|
68
|
+
{ date: `${year}-02-14`, name: "Valentine's Day", emoji: "", type: "observance" },
|
|
69
|
+
{ date: `${year}-03-17`, name: "St. Patrick's Day", emoji: "", type: "observance" },
|
|
70
|
+
{ date: `${year}-10-31`, name: "Halloween", emoji: "", type: "observance" },
|
|
71
|
+
{ date: `${year}-12-24`, name: "Christmas Eve", emoji: "", type: "observance" },
|
|
72
|
+
{ date: `${year}-12-31`, name: "New Year's Eve", emoji: "", type: "observance" },
|
|
73
|
+
);
|
|
74
|
+
// Easter (Gauss algorithm)
|
|
75
|
+
const a = year % 19, b = Math.floor(year / 100), c = year % 100;
|
|
76
|
+
const d = Math.floor(b / 4), e = b % 4, f = Math.floor((b + 8) / 25);
|
|
77
|
+
const g = Math.floor((b - f + 1) / 3);
|
|
78
|
+
const hh = (19 * a + b - d - g + 15) % 30;
|
|
79
|
+
const i = Math.floor(c / 4), k = c % 4;
|
|
80
|
+
const l = (32 + 2 * e + 2 * i - hh - k) % 7;
|
|
81
|
+
const m = Math.floor((a + 11 * hh + 22 * l) / 451);
|
|
82
|
+
const mo = Math.floor((hh + l - 7 * m + 114) / 31);
|
|
83
|
+
const da = ((hh + l - 7 * m + 114) % 31) + 1;
|
|
84
|
+
const easter = `${year}-${String(mo).padStart(2, "0")}-${String(da).padStart(2, "0")}`;
|
|
85
|
+
h.push({ date: easter, name: "Easter", emoji: "", type: "observance" });
|
|
86
|
+
const ed = new Date(easter + "T00:00:00");
|
|
87
|
+
ed.setDate(ed.getDate() - 2);
|
|
88
|
+
h.push({ date: ed.toISOString().slice(0, 10), name: "Good Friday", emoji: "", type: "observance" });
|
|
89
|
+
h.push({ date: nthWeekdayOf(year, 5, 0, 2), name: "Mother's Day", emoji: "", type: "observance" });
|
|
90
|
+
h.push({ date: nthWeekdayOf(year, 6, 0, 3), name: "Father's Day", emoji: "", type: "observance" });
|
|
91
|
+
return h;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
// ── Lunar calendar data (1901-2099) ──────────────────────────
|
|
95
|
+
// cny: Chinese New Year solar date
|
|
96
|
+
// leapIdx: 0-based index of leap month (null if none)
|
|
97
|
+
// lengths: 12 (normal) or 13 (leap) entries of 29 or 30 days
|
|
98
|
+
|
|
99
|
+
const LUNAR_DATA: Record<number, {
|
|
100
|
+
cny: string;
|
|
101
|
+
leapIdx: number | null;
|
|
102
|
+
lengths: number[];
|
|
103
|
+
}> = {
|
|
104
|
+
1901: { cny: '1901-02-19', leapIdx: null, lengths: [29,30,29,29,30,29,30,29,30,30,30,29] },
|
|
105
|
+
1902: { cny: '1902-02-08', leapIdx: null, lengths: [30,29,30,29,29,30,29,30,29,30,30,30] },
|
|
106
|
+
1903: { cny: '1903-01-29', leapIdx: 4, lengths: [29,30,29,30,29,29,30,29,29,30,30,29,30] },
|
|
107
|
+
1904: { cny: '1904-02-16', leapIdx: null, lengths: [30,30,29,30,29,29,30,29,29,30,30,29] },
|
|
108
|
+
1905: { cny: '1905-02-04', leapIdx: null, lengths: [30,30,29,30,30,29,29,30,29,30,29,30] },
|
|
109
|
+
1906: { cny: '1906-01-25', leapIdx: 3, lengths: [29,30,30,29,30,29,30,29,30,29,30,29,30] },
|
|
110
|
+
1907: { cny: '1907-02-13', leapIdx: null, lengths: [29,30,29,30,29,30,30,29,30,29,30,29] },
|
|
111
|
+
1908: { cny: '1908-02-02', leapIdx: null, lengths: [30,29,29,30,30,29,30,29,30,30,29,30] },
|
|
112
|
+
1909: { cny: '1909-01-22', leapIdx: 1, lengths: [29,30,29,29,30,29,30,29,30,30,30,29,30] },
|
|
113
|
+
1910: { cny: '1910-02-10', leapIdx: null, lengths: [29,30,29,29,30,29,30,29,30,30,30,29] },
|
|
114
|
+
1911: { cny: '1911-01-30', leapIdx: 5, lengths: [30,29,30,29,29,30,29,29,30,30,29,30,30] },
|
|
115
|
+
1912: { cny: '1912-02-18', leapIdx: null, lengths: [30,29,30,29,29,30,29,29,30,30,29,30] },
|
|
116
|
+
1913: { cny: '1913-02-06', leapIdx: null, lengths: [30,30,29,30,29,29,30,29,29,30,29,30] },
|
|
117
|
+
1914: { cny: '1914-01-26', leapIdx: 4, lengths: [30,30,29,30,29,30,29,30,29,29,30,29,30] },
|
|
118
|
+
1915: { cny: '1915-02-14', leapIdx: null, lengths: [30,29,30,30,29,30,29,30,29,30,29,29] },
|
|
119
|
+
1916: { cny: '1916-02-03', leapIdx: null, lengths: [30,30,29,30,29,30,30,29,30,29,30,29] },
|
|
120
|
+
1917: { cny: '1917-01-23', leapIdx: 1, lengths: [30,29,29,30,29,30,30,29,30,30,29,30,29] },
|
|
121
|
+
1918: { cny: '1918-02-11', leapIdx: null, lengths: [30,29,29,30,29,30,29,30,30,29,30,30] },
|
|
122
|
+
1919: { cny: '1919-02-01', leapIdx: 6, lengths: [29,30,29,29,30,29,29,30,30,29,30,30,30] },
|
|
123
|
+
1920: { cny: '1920-02-20', leapIdx: null, lengths: [29,30,29,29,30,29,29,30,29,30,30,30] },
|
|
124
|
+
1921: { cny: '1921-02-08', leapIdx: null, lengths: [30,29,30,29,29,30,29,29,30,29,30,30] },
|
|
125
|
+
1922: { cny: '1922-01-28', leapIdx: 4, lengths: [30,29,30,30,29,29,30,29,29,30,29,30,30] },
|
|
126
|
+
1923: { cny: '1923-02-16', leapIdx: null, lengths: [29,30,30,29,30,29,30,29,29,30,29,30] },
|
|
127
|
+
1924: { cny: '1924-02-05', leapIdx: null, lengths: [29,30,30,29,30,30,29,30,29,30,29,29] },
|
|
128
|
+
1925: { cny: '1925-01-24', leapIdx: 3, lengths: [30,29,30,29,30,30,29,30,30,29,30,29,30] },
|
|
129
|
+
1926: { cny: '1926-02-13', leapIdx: null, lengths: [29,29,30,29,30,29,30,30,29,30,30,29] },
|
|
130
|
+
1927: { cny: '1927-02-02', leapIdx: null, lengths: [30,29,29,30,29,30,29,30,29,30,30,30] },
|
|
131
|
+
1928: { cny: '1928-01-23', leapIdx: 1, lengths: [29,30,29,29,30,29,29,30,29,30,30,30,30] },
|
|
132
|
+
1929: { cny: '1929-02-10', leapIdx: null, lengths: [29,30,29,29,30,29,29,30,29,30,30,30] },
|
|
133
|
+
1930: { cny: '1930-01-30', leapIdx: 5, lengths: [29,30,30,29,29,30,29,29,30,29,30,30,29] },
|
|
134
|
+
1931: { cny: '1931-02-17', leapIdx: null, lengths: [30,30,29,30,29,30,29,29,30,29,30,29] },
|
|
135
|
+
1932: { cny: '1932-02-06', leapIdx: null, lengths: [30,30,30,29,30,29,30,29,29,30,29,30] },
|
|
136
|
+
1933: { cny: '1933-01-26', leapIdx: 4, lengths: [29,30,30,29,30,30,29,30,29,30,29,29,30] },
|
|
137
|
+
1934: { cny: '1934-02-14', leapIdx: null, lengths: [29,30,29,30,30,29,30,29,30,30,29,30] },
|
|
138
|
+
1935: { cny: '1935-02-04', leapIdx: null, lengths: [29,29,30,29,30,29,30,30,29,30,30,29] },
|
|
139
|
+
1936: { cny: '1936-01-24', leapIdx: 2, lengths: [30,29,29,30,29,29,30,30,29,30,30,30,29] },
|
|
140
|
+
1937: { cny: '1937-02-11', leapIdx: null, lengths: [30,29,29,30,29,29,30,29,30,30,30,29] },
|
|
141
|
+
1938: { cny: '1938-01-31', leapIdx: 6, lengths: [30,30,29,29,30,29,29,30,29,30,30,29,30] },
|
|
142
|
+
1939: { cny: '1939-02-19', leapIdx: null, lengths: [30,30,29,29,30,29,29,30,29,30,29,30] },
|
|
143
|
+
1940: { cny: '1940-02-08', leapIdx: null, lengths: [30,30,29,30,29,30,29,29,30,29,30,29] },
|
|
144
|
+
1941: { cny: '1941-01-27', leapIdx: 5, lengths: [30,30,29,30,30,29,30,29,29,30,29,30,29] },
|
|
145
|
+
1942: { cny: '1942-02-15', leapIdx: null, lengths: [30,29,30,30,29,30,29,30,29,30,29,30] },
|
|
146
|
+
1943: { cny: '1943-02-05', leapIdx: null, lengths: [29,30,29,30,29,30,30,29,30,29,30,29] },
|
|
147
|
+
1944: { cny: '1944-01-25', leapIdx: 3, lengths: [30,29,30,29,30,29,30,29,30,30,29,30,30] },
|
|
148
|
+
1945: { cny: '1945-02-13', leapIdx: null, lengths: [29,29,30,29,29,30,29,30,30,30,29,30] },
|
|
149
|
+
1946: { cny: '1946-02-02', leapIdx: null, lengths: [30,29,29,30,29,29,30,29,30,30,29,30] },
|
|
150
|
+
1947: { cny: '1947-01-22', leapIdx: 1, lengths: [30,30,29,29,30,29,29,30,29,30,29,30,30] },
|
|
151
|
+
1948: { cny: '1948-02-10', leapIdx: null, lengths: [30,29,30,29,30,29,29,30,29,30,29,30] },
|
|
152
|
+
1949: { cny: '1949-01-29', leapIdx: 6, lengths: [30,29,30,30,29,30,29,29,30,29,30,29,30] },
|
|
153
|
+
1950: { cny: '1950-02-17', leapIdx: null, lengths: [29,30,30,29,30,30,29,29,30,29,30,29] },
|
|
154
|
+
1951: { cny: '1951-02-06', leapIdx: null, lengths: [30,29,30,30,29,30,29,30,29,30,29,30] },
|
|
155
|
+
1952: { cny: '1952-01-27', leapIdx: 4, lengths: [29,30,29,30,29,30,29,30,30,29,30,29,30] },
|
|
156
|
+
1953: { cny: '1953-02-14', leapIdx: null, lengths: [29,30,29,29,30,30,29,30,30,29,30,29] },
|
|
157
|
+
1954: { cny: '1954-02-03', leapIdx: null, lengths: [30,29,30,29,29,30,29,30,30,29,30,30] },
|
|
158
|
+
1955: { cny: '1955-01-24', leapIdx: 2, lengths: [29,30,29,30,29,29,30,29,30,29,30,30,30] },
|
|
159
|
+
1956: { cny: '1956-02-12', leapIdx: null, lengths: [29,30,29,30,29,29,30,29,30,29,30,30] },
|
|
160
|
+
1957: { cny: '1957-01-31', leapIdx: 7, lengths: [30,29,30,29,30,29,29,30,29,30,29,30,29] },
|
|
161
|
+
1958: { cny: '1958-02-18', leapIdx: null, lengths: [30,30,30,29,30,29,29,30,29,30,29,30] },
|
|
162
|
+
1959: { cny: '1959-02-08', leapIdx: null, lengths: [29,30,30,29,30,29,30,29,30,29,30,29] },
|
|
163
|
+
1960: { cny: '1960-01-28', leapIdx: 5, lengths: [30,29,30,29,30,30,29,30,29,30,29,30,29] },
|
|
164
|
+
1961: { cny: '1961-02-15', leapIdx: null, lengths: [30,29,30,29,30,29,30,30,29,30,29,30] },
|
|
165
|
+
1962: { cny: '1962-02-05', leapIdx: null, lengths: [29,30,29,29,30,29,30,30,29,30,30,29] },
|
|
166
|
+
1963: { cny: '1963-01-25', leapIdx: 3, lengths: [30,29,30,29,29,30,29,30,29,30,30,30,29] },
|
|
167
|
+
1964: { cny: '1964-02-13', leapIdx: null, lengths: [30,29,30,29,29,30,29,30,29,30,30,30] },
|
|
168
|
+
1965: { cny: '1965-02-02', leapIdx: null, lengths: [29,30,29,30,29,29,30,29,29,30,30,29] },
|
|
169
|
+
1966: { cny: '1966-01-21', leapIdx: 2, lengths: [30,30,30,29,30,29,29,30,29,29,30,30,29] },
|
|
170
|
+
1967: { cny: '1967-02-09', leapIdx: null, lengths: [30,30,29,30,30,29,29,30,29,30,29,30] },
|
|
171
|
+
1968: { cny: '1968-01-30', leapIdx: 6, lengths: [29,30,29,30,30,29,30,29,30,29,30,29,30] },
|
|
172
|
+
1969: { cny: '1969-02-17', leapIdx: null, lengths: [29,30,29,30,29,30,30,29,30,29,30,29] },
|
|
173
|
+
1970: { cny: '1970-02-06', leapIdx: null, lengths: [30,29,29,30,29,30,30,29,30,30,29,30] },
|
|
174
|
+
1971: { cny: '1971-01-27', leapIdx: 4, lengths: [29,30,29,29,30,29,30,29,30,30,30,29,30] },
|
|
175
|
+
1972: { cny: '1972-02-15', leapIdx: null, lengths: [29,30,29,29,30,29,30,29,30,30,29,30] },
|
|
176
|
+
1973: { cny: '1973-02-03', leapIdx: null, lengths: [30,29,30,29,29,30,29,29,30,30,29,30] },
|
|
177
|
+
1974: { cny: '1974-01-23', leapIdx: 3, lengths: [30,30,29,30,29,29,30,29,29,30,30,29,30] },
|
|
178
|
+
1975: { cny: '1975-02-11', leapIdx: null, lengths: [30,30,29,30,29,29,30,29,29,30,29,30] },
|
|
179
|
+
1976: { cny: '1976-01-31', leapIdx: 7, lengths: [30,30,29,30,29,30,29,30,29,29,30,29,30] },
|
|
180
|
+
1977: { cny: '1977-02-18', leapIdx: null, lengths: [30,29,30,30,29,30,29,30,29,30,29,29] },
|
|
181
|
+
1978: { cny: '1978-02-07', leapIdx: null, lengths: [30,29,30,30,29,30,30,29,30,29,30,29] },
|
|
182
|
+
1979: { cny: '1979-01-28', leapIdx: 5, lengths: [30,29,29,30,29,30,30,29,30,30,29,30,29] },
|
|
183
|
+
1980: { cny: '1980-02-16', leapIdx: null, lengths: [30,29,29,30,29,30,29,30,30,29,30,30] },
|
|
184
|
+
1981: { cny: '1981-02-05', leapIdx: null, lengths: [29,30,29,29,30,29,29,30,30,29,30,30] },
|
|
185
|
+
1982: { cny: '1982-01-25', leapIdx: 3, lengths: [30,29,30,29,29,30,29,29,30,29,30,30,30] },
|
|
186
|
+
1983: { cny: '1983-02-13', leapIdx: null, lengths: [30,29,30,29,29,30,29,29,30,29,30,30] },
|
|
187
|
+
1984: { cny: '1984-02-02', leapIdx: 9, lengths: [30,29,30,30,29,29,30,29,29,30,29,30,30] },
|
|
188
|
+
1985: { cny: '1985-02-20', leapIdx: null, lengths: [29,30,30,29,30,29,30,29,29,30,29,30] },
|
|
189
|
+
1986: { cny: '1986-02-09', leapIdx: null, lengths: [29,30,30,29,30,30,29,30,29,30,29,29] },
|
|
190
|
+
1987: { cny: '1987-01-29', leapIdx: 5, lengths: [30,29,30,29,30,30,29,30,30,29,30,29,29] },
|
|
191
|
+
1988: { cny: '1988-02-17', leapIdx: null, lengths: [30,29,30,29,30,29,30,30,29,30,30,29] },
|
|
192
|
+
1989: { cny: '1989-02-06', leapIdx: null, lengths: [30,29,29,30,29,30,29,30,29,30,30,30] },
|
|
193
|
+
1990: { cny: '1990-01-27', leapIdx: 4, lengths: [29,30,29,29,30,29,29,30,29,30,30,30,30] },
|
|
194
|
+
1991: { cny: '1991-02-15', leapIdx: null, lengths: [29,30,29,29,30,29,29,30,29,30,30,30] },
|
|
195
|
+
1992: { cny: '1992-02-04', leapIdx: null, lengths: [29,30,30,29,29,30,29,29,30,29,30,30] },
|
|
196
|
+
1993: { cny: '1993-01-23', leapIdx: 2, lengths: [29,30,30,29,30,29,30,29,29,30,29,30,29] },
|
|
197
|
+
1994: { cny: '1994-02-10', leapIdx: null, lengths: [30,30,30,29,30,29,30,29,29,30,29,30] },
|
|
198
|
+
1995: { cny: '1995-01-31', leapIdx: 7, lengths: [29,30,30,29,30,29,30,30,29,29,30,29,30] },
|
|
199
|
+
1996: { cny: '1996-02-19', leapIdx: null, lengths: [29,30,29,30,30,29,30,29,30,30,29,29] },
|
|
200
|
+
1997: { cny: '1997-02-07', leapIdx: null, lengths: [30,29,30,29,30,29,30,30,29,30,30,29] },
|
|
201
|
+
1998: { cny: '1998-01-28', leapIdx: 4, lengths: [30,29,29,30,29,29,30,30,29,30,30,29,30] },
|
|
202
|
+
1999: { cny: '1999-02-16', leapIdx: null, lengths: [30,29,29,30,29,29,30,29,30,30,30,29] },
|
|
203
|
+
2000: { cny: '2000-02-05', leapIdx: null, lengths: [30,30,29,29,30,29,29,30,29,30,30,29] },
|
|
204
|
+
2001: { cny: '2001-01-24', leapIdx: 3, lengths: [30,30,29,30,29,30,29,29,30,29,30,29,30] },
|
|
205
|
+
2002: { cny: '2002-02-12', leapIdx: null, lengths: [30,30,29,30,29,30,29,29,30,29,30,29] },
|
|
206
|
+
2003: { cny: '2003-02-01', leapIdx: null, lengths: [30,30,29,30,30,29,30,29,29,30,29,30] },
|
|
207
|
+
2004: { cny: '2004-01-22', leapIdx: 1, lengths: [29,30,29,30,30,29,30,29,30,29,30,29,30] },
|
|
208
|
+
2005: { cny: '2005-02-09', leapIdx: null, lengths: [29,30,29,30,29,30,30,29,30,29,30,29] },
|
|
209
|
+
2006: { cny: '2006-01-29', leapIdx: 6, lengths: [30,29,30,29,30,29,30,29,30,30,29,30,30] },
|
|
210
|
+
2007: { cny: '2007-02-18', leapIdx: null, lengths: [29,29,30,29,29,30,29,30,30,30,29,30] },
|
|
211
|
+
2008: { cny: '2008-02-07', leapIdx: null, lengths: [30,29,29,30,29,29,30,29,30,30,29,30] },
|
|
212
|
+
2009: { cny: '2009-01-26', leapIdx: 4, lengths: [30,30,29,29,30,29,29,30,29,30,29,30,30] },
|
|
213
|
+
2010: { cny: '2010-02-14', leapIdx: null, lengths: [30,29,30,29,30,29,29,30,29,30,29,30] },
|
|
214
|
+
2011: { cny: '2011-02-03', leapIdx: null, lengths: [30,29,30,30,29,30,29,29,30,29,30,29] },
|
|
215
|
+
2012: { cny: '2012-01-23', leapIdx: 3, lengths: [30,29,30,30,29,30,29,30,29,30,29,30,29] },
|
|
216
|
+
2013: { cny: '2013-02-10', leapIdx: null, lengths: [30,29,30,29,30,30,29,30,29,30,29,30] },
|
|
217
|
+
2014: { cny: '2014-01-31', leapIdx: 8, lengths: [29,30,29,30,29,30,29,30,30,29,30,29,30] },
|
|
218
|
+
2015: { cny: '2015-02-19', leapIdx: null, lengths: [29,30,29,29,30,29,30,30,30,29,30,29] },
|
|
219
|
+
2016: { cny: '2016-02-08', leapIdx: null, lengths: [30,29,30,29,29,30,29,30,30,29,30,30] },
|
|
220
|
+
2017: { cny: '2017-01-28', leapIdx: 5, lengths: [29,30,29,30,29,29,30,29,30,29,30,30,30] },
|
|
221
|
+
2018: { cny: '2018-02-16', leapIdx: null, lengths: [29,30,29,30,29,29,30,29,30,29,30,30] },
|
|
222
|
+
2019: { cny: '2019-02-05', leapIdx: null, lengths: [30,29,30,29,30,29,29,30,29,29,30,30] },
|
|
223
|
+
2020: { cny: '2020-01-25', leapIdx: 3, lengths: [29,30,30,30,29,30,29,29,30,29,30,29,30] },
|
|
224
|
+
2021: { cny: '2021-02-12', leapIdx: null, lengths: [29,30,30,29,30,29,30,29,30,29,30,29] },
|
|
225
|
+
2022: { cny: '2022-02-01', leapIdx: null, lengths: [30,29,30,29,30,30,29,30,29,30,29,30] },
|
|
226
|
+
2023: { cny: '2023-01-22', leapIdx: 1, lengths: [29,30,29,29,30,30,29,30,30,29,30,29,30] },
|
|
227
|
+
2024: { cny: '2024-02-10', leapIdx: null, lengths: [29,30,29,29,30,29,30,30,29,30,30,29] },
|
|
228
|
+
2025: { cny: '2025-01-29', leapIdx: 5, lengths: [30,29,30,29,29,30,29,30,29,30,30,30,29] },
|
|
229
|
+
2026: { cny: '2026-02-17', leapIdx: null, lengths: [30,29,30,29,29,30,29,29,30,30,30,29] },
|
|
230
|
+
2027: { cny: '2027-02-06', leapIdx: null, lengths: [30,30,29,30,29,29,30,29,29,30,30,29] },
|
|
231
|
+
2028: { cny: '2028-01-26', leapIdx: 4, lengths: [30,30,30,29,30,29,29,30,29,29,30,30,29] },
|
|
232
|
+
2029: { cny: '2029-02-13', leapIdx: null, lengths: [30,30,29,30,29,30,29,30,29,29,30,30] },
|
|
233
|
+
2030: { cny: '2030-02-03', leapIdx: null, lengths: [29,30,29,30,30,29,30,29,30,29,30,29] },
|
|
234
|
+
2031: { cny: '2031-01-23', leapIdx: 2, lengths: [29,30,30,29,30,29,30,30,29,30,29,30,29] },
|
|
235
|
+
2032: { cny: '2032-02-11', leapIdx: null, lengths: [30,29,29,30,29,30,30,29,30,30,29,30] },
|
|
236
|
+
2033: { cny: '2033-01-31', leapIdx: 10, lengths: [29,30,29,29,30,29,30,29,30,30,30,29,30] },
|
|
237
|
+
2034: { cny: '2034-02-19', leapIdx: null, lengths: [29,30,29,29,30,29,30,29,30,30,29,30] },
|
|
238
|
+
2035: { cny: '2035-02-08', leapIdx: null, lengths: [30,29,30,29,29,30,29,29,30,30,29,30] },
|
|
239
|
+
2036: { cny: '2036-01-28', leapIdx: 5, lengths: [30,30,29,30,29,29,30,29,29,30,29,30,30] },
|
|
240
|
+
2037: { cny: '2037-02-15', leapIdx: null, lengths: [30,30,29,30,29,29,30,29,29,30,29,30] },
|
|
241
|
+
2038: { cny: '2038-02-04', leapIdx: null, lengths: [30,30,29,30,29,30,29,30,29,29,30,29] },
|
|
242
|
+
2039: { cny: '2039-01-24', leapIdx: 4, lengths: [30,30,29,30,30,29,30,29,30,29,30,29,29] },
|
|
243
|
+
2040: { cny: '2040-02-12', leapIdx: null, lengths: [30,29,30,30,29,30,29,30,30,29,30,29] },
|
|
244
|
+
2041: { cny: '2041-02-01', leapIdx: null, lengths: [29,30,29,30,29,30,30,29,30,30,29,30] },
|
|
245
|
+
2042: { cny: '2042-01-22', leapIdx: 1, lengths: [29,30,29,29,30,29,30,29,30,30,29,30,30] },
|
|
246
|
+
2043: { cny: '2043-02-10', leapIdx: null, lengths: [29,30,29,29,30,29,29,30,30,29,30,30] },
|
|
247
|
+
2044: { cny: '2044-01-30', leapIdx: 6, lengths: [30,29,30,29,29,30,29,29,30,29,30,30,30] },
|
|
248
|
+
2045: { cny: '2045-02-17', leapIdx: null, lengths: [30,29,30,29,29,30,29,29,30,29,30,30] },
|
|
249
|
+
2046: { cny: '2046-02-06', leapIdx: null, lengths: [30,29,30,29,30,29,30,29,29,30,29,30] },
|
|
250
|
+
2047: { cny: '2047-01-26', leapIdx: 4, lengths: [30,29,30,30,29,30,29,30,29,29,30,29,30] },
|
|
251
|
+
2048: { cny: '2048-02-14', leapIdx: null, lengths: [29,30,30,29,30,30,29,30,29,29,30,29] },
|
|
252
|
+
2049: { cny: '2049-02-02', leapIdx: null, lengths: [30,29,30,29,30,30,29,30,30,29,30,29] },
|
|
253
|
+
2050: { cny: '2050-01-23', leapIdx: 2, lengths: [29,30,29,30,29,30,29,30,30,29,30,30,29] },
|
|
254
|
+
2051: { cny: '2051-02-11', leapIdx: null, lengths: [30,29,29,30,29,29,30,30,29,30,30,30] },
|
|
255
|
+
2052: { cny: '2052-02-01', leapIdx: 7, lengths: [29,30,29,29,30,29,29,30,29,30,30,30,30] },
|
|
256
|
+
2053: { cny: '2053-02-19', leapIdx: null, lengths: [29,30,29,29,30,29,29,30,29,30,30,30] },
|
|
257
|
+
2054: { cny: '2054-02-08', leapIdx: null, lengths: [29,30,30,29,29,30,29,29,30,29,30,30] },
|
|
258
|
+
2055: { cny: '2055-01-28', leapIdx: 5, lengths: [29,30,30,29,30,29,30,29,29,30,29,30,29] },
|
|
259
|
+
2056: { cny: '2056-02-15', leapIdx: null, lengths: [30,30,30,29,30,29,30,29,29,30,29,30] },
|
|
260
|
+
2057: { cny: '2057-02-04', leapIdx: null, lengths: [29,30,30,29,30,29,30,29,30,29,30,29] },
|
|
261
|
+
2058: { cny: '2058-01-24', leapIdx: 3, lengths: [30,29,30,29,30,29,30,30,29,30,30,29,29] },
|
|
262
|
+
2059: { cny: '2059-02-12', leapIdx: null, lengths: [30,29,30,29,30,29,30,29,30,30,30,29] },
|
|
263
|
+
2060: { cny: '2060-02-02', leapIdx: null, lengths: [30,29,29,30,29,29,30,29,30,30,30,29] },
|
|
264
|
+
2061: { cny: '2061-01-21', leapIdx: 2, lengths: [30,30,29,29,30,29,29,30,29,30,30,30,29] },
|
|
265
|
+
2062: { cny: '2062-02-09', leapIdx: null, lengths: [30,30,29,29,30,29,29,30,29,30,30,29] },
|
|
266
|
+
2063: { cny: '2063-01-29', leapIdx: 6, lengths: [30,30,29,30,29,30,29,29,30,29,30,29,30] },
|
|
267
|
+
2064: { cny: '2064-02-17', leapIdx: null, lengths: [30,30,29,30,29,30,29,29,30,29,30,29] },
|
|
268
|
+
2065: { cny: '2065-02-05', leapIdx: null, lengths: [30,30,29,30,30,29,30,29,29,30,29,30] },
|
|
269
|
+
2066: { cny: '2066-01-26', leapIdx: 4, lengths: [29,30,29,30,30,29,30,29,30,29,30,29,30] },
|
|
270
|
+
2067: { cny: '2067-02-14', leapIdx: null, lengths: [29,30,29,30,29,30,30,29,30,29,30,29] },
|
|
271
|
+
2068: { cny: '2068-02-03', leapIdx: null, lengths: [30,29,30,29,29,30,30,29,30,30,29,30] },
|
|
272
|
+
2069: { cny: '2069-01-23', leapIdx: 3, lengths: [29,30,29,30,29,29,30,29,30,30,30,29,30] },
|
|
273
|
+
2070: { cny: '2070-02-11', leapIdx: null, lengths: [29,30,29,30,29,29,30,29,30,30,29,30] },
|
|
274
|
+
2071: { cny: '2071-01-31', leapIdx: 7, lengths: [30,29,30,29,30,29,29,30,29,30,29,30,30] },
|
|
275
|
+
2072: { cny: '2072-02-19', leapIdx: null, lengths: [30,29,30,29,30,29,29,30,29,30,29,30] },
|
|
276
|
+
2073: { cny: '2073-02-07', leapIdx: null, lengths: [30,29,30,30,29,30,29,29,30,29,30,29] },
|
|
277
|
+
2074: { cny: '2074-01-27', leapIdx: 5, lengths: [30,29,30,30,29,30,29,30,29,30,29,30,29] },
|
|
278
|
+
2075: { cny: '2075-02-15', leapIdx: null, lengths: [30,29,30,29,30,30,29,30,29,30,29,30] },
|
|
279
|
+
2076: { cny: '2076-02-05', leapIdx: null, lengths: [29,30,29,30,29,30,29,30,30,29,30,29] },
|
|
280
|
+
2077: { cny: '2077-01-24', leapIdx: 3, lengths: [30,29,30,29,29,30,29,30,30,30,29,30,29] },
|
|
281
|
+
2078: { cny: '2078-02-12', leapIdx: null, lengths: [30,29,30,29,29,30,29,30,30,29,30,30] },
|
|
282
|
+
2079: { cny: '2079-02-02', leapIdx: null, lengths: [29,30,29,30,29,29,30,29,30,29,30,30] },
|
|
283
|
+
2080: { cny: '2080-01-22', leapIdx: 2, lengths: [30,29,30,29,30,29,29,30,29,29,30,30,30] },
|
|
284
|
+
2081: { cny: '2081-02-09', leapIdx: null, lengths: [29,30,30,29,30,29,29,30,29,29,30,30] },
|
|
285
|
+
2082: { cny: '2082-01-29', leapIdx: 6, lengths: [29,30,30,30,29,29,30,29,30,29,29,30,30] },
|
|
286
|
+
2083: { cny: '2083-02-17', leapIdx: null, lengths: [29,30,30,29,30,29,30,29,30,29,30,29] },
|
|
287
|
+
2084: { cny: '2084-02-06', leapIdx: null, lengths: [30,29,30,29,30,30,29,30,29,30,29,30] },
|
|
288
|
+
2085: { cny: '2085-01-26', leapIdx: 4, lengths: [29,30,29,29,30,30,29,30,30,29,30,29,30] },
|
|
289
|
+
2086: { cny: '2086-02-14', leapIdx: null, lengths: [29,30,29,29,30,29,30,30,29,30,30,29] },
|
|
290
|
+
2087: { cny: '2087-02-03', leapIdx: null, lengths: [30,29,30,29,29,30,29,30,29,30,30,30] },
|
|
291
|
+
2088: { cny: '2088-01-24', leapIdx: 3, lengths: [29,30,29,30,29,29,30,29,29,30,30,30,29] },
|
|
292
|
+
2089: { cny: '2089-02-10', leapIdx: null, lengths: [30,30,29,30,29,29,29,30,29,30,30,29] },
|
|
293
|
+
2090: { cny: '2090-01-30', leapIdx: 7, lengths: [30,30,30,29,30,29,29,30,29,29,30,30,29] },
|
|
294
|
+
2091: { cny: '2091-02-18', leapIdx: null, lengths: [30,30,29,30,29,30,29,30,29,29,30,29] },
|
|
295
|
+
2092: { cny: '2092-02-07', leapIdx: null, lengths: [30,30,29,30,30,29,30,29,30,29,30,29] },
|
|
296
|
+
2093: { cny: '2093-01-27', leapIdx: 5, lengths: [29,30,30,29,30,29,30,30,29,30,29,30,29] },
|
|
297
|
+
2094: { cny: '2094-02-15', leapIdx: null, lengths: [29,30,29,30,29,30,30,29,30,30,29,30] },
|
|
298
|
+
2095: { cny: '2095-02-05', leapIdx: null, lengths: [29,30,29,29,30,29,30,29,30,30,30,29] },
|
|
299
|
+
2096: { cny: '2096-01-25', leapIdx: 3, lengths: [30,29,30,29,29,30,29,29,30,30,30,29,30] },
|
|
300
|
+
2097: { cny: '2097-02-12', leapIdx: null, lengths: [30,29,30,29,29,29,30,29,30,30,29,30] },
|
|
301
|
+
2098: { cny: '2098-02-01', leapIdx: null, lengths: [30,30,29,30,29,29,29,30,29,30,29,30] },
|
|
302
|
+
2099: { cny: '2099-01-21', leapIdx: 1, lengths: [30,30,29,30,30,29,29,30,29,29,30,29,30] },
|
|
303
|
+
};
|
|
304
|
+
|
|
305
|
+
// ── Lunar calendar names ─────────────────────────────────────
|
|
306
|
+
const LUNAR_MONTH = ["正","二","三","四","五","六","七","八","九","十","冬","腊"];
|
|
307
|
+
const LUNAR_DAY = ["初一","初二","初三","初四","初五","初六","初七","初八","初九","初十","十一","十二","十三","十四","十五","十六","十七","十八","十九","二十","廿一","廿二","廿三","廿四","廿五","廿六","廿七","廿八","廿九","三十"];
|
|
308
|
+
|
|
309
|
+
// ── solarToLunar: Convert solar date to lunar date ───────────
|
|
310
|
+
export interface LunarDate {
|
|
311
|
+
lunarYear: number;
|
|
312
|
+
lunarMonth: number; // 1-12
|
|
313
|
+
lunarDay: number; // 1-30
|
|
314
|
+
isLeap: boolean;
|
|
315
|
+
monthName: string; // e.g. "六" or "闰六"
|
|
316
|
+
dayName: string; // e.g. "初五"
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
export function solarToLunar(solarDate: string): LunarDate | null {
|
|
320
|
+
const d = new Date(solarDate + "T00:00:00");
|
|
321
|
+
if (isNaN(d.getTime())) return null;
|
|
322
|
+
|
|
323
|
+
// Find the lunar year this date belongs to
|
|
324
|
+
// A date belongs to lunar year Y if it is >= CNY of Y and < CNY of Y+1
|
|
325
|
+
let lunarYear = d.getFullYear();
|
|
326
|
+
|
|
327
|
+
// Check if date is before CNY of this solar year
|
|
328
|
+
const thisYearData = LUNAR_DATA[lunarYear];
|
|
329
|
+
if (thisYearData) {
|
|
330
|
+
const cnyThis = new Date(thisYearData.cny + "T00:00:00");
|
|
331
|
+
if (d < cnyThis) {
|
|
332
|
+
lunarYear--;
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
// Verify: check if date >= CNY of next year
|
|
337
|
+
const nextYearData = LUNAR_DATA[lunarYear + 1];
|
|
338
|
+
if (nextYearData) {
|
|
339
|
+
const cnyNext = new Date(nextYearData.cny + "T00:00:00");
|
|
340
|
+
if (d >= cnyNext) {
|
|
341
|
+
lunarYear++;
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
const data = LUNAR_DATA[lunarYear];
|
|
346
|
+
if (!data) return null;
|
|
347
|
+
|
|
348
|
+
// Iterate through months to find the right one
|
|
349
|
+
const cny = new Date(data.cny + "T00:00:00");
|
|
350
|
+
let cursor = new Date(cny);
|
|
351
|
+
const totalMonths = data.lengths.length;
|
|
352
|
+
|
|
353
|
+
for (let i = 0; i < totalMonths; i++) {
|
|
354
|
+
const monthLen = data.lengths[i];
|
|
355
|
+
const nextCursor = new Date(cursor);
|
|
356
|
+
nextCursor.setDate(nextCursor.getDate() + monthLen);
|
|
357
|
+
|
|
358
|
+
if (d >= cursor && d < nextCursor) {
|
|
359
|
+
const dayOffset = Math.floor((d.getTime() - cursor.getTime()) / 86400000);
|
|
360
|
+
const lunarDay = dayOffset + 1;
|
|
361
|
+
|
|
362
|
+
// Determine month number and leap status
|
|
363
|
+
// leapIdx points to the REGULAR month; leap month is at leapIdx+1
|
|
364
|
+
let lunarMonth: number;
|
|
365
|
+
let isLeap = false;
|
|
366
|
+
|
|
367
|
+
if (data.leapIdx === null) {
|
|
368
|
+
lunarMonth = i + 1;
|
|
369
|
+
} else if (i === data.leapIdx + 1) {
|
|
370
|
+
lunarMonth = data.leapIdx + 1;
|
|
371
|
+
isLeap = true;
|
|
372
|
+
} else if (i > data.leapIdx + 1) {
|
|
373
|
+
lunarMonth = i; // shift: leap month takes one slot
|
|
374
|
+
} else {
|
|
375
|
+
lunarMonth = i + 1;
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
const monthIdx = lunarMonth - 1;
|
|
379
|
+
const monthName = isLeap ? `闰${LUNAR_MONTH[monthIdx]}` : LUNAR_MONTH[monthIdx];
|
|
380
|
+
const dayName = LUNAR_DAY[lunarDay - 1] || String(lunarDay);
|
|
381
|
+
|
|
382
|
+
return {
|
|
383
|
+
lunarYear,
|
|
384
|
+
lunarMonth,
|
|
385
|
+
lunarDay,
|
|
386
|
+
isLeap,
|
|
387
|
+
monthName,
|
|
388
|
+
dayName,
|
|
389
|
+
};
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
cursor = nextCursor;
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
return null;
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
// ── lunarDate: Convert lunar date to solar date ──────────────
|
|
399
|
+
export function lunarDate(lunarYear: number, lunarMonth: number, lunarDay: number, isLeap = false): string {
|
|
400
|
+
const data = LUNAR_DATA[lunarYear];
|
|
401
|
+
if (!data) return "";
|
|
402
|
+
|
|
403
|
+
// Calculate the target month index in the lengths array
|
|
404
|
+
// leapIdx points to REGULAR month, leap month is at leapIdx+1
|
|
405
|
+
let targetIdx: number;
|
|
406
|
+
if (data.leapIdx === null) {
|
|
407
|
+
targetIdx = lunarMonth - 1;
|
|
408
|
+
} else if (isLeap && lunarMonth === data.leapIdx + 1) {
|
|
409
|
+
targetIdx = data.leapIdx + 1; // leap month is right after its regular counterpart
|
|
410
|
+
} else if (lunarMonth > data.leapIdx + 1) {
|
|
411
|
+
targetIdx = lunarMonth; // months after leap shift by 1
|
|
412
|
+
} else {
|
|
413
|
+
targetIdx = lunarMonth - 1;
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
if (targetIdx < 0 || targetIdx >= data.lengths.length) return "";
|
|
417
|
+
|
|
418
|
+
// Sum days from CNY to the target month start
|
|
419
|
+
const cny = new Date(data.cny + "T00:00:00");
|
|
420
|
+
let days = 0;
|
|
421
|
+
for (let i = 0; i < targetIdx; i++) {
|
|
422
|
+
days += data.lengths[i];
|
|
423
|
+
}
|
|
424
|
+
days += lunarDay - 1;
|
|
425
|
+
|
|
426
|
+
const result = new Date(cny);
|
|
427
|
+
result.setDate(result.getDate() + days);
|
|
428
|
+
return result.toISOString().slice(0, 10);
|
|
429
|
+
}
|
|
430
|
+
|
|
431
|
+
// ── 清明节: 太阳黄经15° ──────────────────────────────────────
|
|
432
|
+
// Accurate algorithm instead of hardcoded table
|
|
433
|
+
function qingmingDate(year: number): string {
|
|
434
|
+
// Qingming is around April 4-6 each year
|
|
435
|
+
// Using the formula: 清明日期 = (Y*D+C)-L
|
|
436
|
+
// Y = year % 100, D = 0.2422, C = 4.81 (for 20th century) or 5.59 (for 21st century)
|
|
437
|
+
// L = Math.floor(Y/4)
|
|
438
|
+
const Y = year % 100;
|
|
439
|
+
const D = 0.2422;
|
|
440
|
+
const C = year < 2000 ? 4.81 : (year < 2100 ? 5.59 : 5.59); // simplified
|
|
441
|
+
const L = Math.floor(Y / 4);
|
|
442
|
+
const day = Math.floor(Y * D + C) - L;
|
|
443
|
+
return `${year}-04-${String(day).padStart(2, "0")}`;
|
|
444
|
+
}
|
|
445
|
+
|
|
446
|
+
// ── China Holidays (法定节假日 + 传统节日) ──
|
|
447
|
+
function cnHolidays(year: number): Holiday[] {
|
|
448
|
+
const h: Holiday[] = [];
|
|
449
|
+
|
|
450
|
+
h.push({ date: `${year}-01-01`, name: "元旦", emoji: "", type: "public" });
|
|
451
|
+
|
|
452
|
+
// 春节 (正月初一 + 除夕 + 初二 + 初三)
|
|
453
|
+
const sf = lunarDate(year, 1, 1);
|
|
454
|
+
if (sf) {
|
|
455
|
+
const eve = new Date(sf + "T00:00:00"); eve.setDate(eve.getDate() - 1);
|
|
456
|
+
// Get correct lunar label for 除夕
|
|
457
|
+
const eveLunar = solarToLunar(eve.toISOString().slice(0, 10));
|
|
458
|
+
const eveLabel = eveLunar ? `${eveLunar.monthName}月${eveLunar.dayName}` : "腊月三十";
|
|
459
|
+
h.push({ date: eve.toISOString().slice(0, 10), name: "除夕", emoji: "", type: "traditional", lunar: eveLabel });
|
|
460
|
+
|
|
461
|
+
const d2 = new Date(sf + "T00:00:00"); d2.setDate(d2.getDate() + 1);
|
|
462
|
+
const d3 = new Date(sf + "T00:00:00"); d3.setDate(d3.getDate() + 2);
|
|
463
|
+
h.push({ date: sf, name: "春节", emoji: "", type: "public", lunar: "正月初一" });
|
|
464
|
+
h.push({ date: d2.toISOString().slice(0, 10), name: "春节·初二", emoji: "", type: "public" });
|
|
465
|
+
h.push({ date: d3.toISOString().slice(0, 10), name: "春节·初三", emoji: "", type: "public" });
|
|
466
|
+
}
|
|
467
|
+
|
|
468
|
+
// 元宵节 (正月十五)
|
|
469
|
+
const yx = lunarDate(year, 1, 15);
|
|
470
|
+
if (yx) h.push({ date: yx, name: "元宵节", emoji: "", type: "traditional", lunar: "正月十五" });
|
|
471
|
+
|
|
472
|
+
// 清明节
|
|
473
|
+
h.push({ date: qingmingDate(year), name: "清明节", emoji: "", type: "public" });
|
|
474
|
+
|
|
475
|
+
// 劳动节
|
|
476
|
+
h.push({ date: `${year}-05-01`, name: "劳动节", emoji: "", type: "public" });
|
|
477
|
+
|
|
478
|
+
// 端午节 (五月初五)
|
|
479
|
+
const db = lunarDate(year, 5, 5);
|
|
480
|
+
if (db) h.push({ date: db, name: "端午节", emoji: "", type: "public", lunar: "五月初五" });
|
|
481
|
+
|
|
482
|
+
// 七夕 (七月初七)
|
|
483
|
+
const qx = lunarDate(year, 7, 7);
|
|
484
|
+
if (qx) h.push({ date: qx, name: "七夕", emoji: "", type: "traditional", lunar: "七月初七" });
|
|
485
|
+
|
|
486
|
+
// 中元节 (七月十五)
|
|
487
|
+
const zy = lunarDate(year, 7, 15);
|
|
488
|
+
if (zy) h.push({ date: zy, name: "中元节", emoji: "", type: "traditional", lunar: "七月十五" });
|
|
489
|
+
|
|
490
|
+
// 中秋节 (八月十五)
|
|
491
|
+
const ma = lunarDate(year, 8, 15);
|
|
492
|
+
if (ma) h.push({ date: ma, name: "中秋节", emoji: "", type: "public", lunar: "八月十五" });
|
|
493
|
+
|
|
494
|
+
// 重阳节 (九月初九)
|
|
495
|
+
const cy = lunarDate(year, 9, 9);
|
|
496
|
+
if (cy) h.push({ date: cy, name: "重阳节", emoji: "", type: "traditional", lunar: "九月初九" });
|
|
497
|
+
|
|
498
|
+
// 国庆
|
|
499
|
+
h.push({ date: `${year}-10-01`, name: "国庆节", emoji: "", type: "public" });
|
|
500
|
+
h.push({ date: `${year}-10-02`, name: "国庆节·第2天", emoji: "", type: "public" });
|
|
501
|
+
h.push({ date: `${year}-10-03`, name: "国庆节·第3天", emoji: "", type: "public" });
|
|
502
|
+
|
|
503
|
+
// 腊八 (腊月初八)
|
|
504
|
+
const lb = lunarDate(year, 12, 8);
|
|
505
|
+
if (lb) h.push({ date: lb, name: "腊八节", emoji: "", type: "traditional", lunar: "腊月初八" });
|
|
506
|
+
|
|
507
|
+
// 小年 (腊月廿三)
|
|
508
|
+
const xn = lunarDate(year, 12, 23);
|
|
509
|
+
if (xn) h.push({ date: xn, name: "小年", emoji: "", type: "traditional", lunar: "腊月廿三" });
|
|
510
|
+
|
|
511
|
+
return h;
|
|
512
|
+
}
|
|
513
|
+
|
|
514
|
+
// ── Public API ────────────────────────────────────────────────
|
|
515
|
+
export function getHolidays(region: Region, year: number): Holiday[] {
|
|
516
|
+
return region === "US" ? usHolidays(year) : cnHolidays(year);
|
|
517
|
+
}
|
|
518
|
+
|
|
519
|
+
export function getHolidaysForDate(region: Region, date: string): Holiday[] {
|
|
520
|
+
const year = parseInt(date.slice(0, 4));
|
|
521
|
+
return getHolidays(region, year).filter(h => h.date === date);
|
|
522
|
+
}
|
|
523
|
+
|
|
524
|
+
export function getHolidaysForRange(region: Region, start: string, end: string): Holiday[] {
|
|
525
|
+
const sy = parseInt(start.slice(0, 4)), ey = parseInt(end.slice(0, 4));
|
|
526
|
+
const all: Holiday[] = [];
|
|
527
|
+
for (let y = sy; y <= ey; y++) all.push(...getHolidays(region, y));
|
|
528
|
+
return all.filter(h => h.date >= start && h.date <= end);
|
|
529
|
+
}
|