agent-first-data 0.19.1

A naming convention that lets AI agents understand your data without being told what it means, plus a CLI and library for reading and safely editing structured JSON, TOML, YAML, dotenv, and INI documents.
Documentation
+
�
[j�X���Rt^RIHt^RIt^RIt^RIt^RIt^RIt^RIt^RI	H
t
^RIHt^RI
Ht]!]4P!4P"^,t]
!RR7!RR	44tR
RltRR
ltRRltRRltRRltRRltRRltRRltRRltRRltRRltR R!ltR"R#lt R$R%lt!R&R'lt"R(R)lt#R*R+lt$R,R-lt%R.R/lt&R0R1lt'R2R3lt(R4R5lt)R6R7lt*R8R9lt+R:R;lt,R<R=lt-R>R?lt.R@RAlt/RBRClt0RDRElt1RFRGlt2RHRIlt3]4RJ8Xd
]3!4R#R#)KzGEnd-to-end checks for the four canonical agent-first-data CLI examples.)�annotationsN)�	dataclass)�Path)�SequenceT)�frozenc�@�]tRt^t$R]R&R]R&R]R&R]R&RtR	#)
�CliCase�str�namer�cwdztuple[str, ...]�command_prefix�success_args�N)�__name__�
__module__�__qualname__�__firstlineno__�__annotations__�__static_attributes__r��tests/cli_e2e.pyrrs��

�I�	
�I�#�#�!�!rrc��V^8�dQhRR/#)��returnz
list[CliCase]r)�formats"r�__annotate__rs��%�%�=�%rc
�f�\PPR\P4p\
P!R4;'gRp\R\R
RR7\R\R,RR
R7\R\R,VR3R
R7\R\R,VRR	3R
R7.#)�
AFDATA_PYTOOL�npx�rust)r
rrr
�go�pythonzexamples/agent_cli.py�
typescript�tsxzexamples/agent_cli.ts)�cargo�run�--quietz	--example�	agent_cli�
--featureszcli-help,cli-help-markdown�--)�pingz--hostzexample.com)r r%z./examples/agent_cli)�echo)	�os�environ�get�sys�
executable�shutil�whichr�ROOT)�pytoolrs  r�	cli_casesr5s���
�Z�Z�^�^�O�S�^�^�
<�F�
�,�,�u�
�
&�
&��C����	�;�	
�	���t��@�"�		
�	���x��"�$;�<�"�		
�	���|�#���(?�@�"�		
�9"�"rc�$�V^8�dQhRRRRRR/#)r�caser�args�
Sequence[str]r� subprocess.CompletedProcess[str]r)rs"rrrDs"��
�
�'�
��
�3S�
rc��\PP4pVPR8XdRVR&\P
!.VPOVOVPVR\P\P^<RR7#)r!�.�
PYTHONPATHTF)r�env�text�stdout�stderr�timeout�check)	r,r-�copyr
�
subprocessr%rr�PIPE)r7r8r>s&& r�run_clirGDsm��
�*�*�/�/�
�C��y�y�H����L���>�>�%�$�
�
�%��%��H�H��
���������	�	rc�$�V^8�dQhRRRRRR/#)rr8r9�stdinr	rr:r)rs"rrrTs"��
�
�]�
�3�
�3S�
rc��\P!.ROVO\RV\P\P^<RR7#)r$TF)rr?�inputr@rArBrC)r$r%r&�--bin�afdatar)�rEr%r3rF)r8rIs&&r�
run_afdatarOTs8���>�>�C�d�C��
����������	�	rc� �V^8�dQhRRRR/#�rr8r9rr:r)rs"rrras��	�	�=�	�-M�	rc
��\P!.ROVO\R\P\P^<RR7#)r$TF�rr?r@rArBrC)r$r%r&r(zskill-adminrLrMr)rN�r8s&r�run_afdata_skillrUas6���>�>�`�[_�`��
����������rc� �V^8�dQhRRRR/#rQr)rs"rrrms����]��/O�rc
��\P!.ROVO\R\P\P^xRR7#)zJRun the afdata binary built with only the core CLI (default features off).TFrS)	r$r%r&z--no-default-featuresr(�clirLrMr)rNrTs&r�run_afdata_minimalrYms>���>�>�	
�'+�	
�

