abelien-harness 0.0.0-stage → 0.3.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/.env.example +48 -0
- package/README.md +277 -2
- package/bin/cli.mjs +67 -0
- package/lib/bundle.mjs +41 -0
- package/lib/installer.mjs +135 -0
- package/package.json +38 -4
- package/skills/abelien-3dgen/SKILL.md +139 -0
- package/skills/abelien-3dgen/credentials.example.json +5 -0
- package/skills/abelien-3dgen/domain.json +9 -0
- package/skills/abelien-3dgen/providers/ark.json +241 -0
- package/skills/abelien-3dgen/providers/hunyuan.json +323 -0
- package/skills/abelien-3dgen/providers/meshy.json +393 -0
- package/skills/abelien-3dgen/providers/tripo.json +256 -0
- package/skills/abelien-3dgen/references/benchmark-2026-09-05.csv +17 -0
- package/skills/abelien-3dgen/references/benchmark-2026-09-05.md +37 -0
- package/skills/abelien-3dgen/references/provider-profile.md +165 -0
- package/skills/abelien-algorithm/SKILL.md +37 -0
- package/skills/abelien-algorithm/domain.json +64 -0
- package/skills/abelien-algorithm/references/research-policy.md +39 -0
- package/skills/abelien-algorithm/references/selection-service-contract.md +56 -0
- package/skills/abelien-algorithm/scripts/finalize-selection.mjs +151 -0
- package/skills/abelien-algorithm/workflows/user-journey-algorithm.json +23 -0
- package/skills/abelien-appearance/SKILL.md +47 -0
- package/skills/abelien-appearance/references/handoff.md +30 -0
- package/skills/abelien-appearance/references/visual-review.md +31 -0
- package/skills/abelien-clarify/SKILL.md +102 -0
- package/skills/abelien-clarify/references/examples.md +92 -0
- package/skills/abelien-clarify/scripts/check_result.py +230 -0
- package/skills/abelien-clarify/scripts/test_check_result.py +168 -0
- package/skills/abelien-guide/SKILL.md +42 -0
- package/skills/abelien-guide/references/harness-binding.md +5 -0
- package/skills/abelien-guide/references/shared-response-rules.md +30 -0
- package/skills/abelien-guide/references/user-journey.md +9 -0
- package/skills/abelien-hardware/SKILL.md +55 -0
- package/skills/abelien-hardware/domain.json +279 -0
- package/skills/abelien-hardware/references/hardware-selection/SKILL.md +40 -0
- package/skills/abelien-hardware/references/hardware-selection/level-1/actuation-motion.md +18 -0
- package/skills/abelien-hardware/references/hardware-selection/level-1/communication.md +21 -0
- package/skills/abelien-hardware/references/hardware-selection/level-1/compute-control.md +24 -0
- package/skills/abelien-hardware/references/hardware-selection/level-1/display.md +10 -0
- package/skills/abelien-hardware/references/hardware-selection/level-1/electrical-interconnect.md +12 -0
- package/skills/abelien-hardware/references/hardware-selection/level-1/interaction.md +15 -0
- package/skills/abelien-hardware/references/hardware-selection/level-1/power-energy.md +14 -0
- package/skills/abelien-hardware/references/hardware-selection/level-1/sensing-perception.md +23 -0
- package/skills/abelien-hardware/references/hardware-selection/level-1/thermal-fluid.md +14 -0
- package/skills/abelien-hardware/references/hardware-selection/level-2/actuation-motion/actuator.md +18 -0
- package/skills/abelien-hardware/references/hardware-selection/level-2/actuation-motion/driver.md +21 -0
- package/skills/abelien-hardware/references/hardware-selection/level-2/actuation-motion/end-effector.md +11 -0
- package/skills/abelien-hardware/references/hardware-selection/level-2/actuation-motion/mobile-platform.md +11 -0
- package/skills/abelien-hardware/references/hardware-selection/level-2/actuation-motion/propulsion.md +13 -0
- package/skills/abelien-hardware/references/hardware-selection/level-2/actuation-motion/robot-arm.md +12 -0
- package/skills/abelien-hardware/references/hardware-selection/level-2/actuation-motion/robot-system.md +20 -0
- package/skills/abelien-hardware/references/hardware-selection/level-2/actuation-motion/switching.md +12 -0
- package/skills/abelien-hardware/references/hardware-selection/level-2/actuation-motion/tool-driver.md +11 -0
- package/skills/abelien-hardware/references/hardware-selection/level-2/actuation-motion/transmission.md +11 -0
- package/skills/abelien-hardware/references/hardware-selection/level-2/communication/antenna.md +11 -0
- package/skills/abelien-hardware/references/hardware-selection/level-2/communication/cellular.md +11 -0
- package/skills/abelien-hardware/references/hardware-selection/level-2/communication/fieldbus.md +12 -0
- package/skills/abelien-hardware/references/hardware-selection/level-2/communication/gateway.md +9 -0
- package/skills/abelien-hardware/references/hardware-selection/level-2/communication/long-range.md +11 -0
- package/skills/abelien-hardware/references/hardware-selection/level-2/communication/mesh-network.md +9 -0
- package/skills/abelien-hardware/references/hardware-selection/level-2/communication/radio.md +13 -0
- package/skills/abelien-hardware/references/hardware-selection/level-2/communication/remote-control.md +11 -0
- package/skills/abelien-hardware/references/hardware-selection/level-2/communication/serial-interface.md +11 -0
- package/skills/abelien-hardware/references/hardware-selection/level-2/communication/short-range.md +18 -0
- package/skills/abelien-hardware/references/hardware-selection/level-2/communication/wide-area.md +11 -0
- package/skills/abelien-hardware/references/hardware-selection/level-2/communication/wired-network.md +14 -0
- package/skills/abelien-hardware/references/hardware-selection/level-2/communication/wireless-network.md +19 -0
- package/skills/abelien-hardware/references/hardware-selection/level-2/compute-control/accelerator.md +17 -0
- package/skills/abelien-hardware/references/hardware-selection/level-2/compute-control/controller-board.md +17 -0
- package/skills/abelien-hardware/references/hardware-selection/level-2/compute-control/controller-module.md +14 -0
- package/skills/abelien-hardware/references/hardware-selection/level-2/compute-control/data-logging.md +12 -0
- package/skills/abelien-hardware/references/hardware-selection/level-2/compute-control/edge-ai.md +17 -0
- package/skills/abelien-hardware/references/hardware-selection/level-2/compute-control/industrial-controller.md +13 -0
- package/skills/abelien-hardware/references/hardware-selection/level-2/compute-control/industrial-io.md +11 -0
- package/skills/abelien-hardware/references/hardware-selection/level-2/compute-control/io-expansion.md +13 -0
- package/skills/abelien-hardware/references/hardware-selection/level-2/compute-control/memory.md +11 -0
- package/skills/abelien-hardware/references/hardware-selection/level-2/compute-control/motion-controller.md +14 -0
- package/skills/abelien-hardware/references/hardware-selection/level-2/compute-control/processor.md +18 -0
- package/skills/abelien-hardware/references/hardware-selection/level-2/compute-control/programming-debug.md +9 -0
- package/skills/abelien-hardware/references/hardware-selection/level-2/compute-control/security.md +10 -0
- package/skills/abelien-hardware/references/hardware-selection/level-2/compute-control/signal-conversion.md +24 -0
- package/skills/abelien-hardware/references/hardware-selection/level-2/compute-control/storage.md +11 -0
- package/skills/abelien-hardware/references/hardware-selection/level-2/compute-control/timing.md +12 -0
- package/skills/abelien-hardware/references/hardware-selection/level-2/display/display-module.md +16 -0
- package/skills/abelien-hardware/references/hardware-selection/level-2/display/display-terminal.md +13 -0
- package/skills/abelien-hardware/references/hardware-selection/level-2/electrical-interconnect/bus-adapter.md +9 -0
- package/skills/abelien-hardware/references/hardware-selection/level-2/electrical-interconnect/connector.md +11 -0
- package/skills/abelien-hardware/references/hardware-selection/level-2/electrical-interconnect/hub.md +11 -0
- package/skills/abelien-hardware/references/hardware-selection/level-2/electrical-interconnect/level-shifting.md +11 -0
- package/skills/abelien-hardware/references/hardware-selection/level-2/interaction/audio-input.md +12 -0
- package/skills/abelien-hardware/references/hardware-selection/level-2/interaction/audio-output.md +13 -0
- package/skills/abelien-hardware/references/hardware-selection/level-2/interaction/audio-processing.md +12 -0
- package/skills/abelien-hardware/references/hardware-selection/level-2/interaction/haptic-feedback.md +11 -0
- package/skills/abelien-hardware/references/hardware-selection/level-2/interaction/safety-input.md +17 -0
- package/skills/abelien-hardware/references/hardware-selection/level-2/interaction/user-input.md +22 -0
- package/skills/abelien-hardware/references/hardware-selection/level-2/interaction/visual-feedback.md +11 -0
- package/skills/abelien-hardware/references/hardware-selection/level-2/power-energy/battery.md +12 -0
- package/skills/abelien-hardware/references/hardware-selection/level-2/power-energy/charging.md +18 -0
- package/skills/abelien-hardware/references/hardware-selection/level-2/power-energy/energy-harvesting.md +18 -0
- package/skills/abelien-hardware/references/hardware-selection/level-2/power-energy/power-conversion.md +20 -0
- package/skills/abelien-hardware/references/hardware-selection/level-2/power-energy/power-management.md +28 -0
- package/skills/abelien-hardware/references/hardware-selection/level-2/power-energy/power-supply.md +12 -0
- package/skills/abelien-hardware/references/hardware-selection/level-2/sensing-perception/acoustic.md +9 -0
- package/skills/abelien-hardware/references/hardware-selection/level-2/sensing-perception/biometric.md +15 -0
- package/skills/abelien-hardware/references/hardware-selection/level-2/sensing-perception/distance.md +15 -0
- package/skills/abelien-hardware/references/hardware-selection/level-2/sensing-perception/electrical-state.md +18 -0
- package/skills/abelien-hardware/references/hardware-selection/level-2/sensing-perception/environment.md +24 -0
- package/skills/abelien-hardware/references/hardware-selection/level-2/sensing-perception/fluid-chemical.md +12 -0
- package/skills/abelien-hardware/references/hardware-selection/level-2/sensing-perception/force-torque.md +13 -0
- package/skills/abelien-hardware/references/hardware-selection/level-2/sensing-perception/human-presence.md +18 -0
- package/skills/abelien-hardware/references/hardware-selection/level-2/sensing-perception/identification.md +9 -0
- package/skills/abelien-hardware/references/hardware-selection/level-2/sensing-perception/localization.md +18 -0
- package/skills/abelien-hardware/references/hardware-selection/level-2/sensing-perception/magnetic.md +9 -0
- package/skills/abelien-hardware/references/hardware-selection/level-2/sensing-perception/motion-attitude.md +13 -0
- package/skills/abelien-hardware/references/hardware-selection/level-2/sensing-perception/optical.md +20 -0
- package/skills/abelien-hardware/references/hardware-selection/level-2/sensing-perception/safety-perception.md +14 -0
- package/skills/abelien-hardware/references/hardware-selection/level-2/sensing-perception/vision.md +20 -0
- package/skills/abelien-hardware/references/hardware-selection/level-2/thermal-fluid/cooling-control.md +9 -0
- package/skills/abelien-hardware/references/hardware-selection/level-2/thermal-fluid/cooling.md +14 -0
- package/skills/abelien-hardware/references/hardware-selection/level-2/thermal-fluid/filtration.md +9 -0
- package/skills/abelien-hardware/references/hardware-selection/level-2/thermal-fluid/fluid-control.md +10 -0
- package/skills/abelien-hardware/references/hardware-selection/level-2/thermal-fluid/sealing.md +9 -0
- package/skills/abelien-hardware/references/hardware-selection/level-2/thermal-fluid/thermal-control.md +12 -0
- package/skills/abelien-hardware/references/hardware-selection/references/query-contract.md +61 -0
- package/skills/abelien-hardware/references/knowledge-recall-service-contract.md +57 -0
- package/skills/abelien-hardware/references/planning-modes.md +17 -0
- package/skills/abelien-hardware/references/search-index-format.md +41 -0
- package/skills/abelien-hardware/references/search-index-release.md +67 -0
- package/skills/abelien-hardware/references/selection-service-contract.md +25 -0
- package/skills/abelien-hardware/references/web-evidence-contract.md +51 -0
- package/skills/abelien-hardware/scripts/build-search-index.mjs +152 -0
- package/skills/abelien-hardware/scripts/finalize-selection.mjs +107 -0
- package/skills/abelien-hardware/scripts/load-guide.mjs +43 -0
- package/skills/abelien-hardware/scripts/prismer.mjs +25 -0
- package/skills/abelien-hardware/scripts/provider-chain-contract.mjs +114 -0
- package/skills/abelien-hardware/scripts/public-page.mjs +121 -0
- package/skills/abelien-hardware/scripts/publish-search-index.mjs +48 -0
- package/skills/abelien-hardware/scripts/response-redaction.mjs +136 -0
- package/skills/abelien-hardware/scripts/search-index-release.mjs +304 -0
- package/skills/abelien-hardware/scripts/selection-request.mjs +24 -0
- package/skills/abelien-hardware/scripts/smoke-search-index.mjs +39 -0
- package/skills/abelien-hardware/scripts/tos-object-store.mjs +202 -0
- package/skills/abelien-hardware/scripts/tos-wiki-search.mjs +441 -0
- package/skills/abelien-hardware/scripts/validate-selection-snapshot.mjs +77 -0
- package/skills/abelien-hardware/scripts/validate-web-search-plan.mjs +26 -0
- package/skills/abelien-hardware/scripts/verify-search-index.mjs +33 -0
- package/skills/abelien-hardware/scripts/volc-web-search.mjs +28 -0
- package/skills/abelien-hardware/scripts/web-common.mjs +33 -0
- package/skills/abelien-hardware/scripts/web-evidence-storage.mjs +36 -0
- package/skills/abelien-hardware/scripts/web-integrity.mjs +123 -0
- package/skills/abelien-hardware/scripts/web-merge.mjs +122 -0
- package/skills/abelien-hardware/scripts/web-provider-chain.mjs +170 -0
- package/skills/abelien-hardware/scripts/web-receipt.mjs +22 -0
- package/skills/abelien-hardware/scripts/web-search-plan.mjs +18 -0
- package/skills/abelien-hardware/scripts/web-search.mjs +109 -0
- package/skills/abelien-hardware-selection/SKILL.md +29 -0
- package/skills/abelien-hardware-selection/domain.json +42 -0
- package/skills/abelien-hardware-selection/references/hardware-selection-v2/SKILL.md +40 -0
- package/skills/abelien-hardware-selection/references/hardware-selection-v2/level-1/actuation-motion.md +18 -0
- package/skills/abelien-hardware-selection/references/hardware-selection-v2/level-1/communication.md +21 -0
- package/skills/abelien-hardware-selection/references/hardware-selection-v2/level-1/compute-control.md +24 -0
- package/skills/abelien-hardware-selection/references/hardware-selection-v2/level-1/display.md +10 -0
- package/skills/abelien-hardware-selection/references/hardware-selection-v2/level-1/electrical-interconnect.md +12 -0
- package/skills/abelien-hardware-selection/references/hardware-selection-v2/level-1/interaction.md +15 -0
- package/skills/abelien-hardware-selection/references/hardware-selection-v2/level-1/power-energy.md +14 -0
- package/skills/abelien-hardware-selection/references/hardware-selection-v2/level-1/sensing-perception.md +23 -0
- package/skills/abelien-hardware-selection/references/hardware-selection-v2/level-1/thermal-fluid.md +14 -0
- package/skills/abelien-hardware-selection/references/hardware-selection-v2/level-2/actuation-motion/actuator.md +18 -0
- package/skills/abelien-hardware-selection/references/hardware-selection-v2/level-2/actuation-motion/driver.md +21 -0
- package/skills/abelien-hardware-selection/references/hardware-selection-v2/level-2/actuation-motion/end-effector.md +11 -0
- package/skills/abelien-hardware-selection/references/hardware-selection-v2/level-2/actuation-motion/mobile-platform.md +11 -0
- package/skills/abelien-hardware-selection/references/hardware-selection-v2/level-2/actuation-motion/propulsion.md +13 -0
- package/skills/abelien-hardware-selection/references/hardware-selection-v2/level-2/actuation-motion/robot-arm.md +12 -0
- package/skills/abelien-hardware-selection/references/hardware-selection-v2/level-2/actuation-motion/robot-system.md +20 -0
- package/skills/abelien-hardware-selection/references/hardware-selection-v2/level-2/actuation-motion/switching.md +12 -0
- package/skills/abelien-hardware-selection/references/hardware-selection-v2/level-2/actuation-motion/tool-driver.md +11 -0
- package/skills/abelien-hardware-selection/references/hardware-selection-v2/level-2/actuation-motion/transmission.md +11 -0
- package/skills/abelien-hardware-selection/references/hardware-selection-v2/level-2/communication/antenna.md +11 -0
- package/skills/abelien-hardware-selection/references/hardware-selection-v2/level-2/communication/cellular.md +11 -0
- package/skills/abelien-hardware-selection/references/hardware-selection-v2/level-2/communication/fieldbus.md +12 -0
- package/skills/abelien-hardware-selection/references/hardware-selection-v2/level-2/communication/gateway.md +9 -0
- package/skills/abelien-hardware-selection/references/hardware-selection-v2/level-2/communication/long-range.md +11 -0
- package/skills/abelien-hardware-selection/references/hardware-selection-v2/level-2/communication/mesh-network.md +9 -0
- package/skills/abelien-hardware-selection/references/hardware-selection-v2/level-2/communication/radio.md +13 -0
- package/skills/abelien-hardware-selection/references/hardware-selection-v2/level-2/communication/remote-control.md +11 -0
- package/skills/abelien-hardware-selection/references/hardware-selection-v2/level-2/communication/serial-interface.md +11 -0
- package/skills/abelien-hardware-selection/references/hardware-selection-v2/level-2/communication/short-range.md +18 -0
- package/skills/abelien-hardware-selection/references/hardware-selection-v2/level-2/communication/wide-area.md +11 -0
- package/skills/abelien-hardware-selection/references/hardware-selection-v2/level-2/communication/wired-network.md +14 -0
- package/skills/abelien-hardware-selection/references/hardware-selection-v2/level-2/communication/wireless-network.md +19 -0
- package/skills/abelien-hardware-selection/references/hardware-selection-v2/level-2/compute-control/accelerator.md +17 -0
- package/skills/abelien-hardware-selection/references/hardware-selection-v2/level-2/compute-control/controller-board.md +17 -0
- package/skills/abelien-hardware-selection/references/hardware-selection-v2/level-2/compute-control/controller-module.md +14 -0
- package/skills/abelien-hardware-selection/references/hardware-selection-v2/level-2/compute-control/data-logging.md +12 -0
- package/skills/abelien-hardware-selection/references/hardware-selection-v2/level-2/compute-control/edge-ai.md +17 -0
- package/skills/abelien-hardware-selection/references/hardware-selection-v2/level-2/compute-control/industrial-controller.md +13 -0
- package/skills/abelien-hardware-selection/references/hardware-selection-v2/level-2/compute-control/industrial-io.md +11 -0
- package/skills/abelien-hardware-selection/references/hardware-selection-v2/level-2/compute-control/io-expansion.md +13 -0
- package/skills/abelien-hardware-selection/references/hardware-selection-v2/level-2/compute-control/memory.md +11 -0
- package/skills/abelien-hardware-selection/references/hardware-selection-v2/level-2/compute-control/motion-controller.md +14 -0
- package/skills/abelien-hardware-selection/references/hardware-selection-v2/level-2/compute-control/processor.md +18 -0
- package/skills/abelien-hardware-selection/references/hardware-selection-v2/level-2/compute-control/programming-debug.md +9 -0
- package/skills/abelien-hardware-selection/references/hardware-selection-v2/level-2/compute-control/security.md +10 -0
- package/skills/abelien-hardware-selection/references/hardware-selection-v2/level-2/compute-control/signal-conversion.md +24 -0
- package/skills/abelien-hardware-selection/references/hardware-selection-v2/level-2/compute-control/storage.md +11 -0
- package/skills/abelien-hardware-selection/references/hardware-selection-v2/level-2/compute-control/timing.md +12 -0
- package/skills/abelien-hardware-selection/references/hardware-selection-v2/level-2/display/display-module.md +16 -0
- package/skills/abelien-hardware-selection/references/hardware-selection-v2/level-2/display/display-terminal.md +13 -0
- package/skills/abelien-hardware-selection/references/hardware-selection-v2/level-2/electrical-interconnect/bus-adapter.md +9 -0
- package/skills/abelien-hardware-selection/references/hardware-selection-v2/level-2/electrical-interconnect/connector.md +11 -0
- package/skills/abelien-hardware-selection/references/hardware-selection-v2/level-2/electrical-interconnect/hub.md +11 -0
- package/skills/abelien-hardware-selection/references/hardware-selection-v2/level-2/electrical-interconnect/level-shifting.md +11 -0
- package/skills/abelien-hardware-selection/references/hardware-selection-v2/level-2/interaction/audio-input.md +12 -0
- package/skills/abelien-hardware-selection/references/hardware-selection-v2/level-2/interaction/audio-output.md +13 -0
- package/skills/abelien-hardware-selection/references/hardware-selection-v2/level-2/interaction/audio-processing.md +12 -0
- package/skills/abelien-hardware-selection/references/hardware-selection-v2/level-2/interaction/haptic-feedback.md +11 -0
- package/skills/abelien-hardware-selection/references/hardware-selection-v2/level-2/interaction/safety-input.md +17 -0
- package/skills/abelien-hardware-selection/references/hardware-selection-v2/level-2/interaction/user-input.md +22 -0
- package/skills/abelien-hardware-selection/references/hardware-selection-v2/level-2/interaction/visual-feedback.md +11 -0
- package/skills/abelien-hardware-selection/references/hardware-selection-v2/level-2/power-energy/battery.md +12 -0
- package/skills/abelien-hardware-selection/references/hardware-selection-v2/level-2/power-energy/charging.md +18 -0
- package/skills/abelien-hardware-selection/references/hardware-selection-v2/level-2/power-energy/energy-harvesting.md +18 -0
- package/skills/abelien-hardware-selection/references/hardware-selection-v2/level-2/power-energy/power-conversion.md +20 -0
- package/skills/abelien-hardware-selection/references/hardware-selection-v2/level-2/power-energy/power-management.md +28 -0
- package/skills/abelien-hardware-selection/references/hardware-selection-v2/level-2/power-energy/power-supply.md +12 -0
- package/skills/abelien-hardware-selection/references/hardware-selection-v2/level-2/sensing-perception/acoustic.md +9 -0
- package/skills/abelien-hardware-selection/references/hardware-selection-v2/level-2/sensing-perception/biometric.md +15 -0
- package/skills/abelien-hardware-selection/references/hardware-selection-v2/level-2/sensing-perception/distance.md +15 -0
- package/skills/abelien-hardware-selection/references/hardware-selection-v2/level-2/sensing-perception/electrical-state.md +18 -0
- package/skills/abelien-hardware-selection/references/hardware-selection-v2/level-2/sensing-perception/environment.md +24 -0
- package/skills/abelien-hardware-selection/references/hardware-selection-v2/level-2/sensing-perception/fluid-chemical.md +12 -0
- package/skills/abelien-hardware-selection/references/hardware-selection-v2/level-2/sensing-perception/force-torque.md +13 -0
- package/skills/abelien-hardware-selection/references/hardware-selection-v2/level-2/sensing-perception/human-presence.md +18 -0
- package/skills/abelien-hardware-selection/references/hardware-selection-v2/level-2/sensing-perception/identification.md +9 -0
- package/skills/abelien-hardware-selection/references/hardware-selection-v2/level-2/sensing-perception/localization.md +18 -0
- package/skills/abelien-hardware-selection/references/hardware-selection-v2/level-2/sensing-perception/magnetic.md +9 -0
- package/skills/abelien-hardware-selection/references/hardware-selection-v2/level-2/sensing-perception/motion-attitude.md +13 -0
- package/skills/abelien-hardware-selection/references/hardware-selection-v2/level-2/sensing-perception/optical.md +20 -0
- package/skills/abelien-hardware-selection/references/hardware-selection-v2/level-2/sensing-perception/safety-perception.md +14 -0
- package/skills/abelien-hardware-selection/references/hardware-selection-v2/level-2/sensing-perception/vision.md +20 -0
- package/skills/abelien-hardware-selection/references/hardware-selection-v2/level-2/thermal-fluid/cooling-control.md +9 -0
- package/skills/abelien-hardware-selection/references/hardware-selection-v2/level-2/thermal-fluid/cooling.md +14 -0
- package/skills/abelien-hardware-selection/references/hardware-selection-v2/level-2/thermal-fluid/filtration.md +9 -0
- package/skills/abelien-hardware-selection/references/hardware-selection-v2/level-2/thermal-fluid/fluid-control.md +10 -0
- package/skills/abelien-hardware-selection/references/hardware-selection-v2/level-2/thermal-fluid/sealing.md +9 -0
- package/skills/abelien-hardware-selection/references/hardware-selection-v2/level-2/thermal-fluid/thermal-control.md +12 -0
- package/skills/abelien-hardware-selection/references/hardware-selection-v2/references/query-contract.md +61 -0
- package/skills/abelien-hardware-selection/references/selection-service-contract.md +57 -0
- package/skills/abelien-hardware-selection/scripts/load-guide.mjs +46 -0
- package/skills/abelien-hardware-selection/scripts/select.mjs +119 -0
- package/skills/abelien-hardware-selection/scripts/server.mjs +52 -0
- package/skills/abelien-hardware-selection/scripts/validate-slots.mjs +12 -0
- package/skills/abelien-harness/SKILL.md +64 -0
- package/skills/abelien-harness/references/adapter-contract.md +132 -0
- package/skills/abelien-harness/references/fixtures/studio-harness-creation-receipt-v1.json +86 -0
- package/skills/abelien-harness/references/fixtures/studio-harness-receipt-v1.json +74 -0
- package/skills/abelien-harness/references/kernel-protocol.md +65 -0
- package/skills/abelien-harness/references/m1-integration.md +21 -0
- package/skills/abelien-harness/references/workflow-spec.md +210 -0
- package/skills/abelien-harness/scripts/ab.mjs +1213 -0
- package/skills/abelien-harness/scripts/generate3d.mjs +1014 -0
- package/skills/abelien-harness/scripts/receipt.mjs +642 -0
- package/skills/abelien-harness/scripts/runtime-env.mjs +58 -0
- package/skills/abelien-harness/scripts/studio.mjs +518 -0
- package/skills/abelien-structure/SKILL.md +56 -0
- package/skills/abelien-structure/references/build123d-execution.md +69 -0
- package/skills/abelien-structure/references/bundle-quality.md +28 -0
- package/skills/abelien-structure/references/handoff.md +51 -0
- package/skills/abelien-structure/references/visual-review.md +5 -0
- package/skills/abelien-structure/scripts/check_bundle.py +197 -0
- package/skills/abelien-structure/scripts/check_visual_review.py +144 -0
- package/skills/abelien-structure/scripts/run_stage.py +258 -0
- package/skills/abelien-workspace/SKILL.md +49 -0
- package/skills/abelien-workspace/assets/prd-template.json +1479 -0
- package/skills/abelien-workspace/domain.json +11 -0
- package/skills/abelien-workspace/references/domain-model.md +68 -0
- package/skills/abelien-workspace/references/hardware-journey-orchestration.md +29 -0
- package/skills/abelien-workspace/references/harness-binding.md +173 -0
- package/skills/abelien-workspace/references/prd-contract.md +105 -0
- package/skills/abelien-workspace/references/user-journey.md +560 -0
- package/skills/abelien-workspace/workflows/definitions/1025082eada1c94ddfda0606feda1a5bf042a82248f54d09b752c383a0565d7b.json +1 -0
- package/skills/abelien-workspace/workflows/definitions/1179e62586cf6d88c6820022a933f719b3b4eb3c0df0856fb7a0cc6341a9d630.json +1 -0
- package/skills/abelien-workspace/workflows/definitions/1a9afef5463f53e58222b3476c0002aa9703b5ced16f531e3224beb14a28f9a3.json +229 -0
- package/skills/abelien-workspace/workflows/definitions/32ed16198839c06c36b43acbada5ba74403e37b2d351058bd7ad3d5269f76722.json +1 -0
- package/skills/abelien-workspace/workflows/definitions/6bc647687c39407158e198a94a0e74ca04a5e848adbb3e7634b6a62984515c2e.json +1 -0
- package/skills/abelien-workspace/workflows/definitions/e3273f7952f7f1f043cb5df12f3cf377b351d2b31ec8db7197acb5674c8d8591.json +1 -0
- package/skills/abelien-workspace/workflows/definitions/f0e434941b79a7b8bf170077901df2ba6e8713d61d5675e4ef2cfa24e1abdf5a.json +175 -0
- package/skills/abelien-workspace/workflows/user-journey-hardware-algorithm.json +229 -0
- package/skills/abelien-workspace/workflows/user-journey-hardware-candidates.json +149 -0
- package/skills/abelien-workspace/workflows/user-journey-hardware-revise.json +32 -0
- package/skills/abelien-workspace/workflows/user-journey-hardware.json +175 -0
- package/skills/abelien-workspace/workflows/user-journey.json +391 -0
- package/targets/registry.mjs +31 -0
package/.env.example
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# Harness automatically loads .env and then .env.local from its launch directory.
|
|
2
|
+
# Existing process variables take precedence. Never commit real credentials.
|
|
3
|
+
|
|
4
|
+
TOS_REGION=cn-beijing
|
|
5
|
+
TOS_ENDPOINT=https://tos-s3-cn-beijing.volces.com
|
|
6
|
+
TOS_BUCKET=your-bucket
|
|
7
|
+
TOS_ACCESS_KEY_ID=
|
|
8
|
+
TOS_SECRET_ACCESS_KEY=
|
|
9
|
+
TOS_ADDRESSING_STYLE=virtual
|
|
10
|
+
TOS_WIKI_PREFIX=hardware_profile_wiki/
|
|
11
|
+
|
|
12
|
+
# Optional runtime controls
|
|
13
|
+
TOS_SEARCH_CONCURRENCY=8
|
|
14
|
+
TOS_MAX_FULL_WIKI_FETCH_PER_SLOT=24
|
|
15
|
+
TOS_PUBLISH_CONCURRENCY=6
|
|
16
|
+
TOS_ALLOW_LEGACY_MANIFEST_FALLBACK=false
|
|
17
|
+
|
|
18
|
+
# Web deployment aliases are also accepted when the corresponding TOS_* value is absent:
|
|
19
|
+
# CAD_STORAGE_REGION=cn-beijing
|
|
20
|
+
# CAD_STORAGE_ENDPOINT=https://tos-s3-cn-beijing.volces.com
|
|
21
|
+
# CAD_STORAGE_BUCKET=your-bucket
|
|
22
|
+
# CAD_STORAGE_ACCESS_KEY=
|
|
23
|
+
# CAD_STORAGE_SECRET_KEY=
|
|
24
|
+
# CAD_STORAGE_ADDRESSING_STYLE=virtual
|
|
25
|
+
|
|
26
|
+
# Optional external hardware revision service
|
|
27
|
+
ABELIEN_HARDWARE_REVISE_URL=
|
|
28
|
+
|
|
29
|
+
# Optional loopback HTTP wrapper only; main hardware.select executes locally without a URL.
|
|
30
|
+
# At least 32 bytes, keep the real token in a private env file. Do not expose this server publicly.
|
|
31
|
+
ABELIEN_HARDWARE_SELECT_TOKEN=
|
|
32
|
+
|
|
33
|
+
# Fixed prismer_then_volc policy; both Keys are trusted host-only.
|
|
34
|
+
# Volc subscription/pay-as-you-go search Keys are distinct from Ark generation Keys.
|
|
35
|
+
PRISMER_API_KEY=
|
|
36
|
+
WEB_SEARCH_API_KEY=
|
|
37
|
+
ABELIEN_HARDWARE_WEB_SEARCH_TIMEOUT_MS=30000
|
|
38
|
+
ABELIEN_HARDWARE_WEB_PAGE_TIMEOUT_MS=30000
|
|
39
|
+
# Host budget and loop abort independently bound Parse; unknown POSTs cannot retry.
|
|
40
|
+
ABELIEN_HARDWARE_WEB_PARSE_TIMEOUT_MS=120000
|
|
41
|
+
# system or explicit fixed Cloudflare doh; direct source connections/redirects pin public IP.
|
|
42
|
+
# The submitted URL check alone does not certify remote Prismer redirect pinning.
|
|
43
|
+
ABELIEN_HARDWARE_WEB_DNS_TRANSPORT=system
|
|
44
|
+
|
|
45
|
+
# Opt-in audit v1: generic workflow definition snapshots and new evidence blobs.
|
|
46
|
+
# Hardware pinned-result-v1 always pins definitions/results; legacy selection runs stay read-only.
|
|
47
|
+
# Runs freeze the evidence mode. Existing references remain readable when false.
|
|
48
|
+
AB_HARNESS_AUDIT_V1=false
|
package/README.md
CHANGED
|
@@ -1,3 +1,278 @@
|
|
|
1
|
-
#
|
|
1
|
+
# AbelienHarness
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
npx 可安装的多 agent skill harness:**通用内核 + 可插拔域包**。安装后进入各 agent
|
|
4
|
+
的 skill 路径,agent 通过自带零依赖 CLI `ab` 调度资源定位、能力调度(mock/HTTP API)、
|
|
5
|
+
结构化状态存储与可恢复 workflow。
|
|
6
|
+
|
|
7
|
+
```text
|
|
8
|
+
定位资源(如外观ID) → 调度能力(如 3D 模型生成/替换) → 组建状态管理 → workflow 编排
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
内核对领域不感知,随包分发 10 个 bundle。产品层:[abelien-workspace](skills/abelien-workspace/SKILL.md)(旅程、版本与确认)·
|
|
12
|
+
[abelien-guide](skills/abelien-guide/SKILL.md)(对话调度与沟通)· [abelien-clarify](skills/abelien-clarify/SKILL.md)(需求澄清只读快照)。
|
|
13
|
+
领域层:[abelien-hardware](skills/abelien-hardware/SKILL.md)(TOS 候选检索与修订)·
|
|
14
|
+
[abelien-hardware-selection](skills/abelien-hardware-selection/SKILL.md)(本地三级分类选型)·
|
|
15
|
+
[abelien-algorithm](skills/abelien-algorithm/SKILL.md)(基于已验证硬件、官方资料优先的联网算法选型)·
|
|
16
|
+
[abelien-appearance](skills/abelien-appearance/SKILL.md) 与 [abelien-structure](skills/abelien-structure/SKILL.md)(外观与机械结构)·
|
|
17
|
+
[abelien-3dgen](skills/abelien-3dgen/SKILL.md)(四家 provider 的 3D 构件生成,经 `ab generate 3d` 驱动)。
|
|
18
|
+
|
|
19
|
+
## Quickstart
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
npx abelien-harness install # 默认 claude-code 全局
|
|
23
|
+
npx abelien-harness install --target all # claude-code + hermes + pi
|
|
24
|
+
npx abelien-harness install --project # 装到 <cwd>/.claude/skills
|
|
25
|
+
npx abelien-harness install --skills-dir /any/dir # 自定义目录
|
|
26
|
+
npx abelien-harness list | update | remove
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
npm 上尚无 `abelien-harness` 发布工件(见下文「生产 Studio broker 客户端」的接线边界),
|
|
30
|
+
当前从仓库内等义运行:`node bin/cli.mjs install --target <t>`,其余子命令同理。
|
|
31
|
+
|
|
32
|
+
安装目标:
|
|
33
|
+
|
|
34
|
+
| target | 目录 | 覆盖方式 |
|
|
35
|
+
| ------ | ---- | -------- |
|
|
36
|
+
| `claude-code` | `~/.claude/skills/`(`--project` → `<cwd>/.claude/skills/`) | `--skills-dir` |
|
|
37
|
+
| `hermes` | `~/.hermes/skills/` | `HERMES_SKILLS_DIR` / `--skills-dir`(装后需重启 gateway) |
|
|
38
|
+
| `pi` | `~/.pi/skills/` | `PI_SKILLS_DIR` / `--skills-dir` |
|
|
39
|
+
|
|
40
|
+
安装回执 `<AB_HOME ?? ~>/.abelien/installed.json` 记录各目标与 bundle digest;
|
|
41
|
+
`update` 对摘要比对,本地改动未提交时 fail-closed(`DRIFTED`,`--force` 覆盖)。
|
|
42
|
+
全部目标通过漂移校验后,更新会清理已登记 bundle 在新版中退役的文件;普通 install 不清理未登记文件,其他 skill 与工作目录中的历史产物不受影响。
|
|
43
|
+
**整包退役**:新版不再发布的 bundle(如域包合并后消失的旧域)在 `install` 与 `update` 下都会被整包移除并记入回执,
|
|
44
|
+
避免残留目录被 `ab` 当活域加载(否则出现 `AMBIGUOUS_MACHINE`);退役包若已被本地改动则不删除,只在安装输出里提示。
|
|
45
|
+
**命名空间守卫**:安装器只增删改 `abelien-*` 前缀的 skill,绝不触碰其他 skill。
|
|
46
|
+
|
|
47
|
+
## `ab` 命令速查
|
|
48
|
+
|
|
49
|
+
运行时随内核 bundle 分发:`node <skills目录>/abelien-harness/scripts/ab.mjs <命令>`
|
|
50
|
+
(零 npm 依赖,不依赖全局 PATH / `.bin`)。状态存于 workdir 的 `.abelien/`,
|
|
51
|
+
跨目录操作加 `--workdir <dir>`。
|
|
52
|
+
|
|
53
|
+
```text
|
|
54
|
+
ab search_hardware <query> --category-path <l1/l2/l3[,..]> | --slots '<json>'
|
|
55
|
+
ab resource put --kind <k> --id <localId> --body '<json>'
|
|
56
|
+
ab resource get <id> | list [--kind <k>] | delete <id> | locate <query>
|
|
57
|
+
ab capability list | run <name> [--input '<json>'] [--resource <id>]
|
|
58
|
+
ab workflow list | run <name> [--input '<json>'] | status <runId> [--httl]
|
|
59
|
+
| advance <runId> --result '<json>' | --httl '<doc>' | --httl-file <path>
|
|
60
|
+
| resume <runId> | cancel <runId>
|
|
61
|
+
ab studio probe
|
|
62
|
+
ab studio replacement request --input '<json>'
|
|
63
|
+
ab studio creation create --input '<json>' | active | get <creationOperationId>
|
|
64
|
+
ab studio modification create --input '<json>' | active | get <modificationOperationId>
|
|
65
|
+
ab studio tool register --input '<json>'
|
|
66
|
+
ab studio invocation submit --input '<json>' | get <invocationId>
|
|
67
|
+
ab receipt consume --file <path> | get --wait <waitId> [--digest <sha256>]
|
|
68
|
+
ab machine list | get <name> | send <machine> <event> --instance <id>
|
|
69
|
+
ab domain list | register <path>
|
|
70
|
+
ab generate 3d <providers|submit|status|fetch> …
|
|
71
|
+
ab doctor
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
输出契约:stdout 恒为单行 JSON——成功 `{ok:true,data}`(exit 0);
|
|
75
|
+
运行错误 `{ok:false,error:{code,message,details?}}`(exit 1);
|
|
76
|
+
用法错误同结构写 stderr(exit 2)。
|
|
77
|
+
|
|
78
|
+
`workflow resume <runId>` 只接原运行 ID,恢复声明 checkpoint/awaitExternal 的原步骤。
|
|
79
|
+
它复用冻结输入、原受信 step.resource 快照和已返回响应;未对账的 paid POST 不重发。
|
|
80
|
+
输入、来源和单调延伸边界见 [workflow 持久协议](docs/architecture/workflow-persistence.md)。
|
|
81
|
+
|
|
82
|
+
### 生产工具回执与原会话接续
|
|
83
|
+
|
|
84
|
+
`receipt` 是 workflow 之外的可信收件箱。Web 把 `StudioHarnessReceiptEnvelope` v1 文件投递到
|
|
85
|
+
EaaS 后执行 `abelien-harness receipt consume --file ... --workdir ...`,并用 `getFile` 回读
|
|
86
|
+
`.abelien/receipts/acks/<waitId>.json` 校验 wait 与摘要。随后只把 `waitId/resultDigest` 作为唤醒身份
|
|
87
|
+
交给同一 conversation;Agent 运行 `abelien-harness receipt get --wait ... --digest ... --workdir ...`
|
|
88
|
+
读取已保存 envelope。聊天正文不是工具结果事实源。
|
|
89
|
+
|
|
90
|
+
consume 的 `status:"consumed"` 只确认落盘:它不调用 `workflow advance`,也不完成当前 Agent step。
|
|
91
|
+
重复同摘要幂等;同 wait 不同摘要冲突;取消或终态运行仍保存回执,但 workflow 观察会标为 terminal,
|
|
92
|
+
不会伪造恢复。完整 envelope、路径、锁和摘要契约见
|
|
93
|
+
[workflow 规范](skills/abelien-harness/references/workflow-spec.md#studio-工具回执收件箱)。
|
|
94
|
+
|
|
95
|
+
同一 receipt 入口支持严格互斥的 creation/modification 谱系;creation 的 `cad.final` 回执要求精确
|
|
96
|
+
preview 父候选与可信 definitionDigest 等待身份。预览通过、相同源码 final 构建和 final 再审查由 Web
|
|
97
|
+
执行定义约束;本仓新增的只是受信创建客户端(`ab studio creation create|active|get` 回读,见
|
|
98
|
+
[workflow 规范](skills/abelien-harness/references/workflow-spec.md)),没有第二份编排,也未据此宣称 EaaS 已发布或实测通过,既有 unknown 不重发。
|
|
99
|
+
|
|
100
|
+
### 生产 Studio broker 客户端
|
|
101
|
+
|
|
102
|
+
托管 Agent 调 Studio 工具时只使用上述 `ab studio` 封闭命令。Web 宿主将 server-fixed Web origin、
|
|
103
|
+
draft/attempt/binding fence 和短期委托 token 写入 attempt 不可变文件,再由 EaaS 内 launcher 以
|
|
104
|
+
0600 临时文件、fsync、rename 激活固定 `current.json`。launcher 按 generation、credential epoch 和
|
|
105
|
+
数据库 attempt 创建时间拒绝晚到旧 attempt 覆盖。CLI 不接受模型提供的 origin、token 或 context
|
|
106
|
+
路径,并在联网前逐项核对 context 与 token claims;Agent 可见输出会移除 policy 身份,provider、
|
|
107
|
+
account、price 不进入该响应。
|
|
108
|
+
|
|
109
|
+
POST 只对完全相同的序列化正文做一次有界回放;仍未知时返回 `STUDIO_WRITE_UNKNOWN`,调用方只能
|
|
110
|
+
读取原 creation/modification/invocation,或以同一 command/operation 身份精确重放,不能换 ID。工具回执
|
|
111
|
+
仍只用 `receipt get`,绝不调用 `workflow advance`。
|
|
112
|
+
|
|
113
|
+
当前接线边界:Web 已为普通首轮 production EaaS turn 实现固定 Harness release 安装、
|
|
114
|
+
actionScope/definitionDigest 选择、`state.probe` attempt 投递和同一远端回合内 marker 回调;
|
|
115
|
+
tool-receipt successor 与已有可信 runtime decision 也可以取得后续 context。npm 上仍无可安装的
|
|
116
|
+
`abelien-harness` 发布工件,目标 EaaS 凭据也未配置,所以尚未取得真实 Pi 消费/回执证据;这些
|
|
117
|
+
本地契约与定向测试不能等同于首个真实 Web E2E 已完成。
|
|
118
|
+
|
|
119
|
+
## Agent 集成
|
|
120
|
+
|
|
121
|
+
现行入口不再维护独立的“主控业务提示词”。宿主指令只交代身份、skills 的用途、读取/调用方式与授权边界;具体对话调度放在 guide,作品旅程与业务规则放在 workspace,领域工作放在对应 skill。它们可以由同一个宿主 Agent 执行,不需要额外的主控 Agent;旧 controller 文档仅作历史参考,不与 skills 流程重复注入。
|
|
122
|
+
|
|
123
|
+
- 对话调度与沟通由 [abelien-guide](skills/abelien-guide/SKILL.md) 负责:组织上下文、调用领域 skill、呈现问题和结果;阶段、版本和确认条件统一读取 workspace。
|
|
124
|
+
- 作品规则由 [abelien-workspace](skills/abelien-workspace/SKILL.md) 维护:完整 A1–C、采用与版本、组合检查、确认和交付恢复。其 `user-journey` 是单个 Agent 步骤,Harness 提供通用运行机制;产品服务的实际接入边界见 workspace 调用说明。
|
|
125
|
+
- 需求澄清为 [abelien-clarify](skills/abelien-clarify/SKILL.md):把用户原话整理成 requirements、区分用户事实与系统假设、只问阻塞当前操作的问题,附只读校验脚本;共用表达规则随 guide 的 references 分发。两者的编辑源在 `abelienwebapplication/docs/agent-prd/v2`,快照对应的 commit 见下文「快照来源」。
|
|
126
|
+
- 各 bundle 均为标准 `SKILL.md`(含 name/description/license/compatibility,
|
|
127
|
+
兼容 claude-code / hermes / pi),agent 按 description 触发词路由;claude-code 与
|
|
128
|
+
codex 的双入口收敛(根 `CLAUDE.md` / `AGENTS.md`)见 [docs/architecture/host-adapters.md](docs/architecture/host-adapters.md)。
|
|
129
|
+
- workflow 驱动循环:`run` → 返回 `awaiting_agent` 时读 `steps[cursor].instruction`,
|
|
130
|
+
agent 判断后 `advance --result '<json>'`(或等价的 `--httl '<doc>'` / `--httl-file <path>`,
|
|
131
|
+
见 [docs/architecture/httl.md](docs/architecture/httl.md))提交(只有明确放弃本次运行才 `cancel`;产品修改保持共创)→ 循环至终态。
|
|
132
|
+
- 域包靠**同级目录自动发现**:与 `abelien-harness` 同 skills 目录的
|
|
133
|
+
`abelien-*/domain.json` 无需注册即可用;非标准布局用 `ab domain register`。
|
|
134
|
+
- 协议细节见 `skills/abelien-harness/references/`(kernel-protocol /
|
|
135
|
+
adapter-contract / workflow-spec)。
|
|
136
|
+
|
|
137
|
+
## 产品旅程与 PRD
|
|
138
|
+
|
|
139
|
+
完整规则统一维护在 [workspace 用户旅程](skills/abelien-workspace/references/user-journey.md)。`user-journey` 是一个 Agent 驱动入口:A1–C 的判断与回流发生在 `drive-product-journey` 步骤内;必要答案、证据或能力未齐时保持暂停,真实同版确认快照保存并交代交付状态后才提交交接。JSON 的 `journey` 不由内核自动解释,`done` 不能证明产品确认。具体恢复及旧实例迁移见 [调用说明](skills/abelien-workspace/references/harness-binding.md)。
|
|
140
|
+
|
|
141
|
+
```bash
|
|
142
|
+
node skills/abelien-harness/scripts/ab.mjs --workdir <作品工作目录> workflow run user-journey --input '{"prompt":"用户真实创作意图"}'
|
|
143
|
+
# awaiting_agent@drive-product-journey → Agent 按 workspace 规则、通过 guide 调度,在同一步骤内跨轮推进
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
### PRD 随需求对话维护
|
|
147
|
+
|
|
148
|
+
PRD 以用户指定的飞书模板 revision 191 为结构依据,保留七块总览、逐条需求清单与图片引用;从 A1 起每轮登记/修改/撤回需求,保留 ID、来源与历史,选型和检查回来后再更新关联行。定义与写入语义集中在 [PRD 契约](skills/abelien-workspace/references/prd-contract.md),模板随 workspace 安装。产品写入/回读接口尚未接入,不能把规则声明说成自动写入已实现。
|
|
149
|
+
|
|
150
|
+
`user-journey-mock`、专属 workspace mock 能力和 draft/quote 样例状态机已移除,旧记录与 [MVP 实录](docs/mvp/journey.md) 仅用于历史核对,不再提供运行入口。当前 eval 共五条场景:`user-journey-entry` 只验证入口暂停,不表示产品 E2E 通过;`user-journey-cancelled` 验证取消是**终态**(落 `cancelled` 后 `advance` 与再次 `cancel` 都被拒);`user-journey-hardware-verified` 与 `user-journey-hardware-pending-confirmation` 经**场景 http 桩**端到端驱动硬件阶段的接线(Agent 槽位真的进了请求体、选型资源落库、draft 记下 id 与 status)与门禁(`verified` 过门落 `selected`;`needs_confirmation` 不再被拒——不执行算法,以 `selected_pending_confirmation` 正常完成,仍不宣称 `verified`;`failed`/`unknown` 依旧 `GUARD_FAILED`);`user-journey-hardware-candidates` 驱动**候选提案**路径(本地 `hardware.search` 按受控三级路径读 TOS,`hardware.finalize` 归一化为提案),三条实况断言锁 Catalog/索引/Wiki 各被真实读一次,且 draft 不带 `hardwareSelectionId`(候选不产生正式选型)。桩是评估进程内的假服务,**不**证明选型质量,也**不**证明服务端已就位。
|
|
151
|
+
基础需求足够后推进首版;guide 在宿主实际展示条件满足时通过可选选择题卡片邀请交互细化并告知可“随时收尾”。PRD 从已保存需求起可读,不强制展开或增加文档确认关卡。收尾切入同一作品的[成果体验](skills/abelien-workspace/references/user-journey.md#result-experience):收起全部编辑面板,有可运行仿真就进入仿真,否则按真实播放器能力提供 Three.js 状态动作演示;保留 PRD 查看/草稿或确认版导出及返回编辑入口。展示模式与方案确认独立,不能用收尾、演示状态或草稿导出触发 workflow 完成。宿主 UI/播放器仍须实际接入,历史入口测试不证明体验已实现。
|
|
152
|
+
|
|
153
|
+
### 真实硬件阶段
|
|
154
|
+
|
|
155
|
+
另有独立的 `user-journey-hardware` 阶段流程:输入 clarify 交回的 Requirements(context / reaction[] / limits[],每条须带 `source ∈ {user,system}`、非空 `text` 与全局唯一 `id`,limits 另有 `strength ∈ {hard,preference}`;格式不合规在读取任何可信召回之前即失败),在 agent 暂停点按需加载同级 `abelien-hardware-selection` 的三级分类规则,再将槽位交给 `hardware.select`——它是该域包 `domain.json` 声明的 `{type:"module"}` 本地 adapter(`scripts/select.mjs`),不连网络、无服务端 URL。主流程先 TOS 搜索、再 Agent 证据判断、最后本地 `hardware.select`;未知不通过门禁。契约见选型域 selection-service-contract;verified 不是工程实测。算法与外观真实阶段尚未接到该流程。分类规则快照的来源见下文「快照来源」。
|
|
156
|
+
|
|
157
|
+
### TOS 候选检索工具
|
|
158
|
+
|
|
159
|
+
`hardware.search` 独立读取候选 Wiki,正式选型仍通过 `hardware.select`;TOS 结果不自动通过硬件选型门禁。
|
|
160
|
+
|
|
161
|
+
发布搜索索引前,从同一份 `_manifest.json` 和 Markdown 构建分类索引;完整 Wiki 无需复制。先做不连接 TOS 的校验:
|
|
162
|
+
|
|
163
|
+
```bash
|
|
164
|
+
npm run publish:hardware-search-index -- \
|
|
165
|
+
--source /absolute/path/to/硬件wiki \
|
|
166
|
+
--dry-run
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
复制 `.env.example` 为 `.env.local` 并填写真实服务端配置后,一条命令完成版本化上传、远端全量校验、Catalog 最后激活和真实读取冒烟:
|
|
170
|
+
|
|
171
|
+
```bash
|
|
172
|
+
npm run publish:hardware-search-index -- \
|
|
173
|
+
--source /absolute/path/to/硬件wiki \
|
|
174
|
+
--env-file .env.local
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
(`--env-file` 与 Node ≥ 20.6 的自身选项同名,会被 Node 先截走且不从 argv 摘除:文件存在时恰好两边读数一致,路径写错时收到的却是 `node: <file>: not found` 与 exit 9,而非本工具的 JSON 错误。要稳定的失败语义就用 `AB_ENV_FILE=.env.local`。)
|
|
178
|
+
|
|
179
|
+
如果旧上传器只上传了 Wiki Markdown、云端尚无 `_manifest.json`,首次加 `--bootstrap-manifest`;发布器会先逐个验证全部远端 Wiki 后才创建 Manifest。后续正常发布不再需要该参数。
|
|
180
|
+
|
|
181
|
+
也可分别运行 `npm run verify:hardware-search-index` 和 `npm run smoke:hardware-search`。搜索默认要求索引存在;缺少 `_catalog.json` 会返回 `WIKI_SEARCH_INDEX_MISSING`,不会静默下载整个分类。迁移期可显式设置 `TOS_ALLOW_LEGACY_MANIFEST_FALLBACK=true`,但响应会标记 `legacy_manifest_full_scan`,不应作为长期生产配置。格式见 [search-index-format.md](skills/abelien-hardware/references/search-index-format.md),发布操作见 [search-index-release.md](skills/abelien-hardware/references/search-index-release.md)。
|
|
182
|
+
|
|
183
|
+
在本仓库内启动硬件阶段:
|
|
184
|
+
|
|
185
|
+
```bash
|
|
186
|
+
export TOS_REGION='cn-beijing'
|
|
187
|
+
export TOS_ENDPOINT='https://tos-s3-cn-beijing.volces.com'
|
|
188
|
+
export TOS_BUCKET='your-bucket'
|
|
189
|
+
export TOS_ACCESS_KEY_ID='...'
|
|
190
|
+
export TOS_SECRET_ACCESS_KEY='...'
|
|
191
|
+
export ABELIEN_HARDWARE_REVISE_URL='https://your-selector.example/revise'
|
|
192
|
+
node skills/abelien-harness/scripts/ab.mjs workflow run user-journey-hardware --input '{"requirements":{"context":{"text":"放在桌面上","source":"user"},"reaction":[{"id":"r-turn","text":"有人靠近时转头看向对方","source":"user"}],"limits":[{"id":"l-net","text":"不能联网","source":"user","strength":"hard"}]}}'
|
|
193
|
+
# 返回 awaiting_agent 后,按请求读取 skills/abelien-hardware/SKILL.md,
|
|
194
|
+
# 用其 scripts/load-guide.mjs 逐层加载规则,再对该 run 执行 workflow advance --result '{"slots":[...]}'。
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
示例中的凭据均为占位符。`ab` 和发布命令会自动读取启动目录的 `.env`、`.env.local`,进程变量优先;也接受 Web 部署使用的 `CAD_STORAGE_*` 别名。单元测试使用内存对象存储;只有发布命令末尾或独立 `smoke:hardware-search` 的目标环境结果才是生产连通性证据。
|
|
198
|
+
|
|
199
|
+
## 写自己的域包
|
|
200
|
+
|
|
201
|
+
最小结构(参考 `skills/abelien-hardware/`):
|
|
202
|
+
|
|
203
|
+
```text
|
|
204
|
+
abelien-<slug>/
|
|
205
|
+
├── SKILL.md # 触发描述 + 驱动指引
|
|
206
|
+
├── domain.json # resources + capabilities(声明式 adapter)+可选 requires
|
|
207
|
+
├── workflows/*.json # cli/agent 步骤混合的编排
|
|
208
|
+
└── references/ # 领域文档(可选 scripts/ 放本地实现)
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
能力有三种 adapter 形状:`{type:"mock"}`(确定性派生,`{{hash}}` 保证测试可重复)、
|
|
212
|
+
`{type:"http", ...}`(声明式调远端)、`{type:"module", ...}`(指向本包 `scripts/*.mjs` 的
|
|
213
|
+
本地实现,如选型域的 `hardware.select`)。换 adapter 不改 `ab capability` / workflow 接口。
|
|
214
|
+
|
|
215
|
+
域包若要在运行期 import 同级的另一个 bundle,把对方写进 `domain.json` 的
|
|
216
|
+
**`requires`**(如 `abelien-hardware-selection` 声明 `["abelien-harness","abelien-hardware"]`)。
|
|
217
|
+
skill-lint 双向守卫核对声明与实际 import 一致,打包校验再确认声明的包确实在包里
|
|
218
|
+
——缺包在运行期只会是 `Cannot find module`。
|
|
219
|
+
|
|
220
|
+
## 范式
|
|
221
|
+
|
|
222
|
+
- 总纲(测试 · 评估 · 优化一体,同一场景工件的三种消费模式):
|
|
223
|
+
[docs/paradigms/README.md](docs/paradigms/README.md)
|
|
224
|
+
- 四篇:[开发](docs/paradigms/development.md) · [测试](docs/paradigms/testing.md) ·
|
|
225
|
+
[评估](docs/paradigms/evaluation.md) · [自递归优化](docs/paradigms/self-optimization.md)
|
|
226
|
+
- 开发循环的操作手册(SDD 三角色/三脚本,claude-code 与 codex 双宿主同一循环):
|
|
227
|
+
[docs/paradigms/development.md](docs/paradigms/development.md) §1
|
|
228
|
+
- 架构侧配套论述:`docs/architecture/`(八篇:双层状态机、持久化哲学、HTTL、宿主适配、
|
|
229
|
+
3D 异步任务引擎、外观/结构协作边界、问题卡协议、可视化与自进化收口)
|
|
230
|
+
|
|
231
|
+
## 文档地图
|
|
232
|
+
|
|
233
|
+
完整产品用户旅程统一从 [Abelien 完整用户旅程](skills/abelien-workspace/references/user-journey.md) 阅读:两入口、A1–C 判断、修改回流、确认交付及分享预订。reference / mvp 保留来源与旧 mock 实录。
|
|
234
|
+
|
|
235
|
+
`docs/` 分四层:**architecture**(本仓设计论述)→ **paradigms**(工程范式)→
|
|
236
|
+
**reference**(对向工程文档的平移整合)→ **mvp**(验收与覆盖)。
|
|
237
|
+
|
|
238
|
+
| 层 | 篇目 | 一句话 |
|
|
239
|
+
| --- | --- | --- |
|
|
240
|
+
| architecture | [state-machine](docs/architecture/state-machine.md) / [workflow-persistence](docs/architecture/workflow-persistence.md) / [httl](docs/architecture/httl.md) / [host-adapters](docs/architecture/host-adapters.md) / [generate3d](docs/architecture/generate3d.md) / [structure](docs/architecture/structure.md) / [question-card](docs/architecture/question-card.md) / [visualization-rsi](docs/architecture/visualization-rsi.md) | 双层 FSM · 定义即数据/实例即文件 · HTTL 协议 · claude-code/codex 双入口收敛 · 声明式 provider + 异步任务引擎 · 外观/结构协作边界 · 问题卡与 ACL 前端协议(contract-ready) · `ab --visual` 可视化与自进化收口 |
|
|
241
|
+
| paradigms | [README](docs/paradigms/README.md) + development / testing / evaluation / self-optimization | 场景工件是唯一事实源:测试测零件、评估测整车、优化答归因 |
|
|
242
|
+
| reference | [product-journey](docs/reference/product-journey.md) / [research-notes](docs/reference/research-notes.md) / [verification-method](docs/reference/verification-method.md) | PRD 旅程转译 · 基准研究与 EaaS 方法论 · 验证方法→场景判定器(每篇带 来源/取舍) |
|
|
243
|
+
| mvp | [journey](docs/mvp/journey.md) / [coverage](docs/mvp/coverage.md) | 历史 MVP(已移除的 25 步及真实实录)· 四维覆盖矩阵 + 缺口账本 |
|
|
244
|
+
|
|
245
|
+
## 开发
|
|
246
|
+
|
|
247
|
+
```bash
|
|
248
|
+
npm test # node --test(零依赖,含单元/契约/e2e smoke/docs-lint/skill-lint)
|
|
249
|
+
npm run eval # 5 条场景(入口暂停 + 取消终态 + 硬件阶段正例/门反例 + 候选提案,后三条经场景 http 桩),报告 append-only 落 eval/reports/
|
|
250
|
+
npm run branch:new|sync|push:ready|land # 分支纪律:切分支 / rebase 同步 / 绿了才推 / FF-only 落 main
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
设计文档:`docs/superpowers/specs/2026-09-16-abelien-harness-design.md`。
|
|
254
|
+
|
|
255
|
+
### 快照来源
|
|
256
|
+
|
|
257
|
+
`abelien-clarify`(含 guide 的 shared-response-rules)的规则正文是外部编辑源的只读快照,
|
|
258
|
+
来源仓 URL、分支、完整 commit 与源内路径集中登记在 [tools/snapshot-sources.json](tools/snapshot-sources.json):
|
|
259
|
+
|
|
260
|
+
| 快照 | 来源 | 本地挂载(`checkout`,相对本仓) |
|
|
261
|
+
| --- | --- | --- |
|
|
262
|
+
| clarify | abelienwebapplication `develop` 的 `docs/agent-prd/v2` | `../abelienwebapplication`,`git fetch` 到锚定 commit 即可 |
|
|
263
|
+
|
|
264
|
+
- `npm run sync:clarify` 默认从锚定 commit 的 git 对象同步,加 `--check` 只校验;`prepack` 跑它的 `--check`,
|
|
265
|
+
工作区里未提交的源改动不影响结果。硬件分类规则不再是外部快照:唯一正文就在
|
|
266
|
+
`skills/abelien-hardware/references/hardware-selection/`,`prepack` 以 `validate:hardware-selection-snapshot` 校验其完整性。
|
|
267
|
+
- 升级快照:设置 `ABELIEN_AGENT_PRD_DIR` 指向新版源目录同步,经内容责任人审过后,
|
|
268
|
+
再把 `snapshot-sources.json` 的 commit 改成新版源已提交的 commit(未提交的源不能作为锚点)。
|
|
269
|
+
- 锚定 commit 在本地不可得时,`--check` 打印挂载提示并跳过(fail-open,未设 CI 兜底)。
|
|
270
|
+
- 2026-10-03 核对:clarify 五个同步文件在锚点 `f370e49e`→`f269c4b0` 间逐字节一致,更新的是
|
|
271
|
+
锚点记录而非快照正文。必要问题的选项上限沿用 clarify 的 `result / questions / note` 契约
|
|
272
|
+
(最多三个,可少于三个或纯自由输入),workspace 不设“恰好三个”下限;B3 的两项确认邀请与
|
|
273
|
+
确认门仍归 workspace。该对齐收口 [!2 note_545](https://git.abelien.cn/abelien/abelienharness/-/merge_requests/2#note_545),
|
|
274
|
+
不代表真实产品旅程已验收。
|
|
275
|
+
|
|
276
|
+
## License
|
|
277
|
+
|
|
278
|
+
MIT
|
package/bin/cli.mjs
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// bin/cli.mjs — npx 安装器入口(分发载体;装完后运行时不依赖 npm)
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { fileURLToPath } from "node:url";
|
|
5
|
+
import { install, update, remove, listInstalled } from "../lib/installer.mjs";
|
|
6
|
+
import { TARGET_NAMES } from "../targets/registry.mjs";
|
|
7
|
+
import { consumeStudioReceipt, readStudioReceipt } from "../skills/abelien-harness/scripts/receipt.mjs";
|
|
8
|
+
|
|
9
|
+
const packageRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..");
|
|
10
|
+
const args = process.argv.slice(2);
|
|
11
|
+
const cmd = args[0];
|
|
12
|
+
|
|
13
|
+
function flag(name) {
|
|
14
|
+
const i = args.indexOf(`--${name}`);
|
|
15
|
+
if (i < 0) return undefined;
|
|
16
|
+
const v = args[i + 1];
|
|
17
|
+
return v === undefined || v.startsWith("--") ? true : v;
|
|
18
|
+
}
|
|
19
|
+
const has = name => args.includes(`--${name}`);
|
|
20
|
+
const skillsDir = typeof flag("skills-dir") === "string" ? flag("skills-dir") : undefined;
|
|
21
|
+
const opts = {
|
|
22
|
+
packageRoot,
|
|
23
|
+
target: flag("target"),
|
|
24
|
+
project: has("project"),
|
|
25
|
+
skillsDir,
|
|
26
|
+
force: has("force"),
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
function print(results) {
|
|
30
|
+
for (const r of results) {
|
|
31
|
+
const action = r.removed ? `removed ${r.removed.join(", ")}` : `installed ${r.slugs.join(", ")}`;
|
|
32
|
+
console.log(`${path.basename(r.skillsDir)}: ${action} -> ${r.target} (${r.skillsDir})`);
|
|
33
|
+
if (r.retired?.length) console.log(` retired: ${r.retired.join(", ")}(新版已不再发布,整包移除)`);
|
|
34
|
+
if (r.keptRetired?.length) console.log(` kept: ${r.keptRetired.join(", ")}(本地有改动,未删除;确认后可手动移除)`);
|
|
35
|
+
for (const n of r.notes ?? []) console.log(` note: ${n}`);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
function usage() {
|
|
39
|
+
console.error(`usage: abelien-harness <install|update|remove|list> [--target ${TARGET_NAMES.join("|")}|all] [--project] [--skills-dir <dir>] [--force]
|
|
40
|
+
abelien-harness receipt consume --file <path> [--workdir <dir>]
|
|
41
|
+
abelien-harness receipt get --wait <waitId> [--digest <sha256>] [--workdir <dir>]`);
|
|
42
|
+
process.exit(2);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
try {
|
|
46
|
+
switch (cmd) {
|
|
47
|
+
case "install": print(install(opts)); break;
|
|
48
|
+
case "update": print(update(opts)); break;
|
|
49
|
+
case "remove": print(remove(opts)); break;
|
|
50
|
+
case "list": console.log(JSON.stringify(listInstalled({ env: process.env }), null, 2)); break;
|
|
51
|
+
case "receipt": {
|
|
52
|
+
const sub = args[1];
|
|
53
|
+
const workdir = typeof flag("workdir") === "string" ? path.resolve(flag("workdir"))
|
|
54
|
+
: process.env.AB_WORKDIR ? path.resolve(process.env.AB_WORKDIR) : process.cwd();
|
|
55
|
+
if (sub === "consume" && typeof flag("file") === "string") {
|
|
56
|
+
console.log(JSON.stringify(await consumeStudioReceipt({ workdir, file: flag("file") })));
|
|
57
|
+
} else if (sub === "get" && typeof flag("wait") === "string") {
|
|
58
|
+
console.log(JSON.stringify(readStudioReceipt({ workdir, waitId: flag("wait"), resultDigest: flag("digest") })));
|
|
59
|
+
} else usage();
|
|
60
|
+
break;
|
|
61
|
+
}
|
|
62
|
+
default: usage();
|
|
63
|
+
}
|
|
64
|
+
} catch (e) {
|
|
65
|
+
console.error(`abelien-harness: ${e.code ?? "INTERNAL"}: ${e.message}${e.details ? ` ${JSON.stringify(e.details)}` : ""}`);
|
|
66
|
+
process.exit(String(e.code ?? "").startsWith("USAGE") ? 2 : 1);
|
|
67
|
+
}
|
package/lib/bundle.mjs
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
// lib/bundle.mjs
|
|
2
|
+
import fs from "node:fs";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { canonicalJson, sha256Hex } from "../skills/abelien-harness/scripts/ab.mjs";
|
|
5
|
+
|
|
6
|
+
export function listBundleFiles(dir, prefix = "") {
|
|
7
|
+
const out = [];
|
|
8
|
+
for (const d of fs.readdirSync(dir, { withFileTypes: true })) {
|
|
9
|
+
const rel = prefix ? `${prefix}/${d.name}` : d.name;
|
|
10
|
+
if (d.isDirectory()) out.push(...listBundleFiles(path.join(dir, d.name), rel));
|
|
11
|
+
else out.push(rel);
|
|
12
|
+
}
|
|
13
|
+
return out.sort();
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export function bundleManifest(skillsRoot) {
|
|
17
|
+
const out = [];
|
|
18
|
+
for (const d of fs.readdirSync(skillsRoot, { withFileTypes: true })) {
|
|
19
|
+
if (!d.isDirectory() || !d.name.startsWith("abelien-")) continue; // 命名空间守卫
|
|
20
|
+
const dir = path.join(skillsRoot, d.name);
|
|
21
|
+
const files = {};
|
|
22
|
+
for (const rel of listBundleFiles(dir)) files[rel] = sha256Hex(fs.readFileSync(path.join(dir, rel), "utf8"));
|
|
23
|
+
out.push({ slug: d.name, dir, files, digest: sha256Hex(canonicalJson(files)) });
|
|
24
|
+
}
|
|
25
|
+
return out.sort((a, b) => a.slug.localeCompare(b.slug));
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export function copyBundle(entry, destDir) {
|
|
29
|
+
fs.mkdirSync(destDir, { recursive: true });
|
|
30
|
+
for (const rel of Object.keys(entry.files)) {
|
|
31
|
+
const dest = path.join(destDir, rel);
|
|
32
|
+
fs.mkdirSync(path.dirname(dest), { recursive: true });
|
|
33
|
+
fs.copyFileSync(path.join(entry.dir, rel), dest);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export function installedDigest(slugDir) {
|
|
38
|
+
const files = {};
|
|
39
|
+
for (const rel of listBundleFiles(slugDir)) files[rel] = sha256Hex(fs.readFileSync(path.join(slugDir, rel), "utf8"));
|
|
40
|
+
return sha256Hex(canonicalJson(files));
|
|
41
|
+
}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
// lib/installer.mjs
|
|
2
|
+
import fs from "node:fs";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { targets, homeDir } from "../targets/registry.mjs";
|
|
5
|
+
import { bundleManifest, copyBundle, installedDigest, listBundleFiles } from "./bundle.mjs";
|
|
6
|
+
import { atomicWriteJson, readJson, fail } from "../skills/abelien-harness/scripts/ab.mjs";
|
|
7
|
+
|
|
8
|
+
const receiptFile = env => path.join(homeDir(env), ".abelien", "installed.json");
|
|
9
|
+
const readReceipt = env => (fs.existsSync(receiptFile(env)) ? readJson(receiptFile(env)) : { version: 1, installs: [] });
|
|
10
|
+
const writeReceipt = (env, r) => atomicWriteJson(receiptFile(env), r);
|
|
11
|
+
|
|
12
|
+
function resolveTargets({ target, project, skillsDir, env }) {
|
|
13
|
+
const names = target === "all" ? Object.keys(targets) : [target ?? "claude-code"];
|
|
14
|
+
for (const n of names) if (!targets[n]) throw fail("USAGE", `unknown target: ${n} (known: ${Object.keys(targets).join(", ")})`);
|
|
15
|
+
return names.map(n => ({
|
|
16
|
+
name: n,
|
|
17
|
+
dir: skillsDir ? path.resolve(skillsDir) : targets[n].skillsDir({ project, env }),
|
|
18
|
+
}));
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
// 整包退役:回执登记过、本次包中已不再发布的 bundle(如域包合并后的旧域)必须整体移除,
|
|
22
|
+
// 否则残留目录会被 ab discoverDomains 当活域加载,造成机器/能力二义(AMBIGUOUS_MACHINE)。
|
|
23
|
+
// 命名空间守卫同 remove;摘要不符(本地改过)的退役包保留不动,只上报,绝不静默删用户改动。
|
|
24
|
+
function retiredBundles(receipt, t, publishedSlugs, force) {
|
|
25
|
+
const record = receipt.installs.find(i => i.target === t.name && i.skillsDir === t.dir);
|
|
26
|
+
const removed = [];
|
|
27
|
+
const kept = [];
|
|
28
|
+
for (const [slug, entry] of Object.entries(record?.bundles ?? {})) {
|
|
29
|
+
if (!slug.startsWith("abelien-") || publishedSlugs.has(slug)) continue;
|
|
30
|
+
const dest = path.join(t.dir, slug);
|
|
31
|
+
if (!fs.existsSync(dest)) continue;
|
|
32
|
+
if (force || installedDigest(dest) === entry.digest) removed.push({ slug, dest });
|
|
33
|
+
else kept.push({ slug, entry });
|
|
34
|
+
}
|
|
35
|
+
return { removed, kept };
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function doInstall(opts, retiredFiles = new Map()) {
|
|
39
|
+
const { packageRoot, target, project, skillsDir, env = process.env } = opts;
|
|
40
|
+
const manifest = bundleManifest(path.join(packageRoot, "skills"));
|
|
41
|
+
if (!manifest.length) throw fail("EMPTY_BUNDLE", "no abelien-* skill bundles found in package");
|
|
42
|
+
const publishedSlugs = new Set(manifest.map(m => m.slug));
|
|
43
|
+
const receipt = readReceipt(env);
|
|
44
|
+
const results = [];
|
|
45
|
+
for (const t of resolveTargets({ target, project, skillsDir, env })) {
|
|
46
|
+
fs.mkdirSync(t.dir, { recursive: true });
|
|
47
|
+
const { removed: retired, kept: keptRetired } = retiredBundles(receipt, t, publishedSlugs, opts.force);
|
|
48
|
+
const bundles = {};
|
|
49
|
+
for (const entry of manifest) {
|
|
50
|
+
const dest = path.join(t.dir, entry.slug);
|
|
51
|
+
copyBundle(entry, dest);
|
|
52
|
+
// update 已对全部目标完成回执/漂移校验;只清理该受管 bundle 的退役文件。
|
|
53
|
+
// 复制成功后才删除,普通 install 不清理未登记的用户文件。
|
|
54
|
+
for (const rel of retiredFiles.get(dest) ?? []) fs.unlinkSync(path.join(dest, rel));
|
|
55
|
+
retiredFiles.delete(dest); // 多个 target 可共享同一显式 skillsDir,避免重复清理。
|
|
56
|
+
bundles[entry.slug] = { digest: entry.digest };
|
|
57
|
+
}
|
|
58
|
+
for (const r of retired) fs.rmSync(r.dest, { recursive: true, force: true });
|
|
59
|
+
// 未被清理的退役包仍留在回执里:下一次 install/update 会再试(用户还原本地改动后即可清除)。
|
|
60
|
+
for (const k of keptRetired) bundles[k.slug] = k.entry;
|
|
61
|
+
results.push({
|
|
62
|
+
target: t.name,
|
|
63
|
+
skillsDir: t.dir,
|
|
64
|
+
slugs: manifest.map(m => m.slug),
|
|
65
|
+
notes: targets[t.name].notes,
|
|
66
|
+
retired: retired.map(r => r.slug),
|
|
67
|
+
keptRetired: keptRetired.map(k => k.slug),
|
|
68
|
+
});
|
|
69
|
+
const record = { target: t.name, skillsDir: t.dir, installedAt: new Date().toISOString(), bundles };
|
|
70
|
+
const existing = receipt.installs.find(i => i.target === t.name && i.skillsDir === t.dir);
|
|
71
|
+
if (existing) Object.assign(existing, record); else receipt.installs.push(record);
|
|
72
|
+
}
|
|
73
|
+
writeReceipt(env, receipt);
|
|
74
|
+
return results;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
export const install = doInstall;
|
|
78
|
+
|
|
79
|
+
export function update(opts) {
|
|
80
|
+
const { packageRoot, target, project, skillsDir, force, env = process.env } = opts;
|
|
81
|
+
const manifest = bundleManifest(path.join(packageRoot, "skills"));
|
|
82
|
+
const receipt = readReceipt(env);
|
|
83
|
+
const drifted = [];
|
|
84
|
+
const retiredFiles = new Map();
|
|
85
|
+
for (const t of resolveTargets({ target, project, skillsDir, env })) {
|
|
86
|
+
const record = receipt.installs.find(i => i.target === t.name && i.skillsDir === t.dir);
|
|
87
|
+
if (!record) throw fail("NOT_INSTALLED", `${t.name} at ${t.dir} is not installed; run install first`);
|
|
88
|
+
for (const entry of manifest) {
|
|
89
|
+
const dest = path.join(t.dir, entry.slug);
|
|
90
|
+
const recorded = record.bundles[entry.slug]?.digest;
|
|
91
|
+
if (fs.existsSync(dest) && recorded) {
|
|
92
|
+
if (installedDigest(dest) !== recorded) drifted.push({ target: t.name, slug: entry.slug });
|
|
93
|
+
retiredFiles.set(dest, listBundleFiles(dest).filter(rel => !Object.hasOwn(entry.files, rel)));
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
if (drifted.length && !force) {
|
|
98
|
+
throw fail("DRIFTED", "installed bundles were modified since install; use --force to overwrite", { drifted });
|
|
99
|
+
}
|
|
100
|
+
return doInstall(opts, retiredFiles);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
export function remove({ target, project, skillsDir, env = process.env }) {
|
|
104
|
+
const receipt = readReceipt(env);
|
|
105
|
+
const keep = [];
|
|
106
|
+
const results = [];
|
|
107
|
+
const tss = resolveTargets({ target, project, skillsDir, env });
|
|
108
|
+
for (const inst of receipt.installs) {
|
|
109
|
+
if (!tss.some(t => t.name === inst.target && t.dir === inst.skillsDir)) { keep.push(inst); continue; }
|
|
110
|
+
const removed = [];
|
|
111
|
+
for (const slug of Object.keys(inst.bundles)) {
|
|
112
|
+
if (!slug.startsWith("abelien-")) continue; // 命名空间守卫(纵深防御)
|
|
113
|
+
fs.rmSync(path.join(inst.skillsDir, slug), { recursive: true, force: true });
|
|
114
|
+
removed.push(slug);
|
|
115
|
+
}
|
|
116
|
+
results.push({ target: inst.target, skillsDir: inst.skillsDir, removed });
|
|
117
|
+
}
|
|
118
|
+
receipt.installs = keep;
|
|
119
|
+
writeReceipt(env, receipt);
|
|
120
|
+
return results;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
export function listInstalled({ env = process.env }) {
|
|
124
|
+
return readReceipt(env).installs.map(i => ({
|
|
125
|
+
target: i.target,
|
|
126
|
+
skillsDir: i.skillsDir,
|
|
127
|
+
installedAt: i.installedAt,
|
|
128
|
+
bundles: Object.fromEntries(Object.entries(i.bundles).map(([slug, b]) => {
|
|
129
|
+
const dest = path.join(i.skillsDir, slug);
|
|
130
|
+
let state = "missing";
|
|
131
|
+
if (fs.existsSync(dest)) state = installedDigest(dest) === b.digest ? "ok" : "drifted";
|
|
132
|
+
return [slug, state];
|
|
133
|
+
})),
|
|
134
|
+
}));
|
|
135
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,40 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "abelien-harness",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"
|
|
5
|
-
"
|
|
6
|
-
|
|
3
|
+
"version": "0.3.0",
|
|
4
|
+
"description": "npx-installable multi-agent skill harness: generic kernel + pluggable domain packs",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"engines": {
|
|
7
|
+
"node": ">=18"
|
|
8
|
+
},
|
|
9
|
+
"bin": {
|
|
10
|
+
"abelien-harness": "bin/cli.mjs"
|
|
11
|
+
},
|
|
12
|
+
"files": [
|
|
13
|
+
"bin/",
|
|
14
|
+
"lib/",
|
|
15
|
+
"skills/",
|
|
16
|
+
"targets/",
|
|
17
|
+
"README.md",
|
|
18
|
+
".env.example"
|
|
19
|
+
],
|
|
20
|
+
"scripts": {
|
|
21
|
+
"test": "node --test",
|
|
22
|
+
"eval": "node eval/run.mjs",
|
|
23
|
+
"prepare": "node scripts/install-hooks.mjs",
|
|
24
|
+
"branch:new": "node scripts/new-branch.mjs",
|
|
25
|
+
"sync": "node scripts/sync.mjs",
|
|
26
|
+
"push:ready": "node scripts/push-ready.mjs",
|
|
27
|
+
"land": "node scripts/land.mjs",
|
|
28
|
+
"release:check": "node scripts/release-check.mjs",
|
|
29
|
+
"release": "node scripts/release.mjs",
|
|
30
|
+
"build:hardware-search-index": "node skills/abelien-hardware/scripts/build-search-index.mjs",
|
|
31
|
+
"validate:hardware-selection-snapshot": "node skills/abelien-hardware/scripts/validate-selection-snapshot.mjs",
|
|
32
|
+
"publish:hardware-search-index": "node skills/abelien-hardware/scripts/publish-search-index.mjs",
|
|
33
|
+
"verify:hardware-search-index": "node skills/abelien-hardware/scripts/verify-search-index.mjs",
|
|
34
|
+
"smoke:hardware-search": "node skills/abelien-hardware/scripts/smoke-search-index.mjs",
|
|
35
|
+
"sync:hardware-selection": "node tools/sync-hardware-selection.mjs",
|
|
36
|
+
"sync:clarify": "node tools/sync-clarify.mjs",
|
|
37
|
+
"prepack": "npm run validate:hardware-selection-snapshot && node tools/sync-hardware-selection.mjs --check --strict && node tools/sync-clarify.mjs --check"
|
|
38
|
+
},
|
|
39
|
+
"license": "MIT"
|
|
40
|
+
}
|