aiox-core 5.0.0 → 5.0.2

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.
Files changed (91) hide show
  1. package/.aiox-core/data/entity-registry.yaml +5297 -1814
  2. package/.aiox-core/data/registry-update-log.jsonl +2 -0
  3. package/.aiox-core/development/templates/service-template/README.md.hbs +158 -158
  4. package/.aiox-core/development/templates/service-template/__tests__/index.test.ts.hbs +237 -237
  5. package/.aiox-core/development/templates/service-template/client.ts.hbs +403 -403
  6. package/.aiox-core/development/templates/service-template/errors.ts.hbs +182 -182
  7. package/.aiox-core/development/templates/service-template/index.ts.hbs +120 -120
  8. package/.aiox-core/development/templates/service-template/package.json.hbs +87 -87
  9. package/.aiox-core/development/templates/service-template/types.ts.hbs +145 -145
  10. package/.aiox-core/development/templates/squad-template/LICENSE +21 -21
  11. package/.aiox-core/infrastructure/scripts/tool-resolver.js +4 -4
  12. package/.aiox-core/infrastructure/templates/aiox-sync.yaml.template +182 -182
  13. package/.aiox-core/infrastructure/templates/coderabbit.yaml.template +279 -279
  14. package/.aiox-core/infrastructure/templates/github-workflows/ci.yml.template +169 -169
  15. package/.aiox-core/infrastructure/templates/github-workflows/pr-automation.yml.template +330 -330
  16. package/.aiox-core/infrastructure/templates/github-workflows/release.yml.template +196 -196
  17. package/.aiox-core/infrastructure/templates/gitignore/gitignore-aiox-base.tmpl +63 -63
  18. package/.aiox-core/infrastructure/templates/gitignore/gitignore-brownfield-merge.tmpl +18 -18
  19. package/.aiox-core/infrastructure/templates/gitignore/gitignore-node.tmpl +85 -85
  20. package/.aiox-core/infrastructure/templates/gitignore/gitignore-python.tmpl +145 -145
  21. package/.aiox-core/install-manifest.yaml +58 -58
  22. package/.aiox-core/local-config.yaml.template +71 -71
  23. package/.aiox-core/monitor/hooks/lib/__init__.py +1 -1
  24. package/.aiox-core/monitor/hooks/lib/enrich.py +58 -58
  25. package/.aiox-core/monitor/hooks/lib/send_event.py +47 -47
  26. package/.aiox-core/monitor/hooks/notification.py +29 -29
  27. package/.aiox-core/monitor/hooks/post_tool_use.py +45 -45
  28. package/.aiox-core/monitor/hooks/pre_compact.py +29 -29
  29. package/.aiox-core/monitor/hooks/pre_tool_use.py +40 -40
  30. package/.aiox-core/monitor/hooks/stop.py +29 -29
  31. package/.aiox-core/monitor/hooks/subagent_stop.py +29 -29
  32. package/.aiox-core/monitor/hooks/user_prompt_submit.py +38 -38
  33. package/.aiox-core/product/templates/adr.hbs +125 -125
  34. package/.aiox-core/product/templates/dbdr.hbs +241 -241
  35. package/.aiox-core/product/templates/engine/elicitation.js +2 -3
  36. package/.aiox-core/product/templates/epic.hbs +212 -212
  37. package/.aiox-core/product/templates/pmdr.hbs +186 -186
  38. package/.aiox-core/product/templates/prd-v2.0.hbs +216 -216
  39. package/.aiox-core/product/templates/prd.hbs +201 -201
  40. package/.aiox-core/product/templates/story.hbs +263 -263
  41. package/.aiox-core/product/templates/task.hbs +170 -170
  42. package/.aiox-core/product/templates/tmpl-comment-on-examples.sql +158 -158
  43. package/.aiox-core/product/templates/tmpl-migration-script.sql +91 -91
  44. package/.aiox-core/product/templates/tmpl-rls-granular-policies.sql +104 -104
  45. package/.aiox-core/product/templates/tmpl-rls-kiss-policy.sql +10 -10
  46. package/.aiox-core/product/templates/tmpl-rls-roles.sql +135 -135
  47. package/.aiox-core/product/templates/tmpl-rls-simple.sql +77 -77
  48. package/.aiox-core/product/templates/tmpl-rls-tenant.sql +152 -152
  49. package/.aiox-core/product/templates/tmpl-rollback-script.sql +77 -77
  50. package/.aiox-core/product/templates/tmpl-seed-data.sql +140 -140
  51. package/.aiox-core/product/templates/tmpl-smoke-test.sql +16 -16
  52. package/.aiox-core/product/templates/tmpl-staging-copy-merge.sql +139 -139
  53. package/.aiox-core/product/templates/tmpl-stored-proc.sql +140 -140
  54. package/.aiox-core/product/templates/tmpl-trigger.sql +152 -152
  55. package/.aiox-core/product/templates/tmpl-view-materialized.sql +133 -133
  56. package/.aiox-core/product/templates/tmpl-view.sql +177 -177
  57. package/.aiox-core/scripts/pm.sh +0 -0
  58. package/.claude/hooks/code-intel-pretool.cjs +107 -0
  59. package/.claude/hooks/enforce-architecture-first.py +196 -196
  60. package/.claude/hooks/mind-clone-governance.py +192 -192
  61. package/.claude/hooks/read-protection.py +151 -151
  62. package/.claude/hooks/slug-validation.py +176 -176
  63. package/.claude/hooks/sql-governance.py +182 -182
  64. package/.claude/hooks/write-path-validation.py +194 -194
  65. package/LICENSE +33 -33
  66. package/bin/aiox-graph.js +0 -0
  67. package/bin/aiox-minimal.js +0 -0
  68. package/bin/aiox.js +0 -0
  69. package/docs/guides/aios-workflows/README.md +247 -0
  70. package/docs/guides/aios-workflows/bob-orchestrator-workflow.md +1536 -0
  71. package/package.json +1 -1
  72. package/packages/aiox-install/bin/aiox-install.js +0 -0
  73. package/packages/aiox-install/bin/edmcp.js +0 -0
  74. package/packages/aiox-pro-cli/bin/aiox-pro.js +0 -0
  75. package/packages/installer/src/wizard/pro-setup.js +210 -123
  76. package/pro/README.md +66 -0
  77. package/pro/license/degradation.js +220 -0
  78. package/pro/license/errors.js +450 -0
  79. package/pro/license/feature-gate.js +354 -0
  80. package/pro/license/index.js +181 -0
  81. package/pro/license/license-api.js +679 -0
  82. package/pro/license/license-cache.js +523 -0
  83. package/pro/license/license-crypto.js +303 -0
  84. package/scripts/check-markdown-links.py +352 -352
  85. package/scripts/dashboard-parallel-dev.sh +0 -0
  86. package/scripts/dashboard-parallel-phase3.sh +0 -0
  87. package/scripts/dashboard-parallel-phase4.sh +0 -0
  88. package/scripts/glue/README.md +355 -0
  89. package/scripts/glue/compose-agent-prompt.cjs +362 -0
  90. package/scripts/install-monitor-hooks.sh +0 -0
  91. package/.aiox-core/lib/build.json +0 -1