�
����������rc� �V^8�dQhRRRR/#)rr@r	r�list[dict[str, object]]r)rs"rrr~s��0�0��0�!8�0rc���VP4Uu.uFqP4'gKVNK	ppVUu.uFp\P!V4NK	up#uupiuupi�N)�
splitlines�strip�json�loads)r@�line�liness&  r�parse_eventsrd~sP��$�/�/�1�B�1�d�Z�Z�\�T�T�1�E�B�).�/���D�J�J�t���/�/��
C��/s�A�A�A"c� �V^8�dQhRRRR/#)r�procr:rr[r)rs"rrr�s ��N�N�:�N�?V�Nrc�n�\VP^8XdVP4#VP4#)u�The terminal event(s) from the stream a finite CLI used under the default
split: `result` on stdout (exit 0), `error` on stderr (non-zero exit).
Diagnostics (`log`/`progress`) go to stderr regardless — parse `proc.stderr`
directly for those.)rd�
returncoder@rA)rfs&r�terminal_eventsri�s*��
�t���!�';����M�M����M�Mrc� �V^8�dQhRRRR/#�rr7rr�Noner)rs"rrr�s��]�]��]�T�]rc�x�\WP4pVP^8Xg/QVPRVPRVP:24h\V4p\
V4^8XgQVPRV:24hV^,R,R8XgQVPRV^,:24hR#)�z: success returned �	, stderr=z: expected one event, got �kind�resultz: expected result, got N�rGr
rhr
rAri�len�r7rf�eventss&  r�assert_single_terminalrv�s����4�*�*�+�D��?�?�a��k�D�I�I�;�.A�$�/�/�AR�R[�\`�\g�\g�[j�!k�k��
�T�
"�F��v�;�!��O��	�	�{�*D�V�J�O�O���!�9�V���(�\�T�Y�Y�K�7N�v�VW�y�m�*\�\�(rc� �V^8�dQhRRRR/#rkr)rs"rrr�s��A�A�W�A��Arc�(�\VRR.VPO54pVP^8Xg/QVPRVPRVP:24h\VP4p\V4^8XdV^,R,R8XgQVPRV:24h\VP4p\;QJdRV4F'gKRM	R	M
!RV44'gQVPR
V:24hR#)�--log�startupz: startup log returned rorprqz%: expected one result on stdout, got c3��"�TF[pVR,R8H;'dC\VPR4\4;'dVR,PR4R8Hx�K]	R#5i)rp�log�categoryrzN)�
isinstancer.�dict)�.0�es& r�	<genexpr>�%assert_startup_log.<locals>.<genexpr>�sd�����A�	
�&�	�U��	2�	2��q�u�u�U�|�T�*�	2�	2�
�e�H�L�L��$�	�1�	2��s�A%�&A%�$A%TFz#: startup log missing from stderr: N)	rGr
rhr
rArdr@rs�any)r7rf�results�logss&   r�assert_startup_logr��s���4�'�9�A�t�/@�/@�A�B�D��?�?�a��o�D�I�I�;�.E�d�o�o�EV�V_�`d�`k�`k�_n�!o�o���4�;�;�'�G��w�<�1�����F�!3�x�!?���9�9�+�:�7�+�F��?�����$�D��3���	�3�3�3���	���A�
�)�)��7��x�@�A�rc� �V^8�dQhRRRR/#rkr)rs"rrr�s��[�[�W�[��[rc�N�\VR.VPO54pVP^8wgQVPR24h\	V4p\V4^8XgQVPRV:24hV^,R,R8XgQVPRV^,:24hR#)z	--unknownz$: unknown arg unexpectedly succeededz#: expected one fallback error, got rp�errorz: expected error, got N�rGr
rhr
rirsrts&  r�assert_unknown_argr��s����4�+�:��(9�(9�:�;�D��?�?�a��S�D�I�I�;�.R�!S�S��
�T�
"�F��v�;�!��X��	�	�{�*M�f�Z�X�X���!�9�V���'�Z�D�I�I�;�6L�V�TU�Y�M�)Z�Z�'rc� �V^8�dQhRRRR/#rkr)rs"rrr�s��d�d��d�T�drc�P�\VRR.VPO54pVP^8wgQVPR24h\	V4p\V4^8XgQVPRV:24hV^,R,R8XgQVPRV^,:24hR#)�--output�xmlz': invalid output unexpectedly succeededz(: expected one JSON fallback error, got rpr�z: expected error fallback, got Nr�rts&  r�assert_invalid_output_fallbackr��s����4�*�e�@�d�.?�.?�@�A�D��?�?�a��V�D�I�I�;�.U�!V�V��
�T�
"�F��v�;�!��]��	�	�{�*R�SY�R\�]�]���!�9�V���'�c�D�I�I�;�6U�V\�]^�V_�Ub�)c�c�'rc� �V^8�dQhRRRR/#rkr)rs"rrr�s��d�d�G�d��drc��\VR.VPO54pVP^8Xg/QVPRVPRVP:24h\V4p\
V4^8XgQVPRV:24hV^,R,R8XgQVPRV^,:24hR#)�--jsonz: --json returned roz: expected one JSON event, got rprqz: --json did not emit result: Nrrrts&  r�assert_json_aliasr��s����4�(�7�T�%6�%6�7�8�D��?�?�a��j�D�I�I�;�.@����@Q�QZ�[_�[f�[f�Zi�!j�j��
�T�
"�F��v�;�!��T��	�	�{�*I�&��T�T���!�9�V���(�c�T�Y�Y�K�7U�V\�]^�V_�Ub�*c�c�(rc� �V^8�dQhRRRR/#rkr)rs"rrr�s��d�d�'�d�d�drc�P�\V.ROVPO54pVP^8wgQVPR24h\	V4p\V4^8XgQVPRV:24hV^,R,R8XgQVPRV^,:24hR#)r�z(: output conflict unexpectedly succeededz#: expected one conflict error, got rpr�z: expected conflict error, got N)r�r��plainr�rts&  r�assert_format_conflict_fallbackr��s����4�L�$�:K�:K�L�M�D��?�?�a��W�D�I�I�;�.V�!W�W��
�T�
"�F��v�;�!��X��	�	�{�*M�f�Z�X�X���!�9�V���'�c�D�I�I�;�6U�V\�]^�V_�Ub�)c�c�'rc� �V^8�dQhRRRR/#rkr)rs"rrr�s��	`�	`�7�	`�t�	`rc���\VR4pVP^8wgQVPR24h\V4p\	V4^8XgQVPRV:24hV^,pVR,R8XgQVPRV:24hVR,p\V\4'gQVPRV:24hVPR4R8XgQVPR	V:24hR
#)�cancelz%: cancellation unexpectedly succeededz': expected one cancellation event, got rpr�z#: cancellation did not emit error: z: error payload not object: �code�	cancelledz: wrong cancellation code: N)r�)rGrhr
rirsr~rr.)r7rfru�eventr�s&    r�assert_cancelledr��s����4��%�D��?�?�a��T�D�I�I�;�.S�!T�T��
�T�
"�F��v�;�!��\��	�	�{�*Q�RX�Q[�\�\���1�I�E���=�G�#�_��	�	�{�2U�V[�U^�%_�_�#��'�N�E��e�T�"�"�W�t�y�y�k�1M�e�Y�$W�W�"��9�9�V���+�_��	�	�{�:U�V[�U^�-_�_�+rc� �V^8�dQhRRRR/#rkr)rs"rrr�s����'��d�rc	��a�\PP4pVPR8XdRVR&\P
!.VPORNRNVPOVPVR\P\PR7pVPfQhVPfQhVPP4VPP4pVP^<R7VP4oRp\ ;QJdV3R	lV4F'gKRM	R
M!V3R	lV44'dQVPRV:24hR#)
r!r<r=ryrzT)rr>r?r@rAN)rBc3�,<"�TF	qS9x�K	R#5ir]r)r��token�lowereds& �rr��2assert_broken_pipe_no_traceback.<locals>.<genexpr>�s����;���G�#��s�Fz2: broken pipe leaked panic/traceback diagnostics: )�panic�	tracebackzstack backtrace�brokenpipeerror�epipe)r,r-rDr
rE�Popenrr
rrFr@rA�close�read�wait�lowerr�)r7r>rfrA�	forbiddenr�s&    @r�assert_broken_pipe_no_tracebackr��s���
�*�*�/�/�
�C��y�y�H����L�����F�$�
�
�F�w�F�	�F�D�4E�4E�F��H�H��
�������
�D��;�;�"�"�"��;�;�"�"�"��K�K����
�[�[�
�
�
�F��I�I�b�I���l�l�n�G�U�I��s�;��;�s�s�s�;��;�;�;���9�9�+�G��z�R��;�;rc��V^8�dQhRR/#�rrrlr)rs"rrr�s��\�\��\rc�n�\RR4pVP^8Xg$QRVP:RVP:24h\	V4p\V4^8XgQRV:24hV^,R,R8XgQRV^,:24hV^,R,/8XgQR	V^,:24hR
#)�validatez'{"kind":"result","result":{"ok":true}}
zafdata validate failed: stderr=�	, stdout=z+afdata validate emitted unexpected events: rprqz%afdata validate did not emit result: �tracez&afdata validate result is not strict: N�r��-)rOrhrAr@rirs�rfrus  r�assert_afdata_validater��s����'�)S�T�D��?�?�a��j�#B�4�;�;�/�QZ�[_�[f�[f�Zi�!j�j��
�T�
"�F��v�;�!��U�J�6�*�U�U���!�9�V���(�_�,Q�RX�YZ�R[�Q^�*_�_�(��!�9�W���#�[�'M�f�UV�i�]�%[�[�#rc��V^8�dQhRR/#r�r)rs"rrr�s��X�X�T�Xrc���Rp\R
V4pVP^8Xg$QRVP:RVP:24h\	V4pV^,R,R8XgQRV:24hRp\R
V4pVP^8wgQR4h\	V4pV^,R,R8XgQR	V:24hV^,R
,/8XgQRV^,:24hR#)z4{"kind":"log","log":{"event":"startup"},"trace":{}}
zstrict event failed: stderr=r�rprqzstrict event result missing: �){"kind":"log","log":{"event":"startup"}}
z,strict event accepted an event without tracer�zstrict event error missing: r�z"strict event error is not strict: N)r�r�z--strictz--per-event)rOrhrAr@ri)�validrfru�invalids    r�#assert_afdata_validate_strict_eventr��s���C�E��B�E�J�D��?�?�a��g�#?�����i�X\�Xc�Xc�Wf�!g�g��
�T�
"�F��!�9�V���(�T�,I�&��*T�T�(�:�G��B�G�L�D��?�?�a��O�!O�O��
�T�
"�F��!�9�V���'�R�+G��z�)R�R�'��!�9�W���#�W�'I�&�QR�)��%W�W�#rc��V^8�dQhRR/#r�r)rs"rrrs��f�f�T�frc��\R
R4pVP^8wgQR4h\V4pV^,R,R8XgQRV:24hV^,R,R,R8XgQRV^,:24hR	#)r�r�z8afdata validate accepted a stream without terminal eventrpr�z&afdata validate stream error missing: r��validation_failedzwrong validation code: Nr��rOrhrir�s  r�#assert_afdata_validate_stream_errorr�s����'�)U�V�D��?�?�a��[�![�[��
�T�
"�F��!�9�V���'�\�+Q�RX�Q[�)\�\�'��!�9�W��f�%�)<�<�e�@W�X^�_`�Xa�Wd�>e�e�<rc��V^8�dQhRR/#r�r)rs"rrr	s��l�l�$�lrc�~�Rp\RV4pVP^8wgQR4h\V4pV^,R,R8XgQRV:24hV^,R,R,pV^,R,R8XgQRV:24hR	p\RV4pVP^8XgQR
VP:24hR#)
zX{"type":"object","properties":{"api_key_secret":{"type":"string","default":"sk-live"}}}
z+afdata lint accepted exposed secret defaultrpr��afdata lint error missing: �findings�rule_id�secret_schema_value_exposed�wrong lint finding: zk{"type":"object","properties":{"api_key_secret":{"type":"string","default":null,"examples":[null,"***"]}}}
z<afdata lint rejected a null secret schema default/examples: N��lintr��rOrhrir@)�schemarfrur��	ok_schema�oks      r� assert_afdata_lint_schema_secretr�	s���
h�F��m�V�,�D��?�?�a��N�!N�N��
�T�
"�F��!�9�V���'�Q�+F�v�j�)Q�Q�'��a�y��!�*�-�H��A�;�y�!�%B�B�g�FZ�[c�Zf�Dg�g�B�	G��
�M�9�	-�B�
�=�=�A��k�!]�^`�^g�^g�]j�k�k�rc��V^8�dQhRR/#r�r)rs"rrrs��W�W�$�Wrc�v�\R
R4pVP^8wgQR4h\V4pV^,R,R8XgQRV:24hV^,R,R,pV^,R,R8XgQR	V:24h\R
R
4pVP^8XgQRVP:24hR#)r�z{"language_bcp47":"zh_CN"}
z)afdata lint accepted malformed BCP 47 tagrpr�r�r�r��suffix_type_mismatchr�z{"language_bcp47":"zh-CN"}
z'afdata lint rejected valid BCP 47 tag: Nr�r�)rfrur�r�s    r�assert_afdata_lint_bcp47r�s����m�%C�D�D��?�?�a��L�!L�L��
�T�
"�F��!�9�V���'�Q�+F�v�j�)Q�Q�'��a�y��!�*�-�H��A�;�y�!�%;�;�`�?S�T\�S_�=`�`�;�	�M�#A�	B�B�
�=�=�A��V�!H����
�V�V�rc��V^8�dQhRR/#r�r)rs"rrr&s��[�[�4�[rc�P�R
Fmp\RV4pVP^8wgQRV:24h\V4pV^,R,R,pV^,R,R8XdKdQRV:24h	\RR4pVP^8XgQRVP:24hR	#)�({"timezone_utc_offset":"Asia/Shanghai"}
z.afdata lint accepted malformed strict string: r�r�r�r�r�z�{"timezone_utc_offset":"+08:00","market_open_rfc3339_time":"09:30:00","invoice_due_rfc3339_date":"2026-06-13","expires_rfc3339":"2026-02-14T10:30:00.5+08:00"}
z+afdata lint rejected valid strict strings: N)r�z){"market_open_rfc3339_time":"09:30:00Z"}
z*{"invoice_due_rfc3339_date":"2026-13-01"}
z*{"expires_rfc3339":"2026-02-14T10:30:00"}
z+{"expires_rfc3339":"2026-02-14 10:30:00Z"}
r�r���payloadrfrur�r�s     r�!assert_afdata_lint_strict_stringsr�&s������-��1�����!�#�a�'U�V]�U`�%a�a�#� ��&���!�9�W�%�j�1����{�9�%�)?�?�d�CW�X`�Wc�Ad�d�?��
��	k�
�B��=�=�A��Z�!L�R�Y�Y�M�Z�Z�rc��V^8�dQhRR/#r�r)rs"rrr<s��_�_�D�_rc�P�R
Fmp\RV4pVP^8wgQRV:24h\V4pV^,R,R,pV^,R,R8XdKdQRV:24h	\RR4pVP^8XgQRVP:24hR	#)�{"timeout_s":"30"}
z2afdata lint accepted malformed numeric/url field: r�r�r�r�r�z�{"timeout_s":30,"retry_after_ms":100,"price_usd_cents":1250,"fee_jpy":100,"callback_url":"https://example.com/cb?page=2","final_url":"/relative/path"}
z/afdata lint rejected valid numeric/url fields: N)r�z{"retry_after_ms":"100ms"}
z{"price_usd_cents":12.5}
z{"fee_jpy":"100"}
z+{"callback_url":"https://example.com/a b"}
z${"db_url":"user:pass@host:5432/db"}
r�r�r�s     r�"assert_afdata_lint_numeric_and_urlr�<s���
���-��1�����!�#�e�'Y�Za�Yd�%e�e�#� ��&���!�9�W�%�j�1����{�9�%�)?�?�d�CW�X`�Wc�Ad�d�?�
� 
��	c�
�B��=�=�A��^�!P�QS�QZ�QZ�P]�^�^�rc��V^8�dQhRR/#r�r)rs"rrrTs��h�h�t�hrc	���/RRbRRbRRbRRbRRbRRbRRbRRbR	RbR
RbRRbRRbR
RbRRbRRbRRbRRbRRRRRRRR/Cp\R\P!V4R,4pVP^8Xg$QRVP:RVP
:24h\
V4pV^,R,R8XgQRV:24hV^,R,R,.8XgQRV^,:24hR#)�cached_epoch_sN�created_at_epoch_ms�created_epoch_ns�
payload_bytes�withdrawn_sats�
balance_msats�cpu_percent�	dns_ttl_s�
latency_ms�session_timeout_minutes�price_usd_cents�deposit_eur_cents�cost_usd_micro�fee_jpy�expires_rfc3339�invoice_due_rfc3339_date�market_open_rfc3339_time�timezone_utc_offset�callback_url�language_bcp47�api_key_secret�
z/afdata lint rejected null suffix-typed fields: � rprqz3afdata lint did not pass null suffix-typed fields: r�z%unexpected findings for null fields: r��rOr`�dumpsrhr@rAri�r�rfrus   r�%assert_afdata_lint_null_suffix_exemptr�Ts�����$���t��	�D��	��	�
	�$��	��
�	�t��	�T��	�d��	"�4��	�4��	�T��	�$��	�4��	�4�� 	#�D�!�"	#�D�#�$	�t����$��$�+�G�.�m�T�Z�Z��%8�4�%?�@�D��?�?�a��r�#R�SW�S^�S^�Ra�ab�cg�cn�cn�bq�!r�r��
�T�
"�F��!�9�V���(�j�,_�`f�_i�*j�j�(��!�9�X��z�*�b�0�g�4Y�Z`�ab�Zc�Yf�2g�g�0rc��V^8�dQhRR/#r�r)rs"rrrus��o�o�d�orc��RRRRR/RRRRR/RRRR/./p\R\P!V4R	,4pVP^8Xg$QR
VP:RVP
:24h\
V4pV^,R,R
8XgQRV:24hV^,R
,R,.8XgQRV^,:24hR#)�metar�Nr��itemsr�r�r�r�r�z6afdata lint rejected nested null suffix-typed fields: r�rprqz:afdata lint did not pass nested null suffix-typed fields: r�z,unexpected findings for nested null fields: r�r�r�s   r�,assert_afdata_lint_null_suffix_exempt_nestedrus���	�!�4���>��
�t�%5�t�<�
��&6��=�
��G��m�T�Z�Z��%8�4�%?�@�D��?�?�a��y�#Y�Z^�Ze�Ze�Yh�hi�jn�ju�ju�ix�!y�y��
�T�
"�F��!�9�V���(�q�,f�gm�fp�*q�q�(��!�9�X��z�*�b�0�n�4`�ag�hi�aj�`m�2n�n�0rc��V^8�dQhRR/#r�r)rs"rrr�s��h�h�D�hrc�P�R
Fmp\RV4pVP^8wgQRV:24h\V4pV^,R,R,pV^,R,R8XdKdQRV:24h	\RR4pVP^8XgQRVP:24hR	#)�{"count_epoch_s":"abc"}
z/afdata lint accepted an invalid present value: r�r�r�r�r�zB{"cached_epoch_s":1707868800,"id_epoch_ns":"1707868800000000000"}
z8afdata lint rejected valid present suffix-typed values: N)rz{"size_bytes":-1}
z{"x_epoch_ns":123}
z{"when_rfc3339":"not-a-date"}
r�r�r�s     r�*assert_afdata_lint_suffix_type_regressionsr�s������-��1�����!�#�b�'V�W^�Va�%b�b�#� ��&���!�9�W�%�j�1����{�9�%�)?�?�d�CW�X`�Wc�Ad�d�?��
��M�
�B��=�=�A��g�!Y�Z\�Zc�Zc�Yf�g�g�rc��V^8�dQhRR/#r�r)rs"rrr�s��
Y�
Y��
Yrc��\RR4pVP^8XgQRVP:24h\P!VP
4pVR,R,'gQRVP
:24h\RR4pVP^8XgQRVP:24hVP
P
4PR4'gQRVP
R	,:24hR
VP
9gQRVP
R,:24hR
VP
9gQRVP
R,:24hR#)�	--version�z'afdata --version --output json failed: rq�versionzno version in z(afdata --help --output markdown failed: z# afdatazhelp is not markdown: :N�PNz
--stdout-filez(stream-redirect flag missing from help: :N��N�skillz!skill command missing from help: N)rr�r`)�--helpr��markdown)rOrhrAr`rar@�lstrip�
startswith)�verr��mds   r�assert_afdata_cli_capabilitiesr�s*��
�6��
;�C��>�>�Q��X�"I�#�*�*�� X�X���j�j����$�G��8��Y�'�'�H�>�#�*�*��)H�H�'�	�6��	;�B�
�=�=�A��W�!I�"�)�)��W�W��
�9�9����(�(��4�4�a�8N�r�y�y�Y\�~�N`�6a�a�4��b�i�i�'�g�+S�TV�T]�T]�^b�Tc�Sf�)g�g�'��b�i�i��X�#D�R�Y�Y�t�_�DW�!X�X�rc��V^8�dQhRR/#r�r)rs"rrr�s��U�U�d�Urc�(�\RR4pVP^8Xg$QRVP:RVP:24h\P
!VP4pVR,R8XgQRV:24hVR,RJgQR	V:24hR
#)�renderz'{"api_key_secret":"sk-live","ok":true}
zafdata render failed: stderr=r�r�z***zafdata render did not redact: r�Tz(afdata render changed non-secret value: N)rr�r�r`)rOrhrAr@r`ra)rf�values  r�assert_afdata_render_redactsr�s����9�;e�f�D��?�?�a��h�#@�����y�Y]�Yd�Yd�Xg�!h�h���J�J�t�{�{�#�E��!�"�e�+�W�/M�e�Y�-W�W�+���;�$��T�"J�5�)� T�T�rc��V^8�dQhRR/#r�r)rs"rrr�s��b�b�4�brc��\R
R4pVP^8wgQR4h\V4pV^,R,R8XgQRV:24hV^,R,R,R8XgQRV^,:24hR	#)rz{"ok":true}
not-json
z$afdata render accepted invalid JSONLrpr�zafdata parse error missing: r��jsonl_parse_failedzwrong parse code: N)rr�r�r�s  r�assert_afdata_parse_errorr �s����o�'@�A�D��?�?�a��G�!G�G��
�T�
"�F��!�9�V���'�R�+G��z�)R�R�'��!�9�W��f�%�)=�=�a�AS�TZ�[\�T]�S`�?a�a�=rc��V^8�dQhRR/#r�r)rs"rrr�s��	R�	R�D�	Rrc
�$�\P!RR7;_uu_4p\RRRRRV34pRRR4XP^8Xg$QRVP:R	VP
:24h\
V4p\V4^8XgQR
V:24hV^,R,R8XgQR
V^,:24hV^,R,pVR,R8XgQRV:24hVR,R8XgQRV:24hR# +'giL�;i)zafdata-skill-e2e-��prefixr�status�--agent�codex�--skills-dirNz#afdata skill status failed: stderr=r�z/afdata skill status emitted unexpected events: rprqz!skill status not a result event: r��skill_statuszwrong skill status code: �agent-first-datazwrong skill name: )�tempfile�TemporaryDirectoryrUrhrAr@rirs)�tmprfrurqs    r�"assert_afdata_skill_status_featurer.�s��	�	$�	$�,?�	@�	@�C���(�I�w��X[� \�]��
A��?�?�a��n�#F�t�{�{�o�U^�_c�_j�_j�^m�!n�n��
�T�
"�F��v�;�!��Y�N�v�j�Y�Y���!�9�V���(�[�,M�f�UV�i�]�*[�[�(�
�A�Y�x�
 �F��&�>�^�+�S�/H��
�-S�S�+��'�?�0�0�Q�4F�v�j�2Q�Q�0�
A�	@�s�C?�?D	c��V^8�dQhRR/#r�r)rs"rrr�s��h�h�4�hrc
��\P!RR7;_uu_4p\V4R,pVPRR7VR,P	RRR7\R	R
RRR
V34pRRR4XP^8wgQR4h\V4p\V4^8XgQRV:24hV^,R,pVR,R8XgQRV^,:24hVR,pVR,R8XgQRV:24hVR,RJgQRV:24hVR,^,R,RJgQRV:24hVR,^,R,RJgQRV:24hR# +'giEL;i)zafdata-skill-error-e2e-r#r*T)�parentszSKILL.mdz)---
name: custom
description: custom
---
zutf-8)�encodingr�installr&r'r(Nz>afdata skill install overwrote unmanaged skill without --forcez0afdata skill install emitted unexpected events: r�r��	cli_errorzwrong skill error code: �partial_report�
skill_installzwrong partial report code: �	installedFz)partial install report should be failed: �targetsz#partial report lost target status: �managedz%unmanaged target should be reported: )	r+r,r�mkdir�
write_textrUrhrirs)r-�	skill_dirrfrur��reports      r�1assert_afdata_skill_error_includes_partial_reportr>�s���	�	$�	$�,E�	F�	F�#���I� 2�2�	������%�	�Z�	�+�+�;�g�	,�	
� ��)�Y���Y\� ]�^��

