77from pathlib import Path
88
99from .diagnostics import Diagnostic , Severity
10+ from .agent_report import build_agent_report
1011from .sarif import build_sarif_run
1112from .validator import PineScriptValidator
1213
@@ -127,6 +128,26 @@ def _summary(results: list[dict[str, object]]) -> dict[str, int]:
127128 }
128129
129130
131+ def _write_output (value : str ) -> None :
132+ if hasattr (sys .stdout , "reconfigure" ):
133+ try :
134+ sys .stdout .reconfigure (encoding = "utf-8" , errors = "replace" )
135+ except (ValueError , OSError ):
136+ pass
137+ try :
138+ sys .stdout .write (value )
139+ if not value .endswith ("\n " ):
140+ sys .stdout .write ("\n " )
141+ except UnicodeEncodeError :
142+ safe_value = value .encode (sys .stdout .encoding or "utf-8" , errors = "replace" ).decode (
143+ sys .stdout .encoding or "utf-8" ,
144+ errors = "replace" ,
145+ )
146+ sys .stdout .write (safe_value )
147+ if not safe_value .endswith ("\n " ):
148+ sys .stdout .write ("\n " )
149+
150+
130151def main (argv : list [str ] | None = None ) -> int :
131152 args = build_parser ().parse_args (argv )
132153 validator = PineScriptValidator ()
@@ -154,13 +175,13 @@ def main(argv: list[str] | None = None) -> int:
154175 diagnostics = results [0 ]["diagnostics" ] if len (results ) == 1 else []
155176
156177 if args .sarif :
157- print (json .dumps (build_sarif_run (results ), ensure_ascii = False , indent = 2 ))
178+ _write_output (json .dumps (build_sarif_run (results ), ensure_ascii = False , indent = 2 ))
158179 elif args .agent_json and len (results ) > 1 :
159180 file_reports = [
160- validator . build_agent_report_for_text ( item ["text" ], file_path = item ["path" ])
181+ build_agent_report ( item [ "diagnostics" ], item ["text" ], file_path = item ["path" ])
161182 for item in results
162183 ]
163- print (
184+ _write_output (
164185 json .dumps (
165186 {
166187 "tool" : "pine-script-validator" ,
@@ -174,9 +195,9 @@ def main(argv: list[str] | None = None) -> int:
174195 )
175196 )
176197 elif args .agent_json :
177- print (json .dumps (validator . build_agent_report_for_text ( text , file_path = file_path ), ensure_ascii = False , indent = 2 ))
198+ _write_output (json .dumps (build_agent_report ( diagnostics , text , file_path = file_path ), ensure_ascii = False , indent = 2 ))
178199 elif args .json and len (results ) > 1 :
179- print (
200+ _write_output (
180201 json .dumps (
181202 {
182203 "tool" : "pine-script-validator" ,
@@ -195,7 +216,7 @@ def main(argv: list[str] | None = None) -> int:
195216 )
196217 )
197218 elif args .json :
198- print (json .dumps ([diagnostic .to_dict () for diagnostic in diagnostics ], ensure_ascii = False , indent = 2 ))
219+ _write_output (json .dumps ([diagnostic .to_dict () for diagnostic in diagnostics ], ensure_ascii = False , indent = 2 ))
199220 else :
200221 any_output = False
201222 for item in results :
@@ -204,9 +225,9 @@ def main(argv: list[str] | None = None) -> int:
204225 if file_diagnostics :
205226 any_output = True
206227 for diagnostic in file_diagnostics :
207- print (diagnostic .format (path ))
228+ _write_output (diagnostic .format (path ))
208229 if not any_output :
209- print ("No diagnostics." )
230+ _write_output ("No diagnostics." )
210231
211232 return 1 if any (diagnostic .severity == Severity .ERROR for item in results for diagnostic in item ["diagnostics" ]) else 0
212233
0 commit comments