aether-colony 3.1.17 → 5.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.aether/aether-utils.sh +5354 -0
- package/.aether/agents-claude/aether-ambassador.md +265 -0
- package/.aether/agents-claude/aether-archaeologist.md +327 -0
- package/.aether/agents-claude/aether-architect.md +236 -0
- package/.aether/agents-claude/aether-auditor.md +271 -0
- package/.aether/agents-claude/aether-builder.md +224 -0
- package/.aether/agents-claude/aether-chaos.md +269 -0
- package/.aether/agents-claude/aether-chronicler.md +305 -0
- package/.aether/agents-claude/aether-gatekeeper.md +330 -0
- package/.aether/agents-claude/aether-includer.md +374 -0
- package/.aether/agents-claude/aether-keeper.md +272 -0
- package/.aether/agents-claude/aether-measurer.md +322 -0
- package/.aether/agents-claude/aether-oracle.md +237 -0
- package/.aether/agents-claude/aether-probe.md +211 -0
- package/.aether/agents-claude/aether-queen.md +330 -0
- package/.aether/agents-claude/aether-route-setter.md +178 -0
- package/.aether/agents-claude/aether-sage.md +418 -0
- package/.aether/agents-claude/aether-scout.md +179 -0
- package/.aether/agents-claude/aether-surveyor-disciplines.md +417 -0
- package/.aether/agents-claude/aether-surveyor-nest.md +355 -0
- package/.aether/agents-claude/aether-surveyor-pathogens.md +289 -0
- package/.aether/agents-claude/aether-surveyor-provisions.md +360 -0
- package/.aether/agents-claude/aether-tracker.md +270 -0
- package/.aether/agents-claude/aether-watcher.md +280 -0
- package/.aether/agents-claude/aether-weaver.md +248 -0
- package/.aether/commands/archaeology.yaml +653 -0
- package/.aether/commands/build.yaml +1221 -0
- package/.aether/commands/chaos.yaml +653 -0
- package/.aether/commands/colonize.yaml +438 -0
- package/.aether/commands/continue.yaml +1484 -0
- package/.aether/commands/council.yaml +304 -0
- package/.aether/commands/data-clean.yaml +80 -0
- package/.aether/commands/dream.yaml +275 -0
- package/.aether/commands/entomb.yaml +863 -0
- package/.aether/commands/export-signals.yaml +64 -0
- package/.aether/commands/feedback.yaml +158 -0
- package/.aether/commands/flag.yaml +160 -0
- package/.aether/commands/flags.yaml +177 -0
- package/.aether/commands/focus.yaml +112 -0
- package/.aether/commands/help.yaml +167 -0
- package/.aether/commands/history.yaml +137 -0
- package/.aether/commands/import-signals.yaml +79 -0
- package/.aether/commands/init.yaml +469 -0
- package/.aether/commands/insert-phase.yaml +98 -0
- package/.aether/commands/interpret.yaml +285 -0
- package/.aether/commands/lay-eggs.yaml +224 -0
- package/.aether/commands/maturity.yaml +122 -0
- package/.aether/commands/memory-details.yaml +74 -0
- package/.aether/commands/migrate-state.yaml +174 -0
- package/.aether/commands/oracle.yaml +1224 -0
- package/.aether/commands/organize.yaml +446 -0
- package/.aether/commands/patrol.yaml +621 -0
- package/.aether/commands/pause-colony.yaml +424 -0
- package/.aether/commands/phase.yaml +124 -0
- package/.aether/commands/pheromones.yaml +153 -0
- package/.aether/commands/plan.yaml +1313 -0
- package/.aether/commands/preferences.yaml +63 -0
- package/.aether/commands/redirect.yaml +123 -0
- package/.aether/commands/resume-colony.yaml +373 -0
- package/.aether/commands/resume.yaml +398 -0
- package/.aether/commands/run.yaml +193 -0
- package/.aether/commands/seal.yaml +1205 -0
- package/.aether/commands/skill-create.yaml +337 -0
- package/.aether/commands/status.yaml +364 -0
- package/.aether/commands/swarm.yaml +352 -0
- package/.aether/commands/tunnels.yaml +814 -0
- package/.aether/commands/update.yaml +131 -0
- package/.aether/commands/verify-castes.yaml +159 -0
- package/.aether/commands/watch.yaml +454 -0
- package/.aether/docs/INCIDENT_TEMPLATE.md +32 -0
- package/.aether/docs/QUEEN-SYSTEM.md +211 -0
- package/.aether/docs/README.md +98 -0
- package/.aether/docs/caste-system.md +48 -0
- package/.aether/docs/command-playbooks/README.md +23 -0
- package/.aether/docs/command-playbooks/build-complete.md +349 -0
- package/.aether/docs/command-playbooks/build-context.md +282 -0
- package/.aether/docs/command-playbooks/build-full.md +1682 -0
- package/.aether/docs/command-playbooks/build-prep.md +283 -0
- package/.aether/docs/command-playbooks/build-verify.md +405 -0
- package/.aether/docs/command-playbooks/build-wave.md +749 -0
- package/.aether/docs/command-playbooks/continue-advance.md +524 -0
- package/.aether/docs/command-playbooks/continue-finalize.md +447 -0
- package/.aether/docs/command-playbooks/continue-full.md +1724 -0
- package/.aether/docs/command-playbooks/continue-gates.md +686 -0
- package/.aether/docs/command-playbooks/continue-verify.md +406 -0
- package/.aether/docs/context-continuity.md +84 -0
- package/{runtime → .aether/docs/disciplines}/DISCIPLINES.md +13 -11
- package/.aether/docs/error-codes.md +268 -0
- package/.aether/docs/known-issues.md +94 -0
- package/{runtime → .aether}/docs/pheromones.md +86 -6
- package/.aether/docs/plans/pheromone-display-plan.md +257 -0
- package/.aether/docs/queen-commands.md +98 -0
- package/.aether/docs/source-of-truth-map.md +132 -0
- package/.aether/docs/xml-utilities.md +47 -0
- package/{runtime → .aether}/exchange/pheromone-xml.sh +2 -1
- package/{runtime → .aether}/exchange/registry-xml.sh +7 -3
- package/{runtime → .aether}/exchange/wisdom-xml.sh +11 -4
- package/.aether/rules/aether-colony.md +144 -0
- package/.aether/schemas/example-prompt-builder.xml +234 -0
- package/.aether/scripts/incident-test-add.sh +47 -0
- package/.aether/scripts/weekly-audit.sh +79 -0
- package/.aether/skills/.index.json +649 -0
- package/.aether/skills/colony/.manifest.json +16 -0
- package/.aether/skills/colony/build-discipline/SKILL.md +78 -0
- package/.aether/skills/colony/colony-interaction/SKILL.md +56 -0
- package/.aether/skills/colony/colony-lifecycle/SKILL.md +77 -0
- package/.aether/skills/colony/colony-visuals/SKILL.md +112 -0
- package/.aether/skills/colony/context-management/SKILL.md +80 -0
- package/.aether/skills/colony/error-presentation/SKILL.md +99 -0
- package/.aether/skills/colony/pheromone-protocol/SKILL.md +79 -0
- package/.aether/skills/colony/pheromone-visibility/SKILL.md +81 -0
- package/.aether/skills/colony/state-safety/SKILL.md +84 -0
- package/.aether/skills/colony/worker-priming/SKILL.md +82 -0
- package/.aether/skills/domain/.manifest.json +24 -0
- package/.aether/skills/domain/README.md +33 -0
- package/.aether/skills/domain/django/SKILL.md +49 -0
- package/.aether/skills/domain/docker/SKILL.md +52 -0
- package/.aether/skills/domain/golang/SKILL.md +52 -0
- package/.aether/skills/domain/graphql/SKILL.md +51 -0
- package/.aether/skills/domain/html-css/SKILL.md +48 -0
- package/.aether/skills/domain/nextjs/SKILL.md +45 -0
- package/.aether/skills/domain/nodejs/SKILL.md +53 -0
- package/.aether/skills/domain/postgresql/SKILL.md +53 -0
- package/.aether/skills/domain/prisma/SKILL.md +59 -0
- package/.aether/skills/domain/python/SKILL.md +50 -0
- package/.aether/skills/domain/rails/SKILL.md +52 -0
- package/.aether/skills/domain/react/SKILL.md +45 -0
- package/.aether/skills/domain/rest-api/SKILL.md +58 -0
- package/.aether/skills/domain/svelte/SKILL.md +47 -0
- package/.aether/skills/domain/tailwind/SKILL.md +45 -0
- package/.aether/skills/domain/testing/SKILL.md +53 -0
- package/.aether/skills/domain/typescript/SKILL.md +58 -0
- package/.aether/skills/domain/vue/SKILL.md +49 -0
- package/.aether/templates/QUEEN.md.template +61 -0
- package/.aether/templates/colony-state-reset.jq.template +23 -0
- package/.aether/templates/colony-state.template.json +39 -0
- package/.aether/templates/constraints.template.json +9 -0
- package/.aether/templates/crowned-anthill.template.md +36 -0
- package/.aether/templates/handoff-build-error.template.md +30 -0
- package/.aether/templates/handoff-build-success.template.md +39 -0
- package/.aether/templates/handoff.template.md +40 -0
- package/.aether/templates/learning-observations.template.json +6 -0
- package/.aether/templates/midden.template.json +13 -0
- package/.aether/templates/pheromones.template.json +6 -0
- package/.aether/templates/session.template.json +9 -0
- package/{runtime → .aether}/utils/atomic-write.sh +68 -22
- package/{runtime → .aether}/utils/chamber-compare.sh +23 -10
- package/.aether/utils/chamber-utils.sh +440 -0
- package/.aether/utils/emoji-audit.sh +166 -0
- package/{runtime → .aether}/utils/error-handler.sh +34 -8
- package/.aether/utils/file-lock.sh +313 -0
- package/.aether/utils/flag.sh +267 -0
- package/.aether/utils/hive.sh +572 -0
- package/.aether/utils/learning.sh +1928 -0
- package/.aether/utils/midden.sh +342 -0
- package/.aether/utils/oracle/oracle.md +168 -0
- package/.aether/utils/oracle/oracle.sh +1023 -0
- package/.aether/utils/pheromone.sh +2029 -0
- package/.aether/utils/queen.sh +1698 -0
- package/.aether/utils/scan.sh +860 -0
- package/.aether/utils/semantic-cli.sh +415 -0
- package/.aether/utils/session.sh +552 -0
- package/.aether/utils/skills.sh +509 -0
- package/.aether/utils/spawn-tree.sh +260 -0
- package/.aether/utils/spawn.sh +260 -0
- package/.aether/utils/state-api.sh +199 -0
- package/{runtime → .aether}/utils/state-loader.sh +8 -6
- package/.aether/utils/suggest.sh +611 -0
- package/{runtime → .aether}/utils/swarm-display.sh +10 -1
- package/.aether/utils/swarm.sh +1004 -0
- package/{runtime → .aether}/utils/watch-spawn-tree.sh +11 -2
- package/{runtime → .aether}/utils/xml-compose.sh +9 -3
- package/.aether/utils/xml-convert.sh +277 -0
- package/{runtime → .aether}/utils/xml-core.sh +5 -9
- package/.aether/utils/xml-query.sh +201 -0
- package/.aether/utils/xml-utils.sh +110 -0
- package/{runtime → .aether}/workers.md +97 -81
- package/.claude/agents/ant/aether-ambassador.md +265 -0
- package/.claude/agents/ant/aether-archaeologist.md +327 -0
- package/.claude/agents/ant/aether-architect.md +236 -0
- package/.claude/agents/ant/aether-auditor.md +271 -0
- package/.claude/agents/ant/aether-builder.md +224 -0
- package/.claude/agents/ant/aether-chaos.md +269 -0
- package/.claude/agents/ant/aether-chronicler.md +305 -0
- package/.claude/agents/ant/aether-gatekeeper.md +330 -0
- package/.claude/agents/ant/aether-includer.md +374 -0
- package/.claude/agents/ant/aether-keeper.md +272 -0
- package/.claude/agents/ant/aether-measurer.md +322 -0
- package/.claude/agents/ant/aether-oracle.md +237 -0
- package/.claude/agents/ant/aether-probe.md +211 -0
- package/.claude/agents/ant/aether-queen.md +330 -0
- package/.claude/agents/ant/aether-route-setter.md +178 -0
- package/.claude/agents/ant/aether-sage.md +418 -0
- package/.claude/agents/ant/aether-scout.md +179 -0
- package/.claude/agents/ant/aether-surveyor-disciplines.md +417 -0
- package/.claude/agents/ant/aether-surveyor-nest.md +355 -0
- package/.claude/agents/ant/aether-surveyor-pathogens.md +289 -0
- package/.claude/agents/ant/aether-surveyor-provisions.md +360 -0
- package/.claude/agents/ant/aether-tracker.md +270 -0
- package/.claude/agents/ant/aether-watcher.md +280 -0
- package/.claude/agents/ant/aether-weaver.md +248 -0
- package/.claude/commands/ant/archaeology.md +16 -14
- package/.claude/commands/ant/build.md +43 -1028
- package/.claude/commands/ant/chaos.md +19 -23
- package/.claude/commands/ant/colonize.md +52 -31
- package/.claude/commands/ant/continue.md +40 -1016
- package/.claude/commands/ant/council.md +21 -18
- package/.claude/commands/ant/data-clean.md +81 -0
- package/.claude/commands/ant/dream.md +27 -15
- package/.claude/commands/ant/entomb.md +317 -225
- package/.claude/commands/ant/export-signals.md +57 -0
- package/.claude/commands/ant/feedback.md +48 -26
- package/.claude/commands/ant/flag.md +30 -10
- package/.claude/commands/ant/flags.md +34 -12
- package/.claude/commands/ant/focus.md +45 -19
- package/.claude/commands/ant/help.md +50 -8
- package/.claude/commands/ant/history.md +13 -0
- package/.claude/commands/ant/import-signals.md +71 -0
- package/.claude/commands/ant/init.md +345 -194
- package/.claude/commands/ant/insert-phase.md +101 -0
- package/.claude/commands/ant/interpret.md +26 -4
- package/.claude/commands/ant/lay-eggs.md +184 -127
- package/.claude/commands/ant/maturity.md +32 -11
- package/.claude/commands/ant/memory-details.md +77 -0
- package/.claude/commands/ant/migrate-state.md +20 -2
- package/.claude/commands/ant/oracle.md +337 -74
- package/.claude/commands/ant/organize.md +39 -25
- package/.claude/commands/ant/patrol.md +620 -0
- package/.claude/commands/ant/pause-colony.md +23 -27
- package/.claude/commands/ant/phase.md +40 -42
- package/.claude/commands/ant/pheromones.md +156 -0
- package/.claude/commands/ant/plan.md +185 -51
- package/.claude/commands/ant/preferences.md +65 -0
- package/.claude/commands/ant/redirect.md +45 -30
- package/.claude/commands/ant/resume-colony.md +51 -27
- package/.claude/commands/ant/resume.md +314 -94
- package/.claude/commands/ant/run.md +195 -0
- package/.claude/commands/ant/seal.md +650 -221
- package/.claude/commands/ant/skill-create.md +286 -0
- package/.claude/commands/ant/status.md +196 -31
- package/.claude/commands/ant/swarm.md +16 -46
- package/.claude/commands/ant/tunnels.md +280 -105
- package/.claude/commands/ant/update.md +73 -89
- package/.claude/commands/ant/verify-castes.md +100 -42
- package/.claude/commands/ant/watch.md +14 -12
- package/.opencode/agents/aether-ambassador.md +63 -20
- package/.opencode/agents/aether-archaeologist.md +29 -12
- package/.opencode/agents/aether-architect.md +103 -36
- package/.opencode/agents/aether-auditor.md +51 -18
- package/.opencode/agents/aether-builder.md +70 -20
- package/.opencode/agents/aether-chaos.md +29 -12
- package/.opencode/agents/aether-chronicler.md +60 -18
- package/.opencode/agents/aether-gatekeeper.md +27 -18
- package/.opencode/agents/aether-includer.md +27 -18
- package/.opencode/agents/aether-keeper.md +89 -18
- package/.opencode/agents/aether-measurer.md +27 -18
- package/.opencode/agents/aether-oracle.md +137 -0
- package/.opencode/agents/aether-probe.md +60 -18
- package/.opencode/agents/aether-queen.md +172 -24
- package/.opencode/agents/aether-route-setter.md +57 -12
- package/.opencode/agents/aether-sage.md +26 -18
- package/.opencode/agents/aether-scout.md +28 -20
- package/.opencode/agents/aether-surveyor-disciplines.md +59 -2
- package/.opencode/agents/aether-surveyor-nest.md +59 -2
- package/.opencode/agents/aether-surveyor-pathogens.md +57 -2
- package/.opencode/agents/aether-surveyor-provisions.md +59 -2
- package/.opencode/agents/aether-tracker.md +64 -18
- package/.opencode/agents/aether-watcher.md +66 -19
- package/.opencode/agents/aether-weaver.md +61 -18
- package/.opencode/commands/ant/archaeology.md +7 -14
- package/.opencode/commands/ant/build.md +437 -257
- package/.opencode/commands/ant/chaos.md +7 -24
- package/.opencode/commands/ant/colonize.md +8 -17
- package/.opencode/commands/ant/continue.md +661 -142
- package/.opencode/commands/ant/council.md +11 -22
- package/.opencode/commands/ant/data-clean.md +77 -0
- package/.opencode/commands/ant/dream.md +15 -17
- package/.opencode/commands/ant/entomb.md +133 -62
- package/.opencode/commands/ant/export-signals.md +54 -0
- package/.opencode/commands/ant/feedback.md +24 -5
- package/.opencode/commands/ant/flag.md +16 -4
- package/.opencode/commands/ant/flags.md +24 -10
- package/.opencode/commands/ant/focus.md +22 -5
- package/.opencode/commands/ant/help.md +41 -8
- package/.opencode/commands/ant/history.md +9 -0
- package/.opencode/commands/ant/import-signals.md +68 -0
- package/.opencode/commands/ant/init.md +374 -167
- package/.opencode/commands/ant/insert-phase.md +107 -0
- package/.opencode/commands/ant/interpret.md +16 -0
- package/.opencode/commands/ant/lay-eggs.md +184 -112
- package/.opencode/commands/ant/maturity.md +18 -2
- package/.opencode/commands/ant/memory-details.md +83 -0
- package/.opencode/commands/ant/migrate-state.md +12 -0
- package/.opencode/commands/ant/oracle.md +322 -67
- package/.opencode/commands/ant/organize.md +18 -16
- package/.opencode/commands/ant/patrol.md +626 -0
- package/.opencode/commands/ant/pause-colony.md +12 -29
- package/.opencode/commands/ant/phase.md +30 -40
- package/.opencode/commands/ant/pheromones.md +162 -0
- package/.opencode/commands/ant/plan.md +184 -56
- package/.opencode/commands/ant/preferences.md +71 -0
- package/.opencode/commands/ant/redirect.md +22 -5
- package/.opencode/commands/ant/resume-colony.md +38 -27
- package/.opencode/commands/ant/resume.md +385 -0
- package/.opencode/commands/ant/run.md +201 -0
- package/.opencode/commands/ant/seal.md +259 -45
- package/.opencode/commands/ant/skill-create.md +63 -0
- package/.opencode/commands/ant/status.md +135 -31
- package/.opencode/commands/ant/swarm.md +3 -345
- package/.opencode/commands/ant/tunnels.md +152 -9
- package/.opencode/commands/ant/update.md +70 -91
- package/.opencode/commands/ant/verify-castes.md +96 -42
- package/.opencode/commands/ant/watch.md +7 -0
- package/CHANGELOG.md +356 -0
- package/README.md +203 -573
- package/bin/cli.js +455 -527
- package/bin/generate-commands.js +186 -0
- package/bin/generate-commands.sh +127 -88
- package/bin/lib/init.js +13 -3
- package/bin/lib/spawn-logger.js +0 -15
- package/bin/lib/update-transaction.js +392 -140
- package/bin/npx-install.js +178 -0
- package/bin/sync-to-runtime.sh +5 -137
- package/bin/validate-package.sh +166 -0
- package/package.json +14 -7
- package/.opencode/agents/aether-guardian.md +0 -107
- package/.opencode/agents/workers.md +0 -1034
- package/bin/lib/model-profiles.js +0 -445
- package/bin/lib/model-verify.js +0 -288
- package/bin/lib/proxy-health.js +0 -253
- package/bin/lib/telemetry.js +0 -441
- package/runtime/CONTEXT.md +0 -160
- package/runtime/QUEEN_ANT_ARCHITECTURE.md +0 -402
- package/runtime/aether-utils.sh +0 -3879
- package/runtime/data/signatures.json +0 -41
- package/runtime/docs/AETHER-2.0-IMPLEMENTATION-PLAN.md +0 -1343
- package/runtime/docs/AETHER-PHEROMONE-SYSTEM-MASTER-SPEC.md +0 -2642
- package/runtime/docs/PHEROMONE-INJECTION.md +0 -240
- package/runtime/docs/PHEROMONE-INTEGRATION.md +0 -192
- package/runtime/docs/PHEROMONE-SYSTEM-DESIGN.md +0 -426
- package/runtime/docs/README.md +0 -94
- package/runtime/docs/VISUAL-OUTPUT-SPEC.md +0 -219
- package/runtime/docs/biological-reference.md +0 -272
- package/runtime/docs/codebase-review.md +0 -399
- package/runtime/docs/command-sync.md +0 -164
- package/runtime/docs/constraints.md +0 -116
- package/runtime/docs/implementation-learnings.md +0 -89
- package/runtime/docs/known-issues.md +0 -217
- package/runtime/docs/namespace.md +0 -148
- package/runtime/docs/pathogen-schema-example.json +0 -36
- package/runtime/docs/pathogen-schema.md +0 -111
- package/runtime/docs/planning-discipline.md +0 -159
- package/runtime/docs/progressive-disclosure.md +0 -184
- package/runtime/lib/queen-utils.sh +0 -729
- package/runtime/model-profiles.yaml +0 -100
- package/runtime/planning.md +0 -159
- package/runtime/recover.sh +0 -136
- package/runtime/templates/QUEEN.md.template +0 -79
- package/runtime/utils/chamber-utils.sh +0 -285
- package/runtime/utils/file-lock.sh +0 -122
- package/runtime/utils/spawn-tree.sh +0 -428
- package/runtime/utils/spawn-with-model.sh +0 -56
- package/runtime/utils/xml-utils.sh +0 -2196
- package/runtime/workers-new-castes.md +0 -516
- /package/{runtime → .aether/docs/disciplines}/coding-standards.md +0 -0
- /package/{runtime → .aether/docs/disciplines}/debugging.md +0 -0
- /package/{runtime → .aether/docs/disciplines}/learning.md +0 -0
- /package/{runtime → .aether/docs/disciplines}/tdd.md +0 -0
- /package/{runtime → .aether/docs/disciplines}/verification-loop.md +0 -0
- /package/{runtime → .aether/docs/disciplines}/verification.md +0 -0
- /package/{runtime → .aether}/schemas/aether-types.xsd +0 -0
- /package/{runtime → .aether}/schemas/colony-registry.xsd +0 -0
- /package/{runtime → .aether}/schemas/pheromone.xsd +0 -0
- /package/{runtime → .aether}/schemas/prompt.xsd +0 -0
- /package/{runtime → .aether}/schemas/queen-wisdom.xsd +0 -0
- /package/{runtime → .aether}/schemas/worker-priming.xsd +0 -0
- /package/{runtime → .aether}/utils/colorize-log.sh +0 -0
- /package/{runtime → .aether}/utils/queen-to-md.xsl +0 -0
|
@@ -1,285 +0,0 @@
|
|
|
1
|
-
#!/bin/bash
|
|
2
|
-
# Aether Chamber Utilities
|
|
3
|
-
# Manages entombed colonies — directory management, manifest generation, integrity verification
|
|
4
|
-
#
|
|
5
|
-
# Usage:
|
|
6
|
-
# source .aether/utils/chamber-utils.sh
|
|
7
|
-
# chamber_create <chamber_dir> <state_file> <goal> <phases_completed> <total_phases> <milestone> <version> <decisions_json> <learnings_json>
|
|
8
|
-
# chamber_verify <chamber_dir>
|
|
9
|
-
# chamber_list <chambers_root>
|
|
10
|
-
# chamber_sanitize_goal <goal>
|
|
11
|
-
|
|
12
|
-
set -euo pipefail
|
|
13
|
-
|
|
14
|
-
# Initialize lock state before sourcing (file-lock.sh trap needs these)
|
|
15
|
-
LOCK_ACQUIRED=${LOCK_ACQUIRED:-false}
|
|
16
|
-
CURRENT_LOCK=${CURRENT_LOCK:-""}
|
|
17
|
-
|
|
18
|
-
# Get script directory for sourcing (preserve parent SCRIPT_DIR if set)
|
|
19
|
-
__chamber_utils_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
20
|
-
AETHER_ROOT="$(cd "$__chamber_utils_dir/../.." && pwd 2>/dev/null || echo "$__chamber_utils_dir/../..")"
|
|
21
|
-
|
|
22
|
-
# Use parent SCRIPT_DIR if available, otherwise use local
|
|
23
|
-
SCRIPT_DIR="${SCRIPT_DIR:-$__chamber_utils_dir}"
|
|
24
|
-
|
|
25
|
-
# Source atomic-write for safe file operations
|
|
26
|
-
[[ -f "$SCRIPT_DIR/atomic-write.sh" ]] && source "$SCRIPT_DIR/atomic-write.sh"
|
|
27
|
-
|
|
28
|
-
# --- JSON output helpers ---
|
|
29
|
-
json_ok() { printf '{"ok":true,"result":%s}\n' "$1"; }
|
|
30
|
-
json_err() {
|
|
31
|
-
local message="${2:-$1}"
|
|
32
|
-
printf '{"ok":false,"error":"%s"}\n' "$message" >&2
|
|
33
|
-
exit 1
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
# --- Chamber Functions ---
|
|
37
|
-
|
|
38
|
-
# Sanitize goal string for use in directory names
|
|
39
|
-
# Converts to lowercase, replaces spaces/special chars with hyphens, removes non-alphanumeric
|
|
40
|
-
chamber_sanitize_goal() {
|
|
41
|
-
local goal="$1"
|
|
42
|
-
# Convert to lowercase, replace spaces and special chars with hyphens
|
|
43
|
-
local sanitized=$(echo "$goal" | tr '[:upper:]' '[:lower:]' | tr -cs '[:alnum:]' '-')
|
|
44
|
-
# Remove leading/trailing hyphens
|
|
45
|
-
sanitized=$(echo "$sanitized" | sed 's/^-//;s/-$//')
|
|
46
|
-
# Limit length to avoid overly long directory names
|
|
47
|
-
if [[ ${#sanitized} -gt 50 ]]; then
|
|
48
|
-
sanitized="${sanitized:0:50}"
|
|
49
|
-
fi
|
|
50
|
-
echo "$sanitized"
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
# Compute SHA256 hash of a file
|
|
54
|
-
# Returns hash string or empty on error
|
|
55
|
-
chamber_compute_hash() {
|
|
56
|
-
local file_path="$1"
|
|
57
|
-
if [[ ! -f "$file_path" ]]; then
|
|
58
|
-
echo ""
|
|
59
|
-
return 1
|
|
60
|
-
fi
|
|
61
|
-
|
|
62
|
-
# Try sha256sum first (Linux), then shasum -a 256 (macOS)
|
|
63
|
-
if command -v sha256sum >/dev/null 2>&1; then
|
|
64
|
-
sha256sum "$file_path" | cut -d' ' -f1
|
|
65
|
-
elif command -v shasum >/dev/null 2>&1; then
|
|
66
|
-
shasum -a 256 "$file_path" | cut -d' ' -f1
|
|
67
|
-
else
|
|
68
|
-
echo ""
|
|
69
|
-
return 1
|
|
70
|
-
fi
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
# Create a new chamber (entomb a colony)
|
|
74
|
-
# Arguments:
|
|
75
|
-
# chamber_dir: Directory to create for this chamber
|
|
76
|
-
# state_file: Path to COLONY_STATE.json to archive
|
|
77
|
-
# goal: Colony goal string
|
|
78
|
-
# phases_completed: Number of completed phases
|
|
79
|
-
# total_phases: Total number of phases
|
|
80
|
-
# milestone: Milestone name
|
|
81
|
-
# version: Version string
|
|
82
|
-
# decisions_json: JSON array of decisions
|
|
83
|
-
# learnings_json: JSON array of learnings
|
|
84
|
-
chamber_create() {
|
|
85
|
-
local chamber_dir="$1"
|
|
86
|
-
local state_file="$2"
|
|
87
|
-
local goal="$3"
|
|
88
|
-
local phases_completed="$4"
|
|
89
|
-
local total_phases="$5"
|
|
90
|
-
local milestone="$6"
|
|
91
|
-
local version="$7"
|
|
92
|
-
local decisions_json="$8"
|
|
93
|
-
local learnings_json="$9"
|
|
94
|
-
|
|
95
|
-
# Validate inputs
|
|
96
|
-
[[ -z "$chamber_dir" ]] && json_err "chamber_dir is required"
|
|
97
|
-
[[ -z "$state_file" ]] && json_err "state_file is required"
|
|
98
|
-
[[ ! -f "$state_file" ]] && json_err "State file not found: $state_file"
|
|
99
|
-
|
|
100
|
-
# Create chamber directory
|
|
101
|
-
mkdir -p "$chamber_dir" || json_err "Failed to create chamber directory: $chamber_dir"
|
|
102
|
-
|
|
103
|
-
# Copy state file to chamber
|
|
104
|
-
local target_state="$chamber_dir/COLONY_STATE.json"
|
|
105
|
-
cp "$state_file" "$target_state" || json_err "Failed to copy state file"
|
|
106
|
-
|
|
107
|
-
# Compute hash of the copied state file
|
|
108
|
-
local state_hash=$(chamber_compute_hash "$target_state")
|
|
109
|
-
[[ -z "$state_hash" ]] && json_err "Failed to compute hash of state file"
|
|
110
|
-
|
|
111
|
-
# Generate timestamp
|
|
112
|
-
local entombed_at=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
|
|
113
|
-
|
|
114
|
-
# Create manifest.json
|
|
115
|
-
local manifest_file="$chamber_dir/manifest.json"
|
|
116
|
-
local manifest_content=$(cat <<EOF
|
|
117
|
-
{
|
|
118
|
-
"entombed_at": "$entombed_at",
|
|
119
|
-
"goal": $(echo "$goal" | jq -Rs '.[:-1]'),
|
|
120
|
-
"phases_completed": $phases_completed,
|
|
121
|
-
"total_phases": $total_phases,
|
|
122
|
-
"milestone": $(echo "$milestone" | jq -Rs '.[:-1]'),
|
|
123
|
-
"version": $(echo "$version" | jq -Rs '.[:-1]'),
|
|
124
|
-
"decisions": $decisions_json,
|
|
125
|
-
"learnings": $learnings_json,
|
|
126
|
-
"files": {
|
|
127
|
-
"COLONY_STATE.json": "$state_hash"
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
EOF
|
|
131
|
-
)
|
|
132
|
-
|
|
133
|
-
# Write manifest atomically if atomic_write is available, otherwise direct
|
|
134
|
-
if type atomic_write &>/dev/null; then
|
|
135
|
-
atomic_write "$manifest_file" "$manifest_content" || json_err "Failed to write manifest"
|
|
136
|
-
else
|
|
137
|
-
echo "$manifest_content" > "$manifest_file" || json_err "Failed to write manifest"
|
|
138
|
-
fi
|
|
139
|
-
|
|
140
|
-
# Verify the manifest was written correctly
|
|
141
|
-
if [[ ! -f "$manifest_file" ]]; then
|
|
142
|
-
json_err "Manifest file not created"
|
|
143
|
-
fi
|
|
144
|
-
|
|
145
|
-
# Return success with chamber info
|
|
146
|
-
local result=$(cat <<EOF
|
|
147
|
-
{
|
|
148
|
-
"chamber_dir": "$chamber_dir",
|
|
149
|
-
"manifest": {
|
|
150
|
-
"entombed_at": "$entombed_at",
|
|
151
|
-
"goal": $(echo "$goal" | jq -Rs '.[:-1]'),
|
|
152
|
-
"phases_completed": $phases_completed,
|
|
153
|
-
"total_phases": $total_phases,
|
|
154
|
-
"milestone": $(echo "$milestone" | jq -Rs '.[:-1]'),
|
|
155
|
-
"version": $(echo "$version" | jq -Rs '.[:-1]')
|
|
156
|
-
}
|
|
157
|
-
}
|
|
158
|
-
EOF
|
|
159
|
-
)
|
|
160
|
-
|
|
161
|
-
json_ok "$result"
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
# Verify chamber integrity
|
|
165
|
-
# Arguments:
|
|
166
|
-
# chamber_dir: Directory containing the chamber
|
|
167
|
-
chamber_verify() {
|
|
168
|
-
local chamber_dir="$1"
|
|
169
|
-
|
|
170
|
-
# Validate inputs
|
|
171
|
-
[[ -z "$chamber_dir" ]] && json_err "chamber_dir is required"
|
|
172
|
-
[[ ! -d "$chamber_dir" ]] && json_err "Chamber directory not found: $chamber_dir"
|
|
173
|
-
|
|
174
|
-
local manifest_file="$chamber_dir/manifest.json"
|
|
175
|
-
local state_file="$chamber_dir/COLONY_STATE.json"
|
|
176
|
-
|
|
177
|
-
# Check required files exist
|
|
178
|
-
[[ ! -f "$manifest_file" ]] && json_err "Manifest not found in chamber"
|
|
179
|
-
[[ ! -f "$state_file" ]] && json_err "COLONY_STATE.json not found in chamber"
|
|
180
|
-
|
|
181
|
-
# Read stored hash from manifest
|
|
182
|
-
local stored_hash=$(jq -r '.files["COLONY_STATE.json"] // empty' "$manifest_file" 2>/dev/null)
|
|
183
|
-
[[ -z "$stored_hash" ]] && json_err "No hash found in manifest for COLONY_STATE.json"
|
|
184
|
-
|
|
185
|
-
# Compute current hash
|
|
186
|
-
local current_hash=$(chamber_compute_hash "$state_file")
|
|
187
|
-
[[ -z "$current_hash" ]] && json_err "Failed to compute hash of state file"
|
|
188
|
-
|
|
189
|
-
# Compare hashes
|
|
190
|
-
if [[ "$stored_hash" != "$current_hash" ]]; then
|
|
191
|
-
local result=$(cat <<EOF
|
|
192
|
-
{
|
|
193
|
-
"verified": false,
|
|
194
|
-
"chamber_dir": "$chamber_dir",
|
|
195
|
-
"error": "hash mismatch",
|
|
196
|
-
"stored_hash": "$stored_hash",
|
|
197
|
-
"current_hash": "$current_hash"
|
|
198
|
-
}
|
|
199
|
-
EOF
|
|
200
|
-
)
|
|
201
|
-
json_ok "$result"
|
|
202
|
-
return 0
|
|
203
|
-
fi
|
|
204
|
-
|
|
205
|
-
# Verification passed
|
|
206
|
-
local result=$(cat <<EOF
|
|
207
|
-
{
|
|
208
|
-
"verified": true,
|
|
209
|
-
"chamber_dir": "$chamber_dir",
|
|
210
|
-
"hash": "$current_hash"
|
|
211
|
-
}
|
|
212
|
-
EOF
|
|
213
|
-
)
|
|
214
|
-
|
|
215
|
-
json_ok "$result"
|
|
216
|
-
}
|
|
217
|
-
|
|
218
|
-
# List all chambers
|
|
219
|
-
# Arguments:
|
|
220
|
-
# chambers_root: Root directory containing chambers (default: .aether/chambers/)
|
|
221
|
-
chamber_list() {
|
|
222
|
-
local chambers_root="${1:-$AETHER_ROOT/.aether/chambers}"
|
|
223
|
-
|
|
224
|
-
# Default to current directory's chambers if AETHER_ROOT not set
|
|
225
|
-
if [[ -z "$chambers_root" || "$chambers_root" == "/.aether/chambers" ]]; then
|
|
226
|
-
chambers_root="$(pwd)/.aether/chambers"
|
|
227
|
-
fi
|
|
228
|
-
|
|
229
|
-
# Check if chambers directory exists
|
|
230
|
-
if [[ ! -d "$chambers_root" ]]; then
|
|
231
|
-
json_ok "[]"
|
|
232
|
-
return 0
|
|
233
|
-
fi
|
|
234
|
-
|
|
235
|
-
# Build array of chamber summaries
|
|
236
|
-
local chambers="["
|
|
237
|
-
local first=true
|
|
238
|
-
|
|
239
|
-
# Find all directories in chambers_root
|
|
240
|
-
while IFS= read -r -d '' chamber_dir; do
|
|
241
|
-
local chamber_name=$(basename "$chamber_dir")
|
|
242
|
-
local manifest_file="$chamber_dir/manifest.json"
|
|
243
|
-
|
|
244
|
-
# Skip if no manifest
|
|
245
|
-
[[ ! -f "$manifest_file" ]] && continue
|
|
246
|
-
|
|
247
|
-
# Read manifest fields
|
|
248
|
-
local goal=$(jq -r '.goal // "unknown"' "$manifest_file" 2>/dev/null)
|
|
249
|
-
local milestone=$(jq -r '.milestone // "unknown"' "$manifest_file" 2>/dev/null)
|
|
250
|
-
local phases_completed=$(jq -r '.phases_completed // 0' "$manifest_file" 2>/dev/null)
|
|
251
|
-
local entombed_at=$(jq -r '.entombed_at // ""' "$manifest_file" 2>/dev/null)
|
|
252
|
-
|
|
253
|
-
# Escape for JSON
|
|
254
|
-
goal=$(echo "$goal" | jq -Rs '.[:-1]')
|
|
255
|
-
milestone=$(echo "$milestone" | jq -Rs '.[:-1]')
|
|
256
|
-
|
|
257
|
-
# Add comma if not first
|
|
258
|
-
if [[ "$first" == "true" ]]; then
|
|
259
|
-
first=false
|
|
260
|
-
else
|
|
261
|
-
chambers+=","
|
|
262
|
-
fi
|
|
263
|
-
|
|
264
|
-
chambers+=$(cat <<EOF
|
|
265
|
-
{
|
|
266
|
-
"name": $(echo "$chamber_name" | jq -Rs '.[:-1]'),
|
|
267
|
-
"goal": $goal,
|
|
268
|
-
"milestone": $milestone,
|
|
269
|
-
"phases_completed": $phases_completed,
|
|
270
|
-
"entombed_at": $(echo "$entombed_at" | jq -Rs '.[:-1]')
|
|
271
|
-
}
|
|
272
|
-
EOF
|
|
273
|
-
)
|
|
274
|
-
done < <(find "$chambers_root" -mindepth 1 -maxdepth 1 -type d -print0 2>/dev/null || true)
|
|
275
|
-
|
|
276
|
-
chambers+="]"
|
|
277
|
-
|
|
278
|
-
# Sort by entombed_at descending using jq
|
|
279
|
-
local sorted=$(echo "$chambers" | jq 'sort_by(.entombed_at) | reverse')
|
|
280
|
-
|
|
281
|
-
json_ok "$sorted"
|
|
282
|
-
}
|
|
283
|
-
|
|
284
|
-
# Export functions for use in other scripts
|
|
285
|
-
export -f chamber_sanitize_goal chamber_compute_hash chamber_create chamber_verify chamber_list
|
|
@@ -1,122 +0,0 @@
|
|
|
1
|
-
#!/bin/bash
|
|
2
|
-
# Aether File Lock Utility
|
|
3
|
-
# Implements file locking for concurrent colony access prevention
|
|
4
|
-
#
|
|
5
|
-
# Usage:
|
|
6
|
-
# source .aether/utils/file-lock.sh
|
|
7
|
-
# acquire_lock /path/to/file.lock
|
|
8
|
-
# # ... critical section ...
|
|
9
|
-
# release_lock /path/to/file.lock
|
|
10
|
-
|
|
11
|
-
# Aether root detection - use git root if available, otherwise use current directory
|
|
12
|
-
if git rev-parse --show-toplevel >/dev/null 2>&1; then
|
|
13
|
-
AETHER_ROOT="$(git rev-parse --show-toplevel)"
|
|
14
|
-
else
|
|
15
|
-
AETHER_ROOT="$(pwd)"
|
|
16
|
-
fi
|
|
17
|
-
|
|
18
|
-
LOCK_DIR="$AETHER_ROOT/.aether/locks"
|
|
19
|
-
LOCK_TIMEOUT=300 # 5 minutes max lock time
|
|
20
|
-
LOCK_RETRY_INTERVAL=0.5 # Wait 500ms between retries
|
|
21
|
-
LOCK_MAX_RETRIES=100 # Total 50 seconds max wait
|
|
22
|
-
|
|
23
|
-
# Create lock directory if it doesn't exist
|
|
24
|
-
mkdir -p "$LOCK_DIR"
|
|
25
|
-
|
|
26
|
-
# Acquire a file lock using flock
|
|
27
|
-
# Arguments: file_path (the resource to lock)
|
|
28
|
-
# Returns: 0 on success, 1 on failure
|
|
29
|
-
# Globals: LOCK_ACQUIRED (set to true when lock acquired)
|
|
30
|
-
acquire_lock() {
|
|
31
|
-
local file_path="$1"
|
|
32
|
-
local lock_file="${LOCK_DIR}/$(basename "$file_path").lock"
|
|
33
|
-
local lock_pid_file="${lock_file}.pid"
|
|
34
|
-
|
|
35
|
-
# Check if lock file exists and is stale
|
|
36
|
-
if [ -f "$lock_file" ]; then
|
|
37
|
-
local lock_pid=$(cat "$lock_pid_file" 2>/dev/null || echo "")
|
|
38
|
-
if [ -n "$lock_pid" ]; then
|
|
39
|
-
# Check if process is still running
|
|
40
|
-
if ! kill -0 "$lock_pid" 2>/dev/null; then
|
|
41
|
-
echo "Lock stale (PID $lock_pid not running), cleaning up..."
|
|
42
|
-
rm -f "$lock_file" "$lock_pid_file"
|
|
43
|
-
fi
|
|
44
|
-
fi
|
|
45
|
-
fi
|
|
46
|
-
|
|
47
|
-
# Try to acquire lock with timeout
|
|
48
|
-
local retry_count=0
|
|
49
|
-
while [ $retry_count -lt $LOCK_MAX_RETRIES ]; do
|
|
50
|
-
# Try to create lock file atomically
|
|
51
|
-
if (set -o noclobber; echo $$ > "$lock_file") 2>/dev/null; then
|
|
52
|
-
echo $$ > "$lock_pid_file"
|
|
53
|
-
export LOCK_ACQUIRED=true
|
|
54
|
-
export CURRENT_LOCK="$lock_file"
|
|
55
|
-
return 0
|
|
56
|
-
fi
|
|
57
|
-
|
|
58
|
-
retry_count=$((retry_count + 1))
|
|
59
|
-
if [ $retry_count -lt $LOCK_MAX_RETRIES ]; then
|
|
60
|
-
sleep $LOCK_RETRY_INTERVAL
|
|
61
|
-
fi
|
|
62
|
-
done
|
|
63
|
-
|
|
64
|
-
echo "Failed to acquire lock for $file_path after $LOCK_MAX_RETRIES attempts"
|
|
65
|
-
return 1
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
# Release a file lock
|
|
69
|
-
# Arguments: None (uses CURRENT_LOCK from acquire_lock)
|
|
70
|
-
release_lock() {
|
|
71
|
-
if [ "$LOCK_ACQUIRED" = "true" ] && [ -n "$CURRENT_LOCK" ]; then
|
|
72
|
-
rm -f "$CURRENT_LOCK" "${CURRENT_LOCK}.pid"
|
|
73
|
-
export LOCK_ACQUIRED=false
|
|
74
|
-
export CURRENT_LOCK=""
|
|
75
|
-
return 0
|
|
76
|
-
fi
|
|
77
|
-
return 1
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
# Cleanup function for script exit
|
|
81
|
-
cleanup_locks() {
|
|
82
|
-
if [ "$LOCK_ACQUIRED" = "true" ]; then
|
|
83
|
-
release_lock
|
|
84
|
-
fi
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
# Register cleanup on exit
|
|
88
|
-
trap cleanup_locks EXIT TERM INT
|
|
89
|
-
|
|
90
|
-
# Check if a file is currently locked
|
|
91
|
-
is_locked() {
|
|
92
|
-
local file_path="$1"
|
|
93
|
-
local lock_file="${LOCK_DIR}/$(basename "$file_path").lock"
|
|
94
|
-
[ -f "$lock_file" ]
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
# Get PID of process holding lock
|
|
98
|
-
get_lock_holder() {
|
|
99
|
-
local file_path="$1"
|
|
100
|
-
local lock_file="${LOCK_DIR}/$(basename "$file_path").lock.pid"
|
|
101
|
-
cat "$lock_file" 2>/dev/null || echo ""
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
# Wait for lock to be released
|
|
105
|
-
wait_for_lock() {
|
|
106
|
-
local file_path="$1"
|
|
107
|
-
local max_wait=${2:-$LOCK_TIMEOUT}
|
|
108
|
-
local waited=0
|
|
109
|
-
|
|
110
|
-
while is_locked "$file_path" && [ $waited -lt $max_wait ]; do
|
|
111
|
-
sleep 1
|
|
112
|
-
waited=$((waited + 1))
|
|
113
|
-
done
|
|
114
|
-
|
|
115
|
-
if [ $waited -ge $max_wait ]; then
|
|
116
|
-
return 1
|
|
117
|
-
fi
|
|
118
|
-
return 0
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
# Export functions for use in other scripts
|
|
122
|
-
export -f acquire_lock release_lock is_locked get_lock_holder wait_for_lock cleanup_locks
|