aero-agent-roles 1.0.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.
Files changed (170) hide show
  1. package/NOTICE +18 -0
  2. package/README.md +49 -0
  3. package/bin/aero-agent-roles.js +127 -0
  4. package/lib/catalog.js +97 -0
  5. package/lib/install.js +48 -0
  6. package/lib/mcp.js +199 -0
  7. package/manifest.json +516 -0
  8. package/package.json +44 -0
  9. package/roles/aerodynamics-engineer/ROLE.md +153 -0
  10. package/roles/aerodynamics-engineer/SOURCES.md +12 -0
  11. package/roles/aerodynamics-engineer/cli.py +143 -0
  12. package/roles/aerodynamics-engineer/core/aerodynamics_core.py +1218 -0
  13. package/roles/aerodynamics-engineer/templates/aero-design-report-template.md +72 -0
  14. package/roles/aerodynamics-engineer/tests/test_aerodynamics_core.py +227 -0
  15. package/roles/aerodynamics-engineer/tests/test_role_aerodynamics.py +94 -0
  16. package/roles/aircraft-design-engineer/ROLE.md +138 -0
  17. package/roles/aircraft-design-engineer/SOURCES.md +12 -0
  18. package/roles/aircraft-design-engineer/cli.py +152 -0
  19. package/roles/aircraft-design-engineer/core/aircraft_design_core.py +1278 -0
  20. package/roles/aircraft-design-engineer/templates/concept-design-template.md +99 -0
  21. package/roles/aircraft-design-engineer/tests/test_aircraft_design_core.py +269 -0
  22. package/roles/aircraft-design-engineer/tests/test_role_aircraft_design_engineer.py +106 -0
  23. package/roles/airworthiness-compliance-engineer/ROLE.md +122 -0
  24. package/roles/airworthiness-compliance-engineer/SOURCES.md +16 -0
  25. package/roles/airworthiness-compliance-engineer/cli.py +146 -0
  26. package/roles/airworthiness-compliance-engineer/core/airworthiness_core.py +894 -0
  27. package/roles/airworthiness-compliance-engineer/templates/compliance-matrix-template.md +46 -0
  28. package/roles/airworthiness-compliance-engineer/tests/test_airworthiness_core.py +224 -0
  29. package/roles/airworthiness-compliance-engineer/tests/test_role_airworthiness.py +85 -0
  30. package/roles/as9100-quality-auditor/ROLE.md +128 -0
  31. package/roles/as9100-quality-auditor/SOURCES.md +16 -0
  32. package/roles/as9100-quality-auditor/cli.py +136 -0
  33. package/roles/as9100-quality-auditor/core/as9100_core.py +857 -0
  34. package/roles/as9100-quality-auditor/templates/findings-report-template.md +119 -0
  35. package/roles/as9100-quality-auditor/tests/test_as9100_cli_profile.py +105 -0
  36. package/roles/as9100-quality-auditor/tests/test_as9100_core.py +204 -0
  37. package/roles/as9100-quality-auditor/tests/test_role_as9100.py +90 -0
  38. package/roles/data-bus-avionics-engineer/ROLE.md +146 -0
  39. package/roles/data-bus-avionics-engineer/SOURCES.md +23 -0
  40. package/roles/data-bus-avionics-engineer/cli.py +311 -0
  41. package/roles/data-bus-avionics-engineer/core/data_bus_avionics_core.py +1121 -0
  42. package/roles/data-bus-avionics-engineer/templates/bus-assessment-template.md +134 -0
  43. package/roles/data-bus-avionics-engineer/tests/test_bundle_protocol.py +137 -0
  44. package/roles/data-bus-avionics-engineer/tests/test_data_bus_avionics_core.py +261 -0
  45. package/roles/data-bus-avionics-engineer/tests/test_role_data_bus_avionics_engineer.py +121 -0
  46. package/roles/do160-environmental-engineer/ROLE.md +136 -0
  47. package/roles/do160-environmental-engineer/SOURCES.md +30 -0
  48. package/roles/do160-environmental-engineer/cli.py +147 -0
  49. package/roles/do160-environmental-engineer/core/do160_environmental_core.py +1246 -0
  50. package/roles/do160-environmental-engineer/templates/environmental-qualification-plan-template.md +114 -0
  51. package/roles/do160-environmental-engineer/tests/test_do160_environmental_core.py +312 -0
  52. package/roles/do160-environmental-engineer/tests/test_role_do160_environmental_engineer.py +281 -0
  53. package/roles/do178c-cert-engineer/ROLE.md +120 -0
  54. package/roles/do178c-cert-engineer/SOURCES.md +16 -0
  55. package/roles/do178c-cert-engineer/cli.py +129 -0
  56. package/roles/do178c-cert-engineer/core/do178c_core.py +411 -0
  57. package/roles/do178c-cert-engineer/templates/psac-template.md +74 -0
  58. package/roles/do178c-cert-engineer/tests/test_do178c_cert_engineer_core.py +91 -0
  59. package/roles/do178c-cert-engineer/tests/test_role_do178c.py +109 -0
  60. package/roles/do254-hardware-engineer/ROLE.md +127 -0
  61. package/roles/do254-hardware-engineer/SOURCES.md +19 -0
  62. package/roles/do254-hardware-engineer/cli.py +308 -0
  63. package/roles/do254-hardware-engineer/core/do254_hardware_core.py +761 -0
  64. package/roles/do254-hardware-engineer/templates/phac-template.md +87 -0
  65. package/roles/do254-hardware-engineer/tests/test_do254_bundle_profile.py +152 -0
  66. package/roles/do254-hardware-engineer/tests/test_do254_hardware_core.py +200 -0
  67. package/roles/do254-hardware-engineer/tests/test_role_do254_hardware.py +108 -0
  68. package/roles/engineering-analysis-engineer/ROLE.md +154 -0
  69. package/roles/engineering-analysis-engineer/SOURCES.md +15 -0
  70. package/roles/engineering-analysis-engineer/cli.py +151 -0
  71. package/roles/engineering-analysis-engineer/core/engineering_analysis_engineer_core.py +866 -0
  72. package/roles/engineering-analysis-engineer/templates/analysis-memo-template.md +73 -0
  73. package/roles/engineering-analysis-engineer/tests/test_engineering_analysis_engineer_core.py +367 -0
  74. package/roles/engineering-analysis-engineer/tests/test_role_engineering_analysis_engineer.py +113 -0
  75. package/roles/flight-management-engineer/ROLE.md +160 -0
  76. package/roles/flight-management-engineer/SOURCES.md +30 -0
  77. package/roles/flight-management-engineer/cli.py +258 -0
  78. package/roles/flight-management-engineer/core/flight_management_core.py +1473 -0
  79. package/roles/flight-management-engineer/templates/route-assessment-template.md +94 -0
  80. package/roles/flight-management-engineer/tests/test_flight_management_core.py +437 -0
  81. package/roles/flight-management-engineer/tests/test_role_flight_management_engineer.py +123 -0
  82. package/roles/flight-mechanics-engineer/ROLE.md +162 -0
  83. package/roles/flight-mechanics-engineer/SOURCES.md +51 -0
  84. package/roles/flight-mechanics-engineer/cli.py +149 -0
  85. package/roles/flight-mechanics-engineer/core/flight_mechanics_core.py +1507 -0
  86. package/roles/flight-mechanics-engineer/templates/perf-sc-report-template.md +82 -0
  87. package/roles/flight-mechanics-engineer/tests/test_flight_mechanics_core.py +277 -0
  88. package/roles/flight-mechanics-engineer/tests/test_role_flight_mechanics_engineer.py +141 -0
  89. package/roles/flight-test-engineer/ROLE.md +137 -0
  90. package/roles/flight-test-engineer/SOURCES.md +24 -0
  91. package/roles/flight-test-engineer/cli.py +135 -0
  92. package/roles/flight-test-engineer/core/flight_test_core.py +931 -0
  93. package/roles/flight-test-engineer/templates/flight-test-template.md +143 -0
  94. package/roles/flight-test-engineer/tests/test_flight_test_engineer_core.py +227 -0
  95. package/roles/flight-test-engineer/tests/test_role_flight_test_engineer.py +150 -0
  96. package/roles/flight-test-performance-engineer/ROLE.md +165 -0
  97. package/roles/flight-test-performance-engineer/SOURCES.md +20 -0
  98. package/roles/flight-test-performance-engineer/cli.py +319 -0
  99. package/roles/flight-test-performance-engineer/core/flight_test_performance_core.py +1398 -0
  100. package/roles/flight-test-performance-engineer/templates/performance-report-template.md +105 -0
  101. package/roles/flight-test-performance-engineer/tests/test_flight_test_performance_engineer_core.py +308 -0
  102. package/roles/flight-test-performance-engineer/tests/test_role_flight_test_performance_engineer.py +165 -0
  103. package/roles/gnc-engineer/ROLE.md +141 -0
  104. package/roles/gnc-engineer/SOURCES.md +35 -0
  105. package/roles/gnc-engineer/cli.py +141 -0
  106. package/roles/gnc-engineer/core/gnc_core.py +1074 -0
  107. package/roles/gnc-engineer/templates/gnc-report-template.md +105 -0
  108. package/roles/gnc-engineer/tests/test_gnc_engineer_core.py +238 -0
  109. package/roles/gnc-engineer/tests/test_role_gnc_engineer.py +142 -0
  110. package/roles/guidance-engineer/ROLE.md +156 -0
  111. package/roles/guidance-engineer/SOURCES.md +43 -0
  112. package/roles/guidance-engineer/cli.py +280 -0
  113. package/roles/guidance-engineer/core/guidance_core.py +820 -0
  114. package/roles/guidance-engineer/templates/guidance-report-template.md +70 -0
  115. package/roles/guidance-engineer/tests/test_guidance_engineer_core.py +269 -0
  116. package/roles/guidance-engineer/tests/test_role_guidance_engineer.py +146 -0
  117. package/roles/high-speed-aerodynamics-engineer/ROLE.md +161 -0
  118. package/roles/high-speed-aerodynamics-engineer/SOURCES.md +18 -0
  119. package/roles/high-speed-aerodynamics-engineer/cli.py +282 -0
  120. package/roles/high-speed-aerodynamics-engineer/core/high_speed_aero_core.py +1566 -0
  121. package/roles/high-speed-aerodynamics-engineer/templates/high-speed-memo-template.md +75 -0
  122. package/roles/high-speed-aerodynamics-engineer/tests/test_bundle_protocol.py +103 -0
  123. package/roles/high-speed-aerodynamics-engineer/tests/test_high_speed_aero_core.py +280 -0
  124. package/roles/high-speed-aerodynamics-engineer/tests/test_role_high_speed_aerodynamics.py +125 -0
  125. package/roles/ndt-engineer/ROLE.md +157 -0
  126. package/roles/ndt-engineer/SOURCES.md +18 -0
  127. package/roles/ndt-engineer/cli.py +316 -0
  128. package/roles/ndt-engineer/core/ndt_core.py +1590 -0
  129. package/roles/ndt-engineer/templates/ndt-plan-template.md +109 -0
  130. package/roles/ndt-engineer/tests/test_ndt_cli_bundle.py +183 -0
  131. package/roles/ndt-engineer/tests/test_ndt_core.py +437 -0
  132. package/roles/ndt-engineer/tests/test_role_ndt_engineer.py +148 -0
  133. package/roles/numerical-analysis-engineer/ROLE.md +158 -0
  134. package/roles/numerical-analysis-engineer/SOURCES.md +19 -0
  135. package/roles/numerical-analysis-engineer/cli.py +414 -0
  136. package/roles/numerical-analysis-engineer/core/numerical_analysis_core.py +1220 -0
  137. package/roles/numerical-analysis-engineer/templates/verification-memo-template.md +120 -0
  138. package/roles/numerical-analysis-engineer/tests/test_bundle_protocol.py +157 -0
  139. package/roles/numerical-analysis-engineer/tests/test_numerical_analysis_core.py +337 -0
  140. package/roles/numerical-analysis-engineer/tests/test_role_numerical_analysis_engineer.py +117 -0
  141. package/roles/propulsion-engineer/ROLE.md +163 -0
  142. package/roles/propulsion-engineer/SOURCES.md +15 -0
  143. package/roles/propulsion-engineer/cli.py +168 -0
  144. package/roles/propulsion-engineer/core/propulsion_core.py +1291 -0
  145. package/roles/propulsion-engineer/templates/propulsion-report-template.md +92 -0
  146. package/roles/propulsion-engineer/tests/test_propulsion_engineer_core.py +294 -0
  147. package/roles/propulsion-engineer/tests/test_role_propulsion_engineer.py +106 -0
  148. package/roles/space-systems-engineer/ROLE.md +161 -0
  149. package/roles/space-systems-engineer/SOURCES.md +49 -0
  150. package/roles/space-systems-engineer/cli.py +173 -0
  151. package/roles/space-systems-engineer/core/space_systems_core.py +980 -0
  152. package/roles/space-systems-engineer/templates/space-systems-template.md +88 -0
  153. package/roles/space-systems-engineer/tests/test_role_space_systems_engineer.py +117 -0
  154. package/roles/space-systems-engineer/tests/test_space_systems_engineer_core.py +247 -0
  155. package/roles/state-estimation-engineer/ROLE.md +154 -0
  156. package/roles/state-estimation-engineer/SOURCES.md +27 -0
  157. package/roles/state-estimation-engineer/cli.py +326 -0
  158. package/roles/state-estimation-engineer/core/state_estimation_core.py +958 -0
  159. package/roles/state-estimation-engineer/templates/nav-state-estimator-design-template.md +76 -0
  160. package/roles/state-estimation-engineer/tests/test_bundle_protocol.py +110 -0
  161. package/roles/state-estimation-engineer/tests/test_role_state_estimation_engineer.py +127 -0
  162. package/roles/state-estimation-engineer/tests/test_state_estimation_engineer_core.py +231 -0
  163. package/roles/structures-loads-engineer/ROLE.md +171 -0
  164. package/roles/structures-loads-engineer/SOURCES.md +44 -0
  165. package/roles/structures-loads-engineer/cli.py +219 -0
  166. package/roles/structures-loads-engineer/core/structures_loads_core.py +1112 -0
  167. package/roles/structures-loads-engineer/templates/loads-strength-report-template.md +96 -0
  168. package/roles/structures-loads-engineer/tests/test_bundle_protocol.py +101 -0
  169. package/roles/structures-loads-engineer/tests/test_role_structures_loads_engineer.py +147 -0
  170. package/roles/structures-loads-engineer/tests/test_structures_loads_core.py +261 -0
