doc: updated docs and references
- reference docs: spec and command-line tool
- contributing
- updated readme
Change-Id: I908120f929f0a6b15b0a568de5118e53dfdab659
diff --git a/doc/cmd/cue.md b/doc/cmd/cue.md
new file mode 100644
index 0000000..86d32a2
--- /dev/null
+++ b/doc/cmd/cue.md
@@ -0,0 +1,487 @@
+# `cue` command reference
+
+This documentation is a formatted from of the builtin documentation of the
+cue help command.
+
+## General usage
+
+```
+cue [command]
+```
+
+The commands are:
+
+```
+ cmd run a user-defined shell command
+ eval evaluate a configuration file
+ export outputs an evaluated configuration in a standard format
+ extract
+ fmt formats Cue configuration files.
+ help Help about any command
+ import convert other data formats to CUE files
+ list list packages or modules
+ serve starts a builtin or user-defined service
+
+Flags:
+ --config string config file (default is $HOME/.cue)
+ --debug give detailed error info
+ -h, --help help for cue
+ --pkg string CUE package to evaluate
+ --root load a Cue package from its root
+```
+
+## Start a bug report
+
+TODO
+
+## Evaluate a CUE file
+
+```
+Flags:
+ --pkg string Cue package to evaluate
+```
+
+## Formatting CUE files
+
+`fmt` formats the given files or the files for the given packages in place.
+
+Usage:
+```
+ cue fmt [-s] [packages] [flags]
+```
+Flags:
+```
+ --config string config file (default is $HOME/.cue)
+ --debug give detailed error info
+ -n, --dryrun only run simulation
+ -p, --package string Cue package to evaluate
+ -s, --simplify simplify output
+```
+
+## Exporting results
+
+`export` evaluates the configuration found in the current directory
+and prints the emit value to stdout.
+
+Examples:
+Evaluated and emit
+
+```
+ # a single file
+ cue export config.cue
+
+ # multiple files: these are combined at the top-level.
+ # Order doesn't matter.
+ cue export file1.cue foo/file2.cue
+
+ # all files within the "mypkg" package: this includes all files
+ # in the current directory and its ancestor directories that are marked
+ # with the same package.
+ cue export -p cloud
+
+ # the -p flag can be omitted if the directory only contains files for
+ # the "mypkg" package.
+ cue export
+```
+
+### Emit value
+
+For CUE files, the generated configuration is derived from the top-level single expression, the emit value. For example, the file
+
+```
+ // config.cue
+ arg1: 1
+ arg2: "my string"
+
+ {
+ a: arg1
+ b: arg2
+ }
+ ```
+yields the following JSON:
+```
+ {
+ "a": 1,
+ "b": "my string"
+ }
+```
+In absence of arguments, the current directory is loaded as a package instance.
+A package instance for a directory contains all files in the directory and its
+ancestor directories, up to the module root, belonging to the same package.
+
+If the package is not explicitly defined by the '-p' flag, it must be uniquely
+defined by the files in the current directory.
+
+## Import files in another format
+
+`import` converts other data formats, like JSON and YAML to CUE files.
+The following file formats are currently supported:
+
+```
+ Format Extensions
+ JSON .json .jsonl .ndjson
+ YAML .yaml .yml
+```
+
+Files can either be specified explicitly, or inferred from the specified
+packages.
+In either case, the file extension is replaced with `.cue`.
+It will fail if the file already exists by default.
+The -f flag overrides this.
+
+Examples:
+
+```
+ # Convert individual files:
+ $ cue import foo.json bar.json # create foo.yaml and bar.yaml
+
+ # Convert all json files in the indicated directories:
+ $ cue import ./... -type=json
+```
+
+
+### The `--path` flag
+
+By default the parsed files are included as emit values.
+This default can be overridden by specifying a path, which has two forms:
+
+```
+ -p ident*
+```
+
+ and
+```
+ -p ident "->" expr*
+```
+
+The first form specifies a fixed path.
+The empty path indicates including the value at the root.
+The second form allows expressing the path in terms of the imported value.
+An unbound identifier in the second form denotes a fixed name.
+Packages may be included with the -imports flag.
+Imports for top-level core packages are elided.
+
+
+### Handling multiple documents or streams
+
+To handle Multi-document files, such as concatenated JSON objects or YAML files
+with document separators (---) the user must specify either the -path, -list, or
+-files flag.
+The -path flag assign each element to a path (identical paths are
+treated as usual); -list concatenates the entries, and -files causes each entry
+to be written to a different file.
+The -files flag may only be used if files are explicitly imported.
+The -list flag may be used in combination with the -path
+flag, concatenating each entry to the mapped location.
+
+Examples:
+
+```
+ $ cat <<EOF > foo.yaml
+ kind: Service
+ name: booster
+ EOF
+
+ # include the parsed file as an emit value:
+ $ cue import foo.yaml
+ $ cat foo.cue
+ {
+ kind: Service
+ name: booster
+ }
+
+ # include the parsed file at the root of the Cue file:
+ $ cue import -f -p "" foo.yaml
+ $ cat foo.cue
+ kind: Service
+ name: booster
+
+ # include the import config at the mystuff path
+ $ cue import -f -p mystuff foo.yaml
+ $ cat foo.cue
+ myStuff: {
+ kind: Service
+ name: booster
+ }
+
+ # append another object to the input file
+ $ cat <<EOF >> foo.yaml
+ ---
+ kind: Deployment
+ name: booster
+ replicas: 1
+
+ # base the path values on th input
+ $ cue import -f -p "x -> strings.ToLower(x.kind) x.name" foo.yaml
+ $ cat foo.cue
+ service booster: {
+ kind: "Service"
+ name: "booster"
+ }
+
+ deployment booster: {
+ kind: "Deployment"
+ name: "booster
+ replicas: 1
+ }
+
+ # base the path values on th input
+ $ cue import -f -list -foo.yaml
+ $ cat foo.cue
+ [{
+ kind: "Service"
+ name: "booster"
+ }, {
+ kind: "Deployment"
+ name: "booster
+ replicas: 1
+ }]
+
+ # base the path values on th input
+ $ cue import -f -list -p "x->strings.ToLower(x.kind)" foo.yaml
+ $ cat foo.cue
+ service: [{
+ kind: "Service"
+ name: "booster"
+ }
+ deployment: [{
+ kind: "Deployment"
+ name: "booster
+ replicas: 1
+ }]
+```
+
+Usage:
+```
+ cue import [flags]
+```
+
+Flags:
+```
+ --dryrun force overwriting existing files
+ --files force overwriting existing files
+ --fix string apply given fix
+ -f, --force force overwriting existing files
+ -h, --help help for import
+ --list concatenate multiple objects into a list
+ -n, --name string glob filter for file names
+ -o, --out string alternative output or - for stdout
+ -p, --path string path to include root
+ --type string only apply to files of this type
+```
+
+## Extracting CUE files from source code
+
+TODO: doc
+
+## Running scripts with CUE
+
+`cmd` executes user-defined named commands for each of the listed instances.
+
+Commands define actions on instances.
+For instance, they may define how to upload a configuration to Kubernetes.
+Commands are defined in cue files ending with `_tool.cue` while otherwise using
+the same packaging rules: tool files must have a matching package clause and
+the same rules as for normal files define which will be included in which
+package.
+Tool files have access to the package scope, but none of the fields defined
+in a tool file influence the output of a package.
+Tool files are typically defined at the module root so that they apply
+to all instances.
+
+
+### Tasks
+
+Each command consists of one or more tasks.
+A task may load or write a file, consult a user on the command line,
+or fetch a web page, and so on.
+Each task has inputs and outputs.
+Outputs are typically are typically filled out by the task implementation as
+the task completes.
+
+Inputs of tasks my refer to outputs of other tasks.
+The cue tool does a static analysis of the configuration and only starts tasks
+that are fully specified.
+Upon completion of each task, cue rewrites the instance,
+filling in the completed task, and reevaluates which other tasks can now start,
+and so on until all tasks have completed.
+
+
+### Command definition
+
+Commands are defined at the top-level of the configuration and all follow the
+following pattern:
+
+```
+command <Name>: { // from "cue/tool".Command
+ // usage gives a short usage pattern of the command.
+ // Example:
+ // fmt [-n] [-x] [packages]
+ usage: Name | string
+
+ // short gives a brief on-line description of the command.
+ // Example:
+ // reformat package sources
+ short: "" | string
+
+ // long gives a detailed description of the command, including
+ // a description of flags usage and examples.
+ long: "" | string
+
+ // A task defines a single action to be run as part of this command.
+ // Each task can have inputs and outputs, depending on the type
+ // task. The outputs are initially unspecified, but are filled out
+ // by the tooling
+ //
+ task <Name>: { // from "cue/tool".Task
+ // supported fields depend on type
+ }
+
+ VarValue = string | bool | int | float | [...string|int|float]
+
+ // var declares values that can be set by command line flags or
+ // environment variables.
+ //
+ // Example:
+ // // environment to run in
+ // var env: "test" | "prod"
+ // The tool would print documentation of this flag as:
+ // Flags:
+ // --env string environment to run in: test(default) or prod
+ var <Name>: VarValue
+
+ // flag defines a command line flag.
+ //
+ // Example:
+ // var env: "test" | "prod"
+ //
+ // // augment the flag information for var
+ // flag env: {
+ // shortFlag: "e"
+ // description: "environment to run in"
+ // }
+ //
+ // The tool would print documentation of this flag as:
+ // Flags:
+ // -e, --env string environment to run in: test(default), staging, or prod
+ //
+ flag <Name>: { // from "cue/tool".Flag
+ // value defines the possible values for this flag.
+ // The default is string. Users can define default values by
+ // using disjunctions.
+ value: env[Name].value | VarValue
+
+ // name, if set, allows var to be set with the command-line flag
+ // of the given name. null disables the command line flag.
+ name: Name | null | string
+
+ // short defines an abbreviated version of the flag.
+ // Disabled by default.
+ short: null | string
+ }
+
+ // populate flag with the default values for
+ flag: { "\(k)": { value: v } | null for k, v in var }
+
+ // env defines environment variables. It is populated with values
+ // for var.
+ //
+ // To specify a var without an equivalent environment variable,
+ // either specify it as a flag directly or disable the equally
+ // named env entry explicitly:
+ //
+ // var foo: string
+ // env foo: null // don't use environment variables for foo
+ //
+ env <Name>: {
+ // name defines the environment variable that sets this flag.
+ name: "CUE_VAR_" + strings.Upper(Name) | string | null
+
+ // The value retrieved from the environment variable or null
+ // if not set.
+ value: null | string | bytes
+ }
+ env: { "\(k)": { value: v } | null for k, v in var }
+ }
+```
+
+Available tasks can be found in the package documentation at
+
+```
+ cmd/cue/tool/tasks.
+ ```
+
+More on tasks can be found in the tasks topic.
+
+Examples
+A simple file using command line execution:
+
+hello.cue:
+```
+ package foo
+
+ import "cue/tool/tasks/exec"
+
+ city: "Amsterdam"
+```
+
+hello_tool.cue:
+```
+ package foo
+
+ // Say hello!
+ command hello: {
+ // whom to say hello to
+ var who: "World" | string
+
+ task print: exec.Run({
+ cmd: "echo Hello \(var.who)! Welcome to \(city)."
+ })
+ }
+ ```
+
+Invoking the script on the command line:
+
+```
+ $ cue cmd echo
+ Hello World! Welcome to Amsterdam.
+
+ $ cue cmd echo -who you
+ Hello you! Welcome to Amsterdam.
+ ```
+An example with tasks depending on each other:
+
+```
+package foo
+
+import "cue/tool/tasks/exec"
+
+city: "Amsterdam"
+
+// Say hello!
+command hello: {
+ var file: "out.txt" | string // save transcript to this file
+
+ task ask: cli.Ask({
+ prompt: "What is your name?"
+ response: string
+ })
+
+ // starts after ask
+ task echo: exec.Run({
+ cmd: "echo Hello \(task.ask.response)!"]
+ stdout: string // capture stdout
+ })
+
+ // starts after echo
+ task write: file.Append({
+ filename: var.file
+ contents: task.echo.stdout
+ })
+
+ // also starts after echo
+ task print: cli.Print({
+ contents: task.echo.stdout
+ })
+}
+```
\ No newline at end of file