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.
- package/NOTICE +18 -0
- package/README.md +49 -0
- package/bin/aero-agent-roles.js +127 -0
- package/lib/catalog.js +97 -0
- package/lib/install.js +48 -0
- package/lib/mcp.js +199 -0
- package/manifest.json +516 -0
- package/package.json +44 -0
- package/roles/aerodynamics-engineer/ROLE.md +153 -0
- package/roles/aerodynamics-engineer/SOURCES.md +12 -0
- package/roles/aerodynamics-engineer/cli.py +143 -0
- package/roles/aerodynamics-engineer/core/aerodynamics_core.py +1218 -0
- package/roles/aerodynamics-engineer/templates/aero-design-report-template.md +72 -0
- package/roles/aerodynamics-engineer/tests/test_aerodynamics_core.py +227 -0
- package/roles/aerodynamics-engineer/tests/test_role_aerodynamics.py +94 -0
- package/roles/aircraft-design-engineer/ROLE.md +138 -0
- package/roles/aircraft-design-engineer/SOURCES.md +12 -0
- package/roles/aircraft-design-engineer/cli.py +152 -0
- package/roles/aircraft-design-engineer/core/aircraft_design_core.py +1278 -0
- package/roles/aircraft-design-engineer/templates/concept-design-template.md +99 -0
- package/roles/aircraft-design-engineer/tests/test_aircraft_design_core.py +269 -0
- package/roles/aircraft-design-engineer/tests/test_role_aircraft_design_engineer.py +106 -0
- package/roles/airworthiness-compliance-engineer/ROLE.md +122 -0
- package/roles/airworthiness-compliance-engineer/SOURCES.md +16 -0
- package/roles/airworthiness-compliance-engineer/cli.py +146 -0
- package/roles/airworthiness-compliance-engineer/core/airworthiness_core.py +894 -0
- package/roles/airworthiness-compliance-engineer/templates/compliance-matrix-template.md +46 -0
- package/roles/airworthiness-compliance-engineer/tests/test_airworthiness_core.py +224 -0
- package/roles/airworthiness-compliance-engineer/tests/test_role_airworthiness.py +85 -0
- package/roles/as9100-quality-auditor/ROLE.md +128 -0
- package/roles/as9100-quality-auditor/SOURCES.md +16 -0
- package/roles/as9100-quality-auditor/cli.py +136 -0
- package/roles/as9100-quality-auditor/core/as9100_core.py +857 -0
- package/roles/as9100-quality-auditor/templates/findings-report-template.md +119 -0
- package/roles/as9100-quality-auditor/tests/test_as9100_cli_profile.py +105 -0
- package/roles/as9100-quality-auditor/tests/test_as9100_core.py +204 -0
- package/roles/as9100-quality-auditor/tests/test_role_as9100.py +90 -0
- package/roles/data-bus-avionics-engineer/ROLE.md +146 -0
- package/roles/data-bus-avionics-engineer/SOURCES.md +23 -0
- package/roles/data-bus-avionics-engineer/cli.py +311 -0
- package/roles/data-bus-avionics-engineer/core/data_bus_avionics_core.py +1121 -0
- package/roles/data-bus-avionics-engineer/templates/bus-assessment-template.md +134 -0
- package/roles/data-bus-avionics-engineer/tests/test_bundle_protocol.py +137 -0
- package/roles/data-bus-avionics-engineer/tests/test_data_bus_avionics_core.py +261 -0
- package/roles/data-bus-avionics-engineer/tests/test_role_data_bus_avionics_engineer.py +121 -0
- package/roles/do160-environmental-engineer/ROLE.md +136 -0
- package/roles/do160-environmental-engineer/SOURCES.md +30 -0
- package/roles/do160-environmental-engineer/cli.py +147 -0
- package/roles/do160-environmental-engineer/core/do160_environmental_core.py +1246 -0
- package/roles/do160-environmental-engineer/templates/environmental-qualification-plan-template.md +114 -0
- package/roles/do160-environmental-engineer/tests/test_do160_environmental_core.py +312 -0
- package/roles/do160-environmental-engineer/tests/test_role_do160_environmental_engineer.py +281 -0
- package/roles/do178c-cert-engineer/ROLE.md +120 -0
- package/roles/do178c-cert-engineer/SOURCES.md +16 -0
- package/roles/do178c-cert-engineer/cli.py +129 -0
- package/roles/do178c-cert-engineer/core/do178c_core.py +411 -0
- package/roles/do178c-cert-engineer/templates/psac-template.md +74 -0
- package/roles/do178c-cert-engineer/tests/test_do178c_cert_engineer_core.py +91 -0
- package/roles/do178c-cert-engineer/tests/test_role_do178c.py +109 -0
- package/roles/do254-hardware-engineer/ROLE.md +127 -0
- package/roles/do254-hardware-engineer/SOURCES.md +19 -0
- package/roles/do254-hardware-engineer/cli.py +308 -0
- package/roles/do254-hardware-engineer/core/do254_hardware_core.py +761 -0
- package/roles/do254-hardware-engineer/templates/phac-template.md +87 -0
- package/roles/do254-hardware-engineer/tests/test_do254_bundle_profile.py +152 -0
- package/roles/do254-hardware-engineer/tests/test_do254_hardware_core.py +200 -0
- package/roles/do254-hardware-engineer/tests/test_role_do254_hardware.py +108 -0
- package/roles/engineering-analysis-engineer/ROLE.md +154 -0
- package/roles/engineering-analysis-engineer/SOURCES.md +15 -0
- package/roles/engineering-analysis-engineer/cli.py +151 -0
- package/roles/engineering-analysis-engineer/core/engineering_analysis_engineer_core.py +866 -0
- package/roles/engineering-analysis-engineer/templates/analysis-memo-template.md +73 -0
- package/roles/engineering-analysis-engineer/tests/test_engineering_analysis_engineer_core.py +367 -0
- package/roles/engineering-analysis-engineer/tests/test_role_engineering_analysis_engineer.py +113 -0
- package/roles/flight-management-engineer/ROLE.md +160 -0
- package/roles/flight-management-engineer/SOURCES.md +30 -0
- package/roles/flight-management-engineer/cli.py +258 -0
- package/roles/flight-management-engineer/core/flight_management_core.py +1473 -0
- package/roles/flight-management-engineer/templates/route-assessment-template.md +94 -0
- package/roles/flight-management-engineer/tests/test_flight_management_core.py +437 -0
- package/roles/flight-management-engineer/tests/test_role_flight_management_engineer.py +123 -0
- package/roles/flight-mechanics-engineer/ROLE.md +162 -0
- package/roles/flight-mechanics-engineer/SOURCES.md +51 -0
- package/roles/flight-mechanics-engineer/cli.py +149 -0
- package/roles/flight-mechanics-engineer/core/flight_mechanics_core.py +1507 -0
- package/roles/flight-mechanics-engineer/templates/perf-sc-report-template.md +82 -0
- package/roles/flight-mechanics-engineer/tests/test_flight_mechanics_core.py +277 -0
- package/roles/flight-mechanics-engineer/tests/test_role_flight_mechanics_engineer.py +141 -0
- package/roles/flight-test-engineer/ROLE.md +137 -0
- package/roles/flight-test-engineer/SOURCES.md +24 -0
- package/roles/flight-test-engineer/cli.py +135 -0
- package/roles/flight-test-engineer/core/flight_test_core.py +931 -0
- package/roles/flight-test-engineer/templates/flight-test-template.md +143 -0
- package/roles/flight-test-engineer/tests/test_flight_test_engineer_core.py +227 -0
- package/roles/flight-test-engineer/tests/test_role_flight_test_engineer.py +150 -0
- package/roles/flight-test-performance-engineer/ROLE.md +165 -0
- package/roles/flight-test-performance-engineer/SOURCES.md +20 -0
- package/roles/flight-test-performance-engineer/cli.py +319 -0
- package/roles/flight-test-performance-engineer/core/flight_test_performance_core.py +1398 -0
- package/roles/flight-test-performance-engineer/templates/performance-report-template.md +105 -0
- package/roles/flight-test-performance-engineer/tests/test_flight_test_performance_engineer_core.py +308 -0
- package/roles/flight-test-performance-engineer/tests/test_role_flight_test_performance_engineer.py +165 -0
- package/roles/gnc-engineer/ROLE.md +141 -0
- package/roles/gnc-engineer/SOURCES.md +35 -0
- package/roles/gnc-engineer/cli.py +141 -0
- package/roles/gnc-engineer/core/gnc_core.py +1074 -0
- package/roles/gnc-engineer/templates/gnc-report-template.md +105 -0
- package/roles/gnc-engineer/tests/test_gnc_engineer_core.py +238 -0
- package/roles/gnc-engineer/tests/test_role_gnc_engineer.py +142 -0
- package/roles/guidance-engineer/ROLE.md +156 -0
- package/roles/guidance-engineer/SOURCES.md +43 -0
- package/roles/guidance-engineer/cli.py +280 -0
- package/roles/guidance-engineer/core/guidance_core.py +820 -0
- package/roles/guidance-engineer/templates/guidance-report-template.md +70 -0
- package/roles/guidance-engineer/tests/test_guidance_engineer_core.py +269 -0
- package/roles/guidance-engineer/tests/test_role_guidance_engineer.py +146 -0
- package/roles/high-speed-aerodynamics-engineer/ROLE.md +161 -0
- package/roles/high-speed-aerodynamics-engineer/SOURCES.md +18 -0
- package/roles/high-speed-aerodynamics-engineer/cli.py +282 -0
- package/roles/high-speed-aerodynamics-engineer/core/high_speed_aero_core.py +1566 -0
- package/roles/high-speed-aerodynamics-engineer/templates/high-speed-memo-template.md +75 -0
- package/roles/high-speed-aerodynamics-engineer/tests/test_bundle_protocol.py +103 -0
- package/roles/high-speed-aerodynamics-engineer/tests/test_high_speed_aero_core.py +280 -0
- package/roles/high-speed-aerodynamics-engineer/tests/test_role_high_speed_aerodynamics.py +125 -0
- package/roles/ndt-engineer/ROLE.md +157 -0
- package/roles/ndt-engineer/SOURCES.md +18 -0
- package/roles/ndt-engineer/cli.py +316 -0
- package/roles/ndt-engineer/core/ndt_core.py +1590 -0
- package/roles/ndt-engineer/templates/ndt-plan-template.md +109 -0
- package/roles/ndt-engineer/tests/test_ndt_cli_bundle.py +183 -0
- package/roles/ndt-engineer/tests/test_ndt_core.py +437 -0
- package/roles/ndt-engineer/tests/test_role_ndt_engineer.py +148 -0
- package/roles/numerical-analysis-engineer/ROLE.md +158 -0
- package/roles/numerical-analysis-engineer/SOURCES.md +19 -0
- package/roles/numerical-analysis-engineer/cli.py +414 -0
- package/roles/numerical-analysis-engineer/core/numerical_analysis_core.py +1220 -0
- package/roles/numerical-analysis-engineer/templates/verification-memo-template.md +120 -0
- package/roles/numerical-analysis-engineer/tests/test_bundle_protocol.py +157 -0
- package/roles/numerical-analysis-engineer/tests/test_numerical_analysis_core.py +337 -0
- package/roles/numerical-analysis-engineer/tests/test_role_numerical_analysis_engineer.py +117 -0
- package/roles/propulsion-engineer/ROLE.md +163 -0
- package/roles/propulsion-engineer/SOURCES.md +15 -0
- package/roles/propulsion-engineer/cli.py +168 -0
- package/roles/propulsion-engineer/core/propulsion_core.py +1291 -0
- package/roles/propulsion-engineer/templates/propulsion-report-template.md +92 -0
- package/roles/propulsion-engineer/tests/test_propulsion_engineer_core.py +294 -0
- package/roles/propulsion-engineer/tests/test_role_propulsion_engineer.py +106 -0
- package/roles/space-systems-engineer/ROLE.md +161 -0
- package/roles/space-systems-engineer/SOURCES.md +49 -0
- package/roles/space-systems-engineer/cli.py +173 -0
- package/roles/space-systems-engineer/core/space_systems_core.py +980 -0
- package/roles/space-systems-engineer/templates/space-systems-template.md +88 -0
- package/roles/space-systems-engineer/tests/test_role_space_systems_engineer.py +117 -0
- package/roles/space-systems-engineer/tests/test_space_systems_engineer_core.py +247 -0
- package/roles/state-estimation-engineer/ROLE.md +154 -0
- package/roles/state-estimation-engineer/SOURCES.md +27 -0
- package/roles/state-estimation-engineer/cli.py +326 -0
- package/roles/state-estimation-engineer/core/state_estimation_core.py +958 -0
- package/roles/state-estimation-engineer/templates/nav-state-estimator-design-template.md +76 -0
- package/roles/state-estimation-engineer/tests/test_bundle_protocol.py +110 -0
- package/roles/state-estimation-engineer/tests/test_role_state_estimation_engineer.py +127 -0
- package/roles/state-estimation-engineer/tests/test_state_estimation_engineer_core.py +231 -0
- package/roles/structures-loads-engineer/ROLE.md +171 -0
- package/roles/structures-loads-engineer/SOURCES.md +44 -0
- package/roles/structures-loads-engineer/cli.py +219 -0
- package/roles/structures-loads-engineer/core/structures_loads_core.py +1112 -0
- package/roles/structures-loads-engineer/templates/loads-strength-report-template.md +96 -0
- package/roles/structures-loads-engineer/tests/test_bundle_protocol.py +101 -0
- package/roles/structures-loads-engineer/tests/test_role_structures_loads_engineer.py +147 -0
- 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()
|