@@ -0,0 +1,152 @@
1
+ #!/usr/bin/env python3
2
+ """cli.py - run the Aircraft Conceptual Design Engineer role.
3
+
4
+ Usage:
5
+ python3 cli.py build [--out <file.md>] [--pax N] [--range-nm R]
6
+ [--cruise-mach M] [--design-ws N] [--bundle]
7
+ [--profile <profile.json>]
8
+ # build the concept design package
9
+ # --bundle also emit evidence/{model,gates,provenance}.json (PROTOCOL.md)
10
+ # --profile program profile JSON (customer tailoring,
11
+ # docs/PROFILE-SCHEMA.md)
12
+ python3 cli.py check --file <file.md>
13
+
14
+ The role ENGINE (core/aircraft_design_core.py) does the work standalone;
15
+ bound skills in Aero Agent Skills deepen individual stages when present.
16
+ """
17
+ import argparse
18
+ import os
19
+ import sys
20
+
21
+ sys.path.insert(0, os.path.join(os.path.dirname(os.path.abspath(__file__)), "core"))
22
+ sys.path.insert(0, os.path.join(os.path.dirname(os.path.abspath(__file__)),
23
+ "..", "..", "scripts"))
24
+ import aircraft_design_core as core # noqa: E402
25
+ import evidence # noqa: E402
26
+
27
+ ROLE_SLUG = "aircraft-design-engineer"
28
+
29
+
30
+ def cmd_build(args):
31
+ item = core.example_item()
32
+ # allow overriding the top-level requirement from the CLI
33
+ if args.pax is not None:
34
+ item.pax = args.pax
35
+ if args.payload_per_pax is not None:
36
+ item.payload_per_pax_lb = args.payload_per_pax
37
+ if args.range_nm is not None:
38
+ item.range_nm = args.range_nm
39
+ if args.cruise_mach is not None:
40
+ item.cruise_mach = args.cruise_mach
41
+ if args.tofl_m is not None:
42
+ item.tofl_m = args.tofl_m
43
+ if args.design_ws is not None:
44
+ item.design_ws_nm2 = args.design_ws
45
+ model = core.build_concept(item)
46
+ md = core.render_concept_markdown(model)
47
+
48
+ # program profile (customer tailoring): load + apply context header
49
+ profile = None
50
+ try:
51
+ profile = evidence.load_profile(args.profile)
52
+ except ValueError as e:
53
+ print(f"error: bad profile: {e}")
54
+ return 1
55
+ if profile:
56
+ model["profile"] = {
57
+ "customer": profile.get("customer"),
58
+ "program": profile.get("program"),
59
+ "basis": profile.get("basis"),
60
+ "authority": profile.get("authority"),
61
+ "der": profile.get("der"),
62
+ "document_prefix": profile.get("document_prefix"),
63
+ "revision": profile.get("revision"),
64
+ }
65
+ md = evidence.profile_header_block(profile) + md
66
+
67
+ gates = core.check_concept(model)
68
+ s = model["sizing"]
69
+ dp = model["design_point"]
70
+ if args.out:
71
+ with open(args.out, "w") as f:
72
+ f.write(md)
73
+ print(f"built concept package -> {args.out}")
74
+ if profile:
75
+ print(f"profile: {profile.get('customer')} / "
76
+ f"{profile.get('program')}")
77
+ if args.bundle:
78
+ prov = {
79
+ "role": ROLE_SLUG,
80
+ "core": {"file": "core/aircraft_design_core.py",
81
+ "functions": ["select_design_point", "size_mtow",
82
+ "chain_mission", "engine_size_check",
83
+ "build_concept"],
84
+ "version": "0.1.0"},
85
+ "skills": [],
86
+ "cross_checked": False,
87
+ "disclaimer": "DRAFT for human review. Not an approval document.",
88
+ }
89
+ paths = evidence.write_bundle(
90
+ args.out, ROLE_SLUG,
91
+ "concept design package", model, gates, prov)
92
+ print(f"bundle: model={paths['model']}")
93
+ print(f" gates={paths['gates']}")
94
+ print(f" provenance={paths['provenance']}")
95
+ else:
96
+ print(md)
97
+ print(f"MTOW {s['mtow_lb']:,.0f} lb converged in {s['n_iterations']} "
98
+ f"iterations; design point W/S {dp['ws_nm2']:,.0f} N/m^2, "
99
+ f"T/W {dp['tw_required']:.4f} ({dp['binding_constraint']})")
100
+ print(f"gates: all_pass={gates['all_pass']} {gates}")
101
+ return 0 if gates["all_pass"] else 1
102
+
103
+
104
+ def cmd_check(args):
105
+ if not os.path.exists(args.file):
106
+ print(f"file not found: {args.file}")
107
+ return 1
108
+ md = open(args.file).read()
109
+ gates = core.check_concept_markdown(md)
110
+ for name, ok in gates.items():
111
+ if name != "all_pass":
112
+ print(f"{'PASS' if ok else 'FAIL'} {name}")
113
+ print(f"RESULT: {'PASS' if gates['all_pass'] else 'FAIL'}")
114
+ return 0 if gates["all_pass"] else 1
115
+
116
+
117
+ def main():
118
+ p = argparse.ArgumentParser(
119
+ description="Aircraft Conceptual Design Engineer role")
120
+ sub = p.add_subparsers(dest="cmd", required=True)
121
+
122
+ b = sub.add_parser("build")
123
+ b.add_argument("--out", default="", help="output file (default: stdout)")
124
+ b.add_argument("--pax", type=int, default=None, help="passenger count")
125
+ b.add_argument("--payload-per-pax", type=float, default=None,
126
+ help="payload per passenger, lb")
127
+ b.add_argument("--range-nm", type=float, default=None,
128
+ help="design range, nm")
129
+ b.add_argument("--cruise-mach", type=float, default=None,
130
+ help="cruise Mach number")
131
+ b.add_argument("--tofl-m", type=float, default=None,
132
+ help="takeoff field length, m")
133
+ b.add_argument("--design-ws", type=float, default=None,
134
+ help="design wing loading, N/m^2 (default: example)")
135
+ b.add_argument("--bundle", action="store_true",
136
+ help="emit evidence/{model,gates,provenance}.json")
137
+ b.add_argument("--profile", default="",
138
+ help="program profile JSON (customer tailoring, "
139
+ "docs/PROFILE-SCHEMA.md)")
140
+ b.set_defaults(fn=cmd_build)
141
+
142
+ c = sub.add_parser("check")
143
+ c.add_argument("--file", required=True,
144
+ help="concept design package markdown to gate-check")
145
+ c.set_defaults(fn=cmd_check)
146
+
147
+ args = p.parse_args()
148
+ sys.exit(args.fn(args))
149
+
150
+
151
+ if __name__ == "__main__":
152
+ main()