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,146 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""cli.py - run the Airworthiness Compliance Engineer role.
|
|
3
|
+
|
|
4
|
+
Usage:
|
|
5
|
+
python3 cli.py build --out <file.md> [--bundle] # build the compliance matrix
|
|
6
|
+
python3 cli.py check --file <file.md> # gate-check an existing matrix
|
|
7
|
+
# --bundle also emit evidence/{model,gates,provenance}.json (PROTOCOL.md)
|
|
8
|
+
|
|
9
|
+
The role ENGINE (core/airworthiness_core.py) does the work standalone;
|
|
10
|
+
bound skills in Aero Agent Skills deepen individual stages when present.
|
|
11
|
+
|
|
12
|
+
Author: ashfordeOU
|
|
13
|
+
"""
|
|
14
|
+
import argparse
|
|
15
|
+
import os
|
|
16
|
+
import sys
|
|
17
|
+
|
|
18
|
+
sys.path.insert(0, os.path.join(os.path.dirname(os.path.abspath(__file__)), "core"))
|
|
19
|
+
sys.path.insert(0, os.path.join(os.path.dirname(os.path.abspath(__file__)),
|
|
20
|
+
"..", "..", "scripts"))
|
|
21
|
+
import airworthiness_core as core # noqa: E402
|
|
22
|
+
import evidence # noqa: E402
|
|
23
|
+
|
|
24
|
+
ROLE_SLUG = "airworthiness-compliance-engineer"
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def _provenance():
|
|
28
|
+
"""Provenance for the evidence bundle (PROTOCOL.md v1).
|
|
29
|
+
|
|
30
|
+
This role runs its core standalone: no bound skill logic is
|
|
31
|
+
dispatched, so skills is empty and cross_checked is False (the
|
|
32
|
+
role is still valid, just not cross-checked against a second
|
|
33
|
+
implementation).
|
|
34
|
+
"""
|
|
35
|
+
return {
|
|
36
|
+
"role": ROLE_SLUG,
|
|
37
|
+
"core": {
|
|
38
|
+
"file": "core/airworthiness_core.py",
|
|
39
|
+
"functions": ["determine_applicability", "select_moc",
|
|
40
|
+
"compliance_row", "build_matrix", "check_matrix"],
|
|
41
|
+
},
|
|
42
|
+
"skills": [],
|
|
43
|
+
"cross_checked": False,
|
|
44
|
+
"disclaimer": "DRAFT for human review. Not an approval document.",
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
def cmd_build(args):
|
|
49
|
+
item = core.example_item()
|
|
50
|
+
# allow overriding jurisdiction/aircraft from CLI for different bases
|
|
51
|
+
if args.jurisdiction:
|
|
52
|
+
item.jurisdiction = args.jurisdiction
|
|
53
|
+
if args.aircraft:
|
|
54
|
+
item.aircraft_type = args.aircraft
|
|
55
|
+
if args.path:
|
|
56
|
+
item.certification_path = args.path
|
|
57
|
+
model = core.build_matrix(item)
|
|
58
|
+
md = core.render_matrix_markdown(model)
|
|
59
|
+
|
|
60
|
+
# program profile (customer tailoring): load + apply context header
|
|
61
|
+
profile = None
|
|
62
|
+
try:
|
|
63
|
+
profile = evidence.load_profile(args.profile)
|
|
64
|
+
except ValueError as e:
|
|
65
|
+
print("error: bad profile: %s" % e)
|
|
66
|
+
return 1
|
|
67
|
+
if profile:
|
|
68
|
+
model["profile"] = {
|
|
69
|
+
"customer": profile.get("customer"),
|
|
70
|
+
"program": profile.get("program"),
|
|
71
|
+
"basis": profile.get("basis"),
|
|
72
|
+
"authority": profile.get("authority"),
|
|
73
|
+
"der": profile.get("der"),
|
|
74
|
+
"document_prefix": profile.get("document_prefix"),
|
|
75
|
+
"revision": profile.get("revision"),
|
|
76
|
+
}
|
|
77
|
+
md = evidence.profile_header_block(profile) + md
|
|
78
|
+
|
|
79
|
+
gates = core.check_matrix(model)
|
|
80
|
+
if args.out:
|
|
81
|
+
with open(args.out, "w") as f:
|
|
82
|
+
f.write(md)
|
|
83
|
+
print("built compliance matrix (basis %s, %d regs, coverage %.0f%%)"
|
|
84
|
+
" -> %s"
|
|
85
|
+
% (model["certification_basis"], model["row_count"],
|
|
86
|
+
model["coverage"] * 100.0, args.out))
|
|
87
|
+
if profile:
|
|
88
|
+
print("profile: %s / %s" % (profile.get("customer"),
|
|
89
|
+
profile.get("program")))
|
|
90
|
+
print("gates: all_pass=%s %s" % (gates["all_pass"], gates))
|
|
91
|
+
if args.bundle:
|
|
92
|
+
prov = _provenance()
|
|
93
|
+
paths = evidence.write_bundle(
|
|
94
|
+
args.out, ROLE_SLUG,
|
|
95
|
+
"airworthiness compliance matrix", model, gates, prov)
|
|
96
|
+
print("bundle: model=%s" % paths["model"])
|
|
97
|
+
print(" gates=%s" % paths["gates"])
|
|
98
|
+
print(" provenance=%s" % paths["provenance"])
|
|
99
|
+
print("cross-check: not dispatched (role core runs standalone)")
|
|
100
|
+
else:
|
|
101
|
+
print(md)
|
|
102
|
+
return 0 if gates["all_pass"] else 1
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
def cmd_check(args):
|
|
106
|
+
if not os.path.exists(args.file):
|
|
107
|
+
print("file not found: %s" % args.file)
|
|
108
|
+
return 1
|
|
109
|
+
md = open(args.file).read()
|
|
110
|
+
gates = core.check_matrix_markdown(md)
|
|
111
|
+
for name, ok in gates.items():
|
|
112
|
+
if name != "all_pass":
|
|
113
|
+
print("%s %s" % ("PASS" if ok else "FAIL", name))
|
|
114
|
+
print("RESULT: %s" % ("PASS" if gates["all_pass"] else "FAIL"))
|
|
115
|
+
return 0 if gates["all_pass"] else 1
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
def main():
|
|
119
|
+
p = argparse.ArgumentParser(
|
|
120
|
+
description="Airworthiness Compliance Engineer role")
|
|
121
|
+
sub = p.add_subparsers(dest="cmd", required=True)
|
|
122
|
+
|
|
123
|
+
b = sub.add_parser("build")
|
|
124
|
+
b.add_argument("--out", default="", help="output file (default: stdout)")
|
|
125
|
+
b.add_argument("--jurisdiction", default="",
|
|
126
|
+
help="FAA (FAR-25 basis) or EASA (CS-25 basis)")
|
|
127
|
+
b.add_argument("--aircraft", default="", help="aircraft type (default: transport)")
|
|
128
|
+
b.add_argument("--path", default="", help="certification path (default: STC)")
|
|
129
|
+
b.add_argument("--bundle", action="store_true",
|
|
130
|
+
help="emit evidence/{model,gates,provenance}.json")
|
|
131
|
+
b.add_argument("--profile", default="",
|
|
132
|
+
help="program profile JSON (customer tailoring, "
|
|
133
|
+
"docs/PROFILE-SCHEMA.md)")
|
|
134
|
+
b.set_defaults(fn=cmd_build)
|
|
135
|
+
|
|
136
|
+
c = sub.add_parser("check")
|
|
137
|
+
c.add_argument("--file", required=True,
|
|
138
|
+
help="compliance matrix markdown file to gate-check")
|
|
139
|
+
c.set_defaults(fn=cmd_check)
|
|
140
|
+
|
|
141
|
+
args = p.parse_args()
|
|
142
|
+
sys.exit(args.fn(args))
|
|
143
|
+
|
|
144
|
+
|
|
145
|
+
if __name__ == "__main__":
|
|
146
|
+
main()
|