G��?�?�a��a�!a�a��
�T�
"�F��v�;�!��Z�O�PV�z�Z�Z���1�I�g��E���=�K�'�Q�+C�F�1�I�=�)Q�Q�'�
�#�
$�F��&�>�_�,�V�0K�F�:�.V�V�,��+��%�'�_�+T�U[�T^�)_�_�'��)��Q���,��4�f�8[�\b�[e�6f�f�4��)��Q��	�*�e�3�g�7\�]c�\f�5g�g�3�!
G�	F�	F�s�AE.�.E?	c��V^8�dQhRR/#r�r)rs"rrr�s��d�d�4�drc�,�\RR4pVP^8XgQRVP:24hRVP9gQR4h\	R4pVP^8XgQRVP:24hRVP9gQR4hR#)	rrzdefault afdata help failed: rz.default afdata help must show skill subcommandzminimal afdata help failed: z2minimal afdata help must not show skill subcommandN)r)rOrhrAr@rY)�	full_help�minimal_helps  r�)assert_afdata_skill_help_is_feature_gatedrC�s����;��+�I����1�$�Y�(D�Y�EU�EU�DX�&Y�Y�$��i�&�&�&�X�(X�X�&�%�k�2�L��"�"�a�'�_�+G��H[�H[�G^�)_�_�'��,�-�-�-�c�/c�c�-rc��V^8�dQhRR/#r�r)rs"rrr�s��"�"�d�"rc��\\\\\\
\\3p\4F-pVFpV!V4K
	\RVPR24K/	\\\\\\ \"\$\&\(\*\,\.\0\2\43F
pV!4K	\R4R#)z[e2e] z: okz[e2e] afdata: okN)rvr�r�r�r�r�r�r�r5�printr
r�r�r�r�r�r�r�r�rrrrr r.r>rC)�checksr7rCs   r�mainrH�s������&��'��'�	�F�����E��$�K��
��t�y�y�k��&�'��
	�+�+�(� �)�*�-�4�2�&�$�!�*�9�1�!��$	��%�&
�
�r�__main__)5�__doc__�
__future__rr`r,r1rEr/r+�dataclassesr�pathlibr�typingr�__file__�resolver1r3rr5rGrOrUrYrdrirvr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rrrrr r.r>rCrHrrrr�<module>rQs2��M�"��	�
��
��!����H�~����'�'��*���$��"�"��"�%�P
� 
�	��"0�
N�]�A�$[�d�d�d�	`��0\�X�f�l�$W�[�,_�0h�Bo�"h�.
Y�U�b�	R�h�(d�"�J�z���F�r