@@ -1,47 +1,47 @@
1
- #!/usr/bin/env python3
2
- """
3
- Send event to AIOX Monitor server.
4
- Non-blocking with short timeout to avoid slowing Claude.
5
- """
6
-
7
- import json
8
- import os
9
- import time
10
- import urllib.request
11
- from typing import Any
12
-
13
- SERVER_URL = os.environ.get("AIOX_MONITOR_URL", "http://localhost:4001")
14
- TIMEOUT_MS = int(os.environ.get("AIOX_MONITOR_TIMEOUT_MS", "500"))
15
-
16
-
17
- def send_event(event_type: str, data: dict[str, Any]) -> bool:
18
- """
19
- Send event to AIOX Monitor server.
20
-
21
- Args:
22
- event_type: Hook event type (PreToolUse, PostToolUse, etc.)
23
- data: Event data from Claude hook
24
-
25
- Returns:
26
- True if sent successfully, False otherwise
27
- """
28
- try:
29
- payload = json.dumps({
30
- "type": event_type,
31
- "timestamp": int(time.time() * 1000),
32
- "data": data
33
- }).encode("utf-8")
34
-
35
- req = urllib.request.Request(
36
- f"{SERVER_URL}/events",
37
- data=payload,
38
- headers={"Content-Type": "application/json"},
39
- method="POST"
40
- )
41
-
42
- urllib.request.urlopen(req, timeout=TIMEOUT_MS / 1000)
43
- return True
44
-
45
- except Exception:
46
- # Silent fail - never block Claude
47
- return False
1
+ #!/usr/bin/env python3
2
+ """
3
+ Send event to AIOX Monitor server.
4
+ Non-blocking with short timeout to avoid slowing Claude.
5
+ """
6
+
7
+ import json
8
+ import os
9
+ import time
10
+ import urllib.request
11
+ from typing import Any
12
+
13
+ SERVER_URL = os.environ.get("AIOX_MONITOR_URL", "http://localhost:4001")
14
+ TIMEOUT_MS = int(os.environ.get("AIOX_MONITOR_TIMEOUT_MS", "500"))
15
+
16
+
17
+ def send_event(event_type: str, data: dict[str, Any]) -> bool:
18
+ """
19
+ Send event to AIOX Monitor server.
20
+
21
+ Args:
22
+ event_type: Hook event type (PreToolUse, PostToolUse, etc.)
23
+ data: Event data from Claude hook
24
+
25
+ Returns:
26
+ True if sent successfully, False otherwise
27
+ """
28
+ try:
29
+ payload = json.dumps({
30
+ "type": event_type,
31
+ "timestamp": int(time.time() * 1000),
32
+ "data": data
33
+ }).encode("utf-8")
34
+
35
+ req = urllib.request.Request(
36
+ f"{SERVER_URL}/events",
37
+ data=payload,
38
+ headers={"Content-Type": "application/json"},
39
+ method="POST"
40
+ )
41
+
42
+ urllib.request.urlopen(req, timeout=TIMEOUT_MS / 1000)
43
+ return True
44
+
45
+ except Exception:
46
+ # Silent fail - never block Claude
47
+ return False
@@ -1,29 +1,29 @@
1
- #!/usr/bin/env python3
2
- """
3
- Notification hook - captures Claude notifications.
4
- """
5
-
6
- import json
7
- import sys
8
- import os
9
-
10
- # Add lib to path
11
- sys.path.insert(0, os.path.dirname(__file__))
12
-
13
- from lib.send_event import send_event
14
- from lib.enrich import enrich_event
15
-
16
-
17
- def main():
18
- # Read event from stdin
19
- data = json.load(sys.stdin)
20
-
21
- # Enrich with AIOX context
22
- data = enrich_event(data)
23
-
24
- # Send to monitor server
25
- send_event("Notification", data)
26
-
27
-
28
- if __name__ == "__main__":
29
- main()
1
+ #!/usr/bin/env python3
2
+ """
3
+ Notification hook - captures Claude notifications.
4
+ """
5
+
6
+ import json
7
+ import sys
8
+ import os
9
+
10
+ # Add lib to path
11
+ sys.path.insert(0, os.path.dirname(__file__))
12
+
13
+ from lib.send_event import send_event
14
+ from lib.enrich import enrich_event
15
+
16
+
17
+ def main():
18
+ # Read event from stdin
19
+ data = json.load(sys.stdin)
20
+
21
+ # Enrich with AIOX context
22
+ data = enrich_event(data)
23
+
24
+ # Send to monitor server
25
+ send_event("Notification", data)
26
+
27
+
28
+ if __name__ == "__main__":
29
+ main()
@@ -1,45 +1,45 @@
1
- #!/usr/bin/env python3
2
- """
3
- PostToolUse hook - captures tool results after execution.
4
-
5
- This hook runs after Claude executes any tool, capturing the result.
6
- Most important for tracking what actually happened.
7
- """
8
-
9
- import json
10
- import sys
11
- import os
12
-
13
- # Add lib to path
14
- sys.path.insert(0, os.path.dirname(__file__))
15
-
16
- from lib.send_event import send_event
17
- from lib.enrich import enrich_event
18
-
19
-
20
- def main():
21
- # Read event from stdin
22
- data = json.load(sys.stdin)
23
-
24
- # Truncate large fields
25
- if "tool_result" in data:
26
- result = data["tool_result"]
27
- if isinstance(result, str) and len(result) > 1000:
28
- data["tool_result"] = result[:1000] + "...[truncated]"
29
-
30
- if "tool_input" in data:
31
- tool_input = data["tool_input"]
32
- if isinstance(tool_input, dict):
33
- for key, value in tool_input.items():
34
- if isinstance(value, str) and len(value) > 500:
35
- data["tool_input"][key] = value[:500] + "..."
36
-
37
- # Enrich with AIOX context
38
- data = enrich_event(data)
39
-
40
- # Send to monitor server
41
- send_event("PostToolUse", data)
42
-
43
-
44
- if __name__ == "__main__":
45
- main()
1
+ #!/usr/bin/env python3
2
+ """
3
+ PostToolUse hook - captures tool results after execution.
4
+
5
+ This hook runs after Claude executes any tool, capturing the result.
6
+ Most important for tracking what actually happened.
7
+ """
8
+
9
+ import json
10
+ import sys
11
+ import os
12
+
13
+ # Add lib to path
14
+ sys.path.insert(0, os.path.dirname(__file__))
15
+
16
+ from lib.send_event import send_event
17
+ from lib.enrich import enrich_event
18
+
19
+
20
+ def main():
21
+ # Read event from stdin
22
+ data = json.load(sys.stdin)
23
+
24
+ # Truncate large fields
25
+ if "tool_result" in data:
26
+ result = data["tool_result"]
27
+ if isinstance(result, str) and len(result) > 1000:
28
+ data["tool_result"] = result[:1000] + "...[truncated]"
29
+
30
+ if "tool_input" in data:
31
+ tool_input = data["tool_input"]
32
+ if isinstance(tool_input, dict):
33
+ for key, value in tool_input.items():
34
+ if isinstance(value, str) and len(value) > 500:
35
+ data["tool_input"][key] = value[:500] + "..."
36
+
37
+ # Enrich with AIOX context
38
+ data = enrich_event(data)
39
+
40
+ # Send to monitor server
41
+ send_event("PostToolUse", data)
42
+
43
+
44
+ if __name__ == "__main__":
45
+ main()
@@ -1,29 +1,29 @@
1
- #!/usr/bin/env python3
2
- """
3
- PreCompact hook - captures before context compaction.
4
- """
5
-
6
- import json
7
- import sys
8
- import os
9
-
10
- # Add lib to path
11
- sys.path.insert(0, os.path.dirname(__file__))
12
-
13
- from lib.send_event import send_event
14
- from lib.enrich import enrich_event
15
-
16
-
17
- def main():
18
- # Read event from stdin
19
- data = json.load(sys.stdin)
20
-
21
- # Enrich with AIOX context
22
- data = enrich_event(data)
23
-
24
- # Send to monitor server
25
- send_event("PreCompact", data)
26
-
27
-
28
- if __name__ == "__main__":
29
- main()
1
+ #!/usr/bin/env python3
2
+ """
3
+ PreCompact hook - captures before context compaction.
4
+ """
5
+
6
+ import json
7
+ import sys
8
+ import os
9
+
10
+ # Add lib to path
11
+ sys.path.insert(0, os.path.dirname(__file__))
12
+
13
+ from lib.send_event import send_event
14
+ from lib.enrich import enrich_event
15
+
16
+
17
+ def main():
18
+ # Read event from stdin
19
+ data = json.load(sys.stdin)
20
+
21
+ # Enrich with AIOX context
22
+ data = enrich_event(data)
23
+
24
+ # Send to monitor server
25
+ send_event("PreCompact", data)
26
+
27
+
28
+ if __name__ == "__main__":
29
+ main()
@@ -1,40 +1,40 @@
1
- #!/usr/bin/env python3
2
- """
3
- PreToolUse hook - captures tool calls before execution.
4
-
5
- This hook runs before Claude executes any tool (Read, Write, Bash, etc.)
6
- Use this to see what tools are being invoked and their inputs.
7
- """
8
-
9
- import json
10
- import sys
11
- import os
12
-
13
- # Add lib to path
14
- sys.path.insert(0, os.path.dirname(__file__))
15
-
16
- from lib.send_event import send_event
17
- from lib.enrich import enrich_event
18
-
19
-
20
- def main():
21
- # Read event from stdin
22
- data = json.load(sys.stdin)
23
-
24
- # Truncate large fields to avoid memory issues
25
- if "tool_input" in data:
26
- tool_input = data["tool_input"]
27
- if isinstance(tool_input, dict):
28
- for key, value in tool_input.items():
29
- if isinstance(value, str) and len(value) > 500:
30
- data["tool_input"][key] = value[:500] + "..."
31
-
32
- # Enrich with AIOX context
33
- data = enrich_event(data)
34
-
35
- # Send to monitor server
36
- send_event("PreToolUse", data)
37
-
38
-
39
- if __name__ == "__main__":
40
- main()
1
+ #!/usr/bin/env python3
2
+ """
3
+ PreToolUse hook - captures tool calls before execution.
4
+
5
+ This hook runs before Claude executes any tool (Read, Write, Bash, etc.)
6
+ Use this to see what tools are being invoked and their inputs.
7
+ """
8
+
9
+ import json
10
+ import sys
11
+ import os
12
+
13
+ # Add lib to path
14
+ sys.path.insert(0, os.path.dirname(__file__))
15
+
16
+ from lib.send_event import send_event
17
+ from lib.enrich import enrich_event
18
+
19
+
20
+ def main():
21
+ # Read event from stdin
22
+ data = json.load(sys.stdin)
23
+
24
+ # Truncate large fields to avoid memory issues
25
+ if "tool_input" in data:
26
+ tool_input = data["tool_input"]
27
+ if isinstance(tool_input, dict):
28
+ for key, value in tool_input.items():
29
+ if isinstance(value, str) and len(value) > 500:
30
+ data["tool_input"][key] = value[:500] + "..."
31
+
32
+ # Enrich with AIOX context
33
+ data = enrich_event(data)
34
+
35
+ # Send to monitor server
36
+ send_event("PreToolUse", data)
37
+
38
+
39
+ if __name__ == "__main__":
40
+ main()
@@ -1,29 +1,29 @@
1
- #!/usr/bin/env python3
2
- """
3
- Stop hook - captures when Claude stops execution.
4
- """
5
-
6
- import json
7
- import sys
8
- import os
9
-
10
- # Add lib to path
11
- sys.path.insert(0, os.path.dirname(__file__))
12
-
13
- from lib.send_event import send_event
14
- from lib.enrich import enrich_event
15
-
16
-
17
- def main():
18
- # Read event from stdin
19
- data = json.load(sys.stdin)
20
-
21
- # Enrich with AIOX context
22
- data = enrich_event(data)
23
-
24
- # Send to monitor server
25
- send_event("Stop", data)
26
-
27
-
28
- if __name__ == "__main__":
29
- main()
1
+ #!/usr/bin/env python3
2
+ """
3
+ Stop hook - captures when Claude stops execution.
4
+ """
5
+
6
+ import json
7
+ import sys
8
+ import os
9
+
10
+ # Add lib to path
11
+ sys.path.insert(0, os.path.dirname(__file__))
12
+
13
+ from lib.send_event import send_event
14
+ from lib.enrich import enrich_event
15
+
16
+
17
+ def main():
18
+ # Read event from stdin
19
+ data = json.load(sys.stdin)
20
+
21
+ # Enrich with AIOX context
22
+ data = enrich_event(data)
23
+
24
+ # Send to monitor server
25
+ send_event("Stop", data)
26
+
27
+
28
+ if __name__ == "__main__":
29
+ main()
@@ -1,29 +1,29 @@
1
- #!/usr/bin/env python3
2
- """
3
- SubagentStop hook - captures when a subagent (Task tool) stops.
4
- """
5
-
6
- import json
7
- import sys
8
- import os
9
-
10
- # Add lib to path
11
- sys.path.insert(0, os.path.dirname(__file__))
12
-
13
- from lib.send_event import send_event
14
- from lib.enrich import enrich_event
15
-
16
-
17
- def main():
18
- # Read event from stdin
19
- data = json.load(sys.stdin)
20
-
21
- # Enrich with AIOX context
22
- data = enrich_event(data)
23
-
24
- # Send to monitor server
25
- send_event("SubagentStop", data)
26
-
27
-
28
- if __name__ == "__main__":
29
- main()
1
+ #!/usr/bin/env python3
2
+ """
3
+ SubagentStop hook - captures when a subagent (Task tool) stops.
4
+ """
5
+
6
+ import json
7
+ import sys
8
+ import os
9
+
10
+ # Add lib to path
11
+ sys.path.insert(0, os.path.dirname(__file__))
12
+
13
+ from lib.send_event import send_event
14
+ from lib.enrich import enrich_event
15
+
16
+
17
+ def main():
18
+ # Read event from stdin
19
+ data = json.load(sys.stdin)
20
+
21
+ # Enrich with AIOX context
22
+ data = enrich_event(data)
23
+
24
+ # Send to monitor server
25
+ send_event("SubagentStop", data)
26
+
27
+
28
+ if __name__ == "__main__":
29
+ main()
@@ -1,38 +1,38 @@
1
- #!/usr/bin/env python3
2
- """
3
- UserPromptSubmit hook - captures when user sends a prompt.
4
-
5
- This is the starting point of each interaction.
6
- """
7
-
8
- import json
9
- import sys
10
- import os
11
-
12
- # Add lib to path
13
- sys.path.insert(0, os.path.dirname(__file__))
14
-
15
- from lib.send_event import send_event
16
- from lib.enrich import enrich_event
17
-
18
-
19
- def main():
20
- # Read event from stdin
21
- data = json.load(sys.stdin)
22
-
23
- # Store user prompt for agent detection
24
- if "user_prompt" in data:
25
- # Truncate if too long
26
- prompt = data["user_prompt"]
27
- if isinstance(prompt, str) and len(prompt) > 1000:
28
- data["user_prompt"] = prompt[:1000] + "..."
29
-
30
- # Enrich with AIOX context
31
- data = enrich_event(data)
32
-
33
- # Send to monitor server
34
- send_event("UserPromptSubmit", data)
35
-
36
-
37
- if __name__ == "__main__":
38
- main()
1
+ #!/usr/bin/env python3
2
+ """
3
+ UserPromptSubmit hook - captures when user sends a prompt.
4
+
5
+ This is the starting point of each interaction.
6
+ """
7
+
8
+ import json
9
+ import sys
10
+ import os
11
+
12
+ # Add lib to path
13
+ sys.path.insert(0, os.path.dirname(__file__))
14
+
15
+ from lib.send_event import send_event
16
+ from lib.enrich import enrich_event
17
+
18
+
19
+ def main():
20
+ # Read event from stdin
21
+ data = json.load(sys.stdin)
22
+
23
+ # Store user prompt for agent detection
24
+ if "user_prompt" in data:
25
+ # Truncate if too long
26
+ prompt = data["user_prompt"]
27
+ if isinstance(prompt, str) and len(prompt) > 1000:
28
+ data["user_prompt"] = prompt[:1000] + "..."
29
+
30
+ # Enrich with AIOX context
31
+ data = enrich_event(data)
32
+
33
+ # Send to monitor server
34
+ send_event("UserPromptSubmit", data)
35
+
36
+
37
+ if __name__ == "__main__":
38
+ main()